为第二届 UCCS 人脸检测和识别挑战赛运行基线实验和评估
项目描述
这个包实现了无约束人脸检测和开放集识别挑战的第二版的基线算法和评估。这个包依赖于信号处理和机器学习库Bob和Caffe。Bob的安装说明和要求请参考Bob网页和Caffe网页。
数据集
这个包不包括比赛的原始图像和协议文件。请在竞赛网站上注册并从那里下载 UCCS 数据集。
请将所有 zip 文件解压缩到同一目录中(.zip 文件包含适当的目录结构)。这包括所有training_*.zip和validation_*.zip文件,以及protocol.zip和可能的SampleDataSet.zip。该目录将在下面被称为YOUR-DATA-DIRECTORY。
安装
该软件包的安装遵循Buildout结构。首先,您需要将Bob和Caffe安装到同一个 conda 环境中。否则,请将PYTHONPATH变量指向Caffe的安装位置。在继续之前,请确保您可以成功导入bob.measure和caffe:
$ conda activate bob_py3 (bob_v3) $ python >>> import bob.measure >>> import caffe
安装Bob和Caffe并解压缩此软件包后,请运行以下命令行来安装此软件包及其所有要求:
扩建
安装过程会自动在bin目录中生成可执行文件,可用于运行基线算法或评估基线(和您的)算法。
我们基线中使用的网络可以从 Internet 下载。要运行人脸检测器基线,您需要将MTCNN v2人脸检测器的模型目录放入此包的基本目录中。要运行人脸识别基线,您需要访问VGG v2网站,下载Vggface2_caffe_model.tar.gz,并将senet50_ft.caffemodel和senet50_ft.prototxt提取到同一模型目录中。
运行基线
有两个脚本可以运行基线,每个部分一个。
人脸检测
第一个脚本是人脸检测脚本,它将检测验证(和测试)集中的人脸。基线检测器使用MTCNN v2人脸检测模块,我们必须降低检测阈值才能检测到图像中的大多数人脸——仍然无法使用MTCNN v2检测到大约 20% 的(大部分是困难的)人脸。此外,还有很多背景区域被错误地标记为人脸。
您可以使用以下方法调用面部检测器基线脚本:
./bin/baseline_detector.py
请参阅./bin/baseline_detector.py -h了解可能的选项。以下是您可能想要/需要使用/更改的选项子集:
--data-directory:指定您已将 UCCS 数据集下载到的目录。
--result-file : 将检测结果写入的文件;这将是所需的格式。
--which-set:应该运行基线检测器的集合;可能的值:训练、验证、测试、样本;默认值:验证。
--verbose : 增加脚本的详细程度;建议使用--verbose --verbose或-vv;-vvv将写入更多信息。
--debug:仅在指定数量的图像上运行;仅用于调试目的。
--display:显示检测到的边界框(绿色)和ground truth(红色);仅用于调试目的。
--parallel : 在给定数量的并行进程中运行;可以极大地加快处理速度。
--gpus :在 GPU 模式下使用Caffe运行人脸检测(这可能无法正常工作,具体取决于您的Caffe设置);您可以指定要使用的设备 ID,通常只有0;如果未指定,则在 CPU 模式下运行
在具有 32 个 CPU 内核的机器上,完整基线实验的一个好的命令行应该是:
./bin/baseline_detector.py --data-directory YOUR-DATA-DIRECTORY -vv --parallel 32
在具有 32 个内核和两个 NVidia GPU 的机器上,完整基线实验的一个好的命令行是:
./bin/baseline_detector.py --data-directory YOUR-DATA-DIRECTORY -vv --parallel 8 --gpus 0 1
要进行小规模实验,即在 20 张图像上显示检测到的人脸,一个好的命令行可能是:
./bin/baseline_detector.py --data-directory YOUR-DATA-DIRECTORY -vvv --display --debug 20
默认情况下,人脸检测分数文件将写入./results/UCCS-v2-detection-baseline-validation.txt。
人脸识别
对于人脸识别,我们利用MTCNN v2人脸检测器检测所有人脸(见上文),并确保使用与地面实况标签重叠度最高的边界框。对于训练集中每个检测到的边界框,我们将边界框放大 1.3 倍,并使用VGG v2识别模块的pool5/7x7_s1层提取特征,我们将其归一化为单位欧几里得长度。模板注册阶段只是计算每个已知主题的训练集特征的平均值。考虑到我们在训练和测试集中有未知主题的事实,我们还注册了一个图库模板,其中包括标记为-1的所有已知未知主题。
对于探测图像,我们假设我们没有任何标签(这就是测试集的样子)。因此,我们运行MTCNN v2检测器来检测人脸(将包括几个背景区域)。对于每个边界框,我们如上所述提取VGG v2特征,并计算与所有图库模板(包括未知模板)的余弦相似度。最高的 10 个相似性被存储到分数文件中——除非未知标签 ( -1 ) 在最高分数中,在这种情况下,只存储高达-1标签的分数。这意味着当最高分数带有-1标签时,分数文件中只存储一个值。
您可以使用以下方法调用人脸识别基线脚本:
./bin/baseline_recognizer.py
请参阅./bin/baseline_recognizer.py -h了解可能的选项。以下是您可能想要/需要使用/更改的选项子集:
--data-directory : 指定下载 UCCS 数据集的目录
--result-file : 将识别结果写入的文件;这将是所需的格式
--verbose : 增加脚本的详细程度;建议使用--verbose --verbose或-vv;-vvv将写入更多信息
--temp-dir:指定存放临时文件的目录;这些文件将只计算一次并重新加载(如果存在)
--force:忽略现有的临时文件并始终重新计算所有内容
--debug:仅在指定数量的身份上运行;仅用于调试目的;将修改临时文件和结果文件的文件名
--parallel : 在给定数量的并行进程中运行;可以极大地加快处理速度
在具有 32 个 CPU 内核的机器上,一个好的命令行应该是:
./bin/baseline_recognizer.py --data-directory YOUR-DATA-DIRECTORY -vv --parallel 32
在 GPU 模式下使用带有两个 NVidia GPU 的Caffe时,一个好的命令行应该是:
./bin/baseline_recognizer.py --data-directory YOUR-DATA-DIRECTORY -vv --parallel 2 --gpus 0 1
默认情况下,人脸识别分数文件将写入./results/UCCS-v2-recognition-baseline-validation.txt。
评估
提供的评估脚本将仅可用于评估验证集,而不是测试集(因为未将测试集标签提供给参与者)。您可以将评估脚本用于两个目的:
将基线结果与您的结果进行比较。
确保您的乐谱文件采用所需的格式。
如果您无法在您的机器上运行基线实验,我们会在竞赛网站上提供验证集的分数文件。
人脸检测评估
由于ground-truth通常比人脸大,我们不会惩罚小于ground truth的边界框。因此,并集(分母)只考虑了地面实况边界框的四分之一——或交集区域,以较大者为准:
其中\(|\cdot|\)是区域运算符。因此,当检测到的边界框\(D\)至少覆盖了真实边界框\(G\)的四分之一并且完全包含在\(G\)内时,就会达到 1 的重叠。
人脸检测使用自由接收算子特征 (FROC) 曲线进行评估,该曲线绘制了正确检测到的人脸占误报总数(检测到的背景区域)的百分比。对于不同的检测器置信度值,可以获得 FROC 曲线上的不同点。可以使用以下方法创建此图:
./bin/evaluate_detector.py
这个脚本有几个选项,其中一些需要指定,见./bin/evaluate_detector.py -h:
--data-directory : 指定下载 UCCS 数据集的目录
--result-files:包含检测(或识别)结果的所有文件的列表
--labels:算法的标签列表;必须与--result-files的编号和顺序相同
--froc-file:包含 FROC 图的输出 .pdf 文件的名称;默认为UCCS-v2-FROC.pdf
--log-x:将以对数刻度绘制水平轴
--only-present:将忽略任何不存在检测的文件(仅用于调试目的,即当检测器使用--debug选项运行时)
--verbose : 增加脚本的详细程度;建议使用--verbose --verbose或-vv
要绘制基线 FROC 曲线(显示在比赛网站上),请执行:
./bin/evaluate_detector.py --data-directory YOUR-DATA-DIRECTORY --result-files results/UCCS-v2-detection-baseline-validation.txt --labels Baseline --log-x -vv
人脸识别评估
开放集人脸识别使用检测和识别率 (DIR) 曲线进行评估,该曲线绘制了正确检测和识别的人脸占错误识别总数的百分比。基于错误识别的各种值,计算几个分数阈值。如果识别分数大于阈值并且正确身份具有该人脸的最高识别分数,则称该人脸被正确识别。计算正确识别的人脸数量,然后除以已知人脸的总数。详情请参阅[ 1 ]。
可以使用以下方法创建 DIR 图:
./bin/evaluate_recognizer.py
像往常一样,该脚本有几个选项,类似于上面的./bin/evaluate_detector.py,完整列表参见./bin/evaluate_recognizer.py -h :
--data-directory : 指定下载 UCCS 数据集的目录
--result-files : 包含识别结果的所有文件的列表
--labels:算法的标签列表;必须与--result-files的编号和顺序相同
--dir-file:包含 DIR 图的输出 .pdf 文件的名称;默认为UCCS-v2-DIR.pdf
--log-x:将以对数刻度绘制水平轴
--only-present:将忽略任何不存在检测的文件(仅用于调试目的,即当识别器使用--debug选项运行时)
--verbose : 增加脚本的详细程度;建议使用--verbose --verbose或-vv
--rank : 使用给定的等级来绘制 DIR 曲线
要绘制基线 Rank 1 DIR 曲线(显示在比赛网站上),请执行:
./bin/evaluate_recognizer.py --data-directory YOUR-DATA-DIRECTORY --result-files results/UCCS-v2-recognition-baseline-validation.txt --labels Baseline --log-x -vv
故障排除
如果在运行基线算法或评估时遇到问题,请通过以下电子邮件与我们联系:opensetface @ large 。. _ 教育