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 [GPU的ID號] -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下載。