YoloV1、YoloV2和YoloV3实现细节和区别

YoloV1:对比R-CNN

出处:

《You Only Look Once: Unified, Real-Time Object Detection》

背景:

RCNN存在region proposal 过程,Selective Search每张图花费1~2不能做到real-time

Proposals太多会出现很多假阳例

思想:

提出一个简单的卷积神经网络同时预测边框和预测类别

使用整个图的特征来预测来减少误差

不需要预处理和后处理

结构:

24层卷积+2层FC,3*3卷积下采样,1*1卷积减少特征空间

Our system divides the input image into a 7* 7 grid. If the center of an object falls into a grid cell, that grid cell is responsible for detecting that object. Each grid cell predicts a bounding box and class probabilities associated with that bounding box

输入是448*448*3,输出是7*7*30, 7*7对应每个grid,而20代表20个类的概率和10代表两个boxx y w h 和置信度

激活函数使用LeakyReLU,dropout

损失函数使用平方和误差

如果图中目标很少则预测值大多为0,因此

测试

每个grid cell预测的class信息和bounding box预测的confidence相乘,得到每个bounding box的class-specific confidence score:

缺点

测试尺度必须和训练尺度一致

每个grid只能预测一个物体

 

YoloV2Faster R-CNNSSD

出处:

《YOLO9000: Better, Faster, Stronger》

相对于V1,速度更快,准确率更高,识别类别更多,达到9000多种

Better:

Yolo会产生明显的定位错误,且召回率低

BN:

在Yolo的卷积层后添加BN,取得了2%的提升,帮助正则化模型,去除dropout

High Resolution Classifier:

相对于Yolo使用224*224来训练分类器,然后直接切换448*448来训练检测器,YOLO2在采用 224*224 图像进行分类模型预训练后,再采用 448*448 的高分辨率样本对分类模型进行微调(10个epoch),使网络特征逐渐适应 448*448 的分辨率。然后再使用 448*448 的检测样本进行训练,缓解了分辨率突然切换造成的影响,取得了3.7%提升

Convolutional With Anchor Boxes:

Yolo用全连接层直接预测框的坐标,Faster R-CNN使用RPN来预测偏移和置信度

Yolo在每个grid预设一组不同尺度比例的anchor,这些先验框作为预定义的候选区在神经网络中将检测其中是否存在对象,以及微调边框的位置。

同时去除池化层来提高输出的分辨率

调整输入的分辨率到416*416,下采样后是13*13,每个grid9个anchor,所以共有13*13*9=1521个anchor

Dimension Clusters

对训练集中标注的边框进行聚类分析,以寻找尽可能匹配样本的边框尺寸。对于常用的欧式距离,大边框会产生更大的误差,但我们关心的是边框的IOU。

使用K-means,K=5。K个centroid边框,计算样本中标注的边框与各centroid的Avg IOU

Direct location prediction

由于Faster RCNN参数取值没有任何约束,因此预测边框的中心可能出现在任何位置,训练早期阶段不容易稳定。YOLO调整了预测公式,将预测边框的中心约束在特定gird网格内。

首先将网格的宽高归一化到1,Cx,Cy是当前网格的左上角到整个图像的左上角的距离,Pw,Ph是当前先验框的宽高,而tx,ty,ew,eh是要学习的参数,用sigmoid将偏移量输出到(0, 1)。

passthrough层检测细粒度特征

图像中对象会有大有小,输入图像经过多层网络提取特征,最后输出的特征图中(YOLO2最后输出是13*13),较小的对象可能特征已经不明显甚至被忽略掉了

YOLO2引入一种称为passthrough层,在最后pooling之前,feature map大小是26*26*512,然后将这个map分成四份,所以是4*13*13*512,然后和池化后的13*13*1024直接拼接

Yolo2代码用1*1卷积将通道数从512降到64

多尺度图像训练

因为去掉了全连接层,YOLO2可以输入任何尺寸的图像,作者采用了{320,352,...,608}等10种输入图像的尺寸

高分辨率图像的对象检测

因为YOLO2调整网络结构后能够支持多种尺寸的输入图像

Faster

DarkNet-19比VGG-16小一些,精度不弱于VGG-16,但浮点运算量减少到约1/5,以保证更快的运算速度。

YOLO2的训练主要包括三个阶段:

第一阶段就是先ImageNet分类数据集上预训练Darknet-19,此时模型输入为 224*224。

第二阶段将网络的输入调整为 448*448 ,继续ImageNet数据集上finetune分类模型

第三个阶段就是修改Darknet-19分类模型为检测模型,移除最后一个卷积层、global avgpooling层以及softmax层,并且新增了三个 3*3*1024卷积层,同时增加了一个passthrough层,最后使用 1*1 卷积层输出预测结果,输出的channels数为:num_anchors*(5+num_classes)

总结就是:从416*416*3 变换到 13*13*5*25。稍微大一点的变化是增加了batch normalization,增加了一个passthrough层,去掉了全连接层,以及采用了5个先验框

损失函数:

 

YoloV3:对比

YOLO3采用了称之为Darknet-53的网络结构(含有53个卷积层),它借鉴了残差网络residual network的做法,在一些层之间设置了快捷链路

采用了3个不同尺度的特征图来进行对象检测

9种尺度的先验框

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是Python程序,使用yolo对图片进行昼夜、交通信号灯和车辆识别: ```python import cv2 import numpy as np import time # 加载yolo模型 net = cv2.dnn.readNet("yolov3.weights", "yolov3.cfg") classes = [] with open("coco.names", "r") as f: classes = [line.strip() for line in f.readlines()] layer_names = net.getLayerNames() output_layers = [layer_names[i[0] - 1] for i in net.getUnconnectedOutLayers()] # 加载图片 img = cv2.imread("test.jpg") height, width, channels = img.shape # 对图片进行预处理 blob = cv2.dnn.blobFromImage(img, 0.00392, (416, 416), (0, 0, 0), True, crop=False) # 将图片输入到yolo模型中进行识别 net.setInput(blob) outs = net.forward(output_layers) # 解析输出结果并绘制识别框 class_ids = [] confidences = [] boxes = [] for out in outs: for detection in out: scores = detection[5:] class_id = np.argmax(scores) confidence = scores[class_id] if confidence > 0.5: # 识别到的物体的宽、高、中心坐标 center_x = int(detection[0] * width) center_y = int(detection[1] * height) w = int(detection[2] * width) h = int(detection[3] * height) # 计算识别框的左上角坐标和右下角坐标 x = int(center_x - w / 2) y = int(center_y - h / 2) boxes.append([x, y, w, h]) confidences.append(float(confidence)) class_ids.append(class_id) indexes = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4) # 绘制识别框 font = cv2.FONT_HERSHEY_PLAIN colors = np.random.uniform(0, 255, size=(len(classes), 3)) for i in range(len(boxes)): if i in indexes: x, y, w, h = boxes[i] label = str(classes[class_ids[i]]) color = colors[class_ids[i]] cv2.rectangle(img, (x, y), (x + w, y + h), color, 2) cv2.putText(img, label, (x, y - 5), font, 1, color, 1) # 显示识别结果 cv2.imshow("Image", img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 请注意,这个程序只是一个简单的示例,实际使用中需要根据具体情况进行修改和优化。同时,由于yolo模型的识别结果并不是完全准确的,可能会存在误判的情况,需要根据实际情况进行判断和处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值