天天看點

使用OpenCV自帶的級聯分類器進行目标檢測

前言

做項目的時候使用到了OpenCV自帶的haartraining訓練器。在這片文章中就針對其進行使用進行說明,希望對各位看官有用。

樣本集處理

正樣本集

這裡首先采集到未經處理的原始樣本集,通過手工标注或是截取的形式得到正樣本集。對正樣本集進行标準化,這裡生成的是30*30大小的正樣本圖像,這樣主要為了加快訓練的速度。得到的正樣本集如下

使用OpenCV自帶的級聯分類器進行目标檢測

之後在目前目錄下打開指令行視窗,将正樣本的路徑導入到pos.txt檔案中去

dir /s/b > pos.txt
           

生成檔案之後需要對檔案進行标記指定目标的個數、區域的起始XY坐标、寬度、高度

使用OpenCV自帶的級聯分類器進行目标檢測

調用opencv_createsamples.exe生成樣本集

上面指令行參數解釋為:通過pos.txt提供的路徑生成30*30圖像大小塊的正樣本集pos.vec。這裡順帶說明一下opencv_createsamples.exe程式的指令行參數:

-info <collection_file_name> 描述物體所在圖像以及大小位置的描述檔案。
-vec <vec_file_name>輸出檔案,内含用于訓練的正樣本。
-img <image_file_name>輸入圖像檔案名(例如一個公司的标志)。
-bg<background_file_name>背景圖像的描述檔案,檔案中包含一系列的圖像檔案名,這些圖像将被随機選作物體的背景。
-num<number_of_samples>生成的正樣本的數目。
-bgcolor<background_color>背景顔色(目前為灰階圖);背景顔色表示透明顔色。因為圖像壓縮可造成顔色偏差,顔色的容差可以由-bgthresh指定。所有處于bgcolor-bgthresh和bgcolor+bgthresh之間的像素都被設定為透明像素。
-bgthresh <background_color_threshold>
-inv如果指定該标志,前景圖像的顔色将翻轉。
-randinv如果指定該标志,顔色将随機地翻轉。
-maxidev<max_intensity_deviation>前景樣本裡像素的亮度梯度的最大值。
-maxxangle <max_x_rotation_angle>X軸最大旋轉角度,必須以弧度為機關。
-maxyangle <max_y_rotation_angle>Y軸最大旋轉角度,必須以弧度為機關。
-maxzangle<max_z_rotation_angle>Z軸最大旋轉角度,必須以弧度為機關。
-show很有用的調試選項。如果指定該選項,每個樣本都将被顯示。如果按下Esc鍵,程式将繼續建立樣本但不再顯示。
-w<sample_width>輸出樣本的寬度(以像素為機關)。
-h<sample_height>輸出樣本的高度(以像素為機關)。
           
使用OpenCV自帶的級聯分類器進行目标檢測

負樣本集

對于負樣本集并不要求樣本的尺寸都是完全相同的,但是要大于正樣本的大小。負樣本不能有重複的,且增大負樣本的差異性。這裡對負樣本隻進行了灰階化處理。

使用OpenCV自帶的級聯分類器進行目标檢測

處理完負樣本圖像之後,也需要生成負樣本目錄檔案

訓練和檢測

訓練

前面已經收集好了正樣本和負樣本,接下來就可以使用訓練器進行訓練了

說一下這些參數的含義

1.通用參數:
-data <cascade_dir_name>目錄名,如不存在訓練程式會建立它,用于存放訓練好的分類器。
-vec <vec_file_name>包含正樣本的vec檔案名(由opencv_createsamples程式生成)。
-bg <background_file_name>背景描述檔案,也就是包含負樣本檔案名的那個描述檔案。
-numPos <number_of_positive_samples>每級分類器訓練時所用的正樣本數目。
-numNeg <number_of_negative_samples>每級分類器訓練時所用的負樣本數目,可以大于 -bg 指定的圖檔數目。
-numStages <number_of_stages>訓練的分類器的級數。
-precalcValBufSize<precalculated_vals_buffer_size_in_Mb>緩存大小,用于存儲預先計算的特征值(feature values),機關為MB。
-precalcIdxBufSize<precalculated_idxs_buffer_size_in_Mb>緩存大小,用于存儲預先計算的特征索引(feature indices),機關為MB。記憶體越大,訓練時間越短。
-baseFormatSave這個參數僅在使用Haar特征時有效。如果指定這個參數,那麼級聯分類器将以老的格式存儲。
2.級聯參數:
-stageType <BOOST(default)>級别(stage)參數。目前隻支援将BOOST分類器作為級别的類型。
-featureType<{HAAR(default), LBP}>特征的類型: HAAR - 類Haar特征; LBP - 局部紋理模式特征。
-w <sampleWidth>
-h <sampleHeight>訓練樣本的尺寸(機關為像素)。必須跟訓練樣本建立(使用 opencv_createsamples 程式建立)時的尺寸保持一緻。
3.分類器參數:        
-bt <{DAB, RAB, LB,GAB(default)}> Boosted分類器參數:
DAB - Discrete AdaBoost, RAB - Real AdaBoost, LB - LogitBoost, GAB -Gentle AdaBoost。Boosted分類器的類型:
-minHitRate<min_hit_rate>分類器的每一級希望得到的最小檢測率。總的檢測率大約為n_hit_rate^number_of_stages。
-maxFalseAlarmRate<max_false_alarm_rate>分類器的每一級希望得到的最大誤檢率。總的誤檢率大約為 max_false_alarm_rate^number_of_stages.
-weightTrimRate <weight_trim_rate>Specifies whether trimmingshould be used and its weight.一個還不錯的數值是.。
-maxDepth <max_depth_of_weak_tree>弱分類器樹最大的深度。一個還不錯的數值是,是二叉樹(stumps)。
-maxWeakCount<max_weak_tree_count>每一級中的弱分類器的最大數目。The boostedclassifier (stage) will have so many weak trees (<=maxWeakCount), as neededto achieve the given -maxFalseAlarmRate.
4.類Haar特征參數:
-mode <BASIC (default) |CORE | ALL>選擇訓練過程中使用的Haar特征的類型。 BASIC 隻使用右上特征, ALL使用所有右上特征和度旋轉特征。
5.LBP特征參數:
LBP特征無參數。
           

訓練完成之後看到的就是最重要的XML檔案了,用作後面分類使用

使用OpenCV自帶的級聯分類器進行目标檢測

檢測

這裡就直接貼出目标檢測的代碼了

//根據提供的XML去檢測目标圖像是否包含需要的結果
bool ObjectDetectShow(std::string xml_path, std::string testpic_path)
{
    cv::CascadeClassifier Mycascade;
    if (!Mycascade.load(xml_path))
    {
        cout << "[error] 無法加載級聯分類器檔案!" << endl;
        return false;
    }
    cv::Mat image = cv::imread(testpic_path, );//讀取圖檔    
    if (!image.data)
    {
        cout << "[error] 沒有圖檔" << endl;
        return false;
    }

    std::vector<cv::Rect> pedestrain;
    cv::Mat frame_gray = image;

    Mycascade.detectMultiScale(frame_gray, pedestrain, , , , cv::Size(, ));

    for (unsigned int i = ; i < pedestrain.size(); i++)
    {
        rectangle(image, pedestrain[i], cv::Scalar(, , ), );  //畫出目标的矩形區域
        //接下來還需要有對這些檢測出來的區域進行進一步甄别的代碼,此處省略...
    }

    cv::imshow("result", image);
    cv::waitKey();

    return true;
}
           

檢測函數參數說明

void CascadeClassifier::detectMultiScale(const Mat& image, —Mat類型的圖像
    vector<Rect>& objects, —檢測得到的矩形
    double scaleFactor,    —圖像縮放因子,必須大于
    int minNeighbors,      —構成檢測目标的相鄰矩形的最小個數
    int flags,             —舊分類器使用,新分類器棄用
    Size minObjectSize,    —最小檢測視窗大小
    Size maxObjectSize)    —最大檢測視窗大小(預設是圖像大小)
           

繼續閱讀