文章目錄
- 1. 準備工作
- 1.1安裝 OpenCV
- 1.2準備數據集
- 1.2.1正樣本
- 1.2.2負樣本
- 2. 數據準備
- 2.1 正樣本的準備
- 2.1.1步驟
- 2.1.2生成正樣本描述文件
- 2.1.3示例命令
- 2.1.4正樣本描述文件格式
- 2.2 負樣本的準備
- 2.2.1步驟
- 2.2.2負樣本描述文件格式
- 3. 訓練分類器
- 3.1命令格式
- 3.2參數說明
- 4. 訓練過程
- 4.1訓練輸出
- 5. 測試分類器
- 5.1示例代碼
- 6. 優化分類器
- 總結
訓練自定義的 Haar 級聯分類器是一個復雜但非常有用的過程,允許你檢測特定的目標對象。以下是詳細的步驟流程,包括數據準備、工具使用和訓練過程。
1. 準備工作
在開始訓練之前,確保你已經安裝了 OpenCV,并且可以使用 OpenCV 提供的工具(如 opencv_createsamples 和 opencv_traincascade)。
1.1安裝 OpenCV
如果你還沒有安裝 OpenCV,可以通過以下命令安裝:
pip install opencv-python opencv-python-headless
確保 OpenCV 的二進制工具(如 **opencv_createsamples** 和 **opencv_traincascade**)可用。
1.2準備數據集
訓練 Haar 級聯分類器需要兩類數據:
1.2.1正樣本
正樣本(Positive Samples):包含**目標對象的圖像**。
1.2.2負樣本
負樣本(Negative Samples):不包含目標對象的圖像。
2. 數據準備
2.1 正樣本的準備
正樣本是包含目標對象的圖像。為了訓練分類器,正樣本需要滿足以下要求:
1.圖像中只包含目標對象。2.目標對象在圖像中的位置和大小應盡量一致。3.圖像背景應盡量簡單。
2.1.1步驟
1.收集包含目標對象的圖像。2.使用圖像編輯工具(如 GIMP 或 Photoshop)裁剪圖像,確保目標對象位于圖像中心,并且背景干凈。3.將所有正樣本圖像調整為相同的尺寸(例如 24x24 像素)。4.將正樣本圖像保存到一個文件夾中,例如 positive_images/。
2.1.2生成正樣本描述文件
使用 opencv_createsamples 工具生成正樣本的描述文件。描述文件是一個文本文件,每一行描述一個正樣本圖像及其目標對象的位置。
2.1.3示例命令
opencv_createsamples -info positive_images.txt -vec samples.vec -num 1000 -w 24 -h 24
- -info positive_images.txt:指定正樣本描述文件的路徑。
- -vec samples.vec:生成的正樣本向量文件。
- -num 1000:正樣本的數量。
- -w 24 -h 24:樣本圖像的寬度和高度。
2.1.4正樣本描述文件格式
positive_images.txt 文件的每一行格式如下:
image_path num_objects x y width height
positive_images/img1.jpg 1 0 0 24 24
positive_images/img2.jpg 1 0 0 24 24
2.2 負樣本的準備
負樣本是不包含目標對象的圖像。負樣本用于訓練分類器區分目標和非目標區域。
2.2.1步驟
1.收集大量不包含目標對象的圖像。2.將這些圖像保存到一個文件夾中,例如 negative_images/。3.創建一個負樣本描述文件 negatives.txt,每一行包含一個負樣本圖像的路徑。
2.2.2負樣本描述文件格式
negatives.txt 文件的每一行格式如下:
image_path
negative_images/bg1.jpg
negative_images/bg2.jpg
3. 訓練分類器
使用 opencv_traincascade 工具訓練 Haar 級聯分類器。
3.1命令格式
opencv_traincascade -data output_dir -vec samples.vec -bg negatives.txt \
-numStages 20 -minHitRate 0.995 -maxFalseAlarmRate 0.5 -numPos 1000 \
-numNeg 500 -w 24 -h 24 -mode ALL -precalcValBufSize 2048 \
-precalcIdxBufSize 2048
3.2參數說明
1.-data output_dir:指定輸出目錄,訓練結果將保存在此目錄中。2.-vec samples.vec:正樣本向量文件。3.-bg negatives.txt:負樣本描述文件。4.-numStages 20:訓練的級聯階段數(通常為 10-20)。5.-minHitRate 0.995:每個階段的最小命中率(通常為 0.995)。6.-maxFalseAlarmRate 0.5:每個階段的最大誤檢率(通常為 0.5)。7.-numPos 1000:每個階段使用的正樣本數量。8.-numNeg 500:每個階段使用的負樣本數量。9.-w 24 -h 24:樣本圖像的寬度和高度。10.-mode ALL:使用所有 Haar 特征類型。11.-precalcValBufSize 2048:預計算值緩沖區大小(以 MB 為單位)。12.-precalcIdxBufSize 2048:預計算索引緩沖區大小(以 MB 為單位)。
4. 訓練過程
訓練過程可能需要數小時甚至數天,具體時間取決于數據集的大小和計算機的性能。訓練過程中會顯示每個階段的進度和性能指標。
4.1訓練輸出
每個階段會生成一個 XML 文件(如 stage1.xml、stage2.xml 等)。
最終生成的分類器文件為 cascade.xml,保存在 output_dir 中。
5. 測試分類器
訓練完成后,可以使用生成的 cascade.xml 文件進行目標檢測。
5.1示例代碼
import cv2#加載自定義 Haar 級聯分類器
custom_cascade = cv2.CascadeClassifier('output_dir/cascade.xml')#讀取圖像
img = cv2.imread('test.jpg')#轉換為灰度圖像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#檢測目標
objects = custom_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))#繪制檢測結果
for (x, y, w, h) in objects:cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)#顯示結果
cv2.imshow('Detected Objects', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
6. 優化分類器
如果分類器的性能不理想,可以嘗試以下優化方法:
1.增加正樣本和負樣本的數量。
2.調整訓練參數(如 -numStages、-minHitRate、-maxFalseAlarmRate)。
3.使用更高質量的樣本圖像。
總結
訓練自定義 Haar 級聯分類器的流程包括數據準備、生成樣本描述文件、訓練分類器和測試分類器。雖然訓練過程可能耗時,但通過合理的參數調整和數據優化,可以獲得高性能的分類器,用于檢測特定的目標對象。