YOLO随笔

发布于 2022-05-14  452 次阅读




Yolo随笔(1)目标检测

前言

最近在进行ISCC比赛中有一道小光学AI,因为没有做出来, 就想着来补习下Machine的知识吧。。。

参考连接:
https://zhuanlan.zhihu.com/p/94986199
https://blog.csdn.net/gaoyu1253401563/article/details/86485851

YOLO系列

“YOLO,美语新词,是You Only Live Once的首字母缩略词,意为你只能活一次,应该活在当下,大胆去做。”

名字很简单 就是字面意思 活在当下 大胆的去尝试去做

机器学习顾名思义也是如此
YOLO直接采用regression(回归)的方法进行坐标框的检测以及分类,使用一个end-to-end的简单网络,直接实现坐标回归与分类,意思是说训练出的YOLO当你输入一幅图像,它能直接输出包含物体的坐标框以及该物体是什么。

那么我们来看 机器学习中的yolo是什么?

YOLO is What???

YOLO是用于目标检测模型。
怎么说呢 在生活中AIj技术应用在有各种各样的方向,那么在实现目标检测的领域中YOLO也算是一员大将。

根据算法的流程可以将目标检测算法分为两种流派,一种是以Faster R-CNN为代表的Two-Stage算法,它检测目标主要分为两个部分,1)通过专门模块去生成候选框,寻找前景以及调整边界框。另一种是以SSD、YOLO为代表的One-Stage算法,它是直接基于anchor直接进行分类以及调整边界框。两种方式各有各的特别,Two-Stage很明显检测的精度要高一点,但是检测速度慢;One-Stage放弃了高精度,但是换来了速度,速度比Two-Stage算法快很多。接下来介绍几种常用的目标检测算法。

目标检测是计算机视觉中一个应用,例如用来在一张图篇中找到某些特定的物体,目标检测不仅要求我们识别这些物体的种类,同时要求我们标出这些物体的位置。
显然,类别是离散数据,位置是连续数据。

1-Stage

YOLO的全称是you only look once,指只需要浏览一次就可以识别出图中的物体的类别和位置。

因为只需要看一次,YOLO被称为Region-free方法,相比于Region-based方法,YOLO不需要提前找到可能存在目标的Region。

简单来讲 One-stage就是输入一个图片直接通过卷积神经网络主干网络直接给出分类结果和目标检测的得到的坐标值

2-Stage

Two-stage目标检测网络的基本流程是输入一个图片经过卷积神经网络进行深度提取特征,然后通过RPN网络进行候选区域的产生操作,同时完成区域的分类,将图片分为背景和目标两种不同的类别,并对目标的位置进行预测,接下来对候选区域中的位置进行精确定位和修正,使用Roi_pooling层,可以将此层理解为抠图的操作,接着将抠图所得到的候选目标对应到特征图(feature map)上相应的特征区域,然后经过一个全连接层(fc),并得到相应的特征向量,最后通过分类和回归这样两个分支,来实现对这个候选目标类别的判定和目标位置的确定(也就是最后矩形框的四个点的坐标,(x,y,w,h):(x,y)为左上角顶点的坐标,w,h是矩形框的长和宽)。

(或者说2-stage是先通过计算机图形学(或者深度学习)的方法,对图片进行分析,找出若干个可能存在物体的区域,将这些区域裁剪下来,放入一个图片分类器中,由分类器分类。)

因为YOLO这样的Region-free方法只需要一次扫描,也被称为单阶段(1-stage)模型。Region-based方法方法也被称为两阶段(2-stage)方法。

YOLO之前的世界

就好比与古代抓犯人,我们拿着画像去对比 ,看看是不是你
在这里插入图片描述
用计算机的描述来说就是有一个分类器,去进行对比区分
在这里插入图片描述
现在我们的追求升级了,我们不仅仅想处理这种一张图片中只有一个物体的图片,我们现在想处理有多个物体的图片。

我们该什么做呢?

首先有几点我们要实现想到:首先物体的位置是不确定的,你没办法保证物体一定在最中间;其次,物体的大小是不确定的,有的物体比较大,也有的物体比较小,注意,这里不是说大象一定更大,猫咪一定更小,毕竟还有近大远小嘛;然后,我们还没办法保证物体的种类,假设我们有一个可以识别100中物体的分类器,那么起码图片中出现了这100种物体我们都要识别出来。
比如说:(经典图)
在这里插入图片描述
挺难的,是吧?

最朴素的方法是滑窗法,就是用滑动窗口去识别一个个物体

YOLO原理

在这之前,我们再重申一下我们的任务。我们的目的是在一张图片中找出物体,并给出它的类别和位置。目标检测是基于监督学习的,每张图片的监督信息是它所包含的N个物体,每个物体的信息有五个,分别是物体的中心位置(x,y)和它的高(h)和宽(w),最后是它的类别。

YOLO 的预测是基于整个图片的,并且它会一次性输出所有检测到的目标信息,包括类别和位置。

就好像捕鱼一样,R-CNN是先选好哪里可能出现鱼,而YOLO是直接一个大网下去,把所有的鱼都捞出来。

先假设我们处理的图片是一个正方形。YOLO的第一步是分割图片,它将图片分割为 [公式] 个grid,每个grid的大小都是相等的,像这样:

在这里插入图片描述
如果我们让每个框只能识别出一个物体,且要求这个物体必须在这个框之内,那YOLO就变成了很蠢的滑窗法了。

YOLO的聪明之处在于,它只要求这个物体的中心落在这个框框之中。

我们再来通过唐宇迪博士的课 系统的了解下:

指标分析

1.map指标

我们需要搞懂论文中的map是什么 怎么算
在这里插入图片描述

第一个 map就是综合的衡量检测效果,综合在哪里呢
看下面两个指标
精度precision:指的是真实和预测的准确度,检测的好不好!
召回率recall:原始图像中有很多的标注物体是否检测到了!
在这里插入图片描述
TP:true positives 正确的判断
FP: flase positives 错误的判断

FN: false negatives 结果把正确的判断判断成错误的
TN:true negatives 把错误的判断成错误的
(被检测到)
p是正确的例子 就是要检测女生 检测到的是女生就是 TP
p是正确的例子 就是要检测女生 检测到的不是女生就是 FP
(未被检测到)
N是错误的例子 就是要检测男生是错误的 检测到的是女生为男生判断为错误了 (就是标注了没有检测到 标注成没用的数据了) FN
N是错误的例子 就是要检测男生是错误的 检测到的是男生为男生 TN

在这里插入图片描述

精度:

IOU

IOU交集和并集的比值
在这里插入图片描述

在这里插入图片描述
IOU越高越好,越高重合率越高

置信度

框中是人脸的概率有多大
在这里插入图片描述

在这里插入图片描述
得设置阈值来判断哪些框是可以取的 哪些框是不要的 要不会造成图片上一堆框

然后我们可以把根据阈值把召回率和精度的值算出来 并且画出一个pr图
一般精度比较高的时候召回率比较低,召回率高的时候 精度就低(召回率为检测到的数量比上 没有检测到的加上检测到的数量 也就是 没有检测到的较少时候 精度就很低 什么都能识别到这个意思)

MAP值就是这个图画出来后下方所围成的面积,当然map值越接近于1越好在这里插入图片描述
综合到一起得到的值就是map

YOLO-V1

YOLO第一代版本,一步到位,把检测问题转化为回归问题,一个网络架构出一个结果,主要的任务就是对视频进行实时监测,16年的产品
在这里插入图片描述
各大目标检测算法的比较

核心思想是什么?

在这里插入图片描述
7*7的格子每一个格子的中心点进行预测下这个物体是什么
那么怎么去做预测呢?
我们肯定得有一些经验的东西,比如有物体的形状长和宽的经验值,每个小格子产生两种候选框,和真实值进行计算IOU哪个更好就用哪个微调,所以会得到很多个微调的候选框,每个位置都要进行预测 所以每个都会得到一个置信度confidence

每个格子要得到一个值 四个是坐标值 (绘画边框怎么画)一个是可信度的值(是物体的可能性有多大) 然后把小的置信度的过滤掉
总结 输入就是sxs的格子 我们希望每个格子的点产生候选框 然后进行微调,我们并不是所有的框都进行微调,我们还要预测置信度

网络架构

v1版本是无法改变输入大小的
必须是48483 输入值
在这里插入图片描述
原因是因为conv (卷积层)之后的全连接层的大小是固定的
最终要的结果就是 7730 77可以理解 是一个输入图像划分成77的格子 30是三十个数据 其中十个分别是每个格子产生的两个候选框 对应的(x,y,w,1 y1)这里得到的值不是对应坐标值 而是归一化之后的相对的值 对于个框有一个置信度 c1 c2
也就是两个格子占用的数据为10个 还剩下20个 就是20分类 剩下的就是不同类别所代表的概率也就是当前格子对应的每个的分类的概率
在这里插入图片描述
也就是yolov1输出的值就是 s*s (B5+c)

损失函数

loss fuction是多个损失函数的综合 位置的误差 置信度的误差 分类的误差
在这里插入图片描述

但是yolo存在一些缺点
1.在候选框的附件如果需要识别的物体是很难进行检测的
也就是小物体检测不到
2.在好多分类的识别时候 sofemax做不到 把哈士奇和斑点狗进行区分
也就是重叠的东西不好预测 多标签的东西不好预测
(Softmax的含义就在于不再唯一的确定某一个最大值,而是为每个输出分类的结果都赋予一个概率值,表示属于每个类别的可能性。)
在这里插入图片描述

YOLO-V2

更快更高更强 在7个方面做了尝试和改进。
在这里插入图片描述

Batch normalization

批标准化Batch normalization 的 batch 是批数据, 把数据分成小批小批进行 stochastic gradient descent. 而且在每批数据进行前向传递 forward propagation 的时候, 对每一层都进行 normalization 的处理

https://zhuanlan.zhihu.com/p/24810318 参考此链接

更大的分辨率

v2使用了高分辨率分类器 使map获得了提升
在这里插入图片描述
网络架构中 没有全连接层 使用的是DarkNet网络 输入是416*416

v2聚类提取候选框

在这里插入图片描述

YOLO-V3

就是升级了整体核心网络架构

至此基本上YOLO系列已经做得很好了,v3版本主要是在损失函数上做了改进,后面的v4和v5版本也基本都是在特征网络和neck上面做了改进,主要是特征提取更准,对不同尺度的目标预测效果更好,速度更快。

由于yolov3的技术发展 使用到了军事的导弹精准打击上,yolo的作者并不希望这样的事情发生,于是决定停止了 yolo的开发和升级,推出了计算机视觉方向

实时监测 追踪检测 直接用yolo项目就行了 把 别人的论文代码 套过来直接使用就行了
在这里插入图片描述

残差连接–为了更好的特征

从resnet上提取出来的思想 堆叠更深的层进行特征提取,也就是一个学校中一个班平均成绩很差,如果我们不能说整个班都是差生 还是有好的,所以我们就进行一个比较。
网络进行了两种方案,哪个结果好就走哪个
在这里插入图片描述

YOLO实战

1.IDE pycharm
2.框架 pytorch
留到下一期吧 看了一天有点累了 休息下~