视频演示:
通过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。
五、模型验证
训练完成后,我们使用 未出现在训练集中的新图片 来验证效果。
matlab
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 等算法奠定基础