零基礎使用深度學習進行目標檢測
實驗目的
下面這張影象存在9處瑕疵劃痕(使用微軟畫圖工具亂畫的),就是要檢測的目標。經過深度學習的訓練,可以預測新影象上是否有瑕疵和這些瑕疵的位置(以下這張圖是未參加訓練的測試圖)。
實驗效果
經過深度學習訓練後得出一個模型,利用該模型對測試圖片進行預測,其預測效果如下圖
實驗過程
準備訓練預測工具
這是一個在Windows下本人基於darknet+qt+opencv製作的一個深度學習快速目標檢測平臺,可以利用該平臺快速進行您自己資料集的標註/訓練/預測,下載地址(戳這裡)。下載後解壓其目錄結構如下:
準備資料集
資料集包含訓練集和驗證集,本實驗資料集下載地址(
建立工程
a.在darknet_train_tool下進入example目錄下,拷貝工程__template_project_not_edit_just_copy__並改名為你的工程名,這裡為defect。(e.g. __template_project_not_edit_just_copy__ --> defect)
b.進入defect目錄下:
1.修改class.names檔案,目標檢測的類別寫在這裡面一行一類,比如本工程只預測瑕疵劃痕,命名為ng。(e.g. ng)
2.進入defect/images目錄下,將訓練圖片和測試圖片對應放入train和valid目錄下(圖片名字不要有中文)
3.進入defect/net目錄下,選擇一個你需要訓練的網路模型進行對應的配置修改(這裡以YoloV3.cfg為例子,詳細配置過程見下面的《網路配置》)
c.
網路配置(以YoloV3.cfg為例)
a.進入defect/net目錄下,開啟YoloV3.cfg(建議使用notepad++開啟)
b.按下Ctrl+F搜尋關鍵字串"kaychan",會看到以下資訊(修改所有帶kaychan欄位的下一行的filters和classes)
[convolutional]
size=1
stride=1
pad=1
# {kaychan}filters = 3 * (4 + 1 + classes)(這裡只有一類face類,所以classes=1,filters=18,將filters改為18即可)
filters=24
activation=linear
[yolo]
mask = 6,7,8
anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326
# {kaychan}classes = your class number(這裡只有一類face類,所以classes=1,將classes改為1即可)
classes=3
num=9
jitter=.3
ignore_thresh = .7
truth_thresh = 1
random=0 # random欄位在視訊記憶體或者記憶體夠大的情況可以置為1,開啟多尺度,否則會溢位
c.修改以下這些引數以適應你自己的工程
[net]
# Testing
#batch=1
#subdivisions=1
# Training
batch=48 # 網路積累多少個樣本後進行一次BP
subdivisions=16 # 將一個batch的圖片分subdivisions次完成網路的前向傳播
width=416 # 網路輸入的寬(320/416/608可選)
height=416 # 網路輸入的高(320/416/608可選)
channels=3 # 影象的通道數
momentum=0.9 # 動量 DeepLearning中最優化方法中的動量引數 這個值影響著梯度下降到最優值得速度
decay=0.0005 # 權重衰減正則項,防止過擬合
angle=0 # 資料增強引數,通過旋轉角度來生成更多訓練樣本
saturation = 1.5 # 資料增強引數,通過調整飽和度來生成更多訓練樣本
exposure = 1.5 # 資料增強引數,通過調整曝光量來生成更多訓練樣本
hue=.1 # 資料增強引數,通過調整色調來生成更多訓練樣本
learning_rate=0.001 # 學習率
burn_in=1000 # 在迭代次數小於burn_in時,其學習率的更新有一種方式,大於burn_in時,才採用policy的更新方式
max_batches = 50000 # 最大迭代次數
policy=steps
steps=40000,45000 # steps和scale是設定學習率的變化
scales=.1,.1 # 迭代到40000次時,學習率衰減十倍,45000次迭代時,學習率又會在前一個學習率的基礎上衰減十倍
開始訓練
a.在darknet_train_tool目錄下雙擊quick_train.bat檔案開始訓練(按照提示進行操作)
b.Please input project name: 輸入你的工程名(這裡就是defect)
c.Please select train net: 選擇你的訓練網路(1:YoloV3 / 2:TinyYoloV3,選擇對應的編號即可,這裡選擇1:YoloV3)
d.Make darknet dataset[y/n]: 是否標註資料集(第一次訓練肯定是要製作資料集的或者新增新的圖片或者刪除不要的圖片都需要選y製作標註),標註方法可以參考《Darknet Yolo目標快速標註工具》,很簡單的就是標註你的目標。
e.Please select train processor[1:CPU / 2:GPU]: 選擇cpu或者gpu進行訓練(如果沒有nvidia-gpu就選擇cpu)
f.Use pre-trained model[y/n]: 是否使用預訓練模型(就是可以基於別的權重模型繼續訓練或者從新開始訓練)
g.Start train[y/n]: 是否開始訓練(按下'y'則開始訓練,前提是前面的配置正確了,每迭代5000次會在example/defect/model目錄下輸出權重模型,每100次更新last模型)
整個操作過程如下圖所示:
到此已經開始訓練了,此時會有一個訓練的loss圖,如下圖:
剛開始的loss值很高1000左右,經過漫長的訓練迭代,這邊迭代了30000次(元旦整整跑了3天3夜···,本PC的配置為:I78700+1050TI4G),loss值降到0.01左右(0.1以內效果都很不錯了),已經擬合了,可以拿模型去預測了,如下圖
先寫到這,mark···