小白也能使用yolov5训练自己的数据集实现目标检测
目录
0.yolov5的简单介绍
(1)YOLOv5的核心工作原理包括以下几点:
(2)YOLOv5的优势:
1.下载yolov5资源
2.训练数据集的介绍
3.如何配置文件
4.下载各种依赖和环境
5.训练yolov5模型
6.测试yolov5模型
7.使用yolov5模型进行目标检测
8.训练自己的数据集
0.yolov5的简单介绍
由于本人也是刚刚入门深度学习的行列,对很多理论知识的了解还不够深入,对yolov5的原理只能简单介绍一下,然后大家如果有什么问题,欢迎在评论区里留言或者私信我,我看到之后会很快恢复,希望大家能够一起进步,也欢迎大家关注我,方便交流。(该流程同时适用于ubuntu系统或者windows)
(1)YOLOv5的核心工作原理包括以下几点:
-
网络架构:
- Backbone:CSPDarknet,用于特征提取
- Neck:PANet,用于特征融合
- Head:用于预测目标的类别、位置和置信度
-
预测流程:
- 将输入图像分割成 SxS 网格
- 每个网格预测多个边界框
- 每个边界框包含:
- 中心点坐标(x,y)
- 宽高(w,h)
- 置信度分数
- 类别概率
(2)YOLOv5的优势:
- 速度快:实时检测能力强
- 精度高:在各种数据集上表现优异
- 部署便捷:支持多种推理框架
- 使用简单:配置和训练流程清晰
- 代码开源:社区支持度高
1.下载yolov5资源
项目地址:https://github.com/ultralytics/yolov5/tree/v5.0
首先,我要给初学者提个醒,在github中的项目ultralytics/yolov5中,里面有很多标签,如下图,里面有很多标签的。

如果你直接用这条命令去下载资源 :
git clone https://github.com/ultralytics/yolov5.git
我们可以跳转到你下载的yolov5资源的目录,然后在终端输入
git branch
然后会显示

我们可以看到master的前面带着一个*,这说明我们现在克隆的仓库并不是我们要的yolov5(v5.0)版本的,我们可以大致对比一下下载的文件和我们在github上的yolov5的v5.0的版本的文件是否一致,很明显不一致的。我们可以在终端输入:
git tag
会出现下面的页面

因为我们之前已经在github中看到ultralytics/yolov5这个项目了,然后v5.0的版本是在tags这个标签里,所以我们就使用了git tag来查看这个仓库里面的所有标签。
然后我们现在需要切换到v5.0这个标签的仓库,我们可以输入下面的命令
git checkout v5.0
然后输出这样的页面,表示切换成功

我们为什么要用v5.0这个版本呢,因为这个版本里面使用的模型结构相对简单,对初学者来说是比较友好的,而且master那个分支的代码是比较新的版本的,模型结构稍微复杂,但是很多开源项目使用到训练权重还是以旧版本为主的,我现在在做一些深度学习的模型移植到嵌入式平台中,对一些旧版本的模型使用次数还是相对比较多的,不然以后会遇到比较多的模型版本不一致的情况报错的(当然大家如果有解决不了的报错,欢迎在评论区留言,大家一起讨论)
2.训练数据集的介绍
下载好之后的文件分布是这样的

然后我们打开data这个文件

我们今天只讲coco128.yaml这个数据集配置文件(这个数据集的配置方式比较简单,适合小白理解,不可操之过急,当然大家如果有对其他数据集配置方式有疑问的欢迎在评论区下留言),我们打开coco128.yaml这个配置文件。
# COCO 2017 dataset http://cocodataset.org - first 128 training images
# Train command: python train.py --data coco128.yaml
# Default dataset location is next to /yolov5:
# /parent_folder
# /coco128
# /yolov5
# download command/URL (optional)
download: https://github.com/ultralytics/yolov5/releases/download/v1.0/coco128.zip
# train and val data as 1) directory: path/images/, 2) file: path/images.txt, or 3) list: [path1/images/, path2/images/]
train: ../coco128/images/train2017/ # 128 images
val: ../coco128/images/train2017/ # 128 images
# number of classes
nc: 80
# class names
names: [ 'person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train', 'truck', 'boat', 'traffic light',
'fire hydrant', 'stop sign', 'parking meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep', 'cow',
'elephant', 'bear', 'zebra', 'giraffe', 'backpack', 'umbrella', 'handbag', 'tie', 'suitcase', 'frisbee',
'skis', 'snowboard', 'sports ball', 'kite', 'baseball bat', 'baseball glove', 'skateboard', 'surfboard',
'tennis racket', 'bottle', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl', 'banana', 'apple',
'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza', 'donut', 'cake', 'chair', 'couch',
'potted plant', 'bed', 'dining table', 'toilet', 'tv', 'laptop', 'mouse', 'remote', 'keyboard', 'cell phone',
'microwave', 'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase', 'scissors', 'teddy bear',
'hair drier', 'toothbrush' ]
其实这个文件里就有教大家如何放置自己的数据集位置和如何训练的。
COCO 2017 dataset http://cocodataset.org - first 128 training images,这是coco2017数据集的下载地址(需要魔法,而且初学者可能不太能找好相应的数据集)
Train command: python train.py --data coco128.yaml,这条指令是在终端输入的训练模型的命令,后面我们会讲,现在先不要训练,因为需要环境和依赖还没有安装好。
Default dataset location is next to /yolov5:
/parent_folder
/coco128
/yolov5
这一段解释是告诉我们要在yolov5的目录下创建一个存放我们数据集的文件夹。

我们看到上面训练路径是../coco128/images/train2017/,这个配置默认我们新创建的数据集文件夹的命名为coco128。
download: https://github.com/ultralytics/yolov5/releases/download/v1.0/coco128.zip
这条命令是下载coco128数据集的链接(需要魔法),我们可以直接下载拿来用,然后解压文件,把coco128这个文件直接放在yolov5的目录下就可以的。
【有同学可能问:为什么训练集和测试集用同样的数据集呢?
答:因为我们这里只是做一个小demo,当然我们也可以找一些其他和coco类似的数据集来作为测试集,但是我们作为初学者,先把代码跑通是最重要的,先不用管数据集如何寻找和制作数据集,制作数据集需要用到labeling的标签工具,这个我以后会单独出一个博客来讲解的】

这个nc表示你的数据集中有多少个类,然后names就是你给这些类分别取得名字是什么。
3.如何配置文件
首先,我使用coco128的数据集进行训练,按照上面的地址,直接下载,然后解压,放在yolov5的目录下

然后,修改coco128.yaml

把上面的download给注释掉,因为我们已经自己下载好了,不然之后训练模型的时候,终端里会自动再下载一遍,把后面的路径也修改一下,修改成图片上的形式,不然会检测到路径报错。
4.下载各种依赖和环境
下载各种依赖和环境,需要安装anaconda,如果不知道怎么安装anaconda和创建虚拟环境的,可以参考我的这篇博客
从小白教你如何配置ubuntu20.04的一些基础环境(包括安装ubuntu驱动,cuda,cudnn,anaconda,pytorch)-博客
因为我们在运行一个小demo,所以要创建一个虚拟环境
运行下面的命令创建虚拟环境
conda create -n yolov5 python=3.8
运行下面的命令,激活虚拟环境
conda activate yolov5
运行下面的命令,直接安装所有依赖(不要自己一个一个装依赖,所有的依赖都在requirements.txt这个文件里)
pip install -r requirements.txt
5.训练yolov5模型
找到train.py文件,修改里面的超参数

将这些参数修改成如图所示的路径(保持一致),其他参数配置不用动。
【有同学会问为什么要使用yolov5s.pt这个权重呢?
答:

作为初学者,咱们先从基础的搞起,如果选择yolov5s.pt的权重,--cfg那个参数配置也要选择相应的yolov5s.yaml.

可以看到models这个文件夹里面的也有其他的配置文件,这跟训练权重是保持一致的】
yolov5的训练权重,可以在下面的链接里下载:
https://github.com/ultralytics/yolov5/releases
进入上面的页面,找到v5.0的标题

然后点击再慢慢滑到下面,找到Assets这个小选项,点开

点击之后,出现这些模型,选择yolov5s.pt下载,然后将下载好的模型放到我们自己的yolov5的目录下,(先将之前在github上下载的yolov5s.pt文件删除掉,因为这个权重文件不是v5.0版本对应的权重文件,是比较新的权重文件,对应的是别的版本和标签的,如果不更换,待会运行python train.py进行训练,会报错
AttributeError: Can't get attribute 'SPPF' on <module 'models.common' from 'D:\ project\ git项目\ yolo\ yolov5\ models\ common.py'>
注意:yolo模型训练非常注重版本一致的要求)

然后可以直接运行下面的命令
python train.py
如果报错:

出现这种报错,是因为numpy版本的太高的原因,而v5.0的是比较旧的代码了,某些计算方式更改了规则。因为我们是直接用pip install -r requirements.txt来安装所有环境和依赖的,系统自动安装的话,版本比较高,你可以在命令行输入conda list,查看所有依赖的版本,应该都是比较新的版本)

我们看到numpy的版本为1.26.4,而刚才报错的信息告诉在NumPy 1.20版本中,一些函数和方法的别名被弃用。
可以通过下面的命令解决:
pip uninstall numpy
pip install numpy==1.22
pip安装遇到问题,改用conda
conda install numpy==1.22
然后再运行python train.py
可能会报错:RuntimeError: result type Float can't be cast to the desired output type __int64
这个报错的原因是pytorch的版本比较新,跟刚才的numpy的情况一样,我们可以选择降低torch的版本或者直接修改代码
我们先说修改代码:
打开yolov5项目目录中的utils文件夹下的loss.py文件,找到163行下的def build_targets(self, p, targets):,将gain = torch.ones(7, device=targets.device)改为gain = torch.ones(7, device=targets.device).long(),也就是在末尾添加.long(),保存即可

然后再运行python train.py,就可以正常运行了,训练结果会保存在run这个目录下,训练的迭代(epoch)次数可以在代码里修改
。
说回刚才的torch版本太高的问题,实际上咱们在第一步创建虚拟环境的时候可以先将torch安装下来,一般安装torch1.12版本,就不会有问题的,安装torch之后,对使用pip install -r requirements.txt安装其他依赖没有影响的,系统检测到已经有torch版本的存在的话,也不会再安装高版本的torch了,也可以参考这篇博客
从小白教你如何配置ubuntu20.04的一些基础环境(包括安装ubuntu驱动,cuda,cudnn,anaconda,pytorch)-博客
6.测试yolov5模型
找到test.py,然后修改超参数,修改成下面这样。

运行python test.py就可以对刚才的模型进行测试,测试结果如下:

yolo模型对目标进行检测的主要参考指标是 mAP@.5,只要这个指标大于80%以上就是不错的模型了。我的上面的模型指标偏小的原因是我没有训练完,就终止了,使用的是不好的模型。
7.使用yolov5模型进行目标检测
找到detect.py文件, 超参数修改这样

然后运行python detect.py,在run/detect中找到监测结果。
你也可以将上面的source中的图片路径修改成你的视频路径,也可以直接检测视频的。
如果超参数修改成下面这样,source为0的话,就是调用摄像头,检测(注意尽量不要有中文路径,不然容易报错)。

然后还要记得把utils/datasets.py中的,第279行的代码修改成这样

if 'youtube.com/' in str(url) or 'youtu.be/' in str(url):
再输入python detect.py就可以看到这样的画面了

8.训练自己的数据集
我给大家提供了一份数据集,是关于奶牛的stand和lie两种行为的识别,大家可以自己尝试操作一下,有什么错误的话,可以在评论区里留言,我看到后会解答的。
链接: https://pan.baidu.com/s/1azXUz70pK8BxNzpSIXlsIw?pwd=1111 提取码: 1111
--来自百度网盘超级会员v6的分享
下面是cow_detect的文件分布,其中cow_images里面的图片是不参与训练和测试的,是我们最后用运行python detect.py时,要用到图片检测来源;cow_json的json形式的图像标记,用不到。

将cow_detect这个文件夹放在这个yolov5的目录下

给大家一些提示:
将data中的coco128.yaml文件复制一份,命名为cow_detect.yaml
x
修改里面的参数为下面的样子。
# COCO 2017 dataset http://cocodataset.org - first 128 training images
# Train command: python train.py --data coco128.yaml
# Default dataset location is next to /yolov5:
# /parent_folder
# /coco128
# /yolov5
# download command/URL (optional)
#download: https://github.com/ultralytics/yolov5/releases/download/v1.0/coco128.zip
# train and val data as 1) directory: path/images/, 2) file: path/images.txt, or 3) list: [path1/images/, path2/images/]
train: cow_detect/images/train # train images (relative to 'path') 128 images
val: cow_detect/images/val # val images (relative to 'path') 128 images
# number of classes
nc: 2
# class names
names: [ 'lie', 'stand']
将models中yolov5s.yaml也复制一份,命名为yolov5_cowdetect.yaml,然后将里面的nc修改成2,就是咱们的实际种类数。


然后再去训练模型,修改train.py中的超参数为下面的样子

测试的模型的时候,修改test.py中超参数为下面的样子

检测模型的时候,修改detect.py中的超参数为下面的样子
可以得到这样的结果

