YOLO v1

候选区域

将图像划分成 7 ∗ 7 = 49 7*7=49 77=49个网格,每个网格允许有2个预测bounding box,也就是全图像有 7 ∗ 7 ∗ 2 = 98 7*7*2=98 772=98个候选区域。

网络输入

yolo的输入可以是任意大小的原始图像,但是在放进网络前必须缩放成448*448的大小。
是由于网络中有两个全连接层,而全连接层需要固定输入的大小。

为什么全连接层需要固定输入的大小?

全连接层的前向传播计算公式为 a l = σ ( z l ) = σ ( W l a l − 1 + b l ) a^l=\sigma(z^l)=\sigma(W^la^{l-1}+b^l) al=σ(zl)=σ(Wlal1+bl)
当前层权重 W l W^{l} Wl,上一层的输出 a l − 1 a^l-1 al1,其中 W l W^{l} Wl的形状是固定的。
例如:
W l W^{l} Wl是(50,784),如果输入图像大小 a l − 1 a^l-1 al1为(36,36)那么压成一维后为(1296,1)则 ( 50 ∗ 784 ) ∗ ( 1296 , 1 ) (50*784)*(1296,1) 5078412961会出现错误无法计算。
只有固定输入 a l − 1 a^l-1 al1为(28,28)压成一维后计算 ( 50 , 784 ) ∗ ( 784 , 1 ) = > ( 50 , 1 ) (50,784)*(784,1)=>(50,1) 50,784784,1=>(50,1)才可以正确计算。

网络输出

7 ∗ 7 ∗ 30 7*7*30 7730的tensor
30个维度=20个对象分类概率+2个预测bounding box的位置+2个bounding box的置信度

1. 20个对象分类概率

voc数据集有20个类别,每个类别的概率 P ( C 1 ∣ o b j e c t ) 、 P ( C 1 ∣ o b j e c t ) . . . P ( C i ∣ o b j e c t ) P(C_1|object)、P(C_1|object)...P(C_i|object) P(C1object)P(C1object)...P(Ciobject)

2. 2个预测bounding box的位置

1个bounding box有4个数值表示位置信息 ( c e n t e r x , c e n t e r y , w i d t h , h e i g h t ) (center_x,center_y,width,height) (centerx,centery,width,height)
分别表示bounding box的中心坐标、宽和高,而2个bounding box有8个数值。

3. 2个bounding box的置信度

bounding box的置信度=
该bounding box存在对象的概率*该bounding box与实际bounding box的IOU

公式: C o n f i d e n c e = P r ( O b j e c t ) ∗ I O U p r e d t r u t h Confidence=Pr(Object)*IOU^{truth}_{pred} Confidence=Pr(Object)IOUpredtruth
其中 P r ( O b j e c t ) Pr(Object) Pr(Object)区别于1中的 P ( C i ∣ o b j e c t ) P(C_i|object) P(Ciobject) P r ( O b j e c t ) Pr(Object) Pr(Object)存在对象概率指的是,无论对象是哪个类别,只有存在对象即可; P ( C i ∣ o b j e c t ) P(C_i|object) P(Ciobject)指的是存在对象,并且该对象是哪一个类别的概率。
I O U p r e d t r u t h IOU^{truth}_{pred} IOUpredtruth的计算:深度学习中的IoU概念理解

特别的

  • 一张图片中检测对象数量有限制:因为图像划分为7*7=49的网格,也就是一张图片最多只可以检测49个对象。
  • YOLO没有预先设置好每个网格中2个bounding box的大小和形状,是对同一个对象输出2种bounding box选择IOU最大的那个作为预测该对象的bounding box。
  • 一个对象只能由一个网格进行预测,即使这个对象跨多个网格,也只能由该对象的bounding box中心位置所落在的那个网格进行预测。该网格存在对象概率为1,其余网格存在对象概率为0。
  • 网格数量及bounding box数量的计算,网格数量和bounding box的数量是可以改变的。
    网格数量S*S,每个网格产生B个bounding box,识别C个不同类别的对象,
    输出的tensor为:
    S ∗ S ∗ ( C + B ∗ ( 4 + 1 ) ) ∣ 其 中 ( 4 + 1 ) 是 4 个 位 置 信 息 和 1 个 置 信 度 S*S*(C+B*(4+1)){|其中(4+1)是4个位置信息和1个置信度} SS(C+B(4+1))(4+1)41

损失函数

S S S是网格数量, B B B是bounding box数量, C C C是类别数。

  • bounding box边框中心点误差:
    λ c o o r d ∑ i = 0 S 2 ∑ j = 0 B I i j o b j [ ( x i − x i ^ ) 2 + ( y i − y i ^ ) 2 ] \lambda_{coord}\sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{I}^{obj}_{ij}[(x_i-\hat{x_i})^2+(y_i-\hat{y_i})^2] λcoordi=0S2j=0BIijobj[(xixi^)2+(yiyi^)2]
    其中 I i j o b j \mathbb{I}_{ij}^{obj} Iijobj表示第i个网格第j个bounding box存在对象; x i ^ , y i ^ \hat{x_i},\hat{y_i} xi^,yi^实际bounding box 中心点位置, λ c o o r d \lambda_{coord} λcoord用于调节bounding box位置误差的权重,YOLO默认为5。
  • bounding box宽高误差:
    λ c o o r d ∑ i = 0 S 2 ∑ j = 0 B I i j o b j [ ( w i − w i ^ ) 2 + ( h i − h i ^ ) 2 ] \lambda_{coord}\sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{I}^{obj}_{ij}[(\sqrt{w_i}-\sqrt{\hat{w_i}})^2+(\sqrt{h_i}-\sqrt{\hat{h_i}})^2] λcoordi=0S2j=0BIijobj[(wi wi^ )2+(hi hi^ )2]
    这里宽高取了平方是因为如果数值大对误差并不敏感,但是如果数值小则对误差很敏感,为了消除误差选择这种平方的方式。
  • 置信度误差(有对象):
    ∑ i = 0 S 2 ∑ j = 0 B I i j o b j ( C i − C i ^ ) 2 \sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{I}^{obj}_{ij}(C_i-\hat{C_i})^2 i=0S2j=0BIijobj(CiCi^)2
  • 置信度误差(无对象):
    λ n o o b j ∑ i = 0 S 2 ∑ j = 0 B I i j n o o b j ( C i − C i ^ ) 2 \lambda_{noobj}\sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{I}^{noobj}_{ij}(C_i-\hat{C_i})^2 λnoobji=0S2j=0BIijnoobj(CiCi^)2
    其中 I i j n o o b j \mathbb{I}_{ij}^{noobj} Iijnoobj表示第i个网格第j个bounding box不存在对象, λ n o o b j \lambda_{noobj} λnoobj在YOLO中默认为0.5。
  • 有对象分类误差:
    ∑ i = 0 S 2 l i o b j ∑ c   ε   c l a s s e s ( P i ( c ) − P i ( c ) ^ ) 2 \sum_{i=0}^{S^2}l^{obj}_{i}\sum_{c\,\varepsilon\,{classes}}(P_i(c)-\hat{P_i(c)})^2 i=0S2liobjcεclasses(Pi(c)Pi(c)^)2
    其中 I i o b j \mathbb{I}_{i}^{obj} Iiobj表示第i个网格存在对象
    总损失函数:

λ c o o r d ∑ i = 0 S 2 ∑ j = 0 B I i j o b j [ ( x i − x i ^ ) 2 + ( y i − y i ^ ) 2 ] + λ c o o r d ∑ i = 0 S 2 ∑ j = 0 B I i j o b j [ ( w i − w i ^ ) 2 + ( h i − h i ^ ) 2 ] + ∑ i = 0 S 2 ∑ j = 0 B I i j o b j ( C i − C i ^ ) 2 + λ n o o b j ∑ i = 0 S 2 ∑ j = 0 B I i j n o o b j ( C i − C i ^ ) 2 + ∑ i = 0 S 2 I i o b j ∑ c   ε   c l a s s e s ( P i ( c ) − P i ( c ) ^ ) 2 \lambda_{coord}\sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{I}^{obj}_{ij}[(x_i-\hat{x_i})^2+(y_i-\hat{y_i})^2]+\lambda_{coord}\sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{I}^{obj}_{ij}[(\sqrt{w_i}-\sqrt{\hat{w_i}})^2+(\sqrt{h_i}-\sqrt{\hat{h_i}})^2]+\sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{I}^{obj}_{ij}(C_i-\hat{C_i})^2+\lambda_{noobj}\sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{I}^{noobj}_{ij}(C_i-\hat{C_i})^2+\sum_{i=0}^{S^2}\mathbb{I}^{obj}_{i}\sum_{c\,\varepsilon\,{classes}}(P_i(c)-\hat{P_i(c)})^2 λcoordi=0S2j=0BIijobj[(xixi^)2+(yiyi^)2]+λcoordi=0S2j=0BIijobj[(wi wi^ )2+(hi hi^ )2]+i=0S2j=0BIijobj(CiCi^)2+λnoobji=0S2j=0BIijnoobj(CiCi^)2+i=0S2Iiobjcεclasses(Pi(c)Pi(c)^)2

训练

总共有24个卷积层和2个全连接层。前20层利用ImageNet进行预训练,后4层卷积层用随机数值初始化。
除了最后一层采用线性激活函数,其他层均用Leaky-RELU进行激活。(各种激活函数:一文搞懂激活函数)
并且采用了dropout和数据增强防止过拟合。

预测

预测中最主要用了NMS(非极大值抑制算法)

NMS

根据上面说的,网络的输出是 7 ∗ 7 ∗ 30 7*7*30 7730的tensor,1个网格有20个类别对象的概率*2个bounding box的置信度=40个候选对象,49个网格就有 49 ∗ 40 = 1960 49*40=1960 4940=1960个候选对象,对每种对象进行NMS则 1960 / 20 = 98 1960/20=98 1960/20=98,每个类别有98个候选对象。
设 置 阈 值 , 把 s c o r e 低 于 阈 值 的 对 象 去 除 设置阈值,把score低于阈值的对象去除 score
⇓ \Downarrow
遍 历 每 个 类 别 遍历每个类别
⇓ \Downarrow
找 到 98 个 候 选 对 象 中 选 择 s c o r e 最 大 找到98个候选对象中选择score最大 98score
⇓ \Downarrow
上 面 找 到 的 候 选 对 象 与 其 余 s c o r e 不 为 0 的 候 选 对 象 之 间 计 算 I O U 上面找到的候选对象与其余score不为0的候选对象之间计算IOU score0IOU
⇓ \Downarrow
去 除 I O U 大 于 阈 值 的 候 选 对 象 ( 就 是 重 叠 度 很 高 ) , 并 设 置 s c o r e = 0 去除IOU大于阈值的候选对象(就是重叠度很高),并设置score=0 IOUscore=0
⇓ \Downarrow
最 后 记 下 剩 余 的 候 选 对 象 , 返 回 第 二 个 步 骤 , 继 续 下 一 个 对 象 最后记下剩余的候选对象,返回第二个步骤,继续下一个对象

缺陷

虽然速度很快,但是精度不如RCNN,定位不准确,召回率低。

  1. 一个网格只能预测一个类别两种bbox,当一个网格中存在两种类别时(如这两个物体重叠,中心点都在同一个网格中),这个网格只能预测其中一个
  2. 依赖训练数据的bbox,如果预测的时候出现与训练时不同长宽比例的bbox时,泛化性低。

参考:<机器爱学习>YOLO v1深入理解
非极大值抑制(Non-Maximum Suppression,NMS)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值