您的位置:首页 > 其它

目标检测算法YOLO系列之YOLOv3

2020-07-03 09:11 197 查看

        YOLOv3是YOLO目标检测算法的一个重要版本,它的主要思想是将目标检测问题处理成回归问题,并将图像分为S×S的网格。如果一个目标的中心落入某个格子中,那么该格子就负责检测该目标。
1、网络结构
        YOLO系列都是采用DarkNet网络结构作为主干特征提取的网络框架,YOLOv3采用的是DarkNet-53:

        DarkNet-53网络框架是一个分类的框架,在ImageNet上进行预训练。在做物体检测的时候,我们使用的特征提取的框架通常都是在ImageNet上进行预训练,然后再做迁移学习,用于目标检测。由于我们是做物体检测的任务,所有我们去掉最后三层:Avgpool、Connected、Softmax。
        下面是YOLOv3的网络架构:

        从上图我们可以看到YOLOv3采用的是多尺度特征融合的检测,一张4164163的图片,会得到三种尺度不同的有效特征层:13∗13∗255,26∗26∗255,52∗52∗25513*13*255, 26*26*255, 52*52*25513∗13∗255,26∗26∗255,52∗52∗255
        特征图的尺寸越小,那么它的感受野就越大,适合检测大物体;特征图的尺寸越大,那么它的感受野就越小,适合检测小物体
        这里需要注意的一个问题就是上采样的问题:
        这里的upsample使用的是最近邻插值方法,这样的好处在于上采样过程不需要学习,从而减少了网络参数
2、模型输出的分析
        我们从网络结构中可以看到模型的三种输出为:13∗13∗255、26∗26∗255、52∗52∗25513*13*255、26*26*255、52*52*25513∗13∗255、26∗26∗255、52∗52∗255,这里就必须提到网格划分,YOLOv3的网格划分如下所示:

        一张416∗416∗3416*416*3416∗416∗3的图片经过一些列卷积操作之后,得到13∗1313*1313∗13大小的特征图,那么我们就将这张特征图划分为13∗1313*1313∗13的网格
        一张416∗416∗3416*416*3416∗416∗3的图片经过一些列卷积操作之后,得到26∗2626*2626∗26大小的特征图,那么我们就将这张特征图划分为26∗2626*2626∗26的网格
        一张416∗416∗3416*416*3416∗416∗3的图片经过一些列卷积操作之后,得到52∗5252*5252∗52大小的特征图,那么我们就将这张特征图划分为52∗5252*5252∗52的网格
        对于每个网格,YOLOv3都设置了3个不同宽高的anchor box(后面解释),当然每个不同尺度的特征图对应的anchor box也是不相同的,主要是为了预测不同大小的物体,13∗1313*1313∗13的特征图是为了检测大物体,那么它的anchor box也是比较大的,52∗5252*5252∗52的特征图是为了检测小物体,那么它的anchor box也就是比较小的。Anchor box只含有两个信息:宽Pw、高Ph
        对于每个网格我们的模型都会预测出与anchor box相同数目的bounding box,每个bounding box都含有以下数据:tx, ty, tw, th, confidence, 类别概率。其中tx, ty, tw, th是对anchor box的位置调整参数,confidence表示置信度,类别概率表示anchor box中的物体属于各个类别的概率。
        那么这个时候,我们就能理解模型的输出了:
        13∗13∗25513*13*25513∗13∗255表示含有13∗1313*1313∗13个网格,每个网格预测出3个bounding box,每个bounding box含有4个位置信息,一个置信度,以及80个类别概率,因此是3*(4+1+80)=255,其他的尺寸的输出也是一样的道理。
3、anchor机制
        <1>、为什么使用anchor机制
                (1) 解决一个网格当中含有多个目标的检测任务
                 在YOLOv1当中,没有使用anchor机制,YOLOv1是这样做的,它也是进行网格划分,每一个网格当中含有2个anchor box,每个anchor box含有4个信息:x,y,w,h,confidence,同时每个网格预测一个类别概率信息,两个anchor box共享类别概率信息,然后计算两个anchor box与ground truth box的IOU值,选择较大的那个来负责预测ground truth box,那么当网格中含有两个物体的中心的时候,也只能预测出一个物体。
                但是YOLOv3不同,它的每一个anchor box都可以预测类别概率信息,比如一个网格中含有两个物体,分别计算anchor box与ground truth box的IOU,找到IOU值较大的anchor box,那么就由它就来负责预测对应的ground truth box
                (2) 有助于模型快速的收敛
                这与anchor box的生成方式有关,简单点说,anchor box就是统计ground truth box的形状,找出出现次数最多(具有代表性)的那几种形状,得到anchor box(后面解释)。这样我们的模型就不再是盲目的生成预测框了,而是通过不断的调整anchor box的形状来逼近真实框。就相当于,我们指导预测框要变成什么样。
        <2>、Anchor box的生成方式
        YOLOv3采用的是k-means聚类算法在训练集中所有样本的ground truth box中聚类出具有代表性形状的宽和高,这里需要注意的是k-means中的距离度量使用的是:

        <3>、怎么使用anchor box
        anchor box的使用场景主要有两个方面:
        (1) 样本真实标签的产生过程
                样本的标签应该与模型输出的形状一致,首先我们构造一个全0的形状与模型输出一致的样本标签,然后计算anchor box与真实框之间的IOU值,找到IOU值最大的那个anchor box,确定这个anchor box在哪一个有效特征层,然后计算真实框的中心点落在这个有效特征层的哪个网格当中,那么这个网格当中对应的anchor box就负责预测该物体,这就我们就可以将真实框的位置信息,置信度、类别概率赋给样本标签中对应这个anchor box的位置,其他不负责预测的全部置为0
        (2) 对模型输出结果进行解码的过程
                模型输出的结果是对anchor box的位置调整参数,因此需要解码才能得到真实的预测框的位置。解码的公式如下:

                其中tx、ty、tw、th表示的是模型预测出的位置调整参数,tx、ty通过Sigmoid函数转换到0-1之间,这样可以保证预测框的中心不会超出负责预测的网格的中心。cx、cy表示的是当前网格的左上角坐标。pw、ph表示的是anchor box的宽高。bx、by、bw、bh表示的是预测框的真实位置。这样就可以继续后面的处理了。
        (3) 对样本标签进行编码的过程
                样本的标签对应着真实框的位置信息,其实就相当于bx、by、bw、bh,对其进行编码的过程,就是解码的逆过程:

                通过编码之后的标签就可以和模型输出的结果,进行loss的计算,从而训练模型。
4、置信度
        置信度包含两重含义:
        当前的bounding box包含物体的概率
        当前的bounding box的准确度,也就是框的准不准


5、训练过程
        <1>、准备数据集
                 通过标注软件,比如LabelImg,我们可以在一张图片当中框住自己想要识别的物体,这样就会有一下信息:框的位置信息:左上角、右下角(四个坐标);框中物体的类别信息:属于哪个类别。
                 接下来对数据集进行处理,让它的标签与模型的输出相对应。我们首先计算出每个anchor box的面积,然后计算他们与ground truth box的IOU值,找到最大的那个IOU值对应的anchor box,然后看看anchor box是在哪个有效特征层中
                 然后再计算ground truth box在该有效特征层上的中心点,看看中心点落在了哪个网格中,那么这个网格中的对应的anchor box就负责预测该物体,我们将它的置信度记为1(正样本),不负责预测的就将它的置信度记为0(负样本),这样每个anchor box都有了完整的标记信息。(每个网格都有三个anchor box,每个anchor box都含有这些信息:x, y, w, h, obj, class,其中x,y表示的是网格的中心坐标,也就是anchor box的中心;w, h是anchor box的宽高;obj=1表示负责预测(正样本)/obj=0表示不负责预测(负样本);class:当obj=1时这个类别就是物体的类别,obj=0时这个类别就是0相当于背景)
                这样我们的真实标签就是:(batch_size, grid_size, grid_size, anchors, bx, by, bw, bh, obj, class)
        <2>、构建模型
        得到三个不同尺度的输出(batch_size, grid_size, grid_size, anchors, x, y, w, h, obj, class)
        <3>、构建损失函数
        首先对样本的标签进行编码,然后构建损失函数

6、预测过程
        下面对预测的整个过程进行梳理:
                <1>、输入一张图片,通过DarkNet-53,得到3个有效特征层,也就是模型的输出
                <2>、由模型的输出对anchor box进行调整,就是解码的过程,得到预测框的真实位置
                <3>、由于预测框的数量太多,要先对其进行筛选,首先根据是否包含物体的概率,筛选出得分比较高的一些预测框,之后采用非极大值抑制,去除掉重叠比较多的一些框,得到最终的预测框

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: