个人体验yolov5最大的感觉就是惬意舒适。
比起object_detection
一个训练花费我10小时,一个只有1.1个小时(都是迁移训练)
一个检测速度等待了十几秒,一个只需0.01秒(一张图)
一个使用找资料教程忙活了一个月把,一个只有GitHub的官方教程(tf1与tf2无法通用搞得人头大)
刚接触yolo时还是v3,现在转眼间已经是v11了。这个笔记系列当初是在v5的基础上写的,最近想着趁v11出来了更新一下。从官方给的性能图来看v10和v11大概是走到此类任务的天花板了,未来几年目标检测的任务可能不会再有很巨大的提升。
1. 安装yolov11
上一篇也讲过一遍,完成了可以跳过这一步。
pip install ultralytics
pip install ultralytics -i https://pypi.tuna.tsinghua.edu.cn/simple #网络不好的话
2. 运行yolov11
命令
安装好后,先理解一下命令的意思
yolo TASK MODE ARGS # 通用格式
# TASK 任务包含这些[detect, segment, classify, pose, obb]
# MODE 模式包含这些[train, val, predict, export, track, benchmark]
# ARGS 参数,比方说imgsz=320, conf=0.25, source=0, device=0.
现在来到任意文件下运行
yolo detect predict model=yolo11n.pt source=0 conf=0.25
# 使用预测模式进行目标检测任务,参数模型是yolo11n.pt,输入来源是本地0号摄像头,过滤掉置信度小于0.25的数据。
yolo predict model=path/to/best.pt source=path/to/xxx.jpg
# 使用预测模式进行模型匹配的任务,参数模型是本地的best.pt,输入来源是本地的xxx.jpg。
# 可以省略TASK参数,如果你的模型是标准yolo模型,yolo框架会自动匹配模型的任务。
如果你是Mac电脑和iPhone手机,都绑定一个Apple id,那么使用source=0来检测可以直接调用iPhone的摄像头来测试。
2. 标注数据
标注文件参考我之前的文章2020年tensorflow定制训练模型笔记(2)——制作标签中的第二步“2.labelimg”
注意
有一点不一样!
之前我们的数据保存的是xml格式,而yolo支持的是txt格式。
所以我们在保存的时候要点击下图红色选框,这样就能保存为txt格式。
还有要注意的是,图片和标注的命名不要出现中文!!!
图片的格式并无太大的要求,实测jpg、jpeg、png混标没有问题。
还有一个很关键的点,许多人训练出来的识别对象会出现固定的标签不符合的现象。这是因为在训练过程中,yolo网络是不认识你的标签名的,网络只按照特定的标签名顺序将他们理解为0、1、2、3······(通过下面会提到一份yaml文件)
在标注的文件夹里有个data文件夹
我之前搞了垃圾识别的项目,按图所示,从上往下分别会被理解为0~4
这要和下面要输入网络的data.yaml文件相对应。这样就可以确保识别出的标签会被对应上。
数据格式
基本上所有的yolo教程都会讲这个txt格式那我也就讲一讲
我用一个表格去列一下上面的数据
标签名 | 中心点x的相对坐标 | 中心点y的相对坐标 | 宽度的相对坐标 | 高度的相对坐标 |
---|---|---|---|---|
2 | 0.7406 | 0.7614 | 0.1843 | 0.2562 |
1 | 0.3203 | 0.8791 | 0.1562 | 0.1375 |
``` |
相对坐标就是x值相对于整张照片的大小,官方有张图能很好的解释这个
3. 配置文件
配置文件路径
假设我现在要识别的是垃圾分类,文件夹取名为“train_lj”,按图片方式放置好文件。
照片放在images对应的文件夹下,标签放在labels对应的文件夹下。
train_lj文件夹里包含三个文件,一个“images”文件夹专门放置图片文件,一个“labels”文件夹专门放置标注的文件,一个data.yaml文件专门指引程序告知训练文件信息的文件。
images里的图片文件按8:1:1分配给train文件夹、test文件夹、val文件夹。
labels里的标注文件也同理,文件名一一对应。
配置数据的yaml文件
在train_lj文件夹里创建一个空的data.yaml
# Train/val/test sets as
# 1) dir: path/to/imgs
# 2) file: path/to/imgs.txt or list: [path/to/imgs1, path/to/imgs2, ..]
path: /home/pzr/Desktop/train_lj # 数据集的根目录
train: images/train # 图片的训练集路径(相对path的路径)
val: images/val # 图片的验证集路径(相对path的路径)
test: images/test # 图片的测试集路径(相对path的路径,可选不填)
# 按前面标注的类来写
names:
0: harmful
1: recyclable
2: kitchen
3: other
4: full
之前版本的一些可能的报错处理(没遇到的跳过)
使用4.0版本会要求增加一个pandas的库,这个大家直接用conda或者pip安装一下就好了。
但另外一个问题就比较难搞,它会检查pycocotools的2.0版本级及以上是否存在。
win10安装pycocotools是十分不友好的,下面的方法用于解决这个问题。linux系统的可以绕过下面的内容。
方法一:安装pycocotools
这一种方法我以前是成功的,但我在现在这个环境中失败了,大家可以尝试一下,也许能成功。
具体方法我在我的第一篇博客中有提过2020年tensorflow定制训练模型笔记(1)——object detection的安装
大家按照那个博客中给的教程和网址尝试一下,因为我当时的确是靠那个网址的方法成功在win10上安装了pycocotools,现在不知道为什么不行。
方法二:注释掉报错语句
上一种办法行不通可以试试这个。
从上图中可以看出,问题出在train.py的第475行的检查环境配置的内容上,所以直接注释掉他。
实测可以成功训练。
在可以成功训练时还有可能报下面的错:
这是seaborn的版本不对,升级一下就好了。
wandb可视化(知道的可跳过)
除此之外,4.0版本还增加了一个wandb库用于更直观的训练可视化,大家可以在训练过程中安装并使用。
安装过wandb后,运行train.py会出现这么一行,我这里直接输入1.
随后会出现下面这几行,来到浏览器输入红框的网址。
这个网址上会有个API key,复制他粘贴到命令行即可,这个key在命令行中是不可见的。
我其实中途去wandb的官网注册了一个账户,直接与github的账户注册的,在运行命令行时也没有关掉账户,不知道有没有影响。
待训练程序跑起来,我们可以刷新wandb官网便可以看到可视化的结果。
训练完后的wandb可视化部分图片展示
我这次实验的是一个垃圾分类的模型,这是验证集的输出。
5.0版本的不同之处(知道的可跳过)
增加了P6模型,拥有四个输出层(P3,P4,P5,P6),具体理解可以去看这个博客Yolov3&Yolov4&Yolov5模型权重及网络结构图资源下载中的这张图
就是prediction这个位置的三个输出层下面再添加一层输出层,当然backbone也会有所变化。
P6模型包括一个额外的P6 / 64输出层,用于检测较大的物体,并且可以通过更高分辨率的训练获得最大的收益。
预训练模型中,所有P5的size为640,所有P6的size为1280。
程序的运行上,除了还是要屏蔽检查pycocotools的代码,还要下载thop的库。直接pip install thop就好。
4. 开始训练
运行
打开命令行运行
# 调用库里的yolo11n.yaml模型文件,训练train_lj里的数据,训练100轮,输入大小为640
yolo detect train data=./train_lj/data.yaml model=yolo11n.yaml epochs=100 imgsz=640
# 调用与预训练的yolo11n.pt模型匹配的模型文件,训练train_lj里的数据,训练100轮,输入大小为640
yolo detect train data=./train_lj/data.yaml model=yolo11n.pt epochs=100 imgsz=640
# 调用你自己修改的模型文件与此匹配的预训练模型,训练train_lj里的数据,训练100轮,输入大小为640
yolo detect train data=./train_lj/data.yaml model=yourselfmodel.yaml pretrained=yourselfmodel.pt epochs=100 imgsz=640
device=mps #mac m系列指定Metal
device=0 #nvidia gpu指定cuda
可以从官方给的模型中挑选一个合适的速度精度模型来作迁移训练
运行时CPU和GPU情况
每个人的设备不一样,这一节没啥意思。
训练结果反馈
训练结果在新建的runs文件夹下。
5. 测试
训练好的模型在runs/detect/train/weights 文件夹下
yolo val model=./runs/detect/train/weights/best.pt data=./train_lj/data.yaml imgsz=640 batch=16 conf=0.25 iou=0.6 device=0
测试结果放在runs/detect/val/ 下
我这个做教程只跑了10轮,大概这个效果。
推理使用
用前面的predict格式,但调用的是刚刚训练好的模型。
yolo detect predict model=./runs/detect/train/weights/best.pt source=0 conf=0.25
yolo predict model=./runs/detect/train/weights/best.pt source=./train_lj/images/test/harmful_1.png conf=0.25
也可以用python,不得不说v8的api整理的比较方便,数据标注和模型自定义的方法同上直接套用。
from ultralytics import YOLO
# Load a model
model = YOLO("./runs/detect/train/weights/best.pt") # pretrained YOLO11n model
# Run batched inference on a list of images
results = model(["./train_lj/images/test/harmful_1.png", "./train_lj/images/test/harmful_2.png"]) # return a list of Results objects
# Process results list
for result in results:
boxes = result.boxes # Boxes object for bounding box outputs
masks = result.masks # Masks object for segmentation masks outputs
keypoints = result.keypoints # Keypoints object for pose outputs
probs = result.probs # Probs object for classification outputs
obb = result.obb # Oriented boxes object for OBB outputs
result.show() # display to screen
result.save(filename="result.jpg") # save to disk
yolo11笔记(1)——安装pytorch与 Ultralytics(win/Mac/linux三平台)
yolo11笔记(2)——训练自己的数据模型
yolo11笔记(3)——移动端部署自己的模型(GPU_cuda系列)
yolov5笔记(4)——CPU部署以及NCNN