tensorflow随笔——Yolo v1
Yolo背景
Yolo的训练和检测均在一个端到端的网络中进行,将物体检测作为回归问题求解,输入图像经过一次Inference,便能得到图像中所有物体的位置和其所属类别及相应置信概率。这种直接选用整图训练模型的架构可以更好的区分目标和背景区域,相比于proposal的方法更少把背景区域误检为目标。
Inference过程
YOLO网络结构由24个卷积层与2个全链接层构成,卷积层用来提取图像特征,全链接层用来预测图像位置和类别概率,网络结构借鉴了GoogleNet分类网络,大量使用1×1和3×3卷积层。网络入口为448×448,图片进入网络之前需要经过resize,网络的输出的张量维度是:S × S ×(B × 5 + C)。
根据上图将图片划分成7×7(S=7),每个网格设置2个box负责预测目标(B=2),C为类别数(VOC取20)。该式表达的含义为:
(1)每个小格会对应B个边界框,每个bbox预测5个值: x, y, w, h, 置信度。(x, y)是bbox的中心在对应格子里的相对位置,范围
[0,1]。(w, h)是bbox相对于全图的的长宽,范围[0,1]。x, y, w, h的4个gt值可以算出来。它和ssd及rcnn系列在这里有个很不
同的地方,它是直接回归bbox的位置,而ssd及rcnn系列是回归的是default box/anchor的偏移量,就是现有一个预设box,
然后网络只用学习这个预设box的偏移使它更准,但是yolo没有default box/anchor这个东西。
(2)每个边界框都有一个置信度,反映当前bounding box是否包含物体以及物体位置的准确性:
其中,若bounding box包含物体,则P(object)=1,否则P(object)=0。IoU为预测bounding box与物体真实区域的交集面积。
如果格子内有物体,则Pr(Object)=1,此时置信度等于IoU。如果格子内没有物体,则Pr(Object)=0,此时置信度为0。
(3)每个小格会对应C个概率值,找出条件概率对应的类别P(Class|object),表示该单元格存在物体且属于第i类的概率。
(4)在测试的时候,每个网格预测的类别信息和bounding box预测的confidence信息相乘,就得到每个boundig box的
class-specific confidence score,然后设置阈值,过滤掉得分低的boxes,再对剩余的进行NMS处理得到最终检测结果。
注:class信息是针对每个网格的,confidence信息是针对每个bounding box的。
以论文参数为例,针对448×448的输入,将其划分为7×7=49个栅格,B设为2,预测PASCAL数据集则C=20,最后的prediction是维度等于1470的Tensor。
Loss函数
Yolo使用均方和误差作为损失函数来优化模型参数,即网络输出的S×S×(B×5+C)维向量与真实图像对应S×S×(B×5+C)维向量的均方和误差,设计目的就是让coord,confidence,classification这三个方面达到很好的平衡。
但是粗暴的采用均方和误差作为优化目标会存在几点不足:
a.定位误差(x,y,w,h)和分类误差同等重要显然不合理,需给定位损失赋予较大的loss weight(pascal voc训练时取5)
b.置信度误差针对网格中有object和没有object同等重要会导致不平衡问题,需给没有object的置信度损失赋予较小的
loss weight(pascal voc训练取0.5)
c.对于大的物体,小的偏差对于小的物体影响较大,为了减少这个影响,所以对bbox的宽高都开根号。
在 YOLO中,每个栅格预测多个bounding box,但在网络模型的训练中,希望每一个物体最后由一个bounding box predictor来负责预测。因此,当前哪一个predictor预测的bounding box与ground truth box的IOU最大,这个 predictor就负责 predict object。
这会使得每个predictor可以专门的负责特定的物体检测。随着训练的进行,每一个 predictor对特定的物体尺寸、长宽比的物体的类别的预测会越来越好。
神经网络输出后的检测流程
得到每个bounding box属于哪一类的confidence score。也就是说最后会得到20*(7*7*2)=20*98的score矩阵,括号里面是bounding box的数量,20代表类别。接下来的操作都是20个类别轮流进行:在某个类别中(即矩阵的某一行),将得分少于阈值(0.2)的设置为0,然后再按得分从高到低排序。最后再用NMS算法去掉重复率较大的bounding box(NMS:针对某一类别,选择得分最大的bounding box,然后计算它和其它bounding box的IOU值,如果IOU大于0.5,说明重复率较大,该得分设为0,如果不大于0.5,则不改;这样一轮后,再选择剩下的score里面最大的那个bounding box,然后计算该bounding box和其它bounding box的IOU,重复以上过程直到最后)。最后每个bounding box的20个score取最大的score,如果这个score大于0,那么这个bounding box就是这个socre对应的类别(矩阵的行),如果小于0,说明这个bounding box里面没有物体,跳过即可。
非极大值抑制
获取Object Detect 结果
YOLO缺点
(1)每个网格只能预测一类物体且对小物体检测效果差:当一个小格中出现多于两个小物体或者一个小格中出现多个不同物体
时效果不佳。虽然B表示每个小格预测边界框数,但YOLO默认同格子里所有边界框为同类物体,并且最终只选择IoU最高
的bounding box作为输出。
(2)图片进入网络前会resize为448×448,降低检测速度,如果直接训练对应尺寸会有加速空间。
(3)基础网络计算量较大。
(4)识别物体位置精准性差,√w和√h策略并没有完全解决location准确度问题。
相关问题
YOLO的每个cell有两个检测器,每个检测器分别预测一个bounding box的xywh和相应的confidence。但分类部分的预测是共享的,由于这个原因,同一个cell是没办法预测多个目标的。
1. 假设类别预测不是共享的,cell中两个检测器都有各自的类别预测,这样能否在一个cell中预测两个目标?
答案:不可以。如果一个cell要预测两个目标,那么这两个检测器要怎么分工预测?谁负责谁很难确定。但是像faster rcnn算法,根据anchor和ground truth的IOU大小来安排anchor负责预测哪个物体,所以从yolo v2开始采用anchor思想可以同个cell预测多个目标。
2. 既然一个cell只能预测一个目标,为什么要预测两个bounding box?
答案:两个检测器一个预测,然后网络选择预测的好的哪个检测器(IOU大的)来进行预测。换句话说就是找一堆人干同一件事,最后选个干的最好的。
参考文档
https://blog.csdn.net/hrsstudy/article/details/70305791
https://blog.csdn.net/c20081052/article/details/80236015
https://blog.csdn.net/qq_28123095/article/details/80052308
https://www.cnblogs.com/fariver/p/7446921.html
tensorflow随笔——Yolo v1相关推荐
- yolo v1论文翻译-整理
论文原文:https://arxiv.org/pdf/1506.02640.pdf Tensorflow版本yolo v1:GitHub - gliese581gg/YOLO_tensorflow: ...
- [paper reading] YOLO v1
[paper reading] YOLO v1 GitHub:Notes of Classic Detection Papers 本来想放到GitHub的,结果GitHub不支持公式. 没办法只能放到 ...
- CNN:RCNN、SPPNet、Fast RCNN、Faster RCNN、YOLO V1 V2 V3、SSD、FCN、SegNet、U-Net、DeepLab V1 V2 V3、Mask RCNN
日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) CNN: 目标检测: RCNN SPPNet Fast RCN ...
- 目标检测:YOLO V1、YOLO V2、YOLO V3 算法
日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) yoloV3模型 目标检测:YOLO V1.YOLO V2.Y ...
- 【YOLO系列】YOLO V1 论文精读与学习总结
目录 0. 前言 1.YOLO V1 大体思路 2. YOLO V1的训练过程 2.1 YOLO V1网络结构 2.2 具体训练过程 2.2.1 把主干结构在ImageNet上进行预训练 2.2.2 ...
- YOLO v1到YOLO v4(下)
YOLO v1到YOLO v4(下) Faster YOLO使用的是GoogleLeNet,比VGG-16快,YOLO完成一次前向过程只用8.52 billion 运算,而VGG-16要30.69bi ...
- YOLO v1到YOLO v4(上)
YOLO v1到YOLO v4(上) 一. YOLO v1 这是继RCNN,fast-RCNN和faster-RCNN之后,rbg(RossGirshick)针对DL目标检测速度问题提出的另外一种框架 ...
- Yolo(1)Yolo v1
目录 一.基础理论 优缺点 二.过程 1.对每张图像打格 2.损失函数 2-1.损失函数介绍 2-2.参数介绍 2-3.注意事项 一.基础理论 步骤1:生成备选框. 步骤2:从备选框中找出物体边框. ...
- 一文看尽目标检测:从YOLO v1到v3的进化之路
本文转载自: http://www.mamicode.com/info-detail-2314392.html 导语:如今基于深度学习的目标检测已经逐渐成为自动驾驶.视频监控.机械加工.智能机器人等领 ...
最新文章
- do一下来了一个redux
- VB6 实现命令行调用时附着到原控制台
- html 辅助标签,工作总结 @Html 辅助方法 为 生成的 标签设置元素属性 htmlAttributes 一个对象,其中包含要为该元素设置的 HTML 特性。...
- Build gradle : Could not find method packagingOptions() for arguments root Project “fasterDev”
- 无人机是计算机什么方面的应用,无人机测绘可以应用到哪些方面呢?
- 《MFC dialog中加入OpenGL窗体》
- #1406 data too long for column '' at row 1
- 《编写高质量代码:改善c程序代码的125个建议》——建议4-2:浮点数转换为新类型时必须做范围检查...
- linux 如何取执行一个脚本5000次,【shell笔记脚本】嵌套、控制循环以及处理循环输出...
- html点线面制作,openlayers 添加点线面 Demo(可直接运行)
- 零基础(转行,应届生、在校生)前端开发学习计划
- php获取用户真实IP和防刷机制的实例代码
- 计算机编程画图步骤,计算机CAD绘图基础教程
- 【POI】导出Excel自适应列宽
- aes离线解密工具_AES-加密解密工具类
- 开箱即用的物联网平台-IoTLink
- 2021年中国皮革行业现状分析:销售收入同比增长8.4%[图]
- 三次样条曲线CubicSpline
- oracle 的lag,oracle分析函数lag
- 【STM32学习】(19)STM32实现直流电机测转速(霍尔传感器)
热门文章
- Codeforces Round #499 (Div. 2): F. Mars rover(DFS)
- [Python] np.nonzero(ndarray) 返回数组中不为0的元素的索引
- rancher中添加用户,赋予权限
- Tornado请求分析request, 获取请求参数
- matlab2c使用c++实现matlab函数系列教程-perms函数
- 多维数组-创建多维数组
- basys3芯片型号xc7a35tcpg236-1
- GoogLeNet网络的Pytorch实现
- layui中折叠面板的使用
- 了解Java密码扩展的基础