yolov3(一:模型訓練)

第一部分:訓練已有的voc datasets 搞清楚該算法的模型訓練流程

Darknet是Joseph維護的開源的神經網絡框架,使用C語言編寫:https://pjreddie.com/darknet/yolo/

Darknet快速,易於安裝,同時支持CPU和GPU計算:項目源碼可以在github :https://github.com/pjreddie/darknet

1 初步使用darknet進行預測

1.1 安裝框架

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

 

1.2 測試

使用YOLO提供的模型利用darknet進行預測,在如下地址下載yolov3.weights的權重文件(模型)

wget https://pjreddie.com/media/files/yolov3.weights
#執行
./darknet detect cfg/yolov3.cfg yolov3.weights data/person.jpg

1.3 改變檢測閾值

YOLO只會把置信度超過0.5的對象定位出來,你可以修改這一閾值。執行命令的時候指定-thresh參數即可:

./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg -thresh 0.5

上面的設置是:即使置信度是0.5也將目標顯示定位出來 。

1.4 配置GPU

程序跑通之後,需要了解一些基本的配置
打開makefile可以看到如下內容(在這之前,要安裝anaconda並配置環境)

GPU=1
CUDNN=1
OPENCV=0
OPENMP=0
DEBUG=0
......

如果想要指定使用哪塊顯卡,你可以在命令行中附加參數-i用阿里指定你想使用的顯卡序號,例如:

./darknet -i 1 imagenet test cfg/alexnet.cfg alexnet.weights

你也可以使用CUDA進行編譯,使用CPU進行計算,使用-nogpu參數即可:

./darknet -nogpu imagenet test cfg/alexnet.cfg alexnet.weights

2 對YOLO訓練VOC數據集

這裏可以探索一下如何使用YOLO訓練其他數據集

2.1 下載數據

wget https://pjreddie.com/media/files/VOCtrainval_11-May-2012.tar
wget https://pjreddie.com/media/files/VOCtrainval_06-Nov-2007.tar
wget https://pjreddie.com/media/files/VOCtest_06-Nov-2007.tar
tar xf VOCtrainval_11-May-2012.tar
tar xf VOCtrainval_06-Nov-2007.tar
tar xf VOCtest_06-Nov-2007.tar

上面的數據下載到一起後,解壓會同時存在與VOCdevkit/目錄

2.2 生成VOC數據集的標籤

VOCdevkit的目錄結構大致如下

drwxrwxrwx 2 root root 266240 Nov  6  2007 Annotations
drwxrwxrwx 5 root root   4096 Nov  6  2007 ImageSets
drwxrwxrwx 2 root root 274432 Nov  6  2007 JPEGImages
drwxrwxrwx 2 root root  20480 Nov  6  2007 SegmentationClass
drwxrwxrwx 2 root root  20480 Nov  6  2007 SegmentationObject
drwxr-xr-x 2 root root 274432 Jan  8 04:30 labels

xml文件作爲標籤是很繁瑣和複雜,在VOCdevkit  同級目錄下運行 python腳本,下面運行官方提供的腳本生成指定格式的label文件。

wget https://pjreddie.com/media/files/voc_label.py
python voc_label.py

根據每張圖片對應的xml文件,會分別在VOCdevkit/VOC2007/labels/VOCdevkit/VOC2012/labels/位置生成對應於每張圖片的.txt文件,作爲圖片的標籤,例如 

16 0.437 0.764 0.446 0.466666666667
# 符合如下形式
<object-class> <x> <y> <width> <height>

object-class代表類別,x\y\width\height代表圖片的相對位置和高寬。
根目錄下面則多了幾個txt文件: 

這些txt文件彙總了所需訓練或者驗證的圖片的絕對路徑,後面訓練的時候需要用到
合併這些訓練集:

cat 2007_train.txt 2007_val.txt 2012_*.txt > train.txt

2.3 修改訓練的配置和下載預訓練權重

打開cfg/voc.data文件修改訓練集和測試集文件的路徑

classes= 20
train  = /root/yolo/darknet/vocdata/train.txt
valid  = /root/yolo/darknet/vocdata/2007_test.txt
names = data/voc.names
backup = backup

然後下載預訓練權重

wget https://pjreddie.com/media/files/darknet53.conv.74

2.4 訓練VOC模型 

./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74   2>1 | tee visualization/train_yolov3.log 

./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74 -gpus 0,1,2,3

# visualization 訓練過程可視化

./darknet detector train ./cfg/voc.data ./cfg/yolov3-voc.cfg darknet53.conv.74 2>1 | tee visualization/train_yolov3.log

2.4.1 訓練過程 train_yolov3.log 可視化 

python3 extract_log.py
python3 visualization_loss.py
python3 visualization_iou.py
#!/usr/bin/python
#coding=utf-8
#該文件用於提取訓練log,去除不可解析的log後使log文件格式化,生成新的log文件供可視化工具繪圖
import inspect
import os
import random
import sys
def extract_log(log_file, new_log_file, key_word):
    with open(log_file, 'r') as f:
        with open(new_log_file, 'w') as train_log:
            for line in f:
                #去除多GPU的同步log;去除除零錯誤的log
                if ('Syncing' in line) or ('nan' in line):
                    continue
                if key_word in line:
                    train_log.write(line)
    f.close()
    train_log.close()
 
extract_log('./2048/train_log2.txt', './2048/log_loss2.txt', 'images')
extract_log('./2048/train_log2.txt', 'log_iou2.txt', 'IOU')
#!/usr/bin/python
#coding=utf-8
 
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
 
 
#根據自己的log_loss.txt中的行數修改lines, 修改訓練時的迭代起始次數(start_ite)和結束次數(end_ite)。
lines = 4500
start_ite = 6000 #log_loss.txt裏面的最小迭代次數
end_ite = 15000 #log_loss.txt裏面的最大迭代次數
step = 10 #跳行數,決定畫圖的稠密程度
igore = 0 #當開始的loss較大時,你需要忽略前igore次迭代,注意這裏是迭代次數
 
 
y_ticks = [0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4]#縱座標的值,可以自己設置。
data_path =  '2048/log_loss2.txt' #log_loss的路徑。
result_path = './2048/avg_loss' #保存結果的路徑。
 
####-----------------只需要改上面的,下面的可以不改動
names = ['loss', 'avg', 'rate', 'seconds', 'images']
result = pd.read_csv(data_path, skiprows=[x for x in range(lines) if (x<lines*1.0/((end_ite - start_ite)*1.0)*igore or x%step!=9)], error_bad_lines=\
False, names=names)
result.head()
for name in names:
    result[name] = result[name].str.split(' ').str.get(1)
 
result.head()
result.tail()
 
for name in names:
    result[name] = pd.to_numeric(result[name])
result.dtypes
print(result['avg'].values)
 
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
 
 
###-----------設置橫座標的值。
x_num = len(result['avg'].values)
tmp = (end_ite-start_ite - igore)/(x_num*1.0)
x = []
for i in range(x_num):
	x.append(i*tmp + start_ite + igore)
#print(x)
print('total = %d\n' %x_num)
print('start = %d, end = %d\n' %(x[0], x[-1]))
###----------
 
 
ax.plot(x, result['avg'].values, label='avg_loss')
#ax.plot(result['loss'].values, label='loss')
plt.yticks(y_ticks)#如果不想自己設置縱座標,可以註釋掉。
plt.grid()
ax.legend(loc = 'best')
ax.set_title('The loss curves')
ax.set_xlabel('batches')
fig.savefig(result_path)
#fig.savefig('loss')

訓練完成後權重保存在 backup 文件夾內,依據訓練情況可手動停止訓練
-gpu 0可指定 GPU 訓練, -gpus 0,1,2,3 可指定多 GPU訓練

2.4.2 訓練參數詳解

Avg IOU:當前迭代中,預測的box與標註的box的平均交併比,越大越好,期望數值爲1;
Class: 標註物體的分類準確率,越大越好,期望數值爲1;
obj: 越大越好,期望數值爲1;
No obj: 越小越好;
.5R: 以IOU=0.5爲閾值時候的recall; recall = 檢出的正樣本/實際的正樣本
0.75R: 以IOU=0.75爲閾值時候的recall;
count:正樣本數目。 

1: 1452.927612, 1452.927612 avg, 0.000000 rate, 1.877576 seconds, 32 images
第幾批次,總損失,平均損失,當前學習率,當前批次訓練時間,目前爲止參與訓練的圖片總數
1: 指示當前訓練的迭代次數
1452.927612: 是總體的Loss(損失)

結果:

50200: -nan, nan avg, 0.000010 rate, 0.083617 seconds, 50200 images
Saving weights to backup/yolov3-voc.backup
Saving weights to backup/yolov3-voc_final.weights

3. 測試 

./darknet detector test ./cfg/voc.data ./cfg/yolov3-voc.cfg ./backup/yolov3-voc_30000.weights ./data/test.jpg

./darknet detector demo ../cfg/voc.data ./cfg/yolov3-voc.cfg ./backup/yolov3-voc_30000.weights ./data/test.mp4

 

第二部分:根據所需要數據訓練更有針對性的模型

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章