本文主要记录YOLOv1的重要知识点、研读论文时产生的疑问问题及解决过程。
本文出现的图片和部分文字源于网络,侵删~~
存在的问题:
1.中心点是怎样确定的?
2. bounding box是怎样生成的?
3. 如果中心点落在某个网格的边线上或者顶点上,哪个网格负责检测物体?
4. GoogLeNet 模型是怎样的?为什么采用这种模型?
5. 24个卷积层是哪24个?在结构图中怎样表示的?
6. 怎样理解损失函数?
7. 怎样解决过拟合问题?
8. IOU是怎样计算的?有什么用?
9. 非极大抑制是怎样实现的?为什么用NMS算法?
10. 条件类概率 P r ( C l a s s ∣ O b j e c t ) Pr(Class|Object) Pr(Class∣Object)是怎样计算的?
11. YOLOv1是怎样预测物体的种类的?
12. 为什么说YOLOv1是把这个物体分类任务当做一个“回归问题(regression)”?
损失函数的设计目标就是让坐标(x,y,w,h),confidence,classification 这个三个方面达到很好的平衡。
简单的全部采用了sum-squared error loss来做这件事会有以下不足:
a) 8维的localization error和20维的classification error同等重要显然是不合理的。
b) 如果一些栅格中没有object(一幅图中这种栅格很多),那么就会将这些栅格中的bounding box的confidence 置为0,相比于较少的有object的栅格,这些不包含物体的栅格对梯度更新的贡献会远大于包含物体的栅格对梯度更新的贡献,这会导致网络不稳定甚至发散。
针对这两个问题,论文引入了 λ c o o r d lambda_{coord} λcoord和 λ n o o b j lambda_{noobj} λnoobj两个平衡参数。
YOLOv1预测的bbox的中心点坐标是网络直接输出的,要归一化。在scipts找到了vol_label.py文件才知道中心坐标是根据标签中的xmin,xmax,ymin,ymax计算出来的。
def convert(size, box):dw = 1./size[0] # 归一化的时候就是使用宽度除以整个image_size的宽度 dh = 1./size[1] # 归一化的时候就是使用高度除以整个image_size的高度x = (box[0] + box[1])/2.0 # 使用(xmin+xmax)/2得到x的中心点y = (box[2] + box[3])/2.0 # 使用(ymin+ymax)/2得到y的中心点w = box[1] - box[0] # 然后宽度就是使用xmax-xmin计算得到h = box[3] - box[2] # 然后高度就是使用ymax-ymin计算得到x = x*dw # 归一化中心坐标xw = w*dw # 归一化bbox宽度y = y*dh # 归一化中心坐标yh = h*dh # 归一化bbox高度return (x,y,w,h)
简单的说,bounding box是回归产生的。运行CNN,得到一些bbox的坐标、bbox中包含物体的置信度和class probabilities。其实回归的输入并不是这些预测的坐标数字,而是预测的坐标对应的feature map中的内容,这个内容与相对于ground truth进行对比,计算,是回归的根本依据。
通过不断的训练,得到了回归的参数,在预测时,网络产生了图像的feature map,对于任意一个预测框,背后对应了一个feature 区域,将学习到的参数与此feature区域进行运算,就会得到调整预测框的参数了。
参考链接:
暂时未找到答案。
GoogLeNet是一个分类网络。YOLOv1遵循GoogleNet分类网络的结构,在这个基础上不使用inception module,而是使用1×1卷积层+3×3卷积层简单代替。使用1×1的原因:1x1卷积层能够跨通道信息整合。
YOLOv1采用卷积网络来提取特征,然后使用全连接层来得到预测值。对于卷积层,主要使用1x1卷积来做channle reduction,然后紧跟3x3卷积。在训练之前,先在ImageNet上进行了预训练,其预训练的分类模型采用前20个卷积层,预训练之后,在预训练得到的20层卷积层之上加上随机初始化的4个卷积层和2个全连接层。
首先要明确两个概念:一是网格中有无目标;二是网格中的一个目标只有一个box负责(responsible),另一个box也算没有目标。根据在线计算IOU的大小确定哪一个bbox负责。
位置损失: 容易理解,负责检测的才有位置损失,其他的都不需回传损失,也就不需要计算,此外小目标对于预测wh的误差更敏感,用开根的方法缓解。举例来说,大小为10和大小为100的目标,预测大小分别为20和110,损失一样,按道理说,检测效果应该是一样的,但是显然小目标检测的更差一些。开根后, ( 20 − 10 ) 2 = 1.7 (sqrt{20}-sqrt{10})^2=1.7 (20 −10 )2=1.7,而 ( 110 − 100 ) 2 = 0.24 (sqrt{110}-sqrt{100})^2=0.24 (110 −100 )2=0.24,相当于强化了小目标的wh的损失。这样就使同样的偏移量,小目标损失比大目标损失大,呈现小目标检测效果更差的现象。符合常理。
confidence损失: 不负责和无目标的box比较多(除了负责检测物体的那个框),为了平衡,加入这部分box加入平衡参数 λ n o o b j lambda_{noobj} λnoobj
类别损失: 含有目标的网格才有类别损失,其他都不需要回传损失,也就不需要计算。(也就是负责检测物体的那个框需要计算损失,其他都不需要)
为了防止过拟合,在第一个全连接层后面接了一个 ratio=0.5 的 Dropout 层。
IOU 的值可以认为是两个区域的重叠部分(交集)除以两个区域的集合部分(并集)所得到的比值。 I O U = A ∩ B A ∪ B IOU=frac{A{cap}B}{A{cup}B} IOU=A∪BA∩B,用于去除多余的bounding box,保留最好的一个bounding box。
NMS算法主要解决的是一个目标被多次检测的问题,使用NMS算法能输出其中一个最好的预测框。NMS算法实现过程:首先从所有的检测框中找到置信度最大的那个框,然后挨个计算其与剩余框的IOU,如果其值大于一定阈值(重合度过高),那么就将该框剔除;如果其值小于一定阈值,那么就先保留,等待第二轮处理。对剩余的检测框重复上述过程,直到处理完所有的检测框(筛选出最好的一个预测框)。
概率其实就是000010000···,某一个是1,其余19个是0。
在判断网格中是否存在物体时,如果 P r ( O b j e c t ) Pr(Object) Pr(Object)!=0,表明该网格中有物体,那么需要继续计算该网格中的物体属于某一类的后验概率 P r ( C l a s s i ∣ O b j e c t ) Pr(Class_i|Object) Pr(Classi∣Object)。假定一共有C类物体,那么每一个网格只预测一次C类物体的条件类概率 P r ( C l a s s i ∣ O b j e c t ) , i = 1 , 2 , . . . , C Pr(Class_i|Object), i=1,2,...,C Pr(Classi∣Object),i=1,2,...,C;每一个网格预测B个bounding box的位置,就有B个后验概率值。即这B个bounding box共享一套条件类概率 P r ( C l a s s i ∣ O b j e c t ) , i = 1 , 2 , . . . , C Pr(Class_i|Object), i=1,2,...,C Pr(Classi∣Object),i=1,2,...,C。
最后一个fc层是用来预测物体属于不同类的概率+bbox中心点坐标x,y和高宽w,h。bbox的高宽是相对于图像归一化后得到的,bbox的中心位置的坐标是相对于某一个网络的位置坐标进行过归一化,因此x,y,w,h的值在[0,1]之间。
原来的目标检测网络比如fast-rcnn 都是先生成提取框(也就是检测区域),然后基于这些区域后面进行的就是一个“分类问题”,但是yolo直接输出就是回归框偏移量、置信度以及每一类的概率(全为连续量),包括损失函数采用均方差损失函数,从这些看这就是一个回归问题。
本文发布于:2024-02-04 18:06:23,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170713282558116.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |