视频演示:
通过matlab训练和验证深度学习的目标检测_哔哩哔哩_bilibili
大家好,这里是 Coding茶水间 👋。
今天我们来学习如何使用 MATLAB 来进行 深度学习目标检测,并以 RCNN 算法 为例,完成一个交通标志检测的小项目。
一、RCNN 算法简介
在目标检测的发展历程中,RCNN(Region-based Convolutional Neural Network) 是一个非常重要的里程碑。它首次将 深度卷积神经网络(CNN) 引入到了目标检测任务中,大大提升了检测精度。

RCNN 的主要创新在于:
- 使用 CNN 自动提取特征,替代了传统的人工特征工程。
- 将候选区域(Region Proposal)与 CNN 特征结合,用于分类和回归。
虽然由于计算效率较低,RCNN 现在已经不再主流,但它作为目标检测的开山之作,为后续的 Fast RCNN、Faster RCNN、YOLO、SSD 等高效算法提供了重要的研究基础。
二、实验准备
我们本次实验基于 MATLAB,并准备了一个 比较简单的交通标志数据集,数据集主要包含两类:
- slow(慢行标志)
- stop(停车让行标志)
每类数据约 10 张图片左右,本次主要大概跑一下RCNN模型从数据标注到训练和验证的大概流程,所以我们这个数据集并没有准备太多,实际应用中我们需要准备大量的数据集才能尽可能的让模型收敛。


三、数据标注
MATLAB 提供了便捷的标注工具 Image Labeler,我们可以通过以下步骤完成标注:
- 打开 MATLAB,点击 APP → 更多应用 → Image Labeler。

- 在工具界面中点击 Load → Add images from folder,导入我们准备好的两类图片。

- 在左上角新建类别标签:
slow→ 对应慢行标志stop→ 对应停车让行标志

- 逐张图片框选目标,并指定类别。

- 点击 Export → To File,保存为
label_data.mat文件。

标注结果包含:
- 数据源路径
- 目标类别
- 标注框的坐标信息
四、模型训练
接下来进入 RCNN 训练阶段。MATLAB 提供了 trainRCNNObjectDetector 接口,我们只需完成数据准备和参数设置即可。
objectDetectorTrainingData方法可以直接把标注好的数据读取解析出来。
训练代码示例
clc; clear; close all; % 加载标注数据 load label_data % 将标注数据转换为RCNN训练所需的格式 trainingData = objectDetectorTrainingData(gTruth); % 加载预训练的AlexNet网络作为特征提取器 net = alexnet; % 配置训练参数 options = trainingOptions('sgdm', ... 'MiniBatchSize', 128, ... % 每批处理128个样本 'InitialLearnRate', 1e-3, ... % 初始学习率为0.001 'LearnRateSchedule', 'piecewise', ... % 分段学习率策略 'LearnRateDropFactor', 0.1, ... % 学习率下降因子为0.1 'LearnRateDropPeriod', 100, ... % 每100轮下降一次学习率 'MaxEpochs', 10, ... % 最大训练轮数为10 'Plots', 'training-progress', ... % 显示训练进度图 'Verbose', true); % 显示训练详细信息 % 训练RCNN目标检测器 % 设置正负样本的重叠阈值:IOU>0.5为正样本,IOU<0.3为负样本 rcnn = trainRCNNObjectDetector(trainingData, net, options, ... 'NegativeOverlapRange', [0 0.3], 'PositiveOverlapRange', [0.5 1]); % 保存训练好的模型 save rcnn_stop_slow_detector.mat rcnn;
训练效果
训练过程中,MATLAB 会显示:
- 准确率曲线:随着迭代次数增加,准确率逐渐接近 100%。
- 损失曲线:随着训练推进,loss 趋近于 0。

五、模型验证
训练完成后,我们使用 未出现在训练集中的新图片 来验证效果。
clc; clear; close all; load rcnn_stop_slow_detector % 加载测试图像 I = imread('stop_sign_ch/stopstest.jpg'); % 使用训练好的检测器进行目标检测 [bboxes, scores, labels] = detect(rcnn, I); % 筛选置信度大于0.9 high_conf_indices = scores > 0.9; bboxes = bboxes(high_conf_indices, :); scores = scores(high_conf_indices); labels = labels(high_conf_indices); % 在图像上标注检测结果并显示 if ~isempty(bboxes) % 创建包含标签和分数的标注文本 annotations = string(labels) + ": " + string(scores); % 在图像上绘制边界框和标注 I = insertObjectAnnotation(I, 'rectangle', bboxes, annotations); else fprintf('未检测到任何置信度大于0.9的目标n'); end % 显示带有检测结果的图像 figure imshow(I) title('RCNN检测结果 - Stop和Slow标志');
验证效果:
- 对于 stop 标志,模型能够高置信度框选目标。
- 对于 slow 标志,模型同样能准确识别。

六、总结
通过本次实验,我们完成了:
- 使用 Image Labeler 完成数据标注。
- 基于 RCNN 模型和 AlexNet 预训练网络 进行目标检测训练。
- 对新图片进行验证,效果准确。
虽然 RCNN 在实际应用中已逐渐被更快的算法(如 YOLO、Faster RCNN)取代,但学习 RCNN 的意义在于:
- 掌握深度学习引入目标检测的核心思想
- 理解目标检测算法的发展历程
- 为后续研究 YOLO、SSD、Mask RCNN 等算法奠定基础