如何利用opencv訓(xùn)練自己的模型實(shí)現(xiàn)特定物體的識(shí)別
1.說明
opencv安裝包中有訓(xùn)練好的分類器文件,可以實(shí)現(xiàn)人臉的識(shí)別。當(dāng)然,我們也可以訓(xùn)練自己的分類器文件,實(shí)現(xiàn)對特定物體的識(shí)別。本文章就詳細(xì)介紹下如何訓(xùn)練自己的分類器文件。
2.效果
我訓(xùn)練的是檢測蘋果的的分類器文件,可以實(shí)現(xiàn)對蘋果的識(shí)別。
3.準(zhǔn)備
3.1 程序準(zhǔn)備
- 訓(xùn)練自己的分類器文件,需要用到兩個(gè)程序 : opencv_createsamples.exe和opencv_traincascade.exe
- opencv最新的安裝包中沒有這兩個(gè)程序,我們可以下載 3.4.14這個(gè)版本的安裝包進(jìn)行安裝。
- opencv安裝包 : opencv-3.4.14-vc14_vc15.exe
- 安裝完成后,在這個(gè)目錄下就會(huì)有這兩個(gè)程序文件 opencv\build\x64\vc15\bin
3.2 樣本數(shù)據(jù)準(zhǔn)備
正樣本數(shù)據(jù) : 也就是我們需要檢測的物體圖片,可以自己用手機(jī)拍攝下你要檢測的物體的圖片,多拍攝一些不同角度的圖片。
我的正樣本數(shù)據(jù)在這個(gè)目錄下 image\positive\img,大概有50多張圖片
然后在image\positive目錄下新建一個(gè)info.dat文件,在其中記錄正樣本圖片信息
參數(shù)介紹
- img/1.jpg : 文件路徑和文件名
- 1:表示圖片中有幾個(gè)目標(biāo)物體,一般一個(gè)就行了
- 0,0:目標(biāo)物體起始坐標(biāo)
- 1280,1706:目標(biāo)物體大小
負(fù)樣本數(shù)據(jù):不包含我們要檢測物體的圖片,可以拍攝一些風(fēng)景之類的圖片,盡量多一些。
我的負(fù)樣本數(shù)據(jù)在這個(gè)目錄下 image\negitive\img
然后在image\negitive目錄下新建一個(gè)bg.txt文件,在其中記錄負(fù)樣本圖片信息
負(fù)樣本圖片信息我們只需記錄路徑和文件名就行了,但是這里要注意,路徑名要寫絕對路徑,后面會(huì)說為什么。
3.3 正樣本VEC文件創(chuàng)建
- 訓(xùn)練樣本之前先要生成vec文件,要用到opencv_createsamples.exe程序
- opencv_createsamples.exe部分參數(shù)介紹
[-info <collection_file_name>] # 記錄樣本數(shù)據(jù)的文件(就是我們剛才創(chuàng)建的info.data文件) [-img <image_file_name>] [-vec <vec_file_name>] # 輸出文件,內(nèi)含用于訓(xùn)練的正樣本。 [-bg <background_file_name>] # 背景圖像的描述文件 [-num <number_of_samples = 1000>] #樣本數(shù)量(默認(rèn)為1000) [-bgcolor <background_color = 0>] #指定背景顏色 [-w <sample_width = 24>]#輸出樣本的寬度(以像素為單位) [-h <sample_height = 24>]#輸出樣本的高度(以像素為單位)
在安裝包的這個(gè)目錄下opencv\build\x64\vc15\bin可以找到opencv_createsamples.exe程序,我們生成下vec文件
D:\opencv3.4.12\opencv\build\x64\vc15\bin\opencv_createsamples.exe -info C:\Users\lng\Desktop\image\positive\info.dat -vec C:\Users\lng\Desktop\image\sample.vec -num 58 -bgcolor 0 -bgthresh 0 -w 24 -h 24
在image目錄下就生成了vec文件
4.樣本數(shù)據(jù)訓(xùn)練
- 完成上面的準(zhǔn)備工作,就可以開始訓(xùn)練樣本。訓(xùn)練樣本需要用到opencv_traincascaded.exe程序
- opencv_traincascaded.exe程序部分參數(shù)介紹
-data <cascade_dir_name> #目錄名,如不存在訓(xùn)練程序會(huì)創(chuàng)建它,用于存放訓(xùn)練好的分類器 -vec <vec_file_name> #包含正樣本的vec文件名 -bg <background_file_name> #背景描述文件 [-numPos <number_of_positive_samples = 2000>] #每級分類器訓(xùn)練時(shí)所用的正樣本數(shù)目 [-numNeg <number_of_negative_samples = 1000>] #每級分類器訓(xùn)練時(shí)所用的負(fù)樣本數(shù)目 [-numStages <number_of_stages = 20>] #訓(xùn)練的分類器的級數(shù) --cascadeParams-- [-featureType <{HAAR(default), LBP, HOG}>] # 特征的類型: HAAR - 類Haar特征; LBP - 局部紋理模式特征 [-w <sampleWidth = 24>] #訓(xùn)練樣本的尺寸(單位為像素) [-h <sampleHeight = 24>] #訓(xùn)練樣本的尺寸(單位為像素) --boostParams-- [-minHitRate <min_hit_rate> = 0.995>] #分類器的每一級希望得到的最小檢測率 [-maxFalseAlarmRate <max_false_alarm_rate = 0.5>] #分類器的每一級希望得到的最大誤檢率
- 在安裝包的這個(gè)目錄下opencv\build\x64\vc15\bin可以找到opencv_traincascade.exe程序,開始訓(xùn)練樣本
- 這里注意下
- 指定-bg參數(shù)時(shí),文件名前不能加路徑,所以需要把剛才在image\negitive下創(chuàng)建的bg.txt文件拷貝到opencv_traincascade.exe程序所在目錄下,所以要在bg.txt寫負(fù)樣本圖片的絕對路徑。
- 指定numPos參數(shù)時(shí),因?yàn)槊總€(gè)階段訓(xùn)練時(shí)有些正樣本可能會(huì)被識(shí)別為負(fù)樣本,故每個(gè)訓(xùn)練階段后都會(huì)消耗一定的正樣本。因此,此處使用的正樣本數(shù)量絕對不能等于或超過positive文件夾下的正樣本個(gè)數(shù),一般留有一定的余量
- 指定-numNeg參數(shù)時(shí),可以多于negitive目錄下的負(fù)樣本數(shù)量
D:\opencv3.4.12\opencv\build\x64\vc15\bin\opencv_traincascade.exe -data C:\Users\lng\Desktop\image -vec C:\Users\lng\Desktop\image\sample.vec -bg bg.txt -numPos 50 -numNeg 500 -numStages 12 -feattureType HAAR -w 24 -h 24 -minHitRate 0.995 -maxFalseAlarmRate 0.5
執(zhí)行結(jié)果
PARAMETERS: cascadeDirName: C:\Users\lng\Desktop\image vecFileName: C:\Users\lng\Desktop\image\sample.vec bgFileName: bg.txt numPos: 50 numNeg: 500 numStages: 12 precalcValBufSize[Mb] : 1024 precalcIdxBufSize[Mb] : 1024 acceptanceRatioBreakValue : -1 stageType: BOOST featureType: HAAR sampleWidth: 24 sampleHeight: 24 boostType: GAB minHitRate: 0.995 maxFalseAlarmRate: 0.5 weightTrimRate: 0.95 maxDepth: 1 maxWeakCount: 100 mode: BASIC Number of unique features given windowSize [24,24] : 162336 ===== TRAINING 0-stage ===== <BEGIN POS count : consumed 50 : 50 NEG count : acceptanceRatio 500 : 1 Precalculation time: 0.581 +----+---------+---------+ | N | HR | FA | +----+---------+---------+ | 1| 1| 1| +----+---------+---------+ | 2| 1| 0.05| +----+---------+---------+ END> Training until now has taken 0 days 0 hours 0 minutes 1 seconds. ===== TRAINING 1-stage ===== <BEGIN POS count : consumed 50 : 50 NEG count : acceptanceRatio 500 : 0.084832 Precalculation time: 0.576 +----+---------+---------+ | N | HR | FA | +----+---------+---------+ | 1| 1| 1| +----+---------+---------+ | 2| 1| 0.146| +----+---------+---------+ END> Training until now has taken 0 days 0 hours 0 minutes 3 seconds. ===== TRAINING 2-stage ===== <BEGIN POS count : consumed 50 : 50 NEG count : acceptanceRatio 500 : 0.0149993 Precalculation time: 0.592 +----+---------+---------+ | N | HR | FA | +----+---------+---------+ | 1| 1| 1| +----+---------+---------+ | 2| 1| 0.186| +----+---------+---------+ END> Training until now has taken 0 days 0 hours 0 minutes 5 seconds. ===== TRAINING 3-stage ===== <BEGIN POS count : consumed 50 : 50 NEG count : acceptanceRatio 500 : 0.00288033 Precalculation time: 0.652 +----+---------+---------+ | N | HR | FA | +----+---------+---------+ | 1| 1| 1| +----+---------+---------+ | 2| 1| 0.298| +----+---------+---------+ END> Training until now has taken 0 days 0 hours 0 minutes 7 seconds. ===== TRAINING 4-stage ===== <BEGIN POS count : consumed 50 : 50 NEG count : acceptanceRatio 500 : 0.000768845 Precalculation time: 0.615 +----+---------+---------+ | N | HR | FA | +----+---------+---------+ | 1| 1| 1| +----+---------+---------+ | 2| 1| 1| +----+---------+---------+ | 3| 1| 0.366| +----+---------+---------+ END> Training until now has taken 0 days 0 hours 0 minutes 11 seconds. ===== TRAINING 5-stage ===== <BEGIN POS count : consumed 50 : 50 NEG count : acceptanceRatio 500 : 0.000375057 Precalculation time: 0.61 +----+---------+---------+ | N | HR | FA | +----+---------+---------+ | 1| 1| 1| +----+---------+---------+ | 2| 1| 1| +----+---------+---------+ | 3| 1| 0.366| +----+---------+---------+ END> Training until now has taken 0 days 0 hours 0 minutes 15 seconds. ===== TRAINING 6-stage ===== <BEGIN POS count : consumed 50 : 50 NEG count : acceptanceRatio 2 : 0.00016276 Required leaf false alarm rate achieved. Branch training t
訓(xùn)練完成后,在img目錄下就會(huì)生成以下文件。
cascade.xml就是我們需要的分類器文件,其他都是過程文件。
5.測試代碼
main.cpp
#include <iostream> #include <opencv2/opencv.hpp> char* face_cascade_name = "C:\\Users\\lng\\Desktop\\image\\cascade.xml"; void faceRecongize(cv::CascadeClassifier faceCascade, cv::Mat frame); int main(){ cv::VideoCapture *videoCap = new cv::VideoCapture; cv::CascadeClassifier faceCascade; // 加載蘋果分類器文件 if (!faceCascade.load(face_cascade_name)) { std::cout << "load face_cascade_name failed. " << std::endl; return -1; } // 打開攝像機(jī) videoCap->open(0); if (!videoCap->isOpened()) { videoCap->release(); std::cout << "open camera failed"<< std::endl; return -1; } std::cout << "open camera success"<< std::endl; while(1){ cv::Mat frame; //讀取視頻幀 videoCap->read(frame); if (frame.empty()) { videoCap->release(); return -1; } //進(jìn)行蘋果識(shí)別 faceRecongize(faceCascade, frame); //窗口進(jìn)行展示 imshow("face", frame); //等待回車鍵按下退出程序 if (cv::waitKey(30) == 13) { cv::destroyAllWindows(); return 0; } } system("pause"); return 0; } void faceRecongize(cv::CascadeClassifier faceCascade, cv::CascadeClassifier eyesCascade, cv::CascadeClassifier mouthCascade, cv::Mat frame) { std::vector<cv::Rect> faces; // 檢測蘋果 faceCascade.detectMultiScale(frame, faces, 1.1, 2, 0 | cv::CASCADE_SCALE_IMAGE, cv::Size(30, 30)); for (int i = 0; i < faces.size(); i++) { // 用橢圓畫出蘋果部分 cv::Point center(faces[i].x + faces[i].width / 2, faces[i].y + faces[i].height / 2); ellipse(frame, center, cv::Size(faces[i].width / 2, faces[i].height / 2), 0, 0, 360, cv::Scalar(255, 0, 255), 4, 8, 0); cv::Mat faceROI = frame(faces[i]); std::vector<cv::Rect> eyes; // 蘋果上方區(qū)域?qū)懽诌M(jìn)行標(biāo)識(shí) cv::Point centerText(faces[i].x + faces[i].width / 2 - 40, faces[i].y - 20); cv::putText(frame, "apple", centerText, cv::FONT_HERSHEY_SIMPLEX, 1, cv::Scalar(0, 0, 255), 2); } }
CMakeLists
cmake_minimum_required (VERSION 3.5) project (faceRecongize2015) MESSAGE(STATUS "PROJECT_SOURCE_DIR " ${PROJECT_SOURCE_DIR}) SET(SRC_LISTS ${PROJECT_SOURCE_DIR}/src/main.cpp) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") #set(CMAKE_AUTOMOC ON) #set(CMAKE_AUTOUIC ON) #set(CMAKE_AUTORCC ON) # 配置頭文件目錄 include_directories(${PROJECT_SOURCE_DIR}/src) include_directories("D:\\opencv3.4.12\\opencv\\build\\include") include_directories("D:\\opencv3.4.12\\opencv\\build\\include\\opencv2") # 設(shè)置不顯示命令框 if(MSVC) #set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup") endif() # 添加庫文件 set(PRO_OPENCV_LIB "D:\\opencv3.4.12\\opencv\\build\\x64\\vc15\\lib\\opencv_world3412.lib" "D:\\opencv3.4.12\\opencv\\build\\x64\\vc15\\lib\\opencv_world3412d.lib") IF(WIN32) # 生成可執(zhí)行程序 ADD_EXECUTABLE(faceRecongize2015 ${SRC_LISTS}) # 鏈接庫文件 TARGET_LINK_LIBRARIES(faceRecongize2015 ${PRO_OPENCV_LIB}) ENDIF()
6.編譯說明
我的opencv 3.4.12的安裝路徑是 D:\opencv3.4.12
目錄結(jié)構(gòu)
- src - mian.cpp - build_x64 - CMakeLists
編譯命令, 在build_x64目錄下執(zhí)行
cmake -G "Visual Studio 14 2015 Win64" .. cmake --build ./ --config Release
編譯完成后拷貝D:\opencv3.4.12\opencv\build\x64\vc15\bin目錄下的opencv_world3412.dll和opencv_world3412d.dll到可執(zhí)行程序目錄下。
備注
經(jīng)過測試,自己訓(xùn)練的樣本,準(zhǔn)確度還是比較差的??赡苁钦龢颖緮?shù)據(jù)太少,且圖片背景占據(jù)位置較多。要提高準(zhǔn)確度,首先增加正樣本圖片數(shù)量,還要就是盡量讓你的目標(biāo)物體占滿整個(gè)圖片,不要留有太多的背景。而且也要有盡可能多的負(fù)樣本數(shù)據(jù)。
總結(jié)
到此這篇關(guān)于如何利用opencv訓(xùn)練自己的模型實(shí)現(xiàn)特定物體的識(shí)別的文章就介紹到這了,更多相關(guān)opencv實(shí)現(xiàn)特定物體的識(shí)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python使用pyecharts繪制世界地圖,省級地圖,城市地圖實(shí)例詳解
這篇文章主要介紹了如何使用Python中的pyecharts庫繪制世界地圖、中國地圖、省級地圖、市級地圖,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起動(dòng)手試一試2022-02-02基于Python實(shí)現(xiàn)PDF區(qū)域文本提取工具
這篇文章主要為大家介紹了如何通過Python實(shí)現(xiàn)一個(gè)非常精簡的圖像化的PDF區(qū)域選擇提取工具,文中示例代碼講解詳細(xì),感興趣的小伙伴可以學(xué)習(xí)一下2021-12-12如何基于Django實(shí)現(xiàn)上下文章跳轉(zhuǎn)
這篇文章主要介紹了如何基于Django實(shí)現(xiàn)上下文章跳轉(zhuǎn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09pytorch 實(shí)現(xiàn)tensor與numpy數(shù)組轉(zhuǎn)換
今天小編就為大家分享一篇使用pytorch 實(shí)現(xiàn)tensor與numpy數(shù)組轉(zhuǎn)換,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12Python selenium頁面加載慢超時(shí)的解決方案
這篇文章主要介紹了Python selenium頁面加載慢超時(shí)的解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03Python使用Pandas庫實(shí)現(xiàn)MySQL數(shù)據(jù)庫的讀寫
這篇文章主要介紹了Python使用Pandas庫實(shí)現(xiàn)MySQL數(shù)據(jù)庫的讀寫 ,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07Python英文文章詞頻統(tǒng)計(jì)(14份劍橋真題詞頻統(tǒng)計(jì))
這篇文章主要介紹了Python英文文章詞頻統(tǒng)計(jì)(14份劍橋真題詞頻統(tǒng)計(jì)),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10Python?PaddleGAN實(shí)現(xiàn)照片人物性別反轉(zhuǎn)
PaddleGAN中的styleganv2editing.py是支持性別編輯的。所以本文將介紹如何通過調(diào)整參數(shù),來試著實(shí)現(xiàn)一下照片的性別翻轉(zhuǎn)。感興趣的小伙伴可以學(xué)習(xí)一下2021-12-12