吴恩达课程“目标检测”理解与心得

本次的作业运用YOLO算法实现了对一段汽车行驶过程中前置摄像头拍摄到的一段视频进行目标检测,并使用方框标注。

1. 首先导入需要的包,主要有tensorflow、keras、和yolo模块

import argparse
import os
import matplotlib.pyplot as plt
from matplotlib.pyplot import imshow
import scipy.io
import scipy.misc
import numpy as np
import pandas as pd
import PIL
import tensorflow as tf
from keras import backend as K
from keras.layers import Input, Lambda, Conv2D
from keras.models import load_model, Model
from yolo_utils import read_classes, read_anchors, generate_colors, preprocess_image, draw_boxes, scale_boxes
from yad2k.models.keras_yolo import yolo_head, yolo_boxes_to_corners, preprocess_true_boxes, yolo_loss, yolo_body

2. 滑动窗口卷积(模型中用的网络)

为了检测一幅图片中是否存在要检测的物体,如汽车、行人等,首先考虑训练集的创建(考虑这个是为了更好地理解滑动窗口):用x表示汽车样本,y表示标签。需要注意的是,x是裁剪好的只包含汽车的图片。

吴恩达课程中的例子:
在这里插入图片描述
滑动窗口的原理: 对图片进行检测时,由于图片中不可能全都是汽车,还有背景以及其他物体,因此不可能对整个图片进行一次性检测。可以采用一定大小的窗口,在图片中依次滑动进行检测,如此一来,窗口对应的图片内容总有一个会被检测到汽车,并且尺寸与训练集中的x相匹配。

但实际上,这样做会导致计算成本大大增加:由于需要对每个滑动的窗口进行卷积运算,若滑动的步幅较大,精度会出问题;而若步幅较小,运算量会很大。因此,采用下面的方法进行改进。

在此之前, 首先要知道如何把神经网络的全连接层转化为卷积层:假设对象检测算法输入一个14×14×3的图像经过卷积处理,然后添加两个全连接层,最终通过softmax输出

y对应输出的四个分类对应的概率

以上是一般的卷积方法,下面则是如何将全连接层转换为卷积层(用卷积层代替全连接层)
在这里插入图片描述
在前两次卷积时方法不变,全连接层时使用400个5×5×16的过滤器卷积,结果也是400个值,与上边的全连接层对应,后面使用相同的方法,得到最终结果。

卷积的滑动窗口实现

在这里插入图片描述

假设输入给卷积网络的图片大小为14×14×3,和前面一样,进行卷积层替换全连接层的操作,输出为1×1×4(这里的14×14×3可以看作滑动窗口中的一个窗口,举此例是为了更好理解卷积的滑动窗口实现,可以这么认为,在一个大图像中对一个窗口的卷积等效于对这个14×14×3区域的卷积)

对一个图像进行卷积时,如下图:

在这里插入图片描述

假设滑动窗口的大小为14×14,步长为2,则可以在这个16×16的图像上产生4个窗口,如果对这四个窗口分别进行卷积,会有很多重复的卷积操作,因此就造成了计算量的增加,而如果采用上面的方法(卷积层代替全连接层)进行卷积,产生的结果是2×2,这里的每一个值对应4个窗口的卷积结果,即每个窗口中检测到四类物体的概率。

需要注意的是:

  1. 滑动窗口的输出为类别
  2. 滑动窗口的边界框就是一个个窗口,因此可能存在窗口与检测对象不完全匹配的情况

3. YOLO算法

 3.1  如何得到更精准的边界框(bounding box)

假设输入是一个100×100×3的图片,可以将一个3×3的网格放到图片上,基本思路是使用图像分类和定位算法分别应用到9个格子上。因此需要这样定义训练标签:对于9个格子中每个格子指定一个标签y,假设是85维向量(pc,bx,by,bh,bw,c1,c2 … c80),那么对于每个格子都有一个这样的向量。yolo算法做的是找到图片中对象的中点,然后将这个对象分配给包含对象中点的格子。(这里是人为操作进行分配)这样,9个格子每个都对应了一个85维输出目标向量y。所以总的输出标签尺寸就是3×3×85.


如果现在要输入一个100×100×3的图片,先将其输入包含卷积层、池化层等的卷积网络,最后映射为到一个3×3×85输出量。因此要做的就是对于输入x,有这些3×3×85的目标标签,进行反向传播时把x映射到标签上。(我认为这是训练过程进行的内容,即将训练集的x与y匹配 ?)

如此一来,实际检测时输入x就可得到对应的结果y。这种方法和滑动窗口的方法很像,在计算卷积时都没有对9个网格分别计算,而是共享了它们的计算结果。(我认为可以这么理解,此算法可以看作滑动窗口的变形,不同的是对每个网格进行了标签y的指定,即y= (pc,bx,by,bh,bw,c1,c2 … c80),因此输出的是9个85维的向量,包含了目标的识别与定位。而滑动窗口以窗口为边界框进行定位,导致了精度不够。而在计算时方法都是相同的,yolo算法将9个网格看成了滑动窗口算法的窗口。 )

对于bounding box,指定每个网格的左上角坐标为(0,0),右下角坐标为(1,1)。由此边界框各个参数的表示就是小数,边界框的中点(bx,by)一定小于1,可以理解为按目标在网格中的比例确定,而边界框的宽度和高度可以大于1.

 3.2   交并比 IOU 和非极大值抑制的概念

1) IOU

计算两个边界框交集和并集之比

在这里插入图片描述
计算时,以最优边界框为标准,分别和其它边界框计算,如果IOU小于阈值(一般为0.5),则将对应的边界框去掉,只留下IOU大于阈值的边界框。一般来说,IOU是为了评价对象定位算法是否准确,而进行计算的这些边界框,也都是同一个对象产生的边界框(因为一个对象可能会被分到多个网格里,因而产生很多个边界框)

2)非极大值抑制

非极大值抑制可以保证算法对每个对象只检测一次。

目前以上算法可能会对一个对象做出多次检测,如上面橘黄色字体所说,产生多个边框的同时,也会产生相应多的pc,cn。所以算法对某个对象不是检测出一次,而是检测出多次。非极大值抑制做的就是清理这些检测结果。具体操作是定义一个量score:用pc乘对应的每个cn,然后每个网格对应的score取最大值(此时确定了类别),取到score最大值的网格可以被指定为最优的网格,其边界框也被认为是最好的边界框。此时首先过滤掉分数小于阈值的部分,然后所有和这个最优边界框you很高的交并比、高度重叠的其他边界框都被去除, 其输出就被抑制。
在这里插入图片描述

 3.3   anchor box

若想实现每个格子检测到多个对象,就需要使用anchor box。对于每个格子,预先使用多个box的标签,因此标签y 由(pc,bx,by,bh,bw,c1,c2 … c80) 变成了(pc,bx,by,bh,bw,c1,c2 … c80,pc,bx,by,bh,bw,c1,c2 … c80) 这是两个anchor box的例子,实际可能会用到5个anchor box。此时对应的输出由原来的m×3×3×85 变为 m×3×3×5×85。这样每个对象就被分配到了包含此对象中点的网格里,以及与这个对象有最大IOU的anchor box里。以上就是对象在目标标签中的编码方式。如果一个网格有两个以上的对象,它们将分别被分配到对应的anchor box 里。

 3.4  YOLO总结

  1. 对于模型的训练:将对象分配给含有其中点的网格和对应的anchor box

  2. 预测时,输入图像将输出m×3×3×5×85(或m×19×19×5×85)的结果
    在这里插入图片描述

  3. 使用非极大值抑制输出

    每个网格包含5个 anchor box

    过滤掉低概率的内容(其实是只保留每个box里概率最大的类别,此时输出的维度为(19,19,5)即每个格子里留下了每个类别里概率最大的那个)

    对每个类别(85个)使用非极大值抑制产生最终结果,每个类别可能会留下多个对象。




我的心得: 第一次写博客,通过边写边总结,对刚学的东西又有了新的认识。但不足的是,本课具体的代码实现部分仍有些认识模糊的地方,下一次将把对代码的详解写一下,欢迎各位交流指正!。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
吴恩达机器学习课程讲义》是一份非常有价值的学习资料,由著名的机器学习专家吴恩达教授提供。这个讲义以简洁明了的方式介绍了机器学习的基本概念、原理和方法,是学习这门领域的入门必备资料。 这份讲义共分为11个部分,包括了监督学习、无监督学习、神经网络、深度学习等主题。每个部分都由各个章节构成,详细介绍了该主题的相关概念、算法和应用实例。除了理论知识外,讲义还包含了大量的实例和案例分析,帮助读者更好地理解和应用机器学习技术。 这份讲义的亮点在于其简明扼要的风格和丰富的示例。吴恩达教授用通俗易懂的语言解释了复杂的概念,让人容易理解。同时,他通过大量的实例和案例,展示了机器学习在实际问题中的应用,帮助读者将理论与实践相结合。 此外,这份讲义还提供了习题、课后作业和提示等资源,让学习者能够通过练习巩固所学知识。此外,还有一些推荐的阅读材料和在线资源供读者深入学习和进一步探索。 《吴恩达机器学习课程讲义》是一份具有实用性和深度的学习资料,不仅适合机器学习初学者,也适合已经有一定基础的人深入学习。这个讲义不仅能够帮助读者掌握机器学习的基本原理和方法,还能够引导他们在实践中应用机器学习解决实际问题。无论是对于学术研究还是工业应用,这份讲义都是一份必备的学习资料。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值