一、什么是YOLOv4
YOLOv4是一种高效且准确的目标检测算法,它是在YOLOv3的基础上进行了多项改进,从而实现了速度与精度的较大提升。具体来说,YOLOv4的贡献主要体现在以下几个方面:
- 设计思路与框架原理:在输入端,YOLOv4使用了Mosaic数据增强、cmBN跨小批量标准化、SAT自对抗训练等技术;在BackBone层(主干网络),它采用了CSPDarknet53网络来提取特征,并结合了Mish激活函数和Dropblock正则化等策略。此外,YOLOv4还使用了多尺度训练和数据增强策略来提高模型的泛化能力和检测精度,以及多尺度推理和后处理技术来提高检测速度和准确性。
- 性能表现:在MS COCO数据集上,YOLOv4实现了实时检测的最优表现,它在Tesla V100上以65 FPS运行,AP达到43.5%。与YOLOv3相比,YOLOv4的AP和FPS分别提高了10%和12%。
- 应用场景:由于其高性能和广泛的应用前景,YOLOv4已被用于各种复杂场景的物体检测任务,如安防监控、自动驾驶、工业检测以及医疗影像分析等。
总的来说,YOLOv4是一种具有显著优势的目标检测算法,它不仅提升了检测速度和精度,而且具有广泛的适用性。如需更多关于YOLOv4的详细信息,建议查阅相关论文或技术文档。
本实验基于代码Github开源代码:GitHub - bubbliiiing/yolov4-pytorch: 这是一个YoloV4-pytorch的源码,可以用于训练自己的模型。
二、环境配置
(一)Anaconda的安装
Anaconda安装的路径一定要是全英文的,有中文容易报错
使用Win+r 后输入 cmd
通过以下命令查看anaconda、python的版本
(二)Pytorch(深度学习框架)
PyTorch 是一个开源的Python机器学习库,PyTorch的前身是Torch,其底层和Torch框架一样,是一个以Python优先的深度学习框架,不仅能够实现强大的GPU加速I同时还支持动态神经网络。(即 PyTorch 既可以看作加入了GPU支持的numpy,同时也可以看成一个拥有自动求导功能的强大的深度神经网络。│
在Anaconda Prompt命令行依次输入以下四条命令切换到清华镜像源(先切换镜像源为国内清华镜像源,这样安装包的时候下载速度会快一些,也容易成功一些。)切换镜像源为非必要操作
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --set show_channel_urls yes
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
查看镜像源命令:conda config --show channels,
切换到自己安装Anaconda目录的envs路径下,接下来创建一个名为pytorch的环境,并在环境中安装版本为3.8.5 的 python,命令如下(这里安装的 python版本根据自己的需要设置)。
conda create --name pytorch python=3.8
通过以下命令查看虚拟环境pytorch 是否已配置好python3.8.5版本
python --version
输入以下命令来查看已有的Conda环境信息,可以看到pytorch环境已经添加成功了
conda info -e
激活PyTorch环境:conda activate pytorch
1.安装pytorch
查看自己电脑cuda最大的支持版本(为pytorch安装做准备)
WIN+R进入命令框,输入cmd
在cmd中输入nvidia-smi ,(说明最大cuda支持版本为11.6)
到Pytorch官网复制适合自己电脑安装pytorch 的命令,如下图所示。
官网地址为: https://pytorch.org/
建议切换镜像源,即去掉末尾的默认pytorch 镜像,选择国内的清华大学镜像
conda install pytorch==1.12.1 torchvision==0.13.1 torchaudio==0.12.1 cudatoolkit=10.2 -c Index of /anaconda/cloud/pytorch/win-64/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
将上面的命令输入到自己设置的 pytorch虚拟环境路径下
2.测试Pytorch深度学习框架是否成功安装
在pytorch环境下,输入python,进入python环境中输入import torch,顺利出现下一行即为成功
查看torch版本
import torch
print(torch.__version__) #注意是双下划线
torch.cuda.is_available()
(三)pycharm的安装
官网下载地址:PyCharm: the Python IDE for data science and web development
- 访问官网下载安装包。打开PyCharm的官网,找到对应的版本进行下载。有两个版本可供选择,专业版和社区版。专业版功能更丰富,社区版则相对简化,对于初学者或日常学习使用,社区版通常就足够了。
- 安装PyCharm。下载完成后,双击安装包开始安装。首先选择安装路径,然后根据自己的需求选择相关配置,如是否创建桌面快捷方式、是否添加到系统环境变量等。之后点击“Install”进行安装,完成后可以选择立即重启或稍后重启。
- 激活与启动。安装完成后,首次启动PyCharm会提示用户许可证协议,需要同意后才能继续使用。如果是专业版,可能还需要进行激活操作。完成后,就可以开始使用PyCharm进行python开发了。
安装好后打开pycharm的setting,将anaconda的python解释器添加进来并使用。
在anaconda的Anaconda prompt(以管理员身份运行)中下载需要用到的python库(需先激活PyTorch环境并进入到你的envs文件夹下,再下载,这样不容易出错)
下载本次项目需要用到的python库:opencv-python、pillow、numpy、os、matplotlib、shutil、tqdm、datetime等(缺什么库就下载什么库即可)
在安装这些库时,我们可以使用镜像源来帮助我们快速安装:
南京邮电大学开源镜像网站地址:https://mirrors.njupt.edu.cn/
清华大学开源软件镜像站地址:https://mirror.tuna.tsinghua.edu.cn/
中国科大开源软件镜像站地址:http://mirrors4.ustc.edu.cn/
网易开源镜像站地址:http://mirrors.163.com/
阿里云开源镜像站地址:http://mirrors.aliyun.com/
腾讯云开源镜像站地址:https://mirrors.cloud.tencent.com/
豆瓣开源镜像站地址:https://pypi.douban.com/simple/
示例:pip install 下载的库名字 -i 开源镜像网址
pip install opencv-python -i https://pypi.douban.com/simple/
三、数据准备
(一)数据集的准备
准备我们想要检测的目标图像数据集,这里我想检测的是喜羊羊与灰太狼的人物识别,所以我爬取了二百多张关于喜羊羊与灰太狼的图片(数据集要图像500张以上更好),图片要统一格式,我统一的格式为jpg。准备完图像数据集需要使用labelImg_exe对jpg数据集进行标注成VOC数据集,不会标注的可以看相关博客:深度学习-使用Labelimg数据标注_深度学习图片标注 labelimg标注图片-CSDN博客
训练前将标签文件放在VOCdevkit文件夹下的VOC2007文件夹下的Annotation中。
训练前将图片文件放在VOCdevkit文件夹下的VOC2007文件夹下的JPEGImages中。
训练所需的数据集可在百度网盘中下载。VOC数据集下载地址如下,里面已经包括了训练集、测试集、验证集(与测试集一样),无需再次划分:
链接: https://pan.baidu.com/s/19Mw2u_df_nBzsC2lg20fQA 提取码: j5ge
(二)设置检测目标标签
训练自己的数据集时,可以自己建立一个cls_classes.txt,里面写自己所需要区分的类别。或者在model_data下的voc_classes.txt里添加目标标签,要全英文的,不能含有中文和其他字符。
(三)数据集的处理
在完成数据集的摆放之后,我们需要利用voc_annotation.py获得训练用的2007_train.txt和2007_val.txt。 修改voc_annotation.py里面的annotation_mode=2,第一次训练可以仅修改classes_path,classes_path用于指向检测类别所对应的txt。 运行voc_annotation.py生成根目录下的2007_train.txt和2007_val.txt。
(四)检查路径
仔细检查train.py里的模型路径,标签路径,数据集路径等是否正确,不然容易报错找不到文件。
路径文件夹不能为空,且不可以存在空格,一定要仔细检查,不然容易报错。
四、训练过程
训练所需的yolo4_weights.pth可在百度网盘中下载。
链接: https://pan.baidu.com/s/1oXz13QwLx1lnXct538qL2Q 提取码: 16qc
yolo4_weights.pth是coco数据集的权重。
yolo4_voc_weights.pth是voc数据集的权重。
train.py的默认参数用于训练VOC数据集,直接运行train.py即可开始训练。(需要仔细阅读注释,第一次训练大部分参数不需要修改,只需要修改对应的classes_path路径,使路径正确)
训练成功如下,输出我们设置的参数,还有训练成功的进度条:
五、训练结果预测
训练好模型,我们就可以使用predict.py文件进行预测结果,不需要修改,直接运行即可。
运行输入预测图片的路径,确认后它会运行弹出预测图片(预测会有线框),由于我的数据集少,训练效果很不好,预测不出来,要么没有线框,要么准确率很低。为什么我的训练效果不好?预测了没有框(框不准)我在网上找到了一些解决办法1、目标信息问题,查看2007_train.txt文件是否有目标信息,没有的话请修改voc_annotation.py。 2、数据集问题,小于500的自行考虑增加数据集,同时测试不同的模型,确认数据集是好的。 3、是否解冻训练,如果数据集分布与常规画面差距过大需要进一步解冻训练,调整主干,加强特征提取能力。 4、网络问题,比如SSD不适合小目标,因为先验框固定了。 5、训练时长问题,只训练了几代表示没有效果,按默认参数训练完。 6、确认自己是否按照步骤去做了,如果比如voc_annotation.py里面的classes是否修改了等。 7、不同网络的LOSS不同,LOSS只是一个参考指标,用于查看网络是否收敛,而非评价网络好坏,LOSS的值不重要,重要的是是否收敛。 8、是否修改了网络的主干,如果修改了没有预训练权重,网络不容易收敛,自然效果不好。
所以很有可能是我的数据集不够,我需要增加数据集。
预测其他数据集准确有线框图片示例:
YOLOv4中的get_map文件是用于计算模型在目标检测任务上的平均准确率均值(mAP,mean Average Precision)的工具。mAP是衡量目标检测算法性能的重要指标,它综合考虑了模型在不同物体类别上的检测性能。
预测准确可以使用get_map.py文件计算性能指标,先打开yolo.py文件设置model_path地址填入logs下训练好的loss模型,例如我下图的ep010-loss0.263-val_loss0.206.pth。classes_path与训练和预测的一致即可。
然后将get_map里的classes_path里与训练和预测的一致即可,map_mode根据需求修改,默认为0。
运行get_map
文件后,它会加载测试集图像和对应的标注文件,然后利用训练好的模型对测试集进行推理。对于每个测试图像,模型会输出预测的目标物体类别和边界框坐标。
get_map
文件会根据模型的预测结果和标注文件中的真实标签计算每个类别的平均准确率(AP,Average Precision)。然后,它会将所有类别的AP值进行平均,得到最终的mAP值。
在计算AP值时,通常会使用IoU(Intersection over Union)阈值来判断预测边界框与真实边界框的匹配程度。IoU阈值是一个介于0到1之间的数值,用于确定预测是否正确。例如,如果IoU阈值设置为0.5,那么只有当预测边界框与真实边界框的IoU值大于或等于0.5时,才认为该预测是正确的。
由于我的get_map有问题识别不出来定义函数,get_map运行不出来,这里就不做示例。
六、总结
本文介绍了使用YOLOv4算法进行喜羊羊与灰太狼动画人物目标检测的过程。通过环境搭建、准备数据集、训练模型、测试模型等步骤,展示了YOLOv4在动画人物检测方面的应用。虽然在实际应用中可能还存在一些问题,但YOLOv4算法的高效性和准确性使其在目标检测领域具有广泛的应用前景。
在这次作业中我遇到许多的问题,我也在网上寻找了一些解决办法,这使我学习到很多,例如调参和目标检测的原理等
想要训练自己的数据集,数据集的准备是目标检测任务中至关重要的一步,需要收集了大量的喜羊羊与灰太狼动画图片,并进行了精确的标注工作。这个过程虽然繁琐,但对于确保模型的训练效果是不可或缺的。一个完整、准确的数据集能够提供足够的信息供模型学习,从而使其能够更好地识别目标物体。通过这次作业,我也深刻体会到了深度学习的强大和魅力。使用官方的数据集进行训练,YOLOv4算法的高效性和准确性让我对目标检测任务有了更深入的了解。同时,我也意识到数据集的准备和模型的训练是目标检测任务中不可或缺的两个环节。只有在这两个环节上做好充分的准备和优化,才能取得更好的检测效果。我相信随着深度学习技术的不断发展和完善,目标检测算法的性能将会得到进一步的提升。同时,我们也可以将目标检测技术应用于更多的领域和场景中,如人脸识别、物体追踪等,为实际应用提供更多可能性。
注:本人新手小白,第一次使用YOLOv4模型,如有错误望指正,可以私信或评论区留下您的见解。