一行命令自动戴上口罩

基于Keras+YOLOv3的口罩佩戴情况检测系统【超详细!!!保姆级教程】 本篇文章介绍的系统是博主在新冠肺炎爆发的社会背景下完成的毕业设计内容,该系统有一个还算好看的UI界面(PyQt5实现),在界面中,上传本地图片、视频或者调用电脑摄像头测试模型,能够识别图像中的人脸是否配戴了口罩。该设计用的是目前比较先进的YOLOv3算法,其实就是基于深度学习的目标检测只不过数据集换成了自己的而已。复现就很简单,算法都是别人设计好的,我们只要等待电脑自己训练就好了。废话不多说啦,接下来就跟着博主一起实现它~ 阅读详情

前言

2019 年底开始蔓延的新型肺炎疫情牵动人心,作为个体,我们力所能及的就是尽量待在家中少出门。

看到一些朋友叫设计同学帮忙给自己的头像戴上口罩,作为技术人,心想一定还有更多人有这样的诉求,不如开发一个简单的程序来实现这个需求,也算是帮助设计姐姐减少工作量。

于是花了些时间,写了一个叫做 face-mask[1] 的命令行工具,能够轻松的给图片中的人像戴上口罩,而且口罩的方向和大小都是适应人脸的哦~

使用

安装 face-mask

确保 Python 版本在 3.6 及以上

pip install face-mask

使用 face-mask

直接指定图片路径即可为图片中的人像戴上口罩,并会生成一个新的图片(额外有 -with-mask 后缀):

face-mask /path/to/face/picture

通过指定 --show 选项,还可以使用默认图片查看器打开新生成的图片:

face-mask /path/to/face/picture --show

效果

给一个人戴上口罩

给多个人戴上口罩

给动漫人物戴上口罩

实现

思路

要想实现上面的效果,我们应该怎么做?不妨这么想:

  • 首先是识别出人的鼻子(nose_bridge)和脸轮廓(chin)

  • 通过脸轮廓确定出脸左点(chin_left_point)、脸底点(chin_bottom_point)和脸右点(chin_right_point)

  • 由鼻子和脸底点确定口罩大小的高度、中心线

  • 将口罩左右平均分为两个部分

    • 调整左口罩大小,宽度为脸左点到中心线的距离

    • 调整右口罩大小,宽度为脸右点到中心线的距离

    • 合并左右口罩为新口罩

  • 旋转新口罩,角度为中心线相对于 y 轴的旋转角

  • 将新口罩放在原图适当位置

关于人脸识别,可以使用 face_recognition[2] 库进行识别。

关于图像处理,可以使用 Pillow[3] 库进行处理。

代码

有了思路之后,实现就是件相对轻松的事情。不过对库的熟悉和图片的变换计算可能要花些时间。

详细的代码请阅读 face-mask[4]。这里仅说明下最核心的步骤。

人脸识别
import face_recognition

face_image_np = face_recognition.load_image_file('/path/to/face/picture')
face_landmarks = face_recognition.face_landmarks(face_image_np)

借助 face_recognition 库可以轻松的识别出人像,最终得到的 face_landmarks 是一个列表,里面的每个 face_landmark 都表示一个人像数据。

face_landmark 是一个字典,其中的键表示人像特征,值表示该特征的点的列表。比如:

  • 键 nose_bridge 表示鼻梁

  • 键 chin 表示脸颊

我们需要根据每个 face_landmark,给对应的头像戴上口罩。

获得鼻子和脸颊的特征点
import numpy as np

nose_bridge = face_landmark['nose_bridge']
nose_point = nose_bridge[len(nose_bridge) * 1 // 4]
nose_v = np.array(nose_point)

chin = face_landmark['chin']
chin_len = len(chin)
chin_bottom_point = chin[chin_len // 2]
chin_bottom_v = np.array(chin_bottom_point)
chin_left_point = chin[chin_len // 8]
chin_right_point = chin[chin_len * 7 // 8]

通过上述代码,我们获得了:

  • 表示上鼻梁的一个点 nose_point

  • 表示脸左点 chin_left_point

  • 表示脸右点 chin_right_point

  • 表示脸底点 chin_bottom_point

拆分、缩放和合并口罩
from PIL import Image

_face_img = Image.fromarray(face_image_np)
_mask_img = Image.open('/path/to/mask/picture')

# split mask and resize
width = _mask_img.width
height = _mask_img.height
width_ratio = 1.2
new_height = int(np.linalg.norm(nose_v - chin_bottom_v))

# left
mask_left_img = _mask_img.crop((0, 0, width // 2, height))
mask_left_width = get_distance_from_point_to_line(chin_left_point, nose_point, chin_bottom_point)
mask_left_width = int(mask_left_width * width_ratio)
mask_left_img = mask_left_img.resize((mask_left_width, new_height))

# right
mask_right_img = _mask_img.crop((width // 2, 0, width, height))
mask_right_width = get_distance_from_point_to_line(chin_right_point, nose_point, chin_bottom_point)
mask_right_width = int(mask_right_width * width_ratio)
mask_right_img = mask_right_img.resize((mask_right_width, new_height))

# merge mask
size = (mask_left_img.width + mask_right_img.width, new_height)
mask_img = Image.new('RGBA', size)
mask_img.paste(mask_left_img, (0, 0), mask_left_img)
mask_img.paste(mask_right_img, (mask_left_img.width, 0), mask_right_img)

上述代码主要做了如下内容:

  • 将口罩左右平均分为两个部分

  • 调整左口罩大小,宽度为脸左点到中心线的距离 * 宽度系数 1.2

  • 调整右口罩大小,宽度为脸右点到中心线的距离 * 宽度系数 1.2

  • 合并左右口罩为新口罩

get_distance_from_point_to_line 用来获取一个点到一条线的距离,具体实现可看源代码。

width_ratio 是宽度系数,用来适当扩大口罩。原因我们是根据脸颊的宽度计算口罩的宽度,但口罩是待在耳朵上的,真实宽度应该要更宽。

旋转口罩、并放到原图适当位置
# rotate mask
angle = np.arctan2(chin_bottom_point[1] - nose_point[1], chin_bottom_point[0] - nose_point[0])
rotated_mask_img = mask_img.rotate(angle, expand=True)

# calculate mask location
center_x = (nose_point[0] + chin_bottom_point[0]) // 2
center_y = (nose_point[1] + chin_bottom_point[1]) // 2

offset = mask_img.width // 2 - mask_left_img.width
radian = angle * np.pi / 180
box_x = center_x + int(offset * np.cos(radian)) - rotated_mask_img.width // 2
box_y = center_y + int(offset * np.sin(radian)) - rotated_mask_img.height // 2

# add mask
_face_img.paste(mask_img, (box_x, box_y), mask_img)

上述代码主要做了如下内容:

  • 旋转新口罩,角度为中心线相对于 y 轴的旋转角

  • 计算口罩应该放置的坐标

  • 将新口罩放在原图的计算出的坐标下

最后就是将新图片保存到本地路径,代码不再展示。

总结

我们借助 face_recognition 库可以轻松的识别出人像,然后根据脸颊的宽度和鼻梁位置计算出口罩的大小、方向和位置,并最终生成出戴上口罩的图片。整个过程并不复杂,但在坐标计算上要格外小心,如此,我们便打造了一个短小精悍的“自动戴上口罩”程序!


菜鸟学Python网站全面开通了

www.cainiaopython.com

Python心得和技巧:

零基础学了8个月的Python,到底有啥感悟

我珍藏的一些好的Python代码,技巧

菜鸟写Python程序,如何从新手变老手

菜鸟必收藏,13个Python惯用小技巧

点击下面阅读原文 直达 菜鸟Python网站 (近400篇原创)

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之七 简单进行人脸检测并添加面具特效实现 Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。Python是一种解释型脚本语言,可以应用于以下领域: Web 和 Internet开发、科学计算和统计、人工智能、教育、桌面界面开发、软件开发、后端开发、网络爬虫。这里使用 Python 基于 OpenCV 进行视觉图像处理,...... 阅读详情

相关推荐

基于Python的人脸自动戴口罩系统

项目描述参见:https://handsome-man.blog.csdn.net/article/details/104174562

Python实战——为人脸照片添加口罩

为你的头像添加口罩吧

不兼容旧版本 2万+

白盒测试逻辑覆盖之谓词覆盖、子句覆盖、三类有效字句覆盖等知识点

本篇笔记会简化书本上的概念,用容易理解的方式来说明,有些例子打字麻烦,我会直接放图片! 目录 基础知识: 谓词覆盖predicate coverage 子句覆盖 clause coverage 组合覆盖 combinatorial coverage 有效字句覆盖Active Clause Coverage 广义有效子句覆盖(General Active Clause Coverage) 相关性有效子句覆盖(Correlated Active Clause Coverage) 限制性有效

weixin_46019681的博客 2666

使用Python+OpenCV+dlib为人脸生成口罩

本文使用OpenCV dlib库生成口罩口罩已经被证明是防止COVID-19传播的最好的防御措施之一,然而,这也导致了基于面部特征(包括鼻子、嘴和下巴线)的面部识别算法的失效。在全球有传...

深度学习与计算机视觉 1714

Android存储方案对比(SharedPreferences 、 MMKV 、 DataStore)

简介:本文介绍了Android开发中常用的键值对存储方案,包括SharedPreferences、MMKV和DataStore,并且对比了它们在性能、并发处理、易用性和稳定性上的特点。通过实际代码示例,帮助开发者根据项目需求选择最适合的存储方案,提升应用性能和用户体验。

LiuYong_01的博客 1800

打包可以在Hadoop 3.3.1和Hive 3.1.2上使用的Tez 0.10.1 minimal

编译打包可以在Hadoop 3.3.1和Hive 3.1.2上使用的Tez 0.10.1

qq_42013533的博客 2618

基于人脸识别的“带口罩”系统-python完整实现

目录 0 前言 1 设计目的 2 任务与要求 3 设计原理 3.1 人脸检测与人脸识别概述 3.2人脸表征检测(五官定位) 3.3 dlib库的简介 3.4 Tkinter的简介 4 系统的建立 4.1 界面设计 4.2 五官识别 5 系统运行结果 5.1 口罩示意图 5.2 系统的结果展示 6 建议 7 参考文献 附 录 五官定位代码 系统建立代码 0 前言 新型冠状病毒展现出全球化流行和蔓延的趋势,这提醒我们:传染病防治在今后相当长时间内仍是疾病预防控制工作的重

weixin_43442778的博客 8824

从零构建AI辅助逆向分析环境:JADX-MCP与LLM的实战集成指南

本文详细介绍了如何从零构建AI辅助逆向分析环境,通过集成JADX-MCP与LLM技术,提升Android应用逆向工程效率。文章涵盖环境搭建、插件安装、MCP服务器配置及实战案例分析,帮助开发者快速掌握AI在代码理解、漏洞挖掘和自动化文档生成中的应用。

weixin_27875131的博客 840

一行命令自动给图片戴上口罩,硬核操作!

作者|Prodesire来源 | Prodesire(ID:Prodesire)2019 年底开始蔓延的新型肺炎疫情牵动人心,作为个体,我们力所能及的就是尽量待在家中少出门。看到一些...

程序人生的博客 2850

Web3前沿技术的智能合约安全审计

随着Web3技术的快速发展,智能合约作为区块链应用的核心组件,其安全性问题日益突出。本文旨在系统性地介绍智能合约安全审计的技术体系,帮助开发者理解智能合约安全风险,掌握安全审计的方法论和工具链。智能合约安全的基本概念常见漏洞类型及其原理安全审计的技术方法实际审计案例分析安全审计工具和资源首先介绍基本概念和背景然后分析常见漏洞和安全风险接着详细讲解安全审计技术提供实际案例和代码示例最后讨论工具资源和未来趋势智能合约:运行在区块链上的自执行程序,代码即法律安全审计。

AI天才研究院 1548

js逆向实战:爬取淘宝男装商品

本文介绍了一个淘宝商品数据爬取程序的技术实现方案。该程序通过分析淘宝H5页面接口,实现了商品名称、价格、销量等关键信息的抓取,并支持图片下载功能。核心内容包括:1. 使用Request库发送HTTP请求获取数据;2. 通过逆向分析淘宝的签名算法(MD5加密)生成合法请求;3. 解析JSON数据并提取商品信息;4. 处理分页参数实现多页数据爬取;5. 将数据保存为CSV文件并下载商品图片。程序还实现了反爬虫绕过、错误处理、文件管理等辅助功能,完整展示了从数据采集到存储的全过程。

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 1574

delphi listview怎么自动宽度_一行命令自动戴上口罩

IT服务圈儿有温度、有态度的IT自媒体平台来源:Prodesire(ID:Prodesire)作者:Prodesire前言2019 年底开始蔓延的新型肺炎疫情牵动人心,作为个体,我们力所能及的就是尽量待在家中少出门。看到一些朋友叫设计同学帮忙给自己的头像戴上口罩,作为技术人,心想一定还有更多人有这样的诉求,不如开发一个简单的程序来实现这个需求,也算是帮助设计姐姐减少工作量。于是花了些时间...

weixin_36232899的博客 259

CUDA-GDB(11)——调试示例演练

本博客包含三个CUDA-GDB的演练示例: ​​​​▶ Example: bitreverse ▶ Example: autostep ▶ Example: MPI CUDA Application

AI-安全-功耗 1515

golang 左右合并图片_一行命令自动给图片戴上口罩,硬核操作

作者 | Prodesire来源 | Prodesire(ID:Prodesire)2019 年底开始蔓延的新型肺炎疫情牵动人心,作为个体,我们力所能及的就是尽量待在家中少出门。看到一些朋友叫设计同学帮忙给自己的头像戴上口罩,作为技术人,心想一定还有更多人有这样的诉求,不如开发一个简单的程序来实现这个需求,也算是帮助设计姐姐减少工作量。于是花了些时间,写了一个叫做 face-mask[1] 的命令...

weixin_35742852的博客 535

华为od 面试八股文_Spring_03_含答案

控制反转IOC是一个很大的概念,可以用不同的方式来实现。其主要实现方式有两种:依赖注入和依赖查找依赖注入;

MISAYAONE的博客 2343

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

python可以写什么视觉特效_Python实现视觉特效:一行命令给头像自动戴上口罩的案例...

Python实现视觉特效:一行命令给头像自动戴上口罩的案例发布时间:2020-07-23 16:22:40来源:亿速云阅读:90作者:清晨小编给大家分享一下Python实现视觉特效:一行命令给头像自动戴上口罩的案例,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!Python 实现视觉特效:秒变超级赛亚人face-mask的命令行工具,能够轻松的给图片中的人像戴上口罩,而且口罩的方向和大...

weixin_30878111的博客 2674

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

2020 我只需要一行命令,就可给头像戴上口罩!【必看】

文章目录1、前言2、使用安装 face-mask使用 face-mask效果 1、前言 2019 年底开始蔓延的新型肺炎疫情牵动人心,作为个体,我们力所能及的就是尽量待在家中少出门,保护自己的同时也是在为国家做贡献,喜欢宅的我正好抽空学习,今天发现了这个神奇代码!分享一波!。 看到大多数人头像都带上了口罩,那么作为程序员来说,我们不需要P图,只需要一行代码解决,用到的就是 face-mask[1]...

超逸の学习技术博客 1963

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

python怎么跳转到某一行代码_一行 Python 代码给头像戴上口罩

(给Python开发者加星标,提升Python技能)来源:Prodesire前言新冠肺炎疫情牵动人心,作为个体,我们力所能及的就是尽量待在家中少出门。看到一些朋友叫设计同学帮忙给自己的头像戴上口罩,作为技术人,心想一定还有更多人有这样的诉求,不如开发一个简单的程序来实现这个需求,也算是帮助设计姐姐减少工作量。于是花了些时间,写了一个叫做face-mask[1]的命令行工具,能够轻松的...

weixin_39968490的博客 897

手把手教你用Python给头像戴上口罩

前言 2019 年底开始蔓延的新型肺炎疫情牵动人心,作为个体,我们力所能及的就是尽量待在家中少出门。看到一些朋友叫设计同学帮忙给自己的头像戴上口罩,作为技术人,心想一定还有更多人有这样的...

Python之禅的专栏 1586

图片宽度python_使用这个 Python 库,只需一行命令,给头像戴上口罩!

?“Python猫” ,一个值得加星标的公众号花下猫语:二月来了,再过两天就是立春了,新的日子,新的气象,新的希望就要来临了。同学们,坚持住!如今之计是继续做好防护。今天给大家分享一篇文章,作者发布了一个库,可轻松给图片内的头像戴上口罩,推荐尝试!来源:Prodesire公众号 |作者:Prodesire前言2019 年底开始蔓延的新型肺炎疫情牵动人心,作为个体,我们力所能及的就是尽...

weixin_28745067的博客 135

用Python给你的女神带上口罩~

前言 2019 年底开始蔓延的新型肺炎疫情牵动人心,作为个体,我们力所能及的就是尽量待在家中少出门。 看到一些朋友叫设计同学帮忙给自己的头像戴上口罩,作为技术人,心想一定还有更多人有这样的诉求,不如开发一个简单的程序来实现这个需求,也算是帮助设计姐姐减少工作量。 ​ 于是花了些时间,写了一个叫做 face-mask[1] 的命令行工具,能够轻松的给图片中的人像戴上口罩,而且口罩的方向和大小...

Python学习Q群696455390 320

人脸识别镜像实测:Retinaface+CurricularFace在戴口罩、侧脸场景下的表现

本文介绍了如何在星图GPU平台上自动化部署Retinaface+CurricularFace人脸识别模型镜像,快速构建人脸比对服务。该镜像集成了人脸检测与特征提取功能,能有效应对戴口罩、侧脸等复杂场景,适用于门禁考勤、身份核验等实际应用,助力开发者便捷集成AI能力。

weixin_35516624的博客 107

如何使用Python给照片自动带上口罩,我是从入门放弃到爱不释手的

这是学习笔记的第2205篇文章读完需要9分钟速读仅需7分钟昨天无意中看到一条比较有意思的文章,是可以通过Python程序给照片里的人戴上口罩,看到之后,还是挺惊喜的,也想拿过来试试。...

杨建荣的学习笔记 1057

人脸检测新突破:cv_resnet101_face-detection_cvpr22papermogface对戴口罩人脸识别率达91.3%

本文介绍了基于星图GPU平台,可自动化部署高精度人脸检测镜像cv_resnet101_face-detection_cvpr22papermogface。该镜像基于CVPR 2022的MogFace模型,在佩戴口罩等复杂场景下识别率高达91.3%,能有效应用于合影人数自动统计、安防图像分析等本地化视觉任务。

weixin_29215509的博客 591
上一篇: 帮铁粉脱单|【深圳女】No.14|93年,英语老师,本科157,喜欢健身,活泼开朗
下一篇: 1月份Github上最热门Python开源项目!
菜鸟学Python
博客等级 码龄9年 8086粉丝 571原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值