主要内容

使用YOLO v2进行对象检测

这个示例展示了如何训练一个只看一次(YOLO) v2对象检测器。

深度学习是一种强大的机器学习技术,可以用来训练健壮的目标探测器。有几种目标检测技术,包括Faster R-CNN和you only look once (YOLO) v2。这个例子训练YOLO v2车辆检测器使用trainYOLOv2ObjectDetector函数。有关更多信息,请参见开始使用YOLO v2(计算机视觉工具箱)

下载Pretrained探测器

下载一个预先训练过的检测器,以避免等待训练完成。如果你想训练探测器,设置doTraining变量为true。

dotraining = false;如果~ doTraining & & ~存在('yolov2resnet50vehiceexample_19b.mat''文件')disp(“下载预训练探测器(98 MB)……”);pretrainedURL =“//www.tatmou.com/金宝appsupportfiles/vision/data/yolov2ResNet50VehicleExample_19b.mat”;WebSave('yolov2resnet50vehiceexample_19b.mat', pretrainedURL);结束

加载数据集

本例使用一个包含295张图像的小型车辆数据集。这些图像中有许多来自加州理工学院汽车1999年和2001年的数据集,可以在加州理工学院计算视觉中心获得网站,由Pietro Perona创作并获得许可使用。每个图像包含一个或两个已标记的车辆实例。一个小的数据集对于探索YOLO v2训练过程很有用,但在实践中,需要更多标记的图像来训练健壮的检测器。解压缩车辆图像,加载车辆地面真实数据。

解压缩vehicleDatasetImages.zipdata =负载('车辆有绳索地球场。);vehicleDataset = data.vehicleDataset;

车辆数据存储在双列表中,第一列包含图像文件路径,第二列包含车辆边界框。

%显示第一个数据集的行。车辆达到(1:4,:)
ans =4×2表imageFilename车辆  _________________________________ ____________ {' vehicleImages / image_00001.jpg '}{1×4双}{' vehicleImages / image_00002.jpg '}{1×4双}{' vehicleImages / image_00003.jpg '}{1×4双}{' vehicleImages / image_00004.jpg '}{1×4双}
%将完整路径添加到本地车辆数据文件夹。vehicleDataset。vehicleDataset.imageFilename imageFilename = fullfile (pwd);

将数据集分解为训练集、验证集和测试集。选择60%的数据用于训练,10%用于验证,其余的用于测试训练过的检测器。

rng (0);shuffledIndices = randperm(高度(vehicleDataset));idx = floor(0.6 * length(shuffledIndices));trainingIdx = 1: idx;trainingDataTbl = vehicleDataset (shuffledIndices (trainingIdx):);validationIdx = idx+1: idx+1 + floor(0.1 * length(shuffledIndices));validationDataTbl = vehicleDataset (shuffledIndices (validationIdx):);testdx = validationIdx(end)+1: length(shuffledIndices);testDataTbl = vehicleDataset (shuffledIndices (testIdx):);

ImageageAtastore.boxLabelDatastore创建用于在培训和评估期间加载图像和标签数据的数据存储。

imdstrain = imagedataStore(trainingDatatbl {:,“imageFilename”});Bldstrain = boxlabeldataStore(trainingDatatbl(::,'车辆'));imdsValidation = imageDatastore (validationDataTbl {:,“imageFilename”});bldsvalidation = boxlabeldataStore(ValidationDatatbl(:,'车辆'));imdstest = imageageataStore(testDatatbl {::,“imageFilename”});bldsTest = boxLabelDatastore (testDataTbl (:,'车辆'));

结合图像和盒标签数据存储。

TrainingData =联合(IMDstrain,Bldstrain);ValidationData = Combine(IMDSValidation,BLDSvalidation);testdata =组合(IMDSTEST,BLDSTEST);

显示其中一个训练图像和框标签。

data =阅读(trainingData);我={1}数据;bbox ={2}数据;annotatedImage = insertShape(我'长方形',bbox);AnnotatedImage = IMResize(AnnotatedImage,2);数字imshow(AnnotatedImage)

创建YOLO v2对象检测网络

YOLO V2对象检测网络由两个子网组成。特征提取网络,后跟检测网络。特征提取网络通常是佩尔普雷雷达的CNN(有关详细信息,请参阅普里尔的深层神经网络)。此示例使用ResET-50进行功能提取。您还可以使用其他预磨损网络,如MobileNet V2或Reset-18,也可以根据应用要求使用。与特征提取网络相比,检测子网络是小CNN,并且由几个用于YOLO V2的卷积层和图层组成。

使用yolov2Layers(计算机视觉工具箱)功能,通过预先训练的ResNet-50特征提取网络,自动创建YOLO v2对象检测网络。yolov2Layers要求您指定几个参数化YOLO v2网络的输入:

  • 网络输入大小

  • 锚盒

  • 特征提取网络

首先,指定网络输入大小和类的数量。在选择网络输入尺寸时,考虑网络本身所需要的最小尺寸、训练图像的尺寸以及在所选尺寸下处理数据所需要的计算代价。在可行的情况下,选择一个与训练图像尺寸相近且大于网络所需输入尺寸的网络输入尺寸。为了减少运行示例的计算成本,指定一个网络输入大小[224 224 3],这是运行网络所需的最小大小。

inputSize = [224 224 3];

定义要检测的对象类的数量。

numClasses =宽度(vehicleDataset) 1;

请注意,在此示例中使用的训练图像大于224-by-224并且尺寸变化,因此您必须在训练前在预处理步骤中调整图像大小。

接下来,使用estimateAnchorBoxes(计算机视觉工具箱)根据培训数据中的对象大小来估算锚框。要考虑在培训之前调整图像的大小,调整培训数据的大小以估计锚盒。用转变对训练数据进行预处理,定义锚盒的数量并对锚盒进行估计。使用支持函数将训练数据调整为网络的输入图像大小金宝apppreprocessData

trainingDataForEstimation =变换(trainingData @(数据)preprocessData(数据、inputSize));numAnchors = 7;[anchorBoxes, meanIoU] = estimateAnchorBoxes(trainingdatafestimation, numAnchors)
anchorBoxes =7×2162 136 85 80 149 123 43 32 65 63 117 105 33 27
meanIoU = 0.8472

有关选择锚框的更多信息,请参见估算锚箱免于训练数据(计算机视觉工具箱)(计算机视觉工具箱™)和用于物体检测的锚盒(计算机视觉工具箱)

现在,使用Reset50加载预制Reset-50型号。

featureExtractionNetwork = resnet50;

选择“activation_40_relu”作为特征提取层,代替后的各层“activation_40_relu”使用检测子网。此特征提取层输出要按16倍的成像映射。该下采样量是空间分辨率与提取特征的强度之间的良好权衡,因为在网络中进一步提取的特征在网络中提取更强大的图像特征空间分辨率的成本。选择最佳特征提取层需要经验分析。

FeatureLayer =.“activation_40_relu”

创建YOLO v2对象检测网络

lgraph = yolov2layers(输入,numcrasses,anchorboxes,featureextractionnetwork,featureLayer);

您可以使用可视化网络analyzeNetwork或深度学习工具箱™的深网络设计师。

如果需要对YOLO v2网络架构进行更多的控制,可以使用“Deep network Designer”手工设计YOLO v2检测网络。有关更多信息,请参见设计YOLO v2检测网络(计算机视觉工具箱)

数据增加

数据增强用于通过在训练期间随机转换原始数据来提高网络精度。通过使用数据增强,您可以在不实际增加标记培训样本的数量的情况下为培训数据添加更多品种。

转变通过水平随机翻转图像和相关的框标签来增加训练数据。注意,数据扩充并不适用于测试和验证数据。理想情况下,测试和验证数据应该能够代表原始数据,并且不作任何修改,以便进行公正的评估。

augmentedTrainingData =变换(trainingData @augmentData);

多次读取同一图像并显示增强训练数据。

%可视化增强图像。augmentedData =细胞(4,1);k = 1:4数据=读取(AugmentedTrainingData);AugmentedData {K} = InsertShape(数据{1},'长方形',数据{2});重置(AugmentedTrainingData);结束图蒙太奇(Augmenteddata,'博德联络'10)

预处理培训数据

预处理增强培训数据,以及为培训做准备的验证数据。

preprocessedtrainingdata = transform(augmentedtrainingdata,@(data)preprocessdata(数据,inputsize));preprocessedvalidationdata = transform(validationdata,@(data)preprocessdata(数据,inputsize));

读取预处理后的训练数据。

数据=读取(preprocessedtrainingdata);

显示图像和边界框。

我={1}数据;bbox ={2}数据;annotatedImage = insertShape(我'长方形',bbox);AnnotatedImage = IMResize(AnnotatedImage,2);数字imshow(AnnotatedImage)

火车YOLO v2对象检测器

培训选项指定网络培训选项。集'vightationdata'到预处理的验证数据。集'checkpoinspath'到一个临时的地方。这使得在训练过程中能够保存部分训练过的检测器。如果培训被中断,例如断电或系统故障,您可以从保存的检查点恢复培训。

选项=培训选项(“个”...“MiniBatchSize”, 16岁,...'italllearnrate',1e-3,...'maxepochs',20,...'checkpoinspath',Tempdir,...'vightationdata', preprocessedValidationData);

trainYOLOv2ObjectDetector(计算机视觉工具箱)函数培训YOLO V2对象探测器如果doTraining是真的。否则,加载佩带的网络。

如果doTraining%训练YOLO V2探测器。[探测器,信息] = trainyolov2objectdetector(预处理司令部,3返术,选项);别的%负载预训练检测器为例。pretry = load('yolov2resnet50vehiceexample_19b.mat');探测器= pretrained.detector;结束

此示例在NVIDIA™Titan X GPU上验证了12 GB内存。如果您的GPU内存较少,则可能会耗尽内存。如果发生这种情况,降低了“MiniBatchSize”使用培训选项函数。使用这个设置培训这个网络大约花了7分钟。训练时间取决于你使用的硬件。

作为快速测试,在测试图像上运行检测器。确保将图像调整为与培训图像相同的大小。

我= imread (“highway.png”);我= imresize(我inputSize (1:2));[bboxes,分数]=检测(探测器,I);

显示结果。

我= insertObjectAnnotation (,'长方形'bboxes,分数);图imshow(我)

使用测试集评估检测器

评估训练的目标检测器在一组大的图像,以衡量性能。计算机视觉工具箱™提供对象检测器评估功能,以测量常见的指标,如平均精度(evaluateDetectionPrecision)和日志平均遗漏率(评估法律)。对于此示例,请使用平均精度度量来评估性能。平均精度提供单个数字,其中包含检测器进行正确分类(精度)和检测器找到所有相关对象(召回)的能力。

将与训练数据的测试数据应用相同的预处理变换。请注意,数据增强不适用于测试数据。测试数据应代表原始数据,并未被修改以进行无偏见的评估。

preprocessedTestData =变换(testData @(数据)preprocessData(数据、inputSize));

在所有测试图像上运行检测器。

检测=检测(探测器,预处理达特塔数据);

评估对象探测器使用平均精度度量。

[ap,recall,precision] = evaluateDetectionPrecision(detectionResults, preprocesedtestdata);

精度/召回(PR)曲线强调了探测器在不同召回级别上的精确程度。在所有召回级别上,理想的精度为1。使用更多的数据可以帮助提高平均精度,但可能需要更多的训练时间。绘制PR曲线。

图绘制(召回、精密)包含('记起')ylabel(“精度”网格)标题(sprintf ('平均precision =%.2f',ap))

代码生成

检测器培训并评估后,您可以为此生成代码yolov2ObjectDetector使用GPU编码器™。看使用YOLO v2生成对象检测的代码(GPU编码器)有关更多详细信息的示例。

金宝app支持功能

功能B = augmentData (A)%应用随机水平翻转和随机X/Y缩放。盒子,如果重叠高于0.25,则剪切界限的%缩放。还,抖动图像颜色。b =单元格(大小(a));我=一个{1};sz =尺寸(i);如果numel(sz)== 3 && sz(3)== 3 i = jittercolorhsv(i,...'对比', 0.2,...“颜色”0,...“饱和”, 0.1,...'亮度', 0.2);结束%随机翻转和缩放图像。tform = randomAffine2d ('Xreflection',真的,'规模',[1 1.1]);rut = AffineOutputView(SZ,TForm,“BoundsStyle”“CenterOutput”);b {1} = imwarp(i,tform,“OutputView”,溃败);如果需要,%清理框数据{2} = allersanitizedboxes(a {2},sz);对方框应用相同的转换。[B{2},指数]= bboxwarp ({2}, tform溃败,'重叠阈值', 0.25);B{3} ={3}(指标);%仅当所有的框被扭曲时返回原始数据。如果isempty(索引)b = a;结束结束功能targetSize data = preprocessData(数据)%调整图像和包围框的大小为targetSize。Sz = size(data{1},[1 2]);规模= targetSize(1:2)。/深圳;{1} = imresize数据(数据{1},targetSize (1:2));如果需要,%清理框数据数据{2} = allersanitizedboxes(数据{2},sz);将方框大小调整为新的图像大小。{2} = bboxresize数据(数据{2},规模);结束

参考

雷蒙德,约瑟夫和阿里·法哈迪。“YOLO9000:更好、更快、更强。”在2017 IEEE计算机视觉与模式识别大会(CVPR), 6517 - 25所示。火奴鲁鲁,HI: IEEE, 2017。https://doi.org/10.1109/CVPR.2017.690。