目录
学术一点来说,YOLO是一种用于目标检测的深度学习算法(对目标检测算法的解释指路第二部分)。
当然也可以简单粗暴地解释,YOLO算法要完成的工作,就是当你输入一张(当然很多张也可以)图片时,它需要告诉你图片里有什么,那些物体在哪个位置,它有多大概率确定自己是正确的;在更广义的领域里,它还可以处理视频、实时摄像取景框,毕竟如果按其中的每一帧来看,就是一次性处理很多张图片嘛。
它的使用场合其实很广泛,说不定你每天都在使用但没发现,看看ChatGPT怎么说:
首先看看最基础的图片处理 - 使用YOLOv8 / ultralytics 自带的初始模型得到的结果:
|
![]() |
|
![]() |
看得出来,这个初始的模型能识别的物体并不多,而且甚至会“指鱼为鸟”,所以如果需要更适配自己需求的、精度更高的模型,还是需要自己找训练集、测试集,自己标注,最后训练得到完美对象(指路第三部分)。
笔者检测一张图片平均跑下来需要30-40毫秒,不知道大家的电脑跑起来是更快还算更慢呢?
再看看视频:
ultralytics自带模型-检测视频示例
检测效果好像有点糟糕,还挺搞笑的……
后来查看了一下ultralytics自带模型能检测的物体,发现它好像用的是COCO(Common Objects in Context)数据集进行的训练,好像确实没有水豚……
硬干货的历史知识来了——
目标检测的发展脉络可以划分为两个周期:传统目标检测算法时期(1998 - 2014)和基于深度学习的目标检测算法时期(2014 - 至今);而基于深度学习的目标检测算法又有两条技术路线:二阶段检测算法和一阶段检测算法。
注:相比之下,卷积神经网络(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,可以先了解一下它的基本框架,其实也是目标检测网络的常见结构。
一个常见的目标检测网络,其本身往往可以分为以下三大块:
因为网络越深,就越会损失图片细节上的信息,就越不利于小目标对象的检测。因此,yolov3为了兼顾小目标和大目标对象的检测,就把浅层网络的特征图也提取出来,把它跟深层的特征图进行拼接后,也单独进行一次预测,最后跟深层特征图的预测结果一起进行汇总
从下图可以看到,13*13的特征图对应在原图的感受野比较大,右边52*52的特征图对应在原图的感受野比较小,其中蓝色的框是预先设定好的锚框。所以浅层网络能捕捉到原图像的细节信息
2、将yolov2的单标签分类改进为yolov3的多标签分类:简单说就是原来yolov2中,不是只给一个对象贴一个标签吗,在yolov3中对一个对象可能会贴多个标签。
后面的yolov5~yolov8都是为了提高精度或者速度,而使用了当前一些tricks的集合,相当于是在不断优化检测过程的每一步,没有很大的创新,因此这里也不赘述了
YOLO官方推出了一款app:iDetection,可以对摄像头所及的视野进行目标检测。
(它的识别效果比某些指鹿为马的识图软件/相机功能要好很多)
iDetection下载即用,如果你想不碰代码不看文章or视频,快速了解yolo的效果,它是一个好的选择:
以YOLOv5为例,可以在docker中快速运行YOLO:
docker pull ultralytics/yolov5:latest
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为例:
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
划分训练集与测试集,将数据集放至根目录下的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的路径,我们可以看到输出了非常多的文件:
让我们来分析一下:
使用labelimg时闪退:
解决措施:为labelImg单独建一个conda环境,保持该环境激活,打开labelImg;或者试着对canvs.py 与 lambelImg.py 文件作出修改:Unable to draw annotations on Windows · Issue #811 · HumanSignal/labelImg · GitHub
样本比例
1. 建议训练集和验证集的比例为7:3,其中各自的正负样本比例为1:1。
对于负样本,若一个符合要求的类型都没有,需要生成空的标签文件。
此时无需太过意外正好可以检查一下潜在效果变差的原因,记录并进行后续调整。
以yolov5为例:
得到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,就能方便地进行后续的分析啦。