MATLAB 的目标检测完整教程
用预训练的Faster R-CNN模型,通过迁移学习适配自定义数据集。(适合复杂场景),附详细代码和步骤说明,从零开始实现目标检测。实现,支持两种传统特征匹配、阈值分割到深度学习的全流程。以下是基于MATLAB的目标检测完整教程,涵盖。:利用圆形的几何特征(边缘+圆形度)定位目标。:无需标注数据,适合规则形状目标;:对非规则目标或复杂背景效果差。:支持多类目标,对复杂背景鲁棒;:使用MATLAB自
·
文章目录
以下是基于MATLAB的目标检测完整教程,涵盖 传统方法(适合适合简单场景)和 深度学习方法(适合复杂场景),附详细代码和步骤说明,从零开始实现目标检测。
一、目标检测基础
目标检测的核心任务是:在图像中定位目标位置(用边界框[x, y, width, height]表示)并识别目标类别(如“行人”“汽车”)。
MATLAB主要依赖 Computer Vision Toolbox 实现,支持两种传统特征匹配、阈值分割到深度学习的全流程。
二、传统方法:基于特征与规则的目标检测(适合简单场景)
场景:检测图像中的圆形目标(如硬币、纽扣)
原理:利用圆形的几何特征(边缘+圆形度)定位目标。
步骤1:准备环境与图像
% 确保安装Image Processing Toolbox和Computer Vision Toolbox
% 读取图像(替换为你的图像路径)
I = imread('coins.jpg'); % 包含多个硬币的图像
figure; imshow(I); title('原始图像');
步骤2:预处理(降噪+增强)
I_gray = rgb2gray(I); % 转为灰度图
I_denoise = imgaussfilt(I_gray, 2); % 高斯滤波降噪(sigma=2)
figure; imshow(I_denoise); title('降噪后图像');
步骤3:边缘检测与圆形识别
% Canny边缘检测(突出圆形轮廓)
I_edge = edge(I_denoise, 'canny', [0.1, 0.3]); % 双阈值控制边缘灵敏度
% 形态学操作:连接断裂的边缘
se = strel('disk', 3); % 圆形结构元素(半径3)
I_morph = imclose(I_edge, se); % 闭运算连接边缘
I_morph = imfill(I_morph, 'holes');% 填充圆形内部
% 提取连通域并筛选圆形目标
stats = regionprops(I_morph, 'BoundingBox', 'Area', 'Perimeter');
% 圆形度筛选(圆形的周长²/(4π×面积)≈1)
circle_threshold = 0.8; % 圆形度阈值(越接近1越圆)
bboxes = [];
for i = 1:length(stats)
area = stats(i).Area;
perimeter = stats(i).Perimeter;
if perimeter > 0 % 避免除以0
circularity = (perimeter^2) / (4 * pi * area);
if circularity < (1 / circle_threshold) % 筛选接近圆形的区域
bboxes = [bboxes; stats(i).BoundingBox];
end
end
end
步骤4:可视化检测结果
I_result = insertObjectAnnotation(I, 'rectangle', bboxes, 'Coin');
figure; imshow(I_result); title('圆形目标检测结果');
优点:无需标注数据,适合规则形状目标;缺点:对非规则目标或复杂背景效果差。
三、深度学习方法:基于Faster R-CNN的目标检测(适合复杂场景)
场景:检测图像中的多类目标(如“人”“车”“自行车”)
原理:用预训练的Faster R-CNN模型,通过迁移学习适配自定义数据集。
步骤1:准备标注数据
-
标注工具:使用MATLAB自带的 Image Labeler(菜单栏→
Apps→搜索Image Labeler)。- 导入图像文件夹,手动框选目标并标注类别(如“person”“car”)。
- 标注完成后,点击
Export Labels→保存为annotations.xml(VOC格式)。
-
加载标注数据:
% 加载标注文件(替换为你的标注路径)
data = objectDetectorTrainingData('annotations.xml');
% 查看数据:data包含图像路径、边界框、类别
disp(data(1).imageFilename); % 第一幅图像路径
disp(data(1).boxLabels); % 第一幅图像的目标类别
步骤2:配置GPU加速(可选但推荐)
% 检查GPU是否可用(需NVIDIA显卡+CUDA配置,见前文)
if gpuDeviceCount > 0
gpuDevice(1); % 启用第1块GPU
executionEnvironment = 'gpu';
else
executionEnvironment = 'cpu'; % 无GPU则用CPU(速度慢)
end
步骤3:训练Faster R-CNN模型
% 选择预训练骨干网络(ResNet-50,基于COCO数据集)
baseNetwork = 'resnet50';
% 配置训练参数
options = trainingOptions('sgdm', ...
'MiniBatchSize', 2, ... % 批量大小(GPU显存小则设为1)
'MaxEpochs', 10, ... % 训练轮数(数据少则减小)
'InitialLearnRate', 1e-4, ...% 学习率
'ExecutionEnvironment', executionEnvironment, ...
'VerboseFrequency', 1); % 每1轮输出训练信息
% 训练模型
detector = trainFasterRCNNObjectDetector(data, baseNetwork, options);
步骤4:用训练好的模型检测新图像
% 读取测试图像(替换为你的图像)
testImage = imread('street.jpg');
% 检测目标(返回边界框、置信度、类别)
[bboxes, scores, labels] = detect(detector, testImage);
% 筛选高置信度结果(如只保留置信度>0.7的目标)
threshold = 0.7;
keep = scores > threshold;
bboxes = bboxes(keep, :);
labels = labels(keep);
scores = scores(keep);
% 可视化结果(标注边界框和类别)
I_result = insertObjectAnnotation(testImage, 'rectangle', bboxes, ...
cellstr([labels, arrayfun(@(s) sprintf(' (%.2f)', s), scores, 'UniformOutput', false)]));
figure; imshow(I_result); title('深度学习目标检测结果');
步骤5:模型评估(计算准确率)
% 用测试集评估(需单独准备带标注的测试数据)
testData = objectDetectorTrainingData('test_annotations.xml');
[ap, recall, precision] = evaluateDetectionPrecision(detector, testData);
% 绘制PR曲线(精确率-召回率曲线)
figure; plot(recall, precision); xlabel('召回率'); ylabel('精确率'); title('PR曲线');
优点:支持多类目标,对复杂背景鲁棒;缺点:需要标注数据,训练耗时。
四、实时目标检测(摄像头/视频流)
将训练好的模型用于实时检测(以摄像头为例):
% 打开摄像头(默认摄像头索引为1)
cam = videoinput('winvideo', 1); % Windows系统用'winvideo',Linux用'v4l2'
preview(cam); % 预览摄像头画面
% 实时检测循环
while true
frame = getsnapshot(cam); % 获取一帧图像
[bboxes, scores, labels] = detect(detector, frame); % 检测
frame_result = insertObjectAnnotation(frame, 'rectangle', bboxes, labels);
imshow(frame_result); % 显示带标注的帧
drawnow; % 刷新画面
% 按ESC键退出
if getkey == 27
break;
end
end
% 关闭摄像头
stop(cam);
delete(cam);
五、关键工具与扩展
- 预训练模型:MATLAB提供YOLOv4、SSD等更快的实时检测模型,替换
trainFasterRCNNObjectDetector为trainYOLOv4ObjectDetector即可。 - 数据增强:用
augmentedImageDatastore生成旋转、缩放后的样本,提升模型泛化能力:aug = imageDataAugmenter('RandRotation', [-10, 10], 'RandScale', [0.9, 1.1]); augData = augmentedImageDatastore(size(I_gray), data, 'DataAugmenter', aug); - 模型导出:用
exportONNXNetwork将模型导出为ONNX格式,部署到其他平台(如Python、嵌入式设备)。
更多推荐
所有评论(0)