首发于:公众号YueTan

(1920,被识别为泰迪熊?有排面)

背景

2017年底,我已毕业多年了。用起Excel和PPT、研究车的质量问题俨然老手的样子。有一晚,照着一个帖子跑了一下Yolov1的inference,惊为天人。蹑手蹑脚的搞环境、下模型、跑一下clone的程序,就把摄像头前的物体都用框框标记了出来。在不懂原理的我看来,大概惊叹了一晚上。

那份惊叹,也让我和许多年轻人一起决定加入AI的行列。我现在常常吹嘘,自己大学七年对航空和汽车发动机多了解,工作五年对汽车掌握的多透彻,彷佛放弃了十二年优异的经验,其实都是人设啊。我根本就学不好,现在也完全不记得了。(当然,搞AI也只是现在的人设罢了,不要当真)

时过境迁,在AI方面我还是小学生,Yolo已经从V1发展到了V5,并有各种衍生和优化版本。我们津津乐道它的名字是You only look once的简写,原意“你只看一遍”是为了区分看“两遍”的faster-rcnn等二阶段模型,其简写Yolo又寓意着另一句谚语"You only live once",生命只有一次。就像食神里说的“不仅好吃,还有噱头,我也忍不住买了一碗“。

充满噱头的除了性能、名字外甚至还有作者本身,作者年初时宣布因为对技术滥用的担忧放弃视觉研究了,颇有高人之风。而且明明是个大胡子,个人网站却是满满粉色独角兽的萌妹风格。写的论文中,为了突出速度之快,甚至故意把图画到坐标轴外面去了。

机器视觉任务,常见的有分类、检测、分割。而Yolo正是检测中的佼佼者,在工业界,Yolo兼顾精度和速度,往往是大家的首选。

效果

V5的效果也是非常不错:



其实,yolov4刚出来的时候,大家还对名字争议了一番。毕竟原作者已经弃坑,新作看上去又是一个trick集合。马上yolov5出现之后,似乎对v4的质疑就消失了,因为v5这个名字起的似乎更离谱了。这里就不讨论名字争议了。

原理

作为一阶段end2end的检测算法代表作,我们简单回顾一下Yolo从V1到V5的主要改进措施,当然backbone也一直在进化着。

v1: 划分网格负责检测,confidence loss
v2: 加入k-means的anchor,两阶段训练,全卷积网络
v3: FPN多尺度检测
v4: spp,mish激活函数,数据增强mosaic\mixup,giou损失函数
v5: 对模型大小灵活控制,hardswish激活函数,数据增强
v1/v2因为对小目标检测效果不佳,在v3中加入了多尺度检测。v3大概可以比作iphone界的iphone6,是前后代广受好评的大成者,至今仍活跃在一线,“等等党永远不亏”。Yolov4把整个流程中可能进行的优化都梳理和尝试了了一遍,并找到了各个排列组合中的最好效果。v5可以灵活的控制从10+M到200+M的模型,其小模型非常惊艳。
v3到v5的整体网络图相差不多,可以清晰的看到:模型从三个不同尺度分别对大小不同的物体有重点的进行检测。

细节

数据增强和预处理
由于模型需要图片尺寸相同,因此可以采用resize、padding resize和letterbox的方法。letterbox训练的时候不用,只是在推理时候用。数据增强(data augmentation)是提升模型泛化能力的重要手段。

flip: 翻转

perspective:仿射变换

hsv augment:颜色变换

mosaic:马赛克数据增强把原来的四幅图组在一起

当然后面可以试试albumentations包里的方法。

获取anchor:k-means

早就在机器学习中学过最基础的聚类算法k-means,没想到第一次用上是在目标检测里。果然没有免费的午餐啊,在合适的地方用上合适的算法就好。k-means的两个关键超参数是k的选择和距离的选择,所以在Yolo中的k等于n_scale(尺度,一般为3)* anchor_per_scale (每个尺度的anchor,一般也为3)。V5做了一点小小的改进:训练时自动获取。

匹配anchor和网格

虽然讨论的时候,经常看见的都是改了哪些fancy的模型,真正写程序时比较困难的反而是这种数据前处理的pipeline。yolo的关键思想通过标记物体的中心点落在哪个网格里,就由这个网格负责检测,就是通过设置目标来实现的。

1)计算这张图片所有ground truth与每一个anchor的IOU,从而得到对每一个ground truth匹配最好的anchor id。可以根据真实框和锚矿的IOU或者长宽比来选择,v4与v5中做的改进是根据宽高比来进行anchor的匹配。

2)对每一个ground truth循环。找到这个anchor对应的尺度,和这个anchor对应的哪一个anchor。
3)模型最终输出的是三个尺度,每个尺度下每个网格带下的三个anchor对应的box。所以将标记的box也要放置到对应的grid里,对应的是三个anchor里的哪一个。根据上面找到对应grid,对应anchor,将标记的box尺寸和class 信息设置到目标里,其他设置为0。
另外两个改进点,一个改进点是正样本增强。通过正样本的增强可以减轻正负样本的不均衡。另一个改进点是标注框对anchor的encoding(编码方式)。从v2中引入anchor以来,一直通过如下编码方式

为了解决网格的敏感性,v4的作者发现简单的编码方式就可以提高结果。

x = (logistic(in) * 2 - 0.5 + grid_x) / grid_width
y = ...
w = pow( logistic(in)*2, 2) * anchor / network_width
h = ...

模型主体

(来自dabai同学)

v5的模型通过类似EfficientNet的两个系数来控制模型的宽度和深度,在yaml文件的depth_multiple和width_multiple中调节。
Focus:是v5相对v4的改进。
CSPNet:跨阶段局部融合网络
PANet:之前FPN是把传统视觉任务的图像金字塔改进到了深度学习的特征金字塔,来自论文Path Aggregation Network for Instance Segmentation。

损失函数

Yolo的损失函数比较惊艳,通过损失函数的设定把目标检测任务转化为一个回归任务。


第一部分为box的损失函数,可以用过smoth L1损失函数计算xywh,也可以通过iou、giou、ciou等。类似的giou、diou和ciou都是在交并比iou的基础上发展而来的优化方法,解决了iou在两个候选框完全没有交集时,损失为0不可优化的状况。第二部分为有无物体的损失:yolo独特的设置了一个有无物体的confidence,目标中有的自然设置为1。预测的值用sigmoid转化为(0,1)的概率,然后计算binary cross entropy。第三部分为分类损失部分,虽然是多分类,也采用binary corss entropy。
同时,为了平衡不同尺度的输出,v5中对以上三部分加了人工痕迹比较明显的系数。

后处理

极大值抑制(nms)。分三个尺度进行检测,且分配不同的anchor,那么同一个物体有可能被多个尺度、anchor所检测到。所以通过极大值抑制来从中选择最佳的候选框。也有soft-nms、matrix-nms等改进方式可以试一试。

训练

训练过程就比较平平无奇了,可以添加如下技巧:梯度累积、遗传算法、EMA滑动平均、算子融合。

展望

检测之外,之后还可以继续拓展和优化的方向:

  • tensorrt推理加速
  • deepsort物体追踪,可以稳定视频中检测框的抖动
  • 针对小目标分割patch检测,例如卫星遥感图像的改进you only look twice
  • 多尺度scalable yolov4

代码

Yolov5-pytorch
Yolov5-tensorflow

联系方式

公众号搜索:YueTan

目标检测:Yolov5集百家之长相关推荐

  1. 【学术】集百家之长,有一家之言

    又到了一年一度的和其他博士生交流的时间. 一边听,一边记忆了几个带有总结意味的句子,作为话题之间的天然分界限. 中间穿插的案例,有的是用来佐证话题的,有的可能是临时想起来的.案例信息的准确性没有经过考 ...

  2. 【搜遍互联网,集百家之长】环境配置从入门到放弃之Mac环境下,安装XAMPP,给phpstorm安装Xdebug调试工具...

    前提 刚从Windows转到OS X,工作需要给phpstorm安装断点调试工具xdebug,一开始没当回事,心想不就个插件吗,上网看看文档还不是分分钟搞定,没想到就是噩梦的开始.整整两天,翻遍谷歌和 ...

  3. 【集百家之长】阻容降压电路

    1.工作原理: 阻容降压的工作原理是利用电容在一定的交流信号频率下产生的容抗来限制最大工作电流.同时在电容器上串联一个阻性元件,则阻性元件两端所得到的电压和它所产生的功耗完全取决于这个阻性元件的特性. ...

  4. 目标检测 YOLOv5 - 如何提高模型的指标,提高精确率,召回率,mAP等

    目标检测 YOLOv5 - 如何提高模型的指标,提高精确率,召回率,mAP等 flyfish 文中包括了YOLOv5作者分享的提高模型指标小技巧和吴恩达(Andrew Ng)在做缺陷检测项目( ste ...

  5. 目标检测 YOLOv5 - 卷积层和BN层的融合

    目标检测 YOLOv5 - 卷积层和BN层的融合 即Conv2d和 BatchNorm2d融合 flyfish 为了减少模型推理时间,YOLOv5源码中attempt_load已经包括两层的合并,主要 ...

  6. 目标检测 YOLOv5网络v6 0版本总结

    目标检测 YOLOv5网络v6.0版本总结 YOLOv5对比YOLOv4 输入端:在模型训练阶段,提出了Mosaic数据增强.自适应锚框计算.自适应图片缩放等: Backbone网络:融合其它检测算法 ...

  7. 目标检测 YOLOv5 anchor设置

    目标检测 YOLOv5 anchor设置 1 anchor的存储位置 1.1 yaml配置文件中例如 models/yolov5s.yaml # anchors anchors:- [10,13, 1 ...

  8. 《看聊天记录都学不会Python到游戏实战?太菜了吧》(9)集万家之长不死 python

    本系列文章将会以通俗易懂的对话方式进行教学,对话中将涵盖了新手在学习中的一般问题.此系列将会持续更新,包括别的语言以及实战都将使用对话的方式进行教学,基础编程语言教学适用于零基础小白,之后实战课程也将 ...

  9. 目标检测 YOLOv5 - 模型的样子

    目标检测 YOLOv5 - 模型的样子 flyfish 文章目录 目标检测 YOLOv5 - 模型的样子 开始加载模型文件 模型的层 模型的属性 模块的名称以及模块本身 模型的权重 模型权重的名字和权 ...

最新文章

  1. 微信小程序地图上图片放到下面
  2. Nginx源码分析--字符串处理
  3. Java分布式 RPC 框架性能大比拼,Dubbo最差?
  4. 用正则表达式取出table中的所有行(支持嵌套table)
  5. WPF数据绑定(1-简单数据绑定)
  6. Spring boot配置文件值注入
  7. maven打包项目的时候找不到jar包,但是项目里面改已经有相关jar包
  8. Android学习资源网站
  9. c语言中for语句的作用是,c语言中for语句是怎么用的
  10. MCMS 基于SpringBoot 2架构
  11. concat() “+“ 和 append() 的区别
  12. Java 并发编程ReentrantLock--源码解析(底层AQS实现)
  13. matlab 自带pca函数,matlab实现主成分分析 princomp函数 PCA中有这个函数
  14. springmvc+mybatis多数据源配置,AOP注解动态切换数据源
  15. 未来无生经超级计算机,最强崩坏系统
  16. 教你如何用PQ魔法师调整硬盘分区大小【图解教程】
  17. 基于eTS高效开发HarmonyOS课程类应用
  18. qt 模拟鼠标滑轮_【游戏流体力学基础及Unity代码(四)】用欧拉方程模拟无粘性染料之公式推导...
  19. AI challenger 2018图片分类比赛—农作物病害检测
  20. 计算机磁盘管理和容量不一致,官方数据:为什么硬盘可用容量显示错误,以及硬盘容量与实际情况不符的原因...

热门文章

  1. Gym 101775J Straight Master(差分数组)题解
  2. MySQL之最基本命令
  3. 使用pycharm运行调试scrapy
  4. 替换a链接的href和title
  5. PHP session值控制
  6. 微信小程序 PDF下载打印
  7. [Postman]排除API请求(9)
  8. DNS区域传送、子域授权
  9. JS常用的设计模式(7)—— 外观模式
  10. CUDA入门需要知道的东西