1.训练代码
%%%清除命令窗口的内容;清除工作空间的所有变量;关闭所有打开的图形窗口;关闭警告信息。
clc;clear;close all;warning off;
%%%将当前工作路径添加到搜索路径中
addpath(genpath(pwd));
%%%设置随机数生成器的种子
rng('default')
%%%设置检查点文件夹路径,将当前工作路径与'train'拼接
checkpoint_folder= fullfile(pwd, 'train');
%%%加载存储有标注信息的 GroundTruth.mat 文件
data = load(fullfile(pwd, 'GroundTruth.mat'));
%%%从数据中提取标注信息
VD = data.gTruth;
%%%将图像文件路径与当前工作路径拼接
VD.imageFilename = fullfile(VD.imageFilename);
%%%打乱数据集索引
sidx = randperm(size(VD,1));
%%%将75%的数据用作训练集
idx = floor(0.75 * length(sidx));
%%%选取训练集
train_data = VD(sidx(1:idx),:);
%%%选取测试集
test_data = VD(sidx(idx+1:end),:);
%%%设置图像大小为224x224像素,3通道
image_size = [224 224 3];
%%%计算目标类别数量
num_classes = size(VD,2)-1;
%%%预定义的锚框大小
anchor_boxes = [
43 59
18 22
23 29
84 109
];
%%%加载预训练的 ResNet-50 模型
load Model_resnet50.mat
%%%用于目标检测的特征层
featureLayer = 'activation_40_relu';
%%%构建 YOLOv2 网络
lgraph = yolov2Layers(image_size,num_classes,anchor_boxes,Initial_nn,featureLayer);
%%%设置训练选项,包括优化器、批量大小、学习率、最大迭代次数等
options = trainingOptions('sgdm', ...
'MiniBatchSize', 8, ....
'InitialLearnRate',1e-3, ...
'MaxEpochs',100,...
'CheckpointPath', checkpoint_folder, ...
'Shuffle','every-epoch', ...
'ExecutionEnvironment', 'gpu');% 设置训练选项
%%%训练 YOLOv2 目标检测器
[detector,info] = trainYOLOv2ObjectDetector(train_data,lgraph,options);
%%%保存训练好的YOLOv2目标检测器到文件"yolov2.mat"中
save yolov2.mat detector
2.测试代码
%%%清除命令窗口、关闭所有图形窗口、关闭警告信息
clc;clear;close all;warning off;
%%%添加当前工作目录到搜索路径
addpath(genpath(pwd));
%%%设置随机数生成器的种子
rng('default')
%%%加载训练好的目标检测器(yolov2.mat)
load yolov2.mat
%%%设置图像大小为224x224
img_size= [224,224];
%%%设置图像库路径为'train/'。
imgPath = 'train/';
%%%遍历图像库中的所有jpg格式文件
imgDir = dir([imgPath '*.jpg']);
cnt = 0;
%%%对于每个图像,执行以下操作
cnt = 0;
for i = 1:36 % 遍历结构体就可以一一处理图片了
i
if mod(i,12)==1
figure
end
cnt = cnt+1;
subplot(3,4,cnt);
%%%读取图像
img = imread([imgPath imgDir(i).name]);
%%%调整图像大小为224x224
I = imresize(img,img_size(1:2));
%%%使用目标检测器进行目标检测,设置阈值为0.15
[bboxes,scores] = detect(detector,I,'Threshold',0.15);
[~,II] = max(scores);
%%%如果检测到目标,则在图像上绘制检测结果
if ~isempty(bboxes) % 如果检测到目标
I = insertObjectAnnotation(I,'rectangle',bboxes(II,:),scores(II),LineWidth=3);% 在图像上绘制检测结果
end
subplot(3,4,cnt);
%%%显示带有检测结果的图像
imshow(I, []);
%%%等待一小段时间,使图像显示更流畅
pause(0.01);
if cnt==12
cnt=0;
end
end
3.结果