文章目录
前言
MATLAB 的图像识别功能强大且易用,支持从基础算法到深度学习的全流程开发。以下是系统介绍和实战指南。
环境配置
MATLAB下载安装教程:https://blog.csdn.net/tyatyatya/article/details/147879353
一、核心功能与工具
MATLAB 提供了完整的图像识别工具箱,涵盖:
- 预处理:图像增强、降噪、滤波、几何变换。
- 特征提取:SIFT、SURF、HOG、CNN 特征。
- 分类算法:传统机器学习 (SVM、决策树) 和深度学习 (CNN)。
- 目标检测:基于 Faster R-CNN、YOLO 等预训练模型。
- 分割技术:语义分割、实例分割。
- 深度学习:支持自定义网络或迁移学习 (ResNet、VGG 等)。
二、图像识别工作流程
1. 数据准备与预处理
% 加载图像数据
imds = imageDatastore('path/to/images', ...
'IncludeSubfolders', true, ...
'LabelSource', 'foldernames');
% 数据增强(旋转、翻转等)
augmenter = imageDataAugmenter(...
'RandRotation', [-15, 15], ...
'RandXReflection', true, ...
'RandYReflection', true);
augimds = augmentedImageDatastore([224 224 3], imds, ...
'DataAugmentation', augmenter);
% 划分训练集和测试集
[imdsTrain, imdsTest] = splitEachLabel(imds, 0.7, 'randomized');
2. 特征提取与模型训练
- 方法 A:传统机器学习(HOG 特征 + SVM)
% 提取HOG特征
numImages = numel(imds.Files);
features = zeros(numImages, 1764);
labels = zeros(numImages, 1);
for i = 1:numImages
img = readimage(imds, i);
img = imresize(img, [100 100]);
features(i,:) = extractHOGFeatures(img);
labels(i) = i;
end
% 训练SVM分类器
tbl = table(features, categorical(labels));
mdl = fitcecoc(tbl, 'Var1');
- 方法 B:深度学习(自定义 CNN)
% 定义网络结构
layers = [
imageInputLayer([224 224 3])
convolution2dLayer(3, 16, 'Padding', 'same')
batchNormalizationLayer
reluLayer
maxPooling2dLayer(2, 'Stride', 2)
convolution2dLayer(3, 32, 'Padding', 'same')
batchNormalizationLayer
reluLayer
maxPooling2dLayer(2, 'Stride', 2)
fullyConnectedLayer(128)
reluLayer
dropoutLayer(0.5)
fullyConnectedLayer(numClasses)
softmaxLayer
classificationLayer
];
% 训练网络
options = trainingOptions('sgdm', ...
'InitialLearnRate', 0.001, ...
'MaxEpochs', 10, ...
'MiniBatchSize', 32, ...
'ValidationData', imdsTest, ...
'Verbose', false, ...
'Plots', 'training-progress');
net = trainNetwork(imdsTrain, layers, options);
3. 模型评估与预测
% 在测试集上评估
YPred = classify(net, imdsTest);
YTest = imdsTest.Labels;
accuracy = mean(YPred == YTest);
fprintf('分类准确率: %.2f%%\n', accuracy*100);
% 混淆矩阵
cm = confusionmat(YTest, YPred);
figure
cmplot = confusionchart(cm, categories(YTest));
cmplot.Title = '混淆矩阵';
cmplot.RowSummary = 'row-normalized';
cmplot.ColumnSummary = 'column-normalized';
% 单张图像预测
I = imread('test_image.jpg');
I = imresize(I, [224 224]);
label = classify(net, I);
imshow(I)
title(string(label));
三、高级应用:目标检测与分割
1. 基于预训练模型的目标检测
% 加载预训练Faster R-CNN模型
net = fasterRCNNObjectDetector('resnet50');
% 检测图像中的对象
I = imread('street_scene.jpg');
[bboxes, scores, labels] = detect(net, I);
% 可视化结果
I = insertObjectAnnotation(I, 'rectangle', bboxes, labels);
imshow(I)
title('目标检测结果');
2. 图像分割
% 加载预训练U-Net模型
net = unetLayers([224 224 3], numClasses);
% 训练分割网络
pixelLabelID = trainingOptions('sgdm', ...
'InitialLearnRate', 0.001, ...
'MaxEpochs', 20, ...
'MiniBatchSize', 16);
pixelLabelID = trainNetwork(pximds, net, options);
% 预测分割结果
I = imread('test_image.jpg');
[C, scores] = semanticseg(I, pixelLabelID);
% 可视化分割结果
B = labeloverlay(I, C);
imshow(B)
title('语义分割结果');
四、实战案例:手写数字识别
% 加载MNIST数据集
digitDatasetPath = fullfile(matlabroot, 'toolbox', 'nnet', ...
'nndemos', 'nndatasets', 'DigitDataset');
digitData = imageDatastore(digitDatasetPath, ...
'IncludeSubfolders', true, ...
'LabelSource', 'foldernames');
% 创建简单CNN
layers = [
imageInputLayer([28 28 1])
convolution2dLayer(5, 20)
reluLayer
maxPooling2dLayer(2, 'Stride', 2)
convolution2dLayer(5, 50)
reluLayer
maxPooling2dLayer(2, 'Stride', 2)
fullyConnectedLayer(500)
reluLayer
dropoutLayer(0.5)
fullyConnectedLayer(10)
softmaxLayer
classificationLayer
];
% 训练网络
options = trainingOptions('sgdm', ...
'InitialLearnRate', 0.001, ...
'MaxEpochs', 10, ...
'MiniBatchSize', 128);
net = trainNetwork(digitData, layers, options);
% 测试模型
I = imread('test_digit.png');
I = im2gray(I);
I = imresize(I, [28 28]);
I = imcomplement(I); % 反转黑白
digit = classify(net, I);
imshow(I)
title(sprintf('识别结果: %d', digit));
五、性能优化与部署
GPU 加速:
options = trainingOptions('sgdm', ...
'ExecutionEnvironment', 'gpu');
模型压缩:
% 量化模型
quantizedNet = quantizeNetwork(net, 'WeightPrecision', 8);
导出到其他平台:
% 导出为TensorFlow格式
exportONNXNetwork(net, 'model.onnx');
MATLAB 的图像识别能力兼具灵活性和高效性,适合快速原型开发和学术研究。通过内置的预训练模型和可视化工具,即使没有深厚的编程背景,也能快速实现复杂的图像识别任务。建议结合具体案例(如医学图像分析、自动驾驶场景)深入实践,进一步探索其强大功能。