主要内容

培训对象探测器实验管理器

这个例子展示了如何使用实验管理器应用程序找到最佳的培训对象的选择探测器通过席卷一系列hyperparameter值。

概述

实验管理器应用程序使您能够创建深度学习实验训练对象探测器在多个初始条件和比较结果。在这个例子中,您将使用实验管理器应用程序训练YOLO v2意思对象检测器来检测车辆的交通图像。你会扫number-of-anchors和不同的选择特征提取层探测器获得表现最好的对象。实验管理器训练对象探测器使用的每个组合hyperparameter hyperparameter表中指定的值。请注意,在这个实验中您将运行试验在不同的值numAnchorsfeatureLayer为了简单起见。找到最优对象探测器,指定实验试验席卷额外hyperparameters学习速率等mini-batch大小,和图像的大小。

关于实验管理器的更多信息见,实验管理器(深度学习工具箱)

开放实验

首先,打开示例。用自定义对象探测器实验管理器加载项目实验,你可以检查和运行。

Hyperparameter部分允许您设置hyperparameters您希望扫描结束。

训练函数部分允许您指定一个自定义训练脚本用于实验。这个示例使用vehicleDetectorExperiment函数加载数据、模型和执行培训。在这一节将描述脚本的细节。完整的函数列在支持功能部分。金宝app

加载数据中使用效用函数splitVehicleData。这个例子使用一个小型车辆的数据集,其中包含295张图片。这些图片来自加州理工学院的汽车1999年和2001年的数据集,可以在加州理工学院计算视觉网站,由Pietro Perona一起,经允许使用。每个图像都包含一个或两个标签的实例。

输出。trainedNet = [];输出。美联社= [];输出。executionEnvironment =“汽车”;班长。信息=“AveragePrecision”;[trainingData, validationData testData] = splitVehicleData;

应用对应和训练数据集预处理。仅供验证和测试数据集预处理是必要的。

inputSize = (224 - 224);augmentedTrainingData =变换(trainingData @augmentData);preprocessedTrainingData =变换(augmentedTrainingData @(数据)preprocessData(数据、inputSize));preprocessedValidationData =变换(validationData @(数据)preprocessData(数据、inputSize));preprocessedTestData =变换(testData @(数据)preprocessData(数据、inputSize));

对于本例,您将扫锚箱的数量进行训练。锚箱对象检测定义捕捉特定对象类的规模和长宽比你想检测和基于对象的大小通常选择训练数据集。多个锚箱使对象检测器来检测不同大小的对象。形状、规模和数量的锚箱影响探测器的效率和准确性。大量的锚箱减少探测器的运行时性能。的estimateAnchorBoxes函数使用hyperparameter (params.numAnchors)通过实验管理器在每次试验。这改变锚箱的数量估计在每个试验。锚盒子估计看到的更多信息,从训练数据估计锚箱

aboxes = estimateAnchorBoxes (preprocessedTrainingData params.numAnchors);

设置培训选项。

选择= trainingOptions (“rmsprop”……InitialLearnRate = 0.001,……MiniBatchSize = 16,…MaxEpochs = 20,……LearnRateSchedule =“分段”,…LearnRateDropPeriod = 5,……VerboseFrequency = 30,……L2Regularization = 0.001,……ValidationData = preprocessedValidationData,…ValidationFrequency = 50);

创建一个YOLOv2对象探测器使用yolov2LayersResnet50骨干。对于本例,您将席卷在不同特征提取层。不同特征提取层对应于不同数量的将采样。有一个良好的空间分辨率之间的权衡和提取的强度特性,为特征提取在网络编码更强的图像特征空间分辨率为代价的。集featureLayerparams.featureLayer接受实验的输入管理器。你可以想象网络来识别不同功能层使用analyzeNetwork从深度学习Toolbox&trade或D | eepNetworkDesigner |。

numClasses = 1;inputSize = (224 224 3);网络= resnet50 ();featureLayer = params.featureLayer;lgraph = yolov2Layers (inputSize numClasses aboxes,网络,featureLayer);

网络将被训练使用trainYOLOv2ObjectDetector函数与ExperimentMonitor名称-值对集合监控。设置这个名称值对允许教练给培训统计实验定期监测。

探测器= trainYOLOv2ObjectDetector (preprocessedTrainingData, lgraph,…选择,ExperimentMonitor =监控);

评估培训对象探测器在设定的验证计算精度平均分数。精度是真阳性的比率实例中的一切积极的实例对象探测器,基于地面真理。

结果=检测(探测器,preprocessedTestData MiniBatchSize = 4);[据美联社,~,~]= evaluateDetectionPrecision(结果,preprocessedTestData);

更新实验管理器和包的平均精度指标训练检测器和平均精度分数到输出结构。

updateInfo(监视、AveragePrecision =美联社);输出。trainedNet =探测器;输出。美联社=美联社;

运行实验

单击Run按钮实验管理器上的将来发布开始训练试验。

当您运行实验,实验经理列车网络的训练函数定义的六次。每个试验使用一个独特的组合numAnchorsfeatureLayerhyperparameter中指定的表。默认情况下,实验管理器运行一个审判。如果你有并行计算Toolbox&trade,你可以同时运行多个试验。为达到最佳效果,在你运行你的实验,开始与尽可能多的工人gpu并行池。

一个表为每个审判结果显示培训损失。

导出的结果

出口最训练有素探测器工作区:

  • 选择试验得分最低的损失。

  • 在实验管理器将来发布,点击出口。

  • 在对话框窗口中,输入导出的培训工作空间变量的名称输出。默认的名字叫trainingOutput。

可视化的结果训练检测器通过调用runDetectorOnTestImage函数。

runDetectorOnTestImage (trainingOutput)

附录1:培训功能

vehicleDetectorExperiment函数指定了训练数据、网络架构、培训方案和培训过程中使用的实验。

这个函数接受两个参数,

  • 参数个数从实验管理器是一个结构字段hyperparameter表。

  • 监控是一个experiments.Monitor(深度学习工具箱)对象,您可以使用它来跟踪培训的进展,在结果表中更新信息字段,记录值的指标使用的培训,和生产培训的阴谋。

这个函数的输出是一个结构体,其中包含检测器训练网络,执行环境,平均精度指标训练网络。实验管理器保存此输出,所以你可以出口到MATLAB工作区当培训完成。

函数输出= trainObjectDetectorExpMgr(参数、监控)输出。trainedNet = [];输出。美联社= [];输出。executionEnvironment =“汽车”;% AveragePrecision字段添加到实验管理器。班长。信息=“AveragePrecision”;%加载数据并把它分割为训练,验证集和测试集[trainingData, validationData testData] = splitVehicleData;%增加和预处理数据inputSize = (224 - 224);augmentedTrainingData =变换(trainingData @augmentData);preprocessedTrainingData =变换(augmentedTrainingData @(数据)preprocessData(数据、inputSize));preprocessedValidationData =变换(validationData @(数据)preprocessData(数据、inputSize));preprocessedTestData =变换(testData @(数据)preprocessData(数据、inputSize));%设置培训选项选择= trainingOptions (“rmsprop”,InitialLearnRate = 0.001,MiniBatchSize = 16,MaxEpochs = 20,LearnRateSchedule =“分段”,LearnRateDropPeriod = 5,VerboseFrequency = 30,L2Regularization = 0.001,ValidationData = preprocessedValidationData,ValidationFrequency = 50);%构造YOLO v2意思探测器numClasses = 1;inputSize = (224 224 3);网络= resnet50 ();featureLayer = params.featureLayer;%估计锚箱通过numAnchors参数从实验管理器aboxes = estimateAnchorBoxes (preprocessedTrainingData params.numAnchors);lgraph = yolov2Layers (inputSize numClasses aboxes,网络,featureLayer);%火车YOLOv2探测器[探测器,信息]= trainYOLOv2ObjectDetector (preprocessedTrainingData lgraph,选择,ExperimentMonitor =监控);%捕获精度平均结果的输出结果=检测(探测器,preprocessedTestData MiniBatchSize = 4);[据美联社,~,~]= evaluateDetectionPrecision(结果,preprocessedTestData);updateInfo(监视、AveragePrecision =美联社);输出。trainedNet =探测器;输出。美联社=美联社;output.info =信息;结束

附录2:数据预处理功能

augmentData函数

augmentData函数返回增强图像进行训练。

函数B = augmentData (A)%应用随机水平翻转,和随机的X / Y缩放。盒子,%比例范围以外剪如果重叠高于0.25。同时,%抖动图像颜色。B =细胞(大小(A));我= {1};深圳=大小(I);如果元素个数(深圳)= = 3 & &深圳(3)= = 3 = jitterColorHSV(我,我对比= 0.2,颜色= 0,饱和= 0.1,亮度= 0.2);结束%随机图像翻转和规模。tform = randomAffine2d (XReflection = true,规模= 1.1 [1]);溃败= affineOutputView(深圳、tform BoundsStyle =“CenterOutput”);B {1} = imwarp(我tform OutputView =溃败);%清洁箱数据,如果需要的话。{2}= helperSanitizeBoxes ({2}, sz);%应用相同的转换盒。[B{2},指数]= bboxwarp ({2}, tform溃败,OverlapThreshold = 0.25);B{3} ={3}(指标);%返回原始数据只有当所有盒子都被扭曲。如果isempty(指数)B =;结束结束

preprocessData函数

preprocessData函数重新调节根据目标图像和边界框的大小。

函数targetSize data = preprocessData(数据)% targetSize调整图像和边界框。深圳=大小(数据{1}、(1 2));规模= targetSize(1:2)。/深圳;{1}= imresize数据(数据{1},targetSize (1:2));%清洁箱数据,如果需要的话。{2}= helperSanitizeBoxes数据(数据{2},sz);%调整框新的图像大小。{2}= bboxresize数据(数据{2},规模);结束
% helperSanitizeBoxes清洁箱数据。%这个例子辅助用于清理无效边界框的数据。盒子%删除值< = 0。%%如果没有一个箱子是有效的,该函数将数据传递到%使下游加工问题的错误。函数盒= helperSanitizeBoxes(盒、~)持续的hasInvalidBoxes有效=(框> 0,2);如果任何(有效)如果~所有的(有效的)& & isempty (hasInvalidBoxes)%的问题一次性警告删除无效的盒子。hasInvalidBoxes = true;警告(“消除地面实况bouding框数据值< = 0。)结束盒=盒(有效,:);结束结束

附录3:数据加载函数

splitVehicleData函数加载数据,并将其分为训练、验证和测试数据存储。

函数[dsTrain, dsVal, dst) = splitVehicleData () outputDir = fullfile (tempdir,“vehicleImages”);如果~存在(outputDir“dir”)%解压图像和加载标记解压缩(“vehicleDatasetImages.zip”fullfile (tempdir));结束data =负载(“vehicleDatasetGroundTruth.mat”);vehicleDataset = data.vehicleDataset;%载入图像文件的列表vehicleDataset。imageFilename = fullfile (tempdir vehicleDataset.imageFilename);rng (0);shuffledIndices = randperm(高度(vehicleDataset));地板idx =(0.6 *长度(shuffledIndices));%创建一个训练、验证和测试指标trainingIdx = 1: idx;validationIdx = idx + 1: idx + 1 +地板(0.1 *长度(shuffledIndices));testIdx = validationIdx(结束)+ 1:长度(shuffledIndices);%使用imageDatastore和boxLabelDatastore加载数据imd = imageDatastore (vehicleDataset {:,“imageFilename”});建筑物= boxLabelDatastore (vehicleDataset (:,“汽车”));allData =结合(imd,建筑物);dsTrain =子集(allData trainingIdx);dsVal =子集(allData validationIdx);dst =子集(allData testIdx);结束

引用

[1]Redmon,约瑟夫和阿里蒂。“YOLO9000:更好、更快、更强”。In 2017 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 6517-25. Honolulu, HI: IEEE, 2017.https://doi.org/10.1109/CVPR.2017.690

版权2021年MathWorks公司。