目录
一、模型的用途和效果
什么是YOLO算法?
学术一点来说,YOLO是一种用于目标检测的深度学习算法(对目标检测算法的解释指路第二部分)。
当然也可以简单粗暴地解释,YOLO算法要完成的工作,就是当你输入一张(当然很多张也可以)图片时,它需要告诉你图片里有什么,那些物体在哪个位置,它有多大概率确定自己是正确的;在更广义的领域里,它还可以处理视频、实时摄像取景框,毕竟如果按其中的每一帧来看,就是一次性处理很多张图片嘛。
YOLO算法有什么用?
它的使用场合其实很广泛,说不定你每天都在使用但没发现,看看ChatGPT怎么说:
- 警情交通:由于其高速实时性,YOLO经常用于视频分析,包括监控系统、交通监测和行为分析等领域。它可以在视频流中快速识别并跟踪多个对象。
- 自动驾驶:同样,yolo可以用于实时检测道路上的车辆、行人、交通标志等物体,为车辆的决策和导航提供重要信息。
- 工业检测:检测和识别生产线上的缺陷、危险物体或异常行为。
- 医学图像分析:分析医学图像,如X射线、CT扫描和核磁共振图像,以便快速定位和识别病灶。
- 无人机和航拍:识别地面上的对象,包括建筑物、车辆和人群等。
- 体育赛事分析:协助教练和运动员在比赛中快速准确地识别对手的优势和劣势
YOLO算法的输出效果具体长什么样?
首先看看最基础的图片处理 - 使用YOLOv8 / ultralytics 自带的初始模型得到的结果:
|
| |
|
| |
看得出来,这个初始的模型能识别的物体并不多,而且甚至会“指鱼为鸟”,所以如果需要更适配自己需求的、精度更高的模型,还是需要自己找训练集、测试集,自己标注,最后训练得到完美对象(指路第三部分)。
笔者检测一张图片平均跑下来需要30-40毫秒,不知道大家的电脑跑起来是更快还算更慢呢?
再看看视频:
ultralytics自带模型-检测视频示例
检测效果好像有点糟糕,还挺搞笑的……
后来查看了一下ultralytics自带模型能检测的物体,发现它好像用的是COCO(Common Objects in Context)数据集进行的训练,好像确实没有水豚……
二、模型的原理
硬干货的历史知识来了——
一句话总结目标检测系列算法
目标检测的发展脉络可以划分为两个周期:传统目标检测算法时期(1998 - 2014)和基于深度学习的目标检测算法时期(2014 - 至今);而基于深度学习的目标检测算法又有两条技术路线:二阶段检测算法和一阶段检测算法。
传统目标检测算法
- 特点:
- 传统目标检测算法主要基于手工提取特征,包括边缘、纹理、颜色等图像属性。
- 传统目标检测算法通过滑动窗口来寻找目标对象,具体说就是在图像上滑动不同大小和比例的窗口来寻找对象,这会导致计算量很大。
注:相比之下,卷积神经网络(CNN)能够通过训练自动学习图像中的特征,无需手动设计
- 缺点:
- 识别效果不够好,准确率不高
- 计算量较大,运算速度慢
- 可能产生多个正确识别的结果
二阶段检测算法
- 算法流程 - 以R-CNN为例:
- 对输入图片提取候选区(region proposal),每张大约2k~3k个这种与类别无关的框。所谓的候选区就是通过selective search算法获得可能存在对象的区域,例如下左图
- 把每个候选区放入CNN网络来提取特征
- 把从每个候选区提取的特征送入每一类的二分类器中进行类别判断,如下右图,其中左边的每一行是从一个候选框中提取的特征,右边每一列是一个分类器
- 位置精修,采用回归器精细修正候选框位置
-
二阶段检测算法的问题与改进过程
-
R-CNN的性能瓶颈:
1. 针对第一个问题,后面的Fast-R-CNN和Faster-R-CNN都解决了,它们把提取特征之后的分类步骤和精修候选框的步骤都添加到了深度网络中进行同步训练。
2. Fast-R-CNN解决了第三个问题。它不再对每个候选区独立提取特征,具体来说就是,神经网络的输入不再是每个候选区,而是整张图像,因此只用做一次向前计算。至于每个候选区的特征就直接在最后得到的整张图像的特征图上进行映射就好了。
3. Faster-R-CNN在Fast-R-CNN的基础上,把第二个问题解决了,因为原先的提取候选区的方法性能太低,所以Faster-R-CNN提出了RPN网络来提取候选区。首先是预先定义好一组框模板(anchor box,如下图,在每个网格上都预定义模板框),然后滑动窗口,在每一个划分的网格上都使用这一组框模板,覆盖整张图像。最后通过RPN网络,在这些框里选出可能含有对象的框,并且对这些框的位置和大小进行微调,最后把微调后的这些框作为候选区
-
YOLO系列算法
为了更好介绍YOLO,可以先了解一下它的基本框架,其实也是目标检测网络的常见结构。
- 目标检测基本框架
一个常见的目标检测网络,其本身往往可以分为以下三大块:
- 主干网络(Backbone network):目标检测网络最为核心的部分,用来从图像中提取出些必要的特征信息(特征提取不好的话会影响后面的目标检测)。因为早在目标检测任务之前,深度学习技术就已经在图像分类领域中发挥了重大的作用,而且深度学习技术能够出色地完成图像分类任务,这就表明深度学习技术在图像特征提取这一块有着十分出色表现和巨大的潜力。因此,Backbone这一部分通常就是将诸如VGG、ResNet等模型搬过来(去掉最后的global avgpooling和softmax层),这一部分的参数初始化就直接使用在ImageNet上训练好的参数。
- 颈部网络(Neck network):Neck部分的主要作用就是将由backbone输出的特征进行整合。
- 检测头(Detection head):就是若干卷积层进行预测。head部分就是在由前面网络输出的特征上去进行预测,约等于是从这些信息里解耦出来图像中物体的类别和位置信息。
YOLOv1
- YOLOv1最大的特点就在于,能仅使用一个卷积神经网络端到端地实现检测物体的目的
- YOLOv1的输入是一张448*448的图片,它不用提取候选区,相比之下,它直接对图片进行7*7的等分,如下图所示
- 怎么判断对象属于哪个网格呢?这里采取的做法是,对象的中心属于哪个网格,那这整个对象就属于哪个网格,那这个网格就负责这个对象的预测
- 在最后的预测结果中,每个网格会有预测的分类信息和B个边界框的置信度与位置信息,最后只会选择得分最高的边界
- 缺点:
- 一个网格只能预测一个对象。如果一个网格包含多个对象,模型可能无法准确捕捉所有对象的信息。这点从它每个网格只预测一个分类信息可以看出
- 因为是第一个版本,所以YOLOv1实际上有很多需要改进的地方,比如因为YOLOv1最后使用了全连接层,所以会有参数过多的问题等,感兴趣的读者可以自己查阅资料
YOLOv2
- 特点:
-
YOLOv2的输入图像大小是416*416,最后得到的特征图是13*13,经过了32倍的下采样,如下图所示
-
YOLOv2添加了Faster R-CNN工作所提出的 anchor box 机制。每个网格处都预设了k个的anchor box。网络只需要学习将锚框映射到真实框的尺寸的偏移量即可,无需再学习整个真实框的尺寸信息,这使得训练变得更加容易。对于这个预先设置的anchor box的大小,YOLOv2是采用在数据集上进行kmeans聚类来决定的
-
在yolov1中,虽然每个网格会有多个边界框,但只会给出一个分类信息,即这个分类信息是每个边界框共享的。在yolov2中, 每个边界框都会预测一个分类信息 ,这样的话,每个网格可以预测多个对象了。
-
除此之外,yolov2还有如下改进,比如添加Batch Normalization层、将网络设计为全卷积结构、使用更高分辨率的特征以及进行多尺度训练等。其中使用更高分辨率的特征是为了更好地捕捉目标的细节信息,多尺度训练是为了提升YOLO对物体的尺寸变化的适应能力。其他的内容和细节感兴趣的读者可以自己下去了解以下。
anchor box机制示例图
YOLOv3
- 特点:
-
因为网络越深,就越会损失图片细节上的信息,就越不利于小目标对象的检测。因此,yolov3为了兼顾小目标和大目标对象的检测,就把浅层网络的特征图也提取出来,把它跟深层的特征图进行拼接后,也单独进行一次预测,最后跟深层特征图的预测结果一起进行汇总
网络越深,得到的特征图越模糊
从下图可以看到,13*13的特征图对应在原图的感受野比较大,右边52*52的特征图对应在原图的感受野比较小,其中蓝色的框是预先设定好的锚框。所以浅层网络能捕捉到原图像的细节信息
2、将yolov2的单标签分类改进为yolov3的多标签分类:简单说就是原来yolov2中,不是只给一个对象贴一个标签吗,在yolov3中对一个对象可能会贴多个标签。
YOLOv4
- 特点:
-
从yolov3到yolov4,作者主要是增加了很多实用的技巧来提升检测的精度。下面主要介绍一下用来做数据增强的技巧。数据增强的目的是增加训练样本的多样性
-
马赛克数据增强(Mosaic Augmentation),步骤如下:每次读取四张图片,分别对四张图片进行翻转、缩放、色域变化等,并且按照四个方向位置摆好。进行图片的组合和框的组合,如下图所示
后面的yolov5~yolov8都是为了提高精度或者速度,而使用了当前一些tricks的集合,相当于是在不断优化检测过程的每一步,没有很大的创新,因此这里也不赘述了
三、模型的用法介绍
只想简单的试试效果,不想配环境,我应该怎么做?
YOLO官方推出了一款app:iDetection,可以对摄像头所及的视野进行目标检测。
(它的识别效果比某些指鹿为马的识图软件/相机功能要好很多)
iDetection下载即用,如果你想不碰代码不看文章or视频,快速了解yolo的效果,它是一个好的选择:


想尝试自己运行,但不是想配置环境,我应该怎么做?
以YOLOv5为例,可以在docker中快速运行YOLO:
- 拉取Yolov5最新镜像:
docker pull ultralytics/yolov5:latest - 启动YOLOv5容器:
docker run -v yourHostPath --name dockeryolov5 --ipc=host -it ultralytics/yolov5:latest - 检测图片:
python detect.py --weights weight/yolov5m.pt --source uniform/data/images - 保存检测结果:
docker cp dockeryolov5:/usr/src/app/runs/detect/exp yourHostPath - 训练数据集:
python train.py --batch-size 2 --epochs 200 --data data/data.yaml --weights weight/yolov5m.pt - 保存训练结果:
docker cp dockeryolov5:/usr/src/app/runs/train/exp yourHostPath
想简单的配置环境,不需要部署,我该怎么做?
以YOLOv8为例:
- 前置环境安装:miniconda
- Conda环境创建:conda create -n yolov8 python=3.8
- pypi配置国内源:pypi | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
- 安装pytorch:PyTorch
- Ultralytics / YOLOv8安装:
- 直接使用源码(无法使用命令行工具):GitHub - ultralytics/ultralytics: NEW - YOLOv8 🚀 in PyTorch > ONNX > OpenVINO > CoreML > TFLite
- pip直接安装:pip install ultralytics
- pip源码安装:下载源码后解压、进入对应目录,通过pip install -e安装;-e参数必须要有,否则后续修改代码无效
- 通过命令行cmd激活conda环境(powershell无法激活环境):conda init cmd.exe
- 激活yolov8运行环境:conda activate yolov8
- 模型预测基本使用
- .py文件:
from ultralytics import YOLO yolo = YOLO("./yolov8n.pt",task="predict") #指明预测所用的权重文件 result = yolo(source="ultralytics/assets/bus.jpg",save=True) #图片与视频 # result = yolo(source=0,save=True) #摄像头 # result = yolo(source="screen") #电脑桌面 - 命令行:
yolo predict model=yolov8n.pt source=ultralytics/assets/bus.jpg
- .py文件:
- 自行标注数据集:
- 本地:
- 配置labelimg环境:pip install labelimg(设置YOLO format / autosave
- 启动:labelimg
- 在线:
- make sence数据集标注
- 本地:
-
划分训练集与测试集,将数据集放至根目录下的datasets文件内
-
训练数据集:
yolo task=detect mode=train model=./yolov8n.pt data="data.yaml” workers=1 epochs=50 batch=16 - 检测训练效果:
yolo detect=runs\detect\train2\weights\best.pt source=ultralytics\assets\fish.jpg
注:本部分的配置流程总结自 【【手把手带你实战YOLOv8-入门篇】YOLOv8 环境安装】
训练效果(精确度、准确度)说明
经过漫长的等待(batch-size 2 epochs 200训练3000张图刚好够八小时黄金睡眠),如何获取自己训练效果的数据呢?
以yolov5为例,打开运行完train命令后result save to runs/train/expi的路径,我们可以看到输出了非常多的文件:

让我们来分析一下:
- 数据集统计
- 在开始训练前,对于输入的数据集,yolo会统计各类别出现的图片数量和所有标注的位置,并算出各位置参数的相关性。labels.jpg和labels_correlogram.jpg可视化了我们的数据集,方便对数据集形成初步的认识。
labels_correlogram.jpg
labels.jpg - 识别效果示例
- 在结束训练后,无需自己detect,yolo会给出部分数据集上的检测结果示例:
val_batch_labels.jpg与val_batch_pred.jpg
train_batch.jpg
- 在结束训练后,无需自己detect,yolo会给出部分数据集上的检测结果示例:
- 识别精度
- 训练时我们最关心的就是识别精度了,yolo给出包含误判率和漏判率的混淆矩阵,以及F1、Precision和Recall得分在各个置信度上的变化曲线(与坐标轴围成的面积越大越好)。
confusion_matrix.png
R_curve.png
F1_curve.png
P_curve.png
PR_curve.png - 训练过程
- 如果想查看更加细致的识别精度,或者想查看过程中识别精度的变化,result.csv记录了每次训练的损失函数值(一般先快速下降后下降减缓)等数据,results.png描述了各个数据随训练轮次的变化。
result.jpg
results.csv
- 如果想查看更加细致的识别精度,或者想查看过程中识别精度的变化,result.csv记录了每次训练的损失函数值(一般先快速下降后下降减缓)等数据,results.png描述了各个数据随训练轮次的变化。
训练踩坑 - 部分注意事项
- 配置YOLOv8环境时可能遇到的报错:
- 运行 conda activate yolov8 时报错如下:
- conda-script.py: error: argument COMMAND: invalid choice: 'activate' (choose from 'clean', 'compare', 'config', 'create', 'info', 'init', 'install', 'list', 'notices', 'package', 'remove', 'uninstall', 'rename', 'run', 'search', 'update', 'upgrade', 'build', 'convert', 'debug', 'develop', 'doctor', 'index', 'inspect', 'metapackage', 'render', 'skeleton', 'content-trust', 'pack', 'repo', 'server', 'env', 'verify', 'token')
- 解决措施:试着使用conda update conda 对conda进行更新;或者直接activate yolov8
- 在Visual Studio Code运行.py 文件时报错:
- 解决措施:解释器选择错误,应该勾选yolov8对应的选择器
-
使用labelimg时闪退:
-
解决措施:为labelImg单独建一个conda环境,保持该环境激活,打开labelImg;或者试着对canvs.py 与 lambelImg.py 文件作出修改:Unable to draw annotations on Windows · Issue #811 · HumanSignal/labelImg · GitHub
-
- 以使用yolov5训练识别app截图中的弹窗为例,说明训练数据时要注意的部分事项:
-
样本比例
1. 建议训练集和验证集的比例为7:3,其中各自的正负样本比例为1:1。
对于负样本,若一个符合要求的类型都没有,需要生成空的标签文件。
- 图片中有与待训练物体相似的其他物体
- app截图中ui元素外观与弹窗相似的很多,如drawer、menu等ui元素。此时可以尝试通过图片预处理增大弹窗与这些ui元素的区别,如背景明暗度、颜色边缘变化等等
- 待训练物体内部颜色、形状不相似
- app弹窗包括系统弹窗、功能弹窗和广告弹窗等类别。对于广告弹窗,它们颜色鲜艳、形状不一,往往出现在屏幕的正中央,面积较大;对于系统弹窗,它们基本只有蓝白黑三色,方方正正,面积较小;功能弹窗则介于两者之间,位置出现可上可下
- 如果将三者统一标注为pop_ups类型,则漏判和误判会集中在数据集中数量较少的功能弹窗和系统弹窗部分,且难以通过增大数据集来减少。此时可以分别标注为pop_ups_ad、pop_ups_func、pop_ups_sys类型。
- 标注数据时标准不一致
- 由于自己训练数据集时,有时找不到已有标注好的数据集,而所需数据量较大,
(淘宝上代标注费用很高)往往需要几个小伙伴合作标注,在标注之前,不妨花一点小小的时间,建立起一个统一的标注标准。标注标准的不同有时能明显反应在错判和漏判上。
- 由于自己训练数据集时,有时找不到已有标注好的数据集,而所需数据量较大,
- 对训练结果的预期管理
- 由于对大部分使用者而言,这个train命令等同一个黑盒,因此训练结果也可能是令人意外或“反常规”的,如:
- 增大数据集图片数量后效果变差
- 查找并删除脏数据后效果变差
- 添加预处理后效果变差
- 由于对大部分使用者而言,这个train命令等同一个黑盒,因此训练结果也可能是令人意外或“反常规”的,如:
此时无需太过意外正好可以检查一下潜在效果变差的原因,记录并进行后续调整。
一些魔改方向
以yolov5为例:
- 检测方式改进
- 由文件夹→动态添加单张图片:
- 未修改前,检测时需要预先将图片放到文件夹内, 一个文件夹内的图片统一预测。因此每预测一个文件夹, 需要重新加载一次模型, 耗时长(加载模型耗时几s,而检测单张图片只要几十ms); 由此可以修改detect.py源码,将模型预先加载好, 不关闭模型, 减少检测耗时。
- 由文件夹→动态添加单张图片:
- 作为工具包合进别的项目里
-
得到pt权重文件后,
(有了pt就可以为所欲为)实际上可以仅抽取detect.py等几个检测时才需用到的文件,选择其他需要目标检测的项目, 合入YOLO 代码。 -
打开detect.py,可以看到yolo的detect命令有很多参数:

里面较为常用的是--save-txt --save-conf,它会将对应图片的识别结果(类型,中心x,中心y,width,height,conf)保存在单独的同名txt中:
python .\detect.py --source .\data_detect\images_proccessed --weights .\runs\train\exp21\weights\best.pt --save-txt --s ave-conf
拿到这个txt,就能方便地进行后续的分析啦。
-
3万+

被折叠的 条评论
为什么被折叠?



