以下是基于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:准备标注数据
  1. 标注工具:使用MATLAB自带的 Image Labeler(菜单栏→Apps→搜索Image Labeler)。

    • 导入图像文件夹,手动框选目标并标注类别(如“person”“car”)。
    • 标注完成后,点击Export Labels→保存为annotations.xml(VOC格式)。
  2. 加载标注数据

% 加载标注文件(替换为你的标注路径)
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);

五、关键工具与扩展

  1. 预训练模型:MATLAB提供YOLOv4、SSD等更快的实时检测模型,替换trainFasterRCNNObjectDetectortrainYOLOv4ObjectDetector即可。
  2. 数据增强:用augmentedImageDatastore生成旋转、缩放后的样本,提升模型泛化能力:
    aug = imageDataAugmenter('RandRotation', [-10, 10], 'RandScale', [0.9, 1.1]);
    augData = augmentedImageDatastore(size(I_gray), data, 'DataAugmenter', aug);
    
  3. 模型导出:用exportONNXNetwork将模型导出为ONNX格式,部署到其他平台(如Python、嵌入式设备)。

更多推荐