用 gun/sword 数据集训练你的物体检测模型,并对数据集中的验证集进行检测,计算出 mAP

本文详细介绍了如何在Windows环境下配置CUDA,安装OpenCV3.4.0,以及搭建Darknet框架的过程。通过VS2019编译Darknet,并针对不同CUDA版本进行相应配置。在训练和测试YOLOv3模型时,使用VOTT工具进行数据标注,并解决训练过程中的问题。最终,进行了模型验证,计算mAP,确保模型性能。整个流程涉及计算机视觉和深度学习的基础知识,适合初学者参考。
摘要由CSDN通过智能技术生成

环境配置

查看电脑的cuda版本

nvidia-smi

在这里插入图片描述

在这里插入图片描述

下载和安装opencv3.4.0
  • 下载地址:https://opencv.org/releases/page/4/

    • 我下载的是3.4.0的,安装其实很简单,只需要运行exe文件(运行的时候要记得关掉杀毒软件,我的傻舍友lxm因为这个问题搞了一晚上,还以为是她电脑的问题哈哈哈哈,结果把她的杀毒软件关掉就好可以了哈哈哈哈,幸好没有杀毒软件哈哈哈)
下载\安装和配置darknet
  1. 下载链接:https://download.csdn.net/download/weixin_42146230/18614951(感谢csm同学提供的各类衔接,真的让复习大物的我省了好多时间呜呜呜)

  2. 解压后得到一个darknet-master文件
    在这里插入图片描述

  3. 到darknet-master\build\darknet\文件夹中,找到darknet.vcxproj文件,将以下两处改成你安装的cuda版本
    在这里插入图片描述
    在这里插入图片描述

  4. 在vs中打开darknet-master\build\darknet中的darknet.sln,如果出现下面这个就按确定
    在这里插入图片描述

  5. 在【项目】 ->【 属性】->【VC++目录】中的包含目录和库目录放入opencv的目录路径

    在这里插入图片描述
    在这里插入图片描述

  6. 在【项目】 ->【 属性】->【链接器】->【输入】的附加依赖项中加入下面的lib
    在这里插入图片描述

  7. 【生成】->【生成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 文件里面的subvisionbatch 改为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脚本
      在这里插入图片描述

结果:

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值