Ubuntu16.04中用yolov3訓練自己的數據集


一、配置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)    這篇博客中有批量測試圖片的方法


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM