交通标志的检测和识别

这个例子显示了如何为交通标志检测与识别应用程序,使用深度学习MEXCUDA®代码。交通标志检测与识别是驾驶员辅助系统的一个重要应用,协助和大约路标驾驶员提供信息。

在这个交通标志检测与识别例如您执行三个步骤 - 检测,非最大抑制(NMS),和认可。首先,例如通过使用对象检测网络是你只看一次(永乐)网络的变体检测输入图像上的交通标志。然后,重叠检测通过使用NMS算法抑制。最后,识别网络分类检测到的交通标志。

先决条件

  • CUDA使NVIDIA®GPU具有3.2或更高的计算能力。

  • 英伟达CUDA工具包和驱动程序。

  • 英伟达cuDNN图书馆。

  • 编译器和库的环境变量。有关编译器和库的支持版本的信息,请参见万博1manbetx第三方产品s manbetx 845。有关设置环境变量的内容,请参见设置先决产品s manbetx 845

  • GPU编码器接口,深度学习库支持包。万博1manbetx要安装此支持包,请使用万博1manbetx加载项资源管理器

验证GPU环境

使用coder.checkGpuInstall函数来验证运行此示例所需的编译器和库是否已正确设置。

envCfg = coder.gpuEnvConfig (“主机”);envCfg。DeepLibTarget =“cudnn”;envCfg。DeepCodegen = 1;envCfg。安静= 1;coder.checkGpuInstall (envCfg);

检测与识别网络

检测网络在Darknet框架中进行训练,并导入MATLAB®进行推理。由于交通标志的大小相对于图像较小,并且训练数据中每类的训练样本较少,因此我们将所有的交通标志作为一个单一的类来训练检测网络。

检测网络将输入图像分割成一个7乘7的网格。如果交通标志的中心位于网格单元内,则每个网格单元检测一个交通标志。每个单元格预测两个边界框和这些边界框的置信值。置信度分数表示框中是否包含对象。每个单元预测在网格单元中找到交通标志的概率。最后的分数是前面分数的乘积。您可以对这个最终分数应用0.2的阈值来选择检测结果。

识别网络上通过使用MATLAB相同的图像训练。

trainRecognitionnet.m辅助脚本显示识别网络训练。

获取预训练SeriesNetwork

下载检测和识别网络。

getTsdr ();

检测网络共有58层,包括卷积层、漏泄层和全连接层。

加载('yolo_tsr.mat');yolo.Layers
ANS = 58x1层阵列层:1 '输入' 图像输入448x448x3图像2 'CONV1' 卷积64个7x7x3卷积与步幅[2 2]和填充[3 3 3 3 3 'relu1' 漏RELU漏RELU带刻度0.1 4'POOL1' 最大池2x2的最大蓄留与步幅[2 2]和填充[0 0 0 0]的5 'CONV2' 卷积192个3x3x64卷积步幅[1 1]和填充[1 1 1 1] 6 'relu2' 漏RELU漏泄RELU带刻度0.1 7 'POOL2' 最大池2x2的最大蓄留与步幅[2 2]和填充[0 0 0 0] 8 'conv3' 卷积128个1x1x192卷积步幅[1 1]和填充[0 0 0 0]9 'relu3' 漏RELU漏RELU带刻度0.1 10 'CONV4' 卷积256个3x3x128卷积步幅[1 1]和填充[1 1 1 1] 11 'relu4' 漏RELU漏RELU带刻度0.1 12 'conv5' 卷积2561x1x256卷积步幅[1 1]和填充[0 0 0 0] 13 'relu5' 漏RELU漏RELU带刻度0.1 14 'conv6' 卷积512个3x3x256卷积步幅[1 1]和填充[1 1 1 1] 15'relu6'漏泄RELU漏泄RELU与步幅[2 2]和填充比例0.1 16 'pool6' 最大池2x2的最大蓄留[0 0 0 0] 17 'conv7' 卷积256个1x1x512卷积步幅[1 1]和填充[0 0 00] 18 'relu7' 漏RELU漏RELU带刻度0.1 19 'conv8' 卷积512个3x3x256卷积步幅[1 1]和填充[1 1 1 1] 20 'relu8' 漏RELU漏RELU带刻度0.1 21 'conv9'卷积256 1x1x512卷积步幅[1 1]和填充[0 0 0 0] 22 'relu9' 漏RELU漏RELU带刻度0.1 23 'conv10' 卷积512个3x3x256卷积步幅[1 1]和填充[1 1 1 1] 24 'relu10' 漏RELU漏RELU带刻度0.1 25 'conv11' 卷积256个1x1x512卷积步幅[1 1]和填充[0 0 0 0] 26 'relu11' 漏RELU漏RELU带刻度0.1 27 'conv12' 卷积512个3x3x256卷积步幅[1 1]和填充[1 1 1 1] 28 'relu12' 漏RELU漏RELU带刻度0.1 29 'conv13' 卷积256个1x1x512卷积与步幅[1 1] and padding [0 0 0 0] 30 'relu13' Leaky ReLU Leaky ReLU with scale 0.1 31 'conv14' Convolution 512 3x3x256 convolutions with stride [1 1] and padding [1 1 1 1] 32 'relu14' Leaky ReLU Leaky ReLU with scale 0.1 33 'conv15' Convolution 512 1x1x512 convolutions with stride [1 1] and padding [0 0 0 0] 34 'relu15' Leaky ReLU Leaky ReLU with scale 0.1 35 'conv16' Convolution 1024 3x3x512 convolutions with stride [1 1] and padding [1 1 1 1] 36 'relu16' Leaky ReLU Leaky ReLU with scale 0.1 37 'pool16' Max Pooling 2x2 max pooling with stride [2 2] and padding [0 0 0 0] 38 'conv17' Convolution 512 1x1x1024 convolutions with stride [1 1] and padding [0 0 0 0] 39 'relu17' Leaky ReLU Leaky ReLU with scale 0.1 40 'conv18' Convolution 1024 3x3x512 convolutions with stride [1 1] and padding [1 1 1 1] 41 'relu18' Leaky ReLU Leaky ReLU with scale 0.1 42 'conv19' Convolution 512 1x1x1024 convolutions with stride [1 1] and padding [0 0 0 0] 43 'relu19' Leaky ReLU Leaky ReLU with scale 0.1 44 'conv20' Convolution 1024 3x3x512 convolutions with stride [1 1] and padding [1 1 1 1] 45 'relu20' Leaky ReLU Leaky ReLU with scale 0.1 46 'conv21' Convolution 1024 3x3x1024 convolutions with stride [1 1] and padding [1 1 1 1] 47 'relu21' Leaky ReLU Leaky ReLU with scale 0.1 48 'conv22' Convolution 1024 3x3x1024 convolutions with stride [2 2] and padding [1 1 1 1] 49 'relu22' Leaky ReLU Leaky ReLU with scale 0.1 50 'conv23' Convolution 1024 3x3x1024 convolutions with stride [1 1] and padding [1 1 1 1] 51 'relu23' Leaky ReLU Leaky ReLU with scale 0.1 52 'conv24' Convolution 1024 3x3x1024 convolutions with stride [1 1] and padding [1 1 1 1] 53 'relu24' Leaky ReLU Leaky ReLU with scale 0.1 54 'fc25' Fully Connected 4096 fully connected layer 55 'relu25' Leaky ReLU Leaky ReLU with scale 0.1 56 'fc26' Fully Connected 539 fully connected layer 57 'softmax' Softmax softmax 58 'classoutput' Classification Output crossentropyex with '1' and 538 other classes

识别网络共有14层,包括卷积层、全连通层和分类输出层。

加载('RecognitionNet.mat');convnet.Layers
ans = 14x1具有层的层数组:1 48 x48x3 imageinput的图像输入图像与zerocenter正常化和‘randfliplr扩增100 7 x7x3 conv_1的卷积运算与步幅[1]和填充[0 0 0 0]3‘relu_1 ReLU ReLU 4“maxpool_1”马克斯池2 x2马克斯池步(2 - 2)和填充[0 0 0 0]5 conv_2卷积150 4 x4x100旋转步[1]和填充[0 0 0 0]6‘relu_2 ReLU ReLU 7“maxpool_2”马克斯池2 x2马克斯池步(2 - 2)和填充[0 0 0 0]8“conv_3”卷积250 4 x4x150旋转步[1]和填充[0 0 0 0]9“maxpool_3”马克斯池2 x2马克斯池步(2 - 2)和填充[0 0 0 0]10“fc_1”完全连接300完全连接层11“辍学”辍学90%辍学12“fc_2”完全连接35完全连接层13的softmax softmax softmax 14“classoutput”分类输出crossentropyex ' 0 '和34个其他类

tsdr_predict入口点函数

tsdr_predict.m入口点函数拍摄图像输入,并通过使用检测网络检测图像中的交通标志。功能抑制重叠检测(NMS)通过使用selectStrongestBbox利用识别网络对交通标志进行识别。函数加载网络对象yolo_tsr.mat到永久变量detectionnetRecognitionNet.mat到永久变量recognitionnet。功能重用在后续调用持久对象。

类型('tsdr_predict.m'
函数[selectedBbox,IDX] = tsdr_predict(IMG)%#代码生成%该函数检测使用探测网%(YOLO的修改后的版本)中的图像中的交通标志和识别(进行分类),使用识别网络%%输入:%%IM:输入测试图像%%输出:%%selectedBbox:检测边界框%IDX:通讯阶级%版权所有2017年至2020年MathWorks公司coder.gpu.kernelfun;%调整图像的大小img_rz = imresize(IMG,[448448]);%转换成BGR格式img_rz = img_rz(:,:,3:1:1);img_rz = im2single(img_rz);%% TSD持久detectionnet;如果的isEmpty(detectionnet)detectionnet = coder.loadDeepLearningNetwork( 'yolo_tsr.mat', '检测');端的预测= detectionnet.activations(img_rz,56, 'OutputAs', '通道');%%转换预测,以边界框属性类= 1;NUM = 2; side = 7; thresh = 0.2; [h,w,~] = size(img); boxes = single(zeros(0,4)); probs = single(zeros(0,1)); for i = 0:(side*side)-1 for n = 0:num-1 p_index = side*side*classes + i*num + n + 1; scale = predictions(p_index); prob = zeros(1,classes+1); for j = 0:classes class_index = i*classes + 1; tempProb = scale*predictions(class_index+j); if tempProb > thresh row = floor(i / side); col = mod(i,side); box_index = side*side*(classes + num) + (i*num + n)*4 + 1; bxX = (predictions(box_index + 0) + col) / side; bxY = (predictions(box_index + 1) + row) / side; bxW = (predictions(box_index + 2)^2); bxH = (predictions(box_index + 3)^2); prob(j+1) = tempProb; probs = [probs;tempProb]; boxX = (bxX-bxW/2)*w+1; boxY = (bxY-bxH/2)*h+1; boxW = bxW*w; boxH = bxH*h; boxes = [boxes; boxX,boxY,boxW,boxH]; end end end end %% Run Non-Maximal Suppression on the detected bounding boxess coder.varsize('selectedBbox',[98, 4],[1 0]); [selectedBbox,~] = selectStrongestBbox(round(boxes),probs); %% Recognition persistent recognitionnet; if isempty(recognitionnet) recognitionnet = coder.loadDeepLearningNetwork('RecognitionNet.mat','Recognition'); end idx = zeros(size(selectedBbox,1),1); inpImg = coder.nullcopy(zeros(48,48,3,size(selectedBbox,1))); for i = 1:size(selectedBbox,1) ymin = selectedBbox(i,2); ymax = ymin+selectedBbox(i,4); xmin = selectedBbox(i,1); xmax = xmin+selectedBbox(i,3); % Resize Image inpImg(:,:,:,i) = imresize(img(ymin:ymax,xmin:xmax,:),[48,48]); end for i = 1:size(selectedBbox,1) output = recognitionnet.predict(inpImg(:,:,:,i)); [~,idx(i)]=max(output); end

生成CUDA MEXtsdr_predict函数

创建一个MEX目标一个GPU配置对象,并设置目标语言为C ++。使用coder.DeepLearningConfig创建一个CuDNN深学习配置对象,并将其分配给DeepLearningConfig属性的GPU代码配置对象。制作CUDA MEX,使用代码生成命令,并指定输入大小为[480,704,3]。属性的输入图像大小对应tsdr_predict函数。

CFG = coder.gpuConfig(墨西哥人的);cfg.TargetLang ='C ++';cfg。DeepLearningConfig = coder.DeepLearningConfig (“cudnn”);代码生成-configCFGtsdr_predict-args{酮(480,704,3, 'UINT8')}报告
代码生成成功:打开('codegen/mex/tsdr_predict/html/report.mldatx')查看报告。

若要使用TensorRT生成代码,请传递coder.DeepLearningConfig( 'tensorrt')作为一个选项,以编码器的配置对象,而不是“cudnn”

运行生成的墨西哥人

加载一个输入图像。

IM = imread(“stop.jpg”);imshow (im);

呼叫tsdr_predict_mex输入图像。

(im, [480,704]);[bboxes、类]= tsdr_predict_mex (im);

将类号映射到类字典中的交通标志名称。

一会= {“addedLane”“慢”“下降”“speedLimit25”“speedLimit35”“speedLimit40”'speedLimit45'...“speedLimit50”'speedLimit55'“speedLimit65”“speedLimitUrdbl”'禁止通过'“十字路口”...'靠右'“laneEnds”“合并”“noLeftTurn”'不可右转'“停止”“pedestrianCrossing”...“stopAhead”'rampSpeedAdvisory20''rampSpeedAdvisory45'“truckSpeedLimit55”...“rampSpeedAdvisory50”'转左'“rampSpeedAdvisoryUrdbl”“turnRight”“rightLaneMustTurn”...“收益”“yieldAhead”“学校”'schoolSpeedLimit25''zoneAhead45'“signalAhead”};classRec =类名(类);

显示检测到的交通标志。

outputImage = insertShape(1M,“矩形”bboxes,“线宽”3);1:size(bboxes,1) outputImage = insertText(outputImage,[bboxes(i,1)+bboxes(i,3) bboxes(i,2)-20],“字形大小”20,'TEXTCOLOR''红');结束imshow(outputImage);

交通标志的检测和识别视频

包含的帮助文件tsdr_testVideo.m从测试视频中抓取帧,进行交通标志检测和识别,并将结果绘制在测试视频的每一帧上。

%输入video v = VideoReader('stop.avi');fps = 0;
而hasFrame(V)%以一个帧图象= readFrame(V);图片= imresize(图片,[920,1632]);%调用MEX函数交通标志检测与识别抽动;[bboxes,clases] = tsdr_predict_mex(图片);螈= TOC;
%FPS FPS = 0.9 * FPS + 0.1 *(1 /蝾螈);
%显示
displayDetections(图画、bboxes一堂课,fps);结束

清除加载到内存中的静态网络对象。

清晰的墨西哥人;

另请参阅

||||

相关的话题