TShopping

 找回密碼
 註冊
搜索
查看: 1625|回復: 0
打印 上一主題 下一主題

[教學] 使用Opencv opencv_traincascade來訓練自己想檢測的分類器

[複製鏈接]
跳轉到指定樓層
1#
發表於 2020-11-17 11:16:20 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
 
Push to Facebook
到官網下載opencv
主要使用下圖兩個檔案opencv_createsamples 及 opencv_traincascade



1 、opencv裡的分類器大概介紹:
OpenCV中有兩個程式可以訓練級聯分類器: opencv_haartraining 及 opencv_traincascade。
opencv_traincascade 是一個新程式,使用OpenCV 2.x API 以C++ 編寫。這二者主要的區別是 opencv_traincascade 支援 Haar [Viola2001] 和 LBP [Liao2007] (Local Binary Patterns) 兩種特徵,現在已經發展到可以支援hog特徵,並易於增加其他的特徵。與Haar特徵相比,LBP特徵是整數特徵,因此訓練和檢測過程都會比Haar特徵快幾倍。LBP和Haar特徵用於檢測的準確率,是依賴訓練過程中的訓練資料的質量和訓練引數。訓練一個與基於Haar特徵同樣準確度的LBP的分類器是可能的。


2、分類器的樣本製作:
  其樣本點的製作主要是指正樣本的製作,因為其負樣本製作很簡單,只要把其圖片的相對路徑生成到檔案裡即可用於訓練,其如下:
  1. import os
  2. import numpy as np

  3. pic_floder = 'neg1'

  4. with open(pic_floder+'.txt', 'w') as f:
  5.     for img in os.listdir(pic_floder):
  6.         line = pic_floder+'/'+img+'\n'
  7.         f.write(line)
複製代碼
注意:負樣本的圖片大小可以不用進行歸一化成統一大小,因為其在訓練的時候可以進行指定大小,訓練時會進行影象resize操作。
接著就是正樣本的生成,人為採集所有訓練樣本。其中正樣本的txt檔案格式如下,其中檔案路徑後面的格式是在指令生成替換得到的:


代碼:
  1. import os
  2. import cv2
  3. import numpy as np

  4. pic_floder = 'flounder'
  5. # open floder
  6. i = 0
  7. with open(pic_floder+'.txt', 'w') as f:
  8.     # search floder pic name
  9.     for img in os.listdir(pic_floder):
  10.         # get pic width and height
  11.         img_hw = cv2.imread(pic_floder+"/"+img)
  12.         sp = img_hw.shape
  13.         gray_img = cv2.imread(pic_floder+'/'+img, cv2.IMREAD_GRAYSCALE)
  14.         # 保存圖片
  15.         cv2.imwrite(pic_floder+'_gray/'+img, gray_img)
  16. #         print(sp)
  17. #         sz1 = sp[0]#height(rows) of image
  18. #         sz2 = sp[1]#width(colums) of image
  19. #         sz3 = sp[2]#the pixels value is made up of three primary colors
  20. #         print('width: %d \nheight: %d \nnumber: %d' %(sz1,sz2,sz3))
  21. #            pic_floder, img_name,img_num,rectX,rectY,rectW,rectH
  22.         line = pic_floder+'/'+img+'  1    0    0    '+str(sp[1])+'  '+str(sp[0])+'\n'
  23.         f.write(line)
  24.         i += 1
  25. #計算圖片數量
  26. print(i)
複製代碼


其指令如下:
  1. opencv_createsamples -info positives.txt -vec positive.vec -num 1000 -bgcolor 0 -bgthresh 0 -w 50 -h 50
複製代碼
此時提供的是包含所有的正樣本路徑的txt檔案,其生成可以參考上面的方法。此時這裡設定的x、y、z三軸旋角等一些資料增城的引數是不會被採用的,其只有上面A單張樣本是才使用這些引數。其中的【-num】的只要小於或等於正樣本的指,否則會報錯。

注意:這是把所有目標都裁剪下來的處理方式,而且需要進行樣本歸一化。還有一種就是使用工具在整張圖片上進行正樣本標註,其可以使用ObjectMarker工具。具體過程參考部落格:基於級聯分類器的多目標檢測
3、級聯分類器的訓練:
但樣本都準備好後,其訓練指令為:
  1. mkdir data
  2. opencv_traincascade -data data -vec positive.vec -bg neg1.txt -numPos 1000 -numNeg 500 -numStages 20 -w 50 -h 50
複製代碼
通用引數:
-data <cascade_dir_name>
目錄名,如不存在訓練程式會建立它,用於存放訓練好的分類器。
-vec <vec_file_name>
包含正樣本的vec檔名(由 opencv_createsamples 程式生成)。
-bg <background_file_name>
背景描述檔案,也就是包含負樣本檔名的那個描述檔案。
-numPos <number_of_positive_samples>
每級分類器訓練時所用的正樣本數目。其指設定為正樣本數量的85%(這是一個保守值)。具體的也要根據級聯器的層數來決定的。因為每個stages都是會增加圖片數量來進行分類。

-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特徵時有效。如果指定這個引數,那麼級聯分類器將以老的格式儲存。
級聯引數:
-stageType <BOOST(default)>
級別(stage)引數。目前只支援將BOOST分類器作為級別的型別。
-featureType<{HAAR(default), LBP}>
特徵的型別: HAAR - 類Haar特徵; LBP - 區域性紋理模式特徵。
-w <sampleWidth>
-h <sampleHeight>
訓練樣本的尺寸(單位為畫素)。必須跟訓練樣本建立(使用 opencv_createsamples 程式建立)時的尺寸保持一致。
Boosted分類器引數:
-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。總檢測率即為整個級聯器的檢測召回率,
-maxFalseAlarmRate <max_false_alarm_rate>
分類器的每一級希望得到的最大誤檢率。總的誤檢率大約為 max_false_alarm_rate^number_of_stages. 為整個級聯器的誤檢率
-weightTrimRate <weight_trim_rate>
Specifies whether trimming should be used and its weight. 一個還不錯的數值是0.95。
-maxDepth <max_depth_of_weak_tree>
弱分類器樹最大的深度。一個還不錯的數值是1,是二叉樹(stumps)。
-maxWeakCount <max_weak_tree_count>
每一級中的弱分類器的最大數目。The boosted classifier (stage) will have so many weak trees (<=maxWeakCount), as needed to achieve the given -maxFalseAlarmRate.
類Haar特徵引數:
-mode <BASIC (default) | CORE | ALL>
選擇訓練過程中使用的Haar特徵的型別。 BASIC 只使用右上特徵, ALL 使用所有右上特徵和45度旋轉特徵。
此時訓練的結果圖:

注意:由於是20stages,所以訓練時間要三四個鍾,其中採用LBP特徵會比Haar特徵快十幾倍的訓練速度。還有如果想把檢測準確度提高很高,則需要大量的樣本和好的影象質量。

4、中斷後,如果不行在繼續訓練,如何通過先前的中間檔案來生產分類器檔案cascade.xml?
  方法:此時需要修改訓練指令的【-numStages】將其設定成已有的states的層數,則其則會生成上面的檢測檔案xml。其如下:



至此已經訓練完成,並得到cascade.xml檢測檔案


參考文章

網頁設計,網站架設 ,網路行銷,網頁優化,SEO - NetYea 網頁設計

 

臉書網友討論
*滑块验证:
您需要登錄後才可以回帖 登錄 | 註冊 |

本版積分規則



Archiver|手機版|小黑屋|免責聲明|TShopping

GMT+8, 2024-4-27 08:40 , Processed in 0.050976 second(s), 25 queries .

本論壇言論純屬發表者個人意見,與 TShopping綜合論壇 立場無關 如有意見侵犯了您的權益 請寫信聯絡我們。

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表