YOLOv3算法原理,源码精讲以及YOLOv4要点(更新阶段)

YOLOv3算法原理,源码精讲以及YOLOv4要点

1、YOLOv3算法原理
2、YOLOv3源码精讲-讲透Anchor机制
3、YOLOv3源码精讲-要点深入理解
4、YOLOv4要点
目标检测:不仅要给出检测出来的内容,还要给出内容的位置。
在开始之前,首先理解一下:
Bounding Box:
在这里插入图片描述
从左到右分别为:

  • 1、轴对齐的Bounding Box(简写为AABB),该框有两种表示方式(x1,y1,x2,y2)—左上右下点的座标或者(x,y,h,w)—中心点的座标和高宽值,即用四维的向量来表示;
  • 2、轴对齐并带有旋转角的Bounding Box,该框在上面四维的基础上,再加上一个旋转角度,即五维的一个向量来表示,一般用于文本检测;
  • 3、圆形的Bounding Box,这种表示方式一般用的比较少。

Bounding Box的表示有绝对座标和尺度归一化后坐标这两种形式。

  • 绝对值座标是绝对位置,比如(50,100,100,200);
  • 尺度归一化后的座标,就是把(500,100,100,200)这种绝对座标占整个图的位置比例,座标归一化到0-1之间。在yolo种,默认的是尺度归一化的表示。

Bounding Box分为3类:

  • Ground True(GT):事先给定的标签框,数据标定的;
  • Prediction:预测的框;
  • Anchor:一种机制框,用来辅助预测的。

训练的数据集:

  • VOC数据集;
  • COCO数据集;
  • 自定义数据集
    其中VOC数据集标定的格式:xml文件
    文件内容如下:
    在这里插入图片描述
    其中文件中的画红线的就是对应的Grounding True框的位置。注意VOC的数据值没有进行归一化。
    但是yolo使用的是归一化的数据,不用担心,有转化的工具,后面会说。

IoU/Jaccard index
一个重要的概念:IoU或者Jaccard index
IoU是交集和并集的比值,通过下面的图,就可以很清楚的理解,这里不在赘述。
在这里插入图片描述

正式进入YOLOv3部分:

下面这个图是yolov3的一个预测过程:
在这里插入图片描述
1、先对要预测的图片进行大小的调整,因为yolov3一旦模型确定之后,对输入的图片大小有固定的要求,所以输入的待检测图片的大小也要固定;
那么如何resize呢?
比如我们输入训练好的模型中的图片大小为416416,但是我们待检测的图片大小是208104。这时,我们是把待检测图片的最长边208放大到416,其实是放大了416/208=2倍,那么104也要同比放大2倍,变成208,那208不足408怎么办?答案是用固定的值进行填补!
例如,补完之后的图片变为:
在这里插入图片描述
代码:

#Resize image
def letterbox_image(img,inp_dim):
    """resize image with unchanged aspect ratio using padding"""
    img_w,img_h=img.shape[1],img.shape[0]
    w,h=inp_dim
    new_w=int(img_w*min(w/img_w,h/img_h))
    new_h=int(img_h*min(w/img_w,h/img_h))
    resized_image=cv2.resize(img,(new_w,new_h),interpolation=cv2.INTER_CUBIC)
    #放大缩小需要事先选取那种插值方式。interpolation是插值方式:INTER_CUBIC是4x4像素邻域的双三次插值,INTER_LINEAR是双线性插值(默认设置)
    canvas=np.full((inp_dim[1],inp_dim[0],3),128,dtype='uint8')
    #使用128填充(inp_dim[1],inp_dim[0],3)维度大小的空间
    canvas[(h-new_h)//2:(h-new_h)//2+new_h,(w-new_w)//2:(w-new_w)//2+new_w,:]=resized_image
    #把图片放入使用128填充的空间中
    return canvas

例如原图:
在这里插入图片描述
resize之后:
在这里插入图片描述
2、把调整完大小之后的图片放入到训练好的模型之中进行预测;
预测的结果获得的框,有可能如下所示:(注意:图不一样,这里仅仅看框)
在这里插入图片描述
3、再使用NMS(非极大值抑制)对预测的结果进行筛选,即删除不必要的框,得到的结果就是最终预测的结果。
例如:左图经过NMS,得到右图。
在这里插入图片描述
下面看一下,在预测过程中的输出数据的含义是什么:
在这里插入图片描述
Pc:框中有物体的概率即置信度,不管是什么物体;
bx,by,bh,bw:框住物体的框的位置和宽高;
c:是被检测物体的类别,如果只有80类,那么c就是一个80维的向量。这个80个数分别是:是第一类物体的概率,是第二类物体的概率,是第三类物体的概率…
具体如下:
在这里插入图片描述
我们把该框含有物体的概率Pc乘以该框含有每一类物体的概率组成c向量,得到的结果就是该框中含有每一类物体的真实概率。在得到的结果中,哪一类的概率最大,该框含有的物体就是哪一类。(当然这么说不准确,后面还有闸值,以及非极大值抑制来进行再次筛选,目前暂且这么理解)

再次深入看一下:
在这里插入图片描述
图片通过卷积层得到的结果如上图的右图所示,其中19*19的格子,每个格子都代表了5个
在这里插入图片描述
为什么是5个,这和后面讲的anchor有关。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章