YOLOv3训练实践(把代码整合一下,写个直接xml到txt的代码,xml到csv,xml到record的代码 留坑)

1.准备数据集

1.找足够多的图片。

2.下载labelImg软件,网址https://tzutalin.github.io/labelImg/,需要翻墙。下载windows最新版。

win10,第一次运行labelImg没毛病,之后再打开的时候,exe窗口总是一闪而过,重启电脑,重下软件都没用。

win+R,输入cmd,命令行运行exe文件,出现以下错误:

Traceback (most recent call last):
  File "<string>", line 1453, in <module>
  File "<string>", line 1449, in main
  File "<string>", line 1442, in get_main_app
  File "<string>", line 98, in __init__
  File "xxx\labelImg\build-tools\build\labelImg\out00-PYZ.pyz\libs.settings", line 33, in load
  File "xxx\labelImg\build-tools\build\labelImg\out00-PYZ.pyz\pickle", line 1378, in load
  File "xxx\labelImg\build-tools\build\labelImg\out00-PYZ.pyz\pickle", line 858, in load
  File "xxx\labelImg\build-tools\build\labelImg\out00-PYZ.pyz\pickle", line 880, in load_eof
EOFError

解决办法:

进入C:/Users/your_account(你自己的账户名)文件,在里面找到.labelImgSettings.pkl文件并删除,之后再运行exe文件就没问题啦。

参考https://github.com/tzutalin/labelImg/issues/221,真的非常感谢了,困扰了好久。

3.下载之后解压,点击labelImg.exe便可用。点击左侧Open,打开图片,按快捷键w,即可进行标定,保存的时候选择xml文件存储路径。

4.新建文件夹VOC(名称任意),在VOC下新建xml、Image两个文件夹(对应代码里的名称)。将标定得到的xml文件都放入xml文件中,所有图片放入Image文件中。

代码Getdata中traindata.py与trans.py。将两个py文件放入VOC文件夹下。运行traindata.py,可以得到trainImage,validateImage,trainImageXML,validateImageXML四个文件夹,分别存放训练、测试用的图片与xml,图片会被损坏,所以,手动替换吧。还会生成两个txt文件trainImageId,validateImageId,分别放训练、测试用图片的名称,一行一个,这是为了用来生成后面的txt文件用的。

之后运行trans.py文件。首先要修改11行的classes,将[]里面的内容换成自己的类别信息。运行后生成两个txt文件train,val,分别放相应图片的路径信息,同时生成两个文件夹trainLabel,valLabel,分别放xml转换后的信息。

最后有用的信息是全部的图片,和trainLabel,valLabel文件,还有存放图片路径的两个txt文件train,val。这两个代码比较鸡肋,走了很多弯路,有空自己修改一下。

要把由xml转成的txt文件与图片放入同一个目录,train,val路径随意。

参考https://blog.csdn.net/qq_34484472/article/details/73135354

5.修改代码

首先找到darknet-master文件夹,就是之前下载的dark。找到cfg文件夹下voc.data。

classes= 1#类别,要检测几个类别就改成几。
train  = xxx\VOC\train.txt#这里放的是train.txt的路径
valid  = xxx\VOC\valPath.txt#val.txt路径。
names = data/person.names#这里要进入darknet-master/data,新建一个person.names文件,里面放类别名称,一个类别一行。这里只识别一个类别,即只需写一个person。
backup = backup#存放训练模型的文件。

train,val.txt分别为存放图片路径的文档。

之后,找到darknet-master/cfg中yolov3.cfg,将开头的测试部分注释掉,回复训练部分信息。

# Testing
#batch=1
#subdivisions=1
# Training
batch=7#
subdivisions=1##这个参数根据自己GPU的显存进行修改,显存不够就改大一些
...                 #因为训练时每批的数量 = batch/subdivisions
width=416
height=416
......

learning_rate=0.001#学习率
burn_in=1000
max_batches = 3000##根据自己的需求还有训练速度max_batches可以调整一下
policy=steps
steps=1000,2000# #跟着max_batches做相应调整
scales=.1,.1


之后找到[yolo],一共有三个[yolo]。

对[yolo]上面的一个[convolutional]中的filters进行修改,根据filters=3*(classes+5).同时也修改yolo中的classes。

[convolutional]
size=1
stride=1
pad=1
filters=18         #filters = 3*(classes + 5)
activation=linear

[yolo]
mask = 0,1,2
anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326
classes=1          #修改类别数
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=1           #显存小的话 =0

一共有3个[yolo],所以需要修改三个部分,完成之后保存。

用darknet,通过电脑摄像头实时测试指令:

./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights

https://jingyan.baidu.com/article/4f7d5712efdf3e1a2019272b.html,office2013亲测有效

Q&A:

训练YOLO3过程遇到的坑:

Loading weights from darknet53.conv.74...Done!
Learning Rate: 0.001, Momentum: 0.9, Decay: 0.0005
Couldn't open file: C:/darknet-master/data/train.txt

或者

"annot load image "data/nfpa/pos-15.jpg
STB Reason: can't fopen
"annot load image "data/nfpa/pos-15.jpg
STB Reason: can't fopen
解决办法:

出错是因为txt文件格式不对,无法读取对应路径的图片。下载notepad++,打开出错的txt文件,

每行数据后面有个CR LF,这样的格式是不对的。

点击编辑-文档格式转换-转换为UNIX格式。

每行数据后面有且仅有一个LF,格式正确,保存修改之后,再运行,就不会报错了。

要注意训练、测试指令,否则会出现核心已经转移的错误。 用detector...

测试的时候,记得修改yolov3-voc.cfg文件,将训练模块注释掉,恢复测试模块。

在前面的训练中,显示0.00000rate是正常的(虽然cfg中设置的rate=0.001),原因:darknet-master/src/network.c中94行左右,

float get_current_rate(network *net)
{
    size_t batch_num = get_current_batch(net);
    int i;
    float rate;
    if (batch_num < net->burn_in) return net->learning_rate * pow((float)batch_num / net->burn_in, net->power);///

AlexeyAB: 训练过程中出现nan是没有问题的,如果avg(loss)为nan的话,则训练出错。

 

  • darknet: ./src/parser.c:280: parse_region: Assertion `l.outputs == params.inputs' failed.

        已放弃 (核心已转储)

原因:检查yolov3-voc.cfg文件(就是训练自己的数据修改的那个cfg文件),看一下3个yolo那里对应的classes有没有修改,还有上面的filter,我发现自己的classes没有改,改好之后就不报错了。

 

记录一些别人踩过得坑:

1.https://blog.csdn.net/jiachen0212/article/details/79735632,out of memory:

1:CUDA Error: out of memory表明显存不够,调小batch数值

2:Resizing到不同尺度,同样增加显存。设置random=0。关闭多尺度训练。

 

评估模型

./darknet detector recall cfg/voc.data cfg/yolov3-voc.cfg results/yolov3-voc_final.weights

要在example文件里的detector.c中修改validate_detector_recall()函数,509行,修改为自己的路径。    list *plist = get_paths("/xxx/Desktop/up/train.txt");

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