python人头识别_python+opencv实现人头检测
python+opencv實現(xiàn)人頭檢測
python+opencv實現(xiàn)人頭檢測
前段時間琢磨了下人頭檢測這個功能,現(xiàn)在有了初步的認知和體會,下面開始講下我在實現(xiàn)人頭檢測過程中遇到的坑和解決方法。
環(huán)境搭建:pycharm,python2.7,opencv2.7,numpy。
這些個環(huán)境都是前期準(zhǔn)備的,安裝和配置都挺方便的,不得不說這里就是python的各種功能的庫是真的多,前輩們真是值得膜拜。這里給出一個我下載那些庫的網(wǎng)站,python庫下載
下載了需要的庫用pip安裝就行。
進入正題,因為opencv只有現(xiàn)成的人臉識別特征分類器,但是沒有人頭識別的,所以需要自己訓(xùn)練一個。這里我采用的是HAAR特征訓(xùn)練分類器。看了很多這方面的博文,大多數(shù)用的HAAR特征,所以也就開始就打定主意使用這個特征來訓(xùn)練,后面也簡單了解了下HAAR特征和LBP特征,HAAR特征是將圖像中相同像素內(nèi)的白色部分減去黑色部分得到該區(qū)域的HAAR特征值,反應(yīng)了圖像的灰度變換情況;LBP特征則是將每個像素周圍看成一個3*3的正方形,將中心像素的值作為閥值,周圍8個點像素點與中心點做比較,若像素大于中心點則與中心像素作比較的點的LBP值置為1,反之為0。這樣就得到一個中心的LBP值,反應(yīng)區(qū)域的紋理信息。得到特征值后,用特征值作為分類依據(jù)訓(xùn)練分類器的事情就是那些個算法做的事情了,這里我就不發(fā)表拙見了。看看大牛寫的一篇文章吧,涉及到很多數(shù)學(xué)內(nèi)容,細細看還是會很有理解的。圖像特征提取。
接下來進行具體訓(xùn)練過程:
1.創(chuàng)建一個訓(xùn)練所用的文件夾,目錄結(jié)構(gòu)如下:
各目錄作用:
data:用于存放正樣本描述文件pos.vec,由opencv_createsemples.exe產(chǎn)生。
data1:用于存放訓(xùn)練生成的級聯(lián)分類器文件(casacade.xml),以及訓(xùn)練各階段產(chǎn)生分類器(stages1.xml,stages2.xml等等)。
negdagta:用于存放負樣本文件。
posdata:用于存放正樣本文件。
最下面的那五個文件即是opencv所提供的訓(xùn)練所用算法的exe文件。可以在我的百度云分享里面下載:http://pan.baidu.com/s/1bpNCBj5
2.在正負樣本目錄下各自生成其數(shù)據(jù)文件:posdata.dat和negdata.dat。
命令為:
這樣正負樣本的數(shù)據(jù)文件都在其各自目錄下生成了,接下來進行修改數(shù)據(jù)文件。打開數(shù)據(jù)文件的編輯界面,刪掉數(shù)據(jù)文件最后面的posdata.dat,同理刪除負樣本數(shù)據(jù)文件里面的negdata.dat。如圖:
接下里修改數(shù)據(jù)文件成我這樣,posdata.dat:
negdata.dat:
解釋下 1 0 0 20 20這個參數(shù)的意思,1代表文件,0 0 20 20,是這個目錄下每一張圖片的坐標(biāo),因為是二維的,而且我正樣本所有圖片全是20*20像素的,所以就是(0,0)點到(20,20)點,即是讀取圖片時,從左下角掃描到右上角。
注意:在負樣本的數(shù)據(jù)文件里面,要給每一個圖片文件加上他的相對地址,因為默認我們訓(xùn)練時,是在negdata的父目錄下進行,即是你創(chuàng)建的訓(xùn)練文件夾下進行。
3.準(zhǔn)備工作已經(jīng)完成,下面開始訓(xùn)練具體操作,首先用opecv_createsamples.exe生成樣本描述文件pos.vec。命令如下:
opencv_createsamples.exe -info posdata -vec data\pos.vec -num 你所需要創(chuàng)建的正樣本數(shù)量(一般為正樣本內(nèi)文件數(shù)目的0.9倍) -w 20 -h 20
生成了正樣本描述文件后,接下來就是用opencv_traincascade.exe進行分類器的生成。命令如下:
opencv_traincascade.exe -data data1 -vec data\pos.vec -bg 64negdata numPos 243 -numNeg 300 -minHitRate 0.9999 -maxFalseAlarmRate 0.5 -featureType HA
AR -numStages 20 -w 20 -h 20
各個參數(shù)的意思我這里就不贅述了,給一篇大牛寫的文章,大家自行參考。http://note.sonots.com/SciSoftware/haartraining.html#e134e74e
接著,等著他訓(xùn)練完成就行。
最后我來說下我訓(xùn)練過程中碰到的坑和解決的辦法:
1.訓(xùn)練參數(shù)中-bg,即負樣本路徑不正確,仔細檢查后就能解決。
2.訓(xùn)練參數(shù)中的-numPos,-numNeg,一定要比實際的正負樣本文件夾中樣本數(shù)目少,千萬不要強迫癥,不然就會在訓(xùn)練中途停止,并報如下錯誤:Assertion failed (elements_read == 1) in icvGetHaarTraininDataFromVecCallback,file..\opencv\apps\haartraining\cvhaartraining.cpp, line 1861”
3.正負樣本采集問題,開始我用的網(wǎng)上下的樣本庫訓(xùn)練,雖然樣本數(shù)量很多,但是正樣本質(zhì)量太差,導(dǎo)致訓(xùn)練結(jié)果一直很差,所以就想到了自己采集樣本的辦法,這樣就解決了這個問題。ps:可以自己寫個截圖工具來完成樣本采集工作,正樣本數(shù)量上的話,上千張就會有很好的效果了,一定注意要加些灰度處理后的正樣本圖片,會增加些精確度;負樣本的話,大概與正樣本的三倍,因為后面出現(xiàn)負樣本不足的情況,可以換一批負樣本接著訓(xùn)練。
4.訓(xùn)練到后面,訓(xùn)練終止,提示負樣本不足,這個問題是我碰到的最難解決的問題了,我的解決方法是,用新的負樣本替換掉negdata里面的負樣本文件,然后重新生成相應(yīng)的negdata.dat,接著用相同參數(shù)訓(xùn)練,這樣就相當(dāng)于boosting算法,能夠重新在新的負樣本中進行篩選,就能解決負樣本不足情況。這樣做還有個好處是,不用賦予-numNeg特別大的值,導(dǎo)致其他錯誤。
5.關(guān)于正負樣本比例問題,這個問題看你所需要的訓(xùn)練場景而論,如果你訓(xùn)練的分類器用于變化比較大的環(huán)境,建議你正負樣本比例至少是1:2;如果分類器用于環(huán)境變化較小的情況,就是我所面臨的場景,我的建議是1:1。
至此,我的樣本訓(xùn)練過程就完成了,最后,貼一張最終訓(xùn)練效果圖,這是訓(xùn)練了接近是個分類器后,最好的一個了,基本達到了要求,進一步提升精確度就需要在圖像預(yù)處理部分,和“去抖動”部分琢磨。
python+opencv實現(xiàn)人頭檢測相關(guān)教程
總結(jié)
以上是生活随笔為你收集整理的python人头识别_python+opencv实现人头检测的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jedis操作set_redis命令行操
- 下一篇: shell命令获取按键值_linux s