环境配置
查看电脑的cuda版本
nvidia-smi
下载和安装opencv3.4.0
-
下载地址:https://opencv.org/releases/page/4/
- 我下载的是3.4.0的,安装其实很简单,只需要运行exe文件(运行的时候要记得关掉杀毒软件,我的傻舍友lxm因为这个问题搞了一晚上,还以为是她电脑的问题哈哈哈哈,结果把她的杀毒软件关掉就好可以了哈哈哈哈,幸好没有杀毒软件哈哈哈)
下载\安装和配置darknet
-
下载链接:https://download.csdn.net/download/weixin_42146230/18614951(感谢csm同学提供的各类衔接,真的让复习大物的我省了好多时间呜呜呜)
-
解压后得到一个darknet-master文件
-
到darknet-master\build\darknet\文件夹中,找到darknet.vcxproj文件,将以下两处改成你安装的cuda版本
-
在vs中打开darknet-master\build\darknet中的darknet.sln,如果出现下面这个就按确定
-
在【项目】 ->【 属性】->【VC++目录】中的包含目录和库目录放入opencv的目录路径
-
在【项目】 ->【 属性】->【链接器】->【输入】的附加依赖项中加入下面的lib
-
【生成】->【生成darknet】
这里如果生成不成功,则需要先去查查笔记本的算力,然后修改【项目】 ->【 属性】->【CUDA C/C++】的Device中修改下上面的数据(我的电脑算力是5.0,所以修改为50)
测试
-
将yolov3.weights下载到darknet.exe所在的同级目录中,在该目录中运行cmd,然后输入以下命令,测试成功
darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
数据准备
-
安装vott(直接双击
vott-win.exe
安装)(这里是从csm同学的笔记中的链接直接下载滴,感谢csm同学的分享)
(安装好后,打开vott如下图)
-
打开课程网址上下载的
gun_sword_data
(【file】-【Open Image Directory…】),加入gun和sword两个标签后,按Continue就可以对图片进行标记
训练数据
-
下载yolov4-tiny.conv.29
https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v4_pre/yolov4-tiny.conv.29
(此处使用了gyl同学提供的链接,再次感谢所有大佬!) -
在
build\darknet\×64\
目录下新建一个文件yolo-tiny-obj.cfg
, 将以下代码复制下去(此处用的是csm同学提供的代码)
[net]
# Testing #测试模式,测试时开启
#batch=1 #
#subdivisions=1 #
# Training #训练模式,训练时开启,测试时注释
# 每批数量,根据配置设置,如果内存小,改小batch和subdivisions, batch和subdivisions越大,效果越好
# 要改
batch=64
# 要改
subdivisions=8
width=416
height=416
channels=3 # 输入图像width height channels 长宽设置为32的倍数,因为下采样参数是32,最小320*320 最大608*608
momentum=0.9 # 动量参数,影响梯度下降速度
decay=0.0005 # 权重衰减正则项,防止过拟合
angle=0 # 旋转
saturation = 1.5 # 饱和度扩增
exposure = 1.5 # 曝光度
hue=.1 # 色调
learning_rate=0.00261 # 学习率,权值更新速度
burn_in=1000 # 迭代次数小于burn_in,学习率更新;大于burn_in,采用policy更新
# 要改
max_batches = 6000 # 训练达到max_batches停止
policy=steps # 学习率调整策略policy:constant, steps, exp, poly, step, sig, RANDOM
# 要改
steps=4800,5400 # 步长
scales=.1,.1 # 学习率变化比例
[convolutional]
batch_normalize=1
filters=32
size=3
stride=2
pad=1
activation=leaky
[convolutional]
batch_normalize=1
filters=64
size=3
stride=2
pad=1
activation=leaky
[convolutional]
batch_normalize=1
filters=64
size=3
stride=1
pad=1
activation=leaky
[route]
layers=-1
groups=2
group_id=1
[convolutional]
batch_normalize=1
filters=32
size=3
stride=1
pad=1
activation=leaky
[convolutional]
batch_normalize=1
filters=32
size=3
stride=1
pad=1
activation=leaky
[route]
layers = -1,-2
[convolutional]
batch_normalize=1
filters=64
size=1
stride=1
pad=1
activation=leaky
[route]
layers = -6,-1
[maxpool]
size=2
stride=2
[convolutional]
batch_normalize=1
filters=128
size=3
stride=1
pad=1
activation=leaky
[route]
layers=-1
groups=2
group_id=1
[convolutional]
batch_normalize=1
filters=64
size=3
stride=1
pad=1
activation=leaky
[convolutional]
batch_normalize=1
filters=64
size=3
stride=1
pad=1
activation=leaky
[route]
layers = -1,-2
[convolutional]
batch_normalize=1
filters=128
size=1
stride=1
pad=1
activation=leaky
[route]
layers = -6,-1
[maxpool]
size=2
stride=2
[convolutional]
batch_normalize=1
filters=256
size=3
stride=1
pad=1
activation=leaky
[route]
layers=-1
groups=2
group_id=1
[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
[route]
layers = -1,-2
[convolutional]
batch_normalize=1
filters=256
size=1
stride=1
pad=1
activation=leaky
[route]
layers = -6,-1
[maxpool]
size=2
stride=2
[convolutional]
batch_normalize=1
filters=512
size=3
stride=1
pad=1
activation=leaky
##################################
[convolutional]
batch_normalize=1
filters=256
size=1
stride=1
pad=1
activation=leaky
[convolutional]
batch_normalize=1
filters=512
size=3
stride=1
pad=1
activation=leaky
[convolutional]
size=1
stride=1
pad=1
# 要改 # 3*(classes+5)
filters=21
activation=linear
[yolo]
mask = 3,4,5
anchors = 10,14, 23,27, 37,58, 81,82, 135,169, 344,319
# 要改 # 类别数,修改为实际需要数量
classes=2
num=6
jitter=.3
scale_x_y = 1.05
cls_normalizer=1.0
iou_normalizer=0.07
iou_loss=ciou
ignore_thresh = .7
truth_thresh = 1
random=0
resize=1.5
nms_kind=greedynms
beta_nms=0.6
[route]
layers = -4
[convolutional]
batch_normalize=1
filters=128
size=1
stride=1
pad=1
activation=leaky
[upsample]
stride=2
[route]
layers = -1, 23
[convolutional]
batch_normalize=1
filters=256
size=3
stride=1
pad=1
activation=leaky
[convolutional]
size=1
stride=1
pad=1
# 要改 # 3*(5+classes)
filters=21
activation=linear
[yolo]
mask = 1,2,3
anchors = 10,14, 23,27, 37,58, 81,82, 135,169, 344,319 #预测框的初始宽高,第一个是w,第二个是h,总数量是num*2
# 要改 # 类别数,修改为实际需要数量
classes=2
num=6 # 每个grid预测的BoundingBox个数
jitter=.3 # # 利用数据抖动产生更多数据抑制过拟合.YOLOv2中使用的是crop,filp,以及net层的angle,flip是随机的,crop就是jitter的参数,tiny-yolo-voc.cfg中jitter=.2,就是在0~0.2中进行crop
scale_x_y = 1.05
cls_normalizer=1.0
iou_normalizer=0.07
iou_loss=ciou
ignore_thresh = .7 # # 决定是否需要计算IOU误差的参数,大于thresh,IOU误差不会夹在cost function中
truth_thresh = 1
random=0 # 如果为1每次迭代图片大小随机从320到608,步长为32,如果为0,每次训练大小与输入大小一致
resize=1.5
nms_kind=greedynms
beta_nms=0.6
- 在
build\darknet\×64
目录下运行命令darknet.exe detector train data/obj.data yolov4-tiny-obj.cfg yolov4-tiny.conv.29 -map
然后数据就出错了呜呜呜
- 一开始是出现
Cannot load image data/obj/2bd75ea4acb158fc.jpgdata/obj/1a7544cff439c995.jpg
百度发现可能是图片路径错误,然后去看来train.txt文件,发现有个数据集跟其他的不对齐,强迫症把它回车后再回来运行,结果就可以了 - 然后是训练精准度一直降,这里是因为有个很奇怪的bug,在vott中输出做好的标记时,改变原来的输出路径就没办法把所有图片和标记都输出,一开始没发现这个问题,后面训练的时候,训练出的精准度一直在下降,回去看了下数据集才发现的。vott输出时不改路径重新来过,两小时无用功呜呜呜
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210629224938560.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDgxMDM0Mg==,size_16,color_FFFFFF,t_70)
成功训练的结果如下
这里想放因为电脑发热的太严重而产生的一张很搞笑的图哈哈哈
验证数据集
(这里是结合gyl同学和csm同学的笔记操作的)
- 到这个网站下载mAP项目的代码,解压
- 打开map\input\,将上面三个子目录内的所有内容都删掉
- 打开之前在vott导出的output文件的data文件下test.txt文件,对着上面的图片名,到obj文件下将相应的测试图片复制到
map\input\images-optional
;同样地,将相应的txt文件复制到map\input\ground-truth
- 把
map\scripts\extra
目录下的class_list.txt
里面的所有内容删除, 第一行输入gun, 第二行输入sword, 然后保存文件 - 把
yolo-tiny-obj.cfg
文件里面的subvision
和batch
改为1 - 把训练生成的
×64\backup\
文件夹下的权重文件选一个复制到×64
目录下(我选的是yolov4-tiny-obj_best.weights
) - 在
build\darknet\×64
目录下运行darknet.exe detector test data/obj.data yolov4-tiny-obj.cfg yolov4-tiny-obj_best.weights -dont_show -ext_output < data/test.txt > result.txt -thresh 0.25
在build\darknet\×64
目录下得到一个result.txt
文件, 把这个文件复制粘贴到map\input\detection_results
目录下
(到这里以后参考gyl同学的操作会报各种错,所以参考了csm同学的做法)- 在
result.txt
文件的统计目录下放个脚本文件,运行该脚本,将生产的process_result.txt
文档内如覆盖掉原来的result.txt
文件内容,再把result.txt
复制粘贴到map\input\detection_results
目录下
脚本文件代码如下:
# mydarknet/process_result.txt
file_path = 'result.txt'
with open(file_path, 'r') as f:
data = f.readlines()
# print(data)
# 多余的话
stop_lt = ['Detection layer: 30 - type = 28', 'Detection layer: 37 - type = 28 ']
tip_word = 'Enter Image Path: '
new_data = []
for line in data:
flag = True
for stop_st in stop_lt: # 判断每一句停用词
if stop_st in line:
flag = False
if tip_word in line:
new_data.append(tip_word)
if flag:
new_data.append(line)
with open('result_process.txt', 'w') as f:
f.writelines(new_data)
-
打开
map\scripts\extra
目录下的convert_dr_yolo.py
文件, 把里面的代码全部删掉, 换为以下代码, 然后保存文件, 并且运行该文件,运行成功后,到map\input\detection_results
目录下把result.txt
文件删掉 -
修改
scripts/extra/目录下的脚本convert_gt_yolo.py
,然后运行改脚本(这里最后打开cmd运行看看有没有报错,我一开始是报NO module named 'cv2
,在cmd中输入pip install opencv-contrib-python
)
运行成功时:
-
运行
map
目录下的main.py脚本- 如果有报说什么建议你运行
intersect-gt-and-dr.py
,就去运行一遍(到D:\map\input\detection-results
目录下,你会发下少生成了几张图片的测试结果,运行convert_dr_yolo.py
可以删掉没生成测试结果的图片),然后在运行一遍main.py脚本
- 如果有报说什么建议你运行
结果: