07-机器学习(Hog+SVM实现小狮子识别)
一、SVM支持向量機(jī)
什么是SVM支持向量機(jī)?
SVM支持向量機(jī)本質(zhì)仍是一個(gè)分類器,其核心為尋求一個(gè)最優(yōu)超平面最終實(shí)現(xiàn)分類,實(shí)現(xiàn)分類問題
在尋求超平面的時(shí)候有多種方式,可以使用若干條直線或曲線進(jìn)行分類,這里使用的是直線,即SVM核為線性核
SVM支持許多核,這里使用的是線性核
數(shù)據(jù)準(zhǔn)備,即準(zhǔn)備訓(xùn)練樣本,需要有正負(fù)樣本兩種情況,正樣本和負(fù)樣本的個(gè)數(shù)不一定相同;在準(zhǔn)備樣本的時(shí)候一定要準(zhǔn)備label標(biāo)簽,這個(gè)label標(biāo)簽唯一描述當(dāng)前訓(xùn)練的數(shù)據(jù),正是因?yàn)橛辛薼abel標(biāo)簽才使得其是一個(gè)監(jiān)督學(xué)習(xí)的過程;監(jiān)督學(xué)習(xí):在學(xué)習(xí)一個(gè)數(shù)據(jù)的時(shí)候進(jìn)行監(jiān)督其對(duì)與錯(cuò),即判斷其是0還是1
訓(xùn)練:創(chuàng)建SVM并且設(shè)置其屬性
通過train方法完成訓(xùn)練
訓(xùn)練完成后調(diào)用predict方法進(jìn)行預(yù)測
實(shí)現(xiàn)案例:通過兩組男生和女生的一些身高和體重的信息,進(jìn)行訓(xùn)練,最后對(duì)指定身高和體重的人進(jìn)行判別其性別。男生為1,女生為0。
import cv2 import numpy as np import matplotlib.pyplot as plt #1 準(zhǔn)備data 男生和女生的身高和體重 rand1 = np.array([[155,48],[159,50],[164,53],[168,56],[172,60]])#女生 rand2 = np.array([[152,53],[156,55],[160,56],[172,64],[176,65]])#男生# 2 label 表示當(dāng)前數(shù)據(jù)的唯一屬性,例如這里的0表示女生,1表示為男生 label = np.array([[0],[0],[0],[0],[0],[1],[1],[1],[1],[1]])#這里將男女生給合并處理了,女生在前男生在后,所以這里的array為五個(gè)0和五個(gè)1# 3 data data = np.vstack((rand1,rand2))#垂直合并 data = np.array(data,dtype='float32')# svm 所有的數(shù)據(jù)都要有l(wèi)abel # [155,48] -- 0 女生 [152,53] ---1 男生 # 監(jiān)督學(xué)習(xí) 0 負(fù)樣本 1 正樣本# 4 訓(xùn)練 svm = cv2.ml.SVM_create() # ml 機(jī)器學(xué)習(xí)模塊、SVM_create() 創(chuàng)建 # 屬性設(shè)置 svm.setType(cv2.ml.SVM_C_SVC) # svm type svm.setKernel(cv2.ml.SVM_LINEAR) # line svm.setC(0.01) # 訓(xùn)練 result = svm.train(data,cv2.ml.ROW_SAMPLE,label) # 預(yù)測 pt_data = np.vstack([[167,55],[162,57]]) #0 女生 1男生 pt_data = np.array(pt_data,dtype='float32') print(pt_data) (par1,par2) = svm.predict(pt_data) print(par1) print(par2)效果圖如下:
二、Hog特征
什么是Hog特征?
特征:某個(gè)特定區(qū)域的像素,進(jìn)行某種四則運(yùn)算之后得到的結(jié)果
Haar特征是直接經(jīng)過模板計(jì)算的結(jié)果
而Hog特征則比較復(fù)雜些
Hog特征實(shí)現(xiàn)的步驟:
1、Hog特征的模塊化劃分
2、根據(jù)Hog特征模板計(jì)算梯度和方向,當(dāng)然其也對(duì)應(yīng)有相應(yīng)的模板概念
3、根據(jù)梯度和方向進(jìn)行bin投影
4、計(jì)算每個(gè)模塊的Hog特征
模塊劃分: 和Haar特征一樣,Hog特征也需要模塊劃分 image、windows、block、cell每個(gè)概念均有一個(gè)size()
image是整個(gè)圖片、windows窗體時(shí)藍(lán)色的長方形、block模塊時(shí)紅色的矩形、cell模塊時(shí)綠色的矩形
image>windows>block>cell成包含關(guān)系
block在滑動(dòng)的時(shí)候有個(gè)step步長
Windows在滑動(dòng)的時(shí)候也有個(gè)step步長
cell在滑動(dòng)的時(shí)候會(huì)出現(xiàn)一個(gè)bin
windows是特征計(jì)算的最頂層單元,整個(gè)Hog特征計(jì)算最頂層也就計(jì)算到windows窗體這個(gè)地方;
一個(gè)窗口必須包含一個(gè)目標(biāo)obj的所有的描述信息,只有把這些描述信息全部包含進(jìn)去后,根據(jù)這些描述信息得到的這些窗體,根據(jù)窗體再計(jì)算出的特征才可以唯一描述當(dāng)前這個(gè)目標(biāo)obj
windows的大小size,窗體的大小是任意的,官方推薦的使用在人臉識(shí)別的windows大小為64 * 128
block的大小,block是位于藍(lán)色windows窗體中,一般情況下windows的寬高必須是block的寬高的整數(shù)倍,一般block的大小為16 * 16
block的步長step,紅色的block會(huì)沿著藍(lán)色windows窗體從上到下,從左到右依次進(jìn)行遍歷,正是因?yàn)楸闅v的過程,所有才有了step這個(gè)概念
block每次向上向下或者向左向右滑動(dòng)的長度即為step;
block的step描述的是block如何在windows下滑動(dòng);若block的大小為16 * 16,則一般情況下step的大小為8*8
在windows下block可以滑動(dòng)多少次? {[(64-16)/8]+1} * {[(128-16)/8]+1} = 105次
若block的大小為1616,step為88;則一般情況下,cell大小推薦為88
一個(gè)cell大小為88,則一個(gè)block中包含4個(gè)cell,且cell是不可滑動(dòng)的,是固定在block中;分別命名為:cell1、cell2、cell3、cell4
bin、cell、梯度:簡而言之就是一個(gè)運(yùn)算
在計(jì)算每一個(gè)像素的梯度的時(shí)候,即每個(gè)像素都有其對(duì)應(yīng)的梯度;梯度具有兩個(gè)屬性:大小(或幅值)、方向(角度)
圓有360°,將360°按40°進(jìn)行劃分,可以分為9塊,這9塊成為9個(gè)單元,每一個(gè)單元就成為一個(gè)bin,9塊就是9個(gè)bin
一個(gè)bin就是40°,剛好9個(gè)bin是360°
在cell中必須完整包含一個(gè)360°的完整信息,即只需要將這個(gè)cell完整包含這9個(gè)bin即可,即一個(gè)cell對(duì)應(yīng)9個(gè)bin
Hog特征得到的是一個(gè)向量,因?yàn)槭窍蛄抗蚀嬖诰S度的概念,可以完全描述目標(biāo)obj對(duì)象的所有信息info,既然是所有信息,故應(yīng)該為整個(gè)windows窗體中的信息,因?yàn)榇绑wwindows是特征計(jì)算的最頂層單元,可以包含描述目標(biāo)對(duì)象obj的所有信息
Hog特征的維度 = 所有windows窗體中block數(shù)(即105)* 每個(gè)block中cell的個(gè)數(shù)(一個(gè)block對(duì)應(yīng)4個(gè)cell)* 每個(gè)cell對(duì)應(yīng)的多少個(gè)bin(一個(gè)cell中包含9個(gè)bin)= 10549=3780,故Hog特征為3780維。
梯度如何計(jì)算方向和大小?
在進(jìn)行梯度運(yùn)算的時(shí)候需要以像素為單位,每個(gè)像素都有一個(gè)梯度,所有的像素共同都構(gòu)建在一起形成了Hog特征,總共有windows窗體下所有的像素共同構(gòu)成了Hog特征
特征模板包括水平和豎直方向上的模板 水平方向上的模板為 [1 0 -1] 對(duì)于水平方向上的模板實(shí)際上:左中右三個(gè)像素分別與模板進(jìn)行相乘 a = p1 * 1 + p2 * 0 + p3 * -1 = 相鄰像素之差
豎直方向上的模板為 [[1],[0],[-1]] b = 上下像素之差
整個(gè)梯度幅值f = 根號(hào)下(a方 + b方) 當(dāng)前的角度angle = arctan(a/b)
bin的投影,其主要依賴于梯度 在bin中把0-360°劃分為9個(gè)bin,每個(gè)bin的范圍為0-40°
例如,bin1為0-20°,在這個(gè)0-20°這個(gè)范圍上的,就表示其在bin1上;bin1也可能在180-200°,即bin1總共為40°即可
對(duì)于某個(gè)像素i和j來說,其梯度計(jì)算出來的幅值為f,角度a=10°,這個(gè)10°剛好位于0-20°之間,故其投影到bin1上
當(dāng)然若a=190°,位于180-200°之間,其也投影在bin1上;此時(shí)投影的幅度即為f(前提是在正中間位置)。
若a=15°,不在正中間的位置,此時(shí)會(huì)進(jìn)行分解,f為正中間時(shí)的幅度,夾角函數(shù)f(夾角)的范圍在0.0-1.0之間 f1 = f*(夾角函數(shù))
f2 = f*(1-夾角函數(shù))
計(jì)算整體的Hog特征,以及cell的復(fù)用 整個(gè)Hog的維度為3780
3780來源于windows窗體,其中windows窗體中包含block、cell、bin,每一個(gè)維度就是其中的每一個(gè)bin
一個(gè)維度,即來源于一個(gè)windows下的一個(gè)block下的某一個(gè)cell下的每一個(gè)bin
把每一個(gè)block的第一個(gè)cell進(jìn)行9等分,命名為cell0-cell3,同樣bin有9個(gè),命名為bin0-bin8
對(duì)于第一個(gè)cell來說,cell0總共有9個(gè)bin,即bin0-bin8 cell1、cell2、cell3均有9個(gè)bin
假設(shè)(i,j)像素投影在cell0像素的bin0下
根據(jù)梯度可以計(jì)算出梯度的方向和梯度的幅值,幅值為f,方向?yàn)槟骋粋€(gè)角度不知道,這個(gè)角度就會(huì)投影到cell0上的bin0上,這時(shí)候bin0的內(nèi)容就變成了f0,bin0中描述了當(dāng)前像素的梯度,投影完之后,bin0的內(nèi)容就等于f0
像素(i+1,j)行加,列不變,所有的這些像素都位于cell0上,(i+1,j)也有可能投影到cell0上,角度也會(huì)投影到bin0上,這時(shí)候的bin0就變成了f1;
同樣還會(huì)有(i+2,j),(i+3,j)等等等等
將所有的像素全部都遍歷完,再使用sum累加的方式,把所有的bin0累加到一起;sum(bin0(f0+f1+…)) = bin0,這個(gè)bin0就是在cell0下計(jì)算出來的所有的bin0的值
權(quán)重累加
對(duì)于像素(i,j)來說,它不僅可以影響bin0,還可能會(huì)影響bin1,所以在計(jì)算sum(bin0)的時(shí)候除了f0+f1還需要當(dāng)前像素在其他下的投影,比如(i,j)像素,有可能仍然投影在bin0上,因?yàn)閎in0是兩部分,其中一個(gè)bin可能會(huì)與cell0上的bin相同
cell復(fù)用 在一個(gè)block中存在著4個(gè)cell,這4個(gè)cell正常情況下是并列排序的分別是cell0-cell3
對(duì)于cell0來說,它對(duì)應(yīng)的是自己的bin0-bin9,其實(shí)在真正的計(jì)算中,會(huì)將block進(jìn)行另外一個(gè)維度的劃分,在這個(gè)維度上,將cell劃分為cellx0、cellx2、cellx4 例如在cellx0上,所有元素(i,j),(i,j)計(jì)算出來的bin只對(duì)當(dāng)前的cell起作用,雖然其會(huì)進(jìn)行分解成當(dāng)前的bin和相鄰的bin(例如為bin+1)
無論是當(dāng)前的bin還是bin+1也好,只對(duì)cell0起作用
對(duì)于cellx2來說,其所有的元素(i,j)不光對(duì)當(dāng)前的cell2起作用,還對(duì)當(dāng)前的另外一個(gè)cell(例如cell3),它同時(shí)投影到兩個(gè)cell上,會(huì)進(jìn)行分解為bin、bin+1,和cell3上分解的bin和bin+1
對(duì)于cellx4,它上面的所有的元素(i,j),會(huì)對(duì)4個(gè)cell起作用,則會(huì)分解成8個(gè)bin
再與4個(gè)cell進(jìn)行合并,共同構(gòu)成了9維,在于block中的4個(gè)cell組合到一起共同構(gòu)成了36位,這36位和整個(gè)windows下的105個(gè)blokc組合在一起共同構(gòu)成了3780維
3780維度的Hog特征如何進(jìn)行判決,就需要SVM相關(guān)知識(shí) 以SVM線性分類器為例,這個(gè)線性分類器首先需要進(jìn)行訓(xùn)練,訓(xùn)練完成之后同樣會(huì)得到一個(gè)3780維度的向量,用Hog特征(3780維度向量) * SVM的3780維度向量特征 = 具體的值,這個(gè)值就是最終的判決文獻(xiàn),這個(gè)值與標(biāo)準(zhǔn)的判決文獻(xiàn)進(jìn)行比較,如果大于判決文獻(xiàn),則認(rèn)為是目標(biāo);否則認(rèn)為是非目標(biāo)
三、具體實(shí)現(xiàn)
1,準(zhǔn)備檢測需要的各種樣本;2,對(duì)這些樣本進(jìn)行Hog+SVM訓(xùn)練;3,訓(xùn)練好后,實(shí)驗(yàn)test圖片進(jìn)行預(yù)測
1、pos文件夾存放各種各樣的正樣本,正樣本也就是每個(gè)圖片樣本都包含這個(gè)小獅子;正樣本圖片的大小為64 * 128;正樣本盡可能多樣,即環(huán)境多樣、干擾多樣;正樣本個(gè)數(shù)為820
neg文件夾下為各種各樣的負(fù)樣本,負(fù)樣本也是各種各樣的圖片,這些負(fù)樣本中沒有包含正樣本小獅子圖樣,負(fù)樣本中一定不能出現(xiàn)正樣本的;負(fù)樣本圖片大小也為64*128;負(fù)樣本也要盡可能的環(huán)境、干擾條件多樣;負(fù)樣本個(gè)數(shù)1931
一般正負(fù)樣本比例在1:2 - 1:3之間;且名字的命名最好規(guī)范因?yàn)楹罄m(xù)要進(jìn)行遍歷
樣本的獲取:1,來源于網(wǎng)絡(luò);2、來源于公司內(nèi)部;3、自己收集(寫個(gè)爬蟲自己爬或者錄視頻,100s的視頻,1s就有30幀的圖片,100s的視頻就是3000張樣本)
在深度學(xué)習(xí)中,一個(gè)好的樣本,遠(yuǎn)勝過一個(gè)復(fù)雜的神經(jīng)網(wǎng)絡(luò) 對(duì)于機(jī)器學(xué)習(xí)中,樣本需要幾千幾萬個(gè);而在深度學(xué)習(xí)中,需要的樣本動(dòng)則十幾萬,上百萬個(gè)
2,對(duì)樣本進(jìn)行訓(xùn)練
1、完成為參數(shù)的設(shè)置,其中參數(shù)包括了windows窗體的大小、block的大小、block的步長、cell的大小、bin的個(gè)數(shù)
2、創(chuàng)建一個(gè)Hog
3、獲取當(dāng)前SVM的參數(shù)
4、計(jì)算Hog
5、準(zhǔn)備label標(biāo)簽
6、完成訓(xùn)練
7、訓(xùn)練完后,進(jìn)行預(yù)測
8、通過使用繪圖操作,看下預(yù)測的完成效果
Hog的創(chuàng)建:
cv2.HOGDescriptor(winSize,blockSize,blockStride,cellSize,nBin)
參數(shù)一:當(dāng)前windows窗口的大小
參數(shù)二:block的大小
參數(shù)三:block的步長
參數(shù)四:cell的大小
參數(shù)五:bin的個(gè)數(shù)
SVM的創(chuàng)建:
cv2.ml.SVM_create()
SVM的訓(xùn)練:
svm.train(featureArray,cv2.ml.ROW_SAMPLE,labelArray)
參數(shù)一:特征數(shù)組
參數(shù)二:機(jī)器學(xué)習(xí)
參數(shù)三:標(biāo)簽數(shù)組
detectMultiScale(imageSrc,0,(8,8),(32,32),1.05,2)
參數(shù)一:待檢測的原圖
參數(shù)二:windwos滑動(dòng)步長
參數(shù)三:窗體大小
參數(shù)四:縮放
參數(shù)五:線條寬度
圖片的繪制:
cv2.rectangle(imageSrc,(x,y),(x+w,y+h),(255,0,0),2)
參數(shù)一:圖片
參數(shù)二:起始位置
參數(shù)三:終止位置
參數(shù)四:顏色
參數(shù)五:線條寬度
效果圖如下:
訓(xùn)練正樣本:
訓(xùn)練負(fù)樣本:
測試樣本:
總結(jié)
以上是生活随笔為你收集整理的07-机器学习(Hog+SVM实现小狮子识别)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 摩尔庄园手游彩虹币怎么获得
- 下一篇: 升级导航多少钱啊?