一文教你使用HSV顏色模型和openCV構(gòu)建晝夜分類器
在本文中,我們將學(xué)習(xí)如何構(gòu)建一個(gè)簡(jiǎn)單的模型,它使用色調(diào)飽和度值 (HSV) 顏色模型作為特征提取,opencv 進(jìn)行圖像處理的基礎(chǔ)來(lái)對(duì)白天和黑夜進(jìn)行分類。
介紹
色調(diào)飽和度值(HSV)是RGB的替代顏色模型。色調(diào)(H)是顏色輪中的三種主色和三種次色。飽和度是顏色的純度和強(qiáng)度,其越低,顏色越接近灰色。值 (V) 是指顏色的相對(duì)亮度或暗度。這些值中的每一個(gè)都有一個(gè)限制;H 從 0 到 360,S 和 V 從 0 到 100。
我們將利用顏色模型的 Value (V) 屬性。決定圖像亮度的圖像值 (V)。這是我們要提取的特征。然后我們將設(shè)置一個(gè)閾值,可以將白天圖像與夜間圖像分開(kāi)。
雖然我們可以設(shè)置一個(gè)特定的閾值,但我們嘗試使用訓(xùn)練圖像,通過(guò)基本推導(dǎo)找到一個(gè)最佳閾值。
我們將使用 opencv 庫(kù)從圖像中提取這些特征。
先決條件
- Python
- pip
- opencv
- numpy
- matplotlib
Opencv 是一個(gè)計(jì)算機(jī)視覺(jué)包,我們將使用它來(lái)處理圖像和操作它。numpy用于數(shù)值計(jì)算,matplotlib用于圖像顯示。
1. 導(dǎo)入用于測(cè)試的庫(kù)和圖像
我們將使用的是用于訓(xùn)練和測(cè)試的室外圖像
該圖像已被標(biāo)注,即分類為白天和夜間圖像。
from util import daynight_helper
import matplotlib.pyplot as plt
import cv2
import numpy as np
#path to the folder where the images are
training_data_path = 'data/day_night_images/training'
2. 預(yù)處理圖像及其標(biāo)簽
我們已經(jīng)指定了訓(xùn)練圖像的路徑,但原始圖像有噪聲并且沒(méi)有很好地優(yōu)化分析。
例如,圖像可能具有不同的大小,或者標(biāo)簽可能是我們的文字。這是設(shè)計(jì)模型的第一步。數(shù)據(jù)清洗。所以我們會(huì)寫(xiě)一個(gè)助手來(lái)幫助我們。
這是我們的圖像文件夾結(jié)構(gòu)的樣子
data /
day_night_images /
training /
day /
img001.jpg
img002.jpg
night /
img100.jpg
img101.jpg
test /
day /
img001.jpg
img002.jpg
night /
img100.jpg
img101.jpg
因此,我們希望我們的助手讀取這個(gè)目錄并輸出帶有相應(yīng)標(biāo)簽的圖像,以便img001.jpg有一個(gè)日期標(biāo)簽。
我們還將使用數(shù)字對(duì)標(biāo)簽進(jìn)行編碼。1代表白天,0代表夜晚。
這是代碼:
import os
import glob
import matplotlib.image as mpimg
import cv2
def load_dataset(image_dir):
img_list = []
img_types = ['day', 'night']
for img_type in img_types:
for file in glob.glob(os.path.join(image_dir, img_type, '*')):
img = mpimg.imread(file)
if not img is None:
img_list.a(chǎn)ppend((img, img_type))
return img_list
def standardize_image(image):
std_img= cv2.resize(image, (1110, 600))
return std_img
def encode_label(label):
if label== 'day':
return 1
else:
return 0
def standardize_inputs(img_list):
std_list = []
for img in img_list:
std_img = standardize_image(img[0])
std_label = encode_label(img[1])
std_list.a(chǎn)ppend((std_img, std_label))
return std_list
第 8-18 行負(fù)責(zé)檢查文件夾中的所有圖像,如果是圖像,則將其添加到列表img_list
中
第 24 行是我們標(biāo)準(zhǔn)化圖像的地方,在這種特殊情況下,我們將其大小調(diào)整為 1110 x 600
第 28 -32 行是我們將標(biāo)簽從文本編碼為數(shù)字的地方。如果是白天,則為1,否則 0
第 34-43 行是我們從第 8 行創(chuàng)建的列表,對(duì)圖像進(jìn)行標(biāo)準(zhǔn)化并對(duì)標(biāo)簽進(jìn)行編碼。
讓我們?cè)谖覀兊捻?xiàng)目中導(dǎo)入它并運(yùn)行以下代碼以查看是否設(shè)置了助手程序。
training_data_path = 'data/day_night_images/training'
training_data = daynight_helper.load_dataset(training_data_path)
std_training_data = daynight_helper.standardize_inputs(training_data)
img = std_training_data[0][0]
label = std_training_data[0][1]
plt.imshow(img)
print('Shape ', img.shape)
print('label: ', label)
這應(yīng)該為你提供Shape (600, 1110, 3) 標(biāo)簽的輸出:1
3.獲取圖片的平均亮度
接下來(lái),我們將編寫(xiě)一個(gè)函數(shù)(基于 HSV 顏色模型)來(lái)獲取圖像的平均亮度。因此,這個(gè)分類問(wèn)題的特征是亮度。我們正在提取并使用它來(lái)解釋新圖像。
#feature extraction - brightness using hsv
def brightness_value(img):
hsv_img = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)
v_values = np.sum(hsv_img[:, :, 2])
area = img.shape[0] * img.shape[1]
avg_brightness = v_values/area
return avg_brightness
基本上,我們選擇 HSV 顏色模型的 V 值并將其除以圖像面積。
在示例圖像上運(yùn)行此函數(shù)以了解圖片的亮度。
4. 使用選定的標(biāo)記晝夜差異的閾值來(lái)估計(jì)標(biāo)簽
一旦我們獲得了圖片的平均亮度,我們就可以標(biāo)記一個(gè)閾值來(lái)劃分白天和夜晚的圖片。
這個(gè)標(biāo)志著晝夜的差異是我們最大的盟友。請(qǐng)記住,閾值是平均亮度的函數(shù)。
這是預(yù)測(cè)標(biāo)簽的代碼:
def estimate_label(img, threshold):
avg_brightness = brightness_value(img)
predicted_label = 0
threshold = threshold
if avg_brightness > threshold:
predicted_label = 1
return predicted_label, avg_brightness
很簡(jiǎn)單吧?
但是我們?cè)趺粗篱撝的?
答案:我們?cè)谟?jì)算了一些白天和黑夜圖像的平均亮度后進(jìn)行選擇,然后我們從中做出直觀的猜測(cè)。
這是我們的出發(fā)點(diǎn)。對(duì)于這種情況,我們選擇 120。
但是 120 是最佳閾值嗎?
5. 尋找最優(yōu)閾值
我們可以在閾值為 120 時(shí)結(jié)束我們的模型預(yù)測(cè),我們的準(zhǔn)確率為 86%。但是,我們是否可以通過(guò)調(diào)整或修改閾值來(lái)提高準(zhǔn)確度,以接近在白天和黑夜之間劃出細(xì)線的那個(gè)點(diǎn)——比如白天和黑夜本身。
因此看看優(yōu)化器代碼:
def estimate_label(img, threshold):
avg_brightness = brightness_value(img)
predicted_label = 0
threshold = threshold
if avg_brightness > threshold:
predicted_label = 1
return predicted_label, avg_brightness
在這里,我們根據(jù)閾值估計(jì)標(biāo)簽,如果它是正確的,我們就接著下一步。
如果不是,我們計(jì)算當(dāng)前閾值和平均亮度的平均值——因?yàn)殚撝凳腔谄骄炼鹊摹?/p>
threshold = 120
for i in range(0, len(std_training_data)):
img_data = std_training_data[i]
threshold = optimize_threshold(img_data, threshold)
print('threshold ', threshold)
#threshold 116
運(yùn)行這個(gè)會(huì)產(chǎn)生一個(gè)新的閾值——116。
PS:可以以不同的方式調(diào)整閾值,即平均閾值和平均亮度。這是我在這段代碼中使用的技術(shù)。
6. 在測(cè)試圖像上運(yùn)行分類器
我們有我們的閾值和估算器。讓我們?cè)跍y(cè)試圖像上運(yùn)行我們的模型,看看表現(xiàn)如何。
import random
test_data_path = 'data/day_night_images/test'
test_data = daynight_helper.load_dataset(test_data_path)
test_data = daynight_helper.standardize_inputs(test_data)
random.shuffle(test_data)
threshold = 116
correctly_classified = []
misclassified = []
for i in range(0, len(test_data)):
img_data = test_data[i]
pred, avg_brightness = estimate_label(img_data[0], threshold)
#print('predicted ', pred)
label = img_data[1]
#print('label ', label)
if pred == label:
correctly_classified.a(chǎn)ppend(img_data)
else:
misclassified.a(chǎn)ppend(img_data)
#total : 160
#Correct predictions: 140
#Misclassified: 20
#Accuracy 0.875
我們從清理我們的測(cè)試數(shù)據(jù)開(kāi)始,然后對(duì)其進(jìn)行打亂(第 7 行)。因?yàn)槲覀円呀?jīng)有了閾值。我們可以估計(jì)標(biāo)簽。然后記錄輸出——正確分類與否。
與僅選擇 120 作為閾值時(shí)的 86% 相比,我們對(duì)此的準(zhǔn)確率為 87.5%。而且還有改進(jìn)的空間。
思考。還可以做些什么來(lái)進(jìn)一步提高準(zhǔn)確性?你能否添加另一個(gè)功能來(lái)跟蹤平均亮度?有沒(méi)有辦法將閾值移動(dòng)到最佳值?
發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
最新活動(dòng)更多
-
10月31日立即下載>> 【限時(shí)免費(fèi)下載】TE暖通空調(diào)系統(tǒng)高效可靠的組件解決方案
-
即日-11.13立即報(bào)名>>> 【在線會(huì)議】多物理場(chǎng)仿真助跑新能源汽車
-
11月28日立即報(bào)名>>> 2024工程師系列—工業(yè)電子技術(shù)在線會(huì)議
-
12月19日立即報(bào)名>> 【線下會(huì)議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會(huì)
-
即日-12.26火熱報(bào)名中>> OFweek2024中國(guó)智造CIO在線峰會(huì)
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍(lán)皮書(shū)》
推薦專題
- 1 【一周車話】沒(méi)有方向盤(pán)和踏板的車,你敢坐嗎?
- 2 特斯拉發(fā)布無(wú)人駕駛車,還未迎來(lái)“Chatgpt時(shí)刻”
- 3 特斯拉股價(jià)大跌15%:Robotaxi離落地還差一個(gè)蘿卜快跑
- 4 馬斯克給的“驚喜”夠嗎?
- 5 打完“價(jià)格戰(zhàn)”,大模型還要比什么?
- 6 馬斯克致敬“國(guó)產(chǎn)蘿卜”?
- 7 神經(jīng)網(wǎng)絡(luò),誰(shuí)是盈利最強(qiáng)企業(yè)?
- 8 比蘋(píng)果偉大100倍!真正改寫(xiě)人類歷史的智能產(chǎn)品降臨
- 9 諾獎(jiǎng)進(jìn)入“AI時(shí)代”,人類何去何從?
- 10 Open AI融資后成萬(wàn)億獨(dú)角獸,AI人才之爭(zhēng)開(kāi)啟
- 高級(jí)軟件工程師 廣東省/深圳市
- 自動(dòng)化高級(jí)工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級(jí)銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市