圖像數(shù)據(jù)的特征工程
一提到特征工程,我們立即想到是表格數(shù)據(jù)。但是我們也可以得到圖像數(shù)據(jù)的特征,提取圖像中最重要的方面。這樣做可以更容易地找到數(shù)據(jù)和目標變量之間的映射。
這樣可以使用更少的數(shù)據(jù)和訓練更小的模型。更小的模型可以減少預(yù)測所需的時間。這在部署到邊緣設(shè)備時特別有用。另一個好處是,可以更確定模型使用什么來進行這些預(yù)測。
本文將介紹使用Python進行圖像特征工程的一些方法:
- Cropping
- Grayscalling
- Selecting RGB channels
- Intensity thresholds
- Edge detection
- Colour filters (給定的顏色范圍內(nèi)提取像素)
我們將在自動駕駛汽車上進行演示。如下圖所示,軌道的圖像訓練一個模型。然后該模型將被用來做出預(yù)測,指導(dǎo)汽車行駛。本文的最后我們將討論圖像數(shù)據(jù)特征工程的局限性。
特性工程與增強
在深入研究之前,有必要討論一下圖像增強。該方法的目標與特征工程相似。但是它以不同的方式實現(xiàn)。
什么是數(shù)據(jù)增強?
數(shù)據(jù)增強是指我們使用代碼系統(tǒng)地或隨機地改變數(shù)據(jù)。對于圖像,這包括翻轉(zhuǎn)、調(diào)整顏色和添加隨機噪聲等方法。這些方法允許我們?nèi)藶榈匾朐肼暡⒃黾訑?shù)據(jù)集的大小。
在生產(chǎn)中,模型需要在不同的條件下執(zhí)行。這些條件是由照明、相機的角度、房間的顏色或背景中的物體等變量決定的。
數(shù)據(jù)增強的目標是創(chuàng)建一個對這些條件的變化具有魯棒性的模型。它通過添加模擬現(xiàn)實世界條件的噪聲來實現(xiàn)這一點。例如,改變圖像的亮度類似于在一天的不同時間收集數(shù)據(jù)。
通過增加數(shù)據(jù)集的大小,增強還允許我們訓練更復(fù)雜的架構(gòu)?;蛘哒f它有助于模型參數(shù)收斂。
圖像數(shù)據(jù)特征工程
特征工程的目標是與增強是相似的,也就是想要創(chuàng)建一個更健壯的模型。但是不同的是,它刪除了任何對準確預(yù)測沒有必要的噪音。也就是去掉了在不同條件下會發(fā)生變化的變量(這正好與增強相反)。
通過提取圖像中最重要的部分簡化了問題。這允許使用更簡單的模型架構(gòu)。我們可以使用更小的數(shù)據(jù)集來找到輸入和目標之間的映射。
另外一個重要的區(qū)別是如何在生產(chǎn)中處理這些方法。你的模型不會對增強圖像做出預(yù)測。但是使用特征工程,模型將需要在它訓練的相同特征上做出預(yù)測。這意味著必須能夠在生產(chǎn)環(huán)境中進行相同的特性工程。
使用Python進行圖像特征工程
下面我們開始進入正題,讓我們開始進行特性工程的操作。
我們有一些標準包(第2-3行)。Glob用于處理文件路徑(第5行)。我們也有一些包用于處理圖像(第7-8行)。
我們這里將使用用于為自動駕駛汽車提供方向路徑的圖像。你可以在Kaggle上找到這些例子。用下面的代碼加載其中一個圖像。首先加載所有圖像的文件路徑(第2-3行)。然后加載(第8行)并在第一個路徑上顯示圖像(第9行)。可以在圖1中看到這個圖像。
Cropping
裁剪圖像以去除不需要的外部區(qū)域,目的是只刪除圖像中不需要進行預(yù)測的部分。對于自動駕駛汽車可以從背景中移除像素。
加載一張圖像(第2行)。然后將這張圖像轉(zhuǎn)換為一個數(shù)組(第5行)。這個數(shù)組的尺寸為224 x 224 x 3。圖像的高度和寬度為224像素,每個像素都有一個R G B通道。為了裁剪圖像,我們只選擇y軸上位置25以上的像素(第8行)。結(jié)果如圖2所示。
如果需要保持縱橫比??梢酝ㄟ^將不需要的像素變?yōu)楹谏?第3行代碼)來實現(xiàn)類似的結(jié)果。
通過裁剪,我們刪除了不必要的像素,這樣可以避免模型對訓練數(shù)據(jù)的過度擬合。例如,背景中的椅子可能出現(xiàn)在所有左轉(zhuǎn)處。該模型有可能將這些與左轉(zhuǎn)預(yù)測聯(lián)系起來。
上面的圖片,還可以進一步處理,比如可以在不刪除任何軌道的情況下裁剪圖像的左側(cè)。但是在下圖中我們要刪除重要的軌道部分。
為什么這樣做呢?這又回到了特性工程需要在生產(chǎn)環(huán)境中進行的問題上。你不知道什么圖像將在什么時間顯示給模型。這意味著需要對所有圖像應(yīng)用相同的裁剪功能,需要確保它永遠不會刪除圖像的重要部分,但這是不可能的,所以我們才需要模擬這樣的情況。
Grayscale
灰度化是通過捕捉圖像中的顏色強度來實現(xiàn)的。它通過取RGB通道的加權(quán)平均值來實現(xiàn)這一點。我們使用這個公式:
Y = 0.299* r + 0.587* g + 0.114* b
如果我們使用所有的RGB通道,它將由150,528個值(224*224*3)組成。對于灰度圖像,我們現(xiàn)在只有50,176個值(224*224)。更簡單的輸入意味著需要更少的數(shù)據(jù)和更簡單的模型。
RGB channels
RGB通道中,一個通道可能更重要。我們可以不進行灰度化,而是直接只使用該通道。例如下面,我們選擇R(第6行)、G(第7行)和B(第8行)通道。每個生成的數(shù)組的尺寸都是224 x 224。您可以在圖6中看到相應(yīng)的圖像。
這里還可以使用channel_filter函數(shù)。通道參數(shù)(c)的值為0、1或2,這取決于你想要哪個通道。但是有一點,不同的python包將以不同的順序加載通道。這里我們使用的PIL是RGB。如果使用cv2.imread()加載圖像,通道將按BGR順序排序。
使用灰度或者RGB的通道選擇,就需要考慮是否要從圖像中刪除了重要信息。但是對于本文中的軌道示例,軌道是橙色的,所以沒有問題,軌跡的顏色有助于將其與圖像的其他部分區(qū)分開來。這也是在實際應(yīng)用是需要考慮的。
Intensity threshold
使用灰度化,每個像素的值將在0到255之間。我們可以通過將輸入轉(zhuǎn)換為二進制值來進一步簡化輸入。如果灰度值高于一個閾值,像素值為1,否則為0。我們稱之為強度閾值。
下面的函數(shù)用于應(yīng)用該閾值。首先對圖像進行灰度化(第5行)。如果像素高于閾值,那么它將被設(shè)置成1000(第8行)。如果像素值低于閾值將被設(shè)置為0(第9行)。最后還將再次縮放所有像素,使它們的值為0或1(第11行)。
自動駕駛汽車項目的一部分是為了避開障礙物。在圖7中,可以看到如何應(yīng)用強度閾值函數(shù),我們可以將這個黑色的罐頭障礙物從圖像中分隔離出來。
這里的截斷值可以看作是一個超參數(shù)。更大的截斷意味著我們包含更少的背景噪聲。但是缺點是我們捕獲的范圍更小。
Edge detection
如果想分離軌道,可以用更精細邊緣檢測方法。這是一種用于檢測圖像邊緣的多級算法。
這里我們使用cv2.Canny()函數(shù)應(yīng)用該算法。其中threshold1和threshold2為滯回過程參數(shù)。這是邊緣檢測算法的最后一個過程,用于確定哪些線是真正的邊。
就像強度閾值一樣,我們留下了一個二進制映射-白色表示邊,黑色表示其他。這條軌跡現(xiàn)在更容易與圖像的其他部分區(qū)分開來。但是可以看到背景中的邊緣也被檢測到了。
Colour filter
如果我們用像素顏色來隔離軌跡,可能會有更好的結(jié)果。使用下面的pixel_filter函數(shù)來做到這一點。cv2.inRange()將圖像轉(zhuǎn)換為二進制映射(第10行)。這個函數(shù)檢查像素是否在lower(第5行)和upper(第6行)列表給出的范圍內(nèi)。具體來說,每個RGB通道必須在各自的范圍內(nèi)(例如134-t≤R≤194+t)。
簡單來說,該函數(shù)確定像素顏色是否與軌道的橙色足夠接近??梢栽趫D9中看到結(jié)果。參數(shù)t引入了一些靈活性。使用更高的值可以捕獲更多的軌道,但會保留更多的噪音。這是因為背景中的像素也會落在這個范圍內(nèi)。
我們從哪里得到下界和上界呢?也就是說我們怎么知道會落在[134,84,55]和[192,121,101]之間?如果你有興趣,我們將在后面的文章中解釋。
在圖10中,可以看到正在運行的選擇器。從多個圖像中選擇像素,并嘗試在軌道上的不同位置選擇它們。這樣我們就能在不同的條件下得到完整的像素值。
我們一共選了60種顏色??梢栽趫D11中看到所有這些。所有這些顏色的RGB通道存儲在一個列表變量-“colours”中。
最后,我們?yōu)槊總€RGB通道取最小值和最大值。這就給出了下界和上界。
特征工程的局限性
上面就是對于圖像數(shù)據(jù)基本的特征工程,但是你可能覺得這些方法并不那么太好用。這是因為深度學習的一個主要好處是它可以識別復(fù)雜的模式,而不需要進行特征工程。你需要弄清楚圖像的哪些方面是重要的,然后編寫代碼來提取這些方面,這在神經(jīng)王羅出現(xiàn)以后變得不那么重要了。
另外對于一些方法,我們已經(jīng)看到無法消除所有的噪聲。例如,黑色背景中的噪聲和對象像素具有相同的值。這些都是手動的特征不足之處。
但是手動提取特征在處理相對簡單的計算機視覺問題時時非常有用的。例如這個無人駕駛的小車,我們的軌跡從未改變,物體的顏色總是一樣的,這樣可以加快運行速度核準確性。而對于更復(fù)雜的問題,我們需要更多的數(shù)據(jù),或者使用深度學習的方法進行復(fù)雜的模式識別。