测试某一个算法对图片检测的准确率。让其在某一个文件夹一次性检测并输出准确率。简单记录!!!
%%%制作脚本文件遍历文件夹测试 (运用某算法来检测某一个文件夹中的所有人脸图片,并输出一个准确率)
% 如果你的图片命名方式是1.jpg 2.jpg.......,其实后来发现,好像也不用这样命名,但是这样比较整洁
clear;clc;
file_path = 'G:\facedownload\my_own_data\detece_ada_1\'; %指向目标文件夹
face_bound = 0;
img_path_list = dir(strcat(file_path,'*.jpg')); %组合成一个完整的绝对路径,这里会定义顺序
img_num = length(img_path_list); %找出文件夹内有多少个文件,也就是多少张图片
tic; % 计时开始,(可有可无)
if img_num > 0
%img_num = 5; %%先尝试一下,随机选取的5张,不是那个命名的1-5的顺序
for j = 1:img_num
image_name = img_path_list(j).name;
disp(fprintf('正在运用某算法检测第 %d 张图片',j));
[faces,] = detectFaces(strcat(file_path,image_name)); %开始遍历检测图片,我的是人脸检测
if(~isempty(faces));
face_bound = face_bound + 1;
disp(fprintf('检测到 %d 张人脸',face_bound));
end
end
toc; %计时结束
disp(fprintf('总共检测 %d 张图片,其中检测到 %d 个人脸,',img_num - 200,face_bound));
acc=vpa(face_bound / img_num *100,4);
disp(['检测准确率 acc=',char(acc),'%']);
end
现在我打算将检测的图片中,将那些能够检测到人脸的图片抽取出来,放到文件夹1,和检测不出来的图片放到文件夹2。方便我观察算法对那些图片比较敏感以及那些图片不敏感!!
我只保存能够检测到的图片,如果想保存检测不到的图片,加一个else即可。同样的操作。
%%%制作脚本文件遍历很多图片,并且分别保存能检测出来,和不能检测出来的,抽取出来
clear;clc;
file_path = 'G:\facedownload\my_own_data\所有图片\'; %指向目标文件夹
face_bound = 0;
img_path_list = dir(strcat(file_path,'*.jpg')); %组合成一个完整的绝对路径
img_num = length(img_path_list) ; %找出文件夹内有多少个文件,也就是多少张图片
if img_num > 0
for j = 1:img_num
image_name = img_path_list(j).name;
disp(fprintf('正在检测第 %d 张图片',j));
img = imread(strcat(file_path,image_name));
[faces,] = detectFaces(strcat(file_path,image_name)); %开始遍历检测图片
if(~isempty(faces)); %检测到人脸
face_bound = face_bound + 1;
disp(fprintf('检测到 %d 张人脸',face_bound));
%%%%%%%%%这里几句话是不自动命名,保存图片为原来的名字%%%%%%%%%%%%%%%%
% file_path1 = 'G:\facedownload\my_own_data\检测成功\';
% img_path_list1 = dir(strcat(file_path1,'*.jpg'));
% save_path = strcat(file_path1,image_name);
% imwrite(img,save_path,'jpg','quality',100); %%用图片本来名称保存
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
file_path1 = 'G:\facedownload\my_own_data\检测成功\'; %抽取之后放入的文件夹
img_path_list1 = dir(strcat(file_path1,'*.jpg'));
L = length(img_path_list1) + 1; %找出文件夹内已经有多少张图片
save_path=['G:\facedownload\my_own_data\检测成功\',num2str(L),'.jpg']; %指定保存位置。并自动命名1.jpg、2.jpg等,形成一个完成的图片路径。
imwrite(img,save_path,'jpg','quality',100); %自动保存检测到的人脸图片到指定位置,%测试时要注释掉,(这个地方有坑,下面会解释)
[face,] = detectFaces(save_path); %检查此重新解压缩的jpg图片是否任然能检测到人脸
if(~isempty(face));
disp( ' OK !!! ');
else
delete(save_path)
disp( ' Not OK !!! ');
end
end
end
disp(fprintf('总共检测 %d 张图片,其中检测到 %d 个人脸,',img_num,face_bound));
end
因为 jpg 格式的图片都是有压缩的图片,所以如果是简单的imwrite的话,很可能在你原来的图片能狗检测到,imwrite之后的图片就检测不到了。所以我采取了两个措施,第一,就是加一个quality 100.具体可以查看帮助文档。这样生成的图片会好一点,但是也会对后续检测有影响,所以我在上面的代码之后又加了一行检测生成之后的图片,如果ok就保存,不ok就删除。