18

模型仅有7M:轻量级高精度人脸识别方法DBFace

 4 years ago
source link: https://www.jiqizhixin.com/articles/2020-04-10-4
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

MJZfUf2.jpg!web

项目简介

之前机器之心报道过一个跨平台人脸识别项目,在 CPU 上就能轻松跑出 1000FPS。这次介绍的项目也是一个轻量级人脸识别项目。不同的是,该项目在保持较小参数量的前提下,识别精度要高很多,并且只需要OpenCV和 PyTorch 就能运行。

DBFace 是一个轻量级的实时人脸识别方法,其有着更快的识别速度与更高的精度。下图展示了多种人脸检测方法在 WiderFace 数据集上的测试效果。可以看到不仅 DBFace 模型的大小最小,其在 Easy、medium、Hard 三个测试任务中均取得了最高的识别精度。

MjmammY.png!web

项目地址:https://github.com/dlunion/DBFace

WiderFace 是一个关于人脸检测的基准跑分数据集,其中包含 32,203 张图片以及在各方面剧烈的 393,703 张人脸,数据集具有从简单到困难等不同难度的任务。下图是改数据集中一些样本的展示,可以看到,要想准确地识别出图中所有人脸还是很有挑战的。DBFace 在该数据集的不同任务上分别取得 0.925、0.920、0.847 的准确率,实属不易。

fYbQ7vV.png!web

有关 WiderFace 的详细介绍请读者移步其官网:

http://shuoyang1213.me/WIDERFACE/

效果展示

下图展示了不同人脸识别方法在 WiderFace 数据集上的 P-R 曲线。P-R 曲线可以较直观地展示二分类器的 Precision 和 Recall。当需要对不同算法进行比较时,若某个二分类器的 P-R 曲线被另一个二分类器的 P-R 曲线完全包住,即表明后者的性能优于前者。从图中可以看到,DBFace 包围的面积在三个任务中均相对较大。

jEfyIzn.jpg!web

当阈值设置为 0.2 时,DBFace 对这张世界最大的自拍照识别效果如下图所示:

V7bUjez.png!web

可以看到,DBFace 的识别准确率非常高,图中很多人脸甚至放大后单凭肉眼也很难分辨,DBFace 却仍然能够识别出来,并且模型大小仅 7M,完全能够在边缘设备上实时运行。于是,机器之心也上手测试了一番。

项目实测

项目作者提供的代码示例中包含对静态图片的识别,同时也有一个调用电脑摄像头的 GUI。值得注意的是,该项目并不需要太多依赖项,只要有 PyTorch、Numpy 和OpenCV即可运行。由于以上依赖环境都是非常常用的扩展库,网上有大量相应安装教程,这里就略过其安装步骤。

在 main.py 中,image_demo() 与 camera_demo() 分别对应静态图片识别与调用摄像头进行识别。静态图片识别代码为:

def image_demo():
    dbface = DBFace()
    dbface.eval()

    if HAS_CUDA:
        dbface.cuda()

    dbface.load("model/dbface.pth")
    detect_image(dbface, "datas/selfie.jpg")

以上代码将会读取训练后的模型,对图片 datas/selfie.jpg 进行识别,并将结果保存到 detect_result/selfie.draw.jpg。

让我们来看一下识别效果:

iuyemmf.jpg!web

从上图可以看到,即使在室内灯光颜色、明暗差别较大的环境下,DBFace 也识别出了图中几乎所有的人,甚至是中间那个一边画彩虹,一边指向闪耀灯球戴头盔的人也难逃其「魔掌」。当然,由于这里设置的检测阈值较低,存在一些误分类的现象。图中一些人的手和右上角的灯球就被误识别为了人脸。适当调高阈值即可消除此现象。

调用电脑摄像头检测的代码为:

def camera_demo():
    dbface = DBFace()
    dbface.eval()

    if HAS_CUDA:
        dbface.cuda()

    dbface.load("model/dbface.pth")
    cap = cv2.VideoCapture(0)
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
    ok, frame = cap.read()

    while ok:
        objs = detect(dbface, frame)

        for obj in objs:
            common.drawbbox(frame, obj)

        cv2.imshow("demo DBFace", frame)
        key = cv2.waitKey(1) & 0xFF
        if key == ord('q'):
            break

        ok, frame = cap.read()

运行以上代码将会生成一个 640x480 的 GUI 界面,调用摄像头实时进行人脸检测。

感兴趣的小伙伴赶快将本项目 git clone 到本地测试一下吧!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK