使用 HSV 顏色模型和 openCV 構建晝夜分類器

使用 HSV 顏色模型和 openCV 構建晝夜分類器

在本文中,我們將學習如何構建一個簡單的模型,它使用色調飽和度值 (HSV) 顏色模型作為特徵提取,opencv 進行影象處理的基礎來對白天和黑夜進行分類。本教程的程式碼可在此處獲得,https://github。com/mrsimi/cv_udacity_course/blob/master/day_night_classifier。ipynb

介紹

色調飽和度值(HSV)是RGB的替代顏色模型。色調(H)是顏色輪中的三種主色和三種次色。飽和度是顏色的純度和強度,其越低,顏色越接近灰色。值 (V) 是指顏色的相對亮度或暗度。這些值中的每一個都有一個限制;H 從 0 到 360,S 和 V 從 0 到 100。

我們將利用顏色模型的 Value (V) 屬性。決定影象亮度的影象值 (V)。這是我們要提取的特徵。然後我們將設定一個閾值,可以將白天影象與夜間影象分開。

雖然我們可以設定一個特定的閾值,但我們嘗試使用訓練影象,透過基本推導找到一個最佳閾值。

我們將使用 opencv 庫從影象中提取這些特徵。

先決條件

Python

pip

opencv

numpy

matplotlib

Opencv 是一個計算機視覺包,我們將使用它來處理影象和操作它。numpy用於數值計算,matplotlib用於影象顯示。

1。 匯入用於測試的庫和影象

我們將使用的是用於訓練和測試的室外影象:https://github。com/mrsimi/cv_udacity_course/tree/master/data/day_night_images

該影象已被標註,即分類為白天和夜間影象。

2。 預處理影象及其標籤

我們已經指定了訓練影象的路徑,但原始影象有噪聲並且沒有很好地最佳化分析。

例如,影象可能具有不同的大小,或者標籤可能是我們的文字。這是設計模型的第一步。資料清洗。所以我們會寫一個助手來幫助我們。

這是我們的影象資料夾結構的樣子

因此,我們希望我們的助手讀取這個目錄並輸出帶有相應標籤的影象,以便img001。jpg有一個日期標籤。

我們還將使用數字對標籤進行編碼。

1代表白天,0代表夜晚。

這是程式碼:

第 8-18 行

負責檢查資料夾中的所有影象,如果是影象,則將其新增到列表中

第 24 行

是我們標準化影象的地方,在這種特殊情況下,我們將其大小調整為 1110 x 600

第 28 -32 行

是我們將標籤從文字編碼為數字的地方。如果是白天,則為1,否則 0

第 34-43 行

是我們從第 8 行建立的列表,對影象進行標準化並對標籤進行編碼。

讓我們在我們的專案中匯入它並執行以下程式碼以檢視是否設定了助手程式。

這應該為你提供

Shape (600, 1110, 3) 標籤的輸出:1

3。獲取圖片的平均亮度

接下來,我們將編寫一個函式(基於 HSV 顏色模型)來獲取影象的平均亮度。因此,這個分類問題的特徵是亮度。我們正在提取並使用它來解釋新影象。

基本上,我們選擇 HSV 顏色模型的 V 值並將其除以影象面積。

在示例影象上執行此函式以瞭解圖片的亮度。

4。 使用選定的標記晝夜差異的閾值來估計標籤

一旦我們獲得了圖片的平均亮度,我們就可以標記一個閾值來劃分白天和夜晚的圖片。

這個標誌著晝夜的差異是我們最大的盟友。請記住,閾值是平均亮度的函式。

這是預測標籤的程式碼:

很簡單吧?

但是我們怎麼知道閾值呢?

答案:我們在計算了一些白天和黑夜影象的平均亮度後進行選擇,然後我們從中做出直觀的猜測。

這是我們的出發點。對於這種情況,我們選擇 120。

但是 120 是最佳閾值嗎?

5。 尋找最優閾值

我們可以在閾值為 120 時結束我們的模型預測,我們的準確率為 86%。但是,我們是否可以透過調整或修改閾值來提高準確度,以接近在白天和黑夜之間劃出細線的那個點——比如白天和黑夜本身。

因此看看最佳化器程式碼:

在這裡,我們根據閾值估計標籤,如果它是正確的,我們就接著下一步。

如果不是,我們計算當前閾值和平均亮度的平均值——因為閾值是基於平均亮度的。

執行這個會產生一個新的閾值——116。

PS:可以以不同的方式調整閾值,即平均閾值和平均亮度。這是我在這段程式碼中使用的技術。

6。 在測試影象上執行分類器

我們有我們的閾值和估算器。讓我們在測試影象上執行我們的模型,看看錶現如何。

我們從清理我們的測試資料開始,然後對其進行打亂(第 7 行)。因為我們已經有了閾值。我們可以估計標籤。然後記錄輸出——正確分類與否。

與僅選擇 120 作為閾值時的 86% 相比,我們對此的準確率為 87。5%。而且還有改進的空間。

思考。還可以做些什麼來進一步提高準確性?你能否新增另一個功能來跟蹤平均亮度?有沒有辦法將閾值移動到最佳值?

這是github 上完整程式碼的連結:https://github。com/mrsimi/cv_udacity_course

☆ END ☆

如果看到這裡,說明你喜歡這篇文章,請轉發、點贊。微信搜尋「uncle_pn」,歡迎新增小編微信「 woshicver」,每日朋友圈更新一篇高質量博文。