如何用opencv訓練自己的分類器

2021-05-09 12:39:57 字數 2470 閱讀 6171

最近要做乙個性別識別的專案,在人臉檢測與五官定位上我採用opencv的haartraining進行定位,這裡介紹下這兩天我學習的如何用opencv訓練自己的分類器。在這兩天的學習裡,我遇到了不少問題,不過我遇到了幾個好心的大俠幫我解決了不少問題,特別是無忌,在這裡我再次感謝他的幫助。

一、簡介

目標檢測方法最初由paul viola [viola01]提出,並由rainer lienhart [lienhart02]對這一方法進行了改善。該方法的基本步驟為: 首先,利用樣本(大約幾百幅樣本)的 harr 特徵進行分類器訓練,得到乙個級聯的boosted分類器。

分類器中的"級聯"是指最終的分類器是由幾個簡單分類器級聯組成。在影象檢測中,被檢視窗依次通過每一級分類器, 這樣在前面幾層的檢測中大部分的候選區域就被排除了,全部通過每一級分類器檢測的區域即為目標區域。

分類器訓練完以後,就可以應用於輸入影象中的感興趣區域的檢測。檢測到目標區域分類器輸出為1,否則輸出為0。為了檢測整副影象,可以在影象中移動搜尋視窗,檢測每乙個位置來確定可能的目標。 為了搜尋不同大小的目標物體,分類器被設計為可以進行尺寸改變,這樣比改變待檢影象的尺寸大小更為有效。所以,為了在影象中檢測未知大小的目標物體,掃瞄程式通常需要用不同比例大小的搜尋視窗對進行幾次掃瞄。

目前支援這種分類器的boosting技術有四種: discrete adaboost, real adaboost, gentle adaboost and logitboost。

"boosted" 即指級聯分類器的每一層都可以從中選取乙個boosting演算法(權重投票),並利用基礎分類器的自我訓練得到。

根據上面的分析,目標檢測分為三個步驟:

1、 樣本的建立

2、 訓練分類器

3、 利用訓練好的分類器進行目標檢測。

二、樣本建立

訓練樣本分為正例樣本和反例樣本,其中正例樣本是指待檢目標樣本,反例樣本指其它任意。

負樣本負樣本可以來自於任意的,但這些不能包含目標特徵。負樣本由背景描述檔案來描述。背景描述檔案是乙個文字檔案,每一行包含了乙個負樣本的檔名(基於描述檔案的相對路徑)。該檔案建立方法如下:

採用dos命令生成樣本描述檔案。具體方法是在dos下的進入你的目錄,比如我的放在d:/face/posdata下,則:

按ctrl+r開啟windows執行程式,輸入cmd開啟dos命令視窗,輸入d:回車,再輸入cd d:/face/negdata進入路徑,再次輸入dir /b > negdata.dat,則會路徑下生成乙個negdata.dat檔案,開啟該檔案將最後一行的negdata.dat刪除,這樣就生成了負樣本描述檔案。dos命令視窗結果如下圖:

正樣本

對於正樣本,通常的做法是先把所有正樣本裁切好,並對尺寸做規整(即縮放至指定大小),如下圖所示:

posdata/1(10).bmp 1 1 1 23 23

posdata/1(11).bmp 1 1 1 23 23

posdata/1(12).bmp 1 1 1 23 23

不過你可以把描述檔案放在你的posdata路徑(即正樣本路徑)下,這樣你就不需要加前面的相對路徑了。同樣它的生成方式可以用負樣本描述檔案的生成方法,最後用txt的替換工具將「bmp」全部替換成「bmp 1 1 1 23 23

」就可以了,如果你的樣本多,用txt替換會導致程式未響應,你可以將內容拷到word下替換,然後再拷回來。bmp後面那五個數字分別表示個數,目標的起始位置及其寬高。這樣就生成了正樣本描述檔案posdata.dat。

2) 執行createsamples程式。如果直接在vc環境下執行,可以在project/settings/debug屬性頁的program arguments欄設定執行引數。下面是乙個執行引數示例:

-info d:/face/posdata/posdata.dat -vec d:/face/pos.vec -num 50 -w 20 -h 20

表示有50個樣本,樣本寬20,高20,正樣本描述檔案為posdata.dat,結果輸出到pos.vec。

或者在dos下輸入:

"d:/program files/opencv/bin/createsamples.exe" -info "posdata/posdata.dat" -vec data/pos.vec -num 50 -w 20 -h 20

執行完了會d:/face/data下生成乙個*.vec的檔案。該檔案包含正樣本數目,寬高以及所有樣本影象資料。結果入下圖:

createsamples程式的命令列引數:

命令列引數:

-vec

訓練好的正樣本的輸出檔名。

-img

源目標(例如:乙個公司圖示)

-bg背景描述檔案。

-num

要產生的正樣本的數量,和正樣本數目相同。

-bgcolor

背景色(假定當前為灰度圖)。背景色制定了透明色。對於壓縮,顏色方差量由bgthresh引數來指定。則在bgcolor-bgthresh和bgcolor+bgthresh中間的畫素被認為是透明的

如何用 Node Vue 搭建自己的部落格

為什麼選擇使用 node vue 搭建自己部落格,而不使用如 wordpress 等成熟的模板呢?我們使用 node.js 自己寫介面,vue 做前端渲染,可以讓我們更了解乙個 從後台搭建到前端渲染的過程,形成乙個知識的閉環,可以更有效提公升我們工做效率。文章主要內容包括 伺服器搭建,ssl 證書配...

如何用C 實現自己的Tensorflow

摘要 tensorflow是由谷歌基於distbelief進行研發的第二代人工智慧學習系統,其命名 於本身的執行原理,它完全開源,作者通過自己的乙個小專案,闡述了如何用c 實現自己的tensorflow,這篇文章看起來可能會有點晦澀,你需要對相關知識有所了解。以下是譯文。在我們開始之前,以下是 br...

如何用Hexo Github建立自己的技術部落格

github官網。按照一般的 註冊登入執行就好了,不詳細說。安裝很簡單,一直下一步 git安裝教程 很多教程裡都說要配置環境變數,我本人安裝過5次左右的git,一次都沒有配過,但是要配置使用者名稱和郵箱,就是和github註冊的一樣 安裝成功你在桌面右鍵,就能看到 多了兩個 git命令 安裝node...