• 基于 AdaFace 提供适合低质量人脸识别的人脸特征向量输出服务


    写在前面


    • 工作原因,简单整理
    • 理解不足小伙伴帮忙指正

    对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波逐流,是对内心的恐惧 ——赫尔曼·黑塞《德米安》


    简单介绍

    通过 AdaFace 提取人脸特征向量服务,项目来自:

    https://github.com/mk-minchul/AdaFace

    拿到人脸特征向量可以用于获取人脸相似度,通过两个人脸向量的余弦相似度得分

    AdaFace 简单介绍

    低质量人脸数据集中的识别具有挑战性,因为人脸属性被模糊和降级。基于裕量的损失函数的进步提高了嵌入空间中人脸的可辨别性。

    此外,以前的研究已经研究了适应性损失的影响,以更加重视错误分类的(硬)例子。在这项工作中,我们介绍了损失函数自适应性的另一个方面,即图像质量。我们认为,强调错误分类样本的策略应根据其图像质量进行调整。具体来说,简单和硬样品的相对重要性应基于样品的图像质量。

    我们提出了一种新的损失函数,该函数根据图像质量强调不同难度的样本。我们的方法通过用特征范数近似图像质量,以自适应裕量函数的形式实现这一点。大量的实验表明,我们的方法AdaFace在四个数据集(IJB-B,IJB-C,IJB-S和TinyFace)上提高了最先进的(SoTA)的人脸识别性能。

    @inproceedings{kim2022adaface,
      title={AdaFace: Quality Adaptive Margin for Face Recognition},
      author={Kim, Minchul and Jain, Anil K and Liu, Xiaoming},
      booktitle={Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition},
      year={2022}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    实际测试中发现,AdaFace 确实很强大,特别适合远距离,小目标,图片质量低的人脸识别。

    关于 AdaFace 更多信息见: https://github.com/mk-minchul/AdaFace

    详细信息可以看 AdaFace 的项目,或者我之前的文章,有一个结合作者 代码写的完整的人脸识别的Demo

    当前项目做了简化,只提供 输出人脸特征向量的 能力

    项目地址: https://github.com/LIRUILONGS/adaface

    在这里插入图片描述

    特别说明,输入图片不管是 字节还是,b64 编码,需要符合 照片为单个人脸,做面部对齐处理(不是必须,可能会影响),大小: 112*112

    部署方式

    conda env create -f /environment.yml
    source activate AdaFace
    pip install -r /requirements.txt  -i  https://pypi.tuna.tsinghua.edu.cn/simple
    
    • 1
    • 2
    • 3

    需要的预训练模型文件下载可以在作者的 github 项目主页找

    使用方式,脚本方式可以直接运行测试

    python AdaFaceFeature.py
    
    • 1
    PS W:\AdaFace_demo>  w:; cd 'w:\AdaFace_demo'; & 'C:\Users\liruilong\AppData\Local\conda\conda\envs\AdaFace\python.exe' 'c:\Users\liruilong\.vscode\extensions\ms-python.python-2023.18.0\pythonFiles\lib\python\debugpy\adapter/../..\debugpy\launcher' '54612' '--' 'w:\AdaFace_demo\AdaFaceFeature.py'
    获取特征开始
    w:\AdaFace_demo\AdaFaceFeature.py:82: UserWarning: Creating a tensor from a list of numpy.ndarrays is extremely slow. Please consider converting the list to a single numpy.ndarray with numpy.array() before converting to a tensor. (Triggered internally at C:\actions-runner\_work\pytorch\pytorch\builder\windows\pytorch\torch\csrc\utils\tensor_new.cpp:248.)
      tensor = torch.tensor([brg_img.transpose(2, 0,1)]).float()
    [[0.04365507885813713, -0.02032642811536789, -0.011309171095490456, ......................-0.002891642739996314, -0.00423774728551507, -0.08181970566511154, 0....
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 提供了 字节,b64 编码 图片处理
    • 支持输出特征向量方式为 字节和JSON

    提供了 Web 服务能力

    开发

    python flask_http_server.py
    
    • 1

    生产

    gunicorn  --worker-class gevent  -b 0.0.0.0:30035  --timeout 300  flask_http_server:app
    
    • 1

    HTTP 调用

    在这里插入图片描述

    curl --location --request POST 'http://192.168.26.81:30035/b64_represent_json' \
    --header 'Content-Type: text/plain' \
    --data-raw 'iVBORw0KGgoAA.................................mCC'
    
    • 1
    • 2
    • 3

    输出 向量的 JSON 表示

    [
        [
            0.054347388446331024,
            -0.031644247472286224,
       ........................
            0.022828513756394386,
            -0.03679579123854637
        ]
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    打包了 Docker 镜像,可以直接使用

    镜像地址: https://hub.docker.com/r/liruilong/adaface-face

    docker pull liruilong/adaface-face
    
    • 1

    在这里插入图片描述

    (adaface) ┌──[root@vms81.liruilongs.github.io]-[~/adaface/AdaFace_demo]
    └─$ docker run --rm  -p 30035:30035  adaface-face
    
    • 1
    • 2
    (adaface) ┌──[root@vms81.liruilongs.github.io]-[~/adaface/AdaFace_demo]
    └─$ docker run -p 30035:30035 --rm adaface-face gunicorn -w 3  --worker-class gevent  -b 0.0.0.0:30035  --timeout 300  flask_http_server:app
    
    • 1
    • 2

    该项目可以配合 https://github.com/LIRUILONGS/mtcnn_demo 使用

    博文部分内容参考

    © 文中涉及参考链接内容版权归原作者所有,如有侵权请告知,这是一个开源项目,如果你认可它,不要吝啬星星哦 😃


    https://github.com/mk-minchul/AdaFace

    https://hub.docker.com/r/liruilong/adaface-face


    © 2018-2023 liruilonger@gmail.com, All rights reserved. 保持署名-非商用-相同方式共享(CC BY-NC-SA 4.0)

  • 相关阅读:
    若依多租户集成浅析(基于数据源隔离)
    redis-哨兵模式&集群(无中心化)
    Spring底层原理学习笔记--第六讲--(Aware与InitializingBean接口及@Autowired失效分析)
    近期调研和使用 zeromq 与 cppzmq 的一些问题
    Java异常处理
    【无标Spring Boot (十五): Spring Boot + Jpa + Thymeleaf 增删改查示例题】
    “2023中国数字化服务之选”榜单发布,谷器数据荣耀登榜!
    js--定时器--匀速动画,缓动动画
    3年软件测试经验面试要求月薪22K,明显感觉他背了很多面试题...
    【Java基础面试十一】、int和Integer有什么区别,二者在做==运算时会得到什么结果?
  • 原文地址:https://blog.csdn.net/sanhewuyang/article/details/133789113