一、配置yolo v3
參考yolo v3官網https://pjreddie.com/darknet/yolo/
下載darknet后進行編譯:
git clone https://github.com/pjreddie/darknet cd darknet make
下載預訓練權重文件:
wget https://pjreddie.com/media/files/yolov3.weights
接下來測試一下:測試data/dog.jpg圖片的結果,如果能夠正確識別,則說明配置成功。
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
官網給出的是CPU版本的編譯,如果需要使用GPU,則需要修改makefile的前幾行:
GPU=1 CUDNN=1 OPENCV=0 OPENMP=0 DEBUG=0
二、准備及標注自己的數據集
用LabelImg工具標注自己的數據集,github:
git clone https://github.com/tzutalin/labelImg
接着安裝依賴的工具:
sudo apt-get install pyqt4-dev-tools # 安裝PyQt4 sudo pip install lxml # 安裝lxml,如果報錯,可以試試下面語句 sudo apt-get install python-lxml
打開終端,進入LabelImg目錄后使用make編譯
cd LabelImg make all
編譯成功后,即可在LabelImg文件夾中運行
python labelImg.py
注意:保存的標注文件有兩種:.txt和.xml。我用的是.txt。voc_label.py腳本可以將.xml文件轉化成.txt文件。位置:.\darknet\scripts\
voc_label.py
三、搭建yolo框架
在darknet文件夾下新建project_yolov3文件夾,作為自己的訓練數據集及配置文件的存放地,避免與已有的一些東西混在一起。
在project_yolov3文件夾下新建如下文件夾,結構如下:
backup
cfg yolov3-tiny.cfg
.data
data .names
images
label
backup用於存放訓練時返回的模型及權重文件;
cfg中從.\darknet\cfg中根據需要復制配置文件(我用的是yolov3-tiny.cfg),從.\darknet\cfg中復制voc.data文件修改名稱為.data,根據自己的目錄以及類別等修改里面相關內容。.cfg修改:首先是訓練,所以訓練的batch和subdivisions不要注釋掉(可以根據電腦配置啥的修改這兩個參數
),而測試的要注釋掉。修改filters(每一個yolo層的上一層的filters參數要改,其他的filters不需要改),修改后等於(類別數目+5)×3,修改每一個yolo層的classes類別數。另外還有一些參數可以修改,參考官網即可。
data中首先從.\darknet\data中復制voc.names並修改名稱為.names,然后按照自己的類別將類別名一行一行寫入;
data\images下存放所有圖片;
data\label文件夾存放所有標注文件(.txt);
在data文件夾下新建一個my.sh文件,用於生成train.txt和test.txt,這兩個txt文件記錄訓練和測試圖片的路徑。
將my.sh放到對應的圖片集所在的文件夾中。
執行
sh my.sh
在生成的txt文件中,刪除my.sh那一條記錄就行。(因為這里用的是取這個腳本所在的路徑,再加上文件名輸出的,這樣就是絕對路徑了,所以要將.sh文件放到相應的文件夾中去。)
my.sh:
#!/bin/sh #============ get the file name =========== echo -e "請輸入你要讀取的文件夾路徑\n當前路徑為${PWD}" read InputDir echo "你輸入的文件夾路徑為${InputDir}" echo -e "請輸入你要將數據輸出保存的文件路徑\n當前路徑為${PWD}" read OutputFile echo "輸出保存的文件路徑為${OutputFile}" : > $OutputFile #清空OutputFile #循環讀取文件夾名 for file_a in ${InputDir}/*; do temp_file=`basename $file_a` #echo $temp_file >> $OutputFile echo `pwd`/$temp_file >> $OutputFile done
train.txt和test.txt的每一行是一張圖片的絕對路徑,內容示例:
四、訓練
下載預訓練模型:
wget https://pjreddie.com/media/files/darknet53.conv.74
最后開始訓練:
./darknet detector train /media/taoting/4014F4A914F4A358/darknet/project_yolov3/cfg/.data /media/taoting/4014F4A914F4A358/darknet/project_yolov3/cfg/yolov3-tiny.cfg darknet53.conv.74 2>&1 | tee /media/taoting/4014F4A914F4A358/darknet/project_yolov3/visualization/train_yolov3.log
命令中路徑自行修改,其中2>&1 | tee /media/taoting/4014F4A914F4A358/darknet/project_yolov3/visualization/train_yolov3.log是保存訓練的日志到文件。
注意:
1.
訓練時默認是前1000次時,每100次保存一次模型,大於1000次時每10000次才保存一次模型。修改方式:找到./darknet/examples里面的detector.c,第149行修改就行。
2.
訓練可以中斷,中斷后只要從最后一次保存的模型那里繼續開始訓練就好。在darknet文件夾下打開終端,重新編譯:
make clean
make
如:
./darknet detector train /media/taoting/4014F4A914F4A358/darknet/project_yolov3/cfg/.data /media/taoting/4014F4A914F4A358/darknet/project_yolov3/cfg/yolov3-tiny.cfg /media/taoting/4014F4A914F4A358/darknet/project_yolov3/backup/yolov3-tiny_5900.weights
3.
所有路徑(特別是圖片的路徑和圖片名最好是英文的,不然很容易訓練自動終止)
訓練參數滿意了之后就可以停止訓練,進行測試了。
五、測試
先將cfg文件里修改到測試模式,保存后,重新編譯,再測試圖片。
修改要輸出的參數的方法:./src/image.c里的第287~300行;
將置信度在類別標簽后顯示的方法:./src/image.c里的第246~257行加上有注釋的那4行
char possible[10];//存放檢測的置信度 for(j = 0; j < classes; ++j){ sprintf(possible,"%.2f",dets[i].prob[j]);//置信度截取小數點后兩位 if (dets[i].prob[j] > thresh){ if (class < 0) { strcat(labelstr, names[j]); strcat(labelstr, possible);//標簽中加入置信度 class = j; } else { strcat(labelstr, ", "); strcat(labelstr, names[j]); strcat(labelstr, possible);//標簽中加入置信度 } printf("%s: %.0f%%\n", names[j], dets[i].prob[j]*100); } }
測試命令示例:這些命令也可以寫相對路徑
./darknet detector test /media/taoting/4014F4A914F4A358/darknet/project_yolov3/cfg/.data /media/taoting/4014F4A914F4A358/darknet/project_yolov3/cfg/yolov3-tiny.cfg /media/taoting/4014F4A914F4A358/darknet/project_yolov3/backup/yolov3-tiny_6000.weights 20181007_234258.jpg
(https://blog.csdn.net/gusui7202/article/details/83781719) 這篇博客中有批量測試圖片的方法