使用京东FaceX-Zoo sdk生成戴口罩数据集

最近要做戴口罩的人脸识别,事实上当前开源的模型都不那么尽如人意,所以要优化算法再重新训练。

首先要解决的就是数据集的问题。因为从网络中能获取到的真实戴口罩人脸图像比较少,因此需要想办法生成一些戴口罩的人脸数据。这里推荐京东开源的FaceX-Zoo框架(https://gitee.com/yangdashi/FaceX-Zoo/tree/main#/yangdashi/FaceX-Zoo/blob/main/addition_module/face_mask_adding/FMA-3D),它支持人脸检测、人脸对齐和人脸口罩生成,这里就是使用了以上三种方法生成了戴口罩的人脸数据集。

算法流程:
生成效果:

这里在这位博主开源的https://github.com/zengwb-lx/Face_Mask_Add基础上进行开发,他成功搭建了环境并调用起FaceX-Zoo的sdk,最终实现了单张人脸图片的口罩生成。我在其基础上,增加了批处理、随机抽样,并支持多核处理。

下面贴上核心代码并注意讲解。

#!/usr/bin/python3
# -*- coding: utf-8 -*-import logging.configlogging.config.fileConfig("./config/logging.conf")
logger = logging.getLogger('api')import os
import random
import shutil
from tqdm import trange
from multiprocessing import Pool
import argparse
import cv2
import numpy as np
from skimage.io import imsave
from face_det import FaceDet
from face_align import FaceAlign
from face_masker import FaceMaskerdef separate_database():List_imgs = os.listdir(args.input_folder)Len_imgs = len(List_imgs)  # 数据集长度if args.num_cores == 1:  # 单核subset = List_imgs[:Len_imgs // 1]List_subsets = [subset]if args.num_cores == 2:  # 双核,将所有数据集分成两个子数据集subset1 = List_imgs[:Len_imgs // 2]subset2 = List_imgs[Len_imgs // 2:]List_subsets = [subset1, subset2]elif args.num_cores == 4:  # 四核,将所有数据集分成四个子数据集subset1 = List_imgs[:Len_imgs // 4]subset2 = List_imgs[Len_imgs // 4: Len_imgs // 2]subset3 = List_imgs[Len_imgs // 2: (Len_imgs * 3) // 4]subset4 = List_imgs[(Len_imgs * 3) // 4:]List_subsets = [subset1, subset2, subset3, subset4]elif args.num_cores >= 8:  # 八核以上,将所有数据集分成八个子数据集subset1 = List_imgs[:Len_imgs // 8]subset2 = List_imgs[Len_imgs // 8: Len_imgs // 4]subset3 = List_imgs[Len_imgs // 4: (Len_imgs * 3) // 8]subset4 = List_imgs[(Len_imgs * 3) // 8: Len_imgs // 2]subset5 = List_imgs[Len_imgs // 2: (Len_imgs * 5) // 8]subset6 = List_imgs[(Len_imgs * 5) // 8: (Len_imgs * 6) // 8]subset7 = List_imgs[(Len_imgs * 6) // 8: (Len_imgs * 7) // 8]subset8 = List_imgs[(Len_imgs * 7) // 8:]List_subsets = [subset1, subset2, subset3, subset4,subset5, subset6, subset7, subset8]return List_subsetsdef generate_mask(thread_index, input_folder, List_imgs):# load modelface_detector = FaceDet(thread_index)face_align = FaceAlign(thread_index)face_masker = FaceMasker(True)for i in trange(len(List_imgs)):subfolder = List_imgs[i]images_path = os.path.join(input_folder, subfolder)output_subfolder = args.output_folder + subfolderif not os.path.exists(output_subfolder):os.mkdir(output_subfolder)for file in os.listdir(images_path):file_path = os.path.join(images_path, file)ran = random.randint(0, 9)if ran % 10 < args.random_ratio * 10:# 添加口罩存储图片image = cv2.imread(file_path, cv2.IMREAD_COLOR)bboxs = face_detector(image)image_show = image.copy()face_lms = []for box in bboxs:landmarks = face_align(image, box)lms = np.reshape(landmarks.astype(np.int32), (-1))face_lms.append(lms)cv2.rectangle(image_show, (box[0], box[1]), (box[2], box[3]), (0, 0, 255), 2)for (x, y) in landmarks.astype(np.int32):cv2.circle(image_show, (x, y), 2, (255, 0, 0), -1)# face maskersave_dir = output_subfolder + "/" + "masked_" + filemask_template_name = str(random.randint(0, 7)) + ".png"# 未检测到人脸直接跳过if len(face_lms) < 1:continue# masked one facenew_image = face_masker.add_mask_one(image, face_lms[0], mask_template_name, mask_template_name)imsave(save_dir, new_image)else:save_dir = output_subfolder + "/" + file# 不添加口罩直接复制图片shutil.copyfile(file_path, save_dir)def start_job():p = Pool(args.num_cores)List_subsets = separate_database()# 对每个进程分配工作for i in range(args.num_cores):p.apply_async(generate_mask, args=(i, args.input_folder, List_subsets[i]))p.close()p.join()if __name__ == '__main__':p = argparse.ArgumentParser()p.add_argument('-r', '--random_ratio', type=float, help='ratio of masked face')p.add_argument('-i', '--input_folder', type=str, help='input path')p.add_argument('-o', '--output_folder', type=str, help='output path')p.add_argument('-c', '--num_cores', type=int, default=1, help='number of GPU cores')args = p.parse_args()if args.random_ratio > 1:args.random_ratio = 1elif args.random_ratio < 0:args.random_ratio = 0if not os.path.exists(args.input_folder):print("Input path not exist!")exit()if not os.path.exists(args.output_folder):os.mkdir(args.output_folder)start_job()

运行指令:

python add_all_demo.py -r 0.1 -i ~/ -o ~/  -c 8  # 说明:-r 抽样率 -i 输入路径 -o 输出路径 -c 调用gpu核心数
  • 随机抽样

因为我只需要数据集中存在10%比例的戴口罩人脸图像,因此这里使用了随机数:

ran = random.randint(0, 9)
if ran % 10 < args.random_ratio * 10:

随机到范围内的就戴上口罩,否则就直接转存到指定目录下。这样做是模拟真实使用情况,具体数值自行调整。

  • 批处理

批处理前,通常要先把下载下来的数据集转换格式。我所下载的faces_webface_112x112和glint360k的数据格式都是.rec .idx .lst .bin格式的混合文件,需要先通过mxnet转换成图片格式。

随后读取数据,并按照标签存放到对应指定位置。

  • 多核处理

这里多核处理的方式是按照gpu核心数分割数据集,然后使用multiprocess的线程池Pool和apply_async 模块进行多进程操作。对应的要修改指定gpu设备的方法,将进程索引分配给对应函数,使其调用起指定的gpu。

综上,我们就完成了戴口罩人脸数据集的制作。

使用京东FaceX-Zoo sdk生成戴口罩数据集相关推荐

  1. Pytorch实现戴口罩人脸检测和戴口罩识别(含训练代码 戴口罩人脸数据集)

    Pytorch实现戴口罩人脸检测和戴口罩识别(含训练代码 戴口罩人脸数据集) 目录 Pytorch实现戴口罩人脸检测和戴口罩识别(含训练代码 戴口罩人脸数据集) 1.戴口罩识别的方法 (1)基于多类别 ...

  2. 京东AI:戴口罩人脸识别pytorch开源库

    项目介绍 该项目是JDAI开源的基于PyTorch的人脸识别工具箱,提供了一个包括目前主流backbone和head的的training module,一个标准化的人脸识别evaluation mod ...

  3. 基于Python深度学习的人脸识别考勤(戴口罩、多人)

    该"基于深度识别的人脸识别线下课堂考勤"系统有"人脸识别考勤","考勤信息统计"等主要功能组成,其中戴口罩识别及多人识别均可成功实现.涉及& ...

  4. 疫情加速百度人脸识别变革:戴口罩也能准确识别,迅速上线

    2020-03-20 11:49:14 十三 发自 凹非寺 量子位 报道 | 公众号 QbitAI 疫情之下,口罩识别有多难,问问你的iPhone用户朋友就知道了. 在"刷脸时代" ...

  5. 不戴口罩还想出门?硬核口罩佩戴检测模型向你发出警告

    晓查 发自 云凹非寺  量子位 报道 | 公众号 QbitAI 出门佩戴口罩,是我们每个人为抗击新冠肺炎疫情必做的一件小事. 督促每个人戴好口罩,对于抗疫来说是很重要的管理工作,然而人力去监督在当下显 ...

  6. iOS推送:要支持戴口罩解锁了!以为是黑科技,原来是骗我买iWatch...

    疫情期间,大家都养成了出门戴口罩的习惯.戴口罩可以有效隔离病菌,但是对于一些需要Face ID 面部识别的app来说,每次需要把口罩拉上拉下的,也蛮不方便.就像iphone每次解锁就需要拉下口罩. 然 ...

  7. Python 自动给人脸 戴口罩

    这个开源项目可以自动给人脸戴口罩,不过是完整的口罩. https://github.com/jacke121/MaskTheFace 效果图: 下面是网上搜到的方法: 检测人脸关键点 引入包 dlib ...

  8. 戴口罩也能刷门禁?疫情下AnalyticDB亮出社区管理的宝藏神器!

    简介: 戴口罩也能刷门禁?疫情下AnalyticDB亮出社区管理的宝藏神器! 1.背景介绍 疫情肆虐,有效隔离是尽快战胜病毒的有效手段,多个地方政府都提出了严格的居民出行管理条例,例如杭州市余杭区2月 ...

  9. 【机器学习】 - 使用dlib进行人脸定位,人脸检测,给人脸图片戴口罩

    detector = dlib.get_frontal_face_detector() 功能:人脸检测画框 参数:无 返回值:默认的人脸检测器 faces = detector(img_gray, 0 ...

最新文章

  1. 女朋友什么的都是浮云,代码才是真爱!
  2. iframe嵌套网页
  3. word文档无法连接服务器,sql数据库无法连接服务器解决办法绝对有效
  4. STM32F407 I2C 个人笔记
  5. boost::hawick_circuits用法的测试程序
  6. Android组件的使用:RadioButton
  7. file does not start with RIFF id(python)
  8. PCIe总线基本概念
  9. 京东6月18日正式登陆港交所 港股暗盘开涨超7%
  10. 用php动态创建图像,php利用imagecreatetruecolor动态生成高清图片代码
  11. linux镜像下载和vmware虚拟主机部署
  12. Dos下的edit命令
  13. 云课堂智慧职教网页版登录入口_云课堂智慧职教网页版
  14. 华为平板android版本如何升级,华为平板怎么升级替换系统 华为平板刷机的教程...
  15. org.apache.jasper.JasperException: /app/jsonp.jsp(1,2) Page-encoding specified in jsp-property-grou
  16. c语言鼠标滚动条,xtraScrollableControl 滚动条随鼠标滚动
  17. 计算机命令行操作系统,什么是命令提示符以及如何打开它
  18. SQL 注入速查表大全
  19. R平方值python实现
  20. 衷心感谢各位给我投的票!

热门文章

  1. 【报告分享】2020中国教育培训移动应用发展研究报告-TalkingData(附下载)
  2. docker容器下载vim
  3. Python语言程序设计笔记
  4. 全民编程新时代—TPYBoard重磅产品TurnipBit来了!
  5. Dream_Chaser队训练赛第一场 K题
  6. 多个领域同步崛起,3D建模师竟成最后的大赢家?
  7. 怎么区别业务架构、软件架构、系统架构、解决方案架构、企业架构?
  8. gis里创建要素面板怎么打开_简单又高效 —— 用GIS快速完成控规编制
  9. 小白踩坑记-Redis的安装与使用
  10. 2022年国赛建模评估