【darknet速成】Darknet图像分类从模型自定义到测试
歡迎來(lái)到專欄《2小時(shí)玩轉(zhuǎn)開源框架系列》,這是我們第12篇文章,前面已經(jīng)說(shuō)過(guò)了caffe,tensorflow,pytorch,mxnet,keras,paddlepaddle,cntk,chainer,deeplearning4j,matconvnet,lasagne。
今天說(shuō)darknet,也是最后一個(gè)框架了,本文所用到的數(shù)據(jù),代碼請(qǐng)參考我們官方git
https://github.com/longpeng2008/LongPeng_ML_Course
作者&編輯 | 言有三
?
1 Darknet是什么
首先不得不夸獎(jiǎng)一下Darknet的主頁(yè)風(fēng)格不錯(cuò)。
官網(wǎng)地址:https://pjreddie.com/darknet/
GitHub: https://github.com/pjreddie/darknet
Darknet本身是Joseph Redmon為了Yolo系列開發(fā)的框架。
Joseph Redmon,一個(gè)從look once,到look Better, Faster, Stronger,到An Incremental Improvement,也就是從Yolo v1,干到Y(jié)olo v2,Yolo v3的男人,頭像很應(yīng)景。
Darknet幾乎沒有依賴庫(kù),是從C和CUDA開始撰寫的深度學(xué)習(xí)開源框架,支持CPU和GPU。
咱們的第一個(gè)開源框架說(shuō)的是Caffe,現(xiàn)在這最后一個(gè)Darknet跟caffe倒是頗有幾分相似之處,只是更加輕量級(jí)。
?
2 Darknet結(jié)構(gòu)解讀
首先我們看下Darknet的代碼結(jié)構(gòu)如下:
cfg,data,examples,include,python,src,scripts幾個(gè)子目錄。
2.1 data目錄
以上就是data目錄的內(nèi)容,包含了各種各樣的文件。圖片就是測(cè)試文件了,不必說(shuō)。我們首先看看imagenet.labels.list和imagenet.shortnames.list里面是什么。
imagenet.labels.list是:
n02120505
n02104365
n02086079
n02101556
·············
看得出來(lái)就是imagenet的類別代號(hào),與之對(duì)應(yīng)的imagenet.shortnames.list里是:
kit fox? ?
English setter? ?
Siberian husky? ?
Australian terrier? ?
·············
可知這兩個(gè)文件配套存儲(chǔ)了imagenet1000的類別信息。
接著看9k.labels,9names,9k.trees,里面存儲(chǔ)的就是Yolo9000論文中對(duì)應(yīng)的9418個(gè)類別了。coco.names,openimages.names,voc.names都類似。
2.2 cfg目錄
cfg,下面包含兩類文件,一個(gè)是.data,一個(gè)是.cfg文件。我們打開imagenet1k.data文件看下,可知它配置的就是訓(xùn)練數(shù)據(jù)集的信息:
classes=1000 ##分類類別數(shù)
train? = /data/imagenet/imagenet1k.train.list ##訓(xùn)練文件
valid? = /data/imagenet/imagenet1k.valid.list ##測(cè)試文件
backup = /home/pjreddie/backup/ ##訓(xùn)練結(jié)果保存文件夾
labels = data/imagenet.labels.list #標(biāo)簽
names? = data/imagenet.shortnames.list
top=5
另一類就是.cfg文件,我們打開cifar.cfg文件查看。
##---------1 優(yōu)化參數(shù)配置---------##
[net]
batch=128
subdivisions=1
height=28
width=28
channels=3
max_crop=32
min_crop=32
##數(shù)據(jù)增強(qiáng)參數(shù)
hue=.1
saturation=.75
exposure=.75
##學(xué)習(xí)率策略
learning_rate=0.4
policy=poly
power=4
max_batches = 5000 ##迭代次數(shù)
momentum=0.9 ##動(dòng)量項(xiàng)
decay=0.0005 ##正則項(xiàng)
##---------2 網(wǎng)絡(luò)參數(shù)配置---------##
[convolutional]
batch_normalize=1? ##是否使用batch_normalization
filters=128
size=3
stride=1
pad=1
activation=leaky ##激活函數(shù)
[convolutional]
batch_normalize=1
filters=128
size=3
stride=1
pad=1
activation=leaky
[convolutional]
batch_normalize=1
filters=128
size=3
stride=1
pad=1
activation=leaky
[maxpool]
size=2
stride=2
[dropout]
probability=.5
[convolutional]
batch_normalize=1
filters=256
size=3
stride=1
pad=1
activation=leaky
[convolutional]
batch_normalize=1
filters=256
size=3
stride=1
pad=1
activation=leaky
[convolutional]
batch_normalize=1
filters=256
size=3
stride=1
pad=1
activation=leaky
[maxpool]
size=2
stride=2
[dropout]
probability=.5
[convolutional]
batch_normalize=1
filters=512
size=3
stride=1
pad=1
activation=leaky
[convolutional]
batch_normalize=1
filters=512
size=3
stride=1
pad=1
activation=leaky
[convolutional]
batch_normalize=1
filters=512
size=3
stride=1
pad=1
activation=leaky
[dropout]
probability=.5
[convolutional]
filters=10
size=1
stride=1
pad=1
activation=leaky
[avgpool]
[softmax]
groups=1
包含兩部分,第一部分就是優(yōu)化參數(shù)的定義,類似于caffe的solver.prototxt文件。第二部分就是網(wǎng)絡(luò)定義,類似于caffe的train.prototxt文件,不同的是網(wǎng)絡(luò)層用[]來(lái)聲明,batch normalization以及激活函數(shù)等配置進(jìn)了[convolutional]里面。
最后的avgpool不需要配置池化半徑,softmax不需要配置輸入輸出,在最后設(shè)置group參數(shù)。
你可能好奇,那殘差網(wǎng)絡(luò)怎么弄呢?
[shortcut]? ?
activation=leaky? ?
from=-3? ?
如上,通過(guò)一個(gè)from=-3參數(shù)來(lái)進(jìn)行配置,就是往后退3個(gè)block的意思了。
2.3 python目錄
下面只有兩個(gè)文件,即darknet.py和proverbot.py。前者就是python調(diào)用yolo模型的案例,后者沒什么用。
2.4 include,src,examples目錄
include和src就是具體的函數(shù)實(shí)現(xiàn)了,卷積等各類操作都在這里。examples就是高層任務(wù)的定義,包括classifier,detector,代碼的解讀就超過(guò)本文的內(nèi)容了,以后詳解。
?
3 數(shù)據(jù)準(zhǔn)備和模型定義
3.1 數(shù)據(jù)準(zhǔn)備
前面已經(jīng)把該介紹的都介紹了,下面就開始準(zhǔn)備數(shù)據(jù)進(jìn)行訓(xùn)練。跟caffe一樣,數(shù)據(jù)準(zhǔn)備的流程非常簡(jiǎn)單。
首先,在data目錄下建立我們自己的任務(wù),按照如下目錄,把文件準(zhǔn)備好
├── genedata.sh
├── labels.txt
├── test
├── test.list
├── train
└── train.list
使用如下命令生成文件
find `pwd`/train -name \*.jpg > train.list
find `pwd`/test -name \*.jpg > test.list
其中每一行都存儲(chǔ)一個(gè)文件,而標(biāo)簽是通過(guò)后綴獲得的。
/Users/longpeng/Desktop/darknet/data/mouth/train/60_smile.jpg
/Users/longpeng/Desktop/darknet/data/mouth/train/201_smile.jpg
/Users/longpeng/Desktop/darknet/data/mouth/train/35_neutral.jpg
/Users/longpeng/Desktop/darknet/data/mouth/train/492_smile.jpg
標(biāo)簽的內(nèi)容存在labels.txt里面,如下
neutral
smile
3.2 配置訓(xùn)練文件路徑和網(wǎng)絡(luò)
去cfg目錄下建立文件mouth.data和mouth.cfg,mouth.data內(nèi)容如下:
classes=2
train? = data/mouth/train.list
valid? = data/mouth/test.list
labels = data/mouth/labels.txt
backup = mouth/
top=5
mouth.cfg內(nèi)容如下:
[net]
batch=16
subdivisions=1
height=48
width=48
channels=3
max_crop=48
min_crop=48
hue=.1
saturation=.75
exposure=.75
learning_rate=0.01
policy=poly
power=4
max_batches = 5000
momentum=0.9
decay=0.0005
[convolutional]
batch_normalize=1
filters=12
size=3
stride=1
pad=1
activation=leaky
[maxpool]
size=2
stride=2
[convolutional]
batch_normalize=1
filters=24
size=1
stride=1
pad=1
activation=leaky
[maxpool]
size=2
stride=2
[convolutional]
batch_normalize=1
filters=48
size=3
stride=1
pad=1
activation=leaky
[maxpool]
size=2
stride=2
[connected]
output=128
activation=relu
[connected]
output=2
activation=linear
[softmax]
在這里我們用上了一點(diǎn)數(shù)據(jù)增強(qiáng)操作,大家在后面會(huì)看到它的威力。
?
4 模型訓(xùn)練
使用如下命令進(jìn)行訓(xùn)練:
./darknet classifier train cfg/mouth.data cfg/mouth.cfg
訓(xùn)練結(jié)果如下:
上面每一行展示的分別是:batch數(shù)目,epoch數(shù)目,損失,平均損失,學(xué)習(xí)率,時(shí)間,見過(guò)的樣本數(shù)目。
將最后的結(jié)果提取出來(lái)進(jìn)行顯示,損失變化如下,可知收斂非常完美。
訓(xùn)練完之后使用如下腳本進(jìn)行測(cè)試。
./darknet classifier valid cfg/mouth.data cfg/mouth.cfg mouth/mouth_50.weights
一個(gè)樣本的結(jié)果如下:
darknet/data/mouth/test/27_smile.jpg, 1, 0.006881, 0.993119,
99: top 1: 0.960000, top 5: 1.000000
依次表示樣本darknet/data/mouth/test/27_smile.jpg,被分為類別1,分類為0和1的概率是0.006881, 0.993119,該樣本是第99個(gè)測(cè)試樣本,此時(shí)top1和top5的平均準(zhǔn)確率分為是0.96和1。
到這里,我們只用了不到500個(gè)樣本,就完成了一個(gè)精度不錯(cuò)的分類器的訓(xùn)練,如此輕量級(jí)的darknet,我決定粉了。
總結(jié)
本文講解了如何使用darknet深度學(xué)習(xí)框架完成一個(gè)分類任務(wù),框架固然小眾,但是速度真快,而且非常輕便,推薦每一個(gè)玩深度學(xué)習(xí),尤其是計(jì)算機(jī)視覺的朋友都用起來(lái)。
本系列完整文章:
第一篇:【caffe速成】caffe圖像分類從模型自定義到測(cè)試
第二篇:【tensorflow速成】Tensorflow圖像分類從模型自定義到測(cè)試
第三篇:【pytorch速成】Pytorch圖像分類從模型自定義到測(cè)試
第四篇:【paddlepaddle速成】paddlepaddle圖像分類從模型自定義到測(cè)試
第五篇:【Keras速成】Keras圖像分類從模型自定義到測(cè)試
第六篇:【mxnet速成】mxnet圖像分類從模型自定義到測(cè)試
第七篇:【cntk速成】cntk圖像分類從模型自定義到測(cè)試
第八篇:【chainer速成】chainer圖像分類從模型自定義到測(cè)試
第九篇:【DL4J速成】Deeplearning4j圖像分類從模型自定義到測(cè)試
第十篇:【MatConvnet速成】MatConvnet圖像分類從模型自定義到測(cè)試
第十一篇:【Lasagne速成】Lasagne/Theano圖像分類從模型自定義到測(cè)試
第十二篇:【darknet速成】Darknet圖像分類從模型自定義到測(cè)試
感謝各位看官的耐心閱讀,不足之處希望多多指教。后續(xù)內(nèi)容將會(huì)不定期奉上,歡迎大家關(guān)注有三公眾號(hào) 有三AI!
總結(jié)
以上是生活随笔為你收集整理的【darknet速成】Darknet图像分类从模型自定义到测试的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【杂谈】三人行必有AI,你会在其一吗?
- 下一篇: 【MatConvnet速成】MatCon