人脸口罩识别——人脸添加口罩方法masked_faces

简介: 人脸口罩识别——人脸添加口罩方法masked_faces

A realistic approach to generate masked faces applied on two novel masked face recognition data sets

1 人脸添加口罩masked_faces

1、论文和代码

paper:https://arxiv.org/pdf/2109.01745v5.pdf
code:https://github.com/securifai/masked_faces

2、作者在CelebACASIA-WebFace两个口罩数据集上添加口罩,处理出两个数据集,数据集下载地址:

  • CASIA-WebFace 数据集上生成445446张(90%)添加口罩人的人脸图片
  • CelebA数据集上生成196254张 (96.8%)张添加口罩的人脸图片

2 添加口罩原理

该实现时依赖于facebook的Spark AR Studio,这是用于Instagram人脸滤镜的(face filter)。 作者使用该方法:

image.png

1、首先给一张原始图片
2、随机选择一个mask,然后使用SparkAR的3D face 模型进行转换mask模板
3、调整mask颜色,然后添加到人脸上

效果:

image.png

3 添加口罩代码操作

依赖python库包(tqdm、opencv-python)

1、数据准备:

  • 口罩mask的模板图片
  • 原始的CelebACASIA-WebFace数据集

2、在CelebA数据集上处理过程

数据集准备:

main directory
│   apply_masks_celeba.py
└───celeba_masks - masks folder (from this repo)
│   │   ...
└───celeba - data set folder (original images)
│   │   ...
└───masked_celeba - output folder (images with overlaid masks)...

python python apply_masks_celeba.py

3、在CASIA-WebFace数据集上处理过程

数据集准备:

main directory
│   apply_masks_casia.py
└───casia_masks - masks folder (from this repo)
│   │   ...
└───casia - data set folder (original images)
│   │   ...
└───masked_casia - output folder (images with overlaid masks)...

python apply_masks_casia.py

4 源码分析

apply_masks_casia.py

# This script applies masks over Casia-WebFace dataset. casia_folder, masks_folder, output folder should be set
# SecurifAI - 2021


import os
import glob
import cv2
from tqdm import tqdm

def overlay_image_alpha(img, img_overlay, pos, alpha_mask):
    x, y = pos

    y1, y2 = max(0, y), min(img.shape[0], y + img_overlay.shape[0])
    x1, x2 = max(0, x), min(img.shape[1], x + img_overlay.shape[1])

    y1o, y2o = max(0, -y), min(img_overlay.shape[0], img.shape[0] - y)
    x1o, x2o = max(0, -x), min(img_overlay.shape[1], img.shape[1] - x)

    if y1 >= y2 or x1 >= x2 or y1o >= y2o or x1o >= x2o:
        return

    channels = img.shape[2]

    alpha = alpha_mask[y1o:y2o, x1o:x2o]
    alpha_inv = 1.0 - alpha

    for c in range(channels):
        img[y1:y2, x1:x2, c] = (alpha * img_overlay[y1o:y2o, x1o:x2o, c] +
                                alpha_inv * img[y1:y2, x1:x2, c])




# casia images main folder
casia_folder = 'CASIA-WebFace'

# masks main folder
masks_folder = 'CASIA-WebFace_masks'

# masks img list
mask_list = glob.glob(masks_folder + '/*/*.png')

# output folder
output_folder = 'masked_CASIA-WebFace'

if not os.path.isdir(output_folder):
    os.mkdir(output_folder)


for mask in tqdm(mask_list):    

    # get the basename of the mask to find original Casia image
    mask_basename = os.path.basename(mask)

    parent_folder = os.path.basename(os.path.dirname(mask))
    if not os.path.isdir(os.path.join(output_folder,parent_folder)):
        os.mkdir(os.path.join(output_folder,parent_folder))

    # create path for original mask
    img_path = os.path.join(casia_folder, parent_folder, mask_basename.replace('png','jpg')) 

    # check that original image exists, if it exists load it
    if os.path.isfile(img_path):
        casia_image = cv2.imread(img_path)
    else:
        continue

    # load the mask
    mask_image = cv2.imread(mask,cv2.IMREAD_UNCHANGED)

    # apply mask over image
    overlay_image_alpha(casia_image,
        mask_image[:, :, 0:3],
        (0, 0),
        mask_image[:, :, 3] / 255.0)

    # save new overlayed image
    cv2.imwrite(os.path.join(output_folder,parent_folder, mask_basename.replace('png','jpg')),casia_image)

apply_masks_celeba.py

# This script applies the celeba_masks over the celeba_images. celeba_folder, output_folder must be set.
# SecurifAI - 2021

import glob
import cv2
import os
from tqdm import tqdm

def overlay_image_alpha(img, img_overlay, pos, alpha_mask):
    x, y = pos

    y1, y2 = max(0, y), min(img.shape[0], y + img_overlay.shape[0])
    x1, x2 = max(0, x), min(img.shape[1], x + img_overlay.shape[1])

    y1o, y2o = max(0, -y), min(img_overlay.shape[0], img.shape[0] - y)
    x1o, x2o = max(0, -x), min(img_overlay.shape[1], img.shape[1] - x)

    if y1 >= y2 or x1 >= x2 or y1o >= y2o or x1o >= x2o:
        return

    channels = img.shape[2]

    alpha = alpha_mask[y1o:y2o, x1o:x2o]
    alpha_inv = 1.0 - alpha

    for c in range(channels):
        img[y1:y2, x1:x2, c] = (alpha * img_overlay[y1o:y2o, x1o:x2o, c] +
                                alpha_inv * img[y1:y2, x1:x2, c])


# folder where celeba images are stored
celeba_folder = 'img_celeba'
img_list = glob.glob(celeba_folder + '/*.png')

# folder where the masks are stored
mask_folder = 'celeba_masks'
mask_list = glob.glob(mask_folder + '/*.png')

# output folder
output_folder = 'masked_celeba'

if not os.path.exists(output_folder):
    os.makedirs(output_folder)


for mask in tqdm(mask_list):
    # get basename and remove '_mask' string, change png to jpg
    mask_basename = os.path.basename(mask).replace('_mask','').replace('png','jpg')

    # get celeba path from mask path
    img_path = celeba_folder + '/' + mask_basename

    # check if we have an image for mask
    if os.path.exists(img_path):
        generated_mask = cv2.imread(mask,cv2.IMREAD_UNCHANGED)
        celeba_img = cv2.imread(img_path)

        # apply mask over celeba_image
        overlay_image_alpha(celeba_img,
                    generated_mask[:, :, 0:3],
                    (0, 0),
                    generated_mask[:, :, 3] / 255.0)

        # write new image in output_folder
        cv2.imwrite(output_folder + '/' + mask_basename, celeba_img)

这个代码不全,在readme也没有说明,开源的代码几乎是没有什么价值!

目录
相关文章
飞机大战
飞机大战完整版。
239 1
|
编解码 人工智能 缓存
通义万相重磅升级,成功登顶VBench,阿里云百炼邀您第一时间体验
阿里云通义万相推出2.1视频生成模型,大幅提升复杂运动、物理规律遵循及艺术表现,在权威评测VBench中夺冠。新模型采用自研VAE和DiT架构,增强时空上下文建模,实现更稳定的大幅度肢体运动和多对象生成。通义万相支持中英文文字特效生成,满足广告设计、短视频等创作需求,并在阿里云百炼平台开放API调用,提供免费试用资源。
1456 0
|
存储 人工智能 搜索推荐
Memobase:开源AI长期记忆系统,让AI真正记住每个用户的秘密武器
Memobase 是一个开源的长期记忆系统,专为生成式 AI 应用设计,通过用户画像和时间感知记忆功能,帮助 AI 记住、理解并适应用户需求。
2569 0
|
存储 数据库
ODOO中的Related字段及Computed字段原理
难理解的参数: Store = True 原因:ODOO 默认情况下不存储计算字段。(因为,可以减少数据库的开销)。但你知道的, 当您希望能够执行某个函数,需要从数据库中调用此值时,这会导致问题。要修复此问题,odoo 在计算字段上提供 store=true 标志。
3974 0
|
应用服务中间件 Android开发
Server Tomcat v9.0 Server at localhost failed to start问题的解决
Server Tomcat v9.0 Server at localhost failed to start问题的解决
1522 0
|
存储 关系型数据库 MySQL
Mysql行格式DYNAMIC和COMPACT区别
总之,选择哪种行格式取决于具体的应用场景,如数据类型分布、读写比例、存储与性能需求等。在处理大量文本或二进制数据且对存储空间敏感的应用中,DYNAMIC格式可能是更好的选择;而对于混合型数据且对读取性能有一定要求的场景,COMPACT格式可能更合适。在设计数据库时,评估这些因素并进行适当测试,可以帮助确定最适合的行格式。
964 0
|
Shell 网络安全
bash 和 zsh 命令行终端中的快捷键
bash 和 zsh 命令行终端中的快捷键
|
安全 网络安全 数据安全/隐私保护
网络安全攻防技术与实践:防御黑客入侵的有效手段
在当今互联网高速发展的时代,网络安全问题越来越受到人们的重视。黑客攻击已经成为一个严重的问题,给我们的个人隐私和企业的商业机密带来了极大的风险。本文将介绍一些网络安全攻防技术,以帮助读者加强网络安全意识,保护自己的信息安全。
|
存储 机器学习/深度学习 人工智能
社区供稿 | Yuan2.0千亿大模型在通用服务器上的高效推理实现:以NF8260G7服务器为例
浪潮信息联合Intel在IPF大会上发布了可运行千亿参数大模型的AI通用服务器,首次实现了单机通用服务器,即可运行千亿参数大模型。并在发布现场演示了基于NF8260G7服务器进行yuan2.0-102B模型在代码编写、逻辑推理等高难度问题上的实时推理效果,引起了业界广泛的关注。本文将详细解读yuan2.0-102B模型在NF8260G7服务器上进行高效实时推理的原理和技术路径。
|
开发框架 JSON 前端开发
循序渐进VUE+Element 前端应用开发(7)--- 介绍一些常规的JS处理函数
循序渐进VUE+Element 前端应用开发(7)--- 介绍一些常规的JS处理函数

热门文章

最新文章