Matlab 基于深度学习的汽车目标检测 Fast rcnn 在Matlab 平台上,使用Fast RCNN网络进行汽车目标检测训练和测试。
Matlab 基于深度学习的汽车目标检测 Fast rcnn
在Matlab 平台上,使用Fast RCNN网络进行汽车目标检测训练和测试。
在 MATLAB 中实现基于 Fast R-CNN 的汽车目标检测是一个经典流程。虽然目前工业界更倾向于使用 Faster R-CNN 或 YOLO 系列,但 Fast R-CNN 依然是理解深度学习目标检测原理的重要模型。
重要提示:
硬件要求:训练深度学习网络(尤其是 R-CNN 系列)强烈建议拥有 NVIDIA GPU 并安装 Parallel Computing Toolbox 和 CUDA Support。如果没有 GPU,训练速度会非常慢(可能需数天)。
数据准备:你需要准备好标注好的汽车数据集(图像 + 标签文件,如 XML 或 MAT 格式)。
版本兼容性:以下代码基于 MATLAB R2020b 及更高版本编写(trainFastRCNNObjectDetector 函数在较新版本中依然可用,但部分底层网络定义方式可能随版本微调)。
完整代码示例
%% 基于 Fast R-CNN 的汽车目标检测 (MATLAB)
% 注意:运行此代码需要 Deep Learning Toolbox, Computer Vision Toolbox
% 强烈建议使用 GPU 加速训练
clear; clc; close all;
%% 1. 数据准备
% 假设你有一个包含汽车图像和对应标注(.xml 或 .mat)的文件夹
% 这里使用 MATLAB 自带的示例数据逻辑,实际使用时请替换为你的路径
disp(‘正在加载数据…’);
% 【用户修改】: 替换为你的图像文件夹路径和标注文件路径
% 数据结构:images 是 imageDatastore,labels 是 boxLabelDatastore
imageFolder = ‘car_dataset/images’; % 例如:‘C:/Data/CarImages’
labelFolder = ‘car_dataset/labels’; % 例如:‘C:/Data/CarLabels’ (包含 .xml 或 .mat)
% 检查路径是否存在 (如果是演示模式,使用内置数据)
if ~exist(imageFolder, ‘dir’)
warning(‘未找到自定义数据路径,正在加载 MATLAB 内置的车辆检测示例数据(少量)用于演示代码结构…’);
% 加载内置的 vehicle detection 数据 (仅作为代码运行演示,实际训练需大量数据)
load(‘stopSignsAndVehicles.mat’);
% 注意:内置数据主要是停车标志和车辆,这里我们只取车辆部分
% 为了演示 Fast R-CNN,我们需要构造 boxLabelDatastore
% 在实际项目中,请使用 readTable 读取你的标注文件并创建 boxLabelDatastore
images = imageDatastore(fullfile(matlabroot,‘toolbox’,‘vision’,‘visiondata’,‘detection’,‘stopSignsAndVehicles’));
% 由于内置数据没有直接的 fast rcnn 标注格式,以下代码假设你已经准备好了 data
% 如果你没有数据,请先收集并标注数据 (推荐使用 Image Labeler App)
error(‘请准备好您的数据集并修改代码中的 imageFolder 和 labelFolder 路径。’);
else
% 创建图像数据存储
images = imageDatastore(imageFolder, ‘FileExtensions’, {‘.jpg’, ‘.png’, ‘.jpeg’});
% 创建标签数据存储 (支持 VOC .xml 或 MATLAB .mat)
% 假设标注文件格式与图像文件名一致
labels = boxLabelDatastore(labelFolder);
% 合并数据和标签
trainingData = combine(images, labels);
% 读取一个样本检查
% [img, boxes] = read(trainingData, 1);
% imshow(img); hold on; plot(boxes(:,1), boxes(:,2), 'r-', 'LineWidth', 2);
end
% 为了代码能直接运行演示逻辑(防止用户无数据报错),此处生成模拟数据结构
% 【实际使用时请删除下面这行,使用上面的 combine 结果】
% trainingData = [];
% 确保有数据
if isempty(trainingData) && exist(‘vehicleImageFileNames’, ‘var’)
% 这是一个变通处理,如果你有具体的标注表 table
% tbl = readTable(‘your_annotations.csv’);
% trainingData = combine(images, tbl);
disp(‘请确保 trainingData 变量已正确包含图像和边界框标注。’);
return;
end
%% 2. 构建 Fast R-CNN 网络
disp(‘正在构建 Fast R-CNN 网络…’);
% Fast R-CNN 需要一个预训练的主干网络 (Backbone),通常使用 ResNet-50
% downloadWeights 会自动下载预训练权重 (首次运行需要联网)
backbone = resnet50(‘Weights’, ‘resnet50-places365’); % 或者 ‘imagenet’
% 移除全连接层,保留卷积层作为特征提取器
lgraph = layerGraph(backbone);
% 找到分类层和全连接层并移除 (Fast R-CNN 会添加自己的 ROI Pooling 和头部网络)
% 注意:trainFastRCNNObjectDetector 会自动处理网络架构的适配
% 我们只需要提供主干网络即可
% 定义类别名称 (根据你的数据集标签自动获取或手动指定)
classes = {‘car’, ‘truck’, ‘bus’}; % 示例:根据你的实际标签修改
% 如果从 datastore 自动获取:
% classes = unique(cat(1, trainingData.Labels{:})');
%% 3. 设置训练选项
disp(‘正在配置训练参数…’);
% 检测器特定的选项
detectorOpts = fastRCNNTrainingOptions(classes, …
‘MiniBatchSize’, 4, … % 根据显存大小调整 (GPU大可调至8或16)
‘NumEpochs’, 6, … % 训练轮数
‘InitialLearnRate’, 1e-4, … % 初始学习率
‘ValidationData’, [], … % 如果有验证集可填入
‘Plots’, ‘training-progress’); % 显示训练进度图
% 如果使用 GPU
if canUseGPU
detectorOpts.ExecutionEnvironment = ‘gpu’;
disp(‘检测到 GPU,已启用 GPU 加速训练。’);
else
detectorOpts.ExecutionEnvironment = ‘cpu’;
warning(‘未检测到 GPU,将使用 CPU 训练,速度会非常慢!’);
end
%% 4. 训练网络
disp(‘开始训练 (这可能需要很长时间)…’);
try
% 核心训练函数
[detector, info] = trainFastRCNNObjectDetector(trainingData, backbone, detectorOpts);
disp(‘训练完成!’);
% 保存训练好的模型
save('fastRCNNAutoDetector.mat', 'detector');
disp('模型已保存为 fastRCNNAutoDetector.mat');
catch ME
fprintf(‘训练出错: %sn’, ME.message);
disp(‘常见错误原因:1. 数据格式不匹配 2. 显存不足 (减小 MiniBatchSize) 3. 缺少标注’);
return;
end
%% 5. 测试与可视化
disp(‘正在进行测试检测…’);
% 加载一张测试图片 (或使用新图片)
testImage = imread(‘test_car.jpg’); % 【用户修改】替换为你的测试图片路径
if ~exist(‘test_car.jpg’, ‘file’)
% 如果没有测试图片,从训练集中随机取一张
idx = randi(numel(trainingData));
[testImage, ~] = read(trainingData, idx);
end
figure;
imshow(testImage);
title(‘汽车目标检测结果 (Fast R-CNN)’);
hold on;
% 执行检测
[bboxes, scores, labels] = detect(detector, testImage, ‘Threshold’, 0.5);
% 绘制结果
for i = 1:size(bboxes, 1)
rectangle(‘Position’, bboxes(i, 😃, …
‘EdgeColor’, ‘g’, ‘LineWidth’, 2);
text(bboxes(i, 1), bboxes(i, 2) - 5, …
sprintf(‘%s (%.2f)’, labels{i}, scores(i)), …
‘Color’, ‘g’, ‘FontSize’, 10, ‘FontWeight’, ‘bold’);
end
hold off;
disp(['检测到 ‘, num2str(size(bboxes, 1)), ’ 个目标。’]);
关键步骤详解与注意事项
数据标注 (最关键的一步)
Fast R-CNN 是监督学习,必须提供带标注的数据。
工具推荐:使用 MATLAB 自带的 Image Labeler App。
在 MATLAB 命令行输入 imageLabeler。
导入你的汽车图片。
定义标签(如 “Car”)。
手动框选汽车。
导出标签为 .mat 文件或 .xml (VOC 格式)。
数据格式:代码中的 trainingData 必须是一个包含两列的表(Table)或合并后的 Datastore:第一列是图像,第二列是 M-by-4 的边界框矩阵 ([x, y, width, height]) 以及对应的标签名称。
网络架构 (Backbone)
代码中使用了 resnet50。
Fast R-CNN 本身不是一个端到端的单网络,它由两部分组成:
CNN 骨干网:用于提取整张图像的特征图 (Feature Map)。
ROI Pooling 层 + 全连接层:将候选区域 (Region Proposals) 映射到固定尺寸并进行分类和回归。
MATLAB 的 trainFastRCNNObjectDetector 函数会自动帮你组装这些部分,你只需要提供骨干网(如 ResNet-50, VGG-16)。
关于 Region Proposals (区域提议)
区别点:Fast R-CNN 不自己生成候选框,它依赖外部的提议算法(通常是 Selective Search 或 EdgeBoxes)。
MATLAB 的处理:在较新的 MATLAB 版本中,trainFastRCNNObjectDetector 内部通常默认集成了基于深度学习的 RPN (Region Proposal Network) 思想或者使用高效的内置提议生成器,使得训练过程比传统的 “Selective Search + Fast R-CNN” 流程更简化。如果你的 MATLAB 版本较老,可能需要先生成 proposals 再输入。上述代码适用于 R2018a 之后的主流版本,函数内部已处理了提议生成逻辑。
性能优化 ("超便宜"方案)
既然你提到了“超便宜”,意味着可能没有昂贵的多卡服务器:
减小 Batch Size:代码中设置为 4。如果显存爆掉 (Out of Memory),改为 2 或 1(虽然效果会受影响且训练更慢,但能跑起来)。
迁移学习:代码使用了 resnet50 的预训练权重。这是最省钱的方法,不需要从头训练,只需在汽车数据上微调 (Fine-tune) 几轮即可。
数据增强:虽然代码没写,但在 fastRCNNTrainingOptions 中可以开启数据增强(翻转、缩放等),用少量数据获得更好的效果。
更多推荐




所有评论(0)