使用京东FaceX-Zoo sdk生成戴口罩数据集
使用京东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生成戴口罩数据集相关推荐
- Pytorch实现戴口罩人脸检测和戴口罩识别(含训练代码 戴口罩人脸数据集)
Pytorch实现戴口罩人脸检测和戴口罩识别(含训练代码 戴口罩人脸数据集) 目录 Pytorch实现戴口罩人脸检测和戴口罩识别(含训练代码 戴口罩人脸数据集) 1.戴口罩识别的方法 (1)基于多类别 ...
- 京东AI:戴口罩人脸识别pytorch开源库
项目介绍 该项目是JDAI开源的基于PyTorch的人脸识别工具箱,提供了一个包括目前主流backbone和head的的training module,一个标准化的人脸识别evaluation mod ...
- 基于Python深度学习的人脸识别考勤(戴口罩、多人)
该"基于深度识别的人脸识别线下课堂考勤"系统有"人脸识别考勤","考勤信息统计"等主要功能组成,其中戴口罩识别及多人识别均可成功实现.涉及& ...
- 疫情加速百度人脸识别变革:戴口罩也能准确识别,迅速上线
2020-03-20 11:49:14 十三 发自 凹非寺 量子位 报道 | 公众号 QbitAI 疫情之下,口罩识别有多难,问问你的iPhone用户朋友就知道了. 在"刷脸时代" ...
- 不戴口罩还想出门?硬核口罩佩戴检测模型向你发出警告
晓查 发自 云凹非寺 量子位 报道 | 公众号 QbitAI 出门佩戴口罩,是我们每个人为抗击新冠肺炎疫情必做的一件小事. 督促每个人戴好口罩,对于抗疫来说是很重要的管理工作,然而人力去监督在当下显 ...
- iOS推送:要支持戴口罩解锁了!以为是黑科技,原来是骗我买iWatch...
疫情期间,大家都养成了出门戴口罩的习惯.戴口罩可以有效隔离病菌,但是对于一些需要Face ID 面部识别的app来说,每次需要把口罩拉上拉下的,也蛮不方便.就像iphone每次解锁就需要拉下口罩. 然 ...
- Python 自动给人脸 戴口罩
这个开源项目可以自动给人脸戴口罩,不过是完整的口罩. https://github.com/jacke121/MaskTheFace 效果图: 下面是网上搜到的方法: 检测人脸关键点 引入包 dlib ...
- 戴口罩也能刷门禁?疫情下AnalyticDB亮出社区管理的宝藏神器!
简介: 戴口罩也能刷门禁?疫情下AnalyticDB亮出社区管理的宝藏神器! 1.背景介绍 疫情肆虐,有效隔离是尽快战胜病毒的有效手段,多个地方政府都提出了严格的居民出行管理条例,例如杭州市余杭区2月 ...
- 【机器学习】 - 使用dlib进行人脸定位,人脸检测,给人脸图片戴口罩
detector = dlib.get_frontal_face_detector() 功能:人脸检测画框 参数:无 返回值:默认的人脸检测器 faces = detector(img_gray, 0 ...
最新文章
- 女朋友什么的都是浮云,代码才是真爱!
- iframe嵌套网页
- word文档无法连接服务器,sql数据库无法连接服务器解决办法绝对有效
- STM32F407 I2C 个人笔记
- boost::hawick_circuits用法的测试程序
- Android组件的使用:RadioButton
- file does not start with RIFF id(python)
- PCIe总线基本概念
- 京东6月18日正式登陆港交所 港股暗盘开涨超7%
- 用php动态创建图像,php利用imagecreatetruecolor动态生成高清图片代码
- linux镜像下载和vmware虚拟主机部署
- Dos下的edit命令
- 云课堂智慧职教网页版登录入口_云课堂智慧职教网页版
- 华为平板android版本如何升级,华为平板怎么升级替换系统 华为平板刷机的教程...
- org.apache.jasper.JasperException: /app/jsonp.jsp(1,2) Page-encoding specified in jsp-property-grou
- c语言鼠标滚动条,xtraScrollableControl 滚动条随鼠标滚动
- 计算机命令行操作系统,什么是命令提示符以及如何打开它
- SQL 注入速查表大全
- R平方值python实现
- 衷心感谢各位给我投的票!