学习yolo算法_jackcui
学习内容:
YOLO算法 目标: 1、 目标检测 2、 One stage和Two stage 3、 YOLO算法
学习产出:
Two Stage
Two Stage 是2013年到2015年的主流算法,后来逐渐发展为 One Stage 端到端的目标检测算法。
Two Stage 算法是先进行区域生成,该区域称之为 region proposal(简称RP,一个有可能包含待检物体的预选框),再通过卷积神经网络进行样本分类。
任务流程:特征提取 --> 生成RP --> 分类/定位回归。
常见 Two Stage 目标检测算法有:R-CNN、SPP-Net、Fast R-CNN、Faster R-CNN 和 R- FCN 等。
One Stage
不用 RP,直接在网络中提取特征来预测物体分类和位置。
任务流程:特征提取–> 分类/定位回归。
常见的 One Stage 目标检测算法有:YOLO 系列、SSD 系列、Anchor Free 系列等。
如今,比较常用、实用的目标检测算法都是 One Stage 的。
现在,一般公司面试,都爱问 YOLO 系列的算法,YOLO v4、YOLO v5 这些。
学习概念:bounding box ,即检测框,就是目标外围带颜色的框框,一般简称 bbox。
YOLO v1 的实现,是将一幅图像分成 SxS 个网格(grid cell)。
哪个目标物体的中心落在这个网格中,则这个网格负责预测这个目标。 论文中,是将图像分为 7x7 的网格,即上文中的 S=7。如上图所示,红色的点,就是负责检测狗的。 YOLO v1的检测步骤: 1)resize图片尺寸:即是把输入图片的不同尺寸输入到统一的网络结构中去,需要resize到相同的尺寸 2)输入网络出结果 3)NMS NMS,即非极大值抑制,就是将一些冗余框去掉,示意图如下:
学到 NMS 这需要了解 IOU
IOU 即Intersection over Union,也就是两个box区域的交集比上并集,下面的示意图就很好理解,用于确定两个框的位置像素距离。
[1] 首先计算两个box左上角点坐标的最大值和右下角坐标的最小值
[2] 然后计算交集面积
[3] 最后把交集面积除以对应的并集面积
就这么简单,NMS 就是通过计算 IOU 来去除冗余框的,具体的实现思路如下。
以下图为例,进行说明:
就像上面的图片一样,定位一个车辆,最后算法就找出了一堆的方框,我们需要判别哪些矩形框是没用的。
非极大值抑制的方法是:先假设有6个矩形框,根据分类器的类别分类概率做排序,假设从小到大属于车辆的概率 分别为A、B、C、D、E、F。
(1)从最大概率矩形框F开始,分别判断A~E与F的重叠度IOU是否大于某个设定的阈值;
(2)假设B、D与F的重叠度超过阈值,那么就扔掉B、D;并标记第一个矩形框F,是我们保留下来的。
(3)从剩下的矩形框A、C、E中,选择概率最大的E,然后判断E与A、C的重叠度,重叠度大于一定的阈值,那么就扔掉;并标记E是我们保留下来的第二个矩形框。
就这样一直重复,找到所有被保留下来的矩形框。
代码实现:
x1 = dets[:, 0]
y1 = dets[:, 1]
x2 = dets[:, 2]
y2 = dets[:, 3]
scores = dets[:, 4]
areas = (x2 - x1 + 1) * (y2 - y1 + 1)
order = scores.argsort()[::-1]
keep = []
while order.size > 0:
i = order[0]
keep.append(i)
xx1 = np.maximum(x1[i], x1[order[1:]])
yy1 = np.maximum(y1[i], y1[order[1:]])
xx2 = np.minimum(x2[i], x2[order[1:]])
yy2 = np.minimum(y2[i], y2[order[1:]])
w = np.maximum(0.0, xx2 - xx1 + 1)
h = np.maximum(0.0, yy2 - yy1 + 1)
inter = w * h
ovr = inter / (areas[i] + areas[order[1:]] - inter)
inds = np.where(ovr <= thresh)[0]
order = order[inds + 1]
?
return keep
?
if __name__ == '__main__':
dets = np.array([[100,120,170,200,0.98],
[20,40,80,90,0.99],
[20,38,82,88,0.96],
[200,380,282,488,0.9],
[19,38,75,91, 0.8]])
?
py_cpu_nms(dets, 0.5)
好好学习,天天向上 转载自jack_cui__from https://cuijiahua.com/
|