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