通过matlab训练和验证深度学习的目标检测

视频演示:

通过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,我们可以通过以下步骤完成标注:

  1. 打开 MATLAB,点击 APP → 更多应用 → Image Labeler

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

  3. 在左上角新建类别标签:

    • slow → 对应慢行标志
    • stop → 对应停车让行标志
  4. 逐张图片框选目标,并指定类别。

  5. 点击 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 标志,模型同样能准确识别。

六、总结

通过本次实验,我们完成了:

  1. 使用 Image Labeler 完成数据标注。
  2. 基于 RCNN 模型和 AlexNet 预训练网络 进行目标检测训练。
  3. 对新图片进行验证,效果准确。

虽然 RCNN 在实际应用中已逐渐被更快的算法(如 YOLO、Faster RCNN)取代,但学习 RCNN 的意义在于:

  • 掌握深度学习引入目标检测的核心思想
  • 理解目标检测算法的发展历程
  • 为后续研究 YOLO、SSD、Mask RCNN 等算法奠定基础