热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【目标检测】yolo系列:从yolov1到yolov5之YOLOv2详解及复现

YOLOv2Yolov2论文链接:YOLO9000:Better,Faster,Strongeryolov2的改进从Yolov2论文的标题可以直观看到就是Bet

YOLO v2

Yolov2论文链接:YOLO9000: Better, Faster, Stronger


yolov2的改进

从Yolov2论文的标题可以直观看到就是Better、Faster、Stronger。Yolov1发表之后,计算机视觉领域出现了很多trick,例如批归一化、多尺度训练等等,v2也尝试借鉴了R-CNN体系中的anchor box,所有的改进提升,下面逐一介绍。


1. Batch Normalization(批归一化)*

检测系列的网络结构中,BN逐渐变成了标配。在Yolo的每个卷积层中加入BN之后,mAP提升了2%,并且去除了Dropout。


2. Dimension Clusters(Anchor Box的宽高由聚类产生)

这里是yolov2的一个创新点。在v2中,Anchor Box的宽高不经过人为手动获取,而是将训练数据集中的矩形框全部拿出来,用k-means聚类的方式学习得到先验框的宽和高,目的使得大框小框的损失同等衡量。例如使用5个Anchor Box,那么k-means聚类的类别中心个数设置为5。

聚类必须要定义聚类点( 矩形框(w, h) )之间的距离函数,使用(1-IOU)数值作为两个矩形框的的距离函数,如下函数所示:
d(box,centroid)=1−IOU(box,centroid)d(box, centroid) = 1 - IOU(box, centroid) d(box,centroid)=1IOU(box,centroid)
聚类的结果发现,聚类中心的目标框和以前手动选取的不大一样,更多的是较高、较窄的目标框。聚类结果也有了更好的性能。


3. Box Regression(框回归)

YOLOv2对框回归过程进行了改进,过去的框回归过程,由于对txt_{x}txtyt_{y}ty参数没有约束,使得回归后的目标框可以位移到任意位置,这也导致YOLO的框回归中存在不稳定性。改进的做法为引入sigmid函数,对预测的xxxyyy进行约束。

YOLOv2在框回归时,为每一个目标框预测5个参数:txt_{x}tx, tyt_{y}ty, twt_{w}tw, tht_{h}th, tot_{o}to,调整的计算公式为:
请添加图片描述


  • cxc_{x}cx, cyc_{y}cy为格子的左上角坐标(行列值),pwp_{w}pw, php_{h}ph为anchor原始的宽度。
  • tx=0t_{x}=0tx=0时,σ(tx)=0.5\sigma(t_x)=0.5σ(tx)=0.5,bxb_{x}bx刚刚好位于格子中间。
  • twt_{w}tw, tht_{h}th用来控制宽高的缩放,tot_{o}to用来表达置信度信息。

通过使用sigmod函数,将偏移量的范围限制到0到1之间,使得预测框的中心坐标总位于格子内部,减少了模型的不稳定性。

另外,YOLOv2的分类置信度不再共享,每个anchor单独预测。即每一个anchor得到C+5 的预测值。


4. Fine-Grained Features(细粒度特征)

在26 * 26的特征图,经过卷积层等,变为13 * 13的特征图后,作者认为损失了很多细粒度的特征,如图所示,导致小尺寸物体的识别效果不佳,所以在此加入了passthrough层

passthrough层在预测时使用,将网络中间层的特征图输出(具体见下图),将降采样时同一位置的像素分解成4个子图,concat合并起来。变换后通道数变为4倍,降采样2倍。如从512×26×26变为2048×13×13,在这一次操作中不损失细粒度特征。

passthrough层的使用,融合了较高分辨率下的特征信息。
请添加图片描述


5. Multi-Scale Training(多尺寸训练)

Yolov2的网络结构中只有卷积层与池化层,为了增加网络的鲁棒性,YOLOv2在训练过程中可以动态调整网络的输入大小,同时相应地调整网络的结构以满足输入。整个网络的降采样倍数为32,只要输入的特征图尺寸为32的倍数即可(如果网络中有全连接层,就不是这样了)。所以Yolo v2可以使用不同尺寸的输入图片训练。

作者使用的训练方法是,在每10个batch之后,就将图片resize成{320, 352, …, 608}中的一种。不同的输入,最后产生的格点数不同,比如输入图片是320 * 320,那么输出格点是10 * 10,如果每个格点的先验框个数设置为5,那么共输出500个预测结果;如果输入图片大小是608 * 608,输出格点就是19 * 19,共输出1805个预测结果。


网络结构

YOLOv2中使用了一种新的基础网络结构,基于Googlenet,名为Darknet-19。拥有19个卷积层和5个Max Pooling层,网络中使用了Batch Normalization来加快收敛。
v2中移除了v1最后的两层全连接层,全连接层计算量大,耗时久。v2主要是各种trick引入后的效果验证,建议不必纠结于v2的网络结构。


训练过程

主要的训练过程为:

(1)先使用ImageNet数据集对Darknet-19进行分类训练,输入图片大小为224×224,包含标准的数据扩充方式。
(2)将输入图片大小调整为448×448,进行fine-tune。
(3)去掉分类的输出层,添加上文提到的目标检测输出层,进行目标检查的训练。

YOLOv2在上述训练的基础上,又进行了一个联合训练,额外使用只包含标签信息的数据集来进行分类训练,扩大网络可以预测的物体种类数,使其变得更加强大,即YOLO9000。


使用教程

源码地址(pytorch版本):https://github.com/longcw/yolo2-pytorch
(注意,该项目不再维护,并且可能和yolo4后的项目不兼容)

注 1: 这仍然是一个实验项目。VOC07 ​​测试 mAP 约为 0.71(在 VOC07+12 trainval 上训练)。

注意 2: 建议使用torch.utils.data.Dataset编写自己的数据加载器, 因为multiprocessing.Pool.imap即使没有足够的内存空间也不会停止。


Installation and demo


  1. Clone仓库
  2. 下载训练模型的权重文件 yolo-voc.weights.h5 (link updated) 并且在demo.py中设置其路径。
  3. 运行demo.py.

Training YOLOv2

可以在任意数据集上训练yolov2,这边,将以VOC2007/2012数据集为示例。
1. 下载训练、验证、测试数据和 VOCdevkit并解压

wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCdevkit_08-Jun-2007.tar
tar xvf VOCtrainval_06-Nov-2007.tar
tar xvf VOCtest_06-Nov-2007.tar
tar xvf VOCdevkit_08-Jun-2007.tar

2. 数据集结构目录按如下组织

$VOCdevkit/ # development kit
$VOCdevkit/VOCcode/ # VOC utility code
$VOCdevkit/VOC2007 # image sets, annotations, etc.
# ... and several other directories ...

3. 下载预训练模型
下载预训练模型darknet19,然后在yolo2-pytorch/cfgs/exps/darknet19_exp1.py.中设置路径。

4. 可视化训练过程
要使用 TensorBoard,需要在 yolo2-pytorch/cfgs/config.py 中设置 use_tensorboard = True 并安装 TensorboardX。 Tensorboard 日志将保存在训练/运行中。

5. 运行训练代码:python train.py.


Evaluation

在yolo2-pytorch/cfgs/config.py中设置把训练好的模型的路径。

然后运行预测代码。


Training on your own dataset

如果需要在自己的数据集上训练,前向传递要求向网络提供乳腺癌 4 个参数:


  • im_data - 图像数据。
    • 这应该是 C x H x W 格式,其中 C 对应于图像的颜色通道,H 和 W 分别是高度和宽度。颜色通道应为 RGB 格式。
    • 使用 utils/im_transform.py 中提供的 imcv2_recolor 函数来预处理图像。 此外,请确保图像已调整为 416 x 416 像素
  • gt_boxes - numpy 数组的列表,其中每个数组的大小为 N x 4,其中 N 是图像中的特征数。 每行中的四个值应对应于 x_bottom_left、y_bottom_left、x_top_right 和 y_top_right。
  • gt_classes - numpy 数组的列表,其中每个数组包含一个整数值,对应于 gt_boxes 中提供的每个边界框的类
  • dontcare - 列表的列表

推荐阅读
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
author-avatar
我爱投资理财
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有