写在前面:
这篇博文主要是由于验证人脸检测的需要,考虑到widerface数据集的多样性,差异性,因此,需要将该数据集中的人脸都扣取出来。
widerface数据集链接http://mmlab.ie.cuhk.edu.hk/projects/WIDERFace/
widerface的官网给出了其数据集的mat格式的标签,因此一个读取其标签,将人脸扣取出的程序就迫在眉睫。本文的这个程序是一个很普通的程序,但是这个程序经过了验证,处理结果的正确性完全有保证。你可以花1个小时写一个这样的程序,但是你需要花3个小时进行验证和测试。这也就是本程序的意义所在。
本程序实现的功能:
1,读取所有图像,并将人脸图像保存到当前目录的filesave目录下
2,将新生成的图像保存到imagelist.txt中
3,将原始图像保存到train.txt中
4,对原始mat中的不在图像里面的人脸,进行了四舍五入和相应的处理
5,原始mat的人脸是亚像素的,进行了像素级别的处理
其中imagelist.txt和train.txt的格式如下注释所示。
% train.txt数据格式event_list\file_list\numx y w h
% 例如.\0--Parade\0_Parade_marchingband_1_849.jpg1 449 330 121 148
% imagelist.txt数据格式event_list_file_list_num.jpg
% 例如0--Parade_0_Parade_marchingband_1_849_1.jpg
程序:
clc;clear;
load('wider_face_train.mat');
filesave='.\filesave\';
train = fopen('train.txt','w');
imagelist = fopen('imagelist.txt','w'); %以只读方式打开文件'imagelist.txt'
for i=1:size(event_list,1)%便利所有的event_list
for j=1:size(file_list{i},1)%遍历所有图片
num=1;
imlist=strcat(strcat('.\',strcat(event_list{i},'\')),strcat(file_list{i}{j},'.jpg'));
imlistsave=strcat(strcat(event_list{i},'_'),strcat(file_list{i}{j},'_'));
image=imread(imlist);
fprintf(train, '%s', imlist); fprintf(train, ' %g', size(face_bbx_list{i,1}{j},1)); %写入train
for k=1:size(face_bbx_list{i,1}{j},1)%遍历所有框
y=max(1,round(face_bbx_list{i,1}{j}(k,2)));
y1=min(size(image,1),round((y+face_bbx_list{i,1}{j}(k,4))));
x=max(1,round(face_bbx_list{i,1}{j}(k,1)));
x1=min(size(image,2),round((x+face_bbx_list{i,1}{j}(k,3))));
if(x1<=0||y1<=0||x>size(image,2)||y>size(image,1))%去掉不满足的
continue;
end
imagetmp=image(y:y1,x:x1,:);
imwrite(imagetmp,strcat(filesave,strcat(strcat(imlistsave,num2str(num)),'.jpg')));
fprintf(imagelist, '%s', strcat(strcat(imlistsave,num2str(num)),'.jpg')); fprintf(imagelist, '\n'); %写入imagelist
fprintf(train, ' %g %g %g %g', x,y,x1-x,y1-y);%写入train
if (k==size(face_bbx_list{i,1}{j},1))
fprintf(train, '\n');
end
num=num+1;
end
end
end
实验结果: