1. 程式人生 > >YOLO v3 安裝並訓練自己資料

YOLO v3 安裝並訓練自己資料

1. 安裝

YOLO v3的安裝與YOLO v2的安裝方法一樣

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

直接使用上邊的命令下載YOLO安裝包。下載完以後,開啟進入到安裝包路徑內

cd darknet

如果機器有使用GPU加速的環境,以及安裝OPENCV了,需要做一下修改

gedit Makefile

使用gedit開啟編譯檔案,將檔案前幾行中,對應的GPU、CUDNN、OPENCV由0變為1;

GPU=1
CUDNN=1
OPENCV=1

對Makefile修改結束以後,就可以進行安裝。

make -j

2. 執行Demo

下載YOLO v3權重

wget https://pjreddie.com/media/files/yolov3.weights

執行Demo檢視執行是否成功。

  ./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg

訓練自己的資料集

2.1資料集準備

首先將自己的資料集生成為VOC資料集的格式,至少生成如下格式的資料夾

Annotations
ImageSets
       --Main
           --test.txt
           --train.txt
           --trainval.txt
--val.txt JPEGImages

接著將上邊四個資料夾放在/darknet/scripts/VOCdevkit/VOC2007內,這個資料夾需要自己來建立一個。接著對/darknet/scripts/voc_label.py進行修改。
第一處
修改第7行

 sets=[('2012', 'train'), ('2012', 'val'), ('2007', 'train'), ('2007', 'val'), ('2007', 'test')]

將“(‘2012’, ‘train’), (‘2012’, ‘val’),”刪除掉,改為

 sets=[('2007', 'train'
), ('2007', 'val'), ('2007', 'test')]

第二處
修改第9行

 classes = ["aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat", "chair", "cow", "diningtable", "dog", "horse", "motorbike", "person", "pottedplant", "sheep", "sofa", "train", "tvmonitor"]

修改為自己檢測目標類別名稱

完成修改以後可執行檔案,生成YOLO訓練時使用的labels

python voc_label.py

執行結束以後,可以在/darknet/scripts/VOCdevkit/VOC2007資料夾內看到labels資料夾,並且在/darknet/scripts資料夾內會生成2007_train.txt、2007_test.txt、2007_val.txt三個檔案。到此,資料準備完成。

2.2修改配置檔案

./darknet detector train cfg/voc.data cfg/yolo-voc.cfg darknet19_448.conv.23

上邊是進行訓練的命令,可以按照上邊的命令對檔案進行修改。

2.2.1修改cfg/voc.data

classes= 3               //修改為訓練分類的個數 
train  = /home/ws/darknet/scripts/2007_train.txt          //修改為資料階段生成的2007_train.txt檔案路徑
valid  = /home/ws/darknet/scripts/2007_val.txt           //修改為資料階段生成的2007_val.txt檔案路徑
names = data/voc.names
backup = backup

2.2.2修改data/voc.names

在上邊修改的檔案內有一個data/voc.names檔案,裡邊儲存目標分類的名稱,修改為自己類別的名稱即可。

2.2.3修改cfg/yolo-voc.cfg

第一處
檔案開頭的配置檔案可以按照下邊的說明進行修改

# Testing
#batch=1
#subdivisions=1
# Training
batch=64                //每次迭代要進行訓練的圖片數量 ,在一定範圍內,一般來說Batch_Size越大,其確定的下降方向越準,引起的訓練震盪越小。 
subdivisions=8          //原始碼中的圖片數量int imgs = net.batch * net.subdivisions * ngpus,按subdivisions大小分批進行訓練 
height=416              //輸入圖片高度,YOLO官網顯示最高的為608
width=416               //輸入圖片寬度
channels=3              //輸入圖片通道數
momentum=0.9            //衝量
decay=0.0005            //權值衰減
angle=0                 //圖片角度變化,單位為度,假如angle=5,就是生成新圖片的時候隨機旋轉-5~5度    
saturation = 1.5        //飽和度變化大小
exposure = 1.5          //曝光變化大小
hue=.1                  //色調變化範圍,tiny-yolo-voc.cfg中-0.1~0.1 
learning_rate=0.001     //學習率
burn_in=1000
max_batches = 120200    //訓練次數
policy=steps            //調整學習率的策略
steps=40000,80000       //根據batch_num調整學習率,若steps=100,25000,35000,則在迭代100次,25000次,35000次時學習率發生變化,該引數與policy中的steps對應
scales=.1,.1             //相對於當前學習率的變化比率,累計相乘,與steps中的引數個數保持一致;

注意:如果修改max_batches總的訓練次數,也需要對應修改steps,適當調整學習率。
具體的含義可以檢視YOLO網路中引數的解讀
第二處
修改107行最後一個卷積層中filters,按照filter=5*(classes+5)來進行修改。如果類目為3,則為5*(3+5)=40。

[convolutional]
size=1
stride=1
pad=1
filters=40      //計算公式為:filter=5*(classes+5) 
activation=linear

第三處
修改類別數,直接搜尋關鍵詞“classes”即可,全文就一個。

 classes=3    

2.3 訓練

./darknet detector train cfg/voc.data cfg/yolo-voc.cfg darknet19_448.conv.23 >> log.txt

2.3 訓練

輸入上邊的指令就可以進行訓練,在命令最後的命令>> log.txt是將輸出的日誌儲存到log.txt檔案內,這樣便於後期訓練結果的檢視。

3. 測試

3.1 單張影象測試

./darknet detect cfg/yolo-voc.cfg backup/yolo-voc_final.weights data/dog.jpg
./darknet detect [訓練cfg檔案路徑] [權重檔案路徑] [檢測圖片的路徑]

按照上邊的規整進行填寫即可。

3.2多張影象測試

由於博主能力有限,修改YOLO內部檔案失敗,只能使用shell寫命令來進行重複單張測試的命令

input_data_folder="./data/VOCdevkit/VOC2007/JPEGImages/"
output_data_folder="./results/CD8" 

file_name_tmp=`ls $input_data_folder`

file_names=($(echo $file_name_tmp));


for filename in ${file_names[@]}
do

  echo "testing $file ..."
  ./darknet detector test cfg/inst25.data cfg/yolo-voc.cfg backup/yolo-voc_final.weights $input_data_folder$filename -thresh .3 -gpu 0,1 >> result.txt

mv predictions.png ./results/CD8_final_thresh_0.3/$filename'.png'

done

修改相應自己儲存圖片的路徑就可以進行測試 。

3.3 測試資料集測試mAP、recall等引數

./darknet detector valid cfg/voc.data cfg/voc.cfg backup/voc_final.weights -out result_ -gpu 0 -thresh .5
./darknet detector valid [data路徑] [cfg路徑] [權重檔案路徑] -out [生成txt檔案字首] -gpu [GPUID號] -thresh [門限的大小]

按照上邊的規則對測試資料集進行測試,會在result資料夾內生成相應的相應檢測結果的檔案。
下邊藉助Faster R-CNN中voc_eval.py檔案進行引數測試。

from voc_eval import voc_eval

rec, prec, ap, fp, tp, nobj = voc_eval('/home/app/darknet/results/result_ {}.txt', '/home/app/darknet/scripts/VOCdevkit/VOC2007/Annotations/{}.xml',
                  '/home/app/darknet/scripts/VOCdevkit/VOC2007/ImageSets/Main/test.txt', 'Target1', '.')
print("class name: " + classname)
print("Average Precision: " + str(ap))
print("True Positive: " + str(tp))
print("False Positive: " + str(fp))

首先將上邊的命令新建一個python檔案,同時將Faster R-CNN中voc_eval.py檔案放在一個資料夾內,這個檔案可以能在Github中不能找到,可以去CSDN下載。

參考