机器学习基础(七) —— Car Detection With YOLO(V2)

1、问题描述

应用需要解决的问题是在一段实际公路行驶视频中实时进行车辆检测并显示其位置及预测概率,这里使用的公路行驶录像如下(这段视频资料来自drive.ai):

https://github.com/Alnlll/ML/blob/master/several_apps/002-CarDetection/videos/road_video.mp4

实现车辆检测需要给出“车辆种类”、“车辆在图片中位置”信息,其中还应包含属于该种类的“概率”大小,据此设计输出为

Box Label

  • p c
  • b x , b y ( )
  • b h , b w ( )
  • c

2、YOLO V2

本项目使用YOLO作为基础算法解决前述问题。YOLO(You Only Look Once)是一种通过一次前向就可以对多种物体检测得出一次结果的算法,相较于其之前的算法速度大大提升而得以完成实时检测任务。(参考DeepLearning.ai课程和YOLO

下面我们来看YOLO到是什么,通过什么方法解决了什么问题而得到较好的结果的。

a、滑动窗口

有一张较大图片需要进行物体检测,我们不直接使用大图片进行检测,而是使用不同大小的窗口截图图片然后送入网络进行检测,如果物体的中心点被认为在某窗口中,说明这个窗口内存在我们要检测的目标物体, 输出 P c = confidence of object in this grad。

Sliding Window

b、锚点检测

接下来是我们如何得到检测物体的中心点位置(锚点)及其长宽数据,假设我们有一系列的训练数据,这些训练数据图片被标记了检测物体的中心点和长宽数据,那么我们就可以设计输出如 y = ( b x , b y , b h , b w ) 然后通过网络训练就可得到一个可以检测物体锚点的网络,这就是基本的物体检测位置获取的方式。

Sliding Window

如黄色框所示,汽车的中心会被检测为落在黄色窗口内,此时

  • 定位位置的原点为窗口的左上角
  • b x , b y 的值为其据原点距离与窗口长宽的比值,即需要归一化
  • b h , b w 同样是物体边框与窗口长宽的比值,但是此时物体可能超出窗口范围,所以此时数值可能大于一

c、FC层的卷积实现

FC Conv

这一步其实是在为后面的实现铺路,这里简单给出实现方法,后面总体进行讨论。

d、滑动窗口的卷积实现

Sliding Conv

通过上图可以看到每个滑动窗口分别进行卷积计算的方式中不同窗口间存在着大量的重复计算,所以YOLO V2采用的是整张图片同时放入卷及网络进行计算充分利用计算性能,而最终可以同时得到不同滑动窗口的计算结果。

e、AnchorBox

Anchor Box

如上图可能存在同一窗口中包含重复的物体,但是不同物体本身轮廓不同,那么如何在这种条件下进行物体识别,这里提出的就是“Anchor Box”,我们已不同形状的轮廓去判断检测到的物体属于何种。

显而易见的如果不同物体轮廓相同,那么这里是无法有效准确区分的,这也是后续的YOLO优化点之一。

f、模型

1) Loss

为了便于优化计算,“YOLO”使用了“平方误差”,但是实际不能很好的契合当前问题。

  • 网络中同时处理两种问题:定位问题和分类问题,“平方误差”讲两种误差同等对待
  • 未检测到物体网格与检测到物体网格同等对待,因为未检测到物体其概率结果趋向于0,在训练时其可能会比检测到物体网格对梯度影响更大。

所有使用不同系数来为来自不同部分的误差加权,“ λ c o o r d = 5 ”,“ λ n o o b j = 0.5 ”。

  • 对于不同尺寸的Box同等对待

为减小影响使用 b h b w 来进行计算。

Loss

2) 输入输出

综合以上全部内容,我们识别物体的模型如下:

  • 网络输入为 ( m , n h , n w , n C ) 的检测图片数据
  • 网络输出为 ( m , S , S , B , C + 5 ) 的不同窗口不同“Anchor Box”对不同种类物体的预测结果。 S × S 为滑动窗口个数, B 为“Anchor Box”个数, C 为检测物体种类数量。这里与论文 ( m , S , S , B 5 + C ) 略为不同,但实际都是表示不同不同窗口中“Anchor Box”下检测到某种物体的确信程度。

如下:

这里写图片描述

这里写图片描述

其中 p c 即为当前窗口检测到某形状物体的确信程度“ p ( O b j e c t ) ”,那么 c i 表示检测到物体且为某种类的概率“ p ( C l a s s i | O b j e c t ) ”,那么检测到某种类物体的确信程度为“ p ( C l a s s i ) = p ( O b j e c t ) p ( C l a s s i | O b j e c t ) ”。

  • 我们可以根据确信程度为每种“Anchor Box”下检测到的物体排序选择确信度最高的作为不同“Achor Box”下的检测输出,这样我们得到的是 B 个有效检测输出。
  • 当然我们也可以设定“ t h r e s h o l d ”来剔除确信度过低的检测结果,这里也是这么做的。

3) Non-max suppression

上面我们得到了以某“Anchor Box”为标准最可信的检测结果,但是一个窗口可能与多个“Anchor Box”匹配,也就是窗口中包含不同形状的物体或者同一物体的不同形状的预测,要考虑的就是如何筛选出一个检测轮廓与“Anchor Box”的最为匹配的检测结果,这里使用“IOU(Intersection Over Union)”作为标准,顾名思义“IOU”就是计算交叉区域的占比,如下:

IOU

为不同检测结果使用 b x , b y , b h , b w 计算“IOU”后与确信度相乘: p ( c l a s s i ) × I O U , 然后选择匹配度最高的“Anchor Box”下的检测结果作为该物体检测的最终结果,也就是我们最终的检测结果。


1、以上为YOLO-V2的基本内容记录,具体训练过程见相关论文。
2、具体实现见:https://github.com/Alnlll/ML/blob/master/several_apps/002-CarDetection(基本参考Deeplearning.ai在线课程)

猜你喜欢

转载自blog.csdn.net/alnlll/article/details/80218290
car
今日推荐