日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Opencv 特征训练分类器

發(fā)布時(shí)間:2024/3/12 编程问答 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Opencv 特征训练分类器 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、基礎(chǔ)知識準(zhǔn)備

首先,opencv目前僅支持三種特征的訓(xùn)練檢測, HAAR、LBP、HOG,選擇哪個(gè)特征就去補(bǔ)充哪個(gè)吧。opencv的這個(gè)訓(xùn)練算法是基于adaboost而來的,所以需要先對adaboost進(jìn)行基礎(chǔ)知識補(bǔ)充啊,網(wǎng)上一大堆資料,同志們速度去查閱。我的資源里也有,大家去下載吧,這些我想都不是大家能直接拿來用的,我下面將直接手把手告訴大家訓(xùn)練怎么操作,以及要注意哪些細(xì)節(jié)。


二、關(guān)于正樣本的準(zhǔn)備

1、采集正樣本圖片

因?yàn)檎龢颖咀詈笮枰笮w一化,所以我在采集樣本的時(shí)候就直接把它從原圖里摳出來了,方便后面縮放嘛,而不是只保存它的框個(gè)數(shù)和框位置信息(框個(gè)數(shù)、框位置信息看下一步解釋),在裁剪的過程中盡量保持樣本的長寬比例一致。比如我最后要?dú)w一化成20 X 20,在裁剪樣本的時(shí)候,我都是20X20或者21X21、22X22等等,最大我也沒有超過30X30(不超過跟我的自身用途有關(guān),對于人臉檢測這種要保證縮放不變性的樣本,肯定就可以超過啦),我資源里也給出可以直接用的裁剪樣本程序。

(這里我說錯(cuò)了,根據(jù)createsamples.cpp ,我們不需要提前進(jìn)行縮放操作,它在第3步變成vec時(shí)就包含了縮放工作.如果我們是用objectMaker標(biāo)記樣本,程序同時(shí)生成的關(guān)于每一幅圖的samplesInfo信息,直接給第三步用即可。當(dāng)然,你提前縮放了也沒關(guān)系,按照第2步操作即可)

2、獲取正樣本路徑列表

在你的圖片文件夾里,編寫一個(gè)bat程序(get route.bat,bat是避免每次都需要去dos框輸入,那里又不能復(fù)制又不能粘貼!),如下所示:








運(yùn)行bat文件,就會生成如下dat文件:


把這個(gè)dat文件中的所有非圖片的路徑都刪掉,比如上圖的頭兩行,再將bmp 替換成 bmp 1 0 0 20 20,如下:


(1代表個(gè)數(shù),后四個(gè)分別對應(yīng) left top width height,如果我們之前不是把樣本裁剪下來的,那么你的這個(gè)dat可能就長成這樣1. bmp 3 1 3 24 24 26 28 25 25 60 80 26 26,1.bmp是完全的原圖啊,你之前的樣本就是從這張圖上扣下來的)

3、獲取供訓(xùn)練的vec文件

這里,我們得利用opencv里的一個(gè)程序叫opencv_createsamples.exe,可以把它拷貝出來。針對它的命令輸入也是寫成bat文件啦,因?yàn)閏ascade訓(xùn)練的時(shí)候用的是vec。如下:


運(yùn)行bat,就在我們得pos文件夾里生成了如下vec文件:

就此有關(guān)正樣本的東西準(zhǔn)備結(jié)束。

(vec中其實(shí)就是保存的每一個(gè)sample圖,并且已經(jīng)統(tǒng)一w、h大小了,如果你想看所有的sample,也可以通過調(diào)用opencv_createsamples.exe,使用操作,見附)


三、關(guān)于負(fù)樣本的準(zhǔn)備

這個(gè)特別簡單,直接拿原始圖,不需要裁剪摳圖(不裁剪還能保證樣本的多樣性),也不需要保存框(網(wǎng)上說只要保證比正樣本大小大哈,大家就保證吧),只要把路徑保存下來。同正樣本類似,步驟圖如下:



至此有關(guān)負(fù)樣本的也準(zhǔn)備完成。


四、開始訓(xùn)練吧

這里我們用opencv_traincascade.exe(opencv_haartraining.exe的用法跟這個(gè)很相似,具體需要輸入哪些參數(shù)去看opencv的源碼吧,網(wǎng)上資料也有很多,主要是opencv_traincascade.exe比opencv_haartraining.exe包含更多的特征,功能齊全些啊),直接上圖:


命令輸入也直接用bat文件,請務(wù)必保證好大小寫一致,不然不予識別參數(shù)。小白兔,跑起來~~~


這是程序識別到的參數(shù),沒有錯(cuò)把,如果你哪個(gè)字母打錯(cuò)了,你就會發(fā)現(xiàn)這些參數(shù)會跟你預(yù)設(shè)的不一樣啊,所以大家一定要看清楚了~~~~

跑啊跑啊跑啊跑,如下:


這一級的強(qiáng)訓(xùn)練器達(dá)到你預(yù)設(shè)的比例以后就跑去訓(xùn)練下一級了,同志們那個(gè)HR比例不要設(shè)置太高,不然會需要好多樣本,然后stagenum不要設(shè)置太小啊,不然到時(shí)候拿去檢測速度會很慢。

等這個(gè)bat跑結(jié)束,我的xml文件也生成了。如下:


其實(shí)這個(gè)訓(xùn)練可以中途停止的,因?yàn)橄麓伍_啟時(shí)它會讀取這些xml文件,接著進(jìn)行上次未完成的訓(xùn)練。哈哈~~~~好人性化啊!

訓(xùn)練結(jié)束,我要到了我的cascade.xml文件,現(xiàn)在我要拿它去做檢測了啊!呼呼~~~~


五、開始檢測吧

opencv有個(gè)opencv_performance.exe程序用于檢測,但是它只能用在用opencv_haartraining.exe來用的,所以我這里是針對一些列圖片進(jìn)行檢測的,檢測代碼如下:

[cpp] view plaincopyprint?
  • #include?<windows.h>??
  • #include?<mmsystem.h>??
  • #include?<stdio.h>??
  • #include?<stdlib.h>??
  • #include?“wininet.h”??
  • #include?<direct.h>??
  • #include?<string.h>??
  • #include?<list>??
  • #pragma?comment(lib,”Wininet.lib”)??
  • ??
  • ??
  • #include?“opencv2/objdetect/objdetect.hpp”??
  • #include?“opencv2/highgui/highgui.hpp”??
  • #include?“opencv2/imgproc/imgproc.hpp”??
  • #include?“opencv2/ml/ml.hpp”??
  • ??
  • #include?<iostream>??
  • #include?<stdio.h>??
  • ??
  • using?namespace?std;??
  • using?namespace?cv;??
  • ??
  • String?cascadeName?=?”./cascade.xml”;//訓(xùn)練數(shù)據(jù)??
  • ??
  • struct?PathElem{??
  • ????TCHAR???SrcImgPath[MAX_PATH*2];??
  • ????TCHAR???RstImgPath[MAX_PATH*2];??
  • };??
  • int?FindImgs(char??pSrcImgPath,?char??pRstImgPath,?std::list<PathElem>?&ImgList);??
  • ??
  • int?main(?)??
  • {??
  • ????CascadeClassifier?cascade;//創(chuàng)建級聯(lián)分類器對象??
  • ????std::list<PathElem>?ImgList;???
  • ????std::list<PathElem>::iterator?pImgListTemp;???
  • ????vector<Rect>?rects;??
  • ????vector<Rect>::const_iterator?pRect;??
  • ??
  • ????double?scale?=?1.;??
  • ????Mat?image;??
  • ????double?t;??
  • ????if(?!cascade.load(?cascadeName?)?)//從指定的文件目錄中加載級聯(lián)分類器??
  • ????{??
  • ????????cerr?<<?”ERROR:?Could?not?load?classifier?cascade”?<<?endl;??
  • ????????return?0;??
  • ????}??
  • ??
  • ??????
  • ????int?nFlag?=?FindImgs(“H:/SrcPic/”,“H:/RstPic/”,?ImgList);?????????
  • ????if(nFlag?!=?0)?????
  • ????{??
  • ????????cout<<”Read?Image??error?!??Input?0?to?exit?\n”;??
  • ????????exit(0);??
  • ????}??
  • ??
  • ????pImgListTemp?=?ImgList.begin();??
  • ????for(int?iik?=?1;?iik?<=?ImgList.size();?iik++,pImgListTemp++)??
  • ????{??
  • ????????image?=?imread(pImgListTemp->SrcImgPath);??????
  • ????????if(?!image.empty()?)//讀取圖片數(shù)據(jù)不能為空??
  • ????????{??
  • ????????????Mat?gray,?smallImg(?cvRound?(image.rows/scale),?cvRound(image.cols/scale),?CV_8UC1?);//將圖片縮小,加快檢測速度??
  • ????????????cvtColor(?image,?gray,?CV_BGR2GRAY?);//因?yàn)橛玫氖穷恏aar特征,所以都是基于灰度圖像的,這里要轉(zhuǎn)換成灰度圖像??
  • ????????????resize(?gray,?smallImg,?smallImg.size(),?0,?0,?INTER_LINEAR?);//將尺寸縮小到1/scale,用線性插值??
  • ????????????equalizeHist(?smallImg,?smallImg?);//直方圖均衡??
  • ??
  • ????????????//detectMultiScale函數(shù)中smallImg表示的是要檢測的輸入圖像為smallImg,rects表示檢測到的目標(biāo)序列,1.1表示??
  • ????????????//每次圖像尺寸減小的比例為1.1,2表示每一個(gè)目標(biāo)至少要被檢測到3次才算是真的目標(biāo)(因?yàn)橹車南袼睾筒煌拇翱诖?/span>??
  • ????????????//小都可以檢測到目標(biāo)),CV_HAAR_SCALE_IMAGE表示不是縮放分類器來檢測,而是縮放圖像,Size(30,?30)為目標(biāo)的??
  • ????????????//最小最大尺寸??
  • ????????????rects.clear();??
  • ????????????printf(?”begin…\n”);??
  • ????????????t?=?(double)cvGetTickCount();//用來計(jì)算算法執(zhí)行時(shí)間??
  • ????????????cascade.detectMultiScale(smallImg,rects,1.1,2,0,Size(20,20),Size(30,30));??
  • ????????????//|CV_HAAR_FIND_BIGGEST_OBJECT//|CV_HAAR_DO_ROUGH_SEARCH|CV_HAAR_SCALE_IMAGE,??
  • ??
  • ????????????t?=?(double)cvGetTickCount()?-?t;??
  • ????????????printf(?”detection?time?=?%g?ms\n\n”,?t/((double)cvGetTickFrequency()1000.)?);??
  • ????????????for(pRect?=?rects.begin();?pRect?!=?rects.end();?pRect++)??
  • ????????????{??
  • ????????????????rectangle(image,cvPoint(pRect->x,pRect->y),cvPoint(pRect->x+pRect->width,pRect->y+pRect->height),cvScalar(0,255,0));??
  • ????????????}??
  • ????????????imwrite(pImgListTemp->RstImgPath,image);??
  • ????????}??
  • ????}??
  • ??????
  • ????return?0;??
  • }??
  • ??
  • int?FindImgs(char??pSrcImgPath,?char??pRstImgPath,?std::list<PathElem>?&ImgList)??
  • {??
  • ????//源圖片存在的目錄??
  • ????TCHAR???szFileT1[MAX_PATH*2];??
  • ????lstrcpy(szFileT1,TEXT(pSrcImgPath));?????
  • ????lstrcat(szFileT1,?TEXT(”.*”));??
  • ??
  • ????//結(jié)果圖片存放的目錄??
  • ????TCHAR???RstAddr[MAX_PATH*2];???
  • ????lstrcpy(RstAddr,TEXT(pRstImgPath));??
  • ????_mkdir(RstAddr);???//創(chuàng)建文件夾??
  • ??
  • ????WIN32_FIND_DATA???wfd;????
  • ????HANDLE???hFind???=???FindFirstFile(szFileT1,?&wfd);???
  • ??
  • ??
  • ????PathElem?stPathElemTemp;??
  • ????if(hFind?!=?INVALID_HANDLE_VALUE)?????
  • ????{??
  • ????????do???
  • ????????{???
  • ????????????if(wfd.cFileName[0]?==?TEXT(‘.’))???
  • ????????????????continue;??
  • ????????????if(wfd.dwFileAttributes?&?FILE_ATTRIBUTE_DIRECTORY?||?strcmp(“Thumbs.db”,?TEXT(wfd.cFileName))?==?0)???
  • ????????????{???
  • ????????????????;??
  • ????????????}????
  • ????????????else???
  • ????????????{???
  • ??
  • ????????????????TCHAR???SrcImgPath[MAX_PATH*2];??
  • ????????????????lstrcpy(SrcImgPath,?pSrcImgPath);???
  • ????????????????lstrcat(SrcImgPath,?TEXT(wfd.cFileName));??
  • ??
  • ????????????????lstrcpy(stPathElemTemp.SrcImgPath,?SrcImgPath);???
  • ??
  • ????????????????TCHAR???AdressTemp[MAX_PATH*2];??
  • ????????????????lstrcpy(AdressTemp,pRstImgPath);???
  • ??
  • ????????????????//lstrcat(AdressTemp,?TEXT(“/”));????
  • ????????????????lstrcat(AdressTemp,?TEXT(wfd.cFileName));????
  • ????????????????lstrcpy(stPathElemTemp.RstImgPath,?AdressTemp);???
  • ??
  • ????????????????ImgList.push_back(stPathElemTemp);??
  • ??
  • ????????????}??
  • ????????}while(FindNextFile(hFind,?&wfd));??
  • ????}??
  • ????else??
  • ????{??
  • ????????return?-1;??
  • ????}??
  • ????return?0;??
  • }??
  • #include <windows.h>

    #include <mmsystem.h> #include <stdio.h> #include <stdlib.h> #include "wininet.h" #include <direct.h> #include <string.h> #include <list> #pragma comment(lib,"Wininet.lib") #include "opencv2/objdetect/objdetect.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/ml/ml.hpp" #include <iostream> #include <stdio.h> using namespace std; using namespace cv; String cascadeName = "./cascade.xml";//訓(xùn)練數(shù)據(jù) struct PathElem{ TCHAR SrcImgPath[MAX_PATH*2]; TCHAR RstImgPath[MAX_PATH*2]; }; int FindImgs(char * pSrcImgPath, char * pRstImgPath, std::list<PathElem> &ImgList); int main( ) { CascadeClassifier cascade;//創(chuàng)建級聯(lián)分類器對象 std::list<PathElem> ImgList; std::list<PathElem>::iterator pImgListTemp; vector<Rect> rects; vector<Rect>::const_iterator pRect; double scale = 1.; Mat image; double t; if( !cascade.load( cascadeName ) )//從指定的文件目錄中加載級聯(lián)分類器 { cerr << "ERROR: Could not load classifier cascade" << endl; return 0; } int nFlag = FindImgs("H:/SrcPic/","H:/RstPic/", ImgList); if(nFlag != 0) { cout<<"Read Image error ! Input 0 to exit \n"; exit(0); } pImgListTemp = ImgList.begin(); for(int iik = 1; iik <= ImgList.size(); iik++,pImgListTemp++) { image = imread(pImgListTemp->SrcImgPath); if( !image.empty() )//讀取圖片數(shù)據(jù)不能為空 { Mat gray, smallImg( cvRound (image.rows/scale), cvRound(image.cols/scale), CV_8UC1 );//將圖片縮小,加快檢測速度 cvtColor( image, gray, CV_BGR2GRAY );//因?yàn)橛玫氖穷恏aar特征,所以都是基于灰度圖像的,這里要轉(zhuǎn)換成灰度圖像 resize( gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR );//將尺寸縮小到1/scale,用線性插值 equalizeHist( smallImg, smallImg );//直方圖均衡 //detectMultiScale函數(shù)中smallImg表示的是要檢測的輸入圖像為smallImg,rects表示檢測到的目標(biāo)序列,1.1表示 //每次圖像尺寸減小的比例為1.1,2表示每一個(gè)目標(biāo)至少要被檢測到3次才算是真的目標(biāo)(因?yàn)橹車南袼睾筒煌拇翱诖?//小都可以檢測到目標(biāo)),CV_HAAR_SCALE_IMAGE表示不是縮放分類器來檢測,而是縮放圖像,Size(30, 30)為目標(biāo)的 //最小最大尺寸 rects.clear(); printf( "begin...\n"); t = (double)cvGetTickCount();//用來計(jì)算算法執(zhí)行時(shí)間 cascade.detectMultiScale(smallImg,rects,1.1,2,0,Size(20,20),Size(30,30)); //|CV_HAAR_FIND_BIGGEST_OBJECT//|CV_HAAR_DO_ROUGH_SEARCH|CV_HAAR_SCALE_IMAGE, t = (double)cvGetTickCount() - t; printf( "detection time = %g ms\n\n", t/((double)cvGetTickFrequency()*1000.) ); for(pRect = rects.begin(); pRect != rects.end(); pRect++) { rectangle(image,cvPoint(pRect->x,pRect->y),cvPoint(pRect->x+pRect->width,pRect->y+pRect->height),cvScalar(0,255,0)); } imwrite(pImgListTemp->RstImgPath,image); } } return 0; } int FindImgs(char * pSrcImgPath, char * pRstImgPath, std::list<PathElem> &ImgList) { //源圖片存在的目錄 TCHAR szFileT1[MAX_PATH*2]; lstrcpy(szFileT1,TEXT(pSrcImgPath)); lstrcat(szFileT1, TEXT("*.*")); //結(jié)果圖片存放的目錄 TCHAR RstAddr[MAX_PATH*2]; lstrcpy(RstAddr,TEXT(pRstImgPath)); _mkdir(RstAddr); //創(chuàng)建文件夾 WIN32_FIND_DATA wfd; HANDLE hFind = FindFirstFile(szFileT1, &wfd); PathElem stPathElemTemp; if(hFind != INVALID_HANDLE_VALUE) { do { if(wfd.cFileName[0] == TEXT('.')) continue; if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY || strcmp("Thumbs.db", TEXT(wfd.cFileName)) == 0) { ; } else { TCHAR SrcImgPath[MAX_PATH*2]; lstrcpy(SrcImgPath, pSrcImgPath); lstrcat(SrcImgPath, TEXT(wfd.cFileName)); lstrcpy(stPathElemTemp.SrcImgPath, SrcImgPath); TCHAR AdressTemp[MAX_PATH*2]; lstrcpy(AdressTemp,pRstImgPath); //lstrcat(AdressTemp, TEXT("/")); lstrcat(AdressTemp, TEXT(wfd.cFileName)); lstrcpy(stPathElemTemp.RstImgPath, AdressTemp); ImgList.push_back(stPathElemTemp); } }while(FindNextFile(hFind, &wfd)); } else { return -1; } return 0; }

    自己看看自己的檢測結(jié)果咯。效果不好的改進(jìn)樣本,調(diào)整訓(xùn)練參數(shù)吧~~~嘎嘎


    我覺得我寫的夠白癡,很方便大家直接拿來用。其中一些細(xì)節(jié),大家自己琢磨吧~88



    附:

    1、opencv_createsamples.exe的參數(shù)

    (createsamples.cpp)

    [cpp] view plaincopyprint?
  • ”??[-info?<collection_file_name>]\n”??
  • ”??[-img?<image_file_name>]\n”??
  • ”??[-vec?<vec_file_name>]\n”??
  • ”??[-bg?<background_file_name>]\n??[-num?<number_of_samples?=?%d>]\n”??
  • ”??[-bgcolor?<background_color?=?%d>]\n”??
  • ”??[-inv]?[-randinv]?[-bgthresh?<background_color_threshold?=?%d>]\n”??
  • ”??[-maxidev?<max_intensity_deviation?=?%d>]\n”??
  • ”??[-maxxangle?<max_x_rotation_angle?=?%f>]\n”??
  • ”??[-maxyangle?<max_y_rotation_angle?=?%f>]\n”??
  • ”??[-maxzangle?<max_z_rotation_angle?=?%f>]\n”??
  • ”??[-show?[<scale?=?%f>]]\n”??
  • ”??[-w?<sample_width?=?%d>]\n??[-h?<sample_height?=?%d>]\n”//默認(rèn)24*24??
  • " [-info <collection_file_name>]\n"" [-img <image_file_name>]\n"" [-vec <vec_file_name>]\n"" [-bg <background_file_name>]\n [-num <number_of_samples = %d>]\n"" [-bgcolor <background_color = %d>]\n"" [-inv] [-randinv] [-bgthresh <background_color_threshold = %d>]\n"" [-maxidev <max_intensity_deviation = %d>]\n"" [-maxxangle <max_x_rotation_angle = %f>]\n"" [-maxyangle <max_y_rotation_angle = %f>]\n"" [-maxzangle <max_z_rotation_angle = %f>]\n"" [-show [<scale = %f>]]\n"" [-w <sample_width = %d>]\n [-h <sample_height = %d>]\n"//默認(rèn)24*24

    以下1)~4)是按順序判斷,且有且僅有一個(gè)

    1)提供imagename 和vecname時(shí),調(diào)用以下操作
    [cpp] view plaincopyprint?
  • /*?
  • ?*?cvCreateTrainingSamples?
  • ?*?
  • ?*?Create?training?samples?applying?random?distortions?to?sample?image?and?
  • ?*?store?them?in?.vec?file?
  • ?*?
  • ?*?filename????????-?.vec?file?name?
  • ?*?imgfilename?????-?sample?image?file?name?
  • ?*?bgcolor?????????-?background?color?for?sample?image?
  • ?*?bgthreshold?????-?background?color?threshold.?Pixels?those?colors?are?in?range?
  • ?*???[bgcolor-bgthreshold,?bgcolor+bgthreshold]?are?considered?as?transparent?
  • ?*?bgfilename??????-?background?description?file?name.?If?not?NULL?samples?
  • ?*???will?be?put?on?arbitrary?background?
  • ?*?count???????????-?desired?number?of?samples?
  • ?*?invert??????????-?if?not?0?sample?foreground?pixels?will?be?inverted?
  • ?*???if?invert?==?CV_RANDOM_INVERT?then?samples?will?be?inverted?randomly?
  • ?*?maxintensitydev?-?desired?max?intensity?deviation?of?foreground?samples?pixels?
  • ?*?maxxangle???????-?max?rotation?angles?
  • ?*?maxyangle?
  • ?*?maxzangle?
  • ?*?showsamples?????-?if?not?0?samples?will?be?shown?
  • ?*?winwidth????????-?desired?samples?width?
  • ?*?winheight???????-?desired?samples?height?
  • ?*/??
  • /** cvCreateTrainingSamples** Create training samples applying random distortions to sample image and* store them in .vec file** filename - .vec file name* imgfilename - sample image file name* bgcolor - background color for sample image* bgthreshold - background color threshold. Pixels those colors are in range* [bgcolor-bgthreshold, bgcolor+bgthreshold] are considered as transparent* bgfilename - background description file name. If not NULL samples* will be put on arbitrary background* count - desired number of samples* invert - if not 0 sample foreground pixels will be inverted* if invert == CV_RANDOM_INVERT then samples will be inverted randomly* maxintensitydev - desired max intensity deviation of foreground samples pixels* maxxangle - max rotation angles* maxyangle* maxzangle* showsamples - if not 0 samples will be shown* winwidth - desired samples width* winheight - desired samples height*/2)提供imagename、bgfilename和infoname時(shí)
    與1)類似
    3)提供 infoname和 vecname時(shí),調(diào)用以下操作 (這里是我們訓(xùn)練需要的)
    [cpp] view plaincopyprint?
  • /*?
  • ?*?cvCreateTrainingSamplesFromInfo?
  • ?*?
  • ?*?Create?training?samples?from?a?set?of?marked?up?images?and?store?them?into?.vec?file?
  • ?*?infoname????-?file?in?which?marked?up?image?descriptions?are?stored?
  • ?*?num?????????-?desired?number?of?samples?
  • ?*?showsamples?-?if?not?0?samples?will?be?shown?
  • ?*?winwidth????-?sample?width?
  • ?*?winheight???-?sample?height?
  • ?*??
  • ?*?Return?number?of?successfully?created?samples?
  • ?*/??
  • int?cvCreateTrainingSamplesFromInfo(?const?char*?infoname,?const?char*?vecfilename,??
  • ?????????????????????????????????????int?num,??
  • ?????????????????????????????????????int?showsamples,??
  • ?????????????????????????????????????int?winwidth,?int?winheight?)??
  • /** cvCreateTrainingSamplesFromInfo** Create training samples from a set of marked up images and store them into .vec file* infoname - file in which marked up image descriptions are stored* num - desired number of samples* showsamples - if not 0 samples will be shown* winwidth - sample width* winheight - sample height* * Return number of successfully created samples*/ int cvCreateTrainingSamplesFromInfo( const char* infoname, const char* vecfilename,int num,int showsamples,int winwidth, int winheight )

    函數(shù)內(nèi)容:讀取當(dāng)前圖中所有標(biāo)記的sample(x,y,w,h),并將其縮放到winwidth、winheight大小,故在這之前的人為縮放操作不需要

    (可以看到,僅需要num、w、h參數(shù))
    4)僅vecname時(shí),可以將vec里面的所有縮放后的samples都顯示出來
    [cpp] view plaincopyprint?
  • /*?
  • ?*?cvShowVecSamples?
  • ?*?
  • ?*?Shows?samples?stored?in?.vec?file?
  • ?*?
  • ?*?filename?
  • ?*???.vec?file?name?
  • ?*?winwidth?
  • ?*???sample?width?
  • ?*?winheight?
  • ?*???sample?height?
  • ?*?scale?
  • ?*???the?scale?each?sample?is?adjusted?to(這個(gè)scale與3中的縮放不是一回事,這里僅為了顯示而再次縮放)?
  • ?*/??
  • void?cvShowVecSamples(?const?char*?filename,?int?winwidth,?int?winheight,?double?scale?);??
  • /** cvShowVecSamples** Shows samples stored in .vec file** filename* .vec file name* winwidth* sample width* winheight* sample height* scale* the scale each sample is adjusted to(這個(gè)scale與3中的縮放不是一回事,這里僅為了顯示而再次縮放)*/ void cvShowVecSamples( const char* filename, int winwidth, int winheight, double scale );

    2、opencv_haartraining.exe的參數(shù)

    (haartraining.cpp?)

    [cpp] view plaincopyprint?
  • ”??-data?<dir_name>\n”??
  • ”??-vec?<vec_file_name>\n”??
  • ”??-bg?<background_file_name>\n”??
  • ”??[-bg-vecfile]\n”??
  • ”??[-npos?<number_of_positive_samples?=?%d>]\n”??
  • ”??[-nneg?<number_of_negative_samples?=?%d>]\n”??
  • ”??[-nstages?<number_of_stages?=?%d>]\n”??
  • ”??[-nsplits?<number_of_splits?=?%d>]\n”??
  • ”??[-mem?<memory_in_MB?=?%d>]\n”??
  • ”??[-sym?(default)]?[-nonsym]\n”??
  • ”??[-minhitrate?<min_hit_rate?=?%f>]\n”??
  • ”??[-maxfalsealarm?<max_false_alarm_rate?=?%f>]\n”??
  • ”??[-weighttrimming?<weight_trimming?=?%f>]\n”??
  • ”??[-eqw]\n”??
  • ”??[-mode?<BASIC?(default)?|?CORE?|?ALL>]\n”??
  • ”??[-w?<sample_width?=?%d>]\n”??
  • ”??[-h?<sample_height?=?%d>]\n”??
  • ”??[-bt?<DAB?|?RAB?|?LB?|?GAB?(default)>]\n”??
  • ”??[-err?<misclass?(default)?|?gini?|?entropy>]\n”??
  • ”??[-maxtreesplits?<max_number_of_splits_in_tree_cascade?=?%d>]\n”??
  • ”??[-minpos?<min_number_of_positive_samples_per_cluster?=?%d>]\n”??
  • " -data <dir_name>\n" " -vec <vec_file_name>\n" " -bg <background_file_name>\n" " [-bg-vecfile]\n" " [-npos <number_of_positive_samples = %d>]\n" " [-nneg <number_of_negative_samples = %d>]\n" " [-nstages <number_of_stages = %d>]\n" " [-nsplits <number_of_splits = %d>]\n" " [-mem <memory_in_MB = %d>]\n" " [-sym (default)] [-nonsym]\n" " [-minhitrate <min_hit_rate = %f>]\n" " [-maxfalsealarm <max_false_alarm_rate = %f>]\n" " [-weighttrimming <weight_trimming = %f>]\n" " [-eqw]\n" " [-mode <BASIC (default) | CORE | ALL>]\n" " [-w <sample_width = %d>]\n" " [-h <sample_height = %d>]\n" " [-bt <DAB | RAB | LB | GAB (default)>]\n" " [-err <misclass (default) | gini | entropy>]\n" " [-maxtreesplits <max_number_of_splits_in_tree_cascade = %d>]\n" " [-minpos <min_number_of_positive_samples_per_cluster = %d>]\n"

    3、opencv_performance.exe參數(shù)

    (performance.cpp?)

    [cpp] view plaincopyprint?
  • ”??-data?<classifier_directory_name>\n”??
  • ”??-info?<collection_file_name>\n”??
  • ”??[-maxSizeDiff?<max_size_difference?=?%f>]\n”??
  • ”??[-maxPosDiff?<max_position_difference?=?%f>]\n”??
  • ”??[-sf?<scale_factor?=?%f>]\n”??
  • ”??[-ni?<saveDetected?=?0>]\n”??
  • ”??[-nos?<number_of_stages?=?%d>]\n”??
  • ”??[-rs?<roc_size?=?%d>]\n”??
  • ”??[-w?<sample_width?=?%d>]\n”??
  • ”??[-h?<sample_height?=?%d>]\n”??
  • " -data <classifier_directory_name>\n" " -info <collection_file_name>\n" " [-maxSizeDiff <max_size_difference = %f>]\n" " [-maxPosDiff <max_position_difference = %f>]\n" " [-sf <scale_factor = %f>]\n" " [-ni <saveDetected = 0>]\n" " [-nos <number_of_stages = %d>]\n" " [-rs <roc_size = %d>]\n" " [-w <sample_width = %d>]\n" " [-h <sample_height = %d>]\n"


    4、opencv_traincascade.exe參數(shù)說明

    ——traincascade.cpp?

    [cpp] view plaincopyprint?
  • ?cout?<<?“Usage:?”?<<?argv[0]?<<?endl;??
  • ?cout?<<?”??-data?<cascade_dir_name>”?<<?endl;??
  • ?cout?<<?”??-vec?<vec_file_name>”?<<?endl;??
  • ?cout?<<?”??-bg?<background_file_name>”?<<?endl;??
  • ?cout?<<?”??[-numPos?<number_of_positive_samples?=?”?<<?numPos?<<?“>]”?<<?endl;???//默認(rèn)2000??
  • ?cout?<<?”??[-numNeg?<number_of_negative_samples?=?”?<<?numNeg?<<?“>]”?<<?endl;???//默認(rèn)1000??
  • ?cout?<<?”??[-numStages?<number_of_stages?=?”?<<?numStages?<<?“>]”?<<?endl;???//默認(rèn)20??
  • ?cout?<<?”??[-precalcValBufSize?<precalculated_vals_buffer_size_in_Mb?=?”?<<?precalcValBufSize?<<?“>]”?<<?endl;//默認(rèn)256??
  • ?cout?<<?”??[-precalcIdxBufSize?<precalculated_idxs_buffer_size_in_Mb?=?”?<<?precalcIdxBufSize?<<?“>]”?<<?endl;//默認(rèn)256??
  • ?cout?<<?”??[-baseFormatSave]”?<<?endl;?????????????????????//是否按照舊版存xml文件默認(rèn)false??
  • //?cout?<<?”??[-numThreads?<max_number_of_threads?=?”?<<?numThreads?<<?”>]”?<<?endl;//這個(gè)參數(shù)在3.0版本中才出現(xiàn),默認(rèn)numThreads?=?getNumThreads();??
  • //?cout?<<?”??[-acceptanceRatioBreakValue?<value>?=?”?<<?acceptanceRatioBreakValue?<<?”>]”?<<?endl;//這個(gè)參數(shù)在3.0版本中才出現(xiàn),默認(rèn)-1.0??
  • ?cascadeParams.printDefaults();??
  • ?stageParams.printDefaults();??
  • ?for(?int?fi?=?0;?fi?<?fc;?fi++?)??
  • ?????featureParams[fi]->printDefaults();??
  • cout << "Usage: " << argv[0] << endl;cout << " -data <cascade_dir_name>" << endl;cout << " -vec <vec_file_name>" << endl;cout << " -bg <background_file_name>" << endl;cout << " [-numPos <number_of_positive_samples = " << numPos << ">]" << endl; //默認(rèn)2000cout << " [-numNeg <number_of_negative_samples = " << numNeg << ">]" << endl; //默認(rèn)1000cout << " [-numStages <number_of_stages = " << numStages << ">]" << endl; //默認(rèn)20cout << " [-precalcValBufSize <precalculated_vals_buffer_size_in_Mb = " << precalcValBufSize << ">]" << endl;//默認(rèn)256cout << " [-precalcIdxBufSize <precalculated_idxs_buffer_size_in_Mb = " << precalcIdxBufSize << ">]" << endl;//默認(rèn)256cout << " [-baseFormatSave]" << endl; //是否按照舊版存xml文件默認(rèn)false// cout << " [-numThreads <max_number_of_threads = " << numThreads << ">]" << endl;//這個(gè)參數(shù)在3.0版本中才出現(xiàn),默認(rèn)numThreads = getNumThreads();// cout << " [-acceptanceRatioBreakValue <value> = " << acceptanceRatioBreakValue << ">]" << endl;//這個(gè)參數(shù)在3.0版本中才出現(xiàn),默認(rèn)-1.0cascadeParams.printDefaults();stageParams.printDefaults();for( int fi = 0; fi < fc; fi++ )featureParams[fi]->printDefaults();

    其中cascadeParams.printDefaults();——cascadeclassifier.cpp?如下

    [cpp] view plaincopyprint?
  • cout?<<?“??[-stageType?<”;?????????????????????????????????????????????????//默認(rèn)BOOST??
  • for(?int?i?=?0;?i?<?(int)(sizeof(stageTypes)/sizeof(stageTypes[0]));?i++?)??
  • {??
  • ????cout?<<?(i???”?|?”?:?“”)?<<?stageTypes[i];??
  • ????if?(?i?==?defaultStageType?)??
  • ????????cout?<<?”(default)”;??
  • }??
  • cout?<<?”>]”?<<?endl;??
  • ??
  • cout?<<?”??[-featureType?<{“;??????????????????????????????????????????????//默認(rèn)HAAR??
  • for(?int?i?=?0;?i?<?(int)(sizeof(featureTypes)/sizeof(featureTypes[0]));?i++?)??
  • {??
  • ????cout?<<?(i???”,?”?:?“”)?<<?featureTypes[i];??
  • ????if?(?i?==?defaultStageType?)??
  • ????????cout?<<?”(default)”;??
  • }??
  • cout?<<?”}>]”?<<?endl;??
  • cout?<<?”??[-w?<sampleWidth?=?”?<<?winSize.width?<<?“>]”?<<?endl;????????//默認(rèn)24*24??
  • cout?<<?”??[-h?<sampleHeight?=?”?<<?winSize.height?<<?“>]”?<<?endl;??
  • cout << " [-stageType <"; //默認(rèn)BOOSTfor( int i = 0; i < (int)(sizeof(stageTypes)/sizeof(stageTypes[0])); i++ ){cout << (i ? " | " : "") << stageTypes[i];if ( i == defaultStageType )cout << "(default)";}cout << ">]" << endl;cout << " [-featureType <{"; //默認(rèn)HAARfor( int i = 0; i < (int)(sizeof(featureTypes)/sizeof(featureTypes[0])); i++ ){cout << (i ? ", " : "") << featureTypes[i];if ( i == defaultStageType )cout << "(default)";}cout << "}>]" << endl;cout << " [-w <sampleWidth = " << winSize.width << ">]" << endl; //默認(rèn)24*24cout << " [-h <sampleHeight = " << winSize.height << ">]" << endl;stageParams.printDefaults();——boost.cpp如下

    [cpp] view plaincopyprint?
  • cout?<<?“–boostParams–”?<<?endl;??
  • cout?<<?”??[-bt?<{“?<<?CC_DISCRETE_BOOST?<<?“,?”??
  • ????????????????????<<?CC_REAL_BOOST?<<?”,?”??
  • ????????????????????<<?CC_LOGIT_BOOST?”,?”??
  • ????????????????????<<?CC_GENTLE_BOOST?<<?”(default)}>]”?<<?endl;?????????????????????????//默認(rèn)CC_GENTLE_BOOST???
  • cout?<<?”??[-minHitRate?<min_hit_rate>?=?”?<<?minHitRate?<<?“>]”?<<?endl;?????????????????//默認(rèn)0.995??
  • cout?<<?”??[-maxFalseAlarmRate?<max_false_alarm_rate?=?”?<<?maxFalseAlarm?<<?“>]”?<<?endl;//默認(rèn)0.5??
  • cout?<<?”??[-weightTrimRate?<weight_trim_rate?=?”?<<?weight_trim_rate?<<?“>]”?<<?endl;????//默認(rèn)0.95??
  • cout?<<?”??[-maxDepth?<max_depth_of_weak_tree?=?”?<<?max_depth?<<?“>]”?<<?endl;???????????//默認(rèn)1??
  • cout?<<?”??[-maxWeakCount?<max_weak_tree_count?=?”?<<?weak_count?<<?“>]”?<<?endl;?????????//默認(rèn)100??
  • cout << "--boostParams--" << endl;cout << " [-bt <{" << CC_DISCRETE_BOOST << ", "<< CC_REAL_BOOST << ", "<< CC_LOGIT_BOOST ", "<< CC_GENTLE_BOOST << "(default)}>]" << endl; //默認(rèn)CC_GENTLE_BOOST cout << " [-minHitRate <min_hit_rate> = " << minHitRate << ">]" << endl; //默認(rèn)0.995cout << " [-maxFalseAlarmRate <max_false_alarm_rate = " << maxFalseAlarm << ">]" << endl;//默認(rèn)0.5cout << " [-weightTrimRate <weight_trim_rate = " << weight_trim_rate << ">]" << endl; //默認(rèn)0.95cout << " [-maxDepth <max_depth_of_weak_tree = " << max_depth << ">]" << endl; //默認(rèn)1cout << " [-maxWeakCount <max_weak_tree_count = " << weak_count << ">]" << endl; //默認(rèn)100featureParams[fi]->printDefaults();——haarfeatures.cpp 如下

    [cpp] view plaincopyprint?
  • cout?<<?“??[-mode?<”?CC_MODE_BASIC?<<?“(default)|?”??//默認(rèn)CC_MODE_BASIC??
  • ???????????<<?CC_MODE_CORE?<<”?|?”?<<?CC_MODE_ALL?<<?endl;??
  • cout << " [-mode <" CC_MODE_BASIC << "(default)| " //默認(rèn)CC_MODE_BASIC<< CC_MODE_CORE <<" | " << CC_MODE_ALL << endl;

    通用參數(shù):

    -data<cascade_dir_name>

    目錄名,如不存在訓(xùn)練程序會創(chuàng)建它,用于存放訓(xùn)練好的分類器


    -vec<vec_file_name>

    包含正樣本的vec文件名(由?opencv_createsamples?程序生成)


    -bg<background_file_name>

    背景描述文件,也就是包含負(fù)樣本文件名的那個(gè)描述文件


    -numPos<number_of_positive_samples>

    每級分類器訓(xùn)練時(shí)所用的正樣本數(shù)目


    -numNeg<number_of_negative_samples>

    每級分類器訓(xùn)練時(shí)所用的負(fù)樣本數(shù)目,可以大于?-bg?指定的圖片數(shù)目


    -numStages<number_of_stages>

    訓(xùn)練的分類器的級數(shù)。


    -precalcValBufSize<precalculated_vals_buffer_size_in_Mb>

    緩存大小,用于存儲預(yù)先計(jì)算的特征值(feature?values),單位為MB


    -precalcIdxBufSize<precalculated_idxs_buffer_size_in_Mb>

    緩存大小,用于存儲預(yù)先計(jì)算的特征索引(feature?indices),單位為MB。內(nèi)存越大,訓(xùn)練時(shí)間越短


    -baseFormatSave

    這個(gè)參數(shù)僅在使用Haar特征時(shí)有效。如果指定這個(gè)參數(shù),那么級聯(lián)分類器將以老的格式存儲


    級聯(lián)參數(shù):

    -stageType<BOOST(default)>

    級別(stage)參數(shù)。目前只支持將BOOST分類器作為級別的類型


    -featureType<{HAAR(default),LBP}>

    特征的類型:?HAAR?-?類Haar特征;LBP?-?局部紋理模式特征


    -w<sampleWidth>

    -h<sampleHeight>

    訓(xùn)練樣本的尺寸(單位為像素)。必須跟訓(xùn)練樣本創(chuàng)建(使用?opencv_createsamples?程序創(chuàng)建)時(shí)的尺寸保持一致


    Boosted分類器參數(shù):

    -bt<{DAB,RAB,LB,GAB(default)}>

    Boosted分類器的類型:?DAB?-?Discrete?AdaBoost,RAB?-?Real?AdaBoost,LB?-?LogitBoost,?GAB?-?Gentle?AdaBoost


    -minHitRate<min_hit_rate>

    分類器的每一級希望得到的最小檢測率(正樣本被判成正樣本的比例)。總的檢測率大約為?min_hit_rate^number_of_stages。可以設(shè)很高,如0.999


    -maxFalseAlarmRate<max_false_alarm_rate>

    分類器的每一級希望得到的最大誤檢率(負(fù)樣本被判成正樣本的比例)。總的誤檢率大約為?max_false_alarm_rate^number_of_stages。可以設(shè)較低,如0.5


    -weightTrimRate<weight_trim_rate>

    Specifies?whether?trimming?should?be?used?and?its?weight.?一個(gè)還不錯(cuò)的數(shù)值是0.95


    -maxDepth<max_depth_of_weak_tree>

    弱分類器樹最大的深度。一個(gè)還不錯(cuò)的數(shù)值是1,是二叉樹(stumps)


    -maxWeakCount<max_weak_tree_count>

    每一級中的弱分類器的最大數(shù)目。The?boosted?classifier?(stage)?will?have?so?many?weak?trees?(<=maxWeakCount),?as?needed?to?achieve?the?given-maxFalseAlarmRate


    類Haar特征參數(shù):

    -mode<BASIC(default)|?CORE|ALL>

    選擇訓(xùn)練過程中使用的Haar特征的類型。?BASIC?只使用右上特征,?ALL?使用所有右上特征和45度旋轉(zhuǎn)特征


    5、detectMultiScale函數(shù)參數(shù)說明

    該函數(shù)會在輸入圖像的不同尺度中檢測目標(biāo):

    image? -輸入的灰度圖像,

    objects? -被檢測到的目標(biāo)矩形框向量組,

    scaleFactor? -為每一個(gè)圖像尺度中的尺度參數(shù),默認(rèn)值為1.1

    minNeighbors? -為每一個(gè)級聯(lián)矩形應(yīng)該保留的鄰近個(gè)數(shù),默認(rèn)為3,表示至少有3次檢測到目標(biāo),才認(rèn)為是目標(biāo)

    flags -CV_HAAR_DO_CANNY_PRUNING,利用Canny邊緣檢測器來排除一些邊緣很少或者很多的圖像區(qū)域;

    ?? ? ? ? ??CV_HAAR_SCALE_IMAGE,按比例正常檢測;

    ? ?? ? ? ??CV_HAAR_FIND_BIGGEST_OBJECT,只檢測最大的物體;

    ?? ? ? ? ??CV_HAAR_DO_ROUGH_SEARCH,只做粗略檢測。默認(rèn)值是0

    minSize和maxSize -用來限制得到的目標(biāo)區(qū)域的范圍(先找maxsize,再用1.1參數(shù)縮小,直到小于minSize終止檢測)


    6、opencv關(guān)于Haar介紹

    (haarfeatures.cpp ——opencv3.0)

    Detailed Description

    Haar Feature-based Cascade Classifier for Object Detection

    The object detector described below has been initially proposed by Paul Viola?[pdf]?and improved by Rainer Lienhart?[pdf]?.

    First, a classifier (namely a?cascade of boosted classifiers working with haar-like features) is trained with a few hundred sample views of a particular object (i.e., a face or a car), called positive examples, that are scaled to the same size (say, 20x20), and negative examples - arbitrary images of the same size.

    After a classifier is trained, it can be applied to a region of interest (of the same size as used during the training) in an input image. The classifier outputs a “1” if the region is likely to show the object (i.e., face/car), and “0” otherwise. To search for the object in the whole image one can move the search window across the image and check every location using the classifier. The classifier is designed so that it can be easily “resized” in order to be able to find the objects of interest at different sizes, which is more efficient than resizing the image itself. So, to find an object of an unknown size in the image the scan procedure should be done several times at different scales.

    The word “cascade” in the classifier name means that the resultant classifier consists of several simpler classifiers (stages) that are applied subsequently to a region of interest until at some stage the candidate is rejected or all the stages are passed. The word “boosted” means that the classifiers at every stage of the cascade are complex themselves and they are built out of basic classifiers using one of four different boosting techniques (weighted voting). Currently Discrete Adaboost, Real Adaboost, Gentle Adaboost and Logitboost are supported. The basic classifiers are decision-tree classifiers with at least 2 leaves. Haar-like features are the input to the basic classifiers, and are calculated as described below. The current algorithm uses the following Haar-like features:

    image

    The feature used in a particular classifier is specified by its shape (1a, 2b etc.), position within the region of interest and the scale (this scale is not the same as the scale used at the detection stage, though these two scales are multiplied). For example, in the case of the third line feature (2c) the response is calculated as the difference between the sum of image pixels under the rectangle covering the whole feature (including the two white stripes and the black stripe in the middle) and the sum of the image pixels under the black stripe multiplied by 3 in order to compensate for the differences in the size of areas. The sums of pixel values over a rectangular regions are calculated rapidly using integral images (see below and the integral description).

    To see the object detector at work, have a look at the facedetect demo:?https://github.com/Itseez/opencv/tree/master/samples/cpp/dbt_face_detection.cpp

    The following reference is for the detection part only. There is a separate application called opencv_traincascade that can train a cascade of boosted classifiers from a set of samples.

    Note

    In the new C++ interface it is also possible to use LBP (local binary pattern) features in addition to Haar-like features. .. [Viola01] Paul Viola and Michael J. Jones. Rapid Object Detection using a Boosted Cascade of Simple Features. IEEE CVPR, 2001. The paper is available online at?https://www.cs.cmu.edu/~efros/courses/LBMV07/Papers/viola-cvpr-01.pdf(上述有提到)


    7、opencv關(guān)于boost

    (boost.cpp——opencv3.0)

    Boosting

    A common machine learning task is supervised learning. In supervised learning, the goal is to learn the functional relationship?F:y=F(x)?between the input?x?and the output?y?. Predicting the qualitative output is called?classification, while predicting the quantitative output is called?regression.

    Boosting is a powerful learning concept that provides a solution to the supervised classification learning task. It combines the performance of many “weak” classifiers to produce a powerful committee?[125]?. A weak classifier is only required to be better than chance, and thus can be very simple and computationally inexpensive. However, many of them smartly combine results to a strong classifier that often outperforms most “monolithic” strong classifiers such as SVMs and Neural Networks.

    Decision trees are the most popular weak classifiers used in boosting schemes. Often the simplest decision trees with only a single split node per tree (called stumps ) are sufficient.

    The boosted model is based on?N?training examples?(xi,yi)1N?with?xiRK?and?yi?1,+1?.?xi?is a?K?-component vector. Each component encodes a feature relevant to the learning task at hand. The desired two-class output is encoded as -1 and +1.

    Different variants of boosting are known as Discrete Adaboost, Real AdaBoost, LogitBoost, and Gentle AdaBoost?[49]?. All of them are very similar in their overall structure. Therefore, this chapter focuses only on the standard two-class Discrete AdaBoost algorithm, outlined below. Initially the same weight is assigned to each sample (step 2). Then, a weak classifier?fm(x)?is trained on the weighted training data (step 3a). Its weighted training error and scaling factor?cm?is computed (step 3b). The weights are increased for training samples that have been misclassified (step 3c). All weights are then normalized, and the process of finding the next weak classifier continues for another?M?-1 times. The final classifier?F(x)?is the sign of the weighted sum over the individual weak classifiers (step 4).

    Two-class Discrete AdaBoost Algorithm

    • Set?N?examples?(xi,yi)1N?with?xiRK,yi?1,+1?.
    • Assign weights as?wi=1/N,i=1,...,N?.
    • Repeat for?m=1,2,...,M?:
      • Fit the classifier?fm(x)?1,1, using weights?wi?on the training data.
      • Compute?errm=Ew[1(yfm(x))],cm=log((1?errm)/errm)?.
      • Set?wi?wiexp[cm1(yifm(xi))],i=1,2,...,N,?and renormalize so that?Σiwi=1?.

    • Classify new samples?x?using the formula:?sign(Σm=1Mcmfm(x))?.
    Note
    Similar to the classical boosting methods, the current implementation supports two-class classifiers only. For M > 2 classes, there is theAdaBoost.MH?algorithm (described in?[49]) that reduces the problem to the two-class problem, yet with a much larger training set.

    To reduce computation time for boosted models without substantially losing accuracy, the influence trimming technique can be employed. As the training algorithm proceeds and the number of trees in the ensemble is increased, a larger number of the training samples are classified correctly and with increasing confidence, thereby those samples receive smaller weights on the subsequent iterations. Examples with a very low relative weight have a small impact on the weak classifier training. Thus, such examples may be excluded during the weak classifier training without having much effect on the induced classifier. This process is controlled with the weight_trim_rate parameter. Only examples with the summary fraction weight_trim_rate of the total weight mass are used in the weak classifier training. Note that the weights for?all?training examples are recomputed at each training iteration. Examples deleted at a particular iteration may be used again for learning some of the weak classifiers further?[49]

    See also
    cv::ml::Boost

    Prediction with Boost

    StatModel::predict(samples, results, flags) should be used. Pass flags=StatModel::RAW_OUTPUT to get the raw sum from Boost classifier.

    8、關(guān)于訓(xùn)練過程打印信息的解釋

    1)POS count : consumed ? n1 : n2

    每次都調(diào)用updateTrainingSet( requiredLeafFARate, tempLeafFARate );函數(shù)

    [cpp] view plaincopyprint?
  • bool?CvCascadeClassifier::updateTrainingSet(?double?minimumAcceptanceRatio,?double&?acceptanceRatio)??
  • {??
  • ????int64?posConsumed?=?0,?negConsumed?=?0;??
  • ????imgReader.restart();??
  • ????int?posCount?=?fillPassedSamples(?0,?numPos,?true,?0,?posConsumed?);//Consumed消耗??
  • ????if(?!posCount?)??
  • ????????return?false;??
  • ????cout?<<?”POS?count?:?consumed???”?<<?posCount?<<?“?:?”?<<?(int)posConsumed?<<?endl;//這就是打印信息,我的理解是這個(gè)stage判成正樣本數(shù)和正樣本數(shù)??
  • ??
  • ????int?proNumNeg?=?cvRound(?(?((double)numNeg)?*?((double)posCount)?)?/?numPos?);?//?apply?only?a?fraction?of?negative?samples.?double?is?required?since?overflow?is?possible??
  • ????int?negCount?=?fillPassedSamples(?posCount,?proNumNeg,?false,?minimumAcceptanceRatio,?negConsumed?);??
  • ????if?(?!negCount?)??
  • ????????return?false;??
  • ??
  • ????curNumSamples?=?posCount?+?negCount;??
  • ????acceptanceRatio?=?negConsumed?==?0???0?:?(?(double)negCount/(double)(int64)negConsumed?);??
  • ????cout?<<?”NEG?count?:?acceptanceRatio????”?<<?negCount?<<?“?:?”?<<?acceptanceRatio?<<?endl;//打印信息,我的理解是??
  • ????return?true;??
  • }??
  • bool CvCascadeClassifier::updateTrainingSet( double minimumAcceptanceRatio, double& acceptanceRatio) {int64 posConsumed = 0, negConsumed = 0;imgReader.restart();int posCount = fillPassedSamples( 0, numPos, true, 0, posConsumed );//Consumed消耗if( !posCount )return false;cout << "POS count : consumed " << posCount << " : " << (int)posConsumed << endl;//這就是打印信息,我的理解是這個(gè)stage判成正樣本數(shù)和正樣本數(shù)int proNumNeg = cvRound( ( ((double)numNeg) * ((double)posCount) ) / numPos ); // apply only a fraction of negative samples. double is required since overflow is possibleint negCount = fillPassedSamples( posCount, proNumNeg, false, minimumAcceptanceRatio, negConsumed );if ( !negCount )return false;curNumSamples = posCount + negCount;acceptanceRatio = negConsumed == 0 ? 0 : ( (double)negCount/(double)(int64)negConsumed );cout << "NEG count : acceptanceRatio " << negCount << " : " << acceptanceRatio << endl;//打印信息,我的理解是return true; } [cpp] view plaincopyprint?
  • int?CvCascadeClassifier::fillPassedSamples(?int?first,?int?count,?bool?isPositive,?double?minimumAcceptanceRatio,?int64&?consumed?)??
  • {??
  • ????int?getcount?=?0;??
  • ????Mat?img(cascadeParams.winSize,?CV_8UC1);??
  • ????for(?int?i?=?first;?i?<?first?+?count;?i++?)??
  • ????{??
  • ????????for(?;?;?)??
  • ????????{??
  • ????????????if(?consumed?!=?0?&&?((double)getcount+1)/(double)(int64)consumed?<=?minimumAcceptanceRatio?)??
  • ????????????????return?getcount;??
  • ??
  • ????????????bool?isGetImg?=?isPositive???imgReader.getPos(?img?)?:??
  • ???????????????????????????????????????????imgReader.getNeg(?img?);??
  • ????????????if(?!isGetImg?)??
  • ????????????????return?getcount;??
  • ????????????consumed++;??
  • ??
  • ????????????featureEvaluator->setImage(?img,?isPositive???1?:?0,?i?);??
  • ????????????if(?predict(?i?)?==?1.0F?)??
  • ????????????{??
  • ????????????????getcount++;??
  • ????????????????printf(”%s?current?samples:?%d\r”,?isPositive???“POS”:“NEG”,?getcount);??
  • ????????????????break;??
  • ????????????}??
  • ????????}??
  • ????}??
  • ????return?getcount;??
  • }??
  • int CvCascadeClassifier::fillPassedSamples( int first, int count, bool isPositive, double minimumAcceptanceRatio, int64& consumed ) {int getcount = 0;Mat img(cascadeParams.winSize, CV_8UC1);for( int i = first; i < first + count; i++ ){for( ; ; ){if( consumed != 0 && ((double)getcount+1)/(double)(int64)consumed <= minimumAcceptanceRatio )return getcount;bool isGetImg = isPositive ? imgReader.getPos( img ) :imgReader.getNeg( img );if( !isGetImg )return getcount;consumed++;featureEvaluator->setImage( img, isPositive ? 1 : 0, i );if( predict( i ) == 1.0F ){getcount++;printf("%s current samples: %d\r", isPositive ? "POS":"NEG", getcount);break;}}}return getcount; } [cpp] view plaincopyprint?
  • int?CvCascadeClassifier::predict(?int?sampleIdx?)??
  • {??
  • ????CV_DbgAssert(?sampleIdx?<?numPos?+?numNeg?);??
  • ????for?(vector<?Ptr<CvCascadeBoost>?>::iterator?it?=?stageClassifiers.begin();??
  • ????????it?!=?stageClassifiers.end();?it++?)??
  • ????{??
  • ????????if?(?(*it)->predict(?sampleIdx?)?==?0.f?)??
  • ????????????return?0;??
  • ????}??
  • ????return?1;??
  • }??
  • int CvCascadeClassifier::predict( int sampleIdx ) {CV_DbgAssert( sampleIdx < numPos + numNeg );for (vector< Ptr<CvCascadeBoost> >::iterator it = stageClassifiers.begin();it != stageClassifiers.end(); it++ ){if ( (*it)->predict( sampleIdx ) == 0.f )return 0;}return 1; } [cpp] view plaincopyprint?
  • float?CvCascadeBoost::predict(?int?sampleIdx,?bool?returnSum?)?const??
  • {??
  • ????CV_Assert(?weak?);??
  • ????double?sum?=?0;??
  • ????CvSeqReader?reader;??
  • ????cvStartReadSeq(?weak,?&reader?);??
  • ????cvSetSeqReaderPos(?&reader,?0?);??
  • ????for(?int?i?=?0;?i?<?weak->total;?i++?)??
  • ????{??
  • ????????CvBoostTree*?wtree;??
  • ????????CV_READ_SEQ_ELEM(?wtree,?reader?);??
  • ????????sum?+=?((CvCascadeBoostTree*)wtree)->predict(sampleIdx)->value;??
  • ????}??
  • ????if(?!returnSum?)??
  • ????????sum?=?sum?<?threshold?-?CV_THRESHOLD_EPS???0.0?:?1.0;??
  • ????return?(float)sum;??
  • }??
  • float CvCascadeBoost::predict( int sampleIdx, bool returnSum ) const {CV_Assert( weak );double sum = 0;CvSeqReader reader;cvStartReadSeq( weak, &reader );cvSetSeqReaderPos( &reader, 0 );for( int i = 0; i < weak->total; i++ ){CvBoostTree* wtree;CV_READ_SEQ_ELEM( wtree, reader );sum += ((CvCascadeBoostTree*)wtree)->predict(sampleIdx)->value;}if( !returnSum )sum = sum < threshold - CV_THRESHOLD_EPS ? 0.0 : 1.0;return (float)sum; }






    總結(jié)

    以上是生活随笔為你收集整理的Opencv 特征训练分类器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    成人蜜桃网| 99视屏 | 在线观看一级视频 | 久久69精品久久久久久久电影好 | 国产xxxx做受性欧美88 | 久久免费精品一区二区三区 | 久草免费在线视频观看 | 免费久久精品视频 | 久久看片 | 黄色动态图xx | 成人免费视频a | 狠狠干天天 | 在线97| 91亚洲网站 | 色橹橹欧美在线观看视频高清 | 久久免费av电影 | 精品国产大片 | 国产精品岛国久久久久久久久红粉 | 午夜精品成人一区二区三区 | 久久久久久久久影院 | 成人av在线看 | 欧美一级片免费播放 | 久久精品国产亚洲a | 色资源网在线观看 | 亚洲精品在线视频 | 国产一级大片免费看 | 夜夜操天天操 | 五月婷婷综合在线视频 | 色婷婷av国产精品 | 日韩天堂在线观看 | 久久这里只有精品视频首页 | 九九热精品视频在线观看 | 国产精品1024| 久久天天拍 | 久久国产电影院 | 国内精品久久久久久中文字幕 | 最近日本mv字幕免费观看 | 国产成人综 | 日韩免费三级 | 97人人模人人爽人人喊中文字 | 天天射天天干天天爽 | 亚洲精品免费播放 | 久草精品视频在线看网站免费 | 国产精品乱码久久久久久1区2区 | 久久久电影网站 | freejavvideo日本免费 | 99精品欧美一区二区蜜桃免费 | 成人免费视频a | 91视频免费播放 | 在线视频电影 | 国产精品日韩在线观看 | 日韩在线免费播放 | a天堂最新版中文在线地址 久久99久久精品国产 | 欧美做受高潮电影o | 91成人久久 | 91免费观看视频网站 | 91成人午夜| 美女视频黄的免费的 | 久久美女精品 | 成人黄色av免费在线观看 | 久久精品中文字幕一区二区三区 | 亚洲日本韩国一区二区 | 91一区二区三区久久久久国产乱 | 热久久免费视频 | 中文字幕免费不卡视频 | 国产精品一区免费在线观看 | 五月婷婷激情 | 国产视频日韩视频欧美视频 | 亚洲五月六月 | 国产成人亚洲在线电影 | 成人网在线免费视频 | 中国老女人日b | 天天干夜夜操视频 | 在线色吧 | 精品欧美一区二区三区久久久 | 久久免费的视频 | 国产亚洲视频在线 | 综合av在线 | 国产亚洲精品久久久久久网站 | av成人动漫在线观看 | 国产在线最新 | 亚洲精品自拍 | 成人一级在线观看 | 精品在线观看视频 | 草久在线视频 | 色妞色视频一区二区三区四区 | 欧美色图p | 看片黄网站| 久久久91精品国产一区二区三区 | 欧美午夜理伦三级在线观看 | 综合久久久久久久 | 婷婷综合五月天 | 国产成人一级电影 | 国产精品18久久久 | 色吧久久 | 久久精品一区二区三区国产主播 | 五月激情视频 | 天堂av在线中文在线 | 国产99免费 | aaawww | 成人av教育 | 国产黄色大全 | 97在线观看免费观看高清 | 亚洲精品视频免费在线观看 | 久久精品一二区 | 91av在线看 | 欧美日韩69 | 亚洲观看黄色网 | 国产精品久久久 | 国产一线在线 | 91精品国产一区二区在线观看 | 亚洲精品欧美视频 | 天天色天天操天天爽 | 国产欧美日韩精品一区二区免费 | 日av免费 | 人人射人人爽 | 国产黄色观看 | 日韩在线观看一区二区 | 久久久久美女 | 国产亚洲午夜高清国产拍精品 | 天天综合导航 | www.色婷婷.com | 国产精品一区二区三区久久久 | 亚洲va综合va国产va中文 | 欧美日韩在线视频一区 | 久久线视频 | 色综合久久中文字幕综合网 | 天海冀一区二区三区 | 97在线观看免费高清 | 亚洲丝袜一区二区 | 亚洲福利精品 | 国产精品精品国产婷婷这里av | 国产高清av免费在线观看 | 日韩欧美在线高清 | 亚洲一级片在线观看 | 黄色视屏在线免费观看 | 精品国产福利在线 | 蜜桃传媒一区二区 | 亚洲伊人成综合网 | 国产夫妻自拍av | 视频一区久久 | 六月天综合网 | 国产在线综合视频 | 久久午夜剧场 | 国产精品国产毛片 | 日韩欧美在线一区 | 一级黄色av| 亚洲国产999| 国产高清在线a视频大全 | 国产在线精品福利 | 久久高视频 | 国产精品伦一区二区三区视频 | 日韩v在线91成人自拍 | 91精品国产电影 | 97福利在线观看 | 久久电影色| 蜜臀av性久久久久av蜜臀妖精 | 国产高清视频在线播放 | 色婷婷骚婷婷 | 日韩在线视 | 亚洲视频axxx | 欧美精品一级视频 | 色婷婷综合激情 | 欧美激情视频免费看 | 免费在线观看污网站 | 日韩中文字幕91 | 婷婷精品在线视频 | 亚洲干| 欧美国产视频在线 | 日韩视频一区二区三区在线播放免费观看 | 亚洲国产中文字幕 | 欧美最猛性xxxxx(亚洲精品) | 久艹视频免费观看 | 久久99精品国产 | 国产精彩视频一区二区 | 亚洲精品婷婷 | 免费午夜视频在线观看 | 一区二区三区福利 | 在线观看www. | 黄色软件在线观看视频 | 国产精品综合在线观看 | 久草手机视频 | 亚洲伊人av | 欧美日韩高清一区二区三区 | japanesexxx乱女另类 | 国产免费亚洲 | 久草久草在线观看 | 超碰九九| 天天爽夜夜爽人人爽一区二区 | 欧美日韩在线精品一区二区 | 韩国三级一区 | 亚洲日本在线一区 | www.天天干| a级片久久久 | 中文字幕免费一区二区 | 国产午夜精品一区二区三区在线观看 | 丁香视频全集免费观看 | 久久神马影院 | 伊人婷婷综合 | 深夜免费福利网站 | 精品国产网址 | 欧美激情操 | 三级大片网站 | 丁香激情综合 | 免费看三级网站 | 麻豆国产精品va在线观看不卡 | 男女男视频 | 激情综合色综合久久综合 | 看片网站黄| 天天射天天操天天 | 国产精品乱码高清在线看 | 国产精品女教师 | 黄色网www| 日韩免费在线视频 | 91精品久久久久久久91蜜桃 | 欧美日韩精品在线播放 | 成人黄色免费在线观看 | 天天操天天弄 | 久久国产精品一国产精品 | 国产成人福利在线观看 | 亚洲第一成网站 | 久久精品79国产精品 | 激情五月婷婷网 | 成人欧美一区二区三区黑人麻豆 | 91麻豆产精品久久久久久 | 国产特级毛片 | 91精品国自产在线偷拍蜜桃 | 免费观看www小视频的软件 | 成 人 黄 色 视频 免费观看 | av资源免费看 | 久久久久夜色 | 99久久精品日本一区二区免费 | av在线电影网站 | 麻豆视频在线免费观看 | 中文字幕一区二区三区四区视频 | 特级aaa毛片 | av在线官网 | 久久午夜精品 | 欧美成人在线免费 | 超碰97国产精品人人cao | 免费av视屏 | 碰天天操天天 | 成片免费观看视频 | 久久久久久国产精品免费 | 久艹视频在线观看 | 国产午夜精品久久 | 国产小视频国产精品 | 国产精品视频久久 | 天天色欧美| 九九久久国产 | 奇米影视四色8888 | 国产日产精品一区二区三区四区的观看方式 | 少妇bbw撒尿 | 成人精品亚洲 | 视频在线91| 欧美日韩国产亚洲乱码字幕 | 亚洲狠狠婷婷综合久久久 | 婷婷社区五月天 | 亚洲精品国产欧美在线观看 | 99这里只有精品视频 | 久久伊人精品天天 | 国产99中文字幕 | 丝袜美腿在线视频 | 超碰日韩 | 综合网伊人 | 久久天| 99 国产精品| 欧美另类xxxxx | 日韩在线视频网 | 亚洲欧洲美洲av | 天天艹 | 亚洲综合干 | 日日夜夜狠狠 | 国产精品中文字幕av | 久久成视频| 激情丁香在线 | 九九热精| 亚洲综合色激情五月 | 丁香六月激情 | 国产丝袜美腿在线 | 天天干人人插 | 一区二区三区在线视频111 | 免费在线观看不卡av | 精品自拍av | 久久天天操 | 日韩高清在线观看 | 免费三级黄 | 日韩在线视频观看免费 | 九九视频免费观看视频精品 | 久久国产一区二区三区 | 久草成人在线 | 国产精品午夜av | 国产中文自拍 | 婷婷六月天丁香 | 欧美日韩国产一区二区三区在线观看 | 亚洲精品一区二区久 | 91丨精品丨蝌蚪丨白丝jk | 天天做天天干 | 久久久91精品国产一区二区三区 | 国产精品嫩草在线 | 国产成人一级 | 日韩大片在线播放 | 国产精品久久一区二区三区, | 99国产精品 | 久久黄色网页 | 久久久久夜色 | 亚洲美女在线一区 | 久久伊99综合婷婷久久伊 | 久久久久久99精品 | 黄色天堂在线观看 | 国产亚洲久一区二区 | 久久久综合九色合综国产精品 | 99久久久国产免费 | 在线免费观看麻豆视频 | 中文字幕一区二区三区四区久久 | 成人一区电影 | 精品少妇一区二区三区在线 | 9999免费视频 | 中国一级特黄毛片大片久久 | 日韩av播放在线 | 日韩经典一区二区三区 | 天天射天天干天天爽 | 激情丁香 | 2021国产在线 | 国产精品系列在线观看 | 精品国产1区2区3区 国产欧美精品在线观看 | 99爱这里只有精品 | 久久99九九99精品 | 亚洲黄色在线免费观看 | 全黄色一级片 | 国产视频高清 | 91成人免费看片 | 午夜久久网站 | 久久久久久久影视 | 亚洲精品97 | 精品一区av | 国产精品一区在线 | 日韩久久久久久 | 丝袜制服天堂 | 国内精品久久久久影院优 | 天天操天天射天天爱 | 亚洲精品美女在线 | 在线看岛国av | av色网站 | 丁香婷婷激情国产高清秒播 | 九九九九热精品免费视频点播观看 | 亚洲理论电影网 | 97碰在线视频 | 激情婷婷av | 免费看国产一级片 | 国产亚洲一区二区三区 | 欧洲精品在线视频 | 夜夜躁日日躁狠狠久久88av | 成人丁香花 | 99爱精品视频 | 大胆欧美gogo免费视频一二区 | 狠狠操精品 | 特级a老妇做爰全过程 | 久久夜夜操| 日韩精品欧美视频 | 久草在线资源观看 | 丝袜美腿在线 | 免费观看mv大片高清 | 中文字幕精品三区 | 天堂在线一区二区 | 国产精品美女在线 | 亚洲成人免费在线观看 | 成人午夜剧场在线观看 | 一区免费观看 | 日韩欧美在线不卡 | 天堂在线v | www.91成人| 精品免费久久久久久 | 2023国产精品自产拍在线观看 | 亚洲欧洲在线视频 | 中文字幕精品www乱入免费视频 | 成人午夜剧场在线观看 | www.超碰97.com | 午夜色影院 | 婷婷丁香视频 | 中文字幕在线观看视频一区 | 国产精品久久久久久模特 | 国产精品国产毛片 | 激情在线网址 | 在线观看免费成人 | 中文字幕在线观看视频网站 | 久久综合欧美 | 五月天婷婷狠狠 | 中日韩在线 | 国模一二三区 | 蜜桃传媒一区二区 | 在线黄色免费 | 中文字幕在线观看你懂的 | 亚洲人久久久 | 精品久久久久久久久久久院品网 | 在线 日韩 av | 午夜久久| 韩日精品中文字幕 | 黄色a大片| 国产精品一区在线 | 欧美激情综合色 | 久久精品国产v日韩v亚洲 | 成人免费网视频 | 精品一区二区三区香蕉蜜桃 | 美女网站黄在线观看 | 黄色大片网 | 欧美一级日韩三级 | 高清不卡一区二区三区 | 91精品人成在线观看 | 欧美日韩国产在线观看 | h动漫中文字幕 | 99久久精品午夜一区二区小说 | 欧美一级乱黄 | 日韩精品久久久久久久电影99爱 | 91九色免费视频 | 在线观看亚洲精品 | 五月婷婷激情网 | 亚洲国产视频在线 | 欧美成人精品欧美一级乱 | av在线网站免费观看 | 亚洲国产影院 | 欧美精品国产综合久久 | 国产主播大尺度精品福利免费 | www久久99| 精品视频一区在线观看 | 国产精品av在线免费观看 | 91一区在线观看 | 日韩av免费一区 | 99久久久久| 中文字幕永久 | 麻豆视频成人 | 久久无码av一区二区三区电影网 | 欧美韩国日本在线观看 | 国产一级大片免费看 | 国产精品手机在线观看 | 国内精品久久久久国产 | 色五月色开心色婷婷色丁香 | 国产小视频你懂的在线 | 草久久影院| 99久久精品国 | 日本成人a| 免费在线中文字幕 | 超碰个人在线 | 国产亚洲永久域名 | 亚洲国产精品va在线 | 久久久久久国产精品免费 | 国产视频久久久久 | 欧美亚洲成人xxx | 亚洲视频一 | 四虎影视精品永久在线观看 | 99 色| 日韩精品专区在线影院重磅 | 九九热免费观看 | 蜜臀aⅴ国产精品久久久国产 | 日日操日日干 | 干av在线| 特及黄色片 | 日韩久久视频 | 免费高清在线观看成人 | 国产精品美女久久久免费 | 日韩精品一区二区在线观看视频 | 国内久久视频 | 午夜性福利| 亚洲欧洲国产精品 | 国产免费又爽又刺激在线观看 | 国产一区二区中文字幕 | 成人香蕉视频 | 色综合久久88色综合天天免费 | 国产精品福利在线 | a午夜在线 | 91成人小视频 | 欧美亚洲精品一区 | 超碰人人做| 天海冀一区二区三区 | 成人小电影在线看 | 久久精品在线视频 | 中文日韩在线视频 | 久久人人爽人人爽人人片 | 亚洲天堂精品视频在线观看 | 玖玖视频网 | 亚洲夜夜网 | 国产一区不卡在线 | wwwav视频| 欧美成亚洲 | 亚洲专区 国产精品 | 91在线小视频 | 国产精品久久久久久久久久直播 | 欧美久草视频 | 国产成人精品一区二区在线 | 五月天激情综合 | av一区二区在线观看中文字幕 | 亚洲视频在线免费看 | 日韩欧美精品在线 | 久久国产精品影视 | 国产女v资源在线观看 | 黄色三级在线看 | 一级性生活片 | 91成人小视频 | 日韩黄色免费电影 | 91亚色视频在线观看 | 久久大香线蕉app | 亚洲精品综合一区二区 | 久久精品三 | 91在线最新 | 日韩欧美精品在线视频 | 手机在线中文字幕 | 国产黄色大片 | 成人亚洲免费 | 最新久久免费视频 | 久久久久久高潮国产精品视 | 国产精品久久久亚洲 | 久香蕉 | 欧美午夜精品久久久久久孕妇 | 久久99精品热在线观看 | 久久欧洲视频 | 国内精品在线观看视频 | 国产亚洲精品v | 国产精品精品国产色婷婷 | 正在播放一区二区 | 91亚洲综合| 国产精品久久久久久妇 | 五月婷婷中文网 | 视频在线观看一区 | 99久久婷婷国产精品综合 | 亚洲国产片 | 在线视频 成人 | 亚洲国产精品va在线看 | 国产成人av在线影院 | 精品国产一区二区三区蜜臀 | 99精品久久99久久久久 | 国内成人综合 | 日韩精品久久久免费观看夜色 | 国产亚洲一区二区在线观看 | 久操久 | 日韩精品一区二区三区丰满 | 国产精品一区二区在线播放 | 丁香六月婷婷开心 | 91高清在线看 | 久久免费黄色大片 | 欧美日韩国产欧美 | 日韩免费在线网站 | 国产在线观看h | 狠狠伊人 | 99精彩视频在线观看免费 | 久久久久久久99精品免费观看 | 欧美激情精品久久久久 | 精品在线二区 | 色综合久久88色综合天天人守婷 | 久久成人国产精品免费软件 | 久久久久久久久久亚洲精品 | 国产又粗又猛又爽又黄的视频先 | 偷拍精品一区二区三区 | 亚洲 综合 专区 | 欧美成人免费在线 | 美女久久久久久久久久 | 欧亚久久 | 绯色av一区 | 亚洲综合一区二区精品导航 | www.久久爱.cn | 999国产在线 | 久久久久久久久久久免费 | 日日干天天爽 | www.成人sex| 奇人奇案qvod | 久草a视频| 免费视频 你懂的 | 99r在线播放| 中文一区在线观看 | 一区免费视频 | 伊人射| 欧美亚洲成人免费 | 久久这里只有精品首页 | 97成人免费视频 | av不卡免费在线观看 | 色射爱| 中文字幕一区二区三区在线视频 | 欧美日韩精品在线视频 | 久久久国产视频 | 日韩高清激情 | 黄色官网在线观看 | 久久久久草 | 久久免费视频一区 | 欧美精品亚州精品 | 亚洲三级视频 | 久久亚洲人 | 99精品在线看 | 五月天,com | 成人黄色视 | 97免费视频在线 | 欧美最猛性xxxxx亚洲精品 | 成人黄色小说在线观看 | 黄色av影视 | 一级黄色片在线播放 | 国产精品少妇 | 99久久99视频只有精品 | 91视频在线国产 | 国产精品99久久免费观看 | 中文字幕视频播放 | 91桃色在线播放 | 国产又粗又长的视频 | 黄色片视频免费 | 国产91影院| 人人讲下载 | 成人av动漫在线 | 视频91在线 | 亚洲日本一区二区在线 | 四虎免费av| 综合色婷婷| 五月天九九 | 免费国产在线精品 | 99精品国产免费久久久久久下载 | 亚洲视频久久久 | 五月婷婷综合在线观看 | 久久久国产网站 | 成人h电影在线观看 | 久久精品视频网 | 黄色av影院| 国产成人亚洲在线电影 | 久久这里只有精品视频首页 | 久久久久久草 | 中文资源在线官网 | 日本论理电影 | 国产裸体无遮挡 | 亚洲精品播放 | 西西444www大胆高清图片 | 一区二区三区精品在线视频 | 久草热久草视频 | 久久久久欠精品国产毛片国产毛生 | 毛片网免费 | 亚洲涩涩色 | 久久国产视屏 | 久久99亚洲精品久久 | 亚洲,国产成人av | 成人免费视频网站 | 成人午夜影视 | 欧美另类老妇 | 中文字幕一区二区三区四区 | 午夜资源站 | 一级黄色片毛片 | 色在线国产 | 欧美国产日韩一区 | 日韩特黄av| 久久久久国产一区二区 | 久久久三级视频 | 91精品国产麻豆国产自产影视 | 免费亚洲黄色 | 欧美了一区在线观看 | 色资源在线 | 五月婷婷激情网 | 99在线观看视频 | 天天操夜操 | 亚洲影院国产 | 天天操偷偷干 | 精品国产视频在线 | 色综合久久中文字幕综合网 | 久久综合色天天久久综合图片 | 久久久国产一区二区三区四区小说 | 成人av一二三区 | 天天综合网天天 | 高清中文字幕av | 久草精品资源 | 中文字幕在线播出 | 亚洲激情六月 | 婷婷av网站 | 丁香六月久久综合狠狠色 | 日韩精品亚洲专区在线观看 | 国产精品24小时在线观看 | 午夜免费福利片 | 青青河边草免费 | 一区二区三区精品久久久 | 中文字幕4 | 国产一级不卡视频 | 日韩中文字幕免费在线观看 | 91香蕉视频色版 | 一区二区精品在线 | 欧美国产日韩一区二区 | 99色精品视频| 亚洲劲爆av| 午夜免费电影院 | 中文字幕在线观看亚洲 | 在线观看a视频 | 亚洲综合色激情五月 | 国内揄拍国产精品 | 超碰国产在线 | 国产拍揄自揄精品视频麻豆 | 欧美尹人 | 国产精品a久久久久 | 久久网址 | 97视频一区 | 永久精品视频 | 国产一级在线视频 | 免费黄色a级毛片 | 免费一区在线 | 91av精品| 人人插人人澡 | 中文字幕专区高清在线观看 | 五月婷婷狠狠 | 97超碰国产精品女人人人爽 | 日韩三级免费观看 | 国产亚洲精品bv在线观看 | 三级性生活视频 | 狠狠躁天天躁 | 天天色天天射天天干 | 日韩av成人在线 | 日日干夜夜骑 | 日日夜夜骑 | 欧美日韩视频免费看 | 99视频久| 欧美巨大荫蒂茸毛毛人妖 | 超碰在线9 | 免费久久99精品国产婷婷六月 | 黄色特级一级片 | 久久国产亚洲视频 | 婷婷丁香花五月天 | 狠狠狠干狠狠 | 国产一区影院 | 国产美女视频网站 | 中文字幕国内精品 | 97精品国产97久久久久久春色 | 久草视频免费 | 国产永久网站 | 亚洲精品免费观看视频 | 国产精华国产精品 | 九九久久久 | 韩国av在线播放 | 国产精品久久人 | 探花视频在线版播放免费观看 | 日韩高清免费观看 | 日韩欧美aaa| 91大片网站| 久久国产电影院 | 成人毛片一区二区三区 | 91超碰免费在线 | 久久久2o19精品 | 97影视| 在线视频久久 | 五月天综合婷婷 | 天天干夜夜夜 | 在线观看成人国产 | 日韩精品不卡在线 | 免费在线观看污 | 久草在线免费资源 | 国产精品国产精品 | 成人影片在线免费观看 | 国产精品都在这里 | 国产在线精品国自产拍影院 | 日本中文字幕在线免费观看 | 久久伊人五月天 | 国产一区二区三精品久久久无广告 | 91麻豆精品国产91久久久更新时间 | 人人舔人人插 | 韩国av免费观看 | 免费av网址大全 | 亚洲视频www| 久久图 | 国产资源在线播放 | 在线观看视频在线观看 | 9999精品免费视频 | 99久久精品视频免费 | 亚洲一区网站 | 亚洲精品中文字幕在线 | 欧美日韩一区二区三区不卡 | 国产精品久久久一区二区三区网站 | 精品国产伦一区二区三区观看体验 | 不卡的一区二区三区 | 中文字幕一区二区在线播放 | 成人免费观看网站 | 九九精品在线观看 | 亚洲最新视频在线播放 | 一区二区三区免费在线播放 | 成人sm另类专区 | 成人黄视频 | 亚洲最大成人免费网站 | 97在线观看视频国产 | 成人小视频免费在线观看 | 亚州国产精品久久久 | 国产精品日韩 | 国产一区二区在线看 | 久热av| 国产精品99精品 | 免费精品在线视频 | 天天操狠狠操 | 欧美日韩中文字幕视频 | 色成人亚洲网 | 91视频观看免费 | 色天堂在线视频 | 欧美日韩免费观看一区二区三区 | 午夜久久网 | 特黄特色特刺激视频免费播放 | 在线精品视频免费播放 | 日韩最新av| 久久精品久久精品久久39 | 99综合视频| 91片在线观看 | 在线视频精品播放 | 韩国av在线播放 | 国产精品久久久一区二区三区网站 | 超碰个人在线 | 免费看高清毛片 | 97精产国品一二三产区在线 | 亚洲婷婷丁香 | 美女视频黄网站 | 久久久一本精品99久久精品 | 日本精品一区二区三区在线观看 | 国产不卡av在线播放 | 亚洲精品国产欧美在线观看 | www.狠狠操.com | 蜜臀久久99精品久久久无需会员 | 国产一线二线三线性视频 | 四虎国产精品免费 | 久草在线电影网 | 亚洲国产最新 | 日本在线免费看 | 国产日本高清 | 免费99精品国产自在在线 | 久久久黄色 | 国产午夜精品免费一区二区三区视频 | 精品黄色在线观看 | 黄p网站在线观看 | 永久免费毛片在线观看 | 色婷婷综合久久久中文字幕 | 日韩av网站在线播放 | 97人人爽| 狠狠的操狠狠的干 | 国产精品久久久一区二区 | 国产精品久久久久久久久久直播 | 国产又粗又猛又黄又爽的视频 | 在线91色 | 色狠狠婷婷 | 亚洲天堂视频在线 | 高清日韩一区二区 | 国产成人黄色 | 天天操夜夜干 | 一级黄色免费网站 | 免费97视频| www.天天射.com| 日韩一区二区三区免费电影 | 天天操比| 亚洲一二三区精品 | 天天色综合1 | 亚洲三级性片 | 亚洲成人精品久久久 | 久久综合久久久久88 | 国产成人精品一区二区三区在线 | 久久久久夜色 | 欧美黑人巨大xxxxx | 天天视频色版 | 区一区二区三区中文字幕 | 日本免费久久高清视频 | 最近更新好看的中文字幕 | 在线高清av | 亚洲午夜久久久综合37日本 | 在线成人av | 欧美视频日韩视频 | 99re久久资源最新地址 | 国产一区网址 | 亚洲资源在线 | 999久久a精品合区久久久 | 欧美精品亚洲精品日韩精品 | 人人精品久久 | 夜夜躁狠狠躁日日躁视频黑人 | 999免费视频 | 一级大片在线观看 | 伊人久久一区 | 成人va视频| 国产无遮挡猛进猛出免费软件 | 又黄又刺激视频 | 国产精品久久久久永久免费观看 | 深爱五月激情五月 | 国产精品视频999 | 日日干av | 国产色啪 | 久草视频手机在线 | 深夜成人av | 日韩精品一区二区不卡 | 波多野结衣精品视频 | 国产精品入口麻豆www | 久久99九九99精品 | 国产精品美女毛片真酒店 | 国产精品欧美久久久久无广告 | 国产精品久久久久久久久久久久久久 | 国产精品18久久久久久久网站 | 国产精品成人一区二区 | 亚洲欧洲精品一区 | 亚洲精品久久久久中文字幕二区 | www色com| 91污在线观看 | 欧美国产日韩一区二区三区 | 伊人网av | 日本性生活一级片 | 少妇高潮流白浆在线观看 | 黄色成人av | 在线观看亚洲免费视频 | 国产精品久久久久影视 | 国产一区二区三区网站 | 国产精品乱码久久久 | 欧美日韩免费一区 | 国产一级特黄毛片在线毛片 | 992tv在线观看网站 | 亚洲a成人v | 色五月成人 | 久久久福利影院 | 人人干免费 | 国产精品久久久久久久久久久免费 | 久草亚洲视频 | 精品免费观看视频 | 国产精品九九久久99视频 | 人人澡人人干 | 亚洲午夜小视频 | 日韩高清成人 | 欧美日韩国产精品一区 | 99精品视频免费全部在线 | 婷婷中文在线 | 美女免费视频观看网站 | 香蕉网站在线观看 | 中文字幕资源网 | av午夜电影| 国产精品毛片一区视频 | 国产免费观看久久黄 | 天堂在线一区二区三区 | 日本精a在线观看 | 精品国内自产拍在线观看视频 | 久久高清免费观看 | 久久久久久久久久毛片 | 91九色porn在线资源 | 久久在线免费观看 | 久久经典国产 | 国产欧美高清 | 亚洲免费av在线 | 五月天堂网 | 中文字幕字幕中文 | 天堂av官网 | 久草综合视频 | 久久1电影院 | 91精品国产综合久久福利 | 亚洲国产精品久久 | 国产精品福利久久久 | 国产一区二区在线播放视频 | 日韩理论电影在线 | 久久久久成人精品免费播放动漫 | 中文字幕免费不卡视频 | 91九色性视频 | 成人福利在线 | 国产日产高清dvd碟片 | 日韩资源视频 | 最近2019好看的中文字幕免费 | 999国内精品永久免费视频 | 久久激五月天综合精品 | 精品久久电影 | 国产99在线免费 | 日韩精品一区二区三区免费观看 | 字幕网av| 天天干天天做天天爱 | 亚洲色综合 | 在线中文字幕视频 | 亚洲欧美日韩精品一区二区 | 久久激情婷婷 | 最新亚洲视频 | 午夜电影中文字幕 | 毛片精品免费在线观看 | 久久久受www免费人成 | 国产精品一区二区三区在线播放 | 国产小视频免费在线网址 | 黄色av大片| 综合婷婷| 人人干人人爽 | 国产成人精品三级 | 国产精品久久久久四虎 | 最近字幕在线观看第一季 | av天天澡天天爽天天av | 国产精品久久久av久久久 | 亚洲男男gaygayxxxgv | 天天爱天天干天天爽 | 91精品一区二区三区蜜臀 | 久久国产精品久久w女人spa | 人人网av | 婷婷六月色 | 99欧美视频 | 999超碰| 五月天综合激情 | 久久好看免费视频 | 欧美一级性视频 | 91免费在线| 精油按摩av | 91| 亚洲精品午夜一区人人爽 | 91经典在线 | 色网站在线观看 | 最近乱久中文字幕 | 黄色大全在线观看 | 亚洲 欧洲 国产 精品 | 日韩欧美v| 玖玖精品在线 | 精品av在线播放 | 超级碰碰免费视频 | 午夜精品一区二区三区在线 | 久久久黄色av | 日本91在线|