主要内容

行人检测

这个例子展示了使用深度学习的行人检测应用程序的代码生成。行人检测是计算机视觉中的一个关键问题。行人检测技术在自动驾驶、监控、机器人等领域有着广泛的应用。

先决条件

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

  • NVIDIA CUDA工具包和驱动程序。

  • 英伟达cuDNN。

  • 编译器和库的环境变量。有关编译器和库支持的版本的信息,请参见万博1manbetx第三方硬件(GPU编码器).有关设置环境变量,请参见设置前提产品s manbetx 845(GPU编码器)

  • GPU编码器接口深度学习库支持包。万博1manbetx要安装此支持包,请使用万博1manbetx扩展浏览器

验证GPU环境

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

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

行人检测网络

行人检测网络采用行人图像和非行人图像进行训练。该网络是在MATLAB®中使用trainPedNet.m辅助脚本。滑动窗口从大小的图像中获取作物斑块[64 32]。Patch维数由热图获得,热图表示数据集中图像中行人的分布情况。它显示了图像中不同规模和位置的行人的存在。在这个例子中,靠近相机的行人被裁剪和处理。对得到的斑块进行非最大抑制(Non-Maximal Suppression, NMS),对斑块进行合并,检测出完整的行人。

行人检测网络包含12层,包括卷积层、全连接层和分类输出层。

负载(“PedNet.mat”);PedNet。层
ans = 12x1 Layer array with layers:64 x32x3 imageinput的图像输入图像2”zerocenter“正常化”conv_1卷积20 5 x5x3旋转步[1]和填充[0 0 0 0]3‘relu_1 ReLU ReLU 4“maxpool_1”马克斯池2 x2马克斯池步(2 - 2)和填充[0 0 0 0]5 crossnorm的横通道正常化横通道规范化5频道每个元素6‘conv_2卷积20 5 x5x20旋转步[1]和填充[0 0 0 0]7‘relu_2 ReLU ReLU 8“maxpool_2”马克斯池2 x2 Max池步(2 - 2)和填充[0 0 0 0]9“fc_1”完全连接512完全连接层10“fc_2”完全连接2完全连接层11的softmax softmax softmax 12“classoutput”具有类'NonPed'和'Ped'的输出交联

pedDetect_predict入口点函数

pedDetect_predict.m入口点函数以图像为输入,利用存储在的深度学习网络对图像进行预测PedNet.mat文件。函数从PedNet.mat文件到持久变量中pednet.然后函数在后续调用中重用持久对象。

类型(“pedDetect_predict.m”
版权所有2017-2019 The MathWorks, Inc. codefun;持久pednet;if isempty(pednet) pednet = coder.loadDeepLearningNetwork(coder.const(' pednet .mat'),'行人检测');end [imgHt, imgWd, ~] = size(img);VrHt = [imgHt - 30, imgHt];% patchHt和patchWd是从热图中得到的(这里的热图是指%行人数据,以不同的%颜色的地图形式表示。不同的颜色表示在不同的百分比范围内存在行人)。patchHt = 300;patchWd = patchHt / 3;% PatchCount用于估计每个图像的补丁数PatchCount = ((imgWd - patchWd)/20) + 2; maxPatchCount = PatchCount * 2; Itmp = zeros(64 , 32 , 3 , maxPatchCount); ltMin = zeros(maxPatchCount); lttop = zeros(maxPatchCount); idx = 1; % To count number of image patches obtained from sliding window cnt = 1; % To count number of patches predicted as pedestrians bbox = zeros(maxPatchCount , 4); value = zeros(maxPatchCount , 1); %% Region proposal for two bands for VrStride = 1 : 2 for HrStride = 1 : 20 : (imgWd - 60) % Obtain horizontal patches with stride 20. ltMin(idx) = HrStride + 1; rtMax = min(ltMin(idx) + patchWd , imgWd); lttop(idx) = (VrHt(VrStride) - patchHt); It = img(lttop(idx): VrHt(VrStride) , ltMin(idx) : rtMax , :); Itmp(:,:,:,idx) = imresize(It,[64,32]); idx = idx + 1; end end for j = 1 : size (Itmp,4) score = pednet.predict(Itmp(:,:,:,j)); % Classify ROI % accuracy of detected box should be greater than 0.90 if (score(1,2) > 0.80) bbox(cnt,:) = [ltMin(j),lttop(j), patchWd , patchHt]; value(cnt,:) = score(1,2); cnt = cnt + 1; end end %% NMS to merge similar boxes if ~isempty(bbox) [selectedBbox,~] = selectStrongestBbox(bbox(1:cnt-1,:),... value(1:cnt-1,:),'OverlapThreshold',0.002); end

生成CUDA MEXpedDetect_predict函数

为MEX目标创建一个GPU Configuration对象,并设置目标语言为c++。使用编码器。DeepLearningConfig(GPU编码器)函数创建CuDNN的深度学习配置对象,并将其分配给DeepLearningConfig图形处理器代码配置对象的属性。要生成CUDA MEX,使用codegen命令并指定输入图像的大小。该值对应行人检测网络的输入层大小。

加载一个输入图像。我= imread (“test.jpg”);[480640] im = imresize (im);cfg = coder.gpuConfig (墨西哥人的);cfg。TargetLang =“c++”;cfg。DeepLearningConfig =编码器。DeepLearningConfig (“cudnn”);codegen配置cfgpedDetect_predictarg游戏{我}报告
代码生成成功:要查看报告,打开('codegen/mex/pedDetect_predict/html/report.mldatx')。

运行生成的墨西哥人

调用pednet_predict_mex在输入图像上。

imshow (im);ped_bboxes = pedDetect_predict_mex (im);

展示最后的预测。

outputImage = insertShape (im,“矩形”ped_bboxes,“线宽”3);imshow (outputImage);

视频上的分类

包含的帮助文件pedDetect_predict.m从视频中抓取帧,执行预测,并在每个捕获的视频帧上显示分类结果。

v = VideoReader(“LiveData.avi”);fps = 0;while hasFrame(v) %从视频读取帧im = readFrame(v);[480640] im = imresize (im);
% Call MEX功能,用于pednet预测tic;ped_bboxes = pedDetect_predict_mex (im);纽特= toc;
% FPS = .9* FPS + .1*(1/newt);
% display outputImage = insertShape(im,'矩形',ped_bboxes,'LineWidth',3); / /显示矩形imshow (outputImage)暂停(0.2)

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

清晰的墨西哥人

相关的话题