模型训练服务器搭建目标检测训练
Ⅰ MMDetection v2 目标检测(4):模型训练和测试
本文以 Faster R-CNN 为例,介绍如何使用 MMDetection v2 ,在 VOC 格式的自定义数据集上,训练和测试模型。
2021.9.1 更新: 适配 MMDetection v2.16
目录:
服务器的环境配置:
命令格式:
命令参数:
示例:
训练完成后,生成的模型检查点和日志文件,存放在 ./work_dirs 目录下。
命令参数:
命令格式:
命令参数:
示例:
测试结果文件评估
命令格式:
命令参数:
示例:
命令格式:
命令参数:
示例:
命令格式:
命令参数:
示例:
命令格式:
命令参数:
示例:
测试喊明告结果文件评估
命令格式:
命令参数:
示例:
命令格式:
命令参数:
示例:
绘制学习曲线
命令格式:
命令参数:
示例:
计算训练时间
命令格式:
命令槐缓参数:
示例:
计算模型复杂度
命令格式:
命令参数:
示例:
命令格式:
命令参数:
示例:
命令格式:
命令参数:
示例:
浏览训练集图像
命令格式:
命令参数:
示例:
打印完整配置
命令格式郑明:
命令参数:
示例:
有帮助的话,点个赞再走吧,谢谢~
参考:
Ⅱ 学习机器视觉是不是需要有服务器啊
您好,学习机器视觉不一定需要有服务器,但是对于大规模的数据处理和模型训练,服务器可以提供更好的计算性能和存储资源,从而加快学习速度和提高模型的准确性。
在学习机器视觉的过程中,需要大量的数据集和算力来训练模型。如果使用个人电脑进行训练,可能会面临计算速度慢、内存不足等问题,而服务器可以提供更好的硬件资源来支持数据处理和模型训练。
另磨局仿外,服务器还可以提供更好的数据安全性和可靠性。如果将数据存储在个人电脑中,可能会面临数据丢失或泄露的风险,而服瞎纤务器可以提供更好的数据备份和安全措施,保障数据的安全性和可靠性。
综上所述,学习机器视觉不一定需要有服务器,但是服务器可以提供更好的计算性腊猜能、存储资源、数据安全性和可靠性,从而提高学习效率和保障数据安全。
Ⅲ Halcon deep learning之目标检测笔记(二)
在上一步,完成了网络的创建和数据的预处理。接下来准备对这个网络进行训练,通过训练得誉册到一个族团可以用于目标检测的深度学习网络模型。这里首先要确定上一步输出的模型和数据集的存放路径是可用的,否则训练环兆虚橘节会因为缺少输入而报错。
Halcon的参考样例detect_pills_deep_learning_2_train.hdev详述了这一过程,这里做一些学习记录。
设置输入路径,主要是两个,一是上一步的预训练的以.hdl结尾的模型,另一个是数据集和样本数据字典的存放路径。
输出路径也是两个,一是存放最佳评估模型的路径,一个是最终训练完成的模型路径。
首先用check_files_availability验证预处理模型和数据集路径是否正确。没有问题的话可以开始读取。
使用read_dl_model读取前一步初始化后的网络模型,得到模型的句柄DLModelHandle。
接着用read_dict读取预处理后的数据集,得到数据字典句柄DLDataset。
设置模型参数主要通过set_dl_model_param算子,以修改属性值的方式改变关键参数的值。该算子原型如下:
set_dl_model_param( : : DLModelHandle, GenParamName, GenParamValue : )
输入三个参数:
注意,如果将'runtime'的值改为了’gpu’,则要确定cuDNN和cuBLAS已经成功安装了。
通过set_dl_model_param算子,可以将本文开头提到的设置的模型的基本参数传递给模型句柄DLModelHandle。如将'batch_size'设为之前的batch_size的值等等。
1)创建训练参数。
这里使用create_dl_train_param算子创建一个训练参数的字典,用于存放训练参数和训练效果可视化的参数。这些参数可以做个说明:
2)训练网络
接下来是最耗时的部分,即使用train_dl_model算子进行深度学习网络模型的训练。算子如下:
train_dl_model( : : DLDataset, DLModelHandle, TrainParam, StartEpoch : TrainResults, TrainInfos,EvaluationInfos)
前四个参数是输入参数,后三个是输出参数。
接着到了第三步,即验证模型的部分。
Ⅳ 目标检测算法的分步介绍(第 1 部分)
英文原文: https://www.analyticsvidhya.com/blog/2018/10/a-step-by-step-introction-to-the-basic-object-detection-algorithms-part-1/
对原文的表达有部分改动
在本文中,我们将更深入地研究可用于目标检测的各种算法。我们将从 RCNN 家族的算法开始,即 RCNN、Fast RCNN 和 Faster RCNN。在本系列即将发布的文章中,我们将介绍更高级的算法,如 YOLO、SSD 等。
下图是说明目标检测算法如何工作的一个流行示例。图像中的每个物体,从一个人到一只风筝,都以一定的精度被定位和识别。
让我们从最简单的深度学习方法开始,也是一种广泛使用的方法,用于检测图像中的目标——卷积神经网络( CNN)。CNN 的内部工作原理如下:
我们将图像传递给网络,然后通过各种卷积和池化层处理,发送给全连接层。最后,我们以目标类别的形式获得输出。这相当简单,不是吗?对于每个输入图像,我们得到一个相应的类作为输出。我们可以使用这种技术来检测图像中的各种目标吗?让我们看看如何使用 CNN 解决一般的目标检测问题。
使用这种方法的问题在于图像中的目标可能具有不同的纵横比和空间位置。例如,在某些情况下,目标可能覆盖图像的大部分,而在某些情况下,目标可能仅覆盖图像的一小部分。目标的形状也可能不同(在现实生活中经常发生)。由于这些因素,我们将需要大量的区域,从而导致大量的计算时间。因此,为了解决这个问题并减少区域数量,我们可以使用基于区域的 CNN,它使用提案法选择区域。让我们了解这个基于区域的 CNN 可以为我们做什么。
与在大量区域上工作不同的是,RCNN 算法是在图像中选取一堆框并检查这些框中是否有任何一个包含任何目标。 RCNN 使用 selective search 从图像中提取这些框(这些框称为 regions)。
让我们首先了解什么是 selective search 以及它如何识别不同的 regions。基本上四个模式可以构成一个物体:不同的尺度、颜色、纹理和外壳。selective search 识别图像中的这些模式,并在此基础上提出各种regions。以下是selective search 工作原理的简要概述:
举个例子:
到目前为止,我们已经看到了 RCNN 如何实现目标检测。但是这种技术有其自身的局限性。由于以下步骤,训练 RCNN 模型既昂贵又缓慢:
所有这些过程结合起来使 RCNN 非常慢。对每张新图像进行预测大约需要 40-50 秒,这实质上使得模型在面对庞大的数据集时变得笨重且几乎无法构建。
好消息是——我们有另一种目标检测技术,它修复了我们在 RCNN 中看到的大部分问题。
我们还能做些什么来减少 RCNN 算法通常需要的计算时间?我们是否可以每张图像只运行一次并获取所有感兴趣的区域(包含某个目标的区域)。
RCNN 的作者 Ross Girshick 提出了这个想法,即每张图像只运行一次 CNN,然后找到一种方法在 2,000 个区域之间共享该计算。在 Fast RCNN 中,我们将输入图像提供给 CNN,后者反过来生成卷积特征图。使用这些地图,提取提议的区域。然后我们使用 RoI 池化层将所有提议的区域重塑为固定大小,以便可以将其馈入全连接网络。
让我们将其分解为简化概念的步骤:
因此,Fast RCNN 不是使用三个不同的模型(如 RCNN),而是使用单个模型从区域中提取特征,将它们分成不同的类,并同时返回识别类的边界框。
为了进一步分解,我将对每个步骤进行可视化。
这就是 Fast RCNN 如何解决 RCNN 的两个主要问题,1. 将每个图像的一个而不是 2,000 个区域传递给 ConvNet。2. 使用一个而不是三个不同的模型来提取特征、分类和生成边界框。
但即使是 Fast RCNN 也存在某些问题。它还使用 selective search 作为寻找感兴趣区域的建议方法,这是一个缓慢且耗时的过程。每张图像检测目标大约需要 2 秒,这与 RCNN 相比要好得多。但是当我们考虑大型现实生活数据集时,即使是 Fast RCNN 看起来也不那么快了。
Faster RCNN 是 Fast RCNN 的修改版本。它们之间的主要区别在于 Fast RCNN 使用 selective search 来生成感兴趣的区域,而 Faster RCNN 使用 Region Proposal Network ,又名 RPN。 RPN 将图像特征图作为输入并生成一组目标提议,每个提议的目标以分数作为输出。
Faster RCNN 方法通常遵循以下步骤:
让我简要解释一下这个区域提议网络(RPN)实际上是如何工作的。
首先,Faster RCNN 从 CNN 获取特征图并将它们传递给区域提议网络。 RPN 在这些特征图上使用一个滑动窗口,在每个窗口,它生成 k 个不同形状和大小的 Anchor 框:
Anchor 框是固定大小的边界框,它们放置在整个图像中,具有不同的形状和大小。对于每个 Anchor,RPN 预测两件事:
我们现在有不同形状和大小的边界框,它们被传递到 RoI 池化层。在 RPN 步骤之后,有可能存在没有分配给它们的类别提议。我们可以获取每个建议并对其进行裁剪,以便每个建议都包含一个目标。这就是 RoI 池化层所做的。它为每个锚点提取固定大小的特征图:
然后将这些特征图传递到具有 softmax 和线性回归层的全连接层。它最终对目标进行分类并预测已识别目标的边界框。
到目前为止,我们讨论的所有目标检测算法都使用区域来识别目标。网络不会一次性查看完整图像,而是依次关注图像的各个部分。这会造成两个并发症:
Ⅳ 目标检测系列(一):R-CNN
目标检测(object detection)是计算机视觉中非常重要的一个领域。在卷积神经网络出现之前,都利用一些传统方法手动提取图像特征进行目标检测及定位,这些方法不仅耗时而且性能较低。而在卷积神经网络出现之后,目标检测伍宏神领域发生了翻天覆地的变化。最着名的目标检测系统有RCNN系列、YOLO和SSD,本文将介绍RCNN系列的开篇作RCNN。
RCNN系列的技术演进过程可参见 基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN 。
目标检测分为两步:第一步是对图像进行分类,即图像中的内容是什么;第二步则是对图像进行定位,找出图像中物体的具体位置。简单来说就是图像里面有什么,位置在哪。
然而,由于不同图片中物体出现的大小可能不同(多尺度),位置也可能不同,而且摆放角度,姿态等都可以不同,同时一张图片中还可以出现多个类别。这使得目标检测任务异常艰难。
上面任务用专业的说法就是:图像识别+定位
两个不同的分支分别完成不同的功能,分类和定位。回归(regression)分支与分类分支(classification)共享网络卷积部分的参数值。
还是刚才的分类识别+回归定位思路。只是现在我们提前先取好不同位置的框,然后将这个框输入到网络中而不是像思路一将原始图像直接输入到网络中。然后计算出这个框的得分,取得分最高的框。
如上,对于同一个图像中猫的识别定位。分别取了四个角四个框进行分类和回归。其得分分别为0.5,0.75,0.6,0.8,因此右下角得分最高,选择右下角的黑框作为目标位置的预测(这里即完成了绝告定位任务)。
这里还有一个问题——检测位置时的框要怎么取,取多大?在上面我们是在257x257的图像中取了221x221的4个角。以不同大小的窗口从左上角到右下角依次扫描的话,数据量会非常大。而且,如果考虑多尺度问题的话,还需要在将图像放缩到不同水腔亏平的大小来进行计算,这样又大大增加了计算量。如何取框这个问题可以说是目标检测的核心问题之一了,RCNN,fast RCNN以及faster RCNN对于这个问题的解决办法不断地进行优化,这个到了后面再讲。
总结一下思路:
对于一张图片,用各种大小的框将图片截取出来,输入到CNN,然后CNN会输出这个框的类别以及其位置得分。
对于检测框的选取,一般是采用某种方法先找出可能含有物体的框(也就是候选框,比如1000个候选框),这些框是可以互相重叠互相包含的,这样我们就可以避免暴力枚举所有框了。
讲完了思路,我们下面具体仔细来看看RCNN系列的实现,本篇先介绍RCNN的方法。
R-CNN相比于之前的各种目标检测算法,不仅在准确率上有了很大的提升,在运行效率上同样提升很大。R-CNN的过程分为4个阶段:
在前面我们已经简单介绍了selective search方法,通过这个方法我们筛选出了2k左右的候选框。然而搜索出的矩形框大小是不同的。而在AlexNet中由于最后全连接层的存在,对于图像尺寸有固定的要求,因此在将候选框输入之前,作者对这些候选框的大小进行了统一处理——放缩到了统一大小。文章中作者使用的处理方法有两种:
(1)各向异性缩放
因为图片扭曲可能会对后续CNN模型训练产生影响,于是作者也测试了各向同性缩放的方法。有两种方法:
此外,作者对于bounding box还尝试了padding处理,上面的示意图中第1、3行就是结合了padding=0,第2、4行结果采用padding=16的结果。经过最后的试验,作者发现采用各向异性缩放、padding=16的精度最高。
卷积神经网络训练分为两步:(1)预训练;(2)fine-tune。
先在一个大的数据集上面训练模型(R-CNN中的卷机模型使用的是AlexNet),然后利用这个训练好的模型进行fine-tune(或称为迁移学习),即使用这个预训练好的模型参数初始化模型参数,然后在目标数据集上面进行训练。
此外,在训练时,作者还尝试采用不同层数的全连接层,发现一个全连接层比两个全连接层效果要好,这可能是因为使用两个全连接层后过拟合导致的。
另一个比较有意思的地方是:对于CNN模型,卷积层学到的特征其实就是基础的共享特征提取层,类似于传统的图像特征提取算法。而最后的全连接层学到的则是针对特定任务的特征。譬如对于人脸性别识别来说,一个CNN模型前面的卷积层所学习到的特征就类似于学习人脸共性特征,然后全连接层所学习的特征就是针对性别分类的特征了。
最后,利用训练好的模型对候选框提取特征。
关于正负样本的问题:由于选取的bounding box不可能与人工label的完全相同,因此在CNN训练阶段需要设置IOU阈值来为bounding box打标签。在文章中作者将阈值设置为0.5,即如果候选框bounding box与人工label的区域重叠面积大于0.5,则将其标注为物体类别(正样本),否则我们就把他当做背景类别(负样本)。
作者针对每一个类别都训练了一个二分类的SVM。这里定义正负样本的方法与上面卷积网络训练的定义方法又不相同。作者在文章中尝试了多种IoU阈值(0.1~0.5)。最后通过训练发现,IoU阈值为0.3的时候效果最好(选择为0精度下降了4个百分点,选择0.5精度下降了5个百分点)。即当IoU小于0.3的时候我们将其视为负样本,否则为正样本。
目标检测问题的衡量标准是重叠面积:许多看似准确的检测结果,往往因为候选框不够准确,重叠面积很小。故需要一个位置精修步骤。
在实现边界回归的过程中发现了两个微妙的问题。第一是正则化是重要的:我们基于验证集,设置λ=1000。第二个问题是,选择使用哪些训练对(P,G)时必须小心。直观地说,如果P远离所有的检测框真值,那么将P转换为检测框真值G的任务就没有意义。使用像P这样的例子会导致一个无望的学习问题。因此,只有当提案P至少在一个检测框真值附近时,我们才执行学习任务。“附近”即,将P分配给具有最大IoU的检测框真值G(在重叠多于一个的情况下),并且仅当重叠大于阈值(基于验证集,我们使用的阈值为0.6)。所有未分配的提案都被丢弃。我们为每个目标类别执行一次,以便学习一组特定于类别的检测框回归器。
在测试时,我们对每个提案进行评分,并预测其新的检测框一次。原则上,我们可以迭代这个过程(即重新评估新预测的检测框,然后从它预测一个新的检测框,等等)。但是,我们发现迭代不会改进结果。
使用selective search的方法在测试图片上提取2000个region propasals ,将每个region proposals归一化到227x227,然后再CNN中正向传播,将最后一层得到的特征提取出来。然后对于每一个类别,使用为这一类训练的SVM分类器对提取的特征向量进行打分,得到测试图片中对于所有region proposals的对于这一类的分数,再使用贪心的非极大值抑制(NMS)去除相交的多余的框。再对这些框进行canny边缘检测,就可以得到bounding-box(then B-BoxRegression)。
参考:
Rich feature hierarchies for accurate object detection and semantic segmentation.
RCNN-将CNN引入目标检测的开山之作-晓雷的文章
基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN
R-CNN 论文翻译
Ⅵ keras如何快速入门
作者 | 杨照璐(微信号lwyzl0821)
编辑 | 言有三
这一次我们讲讲keras这个简单、流行的深度学习框架,一个图像分类任务从训练到测试出结果的全流程。
相关的代码、数据都在我们 Git 上,希望大家 Follow 一下这个 Git 项目,后面会持续更新不同框架下的任务。
Keras是一个非常流行、简单的深度学习框架,它的设计参考了torch,用Python语言编写,是一个高度模块化的神经网络库,支持GPU和CPU。能够在TensorFlow,CNTK或Theano之上运行。 Keras的特点是能够快速实现模型的搭建, 简单方便地让你实现从想法到实验验证的转化,这都是高效地进行科学研究的关键。
Keras的安装非常简单,但是需要先安装一个后端框架作为支撑,TensorFlow, CNTK,Theano都可以,但是官网上强烈建议使用TensorFlow作为Keras的后端进行使用。本例以TensorFlow 1.4.0 版本作为Keras的后端进行测试。
通过上面两条命令就可以完成TensorFlow和Keras的安装,此处需要注意的一点是Keras的版本和TensorFlow的版本要对应,否则会出现意外的错误。具体版本对应关系可在网上进行查询。
3.1 MNIST实例
MNIST手写字符分类被认为是深度学习框架里的“Hello Word!”,下面简单介绍一下MNIST数据集案例的测试。Keras的官方github的example目录下提供了几个MNIST案例的代码,下载mnist_mlp.py,mnist_cnn.py文件,本地运行即可,其他文件读者也可以自行测试。
3.2 数据定义
前面我们介绍了MNIST数据集实例,很多读者在学习深度学习框架的时候都卡在了这一步,运行完MNIST实例之后无从下手,很大原因可能是因为不知道怎么处理自己的数据集,这一节我们通过一个简单的图像二分类案例,介绍如何实现一个自定义的数据集。
数据处理有几种方式,一种是像MNIST、CIFAR数据集,这些数据集的特点是已经为用户打包封装悄穗贺好了数据。用户只要load_data即可实现数据导入。其实就是事先把数据进行解析,然后保存到.pkl 或者.h5等文件中,然后在训练模型的时候直接导入,输入到网络中;另一种是直接从本地读取文件,解析成网络需要的格式,输入网络进行训练。但是实际情况是,为了某一个项目我们不可能总是找到相应的打包好的数据集供使用,这时候自己建立一个dataset就十分重要。
Keras提供了一个图像数据的数据增强文件,调用这个文件我们可以实现网络数据加载的功能。
此处采用keras的processing模块里的ImageDataGenerator类定义一个图像分类任务的dataset生成器:
下面简单地介绍一下上面的代码,完整代码请移步Git工程。
Keras的processing模块中提供了一个能够实时进行数据增强的图像生成类ImagGenerator,该类下面有一个函数flow_from_directory,顾名思义该函数就是从文件夹中获取图像数据。关于ImageGenerator更多的使用可以参考官方源码。数据启派集结构组织如下:
此处还需要注意的一点是,我们现在进行的是简单的图像分类任务训练,假如要完成语义分割,目标检测等任务,则需要自定义一个类(继承ImageDataGenerator),具体实现可以查询相关代码进行参考。
Keras网络模型搭建有两种形式,Sequential 顺序模型和使用函数式API的 Model 类模型。本教程的例子采用一个简单的三层卷积,以及两层全连接和一个分类层组成的网络模族铅型。由于函数式API更灵活方便,因此下面采用函数式方法搭建模型,模型定义如下:
4.1 函数式API
即输出是12通道,卷积核大小3*3,步长为2,padding='same'表示边缘补零
axis表示需要归一化的坐标轴,bn_axis=3,由于采用TensorFlow作为后端,因此这句代码表示在通道数坐标轴进行归一化。
x = Flatten()(x) 表示将卷积特征图进行拉伸,以便和全连接层Dense()进行连接。
Dense()实现全连接层的功能,1200是输出维度,‘relu'表示激活函数,使用其他函数可以自行修改。
最后一层采用‘softmax’激活函数实现分类功能。
最终返回Model,包含网络的输入和输出。
4.2 模型编译
网络搭建完成,在网络训练前需要进行编译,包括学习方法、损失函数、评估标准等,这些参数分别可以从optimizer、loss、metric模块中导入。具体代码如下:
其中callbacks模块包含了TensorBoard, ModelCheckpoint,LearningRateScheler等功能,分别可以用来可视化模型,设置模型检查点,以及设置学习率策略。
5.1 模型训练
Keras模型训练过程非常简单,只需一行代码,设置几个参数即可,具体代码如下:
首先指定数据生成器,train_generator, 前面介绍过;steps_per_epoch是每次epoch循环的次数,通过训练样本数除以batch_size得到;epochs是整个数据集重复多少次训练。
Keras是高度封装的,在模型训练过程中,看不到网络的预测结果和网络的反向传播过程,只需定义好损失函数,事实上,网络定义中的模型输出会包含网络的输入和输出。
5.2 训练过程可视化
keras可以采用tensorboard实现训练过程的可视化。执行完下面的命令就可以在浏览器访问http://127.0.0.1:6006查看效果。
tensorboard --logdir 日志文件路径(默认路径=‘./logs’’)
上面是分别是训练和测试过程的loss和accuracy。
5.3 模型测试
model = simpleconv3()
model.load_weights(model_path, by_name=True)
image_path = '../../../../datas/head/train/0/1left.jpg'
img = Image.open(image_path)
img = img_to_array(img)
img = cv2.resize(img, image_size)
img = np.expand_dims(img, axis=0)
img = preprocess_input(img)
result = model.predict(img, batch_size=1)
print(result)
以上代码简单介绍一下:模型测试流程非常清晰,首先加载模型,加载参数>>将数据输入网络>>模型预测。
模型训练完成后,仅需用model.save_weights('models/model.h5')一句代码就可以完成模型的保存。同样,模型的导入采用model.load_weights(model_path, by_name=True),需要注意的是要设置by_name=True,这样就能保证和模型名称一样的参数都能加载到模型,当然模型定义要和参数是匹配的,假如要进行fine-tune我们只需保证需要重新训练或者新加的网络层的名称和预加载模型参数名称不一样就可以。
以上内容涵盖了采用keras进行分类任务的全部流程,从数据导入、模型搭建、模型训练、测试,模型保存和导入几个方面分别进行了介绍。当然这只是一些基本的应用,还有一些高级、个性化功能需要我们进一步学习,有机会,下一次介绍一下自定义网络层、设置check_point、特征可视化等特性。
Ⅶ YOLO 目标检测实战项目‘原理篇’
在目标检测中,IoU 为预测框 (Prediction) 和真实框 (Ground truth) 的交并比。如下图所示,在关于小猫的目标检测中,紫线边框为预测框 (Prediction),红线边框为真实框 (Ground truth)。
在目标检测任务中,通常取 IoU≥0.5,认为召回。如果 IoU 阈值设置更高,召回率将会降低,但定位框则更加精确。
理想的情况,当然是预测框与真实框重叠越多越好,如果两者完全重叠,则交集与并集面积相同,此时 IoU 等于 1。
之前的目标检测方法需要先产生候选区再检测的方法虽然有相对较高的检测准确率,但运行速度较慢。
YOLO 将识别与定位合二为一,结构简便,检测速度快,更快的 Fast YOLO 可以达到 155FPS。
YOLO 网络借鉴了 GoogLeNet 分类网络结构,不同的是 YOLO 使用 1x1 卷积层和 3x3 卷积层替代 inception mole。如下图所示,整个检测网络包括 24 个卷积层和 2 个全连接层。其中,卷积层用来提取图像特征,全连接层用来预测图像位置和类别概率值。
如上图所示,损失函数分为坐标预测(蓝色框)、含有物体的边界框的 confidence 预测(红色框)、不含有物体的边界框的 confidence 预测(黄色框)、分类预测(紫色框)四个部分。
由于不同大小的边界框对预测偏差的敏感度不同,小的边界框对预测偏差的敏感度更大。为了均衡不同尺寸边界框对预测偏差的敏感度的差异。作者巧妙的对边界框的 w,h 取均值再求 L2 loss. YOLO 中更重视坐标预测,赋予坐标损失更大的权重,记为 coord,在 pascal voc 训练中 coodd=5 ,classification error 部分的权重取 1。
某边界框的置信度定义为:某边界框的 confidence = 该边界框存在某类对象的概率 pr (object)* 该边界框与该对象的 ground truth 的 IOU 值 ,若该边界框存在某个对象 pr (object)=1 ,否则 pr (object)=0 。由于一幅图中大部分网格中是没有物体的,这些网格中的边界框的 confidence 置为 0,相比于有物体的网格,这些不包含物体的网格更多,对梯度更新的贡献更大,会导致网络不稳定。为了平衡上述问题,YOLO 损失函数中对没有物体的边界框的 confidence error 赋予较小的权重,记为 noobj,对有物体的边界框的 confidence error 赋予较大的权重。在 pascal VOC 训练中 noobj=0.5 ,有物体的边界框的 confidence error 的权重设为 1.
YOLOv1 虽然检测速度快,但在定位方面不够准确,并且召回率较低。为了提升定位准确度,改善召回率,YOLOv2 在 YOLOv1 的基础上提出了几种改进策略
YOLOv2 中在每个卷积层后加 Batch Normalization (BN) 层,去掉 dropout. BN 层可以起到一定的正则化效果,能提升模型收敛速度,防止模型过拟合。YOLOv2 通过使用 BN 层使得 mAP 提高了 2%。
目前的大部分检测模型都会使用主流分类网络(如 vgg、resnet)在 ImageNet 上的预训练模型作为特征提取器,而这些分类网络大部分都是以小于 256x256 的图片作为输入进行训练的,低分辨率会影响模型检测能力。YOLOv2 将输入图片的分辨率提升至 448x448,为了使网络适应新的分辨率,YOLOv2 先在 ImageNet 上以 448x448 的分辨率对网络进行 10 个 epoch 的微调,让网络适应高分辨率的输入。通过使用高分辨率的输入,YOLOv2 的 mAP 提升了约 4%。
YOLOv1 利用全连接层直接对边界框进行预测,导致丢失较多空间信息,定位不准。YOLOv2 去掉了 YOLOv1 中的全连接层,使用 Anchor Boxes 预测边界框,同时为了得到更高分辨率的特征图,YOLOv2 还去掉了一个池化层。由于图片中的物体都倾向于出现在图片的中心位置,若特征图恰好有一个中心位置,利用这个中心位置预测中心点落入该位置的物体,对这些物体的检测会更容易。所以总希望得到的特征图的宽高都为奇数。YOLOv2 通过缩减网络,使用 416x416 的输入,模型下采样的总步长为 32,最后得到 13x13 的特征图, 然后对 13x13 的特征图的每个 cell 预测 5 个 anchor boxes ,对每个 anchor box 预测边界框的位置信息、置信度和一套分类概率值。使用 anchor boxes 之后,YOLOv2 可以预测 13x13x5=845 个边界框,模型的召回率由原来的 81% 提升到 88%,mAP 由原来的 69.5% 降低到 69.2%. 召回率提升了 7%,准确率下降了 0.3%。
YOLOv2 采用 Darknet-19,其网络结构如下图所示,包括 19 个卷积层和 5 个 max pooling 层,主要采用 3x3 卷积和 1x1 卷积, 这里 1x1 卷积可以压缩特征图通道数以降低模型计算量和参数 ,每个卷积层后使用 BN 层 以加快模型收敛同时防止过拟合。最终采用 global avg pool 做预测。采用 YOLOv2,模型的 mAP 值没有显着提升,但计算量减少了。
在 Faster R-CNN 和 SSD 中,先验框都是手动设定的,带有一定的主观性。YOLOv2 采用 k-means 聚类算法对训练集中的边界框做了聚类分析,选用 boxes 之间的 IOU 值作为聚类指标。综合考虑模型复杂度和召回率,最终选择 5 个聚类中心,得到 5 个先验框,发现其中中扁长的框较少,而瘦高的框更多,更符合行人特征。通过对比实验,发现用聚类分析得到的先验框比手动选择的先验框有更高的平均 IOU 值,这使得模型更容易训练学习。
Faster R-CNN 使用 anchor boxes 预测边界框相对先验框的偏移量,由于没有对偏移量进行约束,每个位置预测的边界框可以落在图片任何位置,会导致模型不稳定,加长训练时间。YOLOv2 沿用 YOLOv1 的方法,根据所在网格单元的位置来预测坐标,则 Ground Truth 的值介于 0 到 1 之间。网络中将得到的网络预测结果再输入 sigmoid 函数中,让输出结果介于 0 到 1 之间。设一个网格相对于图片左上角的偏移量是 cx,cy。先验框的宽度和高度分别是 pw 和 ph,则预测的边界框相对于特征图的中心坐标 (bx,by) 和宽高 bw、bh 的计算公式如下图所示。
YOLOv2 结合 Dimention Clusters, 通过对边界框的位置预测进行约束,使模型更容易稳定训练,这种方式使得模型的 mAP 值提升了约 5%。
YOLOv2 借鉴 SSD 使用多尺度的特征图做检测,提出 pass through 层将高分辨率的特征图与低分辨率的特征图联系在一起,从而实现多尺度检测。YOLOv2 提取 Darknet-19 最后一个 max pool 层的输入,得到 26x26x512 的特征图。经过 1x1x64 的卷积以降低特征图的维度,得到 26x26x64 的特征图,然后经过 pass through 层的处理变成 13x13x256 的特征图(抽取原特征图每个 2x2 的局部区域组成新的 channel,即原特征图大小降低 4 倍,channel 增加 4 倍),再与 13x13x1024 大小的特征图连接,变成 13x13x1280 的特征图,最后在这些特征图上做预测。使用 Fine-Grained Features,YOLOv2 的性能提升了 1%.
YOLOv2 中使用的 Darknet-19 网络结构中只有卷积层和池化层,所以其对输入图片的大小没有限制。YOLOv2 采用多尺度输入的方式训练,在训练过程中每隔 10 个 batches , 重新随机选择输入图片的尺寸,由于 Darknet-19 下采样总步长为 32,输入图片的尺寸一般选择 32 的倍数 {320,352,…,608}。采用 Multi-Scale Training, 可以适应不同大小的图片输入,** 当采用低分辨率的图片输入时,mAP 值略有下降,但速度更快,当采用高分辨率的图片输入时,能得到较高 mAP 值,但速度有所下降。**
YOLOv2 借鉴了很多其它目标检测方法的一些技巧,如 Faster R-CNN 的 anchor boxes, SSD 中的多尺度检测。除此之外,YOLOv2 在网络设计上做了很多 tricks, 使它能在保证速度的同时提高检测准确率,Multi-Scale Training 更使得同一个模型适应不同大小的输入,从而可以在速度和精度上进行自由权衡。
YOLO v2 对 YOLO v1 的缺陷进行优化,大幅度高了检测的性能,但仍存在一定的问题, 如无法解决重叠问题的分类等 。
将 256x256 的图片分别输入以 Darknet-19,ResNet-101,ResNet-152 和 Darknet-53 为基础网络的分类模型中,实验得到的结果如下图所示。可以看到 Darknet-53 比 ResNet-101 的性能更好,而且速度是其 1.5 倍,Darknet-53 与 ResNet-152 性能相似但速度几乎是其 2 倍。注意到,Darknet-53 相比于其它网络结构实现了每秒最高的浮点计算量,说明其网络结构能更好的利用 GPU。
YOLOv3 借鉴了 FPN 的思想,从不同尺度提取特征。相比 YOLOv2,YOLOv3 提取最后 3 层特征图,不仅在每个特征图上分别独立做预测,同时通过将小特征图上采样到与大的特征图相同大小,然后与大的特征图拼接做进一步预测。用维度聚类的思想聚类出 9 种尺度的 anchor box,将 9 种尺度的 anchor box 均匀的分配给 3 种尺度的特征图 .
在实际应用场合中,一个物体有可能输入多个类别,单纯的单标签分类在实际场景中存在一定的限制。举例来说,一辆车它既可以属于 car(小汽车)类别,也可以属于 vehicle(交通工具),用单标签分类只能得到一个类别。因此在 YOLO v3 在网络结构中把原先的 softmax 层换成了逻辑回归层,从而实现把单标签分类改成多标签分类。用多个 logistic 分类器代替 softmax 并不会降低准确率,可以维持 YOLO 的检测精度不下降。
对于对象检测,不仅要考虑精度,还要考虑实时运行的性能,虽然现在算力大幅度上升,但是普通的设备跑起来还是有点吃力。提高精度和加快速率仍是目标检测的重大课题,道阻且长!
参考:
YOLOv1 参考
YOLOv2 参考
YOLOv3 参考
https://mp.weixin.qq.com/s/yccBloK5pOVxDIFkmoY7xg :非极大抑制
Ⅷ 详细解读TPH-YOLOv5 | 让目标检测任务中的小目标无处遁形
1 简介
针对无人机捕获场景的目标检测是最近比较流行的一项任务。由于无人机在不同高度飞行,目标尺度变化较大,这样给模型的优化也带来了很大的负担。此外,在无人机进行高速低空飞行时,也会带来密集目标的运动模糊问题。
图1 小目标与密集问题
为了解决上述2个问题,本文提出了 TPH-YOLOv5 。 TPH-YOLOv5 在YOLOv5的基础上增加了一个prediction heads 来检测不同尺度的目标。然后通过探索Self-Attention的预测潜力使用了Transformer Prediction Heads(TPH)代侍戚野替原来的prediction heads。同时作者还集成了卷积块Attention模型(CBAM)来寻找密集场景下的注意力区域。
为了进一步改进 TPH-YOLOv5 ,作者还提供了大量有用的策略,如数据增强、多尺度测试、多模型集成和使用额外的分类器。
在VisDrone2021数据集上的大量实验表明,TPH-YOLOv5在无人机捕获场景上具有良好的性能和可解释性。在DET-test-challenge数据集上,TPH-YOLOv5的AP结果为39.18%,比之前的SOTA方法(DPNetV3)提高了1.81%。在VisDrone Challenge 2021中,TPH-YOLOv5与YOLOv5相比提高了约7%。
本文的贡献如下:
2 前人工作总结 2.1 Data Augmentation
数据增强的意义主要是扩展数据集,使模型对不同环境下获得的图像具有较高的鲁棒性。
Photometric和geometric被研究人员广泛使用。对于Photometric主要是对图像的色相、饱和度和值进行了调整。在处理geometric时主要是添加随机缩放、裁剪、平移、剪切和旋转。
除了上述的全局像素增强方法外,还有一些比较独特的数据增强方法。一些研究者提出了将多幅图像结合在一起进行数据增强的方法,如MixUp、CutMix和Mosaic。
MixUp从训练图像中随机选取2个样本进行随机加权求和,样本的标签也对应于加权求和。不同于通常使用零像素mask遮挡图像的遮挡工作,CutMix使用另一个图像的区域覆盖被遮挡的区域。Mosaic是CutMix的改进版。拼接4幅图像,极大地丰富了被检仔型测物体的背景。此外,batch normalization计算每层上4张不同图像的激活统计量。
在TPH-YOLOv5的工作中主要是结合了MixUp、Mosaic以及传统方法进行的数据增强。
2.2 Multi-Model Ensemble Method
我们都知道深度学习模型是一种非线性方法。它们提供了更大的灵活性,并可以根据训练数据量的比例进行扩展。这种灵活性的一个缺点是,它们通过随机训练算法进行学习,这意味着它们对训练数据的细节非常敏感,每次训练时可能会得到一组不同的权重,从而导致不同的预测。 这给模型带来了一个高方差 。
减少模型方差的一个成功方法是训练多个模型而不是单一模型,并结合这些模老喊型的预测。
针对不同的目标检测模型,有3种不同的ensemble boxes方法:非最大抑制(NMS)、Soft-NMS、Weighted Boxes Fusion(WBF)。
在NMS方法中,如果boxes的overlap, Intersection Over Union(IoU)大于某个阈值,则认为它们属于同一个对象。对于每个目标NMS只留下一个置信度最高的box删除其他box。因此,box过滤过程依赖于这个单一IoU阈值的选择,这对模型性能有很大的影响。
Soft-NMS是对NMS进行轻微的修改,使得Soft-NMS在标准基准数据集(如PASCAL VOC和MS COCO)上比传统NMS有了明显的改进。它根据IoU值对相邻边界box的置信度设置衰减函数,而不是完全将其置信度评分设为0并将其删除。
WBF的工作原理与NMS不同。NMS和Soft-NMS都排除了一些框,而WBF将所有框合并形成最终结果。因此,它可以解决模型中所有不准确的预测。本文使用WBF对最终模型进行集成,其性能明显优于NMS。
2.3 Object Detection
基于CNN的物体检测器可分为多种类型:
一些检测器是专门为无人机捕获的图像设计的,如RRNet、PENet、CenterNet等。但从组件的角度来看,它们通常由2部分组成,一是基于CNN的主干,用于图像特征提取,另一部分是检测头,用于预测目标的类和Box。
此外,近年来发展起来的目标检测器往往在backbone和head之间插入一些层,人们通常称这部分为检测器的Neck。接下来分别对这3种结构进行详细介绍:
Backbone
常用的Backbone包括VGG、ResNet、DenseNet、MobileNet、EfficientNet、CSPDarknet53、Swin-Transformer等,均不是自己设计的网络。因为这些网络已经证明它们在分类和其他问题上有很强的特征提取能力。但研究人员也将微调Backbone,使其更适合特定的垂直任务。
Neck
Neck的设计是为了更好地利用Backbone提取的特征。对Backbone提取的特征图进行不同阶段的再处理和合理使用。通常,一个Neck由几个自底向上的路径和几个自顶向下的路径组成。Neck是目标检测框架中的关键环节。最早的Neck是使用上下取样块。该方法的特点是没有特征层聚合操作,如SSD,直接跟随头部后的多层次特征图。
常用的Neck聚合块有:FPN、PANet、NAS-FPN、BiFPN、ASFF、SAM。这些方法的共性是反复使用各种上下采样、拼接、点和或点积来设计聚合策略。Neck也有一些额外的块,如SPP, ASPP, RFB, CBAM。
Head
作为一个分类网络,Backbone无法完成定位任务,Head负责通过Backbone提取的特征图检测目标的位置和类别。
Head一般分为2种:One-Stage检测器和Two-Stage检测器。
两级检测器一直是目标检测领域的主导方法,其中最具代表性的是RCNN系列。与Two-Stage检测器相比One-Stage检测器同时预测box和目标的类别。One-Stage检测器的速度优势明显,但精度较低。对于One-Stage检测器,最具代表性的型号是YOLO系列、SSD和RetaNet。
3TPH-YOLOv53.1 Overview of YOLOv5
YOLOv5有4种不同的配置,包括YOLOv5s,YOLOv5m, YOLOv5l和YOLOv5x。一般情况下,YOLOv5分别使用CSPDarknet53+SPP为Backbone,PANet为Neck, YOLO检测Head。为了进一步优化整个架构。由于它是最显着和最方便的One-Stage检测器,作者选择它作为Baseline。
图2 THP-YOLOv5整体架构
当使用VisDrone2021数据集训练模型时,使用数据增强策略(Mosaic和MixUp)发现YOLOv5x的结果远远好于YOLOv5s、YOLOv5m和YOLOv5l, AP值的差距大于1.5%。虽然YOLOv5x模型的训练计算成本比其他3种模型都要高,但仍然选择使用YOLOv5x来追求最好的检测性能。此外,根据无人机捕获图像的特点,对常用的photometric和geometric参数进行了调整。
3.2 TPH-YOLOv5
TPH-YOLOv5的框架如图3所示。修改了原来的YOLOv5,使其专一于VisDrone2021数据集:
图3 TPH-YOLOv5模型结构 微小物体的预测头
作者统计了VisDrone2021数据集,发现它包含了很多非常小的目标,所以增加了一个用于微小物体检测的预测头。结合其他3个预测头,4头结构可以缓解剧烈的目标尺度变化带来的负面影响。如图3所示,添加的预测头(Head 1)是由low-level、高分辨率的feature map生成的,对微小物体更加敏感。增加检测头后,虽然增加了计算和存储成本,但对微小物体的检测性能得到了很大的提高。
Transformer encoder block
图4 Transformer Block
用Transformer encoder块替换了YOLOv5原版中的一些卷积块和CSP bottleneck blocks。其结构如图4所示。与CSPDarknet53中原有的bottleneck blocks相比,作者认为Transformer encoder block可以捕获全局信息和丰富的上下文信息。
每个Transformer encoder block包含2个子层。第1子层为multi-head attention layer,第2子层(MLP)为全连接层。每个子层之间使用残差连接。Transformer encoder block增加了捕获不同局部信息的能力。它还可以利用自注意力机制来挖掘特征表征潜能。在VisDrone2021数据集中,Transformer encoder block在高密度闭塞对象上有更好的性能。
基于YOLOv5,作者只在头部部分应用Transformer encoder block形成transformer Prediction head(TPH)和backbone端。因为网络末端的特征图分辨率较低。将TPH应用于低分辨率特征图可以降低计算和存储成本。此外,当放大输入图像的分辨率时可选择去除早期层的一些TPH块,以使训练过程可用。
Convolutional block attention mole (CBAM)
CBAM是一个简单但有效的注意力模块。它是一个轻量级模块,可以即插即用到CNN架构中,并且可以以端到端方式进行训练。给定一个特征映射,CBAM将沿着通道和空间两个独立维度依次推断出注意力映射,然后将注意力映射与输入特征映射相乘,以执行自适应特征细化。
图5 CBAM注意力机制
CBAM模块的结构如图5所示。通过本文的实验,在不同的分类和检测数据集上将CBAM集成到不同的模型中,模型的性能得到了很大的提高,证明了该模块的有效性。
在无人机捕获的图像中,大覆盖区域总是包含令人困惑的地理元素。使用CBAM可以提取注意区域,以帮助TPH-YOLOv5抵制令人困惑的信息,并关注有用的目标对象。
Self-trained classifier
用TPH-YOLOv5对VisDrone2021数据集进行训练后,对test-dev数据集进行测试,然后通过可视化失败案例分析结果,得出TPH-YOLOv5定位能力较好,分类能力较差的结论。作者进一步探索如图6所示的混淆矩阵,观察到一些硬类别,如三轮车和遮阳三轮车的精度非常低。
图6 检测混淆矩阵
因此,作者提出了一个Self-trained classifier。首先,通过裁剪ground-truth边界框并将每个图像patch的大小调整为64 64来构建训练集。然后选择ResNet18作为分类器网络。实验结果表明,在这个Self-trained classifier的帮助下,所提方法对AP值提高了约0.8%~1.0%。
4实验与结论
最终在test-set-challenge上取得了39.18的好成绩,远远高于VisDrone2020的最高成绩37.37。
图9 检测结果图