yolov3(一:模型训练)
第一部分:訓(xùn)練已有的voc datasets 搞清楚該算法的模型訓(xùn)練流程
Darknet是Joseph維護(hù)的開(kāi)源的神經(jīng)網(wǎng)絡(luò)框架,使用C語(yǔ)言編寫:https://pjreddie.com/darknet/yolo/
Darknet快速,易于安裝,同時(shí)支持CPU和GPU計(jì)算:項(xiàng)目源碼可以在github :https://github.com/pjreddie/darknet
1 初步使用darknet進(jìn)行預(yù)測(cè)
1.1 安裝框架
git clone https://github.com/pjreddie/darknet.git
cd darknet
make
?
1.2 測(cè)試
使用YOLO提供的模型利用darknet進(jìn)行預(yù)測(cè),在如下地址下載yolov3.weights的權(quán)重文件(模型)
wget https://pjreddie.com/media/files/yolov3.weights
#執(zhí)行
./darknet detect cfg/yolov3.cfg yolov3.weights data/person.jpg
1.3 改變檢測(cè)閾值
YOLO只會(huì)把置信度超過(guò)0.5的對(duì)象定位出來(lái),你可以修改這一閾值。執(zhí)行命令的時(shí)候指定-thresh參數(shù)即可:
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg -thresh 0.5
上面的設(shè)置是:即使置信度是0.5也將目標(biāo)顯示定位出來(lái)?。
1.4 配置GPU
程序跑通之后,需要了解一些基本的配置
打開(kāi)makefile可以看到如下內(nèi)容(在這之前,要安裝anaconda并配置環(huán)境)
GPU=1
CUDNN=1
OPENCV=0
OPENMP=0
DEBUG=0
......
如果想要指定使用哪塊顯卡,你可以在命令行中附加參數(shù)-i用阿里指定你想使用的顯卡序號(hào),例如:
./darknet -i 1 imagenet test cfg/alexnet.cfg alexnet.weights
你也可以使用CUDA進(jìn)行編譯,使用CPU進(jìn)行計(jì)算,使用-nogpu參數(shù)即可:
./darknet -nogpu imagenet test cfg/alexnet.cfg alexnet.weights
2 對(duì)YOLO訓(xùn)練VOC數(shù)據(jù)集
這里可以探索一下如何使用YOLO訓(xùn)練其他數(shù)據(jù)集
2.1 下載數(shù)據(jù)
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
上面的數(shù)據(jù)下載到一起后,解壓會(huì)同時(shí)存在與VOCdevkit/目錄
2.2 生成VOC數(shù)據(jù)集的標(biāo)簽
VOCdevkit的目錄結(jié)構(gòu)大致如下
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文件作為標(biāo)簽是很繁瑣和復(fù)雜,在VOCdevkit? 同級(jí)目錄下運(yùn)行 python腳本,下面運(yùn)行官方提供的腳本生成指定格式的label文件。
wget https://pjreddie.com/media/files/voc_label.py
python voc_label.py
根據(jù)每張圖片對(duì)應(yīng)的xml文件,會(huì)分別在VOCdevkit/VOC2007/labels/和VOCdevkit/VOC2012/labels/位置生成對(duì)應(yīng)于每張圖片的.txt文件,作為圖片的標(biāo)簽,例如?
16 0.437 0.764 0.446 0.466666666667
# 符合如下形式
<object-class> <x> <y> <width> <height>
object-class代表類別,x\y\width\height代表圖片的相對(duì)位置和高寬。
根目錄下面則多了幾個(gè)txt文件:?
這些txt文件匯總了所需訓(xùn)練或者驗(yàn)證的圖片的絕對(duì)路徑,后面訓(xùn)練的時(shí)候需要用到
合并這些訓(xùn)練集:
cat 2007_train.txt 2007_val.txt 2012_*.txt > train.txt
2.3 修改訓(xùn)練的配置和下載預(yù)訓(xùn)練權(quán)重
打開(kāi)cfg/voc.data文件修改訓(xùn)練集和測(cè)試集文件的路徑
classes= 20
train = /root/yolo/darknet/vocdata/train.txt
valid = /root/yolo/darknet/vocdata/2007_test.txt
names = data/voc.names
backup = backup
然后下載預(yù)訓(xùn)練權(quán)重
wget https://pjreddie.com/media/files/darknet53.conv.74
2.4 訓(xùn)練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 訓(xùn)練過(guò)程可視化./darknet detector train ./cfg/voc.data ./cfg/yolov3-voc.cfg darknet53.conv.74 2>1 | tee visualization/train_yolov3.log
2.4.1 訓(xùn)練過(guò)程 train_yolov3.log 可視化?
python3 extract_log.py
python3 visualization_loss.py
python3 visualization_iou.py
#!/usr/bin/python
#coding=utf-8
#該文件用于提取訓(xùn)練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;去除除零錯(cuò)誤的logif ('Syncing' in line) or ('nan' in line):continueif 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-8import pandas as pd
import numpy as np
import matplotlib.pyplot as plt#根據(jù)自己的log_loss.txt中的行數(shù)修改lines, 修改訓(xùn)練時(shí)的迭代起始次數(shù)(start_ite)和結(jié)束次數(shù)(end_ite)。
lines = 4500
start_ite = 6000 #log_loss.txt里面的最小迭代次數(shù)
end_ite = 15000 #log_loss.txt里面的最大迭代次數(shù)
step = 10 #跳行數(shù),決定畫(huà)圖的稠密程度
igore = 0 #當(dāng)開(kāi)始的loss較大時(shí),你需要忽略前igore次迭代,注意這里是迭代次數(shù)y_ticks = [0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4]#縱坐標(biāo)的值,可以自己設(shè)置。
data_path = '2048/log_loss2.txt' #log_loss的路徑。
result_path = './2048/avg_loss' #保存結(jié)果的路徑。####-----------------只需要改上面的,下面的可以不改動(dòng)
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)###-----------設(shè)置橫坐標(biāo)的值。
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)#如果不想自己設(shè)置縱坐標(biāo),可以注釋掉。
plt.grid()
ax.legend(loc = 'best')
ax.set_title('The loss curves')
ax.set_xlabel('batches')
fig.savefig(result_path)
#fig.savefig('loss')
訓(xùn)練完成后權(quán)重保存在 backup 文件夾內(nèi),依據(jù)訓(xùn)練情況可手動(dòng)停止訓(xùn)練
-gpu 0可指定 GPU 訓(xùn)練, -gpus 0,1,2,3 可指定多 GPU訓(xùn)練
2.4.2 訓(xùn)練參數(shù)詳解
Avg IOU:當(dāng)前迭代中,預(yù)測(cè)的box與標(biāo)注的box的平均交并比,越大越好,期望數(shù)值為1;
Class: 標(biāo)注物體的分類準(zhǔn)確率,越大越好,期望數(shù)值為1;
obj: 越大越好,期望數(shù)值為1;
No obj: 越小越好;
.5R: 以IOU=0.5為閾值時(shí)候的recall; recall = 檢出的正樣本/實(shí)際的正樣本
0.75R: 以IOU=0.75為閾值時(shí)候的recall;
count:正樣本數(shù)目。 1: 1452.927612, 1452.927612 avg, 0.000000 rate, 1.877576 seconds, 32 images
第幾批次,總損失,平均損失,當(dāng)前學(xué)習(xí)率,當(dāng)前批次訓(xùn)練時(shí)間,目前為止參與訓(xùn)練的圖片總數(shù)
1: 指示當(dāng)前訓(xùn)練的迭代次數(shù)
1452.927612: 是總體的Loss(損失)
結(jié)果:
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. 測(cè)試?
./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
?
第二部分:根據(jù)所需要數(shù)據(jù)訓(xùn)練更有針對(duì)性的模型
?
總結(jié)
以上是生活随笔為你收集整理的yolov3(一:模型训练)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python-opencv 轮廓检测
- 下一篇: SLAM之特征匹配(三)————RANS