当前位置: 首页 > article >正文

Face Analysis WebUI实战教程:结合Pillow实现检测结果图自动裁剪保存

Face Analysis WebUI实战教程结合Pillow实现检测结果图自动裁剪保存你是不是也遇到过这样的烦恼用Face Analysis WebUI分析了一堆照片得到了带有人脸框和关键点的结果图但每次想单独保存某个人脸时都得手动截图既麻烦又容易出错。今天我就来分享一个超实用的技巧如何结合Python的Pillow库让Face Analysis WebUI自动裁剪并保存检测到的每一张人脸。这个功能特别适合需要批量处理证件照、制作头像集或者从合影中提取单人脸的场景。学完这篇教程你将掌握理解Face Analysis WebUI的核心输出知道它检测到了什么数据在哪里。使用Pillow库进行图像处理学会如何根据坐标精准裁剪图片。实现自动化裁剪保存逻辑将检测结果与图像处理无缝结合一键保存所有人脸。教程会从修改代码开始手把手带你实现这个功能并提供完整的代码示例。即使你之前没怎么接触过图像处理也能轻松跟上。1. 环境准备与项目理解在开始动手之前我们先快速回顾一下Face Analysis WebUI项目并确保你的环境已经就绪。1.1 项目快速回顾Face Analysis WebUI是一个基于Gradio构建的Web应用核心是InsightFace这个强大的人脸分析模型。你上传一张图片它就能告诉你人脸在哪里用矩形框Bounding Box标出来。人脸特征点106个2D点或68个3D点标出眼睛、鼻子、嘴巴的位置。这个人是谁进行人脸识别如果提供了对比库。这个人的属性预测年龄、性别甚至分析头部的朝向偏航、俯仰、翻滚角。它的输出主要分为两部分可视化结果图一张在原图上画好了框、点和标注的新图片。结构化数据一个包含每个人脸位置、关键点坐标、属性信息的列表。我们自动化裁剪功能关键就是要拿到这个“人脸位置”数据。1.2 检查与安装Pillow我们的裁剪功能将依赖Pillow库Python Imaging LibraryPIL的友好分支。Face Analysis WebUI的基础环境通常已经包含了它但我们最好确认一下。打开你的终端进入项目目录例如/root/build然后激活项目所用的Python环境如果你使用了conda或virtualenv。接着运行以下命令检查python -c import PIL; print(fPillow版本: {PIL.__version__})如果成功输出版本号如9.5.0说明Pillow已安装。如果提示ModuleNotFoundError则需要安装pip install Pillow准备工作完成接下来我们进入核心环节修改代码获取数据并实现裁剪。2. 核心代码修改获取人脸坐标并裁剪我们要修改的主要是app.py文件。我们的目标是在WebUI完成人脸分析后除了显示结果还能自动将检测到的每张人脸单独裁剪保存下来。2.1 定位并修改分析函数首先用你喜欢的文本编辑器如vim,nano或VS Code打开/root/build/app.py文件。找到处理图片上传和分析的核心函数。这个函数通常被gr.Interface或gr.Blocks装饰负责接收上传的图片和用户选项然后返回分析结果图和信息。函数名可能类似于analyze_image,process_image或inference。找到这个函数后我们需要在它的内部在生成最终结果图之后、返回数据之前插入我们的裁剪保存逻辑。2.2 编写裁剪保存功能代码假设我们找到的函数结构如下你的实际代码可能略有不同但逻辑相通def analyze_image(input_image, show_landmarksTrue, show_bboxTrue, show_age_genderTrue): 核心分析函数 Args: input_image: 上传的图片PIL Image或numpy array ... 其他选项参数 Returns: result_image: 标注后的结果图 info_text: 显示的信息文本 # ... [原有的代码加载模型、推理、绘制结果图等] ... # 假设经过一系列处理我们得到了 # 1. faces: 一个列表包含所有检测到的人脸信息每个元素有bbox等属性 # 2. result_image: 已经画好框和点的PIL Image对象或numpy数组 # 3. img_cv 或 original_image: 原始图片数据用于裁剪 # 我们新增的裁剪保存逻辑从这里开始 import os from PIL import Image import numpy as np # 1. 准备保存目录 save_dir ./cropped_faces os.makedirs(save_dir, exist_okTrue) # 如果目录不存在就创建 # 2. 确保我们有一个PIL格式的原始图片用于裁剪 # 如果 original_image 是numpy数组OpenCV格式需要转换 if isinstance(original_image, np.ndarray): # OpenCV 使用 BGRPIL 使用 RGB需要转换 original_image_pil Image.fromarray(cv2.cvtColor(original_image, cv2.COLOR_BGR2RGB)) else: # 如果已经是PIL Image直接使用 original_image_pil original_image # 3. 遍历每一张检测到的人脸进行裁剪和保存 cropped_paths [] # 用来记录保存的文件路径方便后续显示或返回 for i, face in enumerate(faces): # 获取人脸框坐标格式通常是 [x1, y1, x2, y2] 或 [x1, y1, w, h] bbox face.bbox.astype(int) # 转换为整数 # 处理不同的bbox格式 if len(bbox) 4: # 假设是 [x1, y1, x2, y2] x1, y1, x2, y2 bbox # 可选给裁剪框加一点边距避免太紧 margin 5 x1 max(0, x1 - margin) y1 max(0, y1 - margin) x2 min(original_image_pil.width, x2 margin) y2 min(original_image_pil.height, y2 margin) else: # 如果是其他格式可能需要调整这里先跳过或打印日志 print(f人脸 {i} 的bbox格式异常: {bbox}) continue # 4. 使用Pillow的crop方法进行裁剪 # crop参数是 (left, upper, right, lower) face_crop original_image_pil.crop((x1, y1, x2, y2)) # 5. 生成文件名并保存 # 文件名可以包含索引、坐标等信息 timestamp int(time.time()*1000) # 获取时间戳避免重名 filename fface_{i1}_{timestamp}.jpg save_path os.path.join(save_dir, filename) face_crop.save(save_path, quality95) # 保存为JPEG质量95% cropped_paths.append(save_path) print(f已保存人脸 {i1} 到: {save_path}) # 可选将裁剪文件的路径信息添加到返回结果中 # 例如可以修改info_text或者通过一个额外的输出组件返回 crop_info f\n\n✅ 已自动裁剪并保存了 {len(faces)} 张人脸图片到 {save_dir} 目录。 # 假设原函数返回 (result_image, info_text) info_text crop_info # 新增逻辑到此结束 # ... [函数原有的返回语句] ... return result_image, info_text代码要点解析导入与目录确保导入了os和PIL.Image。创建了一个cropped_faces目录来存放裁剪后的人脸图。格式统一原始图片在流程中可能是PIL Image或OpenCV的numpy数组。PIL.Image.fromarray和cv2.cvtColor用于确保我们拿到一个RGB格式的PIL对象这是crop方法需要的。坐标处理从人脸信息(face)中提取边界框(bbox)。我们假设它是[x1, y1, x2, y2]格式左上角和右下角坐标。添加一个小的margin边距可以让裁剪出来的人脸更舒适。核心裁剪original_image_pil.crop((x1, y1, x2, y2))是Pillow裁剪图片的核心方法非常简单。保存与记录使用时间戳生成唯一文件名用save方法保存图片。同时记录下保存路径。2.3 适配你的实际代码上面的代码是一个通用模板。你需要根据app.py的实际代码进行微调找到faces和original_image在原有代码中找到存储人脸检测结果的变量可能叫faces,det_faces等和原始图像数据的变量可能叫img,image,orig_img等。确认bbox格式打印一下face.bbox或类似属性的值看看它的格式是[x1,y1,x2,y2]还是[x,y,w,h]中心点坐标和宽高并相应调整裁剪坐标的计算。整合返回信息决定如何告知用户裁剪已完成。最简单的方式是追加信息到info_text中。你也可以考虑在Gradio界面增加一个文件输出组件但修改起来更复杂。3. 功能测试与效果验证代码修改完成后让我们来测试一下。3.1 重启WebUI服务保存app.py文件后需要重启Gradio服务以使修改生效。如果你之前是用脚本启动的# 如果原进程在运行先按 CtrlC 停止 bash /root/build/start.sh或者直接运行/opt/miniconda3/envs/torch27/bin/python /root/build/app.py3.2 上传图片并查看结果打开浏览器访问http://localhost:7860。上传一张包含人脸的图片单人或多人都可以。选择你需要的分析选项点击“开始分析”。分析完成后除了看到标注好的结果图和人脸属性卡片请特别注意信息输出区域通常是文本框。你应该能看到类似这样的提示✅ 已自动裁剪并保存了 3 张人脸图片到 ./cropped_faces 目录。3.3 查看裁剪结果回到服务器的终端进入项目目录列出cropped_faces文件夹的内容ls -la ./cropped_faces/你应该能看到类似face_1_1645678901234.jpg、face_2_1645678901235.jpg的文件。你可以用图像查看器打开它们或者直接使用命令行工具如果服务器支持快速预览。每个文件都应该是从原图中精准裁剪出来的单张人脸。恭喜至此自动裁剪保存的核心功能已经实现。4. 进阶优化与实用技巧基础功能跑通后我们可以让它变得更强大、更好用。4.1 按人脸属性分类保存比如你想把男性和女性的人脸自动保存到不同的文件夹。# 在裁剪保存的循环内部获取性别属性 # 假设 face 对象有 gender 属性0表示女1表示男或者直接是字符串 gender getattr(face, gender, unknown) if gender 1 or gender Male: gender_dir male elif gender 0 or gender Female: gender_dir female else: gender_dir unknown # 创建性别子目录 gender_save_dir os.path.join(save_dir, gender_dir) os.makedirs(gender_save_dir, exist_okTrue) # 保存路径也相应改变 save_path os.path.join(gender_save_dir, filename)4.2 保存带标注的裁剪图有时你可能想保存裁剪后的人脸但保留关键点或年龄性别标签。这需要在裁剪前在result_image即画好标注的图的对应区域进行裁剪而不是在原始图上。# 假设 result_image 是PIL Image # 注意此时裁剪的坐标是基于已经画了标注的图与原始图坐标一致 annotated_face_crop result_image.crop((x1, y1, x2, y2)) annotated_face_crop.save(os.path.join(save_dir, fannotated_face_{i}.jpg))4.3 在WebUI中直接下载裁剪结果更优雅的方式是让Gradio直接提供裁剪后文件的下载链接。这需要修改函数使其返回一个额外的gr.File组件对应的值通常是文件路径列表。首先在Gradio界面定义中添加一个gr.File组件用于输出。然后修改函数使其返回裁剪文件的路径列表。Gradio会自动将这些路径打包成ZIP供用户下载。这需要对app.py的界面构建部分有更深的理解这里不展开但思路是将cropped_paths列表作为函数的第三个返回值。4.4 处理常见问题裁剪框超出图片边界我们在代码中已经用max(0, ...)和min(width, ...)做了保护。图片保存格式face_crop.save(save_path)会根据文件后缀自动选择格式。.jpg是有损压缩但文件小.png是无损压缩但文件大。你可以根据需求选择。性能考虑如果处理大量高清图片裁剪和保存可能成为瓶颈。可以考虑异步处理或者先完成Web响应再在后台进行保存操作。5. 总结通过本教程我们成功地为Face Analysis WebUI增加了人脸检测结果自动裁剪保存的实用功能。整个过程可以概括为三步理解数据流定位核心分析函数找到存储人脸坐标 (bbox) 和原始图像数据的变量。嵌入处理逻辑在函数内部利用Pillow库根据每个人的bbox坐标对原始图像进行crop操作并保存为独立文件。测试与优化重启服务验证功能并根据实际需求进行扩展如分类保存、添加标注等。这个功能将人脸分析从“查看结果”升级到了“获取素材”极大地提升了工具的实用性。无论是用于构建人脸数据集、快速提取证件照还是简单的照片整理都非常方便。希望这个教程对你有帮助。动手试试吧把你的Face Analysis WebUI变得更加强大获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

相关文章:

Face Analysis WebUI实战教程:结合Pillow实现检测结果图自动裁剪保存

Face Analysis WebUI实战教程:结合Pillow实现检测结果图自动裁剪保存 你是不是也遇到过这样的烦恼?用Face Analysis WebUI分析了一堆照片,得到了带有人脸框和关键点的结果图,但每次想单独保存某个人脸时,都得手动截图…...

Fairseq-Dense-13B-Janeway保姆级教学:从显存监控(nvidia-smi)到生成质量评估全流程

Fairseq-Dense-13B-Janeway保姆级教学:从显存监控(nvidia-smi)到生成质量评估全流程 1. 模型概述与快速体验 Fairseq-Dense-13B-Janeway是KoboldAI发布的130亿参数创意写作大模型,专门针对科幻与奇幻题材进行优化。该模型使用22…...

构建多 Agent 协作系统时如何通过 Taotoken 统一管理模型调用

构建多 Agent 协作系统时如何通过 Taotoken 统一管理模型调用 1. 多 Agent 系统的模型调用挑战 在由多个专用 Agent 组成的复杂系统中,每个 Agent 往往需要不同的模型能力。例如,一个对话 Agent 可能需要 Claude 系列模型的流畅性,而一个数据…...

软件评测师基础知识专项刷题:网络安全技术(一)

前言软考软件评测师备考之路,基础刷题必不可少。本文围绕【网络安全技术】模块整理经典习题 核心考点梳理,系列内容长期连载更新,慢慢积累、逐个突破,轻松夯实应试功底。考点防火墙防火墙是在内部网络和外部因特网之间增加的一道…...

鼠标连点器:游戏玩家的得力助手

在玩某些游戏的时候,我们经常需要反复点击鼠标,时间长了手指会很酸痛。 而且有些场景需要非常快速的连点,手动很难达到理想的速度。 这时候鼠标连点器就派上用场了,能帮我们完成这些重复性的点击工作。 今天我们要介绍的这款鼠标连…...

别再死记硬背‘枚举’和‘哈希’了!通过‘奶牛拼图’这道趣题,真正理解它们的应用场景与配合

从奶牛拼图到算法思维:枚举与哈希的趣味实践 想象一下,一群奶牛围坐在谷仓里,不是在咀嚼干草,而是在玩单词拼图游戏。它们对"MOO"这个词情有独钟,甚至发明了一套加密系统来保护自己的拼图不被农夫约翰轻易破…...

各有所长:连点器软件对比分析

连点器软件有很多,每款的功能都会有不同的侧重。 有的侧重连点速度,有的侧重稳定性,有的侧重功能丰富程度。 用户在选择的时候,往往不知道哪款最适合自己。 今天我们就来分析一下不同连点器软件的特点,帮助用户做出选择…...

企业如何利用多模型聚合平台构建内部智能问答助手

企业如何利用多模型聚合平台构建内部智能问答助手 1. 企业内部智能问答的需求背景 现代企业知识库通常包含产品文档、技术手册、客户案例等结构化与非结构化内容。传统关键词检索难以理解自然语言查询意图,而单一模型在应对不同复杂度问题时可能面临效果或成本瓶颈…...

别再只用单片机点灯了!用Multisim仿真4017+运放,体验纯硬件流水灯的乐趣

从单片机到纯硬件:用Multisim仿真4017运放打造复古流水灯 在嵌入式开发领域,点灯实验几乎是每个工程师和学生的入门必修课。从Arduino的digitalWrite()到STM32的HAL库,我们习惯了用几行代码控制LED的亮灭。但你是否思考过,在微控制…...

鸿蒙 HarmonyOS 6 | TextInput组件 ONE_TIME_CODE 验证码输入实战

前言 验证码输入是登录、注册、密码找回、支付确认里最常见的一类交互。这个场景看起来简单,真正做起来,体验差距却很明显。输入框类型选得不对,系统就不会把它识别成验证码场景,输入法优化、自动填充、无障碍提示这些能力都很难接…...

从踩坑到封装:我的OkHttp工具类进化史(支持HTTPS/自定义头/超时配置)

从踩坑到封装:我的OkHttp工具类进化史 记得第一次在生产环境使用OkHttp时,我天真地以为只要按照文档示例写几行代码就能搞定所有HTTP请求。直到凌晨三点被报警电话吵醒,才发现那个"简单"的工具类在并发场景下疯狂泄漏连接&#xff…...

GitHub Skills技能生态:2026年开发者必备的AI能力封装与复用指南

前言 2026年的开发者工具生态正在经历一场深刻变革。曾经,我们需要为每个重复性任务手动编写脚本、配置环境、调试参数;如今,通过GitHub Skills技能生态,开发者可以将经过验证的最佳实践封装成可复用的模块,让AI助手按…...

企业网里给奇安信天眼‘安家’:探针镜像口配置与网络规划的那些事儿

企业级网络安全部署实战:奇安信天眼探针镜像流量采集规划指南 在金融、能源等关键行业的核心网络环境中,流量镜像采集的部署质量直接决定了安全检测的有效性。去年某大型金融机构的数据泄露事件调查显示,由于镜像端口配置不当,导致…...

避坑指南:FFmpeg 4.2.2 集成到Android项目时,那些让你头疼的CMake配置问题

FFmpeg 4.2.2 Android集成实战:CMake配置的七个关键陷阱与解决方案 在Android平台上集成FFmpeg库进行音视频开发时,CMake配置环节往往是开发者遇到的第一个"拦路虎"。不同于简单的Java库引入,Native层的集成需要考虑ABI兼容、静态库…...

OpenClaw从入门到应用——Agent:系统提示词

通过OpenClaw实现副业收入:《OpenClaw赚钱实录:从“养龙虾“到可持续变现的实践指南》 OpenClaw 为每次智能体运行构建自定义的系统提示。该提示由 OpenClaw 拥有,不使用 pi-coding-agent 的默认提示。 该提示由 OpenClaw 组装并注入到每次…...

Photoshop 2020插件安装避坑实录:Geographic Imager 6.2从下载、授权到面板调出的完整指南

Geographic Imager 6.2插件安装实战指南:从零基础到精通地理影像处理 第一次打开Photoshop 2020并看到那个灰色的"Geographic Imager"菜单项时,我完全没意识到接下来会经历怎样一场"技术冒险"。作为城市规划专业的研究生&#xff0…...

Clawtique:OpenClaw的模块化能力管理器,解决插件污染与依赖难题

1. 项目概述:Clawtique,为OpenClaw打造的“衣橱”管理器如果你正在使用OpenClaw,并且已经尝试过安装几个不同的技能(Skill)或者插件(Plugin),你可能会遇到一个典型的“环境污染”问题…...

OpenClaw从入门到应用——Agent:流式传输与分块

通过OpenClaw实现副业收入:《OpenClaw赚钱实录:从“养龙虾“到可持续变现的实践指南》 OpenClaw 有两个独立的流式传输层: 块流式传输(频道): 在助手生成内容时,发出已完成的块。这些是普通的…...

学习资源及鸣谢

笔记内容基于黑马程序员的Java课程整理,代码和思路来自课程,部分有个人理解和补充。感谢黑马程序员的优质教学。 主要学习资源:黑马程序员Java课程 工具:IDEA、JDK…… 参考网站:CSDN、Stack Overflow、GitHub……...

3个技术突破:如何用Qt5+Go构建跨平台音频下载解决方案

3个技术突破:如何用Qt5Go构建跨平台音频下载解决方案 【免费下载链接】xmly-downloader-qt5 喜马拉雅FM专辑下载器. 支持VIP与付费专辑. 使用GoQt5编写(Not Qt Binding). 项目地址: https://gitcode.com/gh_mirrors/xm/xmly-downloader-qt5 在数字内容消费日…...

将ClaudeCode编程助手对接至Taotoken的配置步骤详解

将ClaudeCode编程助手对接至Taotoken的配置步骤详解 1. 准备工作 在开始配置前,请确保已完成以下准备工作:获取有效的Taotoken API Key,该Key可在Taotoken控制台的API Key管理页面创建。同时确认已安装ClaudeCode编程助手,支持版…...

如何永久保存微信聊天记录:WeChatMsg完整指南,高效备份你的数字记忆

如何永久保存微信聊天记录:WeChatMsg完整指南,高效备份你的数字记忆 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/…...

springMVC-获取前端请求的数据与三个作用域一文彻底搞懂 OpenClaw 的架构设计与运行原理(万字图文)

在AI辅助开发的语境下,Skill就是一个包含了领域知识、最佳实践、代码模板的知识包。 以"DAO层CRUD生成"为例,一个Skill包含: /mnt/skills/dao-crud/ ├── SKILL.md # 使用说明 │ ├── 何时使用这个Skill │ …...

电力设备红外图像与可见光图像配准数据集205对共410张图无标注

电力设备红外与可见光图像配准数据集 数据集概述 本数据集包含205对电力设备红外与可见光图像,用于图像配准研究。所有图像均无标注,需要研究者自行进行特征匹配与变换矩阵估计。 数据集结构 c:\Users\Administrator\Downloads\data\ └── JPEGImages\…...

Claude学习笔记【第三章】- Claude Code的基本使用

←上一章 第一部分 章节任务 已经完成了Claude Code的配置,接下来我应该如何使用他? 他能够为我做什么事情? 如何使用slash( / )? 本章将针对上面的问题,教学Claude Code( 命令行下 )的基本使用方法。 第二部分 Claude Code对话 首先是最基本的部…...

告别风扇噪音与高温:FanControl让你的PC散热更智能

告别风扇噪音与高温:FanControl让你的PC散热更智能 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/Fa…...

php把运行时重构成常驻内存 + 多进程 + 事件驱动(Reactor) 模式完整流程=workerman

纯手写版,不靠 Workerman/Swoole。只用 PHP 自带能力:pcntl_fork stream_socket_server stream_select,实现你要的:常驻内存 多进程 Reactor 事件驱动 …...

从CREO到URDF:机器人开发的终极自动化转换指南

从CREO到URDF:机器人开发的终极自动化转换指南 【免费下载链接】creo2urdf Generate URDF models from CREO mechanisms 项目地址: https://gitcode.com/gh_mirrors/cr/creo2urdf 在机器人设计与仿真领域,从CAD模型到仿真环境的转换一直是制约开发…...

Appium Inspector进阶玩法:除了看元素,这些隐藏功能让你的测试效率翻倍

Appium Inspector进阶玩法:除了看元素,这些隐藏功能让你的测试效率翻倍 如果你已经熟悉Appium Inspector的基础功能——查看元素、获取属性、验证定位策略,那么是时候解锁它的隐藏技能了。这款工具远不止是一个简单的元素查看器,…...

WinAppDriver环境搭建避坑大全:解决.NET依赖、版本冲突和‘找不到元素’的常见问题

WinAppDriver实战避坑指南:从环境搭建到元素定位的深度解决方案 Windows桌面应用自动化测试领域,WinAppDriver作为微软官方推出的测试框架,正逐渐成为企业级自动化测试的首选方案。但在实际项目落地过程中,开发者们常会遇到各种&…...