基于MATLAB实现行人检测

一、核心方法与工具

1. 传统方法:HOG+SVM

原理

  • HOG特征:通过计算图像局部梯度方向直方图描述行人形状
  • SVM分类:区分行人与非行人样本

实现步骤

matlab 复制代码
% 步骤1:加载数据集(需替换为实际路径)
trainingData = imageDatastore('pedestrian_dataset', 'IncludeSubfolders', true, 'LabelSource', 'foldernames');

% 步骤2:提取HOG特征
cellSize = [8 8];
hogFeatureSize = 36 * 4 * 31; % 根据图像尺寸计算
trainingFeatures = zeros(numel(trainingData.Files), hogFeatureSize);
for i = 1:numel(trainingData.Files)
    img = readimage(trainingData, i);
    img = im2gray(img);
    img = imresize(img, [128 64]);
    trainingFeatures(i,:) = extractHOGFeatures(img, 'CellSize', cellSize);
end

% 步骤3:训练SVM分类器
svmModel = fitcsvm(trainingFeatures, trainingData.Labels);

% 步骤4:检测行人
detector = vision.PeopleDetector('ClassificationModel', svmModel);
testImg = imread('test.jpg');
[bboxes, scores] = detect(detector, testImg);

% 步骤5:可视化结果
if ~isempty(bboxes)
    detectedImg = insertObjectAnnotation(testImg, 'rectangle', bboxes, scores);
    imshow(detectedImg);
else
    disp('未检测到行人');
end
2. 深度学习方法:YOLOv2

原理

  • 单阶段检测:直接回归目标位置和类别
  • 锚点机制:预定义多尺度检测框提升召回率

实现步骤

matlab 复制代码
% 加载预训练YOLOv2模型
net = readnet('yolov2-pretrained.mat');

% 图像预处理
inputImage = imread('test.jpg');
inputBlob = imresize(inputImage, net.Layers(1).InputSize(1:2));
inputBlob = im2double(inputBlob);
inputBlob = cat(4, inputBlob, ones(size(inputBlob,1), size(inputBlob,2), 1));

% 前向传播
[outputBlob, ~] = forward(net, inputBlob);
boxes = outputBlob(:, 1:4);
scores = outputBlob(:, 5);
classes = outputBlob(:, 6);

% 非极大值抑制
[nmsBoxes, nmsScores, nmsClasses] = nms(boxes, scores, 0.5);

% 可视化
figure;
imshow(inputImage);
hold on;
for i = 1:size(nmsBoxes, 1)
    bbox = nmsBoxes(i,:);
    rectangle('Position', bbox, 'EdgeColor', 'r', 'LineWidth', 2);
end
hold off;

二、性能对比与选型建议

方法 优点 缺点 适用场景
HOG+SVM 计算效率高,无需GPU 对遮挡和光照敏感 低分辨率图像、嵌入式设备
YOLOv2 实时检测,高精度 需预训练模型,计算资源需求高 自动驾驶、视频监控
背景差法 简单快速,适合静态背景 无法处理动态背景和复杂场景 室内监控、简单场景检测

三、关键优化策略

  1. 数据增强

    • 随机旋转、缩放、添加噪声提升模型泛化性
    matlab 复制代码
    augmentedData = imageDataAugmenter('RandRotation', [-10 10], 'RandScale', [0.8 1.2]);
  2. 多尺度检测

    • 图像金字塔处理不同尺寸行人
    matlab 复制代码
    pyramid = imagePyramid(inputImage, 'ScaleFactor', 1.2, 'NumLevels', 4);
  3. 模型压缩

    • 使用TensorRT加速推理
    matlab 复制代码
    net = dlquantizer(net, 'ExecutionEnvironment', 'gpu');
    quantizedNet = quantize(net);

四、完整工程代码结构

复制代码
├── dataset/              # 数据集
│   ├── train/            # 训练集
│   └── test/             # 测试集
├── models/               # 预训练模型
│   ├── hog_svm.mat       # HOG+SVM模型
│   └── yolov2.mat        # YOLOv2模型
├── src/
│   ├── feature_extraction.m  # 特征提取
│   ├── train_svm.m         # SVM训练
│   └── detect_yolov2.m     # YOLOv2检测
└── demo.m                # 主程序

五、评估指标与可视化

matlab 复制代码
% 计算混淆矩阵
C = confusionmat(true_labels, predicted_labels);

% 绘制ROC曲线
[X,Y,T,AUC] = perfcurve(true_labels, scores, 1);
plot(X,Y);
xlabel('False Positive Rate');
ylabel('True Positive Rate');
title(['AUC = ' num2str(AUC)]);

% 实时检测帧率统计
fps = 0.9*fps + 0.1*(1/toc);
disp(['当前帧率: ' num2str(fps, '%.1f') ' FPS']);

六、常见问题解决方案

  1. 漏检问题 调整检测尺度范围(如0.5-3倍原图尺寸) 增加非极大值抑制的IoU阈值(如从0.5调整至0.3)

  2. 误检问题 引入颜色特征(HSV空间)二次验证 使用级联分类器(如Viola-Jones框架)

  3. 实时性优化

    • 使用MEX加速C++代码
    matlab 复制代码
    codegen -config cfg detect_pedestrian_mex -args {im};

七、扩展应用场景

  1. 交通流量统计

    • 结合卡尔曼滤波跟踪行人轨迹
    matlab 复制代码
    tracker = vision.KalmanFilter('StateTransitionModel', [1 1; 0 1], 'MeasurementModel', [1 0]);
  2. 异常行为检测

    • 基于光流法分析运动模式
    matlab 复制代码
    flow = opticalFlowLK(im1, im2);
    magnitude = sqrt(flow.Vx.^2 + flow.Vy.^2);
  3. 多摄像头融合 使用Kalman滤波实现跨摄像头目标关联


八、参考

  1. 必备工具箱 Computer Vision Toolbox(目标检测函数) Deep Learning Toolbox(YOLO模型训练)
  2. 代码 行人检测功能 www.youwenfan.com/contentcst/63219.html
  3. 数据集推荐 INRIA Person Dataset(行人标注数据) Caltech Pedestrian Dataset(复杂场景数据)
  4. 性能分析工具 MATLAB Profiler(代码耗时分析) Deep Learning Toolbox Model Analyzer(模型复杂度评估)
相关推荐
所愿ღ1 小时前
SSM框架-Spring1
java·开发语言·笔记·spring
威迪斯特2 小时前
Gorilla框架:Go语言生态中的模块化开发利器
运维·开发语言·后端·golang·web框架·维护·gorilla
格林威2 小时前
面阵相机 vs 线阵相机:堡盟与海康相机选型差异全解析 附C# 实战演示
开发语言·人工智能·数码相机·计算机视觉·c#·视觉检测·工业相机
A_aspectJ2 小时前
【Java基础开发】基于 Java Swing 开发的简易计算器 - 支持键盘
java·开发语言
光影少年2 小时前
vite+rust生态链工具链
开发语言·前端·后端·rust·前端框架
skywalk81632 小时前
当前有什么流行的lisp的web框架吗?
开发语言·前端·lisp
天若有情6732 小时前
C++进阶:普通重载运算符 vs 隐式类型转换重载运算符,一篇讲透区别
开发语言·c++·算法
ZWZhangYu2 小时前
MCP 实战:从协议原理到 Java 自定义工具服务落地
java·开发语言·人工智能
知识分享小能手2 小时前
R语言入门学习教程,从入门到精通,R语言基础 - 完整知识点与案例代码(1)
开发语言·学习·r语言