yolov3在检测目标时拿到图像会做什么,又是如何识别物体的?
首先我们先来看一张显示了yolov3检测流程的图片:

如上图所示,输入网络中的图像是416×416×3的彩色图像,所以要先把图像缩放到416×416

  • grid cell
    网络拿到图像会对图像进行卷积,并通过长步长卷积下采样产生13×13×255,26×26×255,52×52×255的特征图(上图中y1,y2,y3),13×13,26×26,52×52比较好理解,就是原本的图像分辨率被下采样后变小了,特征图的每一个像素点缩放后映射到原图像上形成的网格被称为grid cell,而255就是(80+5)×3,其中,80+5是指coco数据集里的80个种类的概率以及4个确定bbox的参数(分别是框的中心坐标x,y值以及框的长和宽),和一个cof即对框内目标的置信度,数值越接近1置信度越大,也就是越有可能有目标,×3指每一个特征图的每一个像素点都会产生以该点为中心的三个anchorbox,所以是255通道的13×13特征图,每个grid cell在预测时只能识别一个物体,即判断框的中心落在哪个grid cell中,这个物体就归哪个grid cell预测

    如上图,黄框为真实目标,红框为grid cell,三个蓝框为anchor box

  • anchor box
    anchor box就是先验框,即通过聚类得到可以覆盖常见目标的宽和高的框,在进行预测的时候,我们可以利用这个已经定好的宽和高辅助预测,每个grid cell拥有三个不同大小anchor box,而每张图会产生三种不同分辨率的特征图,因此我们就有了9种不同尺度的anchor box,其中心点都在grid cell的中心,而每一个anchor box都可以对框中是否有目标进行判断,所以可以想象一张图片被密密麻麻无数个anchor box所覆盖,每三个anchor box可以用来识别同一个物体,即每个grid cell可以识别一个物体,整个网络理论上可识别13×13+26×26+52×52个目标。如下图所示,anchor box的大小从左至右分别是52×52,26×26,13×13大小的特征图映射到原图片后每个grid cell包含的anchor box,一共9种,每个grid cell的三个anchor box中在训练中与实际物体的grand truch的iou(即重合程度)越大,该物体就归哪个anchor来预测,在预测时,这个anchor box会向物体实际存在的地方移动并进行长宽缩放以尽可能地覆盖待预测物体。

  • 聚类
    上面关于anchor box部分提到了聚类,这里简单介绍一下yolov3用到的聚类,通俗地说,聚类就是把特征相似的数据划分到一起,yolov3的聚类用到了kmeans算法,在预测前需要对数据集做聚类,但是对数据集的质量依赖比较大,如果数据量太少或者不能反映物体的真实分布,那么通过聚类得到的数据就是不准确的,显然,聚类出的数据只能用于本数据集,而不适用于其他数据集。

  • IOU(交并比)
    iou即两个框之间的重合程度,如下图,iou计算的就是a∩b的部分的大小,输出(0~1),数值越大表示重合度越高,在训练时,网络收到输入的图片,会先选取n个真实框和anchor box计算iou,其中iou超过阈值的anchor box被留下,其余的则被抛弃,这时被留下的anchor box将会拿来和ground truth计算位置以及大小偏移量,如果一个grid cell没有剩下的anchor box那么这个grid cell将被舍弃,如果没有grid cell剩下,那么将会返回原图,即未检测出目标,这个过程称为非最大值抑制(nms)

 # box1和box2传入的是框的坐标参数
def bbox_iou(box1, box2, x1y1x2y2=True):# 得到两个框的坐上右下角的坐标值if not x1y1x2y2:b1_x1, b1_x2 = box1[:, 0] - box1[:, 2] / 2, box1[:, 0] + box1[:, 2] / 2b1_y1, b1_y2 = box1[:, 1] - box1[:, 3] / 2, box1[:, 1] + box1[:, 3] / 2b2_x1, b2_x2 = box2[:, 0] - box2[:, 2] / 2, box2[:, 0] + box2[:, 2] / 2b2_y1, b2_y2 = box2[:, 1] - box2[:, 3] / 2, box2[:, 1] + box2[:, 3] / 2else:b1_x1, b1_y1, b1_x2, b1_y2 = box1[:, 0], box1[:, 1], box1[:, 2], box1[:, 3]b2_x1, b2_y1, b2_x2, b2_y2 = box2[:, 0], box2[:, 1], box2[:, 2], box2[:, 3]# 得到重合部分矩形的坐标inter_rect_x1 = torch.max(b1_x1, b2_x1)inter_rect_y1 = torch.max(b1_y1, b2_y1)inter_rect_x2 = torch.min(b1_x2, b2_x2)inter_rect_y2 = torch.min(b1_y2, b2_y2)# 两框的重合面积inter_area = torch.clamp(inter_rect_x2 - inter_rect_x1 + 1, min=0) * torch.clamp(inter_rect_y2 - inter_rect_y1 + 1, min=0)# 两个框的非重合面积b1_area = (b1_x2 - b1_x1 + 1) * (b1_y2 - b1_y1 + 1)b2_area = (b2_x2 - b2_x1 + 1) * (b2_y2 - b2_y1 + 1)iou = inter_area / (b1_area + b2_area - inter_area + 1e-16)return iou
  • 偏移量计算
    被留下的anchor box虽然是比较靠近物体中心的框,但是仅仅是iou高过阈值的anchor box,还要进一步让它向ground truth靠拢,这时就要对anchor box进行一个位置的移动和大小的缩放,下图展现的就是这个过程。

上图中蓝框是物体的真实框,框中心的蓝点是真实框的中心点,虚线框是映射到feature map上的anchor box
Pw,Ph是预设的anchor box映射到feature map中的宽和高
bx,by,bw,bh分别代表预测框的中心坐标的x轴坐标,y轴坐标,以及预测框的宽和长
Cx,Cy是feature map中grid cell的左上角坐标(单位为1,比如13×13右下角的那个grid cell的坐标为(12,12))
tx,ty就是anchor box和它所属的grid cell左上角的偏移量
tw,th是anchor box的大小偏移量
参与计算Loss的是tx,ty,tw,th也就是框的真实位置偏移值和尺寸偏移值
我们先看上图右侧的前两个公式,这两个式子用以确定预测框中心点的坐标,显然,预测框中心点到该点所在的grid cell的左上角的x,y轴距离再加上该grid cell左上角到feature map左上角的x,y轴距离就等于该预测框中心点的x,y轴坐标,但是为什么tx,ty前面要加σ呢?这个σ是指用sigmoid函数激活,把tx,ty的值控制在0到1的范围之内,因为tx和ty,所以若tx或ty大于1的话就会超出该grid cell,比如(tx,tx)=(1.3,1.2)此时该预测框应该属于这个grid cell的右下方的那个grid cell,但是仍然会被归到该grid cell,这样就会产生错误,因为yolov3规定预测框的中心落在哪个grid cell中就归哪个grid cell,而使用sigmoid激活后,即使数值过大,最多会被归到该grid cell的边框上,而不会出框。
预测框的位置偏移量确定了,下面来看后两个式子——用于计算尺寸偏移量,anchor box原本设定是相对于416*416坐标系下的坐标,这里要用feature map大小除以416再乘上原本的anchor box的大小来把anchor box的大小匹配到现有的feature map上,比如13×13的feature map上的anchor box要乘以13/416才能映射到13×13的feature map上。这里tw与th是宽度与高度取e的对数(因为宽和高不可能是负值所以用对数函数处理再用指数函数还原可以限制其值使其大于0),因此要用e的tw,th次方来将其还原。让真实框的长宽bw,bh等于anchor box的长宽乘以偏移量,就可以解出偏移量的值

  • 置信度

    置信度是当前框有目标的概率乘以bounding box和ground truth的IoU的结果

  • 总的loss公式

公式中的参数:
λ:权重,即希望该部分对loss的影响大还是小,希望影响较大就调大,希望影响较小就调小
K: 代表grid size, 所以KK代表13x13,26x26, 52x52
M:M个候选框anchor box,每个候选框会经过网络最终得到相应的bounding box,因为有三个feature map,所以最终得到3
(KKM)个bounding box
I obj ij:i,j框里有物体该值为1,没有物体该值为0(anchor box框内如果没有物体,则不会对该框进行位置和宽高偏移量的loss进行计算)
I noobj ij:i,j框里无物体该值为1,有物体该值为1
(2-w*h):w和h分别代表框的宽和高,这样做能够平衡不同大小框对loss的影响,比如wh越小,2-wh就越大,相当于后面式子乘的倍数就越大,增加了小物体所占的权重
****:头上带“”的变量指的是预测量

两行是计算预测框与真实框之间的坐标位置和宽高差别带来的loss,方括号中是未开方的距离公式,式子前面乘上I obj ij即只对有物体的框进行偏移量的loss计算,无物体的框直接舍弃
三四行可以放在一起看,这两行要处理的是box中是否包含物体,方括号中都是二元交叉熵损失函数,这里第三行的式子前面乘的是I obj ij,第四行的式子前面乘的是I noobj ij,这么做的目的是为了分别对有目标的框和无目标的情况进行优化,让模型不但能识别有物体的情况,也能分辨没有物体的情况,因为很多很多个anchor box中,有物体的只占很小一部分,如果不这样处理,模型就无法优化,因为就算所有的框全部识别无物体,也能获得很高的准确率(因为52×52×3+26×26×3+13×13×3个anchor box中能够成功预测到物体的也没有多少)
五行是类别loss的计算,这一行的意思就是仅在框中有物体时,计算该物体属于任何一个类的(coco数据集有80个)可能性,方括号中是多元交叉熵损失函数

yolov3目标检测过程以及loss计算相关推荐

  1. 深度篇——目标检测史(七) 细说 YOLO-V3目标检测 之 代码详解

    返回主目录 返回 目标检测史 目录 上一章:深度篇--目标检测史(六) 细说 YOLO-V3目标检测 下一章:深度篇--目标检测史(八) 细说 CornerNet-Lite 目标检测 论文地址:< ...

  2. 使用PyTorch从零开始实现YOLO-V3目标检测算法 (一)

    原文:https://blog.csdn.net/u011520516/article/details/80222743 点击查看博客原文 标检测是深度学习近期发展过程中受益最多的领域.随着技术的进步 ...

  3. 使用PyTorch从零开始实现YOLO-V3目标检测算法 (三)

    原文:https://blog.csdn.net/u011520516/article/details/80216009 点击查看博客原文 这是从零开始实现YOLO v3检测器的教程的第3部分.第二部 ...

  4. YOLOV3目标检测模型训练实例

    YOLOV3目标检测 从零开始学习使用keras-yolov3进行图片的目标检测,比较详细地记录了准备以及训练过程,提供一个信号灯的目标检测模型训练实例,并提供相关代码与训练集. DEMO测试 YOL ...

  5. YOLOv3目标检测算法——通俗易懂的解析

    目录 YOLOv3目标检测算法 前沿 一.YOLOv3 二.损失函数 YOLOv3目标检测算法 前沿 前两篇文章我们讲了下关于YOLOv1和YOLOv2的原理,有不懂的小伙伴可以回到前面再看看: YO ...

  6. 分析YOLOv3目标检测

    前言 YOLOv3模型比之前的模型复杂了,但是精度也提高了.YOLOv3最大的变化包括两点:使用残差模型和采用FPN架构.YOLO2曾采用passthrough结构来检测细粒度特征,在YOLO3更进一 ...

  7. 神经网络学习小记录50——Pytorch 利用efficientnet系列模型搭建yolov3目标检测平台

    神经网络学习小记录50--Pytorch 利用efficientnet系列模型搭建yolov3目标检测平台 学习前言 什么是EfficientNet模型 源码下载 EfficientNet模型的实现思 ...

  8. 视频教程-YOLOv3目标检测:原理与源码解析-计算机视觉

    YOLOv3目标检测:原理与源码解析 大学教授,美国归国博士.博士生导师:人工智能公司专家顾问:长期从事人工智能.物联网.大数据研究:已发表学术论文100多篇,授权发明专利10多项 白勇 ¥78.00 ...

  9. 目标检测算法常用Loss——DIoU GIoU CIoU

    目标检测算法常用Loss 文章目录 目标检测算法常用Loss 1. 差值平方损失 2. IoU Loss 3. GIoU Loss 4. DIoU Loss 5. CIoU Loss 6. 说明和补充 ...

最新文章

  1. 6位图灵奖得主,10多位院士,19个分论坛:北京智源大会邀你共同探索AI下一个十年...
  2. 【Netty】Netty 核心组件 ( Future | Channel | Selector | ChannelHandler )
  3. msm8953+android8.1启动异常进入recovery模式_需要格式化data分区恢复启动
  4. python 冒泡排序_Python中的冒泡排序
  5. C#流程控制语句--跳转语句(break,continue,goto,return,)
  6. H264码流打包分析
  7. Pytorch基础(八)——正则化
  8. C++推荐书籍从入门到进阶带你走上大牛之路(珍藏版)
  9. Java高阶入门N篇
  10. DIV+CSS常见问题的14条原因分享
  11. 深度学习caffe:激活函数
  12. Atitit.每月数据采集与备份 v4
  13. 使用函数计算两点间的距离
  14. 获取cad注册表路径
  15. C语言结构体,共用体所占字节数计算
  16. iOS Twitter登录无法收到回调数据
  17. office2020与2016版的不同_如何解决Office2020与office2020兼容问题
  18. 30多岁了,年薪多少才不会焦虑?
  19. 父页面调用子页面方法, 子页面加载父页面传送的数据
  20. Java基础知识——BIO模式

热门文章

  1. 最小路径之佛洛依德算法
  2. Spring boot 整合disruptor
  3. 女生适合linux运维吗,女生适不适合做Linux运维工程师进入IT行业?
  4. 十种工程总承包与工程项目管理方式
  5. SecureCRT乱码问题
  6. 大厂校招薪资曝光,最高42W?想进大厂,掌握这三大能力很关键
  7. stm32 控制 lcd1602
  8. web前端—前端三剑客之JS(13):BOM基础、浏览器窗口
  9. keil5编写stm32代码:提示single-precision operand implicity converted to double-precesion
  10. css是如何做导航栏的,导航菜单CSS五分钟快速制作