利用小白的视角描写yolov3,简单、易懂!

网络模型

利用小白的视角描写yolov3,简单、易懂!_第1张图片
这是我看到一位大神的作品,冒昧拿来使用,因为实在画的太好了!原文作者:https://me.csdn.net/leviopku
不管是训练还是预测都是使用的同一个网络,那么输出也都是相同的。其中的关键在于输出了三个输出:y1,y2,y3
.(1)他们的维度都是255,即3*(4+1+80),代表预测的4个坐标(tw,th,tx,ty),1个置信度(是目标的概率),80个分类预测分数(coco中有80中分类,要是换一个数据集,80也会改变)。
(2)他们的大小都是NxN(例如13x13),可以考虑为将原始图像转换为NxN个单元格。
那么综合起来看,取其中一个输出13x13x255为例,实际上该网络的输出为[13x13x3]行(4+1+80)列。x3代表一个单元格预测三个(tw,th,tx,ty),这个矩阵每一行代表一个预测。

Anchor的取值

Anchor是通过作者K-means聚类得到的,聚类的含义在这里可以简单的理解为所有的物体大概都可以用9种框框住。那么这9种框就是文中提到的9中anchor,(10×13),(16×30),(33×23),(30×61),(62×45),(59×119),(116×90),(156×198),(373×326)。而且这9种anchor的分配为前三种52x52,中间三种26x26,最后三种13x13。为什么这么分是因为感受野的大小,可以简单理解为单元格画的越小,那么就能将很小的东西用单元格框住,这是使用小的anchor就可以将小的物体框出来。相反要是使用大的anchor,可能一下将很多单元格包含在内,失去了意义。

训练

(1) 将图片输入DarkNet-53,得到3种尺寸的特征图。涉及到张量连接。
(2) 将原始图片按照得到特征图的大小,划分为相对应的单元格。比如特征图大小为13x13,那么相对应的将原始图像划分为13x13个单元格。
(3) 根据真实数据中心点的位置,获得该中心点对应的单元格,就由那个单元格负责预测。一个尺度获得一个单元格,一共三个单元格。
(4) 根据3个单元格对应的9个anchor与目标的IOU,挑选最佳的anchor,作为bbox prio(Ph,Pw)。最佳的anchor对应的单元格提取(Cx,Cy),从最佳anchor对应的网络输出框中提取(tx,ty,tw,th)。
(5) 最后根据公式可以得到此时的预测框,公式如下所示:
利用小白的视角描写yolov3,简单、易懂!_第2张图片
(6) 计算损失:(x,y)(w,h)是均方误差。C,类别损失是二元交叉嘀损失。损失函数如下图所示:
利用小白的视角描写yolov3,简单、易懂!_第3张图片
损失函数中需要注意的几点:
1)(w,h)项中添加了根号,是因为anchor都是随机分配的,而且 anchor的大小之间往往相差10或20,添加根号可以减少误差,让损失函数的中心放在网络输出。
2)c的损失函数分为无目标损失和有目标损失。具体表现为:有目标时,判断为有目标和无目标;无目标时,判断为有目标和无目标。
(7)梯度下降,调整网络参数。

预测

(1) 将图片输入网络
(2) 得到三种不同的特征图,每个特征图分配三种anchor。
(3) 根据特征图的大小将原图划分为相对应的网格数量
(4) 根据上部分的bbox预测公式得到bbox。涉及到anchor和网络输出tx,ty,th,tw
(5) 每个单元格预测3个bbox,则一共预测(13x13+26x26+52x52)x3=10647个bbox
(6) 在每个bbox中计算cx(80个类别中最大的概率)=score
(7) 设置cof-thresh,去掉一下bbox。这是设置的阈值要小,因为不知道该去掉那些
(8) 将剩下的bbox排序,取出其中最大得分的bbox,认为是正确的。
(9) 利用NMS,去掉与上一步中最大得分的bbox的IOU大于一定阈值的bbox。
(10) 之后不断的重复第(8)步,直到搜索完成。
(11) 获得检测图像
水平有限,如有错误,还希望能够指正,谢谢。

你可能感兴趣的:(笔记)