目录
一、环境准备
-
yolov5是主要的作用:给定一个已经标好的数据集》跑yolov5代码得到一个目标检测模型》选择一个图片或者视频等再给yolov5代码,yolov5代码就能自动识别区分出目标体
-
本机配置: Win11,Anaconda(python3.7),GTX3050,cuda11.1,pytorch1.8, yolov5,建议先查自己电脑上cuda版本信息:
打开cmd窗口输入nvidia-smi
查看,或者通过NVIDIA控制面板查看
-
pytorch环境准备:首先电脑上已有anconda,然后打开cmd执行命令如下(与我上面的配置对应的),比如搜索
# CUDA 11.1
打开cuda 各个版本对应安装命令搜索,如果遇到问题可以看这篇文章有稍详细的安装步骤conda create --p=D:\Programmer\Captcha_env python=3.7 activate D:\Programmer\Captcha_env conda install pytorch==1.8.0 torchvision==0.9.0 torchaudio==0.8.0 cudatoolkit=11.1 -c pytorch -c conda-forge
-
下载yolov5,下载压缩包地址 ,然后解压即可
-
yolov5相关python依赖包安装:在yolov5-master当前目录下打开cmd窗口,然后进入之前建的虚拟环境如
activate D:\Programmer\Captcha_env
,然后安装依赖pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/
activate D:\Programmer\Captcha_env pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.tsinghua.edu.cn
二、yolov5代码简单介绍
1、yolov5代码中train.py
- 在yolov5代码中,我们训练主要运行
train.py
文件,测试主要运行detect.py
文件;所以其实只要准备个数据集
,再改改这两个文件的如图的主配置比如改要训练或者测试的是哪个数据集路径,图片大小等,然后就走完流程了。
- yolov5代码
train.py
的重要参数介绍:
train.py
的参数weights
简单介绍:指定权重模型,如:yolov5s.pt / yolov5m / yolov5l/ yolov5x(可以理解为s小码,m中码,l大码,xl大大码,对应的检测速度分别都是从快到慢,但是精确度分别是从低到高)
2、yolov5代码中detect.py
- yolov5代码
detect.py
的重要参数介绍:
3、yolov5代码待准备的数据集文件格式
- yolov5待训练的数据集自定义准备格式一般如下:分三部分
训练集+验证集+.yaml配置
,其中images文件夹下都是已标记的图片,labels都是yolo格式的.txt文件,images与labels里是一一对应的,只是后缀名不一样
yolo格式的标签为txt格式的文件
:文件名跟对应的图片名一样,除了后缀改为了.txt-
每个目标一行,整个图片没有目标的话不需要有txt文件,或者空文件
-
`每行的格式为5个参数:class_num(分类索引,比如0代表戴口罩,1代表没带口罩),后4列是x_center/image_width、y_center/image_height、width/image_width、height/image_height,取值范围是0 ~ 1
-
其中class_num取值为0至total_class - 1,如下图四个值x_center相对于图片坐标轴是0.48,y_center相对于图片坐标轴是0.63,width图片的宽度是0.69, height图片的高度是0.71;之所以图片数值进行归一化,是因为训练的图片尺寸有很多种,这样通过归一化就可以统一了
-
.yaml的配置文件
:主要就指定了训练和验证的图片路径,以及分类数量和名称
三、一个极小的测试识别案例
- 用官网已有的模型测试yolov5是否正常运行:打开pychram
直接运行detect.py文件
(detect.py文件:用已经预训练过的模型进行预测识别测试,如yolov5s.pt模型) - 运行过程中它会
自动下载一个yolov5s.pt模型
,如果下载不下来,可以直接到这个连接进行权重模型下载,和train.py在同一个目录下;然后自动识别data/images目录下的两张图片
,然后会自动生成一个新的文件夹runs>detect>exp用来存识别出的结果
。
- 如下在runs>detect>exp文件夹下识别结果,已经自动识别出了目标是bus还是person,并进行了标注
四、公开的数据集【口罩】训练并识别案例
-
公开的数据集roboflow网,这里面有很多数据集,我这里下载了口罩的数据集,图片大概149张;其他公开数据集DataCastle网,极市网,其他等
-
首先我们下载口罩数据集一个已标注好的数据集解压后存放到
我新建的一个文件夹下MaskWearing
,该文件夹的目录
-
MaskWearing数据集介绍:主要
有3个:训练图片的数据集,验证图片的数据集,以及data.yaml配置
。其中images文件夹就是放图片的,labels文件夹下放的是yolo格式的.txt标签文件,images文件夹与labels文件夹的内容是一一对应的,文件名都是一样的,后缀不一样。data.yaml则是配置文件下面详细介绍
-
更改yaml文件配置:如图
data.yaml修正数据集存放路径
,其中train指的是待训练的图片文件路径,而val指的是待验证的图片路径,而nc代表2个分类,names代表对应两个分类的名称;基于yolov5s.pt训练的就修改yolov5s.yaml里的nc分类
,根据data.yaml的nc分类数量进行修改
-
修改train.py参数然后开始训练
:训主要修改以下几个参数,运行练完会自动生成runs>train>exp>weights文件夹,其中文件夹下会生成一个best.pt
权重模型weights
:选择模型权重,如:yolov5s.pt / yolov5m / yolov5l(可以理解为s小码,m中码,l大码,对应的检测速度分别都是从快到慢,但是精确度分别是从低到高)cfg
:指定模型配置文件位置如models/yolov5s.yamldata
:指定自己的数据集配置文件位置如./MaskWearing/data.yamlepochs
: 指定训练轮数,默认初始设置为300,如本次口罩的数据集149张图片,我开始设置的3训练出来的模型效果不好,测试并没有正确框出口罩,设置成10后就正常识别目标了,所以根据实际情况进行调整batchsize
: 根据GPU的显存大小进行设置,一般为2的倍数,我这里设置4img-size
:图片分辨率缩小或者放大的尺寸,默认640,根据世界调整
-
如果报错
OSError: [WinError 1455] 页面文件太小,无法完成操作。
,则看这篇文章解决 ,直接搜索查看高级系统设置,然后按图片中处理,保存后重启电脑就正常了;如果这个设置了还是报错以及没有解决问题的话,先把它恢复成之前自动管理所有驱动器的默认状态,保存应用后,再次重新打开再按图片操作一次。
-
修改detect.py参数然后开始测试识别
,训练完后会自动生成runs>detect>exp文件夹,该文件夹下有识别的结果,至此训练到测试识别的小demo已完成weight
:指定前面训练好的权重模型文件位置source
:指定检测识别的单个图片,或者图片文件夹路径,或者视频路径,或者摄像头
五、自己标注数据集【点选】训练并识别案例
1、利用labelimg标注数据集生成yolo格式
- labelimg是一款数据标注工具,可以标注如下三种格式:① VOC标签格式,保存为xml文件,② yolo标签格式,保存为txt文件,③ createML标签格式,保存为json格式;本次标注选择yolob标签格式
- labelimg的安装:
pip install labelimg -i https://pypi.tuna.tsinghua.edu.cn/simple
activate D:\Programmer\Captcha_env\ pip install labelimg -i https://pypi.tuna.tsinghua.edu.cn/simple
- 新建2个文件夹:一个是存放图片的images,一个是存放标签的labels,cmd继续输入
labelimg
即可进入标注首页activate D:\Programmer\Captcha_env\ labelimg
- 按如下图片进行设置,记得一定要先选择
yolo
格式,然后再开始标注
注意点:无论是代标注的图片,还是路径,还是标签名称,尽量都不要写中文,否则会有意想不到的错误,比如可能一直运行不起来并报错OSError: [WinError 1455] 页面文件太小,甚至pycharm闪退等
- 如图将准备的图片进行标注,按
w键
就可以开始标注,然后自定义标签分类,也可以设置在右侧设置默认分类,保存好后在你保存标签的文件夹会自动生成yolo格式的.txt文件
,其中有个总的classes.txt
这个会按标注出现的顺序统计你所有的类别名称;然后就标注完成
2、数据集格式标准化
-
首先新建一个空的文件夹,里面新建
make_file.py
如下,运行后会自动生成一些必要的文件夹路径如images,labels, .yaml;然后把已标注好的图片和标签分别复制放到相应的文件夹就行;.yaml文件配置根据你的具体情况设置
import os def make_data_dir_yaml(yaml_name, data_dir_name, nums, class_names): # 生成数据集必要图片和标签文件夹 for dirs in ['train/images', 'train/labels', 'valid/images', 'valid/labels']: try: os.makedirs(dirs) except FileExistsError: print(f'{dirs} 目录已存在') # 生成数据集配置.yaml with open(yaml_name, "w", encoding='utf-8') as f: f.write(f"train: ./{data_dir_name}/train/images\n") f.write(f"val: ./{data_dir_name}/valid/images\n") f.write("\n") f.write(f"nc: {nums}\n") f.write(f"names: {class_names}\n") make_data_dir_yaml('test.yaml', 'ClickData', 3, ['dog', 'cat', 'pig'])
3、训练与测试识别
-
train.py
训练改如下几个地方,着重看下--data
,路径就是改成你自己数据集的.yaml文件,其他几个配置看实际情况调整,具体参数含义介绍看前面目录二有;然后运行train.py就开始训练了
-
训练完后结果会自动生成到runs/train/exp文件夹下,视频的7分钟~10分钟处会介绍训练结果生成的文件夹下runs/train/exp各个文件的含义
-
detect.py
识别待测试的图片,如下改几个配置,着重看下--weights 和--source
这两个配置,一个选择训练好的权重模型,一个选择待测试的图片,然后运行,最终会在yolov5-master/runs/detect/exp路径下会自动生成测试结果
-
val.py
:单独对权重文件进行验证,显示图片耗时以及识别的精度这里0.187比较低
-
至此整个流程差不多就结束了,还可以继续优化比如识别结果输出坐标等