最近在尝试复现一篇论文
其中模型之间的输入输出转换涉及到图像尺寸的批量修改和转换。
此代码完成的事:
话不多说,上代码:
clear;
clc;
load xxxxmodel.mat % //加载模型
Path = '...\xxxxTestset\'; % //设置输入数据存放的文件夹路径
writePath = "...\yyyyTrainset\";
File = dir(fullfile(Path,'*.jpg')); % //显示文件夹下所有符合后缀名为.txt文件的完整信息
FileNames = {File.name}'; % //提取符合后缀名为.txt的所有文件的文件名,转换为n行1列
count = length(FileNames);
m = 1;
% //遍历文件夹内文件
for i=1:count
picPath = strcat(Path,FileNames(i)); % //此时仍为元胞数组,后面读取图像地址需要加{1,1}才能得到字符串
img = imread(picPath{1,1});
imgsize = size(img);
[bboxes,scores] = detect(detector,img); % //利用训练好的yolov2模型进行检查
scores = strcat(string(round(scores,4)*100),"%");
% //保存yyyy输入训练集图像
if (~isempty(bboxes)) % //判断是否有边界框
% //遍历每一张图像的矩形框
for n=1:size(bboxes,1)
writePathName = strcat(writePath,num2str(m),'.jpg');
h1 = bboxes(n,2);
h2 = bboxes(n,2)+bboxes(n,4);
w1 = bboxes(n,1);
w2 = bboxes(n,1)+bboxes(n,3);
% //修正边界索引值
if h1 == 0
h1=h1+1;
end
if h2 >= imgsize(1)
h2=h2-1;
end
if w1 == 0
w1=w1+1;
end
if w2 >= imgsize(2)
w2=w2-1;
end
% //保证roi图像为的高和宽都为偶数,方便一会儿修补为正方形的操作
if mod(h2-h1,2) ==0 % //返回的是bool值,==0,说明是奇数
h2 =h2-1;
end
if mod(w2-w1,2) ==0
w2 =w2-1;
end
unetroi = img(h1:h2,w1:w2,:);
% //获取roi宽高
unetroih = size(unetroi,1);
unetroiw = size(unetroi,2);
% //填补为正方形,然后缩放到214*214,存储
if unetroih>unetroiw % //如果高大于宽
fillarea = zeros(unetroih,(unetroih-unetroiw)/2,3); % //黑色填补区域的创建
unetsquareBforeResize = [uint8(fillarea) unetroi uint8(fillarea)]; % //区域拼接,相当于矩阵插入列的操作
unetin = imresize(unetsquareBforeResize,[214 214]); % //resize为期望尺寸
elseif unetroiw>unetroih % //如果宽大于高
fillarea = zeros((unetroiw-unetroih)/2,unetroiw,3); % //黑色填补区域的创建
unetsquareBforeResize = [uint8(fillarea);unetroi;uint8(fillarea)]; % //区域拼接,相当于矩阵插入行的操作
unetin = imresize(unetsquareBforeResize,[214 214]); % //resize为期望尺寸
elseif unetroiw==unetroih % //如果宽等于高
unetin = imresize(unetroi,[214 214]); % //直接resize为期望尺寸
end
imshow(unetin)
imwrite(unetin,writePathName); % //图像保存结果
m = m+1;
end
end
end
sprintf("yyyy训练集输入图像已存储完成!")