YOLO—You Only Look Once学习笔记2

YOLOV2学习笔记

最近项目需要认真学习yolo神经网络,因此将学习过程记录下来。
参考博客1:https://blog.csdn.net/lanran2/article/details/82826045
参考博客2:https://www.pianshen.com/article/7293987192/


前言

YOLOV1-V4的论文链接
1.YOLOV1:https://arxiv.org/abs/1506.02640
2.YOLOV2:https://arxiv.org/abs/1612.08242
3.YOLOV3:https://arxiv.org/abs/1804.02767
4.YOLOV4:https://arxiv.org/abs/2004.10934
5.YOLO官方Github地址:https://github.com/AlexeyAB/darknet
6.YOLO官网:https://pjreddie.com/


YOLOV2

一、摘要

  • YOLOV2优于诸如使用ResNet和SSD的Faster RCNN的最新方法,同时运行速度仍显着提高。
  • 相同的YOLOv2模型可以在不同的大小上运行,从而在速度和准确性之间轻松权衡。
  • 介绍了YOLO9000,这是一种先进的实时对象检测系统,可以检测9000多个对象类别
  • 提出了一种联合训练目标检测和分类的方法, 使用这种方法,在COCO检测数据集和ImageNet分类数据集上同时训练YOLO9000。 通过联合培训,YOLO9000可以预测没有标记检测数据的物体类别的检测结果
  • 联合训练算法的基本思路就是:同时在检测数据集和分类数据集上训练物体检测器(Object Detectors ),用监测数据集的数据学习物体的准确位置,用分类数据集的数据来增加分类的类别量、提升健壮性
  • YOLO9000就是使用联合训练算法训练出来的,他拥有9000类的分类信息,这些分类信息学习自ImageNet分类数据集,而物体位置检测则学习自COCO检测数据集。

二、相比于YOLOV1的提升

YOLOv2相比YOLOv1做了很多方面的改进,这也使得YOLOv2的mAP有显著的提升,并且YOLOv2的速度依然很快,保持着自己作为one-stage方法的优势。

YOLOv2与其它模型在VOC 2007数据集上的效果对比:

YOLOV2的改进策略:

(1)增加Batch Normalization层 (+2%)

  • Batch Normalization(BN)就是将每个隐藏层的输出结果(如 h_1,h_2,h_3 )在batch上也进行标准化后再送入下一层,Batch Normalization具有提升模型优化的作用,这点是Dropout不具备的。所以BN更适合用于数据量比较大的场景。
  • 在V1的基础上增加了BN层,位置在Conv层的后面,给YOLO 的mAP带来了2%的提升。

(2)使用高分辨率的分类器 (+4%)

  • YOLOV1使用ImageNet上预训练的模型作为特征提取器,而其训练时,输入图像分辨率通常在224x224左右,而训练物体检测任务时,需要分辨率更大的图像(因为图像越大,越清晰,越容易检测上面的物体),这样就会造成两者在输入图像分辨率上的不一致。
  • YOLO V2选择先在ImageNet上Finetune高分辨率(448x448)的模型(10 epochs),然后再训练检测模型,这样就“弱化”了分类模型和检测模型在输入图像分辨率上的“不一致”。

(3)采用了骨干网络Darknet-19(训练时)

  • 在 3×3 卷积中间添加了1×1卷积,Feature Map之间的一层非线性变化提升了模型的表现能力;
  • Darknet-19进行了5次降采样,但是在最后一层卷积并没有添加池化层,目的是为了获得更高分辨率的Feature Map

(4)采用了Anchor boxes

  • YOLOV1存在一个问题就是每个格子只能预测一个对象,使用 anchor boxes可以想让一个格子检测出多个对象
  • 预定义各个类别的anchor box,这样一个Anchor会产生多个候选框,因此类别标签会变成多个,以此来和各个类别匹配
  • 增加了Anchor的概念后,mAP由原来的69.5%降低到了69.2%,但是Recall从81%增加到88%,这也为后续的优化提供了可能性

(5)K-means聚类获取Anchor框 + 直接预测位置 (+5%)

  • YOLO V2分配训练样本的策略与V1相同,物体的中心点落在哪个Grid Cell中,其对应的Anchor候选框负责这个物体
  • YOLO V2为了选择更合理的候选框,使用了聚类(K-means)的策略,选出最具有代表性的5个尺寸作为Anchor候选框的尺寸
  • 锚点的中心即是Grid的中心点(YOLOv1是7×7 的Grid,YOLOv2是 13×13的Grid),所以所需要聚类的只有锚点的宽和高),聚类的分类目标是Ground Truth不同的大小和不同的长宽比。
  • YOLOV2的聚类标准:希望锚点与Ground Truth的IoU越大越好在这里插入图片描述
  • 具体流程:

(6)细粒度特征(+1%)

  • 考虑到13x13的特征图,对于小物体不是特别奏效(很小的物体在下采样32倍的情况下就消失了)
  • YOLO V2使用13x13的特征图的同时,又利用了26x26大小的特征图,将两个尺寸的特征图结合
  • 有两步:1)26x26x512的特征图重组成13x13x2048的特征图;2)将13x13x2048的特征图与13x13x1024的特征图Concatenate,得到13x13x3072的特征图
  • 重组示意图:

(7)多尺度训练

  • 为了适应不同尺寸的输入图片,YOLO V2采用了多尺度训练的策略,尺度的选择:从320到608,{320,352,…,608},每隔32选取一个尺度
  • 训练的时候,系统每隔10个batch,随机从这些候选尺度中选择一个进行训练
  • 这种机制使得网络可以更好地预测不同尺寸的图片,意味着同一个网络可以进行不同分辨率的检测任务,在小尺寸图片上YOLOv2运行更快,在速度和精度上达到了平衡

三、训练过程

3.1具体的训练步骤
  • 1.先在 ImageNet 分类数据集上预训练 Darknet-19,此时模型输入为 224 * 224 ,共训练 160 个 epochs。

  • 2.将网络的输入调整为 448 * 448(注意在测试的时候使用 416 * 416 大小) ,继续在 ImageNet 数据集上 finetune 分类模型,训练 10 个 epochs,此时分类模型的 top-1 准确度为 76.5%,而 top-5 准确度为 93.3%。

  • 3.修改 Darknet-19 分类模型为检测模型,移除最后一个卷积层、global avgpooling 层以及 softmax 层,并且新增了三个 3 * 3 * 1024 卷积层,同时增加了一个 passthrough 层(对应细粒度特征步骤),最后使用 1 * 1 卷积层输出预测结果。

    • 图中第 25 层 route 16,意思是来自16层的 output,即 26 * 26 * 512,这是 passthrough 层的来源(细粒度特征)。第 26 层 1 * 1 卷积降低通道数,从 512 降低到 64,输出 26 * 26 * 64。第 27 层进行拆分(passthrough 层)操作,1 拆 4 分成 13 * 13 * 256。第 28 层叠加 27 层和 24 层的输出,得到 13 * 13 * 1280。
3.2补充说明

1.YOLOV2网络经过 3 * 3 卷积和 1 * 1 卷积,最后输出 13 * 13 * 125,具体代表的含义为:

  • 一共有13*13个格子,每个格子预测出5个bounding box,每个bounding box预测25个数,其中20个是class的probability,其余5个参数中有四个表示stx、sty、tw、th,这4个来识别边框的位置和大小,还有1个数是confidence,表示边框预测里有真正的对象的概率

2.YOLOV2的损失函数和YOLOV1没有太大改变,在此不再赘述。

YOLO9000

  • YOLO2 根据 WordNet,将 ImageNet 和 COCO 中的名词对象一起构建了一个 WordTree,以 physical object 为根节点,各名词依据相互间的关系构建树枝、树叶,节点间的连接表达了对象概念之间的蕴含关系
  • 构建好的 WordTree 有 9418 个节点(对象类型),包括 ImageNet 的 Top 9000 个对象,COCO 对象,以及 ImageNet 对象检测挑战数据集中的对象,以及为了添加这些对象,从 WordNet 路径中提取出的中间对象
  • 类别标签构造:一个样本假如标签是 “Norfolk terrier”,则从 “Norfolk terrier” 直到根节点的所有节点概率为 1(图10 中黄色框内的节点),其它节点概率为 0,体现出对象之间的蕴含关系。
  • 标签结果分析:从根节点开始向下遍历,对每一个节点,在它的所有子节点中,选择概率最大的那个(一个节点下面的所有子节点是互斥的),一直向下遍历直到某个节点的子节点概率低于设定的阈值(意味着很难确定它的下一层对象到底是哪个),或达到叶子节点,那么该节点就是该 WordTree 对应的对象。
  • 由于 ImageNet 样本比 COCO 多得多,所以对 COCO 样本会多做一些采样(oversampling),适当平衡一下样本数量,使两者样本数量比为 4:1。
  • YOLO9000 依然采用 YOLO2 的网络结构,不过 5 个先验框减少到 3 个先验框,以减少计算量。YOLO2 的输出是 13 * 13 * 5 * (4 + 1 + 20),现在 YOLO9000 的输出是 13 * 13 * 3 * (4 + 1 + 9418)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于基于YOLO的目标识别算法,以下是一个简单的代码示例: ```python import cv2 import numpy as np # 加载YOLO模型 net = cv2.dnn.readNet("yolov3.weights", "yolov3.cfg") # 获取所有类别名称 with open("coco.names", "r") as f: classes = f.read().splitlines() # 加载图像并进行预处理 img = cv2.imread("image.jpg") height, width, _ = img.shape # 构建输入blob blob = cv2.dnn.blobFromImage(img, 1/255.0, (416, 416), swapRB=True, crop=False) # 设置输入blob到网络中 net.setInput(blob) # 运行前向传播以获取输出层 output_layers_names = net.getUnconnectedOutLayersNames() layer_outputs = net.forward(output_layers_names) # 初始化列表来存储检测结果 boxes = [] confidences = [] class_ids = [] # 遍历每个输出层 for output in layer_outputs: # 遍历每个检测框 for detection in output: 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) # 存储边界框、置信度和类别ID 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 = classes[class_ids[i]] confidence = confidences[i] color = colors[class_ids[i]] cv2.rectangle(img, (x, y), (x + w, y + h), color, 2) cv2.putText(img, f"{label} {confidence:.2f}", (x, y - 5), font, 1, color, 2) # 显示结果图像 cv2.imshow("Image", img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 请确保已经下载了YOLO的权重文件(`yolov3.weights`)、配置文件(`yolov3.cfg`)和类别名称文件(`coco.names`)。你可以从YOLO官方网站下载这些文件。 这段代码加载了YOLO模型并使用它在图像上进行目标识别。它将检测到的目标用边界框和类别标签进行绘制,并显示结果图像。请注意,此代码示例仅适用于YOLOv3模型,如果你使用其他版本的YOLO模型,可能需要相应地进行修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值