300W数据集是一个非常通用的人脸对齐数据集,也是近年来凡paper,都要出指标比对的必然数据集。
下载链接:https://ibug.doc.ic.ac.uk/resources/300-W/
该数据集共计3148+689张图像,每个图像上包含不止一张人脸,但是对于每张图像只标注一张人脸。
该数据集包含的文件目录为:
afw(train 337) https://ibug.doc.ic.ac.uk/download/annotations/afw.zip
helen(train 2000 + test 330) https://ibug.doc.ic.ac.uk/download/annotations/helen.zip
ibug(test 135) https://ibug.doc.ic.ac.uk/download/annotations/ibug.zip
lfpw(train 811 + test 224) https://ibug.doc.ic.ac.uk/download/annotations/lfpw.zip
该数据集训练集共计3148张图像,测试集共计689张图像
此外,300w官网Download部分有4个part数据是300w crop的数据集,我们一起下载下来作为数据扩展用
300w(300 indoor + 300 outdoor) https://ibug.doc.ic.ac.uk/resources/facial-point-annotations/
300w竞赛的进阶版300-vw(https://ibug.doc.ic.ac.uk/download/300VW_Dataset_2015_12_14.zip/),同样是面部特征点的检测,只不过检测的对象从图片变成了视频。数据集提供了几乎每一帧的人脸特征点数据。所以一段20秒的视频可以提取出约500张画面,300-vw里大约有500多段视频,所以理论上可以提取出大概250000张图片样本。
在上一步骤中,我们已经下载到了包括300-w,LFPW,HELEN,AFW,IBUG和300-VW在内的6个数据集,初步估算有25万个样本可以使用,接下来我们将尝试对下载到的数据进行分析整理,包括:
检查数据集的格式:
为方便使用,大部分数据集都会尽可能的保留原始数据,并将附加的信息以文本或者其它形式进行存储,然后打包成一个或者若干压缩文档。所以拿到数据集后的第一件事,就是阅读数据集的说明文档。通过阅读说明,我们发现这六个数据库中的特征点坐标均以后缀名为pts
的格式进行存储,且文件名与对应的图片文件名相同。
有一个例外是300-VW。由于它是视频数据库,每一个视频文件则对应多个pts
文件,每个pts
文件对应了视频中的某一帧。
打开其中任意一个pts
文件,发现文件内容大概是这个样子:
不难发现,每一个pts
文件中第一行是文件版本,第二行是坐标个数说明,从第三行开始,括号内存储的是对应图像中人脸的68个特征点的坐标x与y,一行一组。所以有多少个pts
文件,就有多少个可用样本。
使用FFmpeg提取视频帧:
若要利用这20多万个样本,需要从视频中提取每一帧图像为单独的文件。这里我推荐使用著名的音视频包FFmpeg
FFmpeg是一套完整的音视频转换与流媒体开源解决方案。在Ubuntu下你可以简单的通过apt
命令来安装它。FFmpeg的使用也很简单,在终端中输入以下命令即可将视频中的每一帧提取成为单独的图像文件,存放在当前目录的image
文件夹下,文件名取自帧编号:
ffmpeg -i vid.avi -qscale:v 1 -f image2 image/%06d.jpg
其中-i
是指定输入文件,-qscale:v
是指定输出的图片质量参数,-f
为输出文件的模式。如果不指定-qscale:v
的话FFmpeg会使用默认参数输出,图片质量会变得很差。下图从左向右依次是默认参数,质量为1和不压缩的BMP格式。
由于300-VW下的114个avi
视频文件文件名是相同的,我们可以写一个简单的Shell脚本来批量将avi
视频中的帧提取出来。
for dir in $(ls -d */);
do
cd $dir;
mkdir image;
ffmpeg -i vid.avi -qscale:v 1 -f image2 image/%06d.jpg;
cd ..;
done
这段脚本在执行过程中会输出log供参考。整个300-VW的转换在我的计算机上花费的时间不到10分钟。
验证特征点坐标与图片的一致性:
理论上图片与坐标数据是一一对应的,不过我相信你心里应该也会有那么一点点的不确定——同名的pts
与图像文件真的一一对应吗?我们从视频中提取出来的图像呢,也能对应上吗?
为了消除心中的这个疑虑,也是为了从最开始就排除数据不匹配这一最糟糕的情况,最好将数据中的特征点画在对应图像上,人工用肉眼来验证一下!
要达成这一目标,需要实现以下两个主要功能:
pts
文件中读取68个特征点的坐标。1.使用Python读取文本文件
Python读取文本文档是不能再简单的事情,使用以下3行代码即可逐行打印出文本文档中的所有内容。
with open('image_003_1.pts') as file:
for line in file:
print(line)
使用该方法将一个pts
文件中的内容打印出来如下:
version: 1
n_points: 68
{
336.820955 240.864510
334.238298 260.922709
335.266918 283.697151
# 中间省略若干行
370.512631 329.910074
363.035791 328.132512
357.493721 327.074215
}
仔细观察不难发现,68个特征点在pts
文件中是顺序存储的,一行一组,所以只需要排除掉非坐标点行即可得到所有坐标。具体的排除方法可以自选,例如坐标行中仅包含数字、小数点和空格,非坐标行的字符与符号几乎是固定的。
2.使用Python读取并显示图片
在这里,我推荐使用适用于Python的OpenCV模块。安装完成后,我们就可以使用Python调用OpenCV函数,主要是以下3个:
cv2.imread()
读取图像文件。cv2.circle()
在图像指定位置处绘制圆点。cv2.imshow()
将修改后的图像显示在窗口中。最后,我们从搜集好的6个数据集中随机选择一些文件来看一下效果。
300-VW
300-W
AFW
HELEN
HELEN数据集中的图片分辨率较高,因此绘制的Mark点看上去很小。
IBUG
LFPW
同样需要注意的是有时候图片中存在多张人脸,但是一个pts
文件中只存储一个人脸的数据。
参考链接:https://blog.csdn.net/lgh0824/article/details/88536215#commentsedit
https://yinguobing.com/facial-landmark-localization-by-deep-learning-data-and-algorithm/
https://yinguobing.com/facial-landmark-localization-by-deep-learning-data-collate/