生活随笔
收集整理的這篇文章主要介紹了
Windows10下使用darknet和YOLOV3训练自己的数据集
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前言
1.我的環境是windows10,vs2015,cuda9.1,cudnn7.1。
2. darknet加yoloV3,用cmake和vs2015編譯成darknet.exe。
3. 我的目錄結構是在darknet目錄下新建了一個build的目錄,這個目錄就是vs生成工程的目錄,在windows下,所有的操作都在這個目錄里面完成。
一、數據準備
1.我使用的數據格式是VOC2007,關于這個數據集,可以看我之后博客。
2.標注工具用的是LabelImag的win版本。可以從這里下載,不用安裝,直接運行,但存在的路徑不能有中文。標注使用也可以看我之后的博客。
3.標注時按VOC形式標注,也可以選yolo的方式標注,如果一開始用yolo方法標注,之后就不用轉換那么麻煩。這兩種標注的標簽,一種是xml,一種是txt。
VOC格式:
YOLO格式:
4.標注好的數據對應存在VOC2007目錄Annotations里面,標注的圖像放在JPEGImages里面。標注好的數據是一一對應的。
二.處理VOC2007數據
1.在darknet的工程目錄下,darknet\build\darknet\x64\data\下,新建立一個VOCdevkit目錄,把VOC2007的目錄放到里面。
2.VOC2007當時下面只有三個目錄。
Annotations里面就標簽文件:
JPEGImages里面是對應的圖像文件:
ImageSets下面有一個Main目錄,但當前為空:
3.用python創建Main目錄里面的train.txt,val.txt,test.txt和trainval.txt這四個文件。
(1)在VOC2007目錄下創建一個python代碼,我這里命名CreateMainDirTex.py
CreateMainDirTex.py的代碼如下:
import os
import randomtrainval_percent
= 0.1
train_percent
= 0.9
xmlfilepath
= 'Annotations'
txtsavepath
= 'ImageSets\Main'
total_xml
= os
.listdir
(xmlfilepath
)num
= len(total_xml
)
list = range(num
)
tv
= int(num
* trainval_percent
)
tr
= int(tv
* train_percent
)
trainval
= random
.sample
(list, tv
)
train
= random
.sample
(trainval
, tr
)ftrainval
= open('ImageSets/Main/trainval.txt', 'w')
ftest
= open('ImageSets/Main/test.txt', 'w')
ftrain
= open('ImageSets/Main/train.txt', 'w')
fval
= open('ImageSets/Main/val.txt', 'w')for i
in list:name
= total_xml
[i
][:-4] + '\n'if i
in trainval
:ftrainval
.write
(name
)if i
in train
:ftest
.write
(name
)else:fval
.write
(name
)else:ftrain
.write
(name
)ftrainval
.close
()
ftrain
.close
()
fval
.close
()
ftest
.close
()
(2)保存之后運行,結果在Main下創建了四個txt文件。文件內容如下:
3.VOC2007數據轉YOLOV3數據。
(1)在工程目錄下darknet\build\darknet\x64\data\voc位置下找到voc_label.py這個文件,復制到darknet\build\darknet\x64\data下。
(2)更改的代碼,有兩個位置,一個是數據格式,一個是標注的標簽名。
具體的代碼更改如下,我只有一個標簽,這個標簽名字是"a"
import xml
.etree
.ElementTree
as ET
import pickle
import os
from os
import listdir
, getcwd
from os
.path
import joinsets
=[ ('2007', 'train'), ('2007', 'val'), ('2007', 'test')]classes
= ["a"]def convert(size
, box
):dw
= 1./size
[0]dh
= 1./size
[1]x
= (box
[0] + box
[1])/2.0y
= (box
[2] + box
[3])/2.0w
= box
[1] - box
[0]h
= box
[3] - box
[2]x
= x
*dww
= w
*dwy
= y
*dhh
= h
*dh
return (x
,y
,w
,h
)def convert_annotation(year
, image_id
):in_file
= open('VOCdevkit/VOC%s/Annotations/%s.xml'%(year
, image_id
),'rb')out_file
= open('VOCdevkit/VOC%s/labels/%s.txt'%(year
, image_id
), 'w')tree
=ET
.parse
(in_file
)root
= tree
.getroot
()size
= root
.find
('size')w
= int(size
.find
('width').text
)h
= int(size
.find
('height').text
)for obj
in root
.iter('object'):difficult
= obj
.find
('difficult').textcls
= obj
.find
('name').text
if cls
not in classes
or int(difficult
) == 1:continuecls_id
= classes
.index
(cls
)xmlbox
= obj
.find
('bndbox')b
= (float(xmlbox
.find
('xmin').text
), float(xmlbox
.find
('xmax').text
), float(xmlbox
.find
('ymin').text
), float(xmlbox
.find
('ymax').text
))bb
= convert
((w
,h
), b
)out_file
.write
(str(cls_id
) + " " + " ".join
([str(a
) for a
in bb
]) + '\n')wd
= getcwd
()for year
, image_set
in sets
:if not os
.path
.exists
('VOCdevkit/VOC%s/labels/'%(year
)):os
.makedirs
('VOCdevkit/VOC%s/labels/'%(year
))image_ids
= open('VOCdevkit/VOC%s/ImageSets/Main/%s.txt'%(year
, image_set
)).read
().strip
().split
()list_file
= open('%s_%s.txt'%(year
, image_set
), 'w')for image_id
in image_ids
:list_file
.write
('%s/VOCdevkit/VOC%s/JPEGImages/%s.jpg\n'%(wd
, year
, image_id
))convert_annotation
(year
, image_id
)list_file
.close
()
(2)保存之后運行,會在當前的目錄下多出三個文件和在VOC2007目錄下多出一個labels目錄。
三個txt文件:
文件里面的內容:
labels目錄:
目錄下文件內容:
三、更改配置文件
1.在darknet\build\darknet\x64\data目錄下找到voc.data文件,我這里復制之后改名字成train.data。
打開文件,更改內容如下,就是對上剛剛生成的txt文件。
2.找到obj.names文件,也在darknet\build\darknet\x64\data目錄下,改成自己標注的名字。
3.在darknet\build\darknet\x64目錄在找到yoloV3.cfg文件,我這里復制一份重命名成yoloV3_a.cfg.
(1)打開這個文件,找到classes這個標簽,改成自己標注的種類,我這里只有一種,所以改成1,總共有三個地方要改。
(2)在三個位于[yolo]層之前的[convolutional]層中,將filters修改為(classes *(1 + 4)) × 3,我這里是改成18。
(3)更改迭代次數,找到max_batches,改成自己相要迭代的次數。
四、訓練模型
1.下載權重文件darknet53.conv.74,放到darknet\build\darknet\x64下。
2.win加r鍵,輸入cmd,cd到darknet\build\darknet\x64下。
3.輸入,其中train.data,yolov3_a.cfg和darknet53.conv.74都是剛剛加進來的文件,注意目錄,如果放在別的地方,把路徑寫對就可以了。
darknet
.exe detector train data
/train
.data yolov3_a
.cfg darknet53
.conv
.74
4.開始訓練時loss可能很大,有時候會跑出幾千來,等迭代100次左右就慢慢下降了。
loss曲線圖:
總結
以上是生活随笔為你收集整理的Windows10下使用darknet和YOLOV3训练自己的数据集的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。