YOLO目标检测项目的学习
一、项目来源
https://github.com/bubbliiiing/yolov4-pytorch/tree/bilibili
二、使用环境
·NVIDIA GeForce RTX 3050 Laptop GPU
·torch==1.2.0
·Python3.8
三、配置运行环境
(一)点进Pycharm的File中的Settings中
(二)找到Settings中的Project中的Python interpreter中
(三)点击Python interpreter后 点击Show All 找到自己所需要的环境,如果没有可以点击左上角的+号自己添加配置项目的环境
四、安装相关依赖
在下载好了并打开项目之后我们还需要安装一些程序运行所需要的包、库。在这里我列出了一些认为应该要安装的一些包、库
1.opencv-python
2.pillow
3.numpy
在安装这些包库的时候我们可以在后面使用一些镜像源来帮助我们快速的安装
国内镜像地址:
阿里云
http://mirrors.aliyun.com/pypi/simple/
中国科技大学
https://pypi.mirrors.ustc.edu.cn/simple/
豆瓣(douban)
http://pypi.douban.com/simple/
清华大学
https://pypi.tuna.tsinghua.edu.cn/simple/
中国科学技术大学
http://pypi.mirrors.ustc.edu.cn/simple/
使用方法:以Python环境下pip安装keras为例
pip install keras==2.3.1 -i http://pypi.douban.com/simple/
//2.3.1为所需版本号,尾部url为对应镜像源地址
原文地址:https://blog.csdn.net/weixin_45687036/article/details/123376144
五、下载数据集
VOC数据集下载地址如下,里面已经包括了训练集、测试集、验证集(与测试集一样),无需再次划分:
链接: https://pan.baidu.com/s/19Mw2u_df_nBzsC2lg20fQA
提取码: j5ge
六、下载权重
训练所需的yolo4_weights.pth可在百度网盘中下载。
链接: https://pan.baidu.com/s/1oXz13QwLx1lnXct538qL2Q
提取码: 16qc
yolo4_weights.pth是coco数据集的权重。
yolo4_voc_weights.pth是voc数据集的权重。
七、数据准备
1.上面的第五、第六两个步骤当中,原项目上提供了相对应的数据集和数据集的权重。在这里,也可以准备了一些其他的数据来进行训练。
2.首先要准备一些我们所需要的图片数据将其放入到原项目中的VOCdevkit文件夹下的VOC2007文件夹下的JPEGImages中,同时我们还要对我们所添加的数据进行标注,这里我使用的工具是labelImg_exe。不清楚的同学可以通过下面的链接进行查看
3.对图片的标注完成以后将所有的标签文件放在VOCdevkit文件夹下的VOC2007文件夹下的Annotation中。
labelImg链接:https://blog.csdn.net/J_oshua/article/details/130017483
八、训练过程
训练的过程主要是包括:
1.数据的准备
数据的准备就是先将我们所需要的图片数据和标签数据分别保存到VOCdevkit文件夹下的VOC2007文件夹下的JPEGImages文件夹和Annotation文件夹中
我们将所有的xml标签保存到了VOCdevkit文件夹下的VOC2007文件夹下的Annotation中
图片的数据我们保存到了VOCdevkit文件夹下的VOC2007文件夹下的JPEGImages中
下面的这些是我们准备的一些图片数据
在里面我们使用的图片数据最好都是JPG格式的图片,防止我们在读取图片的时候会发生错误,同时我们也要注意我们的图片在Pycharm中是否能够正常的去读取。
2.数据的处理
在完成数据集的摆放之后,我们需要利用voc_annotation.py获得训练用的2007_train.txt和2007_val.txt。
修改voc_annotation.py里面的参数。第一次训练可以仅修改classes_path,classes_path用于指向检测类别所对应的txt。
训练自己的数据集时,可以自己建立一个cls_classes.txt,里面写自己所需要区分的类别。
在这里我是建立了一个属于自己的cls_classes.txt来保存自己所需要区分的类别
3.开始网络训练
训练的参数较多,均在train.py中,大家可以在下载库后仔细看注释,其中最重要的部分依然是train.py里的classes_path。
classes_path用于指向检测类别所对应的txt,这个txt和voc_annotation.py里面的txt一样!训练自己的数据集必须要修改!
修改完classes_path后就可以运行train.py开始训练了,在训练多个epoch后,权值会生成在logs文件夹中。
在一开始的训练当中我们也是遇到了各种各样的小问题,例如:在找不到指定的图片路径地址(路径问题(No such file or directory、StopIteration: [Errno 13] Permission denied: ‘XXXXXX’))
这个问题是最常见的一个问题,也是最容易出错的一个问题。
对于上面的这个问题一开始我是按照原文作者的方法去检查的首先你要去检查一下文件夹路径,查看是否有对应文件;并且检查一下2007_train.txt,其中文件路径是否有错。
关于路径有几个重要的点:
1.文件夹名称中一定不要有空格。
2.注意相对路径和绝对路径。
3.多百度路径相关的知识。
在通过对应的检查之后,发现问题还是没有解决,于是我怀疑问题发生在图片本身,于是我去检查了图片,发现我们在其他地方是能够正常的去打开文件并显示的,但是有些图片在Pycharm是无法显示的,所以最后我也是对一些打不开的图片进行了一个清理。
通过清理了这些照片之后我们就可以顺利的进行网络训练了。
在这里我只是通过了第一次训练就对图片进行了预测,但是在我运行predict.py文件进行预测时又发生了一个小问题。
我通过翻译发现了这个问题的意思是参数不匹配问题,随后我先是按照原文作者的方法去检查了我的相关设置
主要的问题如下:
1、训练的classes_path没改,就开始训练了。
2、训练的model_path没改。
3、训练的classes_path没改。
4、要确定自己所用的model_path和classes_path是对应的!训练的时候用到的num_classes或者classes_path也需要检查!
在model_path和classes_path进行检查之后,还是没有能够去解决,于是我在csdn社区上不断的去寻找问题的解决方法。直到了我看到了一个博主的文章之后发现过报错信息,不匹配的地方主要是在最后的层数上,且只有一个数据对不上,即本人训练得到的数据中,第一个参数数量162是,而初始换的结构式定下的参数数量是255。通过对比YOLOV3的结构参数可以知道该参数应该为最后输出的channel数。本人数据集总共分为10类,每个图片三个bbox,3*(10+4+1)=45,符合我的训练模型。而初始化的参数数量为255,即对应80个类。原因在于初始化结构是默认根据COCO数据集的80个类建立的,相关代码如下:
class YOLO(object):
_defaults = {
"model_path" : 'model_data/yolo_weights.pth',
"classes_path" : 'model_data/coco_classes.txt',
"model_image_size" : (416, 416, 3),
"confidence" : 0.5,
"iou" : 0.3,
"cuda" : True,
这部分代码在yolo.py文件之中。
可以看到classes_path的路径为model_data/coco_classes.txt,点开该文件可以看到这里面保存着coco数据集80个类别的信息
于是我在我自己的标签文件当中去查看了一下,发现自己的标签已经远远的大于80个标签类。于是现在在我面前有两个解决的方法:1.更改参数数量;2.就是删除掉一些标签。对于像我这样的小白我选择了第二种方法,将一些标签删除掉。
到此,我在完成这个项目在训练时所遇到的一些问题都得到了解决。训练之后就可以开始预测了
原文链接:https://blog.csdn.net/xhxzdxm/article/details/115448309
九、训练结果预测
1.注意训练前所需要做的事
1、训练结果预测需要用到两个文件,分别是yolo.py和predict.py。在yolo.py里面修改model_path以及classes_path。
2、model_path指向训练好的权值文件,在logs文件夹里。
3、classes_path指向检测类别所对应的txt。
完成修改后就可以运行predict.py进行检测了。运行后输入图片路径即可检测。
2.在yolo.py中使用自己训练的权重
在yolo.py文件里面,在如下部分修改model_path和classes_path使其对应训练好的文件就可以运行predict.py文件来进行预测了
3.在运行predict.py文件后输入自己要预测图片的路径地址
得到的结果如下:
从图片上的结果来看的话,我们发现这个预测是不准确的。准确率很低,随后我们对原有模型上的图片进行了预测
得到的结果如下
在这里我们发现原来的模型预测是比较准确的,于是我就开始返回去检查。
考虑几个问题:
1、数据集问题,这是最重要的问题。小于500的自行考虑增加数据集;一定要检查数据集的标签,视频中详细解析了VOC数据集的格式,但并不是有输入图片有输出标签即可,还需要确认标签的每一个像素值是否为它对应的种类。很多同学的标签格式不对,最常见的错误格式就是标签的背景为黑,目标为白,此时目标的像素点值为255,无法正常训练,目标需要为1才行。
2、是否解冻训练,如果数据集分布与常规画面差距过大需要进一步解冻训练,调整主干,加强特征提取能力。
3、网络问题,可以尝试不同的网络。
4、训练时长问题,有些同学只训练了几代表示没有效果,按默认参数训练完。
5、确认自己是否按照步骤去做了。
6、不同网络的LOSS不同,LOSS只是一个参考指标,用于查看网络是否收敛,而非评价网络好坏,LOSS的值不重要,重要的是是否收敛。
针对上面的问题,对此我觉得可以通过增加一定量的数据集来进行训练才能够有更好的预测结果
十、总结
本文提供了一个详细的学习指南,介绍了如何学习和使用YOLO目标检测项目。从项目来源、环境配置、依赖安装、数据集下载和准备、训练过程到训练结果预测等各个方面都进行了详细的说明。读者可以通过本文了解如何系统地使用YOLO进行目标检测,并且在实践中能够更好地理解和应用所学知识。在通过这次的项目学习,我也学会了怎么去检查所遇到的问题,并对他进行解决,这让我有了一个比较深刻的印象,可以让我在后面碰到同样的问题时,可以更快速的去检查并解决。
注:其他相关的问题大家可以通过原文作者的链接去寻找解决,那里会有更加详细详细的问题汇总
问题汇总原文链接:https://blog.csdn.net/weixin_44791964/article/details/107517428