继续做毕设,yolov3已经是我第三个方向了,再做不出来,我估计就要不能毕业了,悲伤。。。
全篇主要参考的是 https://blog.csdn.net/qq_35451572/article/details/80384674 ,如果没有特殊指明,本文中的教程就是指这篇
感谢博主泉伟,但是要注意,公式是3x(5+class),而且全文有三处class要改
1,先下载,下载地址 https://github.com/pjreddie/darknet
2 ,下载好以后解压,然后终端进入该路径下,嗯,一般自己手打的话,一定要善用tab键的自动补全功能啊
cd darknet-master
3修改Makefile文件
GPU=1
CUDNN=1
OPENCV=1
注意 坑1:我按照教程上来修改,结果后面编译时报错Makefile:78: recipe for target ‘darknet’ failed,这个是因为我opencv的环境没有弄好,因此我就把makefile里面给关了使opencv=0,其实还是应该自己解决一下
GPU=1
CUDNN=1
OPENCV=0
4改好以后保存Makefile文件,然后输入以下命令进行编译
make -j8
ps:其实 make -j
也可以
5下载权重文件
wget https://pjreddie.com/media/files/yolov3.weights
6,运行demo
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
可以看到识别的结果,识别的图片就是predictions.jpg那张照片中可以看到的
1将自己制作好的voc数据集放入darknet-master/scripts这个文件夹中,
我的voc数据集长这样子
名字叫VOCdevkit,里面有一个文件夹叫VOC2007,VOC2007文件夹下有三个文件夹, Annotations和 ImageSets还有 JPEGImages,这几个文件夹下都要有东西,我之前傻傻的,只是建了这几个文件夹,Main文件夹下只是新建了那几个文件,内容是空的,但其实那4个文件都要用脚本生成,结果我傻傻的后面报错卡了好几天,百度都不好使,看来犯这种奇葩错误的也就只有我了,现在贴一下我的voc制作过程,网上教程很多,如果会的可以直接跳过。。。毕竟我是新手,真的伤不起,那么白痴的错估计只有我一个会犯。。。
Annotations
ImageSets
--Main
--test.txt
--train.txt
--trainval.txt
--val.txt
JPEGImages
1 JPEGImages存放的是jpg照片,然后把它重命名,重命名 的python代码如下,网上参考的是教程 https://blog.csdn.net/liuyan20062010/article/details/78905517
感谢博主大大liuyan20062010
tips :路径不要手打,容易出错,可以复制那个文件夹,然后粘贴,就可以出现它的路径 了。
重命名6位数字的python代码如下,一定要改路径为自己的jpg图片路径
import os
class BatchRename():
# '''''
# 批量重命名文件夹中的图片文件
# '''
def __init__(self):
#我的图片文件夹路径horse
self.path = '/home/luajx/wuyihong/voc_my/JPEGImages'
def rename(self):
filelist = os.listdir(self.path)
total_num = len(filelist)
i = 1
n = 6
for item in filelist:
if item.endswith('.jpg'):
n = 6 - len(str(i))
src = os.path.join(os.path.abspath(self.path), item)
dst = os.path.join(os.path.abspath(self.path), str(0)*n + str(i) + '.jpg')
try:
os.rename(src, dst)
print ('converting %s to %s ...' % (src, dst))
i = i + 1
except:
continue
print ('total %d to rename & converted %d jpgs' % (total_num, i))
if __name__ == '__main__':
demo = BatchRename()
demo.rename()
2运行上面那个python代码,重命名以后就是进行图片标注,我使用的是labeIimg,花费漫长的时间终于标好了,将标注好的文件放在 Annotations文件夹中。
标好的xml文件长这样,可以看到我的difficult标签长这样–Difficult,这真的超级坑,后面会讲到我的心酸血泪史
JPEGImages
000001
E:\VOC2007\JPEGImages\000001.jpg
353
500
3
0
3生成Main文件夹下的四个txt文件,,这一步使用的是python脚本生成
代码如下,参考教程 https://blog.csdn.net/liang_xiao_yun/article/details/79551151
感谢博主大大yun_xiao_duo
import os
import random
xmlfilepath='/home/luajx/wuyihong/yolo_wuyihong/darknet-master/scripts/VOCdevkit/VOC2007/Annotations'
saveBasePath='/home/luajx/wuyihong/yolo_wuyihong/darknet-master/scripts/VOCdevkit/VOC2007/ImageSets'
trainval_percent=0.7
train_percent=0.7
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)
print("train and val size",tv)
print("traub suze",tr)
ftrainval = open(os.path.join(saveBasePath,'Main/trainval.txt'), 'w')
ftest = open(os.path.join(saveBasePath,'Main/test.txt'), 'w')
ftrain = open(os.path.join(saveBasePath,'Main/train.txt'), 'w')
fval = open(os.path.join(saveBasePath,'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:
ftrain.write(name)
else:
fval.write(name)
else:
ftest.write(name)
ftrainval.close()
ftrain.close()
fval.close()
ftest .close()
至此我们的voc数据集制作完成了,其实我不是用自己的数据,而是把网上下好的voc数据集中有人的图片找出来,然后重新框定出想要的目标——人,嗯我感觉我特别假,特别闲。。。而且 好像数据不太够,其实我标出的图片有点少,这会影响后面的准确度
嗯,做完voc数据集以后我已经晕头转向了,但是还是要回到训练yolo的轨道上来啊,我们要修改scripts文件夹下的voc_label.py文件
改2个地方,这个地方原来的教程说的比较好,所以我就不写了,直接贴出我修改好的改为
sets=[('2007', 'train'), ('2007', 'val'), ('2007', 'test')]
classes = ["person"]
改好以后运行voc_label.py文件,前提是进入scripts路径下运行该命令
python voc_label.py
按照原教程中写到
运行结束以后,可以在scripts/VOCdevkit/VOC2007文件夹内看到labels文件夹,并且在/darknet/scripts文件夹内会生成2007_train.txt、2007_test.txt、2007_val.txt三个文件。到此,数据准备完成。
这是一个应该被记录的坑:运行voc_label.py报错AttributeError: ‘NoneType’ object has no attribute ‘text’,
这是因为我的xml文件是Difficult,不是difficult,,py文件中改成Difficult即可,啊,这么短短几句话说出来真是令人心痛,伤不起啊,顺便说一下我的标注工具是labelimg,话说为啥我的Ubuntu安不好labelimg,win7就可以呢。。。
参考 https://blog.csdn.net/qq_36930266/article/details/88933565
2.2.1修改cfg/voc.data,这里贴出我的文件
classes= 1
train = scripts/2007_train.txt
valid = scripts/2007_test.txt
//本来是改成valid的,但是总是报错,所以改成test.txt的路径
names = data/voc.names
backup = backup
坑1:按照原教程中,valid应该改成2007_val的路径,我一开始也是改成val的,然后都很正常,但是后面在测试的时候,总是给我报错说我keyerror,所以我到那时就改成了test的路径,终于不报错了,所以我也不清楚这个时候按照我这样子对不对,我自己一开始也是按照教程来的,当时没报错执行很后面的代码的时候才报错
2.2.2修改data/voc.names
我识别person这个类,所以就把它改成person,整个文件里就一个单词,这里贴出我的文件
person
2.2.3修改cfg/yolov3-voc.cfg
原教程里面有些文件名字不太对,比如这个,是cfg/yolov3-voc.cfg,而不是cfg/yolo-voc.cfg,修改的是这样的,我们先是训练,所以batch改大,测试的时候一定要记得batch和subdivisions都改成1 我的是显卡1080ti所以batch=64,subdivisions=16可以,
第一处
batch=64
subdivisions=16
如果后面训练时报错
CUDA Error: out of memory
darknet: ./src/cuda.c:36: check_error: Assertion `0' failed,
这个错误很常见,它说明内存不够,有一堆教程教你如何解决这个问题,思路就需要改小batch和subdivision,或将yolov3-voc.cfg的random=0,或者两种都试试,要不然就是加个sudo,这些我都试过了,但是有时可以有时不行,如果你的显卡确定是可以的,但是却和我一样报这个错误,就转到这个教程,https://blog.csdn.net/tintinetmilou/article/details/78947881
nvidia-smi
然后sudo kill -9 PIDxxx就好了,一般就是darknet对应的pid
总之这个第一处还是参照原来的教程比较好,他有详细的注释,我只是因为原来的教程的训练次数太大了,要等好久,所以改小一点,就不贴出来了,总之这个第一处还是参照原来的教程比较好,他有详细的注释,我只是因为原来的教程的训练次数太大了,要等好久,所以改小一点,其实那个第一处最重要的就是batch和subdivision的值。
第二处(这个地方和原教程差别非常大,一定要注意!)
修改yolo层上面那个[convolutional]的filters的数目和class的数目,注意整个文件中要修改3处,filters改3处,不要改多了,不要ctrl+f查找filers来改,这样容易改多filters,查找yolo.将它上面的那个[convolutional]的filters的数目进行修改,我是1个类,所以改成18,因为3乘以(1个类+5)=3乘以6=18,原教程在此处好像不太对,而且class=1全文一共有3处,并不是1处
这段代码是用来参考的不是用来复制的,像这样的有三个地方,
整个文件有超多的[convolutional],但是只有yolo上面的这个才要改,而全文有3个yolo,
所以改3处
[convolutional]
size=1
stride=1
pad=1
filters=18
activation=linear
[yolo]
mask = 6,7,8
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
1首先下载人家训练好的一个权重,在人家的基础上进行训练,否则会报错找不到darknet19_448.conv.23
命令参考这个样子:wget https://pjreddie.com/media/files/darknet53.conv.74
这个命令是是网站https://pjreddie.com上的,但是我下载的不是这个,我下的是darknet19_448.conv.23
貌似这个会下载在终端的当前目录下,或者是download目录下,时间太久了我记不太清了,反正网上也有一堆资源可以下载到,我当时直接在http://pjreddie.com/media/files/darknet19_448.conv.23 这个网址上下载的。
下载好以后的权重文件直接放在darknet-master文件下,如果按照原教程的训练命令,请将它放在cfg文件夹下
2.训练,原教程的名字好像有小错,是yolov3-voc.cfg,其实我的命令也是手动改的,可能有错误,仅供参考,如果执行这一步的时候,报错 CUDA Error: out of memory
darknet: ./src/cuda.c:36: check_error: Assertion `0’ failed,,请参考前面说到的那个错误。
./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet19_448.conv.23 >> log.txt
原教程说输入上边的指令就可以进行训练,在命令最后的命令>> log.txt是将输出的日志保存到log.txt文件内,这样便于后期训练结果的查看,但是我的log.txt文件我却找不到在哪里,在整个darknet文件夹中搜索,它却又真的又存在,我真的匪夷所思。。。
反正就是漫长漫长的等待,我等了好久。
./darknet detect cfg/yolov3-voc.cfg backup/yolov3-voc_final.weights data/dog.jpg
坑1:
CUDA Error: out of memory
darknet: ./src/cuda.c:36: check_error: Assertion `0' failed
其实这个错误在这个地方,不再是释放内存了,而应该把batch和subdivision改为1,
**坑2:**不报错但是没有框,就是说识别出来什么都没有
1其实我在这边犯了一个错误,就是我的测试图片就是狗,自行车,车,根本没有人,所以就没有框出人,
2我后面将图片换成人了,但是还是识别不出来,一点反应也没有,后来我参考这个 https://blog.csdn.net/shangpapa3/article/details/76277869 在测试命令后面加了-thresh 0.25,如果依然没有,就把0.25再改小,只要改到足够小,它总会有框的, ./darknet ./darknet detect cfg/yolov3-voc.cfg backup/yolov3-voc_final.weights data/dog.jpg -thresh 0.25
3当我把它改到超小的时候,它终于有框了,但是预测的位置根本是错的,差了十万八千里,问大神,大神说是我的数据没有标注好,建议查看一下自己的xml文件,嗯,好难啊,也不知道百度的关键词是什么。。。,所以我才重新标注了一遍,自己标定数据,之前使用的是学长的数据集,后面发现可能确实是一开始的数据集没有弄好吧,可能被我改乱了,因为我当时对学长的xml文件进行了重命名。。。,自己的标定的数据训练出来就没有这个问题。。。
坑3:标签错乱,我之前用训练20个类,结果出现框定得很准,但是标签很乱,把person当成bird,后来我没有再去修改了,但是现在看到了这个教程 ,感觉就是这个错误 ,因为person原来是第15类,但是这里的第15类就是bird https://my.oschina.net/farces/blog/2209444 ,这里用的是第一种方法,修改data下的coco.names文件,将它修改得和voc.names一样,但其实我就一个类,不改会怎么样,我也不是很清楚,反正我改了。。。
不是参考原来的教程了,这里参考的是 https://blog.csdn.net/amusi1994/article/details/81564504 ,感谢博主大大阿木寺
1生成person.txt文件(因为我是检测person)
./darknet detector valid cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc_final.weights -out "" -gpu 0 -thresh .5
然后他就会生成results文件夹下person.txt
2下载voc_eval.py
https://github.com/rbgirshick/py-faster-rcnn, 下载下来以后解压,我们只需要lib文件夹下dataset下的voc_eval.py文件
3 新建compute_mAP.py
我的代码如下,路径就是三个,一个上面生成的person.txt的路径,一个是voc数据集的xml文件的路径,一个是voc的test.txt的路径,倒数第2个我的是person,但是其实我也不知道多个类怎么修改。。。参考的是教程 https://blog.csdn.net/yinhuan1649/article/details/82258703 ,感谢博主大大TurtleMeow
from voc_eval import voc_eval
from voc_eval import voc_eval
import _pickle as cPickle
rec,prec,ap = voc_eval('/home/luajx/wuyihong/yolo_wuyihong/darknet-master/results/{}.txt', '/home/luajx/wuyihong/yolo_wuyihong/darknet-master/scripts/VOCdevkit/VOC2007/Annotations/{}.xml', '/home/luajx/wuyihong/yolo_wuyihong/darknet-master/scripts/VOCdevkit/VOC2007/ImageSets/Main/test.txt', 'person', '.')
print('rec',rec)
print('prec',prec)
print('ap',ap)
超级巨坑:运行compute_mAP.py,会发现python2和python3不兼容,
坑1:ImportError: No module named ‘cPickle’
解决方案,参考 https://blog.csdn.net/zcf1784266476/article/details/70655192
cPickle那一句改成
import pickle as pk
坑2:AttributeError: ‘NoneType’ object has no attribute ‘text’,
还是那个difficult大小写的原因,修改voc_eval.py中的’difficult’为’Difficult’
坑3:TypeError: a bytes-like object is required, not ‘str’
参考这个教程,将它的r,w都改成rb,wb,建议一个一个改,看他哪个报错就改哪个
https://blog.csdn.net/qq_37118044/article/details/83151353
坑4:一直报错说keyerror,‘000208’,我按照教程一直都删掉了annots.pkl但是也还错,后来我感觉是说000208是照片的名字,但是我的test.txt没有这个照片,val有,所以我猜想是最前面的valid路径应该是改成2007_test.txt的路径,然后果然没报错了,匪夷所思
R = class_recs[image_ids[d]]
KeyError: '000208'
最后解决方案——你还记得大明湖畔的cfg/voc.data吗
classes= 1
train = scripts/2007_train.txt
valid = scripts/2007_test.txt
//本来是改成valid的,但是总是报错,所以改成test.txt的路径
names = data/voc.names
backup = backup
改好以后就运行compute_mAP.py即可
compute_mAP.py
输出的信息如下:真的非常非常低啊。。。不知道为什么。。。,但是看框就还可以啊
rec [0.00290698 0.00581395 0.00872093 0.01162791 0.01453488 0.01744186
0.02034884 0.02325581 0.02616279 0.02906977 0.03197674 0.03488372
0.03488372 0.03488372 0.03488372 0.0377907 0.04069767 0.04069767
0.04360465 0.04651163 0.0494186 0.05232558 0.05523256 0.05813953
0.05813953 0.06104651 0.06395349 0.06686047 0.06686047 0.06686047
0.06976744 0.06976744 0.07267442 0.0755814 0.07848837 0.08139535
0.08139535 0.08430233 0.0872093 0.0872093 0.0872093 0.0872093
0.0872093 0.0872093 0.09011628 0.09302326 0.09593023 0.09883721
0.10174419 0.10174419 0.10174419 0.10174419 0.10465116 0.10755814
0.11046512 0.11337209 0.11337209 0.11337209 0.11627907 0.11627907
0.11627907 0.11918605 0.12209302 0.12209302 0.12209302 0.125
0.125 0.125 0.125 0.12790698 0.12790698 0.12790698
0.12790698 0.12790698 0.13081395 0.13372093 0.13662791 0.13953488
0.13953488 0.14244186 0.14244186 0.14244186 0.14534884 0.14825581
0.14825581 0.14825581 0.15116279 0.15406977 0.15406977 0.15406977
0.15406977 0.15697674 0.15697674 0.15697674 0.15697674 0.15988372
0.1627907 0.1627907 0.1627907 0.1627907 0.16569767 0.16860465
0.17151163 0.17151163 0.1744186 0.17732558 0.17732558 0.17732558
0.17732558 0.18023256 0.18023256 0.18313953 0.18604651 0.18604651
0.18604651 0.18895349 0.19186047 0.19186047 0.19186047 0.19186047
0.19476744 0.19767442 0.19767442 0.19767442 0.19767442 0.19767442
0.19767442 0.2005814 0.2005814 0.20348837 0.20348837 0.20639535
0.20639535 0.20930233 0.2122093 0.21511628 0.21511628 0.21802326
0.21802326 0.21802326 0.21802326 0.21802326 0.21802326 0.21802326
0.21802326 0.21802326 0.21802326 0.21802326 0.21802326 0.21802326
0.21802326 0.21802326 0.21802326 0.21802326 0.22093023 0.22383721
0.22383721 0.22674419 0.22674419 0.22965116 0.22965116 0.22965116
0.22965116 0.22965116 0.22965116 0.22965116 0.23255814 0.23255814
0.23255814 0.23255814 0.23546512 0.23546512 0.23546512 0.23546512
0.23546512 0.23837209 0.24127907 0.24127907 0.24127907 0.24127907
0.24127907 0.24127907 0.24127907 0.24127907 0.24127907 0.24127907
0.24127907 0.24127907 0.24127907 0.24418605 0.24418605 0.24709302
0.24709302 0.25 0.25 0.25 0.25 0.25
0.25 0.25 0.25290698 0.25290698 0.25290698 0.25290698
0.25290698 0.25290698 0.25290698 0.25581395 0.25872093 0.25872093
0.25872093 0.25872093 0.26162791 0.26162791 0.26162791 0.26453488
0.26453488 0.26453488 0.26453488 0.26453488 0.26744186 0.26744186
0.26744186 0.26744186 0.26744186 0.26744186 0.26744186 0.26744186
0.27034884 0.27034884 0.27034884 0.27034884 0.27034884 0.27034884
0.27325581 0.27325581 0.27325581 0.27325581 0.27325581 0.27325581
0.27325581 0.27325581 0.27325581 0.27325581 0.27325581 0.27325581
0.27616279 0.27616279 0.27616279 0.27616279 0.27616279 0.27616279
0.27906977 0.27906977 0.27906977 0.28197674 0.28197674 0.28197674
0.28197674 0.28197674 0.28197674 0.28197674 0.28197674 0.28197674
0.28488372 0.2877907 0.2877907 0.2877907 0.29069767 0.29069767
0.29069767 0.29069767 0.29069767 0.29069767 0.29069767]
prec [1. 1. 1. 1. 1. 1.
1. 1. 1. 1. 1. 1.
0.92307692 0.85714286 0.8 0.8125 0.82352941 0.77777778
0.78947368 0.8 0.80952381 0.81818182 0.82608696 0.83333333
0.8 0.80769231 0.81481481 0.82142857 0.79310345 0.76666667
0.77419355 0.75 0.75757576 0.76470588 0.77142857 0.77777778
0.75675676 0.76315789 0.76923077 0.75 0.73170732 0.71428571
0.69767442 0.68181818 0.68888889 0.69565217 0.70212766 0.70833333
0.71428571 0.7 0.68627451 0.67307692 0.67924528 0.68518519
0.69090909 0.69642857 0.68421053 0.67241379 0.6779661 0.66666667
0.6557377 0.66129032 0.66666667 0.65625 0.64615385 0.65151515
0.64179104 0.63235294 0.62318841 0.62857143 0.61971831 0.61111111
0.60273973 0.59459459 0.6 0.60526316 0.61038961 0.61538462
0.60759494 0.6125 0.60493827 0.59756098 0.60240964 0.60714286
0.6 0.59302326 0.59770115 0.60227273 0.59550562 0.58888889
0.58241758 0.58695652 0.58064516 0.57446809 0.56842105 0.57291667
0.57731959 0.57142857 0.56565657 0.56 0.56435644 0.56862745
0.57281553 0.56730769 0.57142857 0.5754717 0.57009346 0.56481481
0.55963303 0.56363636 0.55855856 0.5625 0.56637168 0.56140351
0.55652174 0.56034483 0.56410256 0.55932203 0.55462185 0.55
0.55371901 0.55737705 0.55284553 0.5483871 0.544 0.53968254
0.53543307 0.5390625 0.53488372 0.53846154 0.53435115 0.53787879
0.53383459 0.53731343 0.54074074 0.54411765 0.54014599 0.54347826
0.53956835 0.53571429 0.53191489 0.52816901 0.52447552 0.52083333
0.51724138 0.51369863 0.51020408 0.50675676 0.5033557 0.5
0.49668874 0.49342105 0.49019608 0.48701299 0.49032258 0.49358974
0.49044586 0.49367089 0.49056604 0.49375 0.49068323 0.48765432
0.48466258 0.48170732 0.47878788 0.47590361 0.47904192 0.47619048
0.47337278 0.47058824 0.47368421 0.47093023 0.46820809 0.46551724
0.46285714 0.46590909 0.46892655 0.46629213 0.46368715 0.46111111
0.45856354 0.45604396 0.45355191 0.45108696 0.44864865 0.44623656
0.44385027 0.44148936 0.43915344 0.44210526 0.43979058 0.44270833
0.44041451 0.44329897 0.44102564 0.43877551 0.43654822 0.43434343
0.4321608 0.43 0.43283582 0.43069307 0.42857143 0.42647059
0.42439024 0.4223301 0.42028986 0.42307692 0.42583732 0.42380952
0.42180095 0.41981132 0.42253521 0.42056075 0.41860465 0.4212963
0.41935484 0.41743119 0.41552511 0.41363636 0.41628959 0.41441441
0.41255605 0.41071429 0.40888889 0.40707965 0.40528634 0.40350877
0.40611354 0.40434783 0.4025974 0.40086207 0.39914163 0.3974359
0.4 0.39830508 0.39662447 0.39495798 0.39330544 0.39166667
0.39004149 0.38842975 0.38683128 0.3852459 0.38367347 0.38211382
0.38461538 0.38306452 0.3815261 0.38 0.37848606 0.37698413
0.37944664 0.37795276 0.37647059 0.37890625 0.37743191 0.37596899
0.37451737 0.37307692 0.37164751 0.37022901 0.36882129 0.36742424
0.36981132 0.37218045 0.37078652 0.36940299 0.37174721 0.37037037
0.36900369 0.36764706 0.36630037 0.3649635 0.36363636]
ap 0.1885878242510267