1. 程式人生 > >YOLOv3訓練自己的資料(GPU版本)

YOLOv3訓練自己的資料(GPU版本)

1、下載工程

兩種方式:

1.1 通過git克隆

    git clone https://github.com/pjreddie/darknet.git

1.2 到GitHub上直接下載

    有時候伺服器上內網限制,克隆不下來,不知道原因是啥,有可能是公司內網限制了,本人通過這種方式下載的工程

2、編譯工程

    解壓工程

    改配置檔案:

    我想要GPU支援的版本,所以在編譯工程前需要先修改Makefile檔案,根據自己需求改,GPU版本的將GPU=1,CUDNN = 1, OPENCV=1,我的OPENCV是設成0的,因為我的環境沒有opencv。

CPU版本的設定成GPU=0

編譯:    

cd darknet-master/

make

如果遇到缺失包報錯,將缺失的包裝上去以後重新編譯,重複下列兩個操作,直到所有包都裝好,

make clean

make

 最終成功的訊號,編譯後出現下列資訊(從官網上覆制的,我自己的介面沒儲存下來)

mkdir -p obj
gcc -I/usr/local/cuda/include/  -Wall -Wfatal-errors  -Ofast....
gcc -I/usr/local/cuda/include/  -Wall -Wfatal-errors  -Ofast....
gcc -I/usr/local/cuda/include/  -Wall -Wfatal-errors  -Ofast....
.....
gcc -I/usr/local/cuda/include/  -Wall -Wfatal-errors  -Ofast -lm.... 

3、準備資料

第一步:labels製作

    yolov2的資料分為兩部分:labels 資料夾和圖片資料夾,labels裡存放的是對應圖片的目標資訊,一張圖片對應一個.txt目標資訊檔案。labels資料夾和圖片資料夾必須放在同一目錄下。

    但是我發現yolov3好像略有不同,每張圖片的labels檔案必須和圖片放在同一目錄下。像下圖這樣。(至少我是隻有這樣存放才成功跑起來,還有沒有其他辦法不確定)

   標註檔案.txt裡的資料格式是這樣的:

具體的每一個值的計算方式是這樣的:假設一個標註的boundingbox的左下角和右上角座標分別為(x1,y1)(x2,y2),影象的寬和高分別為w,h

歸一化的中心點x座標計算公式:((x2+x1) / 2.0)/ w

歸一化的中心點y座標計算公式:((y2+y1) / 2.0)/ h

歸一化的目標框寬度的計算公式: (x2-x1) / w

歸一化的目標框高度計算公式:((y2-y1)/ h

如果圖片的高度、寬度未知,可以通過cv2讀取。

imginfo = cv2.imread(img_dir + img_name + '.jpg').shape

imginfo裡存的是影象的[h, w,通道數] ,這一需要注意imginfo結果裡的順序

第二步:

劃分訓練資料和測試資料:

我將標註資料集裡的80%作為訓練資料集,20%作為驗證資料集

分別將它們的圖片的路徑存放到train.txt和val.txt檔案中,這兩個檔案的路徑沒有嚴格要求,放在任意自己覺得舒服的位置,後面在工程的.data檔案中指定這兩個檔案的路徑就好。

裡面的格式如下所示,每行存放一張圖片的絕對路徑,為了安全可見,我圖片的絕對路徑中間一部分我馬賽克了

4、編輯cfg/XX.data 檔案(XX按自己的需求自取名字),在訓練時工程來這個檔案中找到訓練資料和驗證資料的路徑

classes= 1
train  = <path-to-voc>/train.txt
valid  = <path-to-voc>2007_test.txt
names = data/voc.names
backup = backup

classes:類別數

train:前面說的訓練資料train.txt的路徑

valid:前面說的驗證資料val.txt的路徑

names:指向存放類別名的檔案,自己訓練資料的類別名就放到這個指定的檔案中,自己新建一個.names檔案,一行放一個類名

backu:模型存放的路徑

5、更改模型的引數配置檔案

    如果是訓練模型需要修改下列這些地方:

    1)把Training的引數設定開啟,Testing的引數設定關閉

                                                                                                                               

   2)改所有yolo層前一層filters大小,即最後一層卷積層,計算公式在論文中有提到過,N為卷積核的size(不確定),3是mask的引數,4表示四個引數(預測boundingbox的:x,y,w,h),1表示置信度

我有一個類別,size為1,所以:1*1*[3*(4+1+1)]=18

3)改yolo層的classes數

2)、3)總的需要改3的地方

5、跑模型

我認為應該像這樣啟動訓練過程,但是報錯

 ./darknet detector train cfg/dog.data cfg/dog.cfg backup/dog.backup -gpu 0

只有不指定模型存放路徑和模型名字才不報錯,能跑起來,

./darknet detector train cfg/pigface_front.data cfg/pigface_front.cfg

即使跑起來,後面還是遇到了其他問題,繼續解決中

。。。。。還在努力中

6、踩到的坑