使用HOG對衛星圖像中的船舶進行分類

機器學習 Kaggle JSON 不靠譜的貓 2019-04-07

我在瀏覽Kaggle數據集時發現了這個有趣的機器學習數據集(https://www.kaggle.com/rhammell/ships-in-satellite-imagery)。該機器學習數據集包括從衛星圖像中提取的船舶圖像以及一些負面實例。查看此機器學習數據集,我們就可以看到正實例被裁剪為具有相同的寬度和高度。

使用HOG對衛星圖像中的船舶進行分類

衛星捕獲船舶的圖像

這些數據的一個明顯應用將是訓練一種“船舶探測器”,這種探測器可以從更大的衛星圖像上利用計算機視覺探測船舶。


使用HOG對衛星圖像中的船舶進行分類

我們可以訓練機器學習模型來檢測大型衛星圖像中的船隻

為了實現這一目標,我想到了一種基於方向梯度直方圖(HOG)的方法,這是傳統機器學習方法中使用的一種特徵表示方法。

機器學習數據集由2000個圖像樣本組成。我們可以使用HOG特徵和SVM實現分類器,可以提供相當好的結果。由於船舶的外觀統一、簡單,所以我們無需依靠複雜的模型就能得到良好的結果。

方向梯度直方圖

方向梯度的直方圖,也稱為HOG,在計算機視覺任務中被大量使用,特別是在檢測行人和類似任務時

Hala特徵表示由Dalal和Triggs引入,作為行人檢測任務的表示方法。該方法建立在圖像的局部強度梯度或邊緣方向可以表徵局部物體外觀的思想的基礎上。HOG特徵在行人檢測等各種目標識別任務中都取得了成功。當我們考慮將其用作開發更復雜的特徵方法(如DPM)的基礎時,該方法的重要性是顯而易見的。

圖像被分成小單元,例如8×8像素。在單元內的每個像素處計算梯度向量。梯度向量被分類為直方圖。梯度向量的方向決定了它將落入哪個區域。向量的大小有助於直方圖的頻率。因此,梯度越大,對直方圖值的影響越大。

塊歸一化

在原始論文中,作者提出了一種歸一化方法,使該表示方法對光照具有更強的不變性。該方法是通過組合多個單元來創建塊,即:可以通過組合兩行和兩列單元來創建塊。將單元的直方圖連接在一起,並通過將直方圖除以連接的矢量的大小來歸一化。以這樣的方式創建塊:在兩個塊之間存在一行或一列單元的重疊。

實現HOG特徵分類器

出於我們的目的,讓我們使用scikit-image中的hog實現,因為我們可以在其他分類器中使用計算的HOG特徵。

import numpy as np
import json
from matplotlib import pyplot as plt
from skimage.feature import hog
from skimage import color,img_as_float
from skimage.io import imread
from sklearn import svm
from sklearn.metrics import classification_report,accuracy_score
from skimage.transform import pyramid_gaussian
#This portion deals with extracting the code from the kaggle dataset
f = open(r'../input/shipsnet.json')
dataset = json.load(f)
f.close()
data = np.array(dataset['data']).astype('uint8')
img_length = 80
#Bit of reshaping to get the dataset in order
data = data.reshape(-1,3,img_length,img_length).transpose([0,2,3,1])
使用HOG對衛星圖像中的船舶進行分類

為了使用圖像來計算hog特徵,我們需要將圖像轉換為灰度。轉換後的圖像用於計算直方圖。

#Convert the images to grayscale
data_gray = [ color.rgb2gray(i) for i in data]
#pixels per cell
ppc = 16
hog_images = []
hog_features = []
for image in data_gray:
fd,hog_image = hog(image, orientations=8, pixels_per_cell=(ppc,ppc),cells_per_block=(4, 4),block_norm= 'L2',visualise=True)
hog_images.append(hog_image)
hog_features.append(fd)
使用HOG對衛星圖像中的船舶進行分類

hog函數返回兩個值。存儲在fd變量中的HOG特徵和可用於表示圖像的HOG特徵的圖像,其存儲在hog_image變量中。如果您不想顯示圖像,只需將visualise參數設置為False,即可將其關閉 。

如果我們可視化hog_images對應於之前的圖像,我們將得到這樣的結果

使用HOG對衛星圖像中的船舶進行分類

在下一節中,我們準備我們的訓練和測試數據集,比例為80:20。然後我們訓練支持向量機來分類圖像是否包含船。Python代碼如下:

#Extract the labels from the dataset
labels = np.array(dataset['labels']).reshape(len(dataset['labels']),1)
#Create the classifier
clf = svm.SVC()
hog_features = np.array(hog_features)
data_frame = np.hstack((hog_features,labels))
#Shuffle the data set
np.random.shuffle(data_frame)
percentage = 80
partition = int(len(hog_features)*percentage/100)
x_train = data_frame[:partition,:-1]
x_test = data_frame[partition:,:-1]
y_train = data_frame[:partition,-1:].ravel()
y_test = data_frame[partition:,-1:].ravel()
#Train the classifier with the training data
clf.fit(x_train,y_train)
使用HOG對衛星圖像中的船舶進行分類

然後我們使用測試集來評估模型。為了更好地理解數據,最後會報告一些指標。

y_pred = clf.predict(x_test)
print("Accuracy: "+str(accuracy_score(y_test, y_pred)))
print('\n')
print(classification_report(y_test, y_pred))
使用HOG對衛星圖像中的船舶進行分類

使用HOG對衛星圖像中的船舶進行分類

結論

本研究的目的是探討傳統計算機視覺技術在應用於普通圖像識別任務時的性能。鑑於我們沒有花太多時間調整參數,它還是相當不錯的。使用HOG參數(例如每個單元的像素數和每個塊的單元格)可能會產生不同的結果。這個結果表明我們並不總是需要求助於複雜的學習任務,有時解決方案可能很簡單。在這篇文章中我們只研究了給定圖像的分類,我們還沒有涉及對象定位。有許多方法可以在圖像中查找和定位對象,例如滑動窗口和選擇性搜索以及諸如候選區域之類的新技術。

相關推薦

推薦中...