自动裁剪人脸:简化你的数字人素材准备

在做数字人时,需要对采集的数据进行预处理,然后才能进行模型训练, 预处理常用的操作有:去背景 音频重采样 视频裁剪 音频特征提取等等,今天我们来分享一个自动化脚本: 对原图/视频进行人脸检测并根据目标尺寸以人脸为中心进行裁剪.

目录

1. 效果

2. 对图片进行裁剪

3.对视频进行裁剪

一. 效果

1.1 对图片处理

图片

1.2 对视频处理

图片

比如最近做的下面这个数字人效果,在训练阶段就用到了该脚本对视频进行自动裁剪

训练微调后的数字人

二. 对图片进行裁剪

图片的处理比较简单: 读取图片,进行人脸检测,根据un人脸中心点坐标和目标尺寸对原图进行裁剪

def get_face_coordinates(image):    #cv读取的图片转为RGB格式,然后使用dlib进行人脸检测    rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)    detections = dlib.get_frontal_face_detector(rgb_image)    face = detections[0]    #计算并返回人脸中心点    center_x = (face.left() + face.right()) // 2    center_y = (face.top() + face.bottom()) // 2    return center_x, center_y#读取图片frame = cv2.imread(inputFile)
#进行人脸关键点检测,返回人脸中心点坐标face_coords = get_face_coordinates(frame)center_x, center_y = face_coords
#根据目标尺寸,计算出以人脸为中心点进行裁剪的起止坐标crop_size = targetWH//2 start_x = max(center_x - crop_size, 0)start_y = max(center_y - crop_size, 0)
#把裁剪的关键点坐标信息记录,由于后期融合处理crop_coordinates = {    "start_x": start_x,    "start_y": start_y,    "width": targetWH,    "height": targetWH}crop_coordinates_path = outputFamesFolder + '/crop_coordinates.json'with open(crop_coordinates_path, 'w') as file:    json.dump(crop_coordinates, file, indent=4)
#对原图进行裁剪cropped_image = frame[start_y:start_y + targetWH, start_x:start_x + targetWH]frame_filename = f"{outputFamesFolder}/frame_crop.png"#保存裁剪后的图片cv2.imwrite(frame_filename, cropped_image)

三. 对视频进行裁剪

如果是视频,想比较图片稍微复杂一些,

首先要分离音频和视频,

可以根据需要对音频按照目标采样率进行重采样

获取视频的第一帧,进行人脸关键点检测,作为后续所有帧的人脸坐标(所以采集的视频人脸进来不要动作太大)

逐帧读取视频裁剪 获取裁剪后的帧

对把裁剪后的帧和音频重新生成视频作为后续流程的输入

#读取视频video_capture = cv2.VideoCapture(inputFile)#获取第一帧的人脸坐标ret, first_frame = video_capture.read()face_coords = get_face_coordinates(first_frame)center_x, center_y = face_coords
crop_size = targetWH//2  start_x = max(center_x - crop_size, 0)start_y = max(center_y - crop_size, 0)
#根据第一帧的人脸坐标信息,逐帧进行裁剪frame_number = 0while video_capture.isOpened():    ret, frame = video_capture.read()    if not ret:        break    cropped_image = frame[start_y:start_y + targetWH, start_x:start_x + targetWH]    frame_filename = f"{outputFamesFolder}/frame_{frame_number:04d}.png"    cv2.imwrite(frame_filename, cropped_image)    frame_number += 1
video_capture.release()
 #最终裁剪后的视频pathoutput_video_path = outputFolder + f"/{name}_face_crop.mp4"
# 提取视频的音频cmd = [    "ffmpeg",    "-i",inputFile,    '-f','wav',    '-ar','16000',    '-y',audio_output]
out = subprocess.run(cmd,\        stdout=subprocess.PIPE,\        stderr=subprocess.STDOUT,\        text=True)
#把裁剪人脸后的视频帧和音频无损合并为 最终的视频cmd =[    "ffmpeg",    "-i",frame_pattern,    "-i",audio_output,    "-c:v","libx264",    "-framerate", str(targetFps),    "-c:a","copy",    "-crf","0",    "-preset","veryslow",    "-pix_fmt", "yuv420p",    "-movflags","faststart",    "-shortest",    "-y",output_video_path]
out = subprocess.run(cmd,\        stdout=subprocess.PIPE,\        stderr=subprocess.STDOUT,\        text=True)

感谢你的阅读

接下来我们继续学习输出AIGC相关内容,关注公众号"音视频开发之旅",回复"人脸裁剪"获取封装后的完整代码,一起学习成长。

欢迎交流

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/525936.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nginx 隐藏版本号

只是隐藏 Nginx 版本号,只需在 Nginx 配置文件全局段添加 server_tokens off 然后重启 Nginx 服务 默认安装好了的 Nginx 服务 查看版本 现在修改配置 重启 Nginx 版本信息看不到了 我们下期见,拜拜!

CSAPP Malloc lab

CSAPP Malloc Lab 目标 实现一个简单的动态存储分配器。 评分标准 空间利用率应当减少internal 和 external fragmentation. memory utilization memory utilization payload / heap size fragmentation internal fragmentation external fragmentation throughput T 越接…

使用yarn创建vite+vue3electron多端运行

文章目录 第一步 使用yarn创建vite+vue3项目遇到创建报错看第二步 引入electron第三步 创建main.js在electron下面的main.js写入下面代码第四步 安装同时运行多条命令npm包&&修改package.json文件npm包增加一条electron运行脚本命令效果图第一步 使用yarn创建vite+vue3…

鸿蒙培训开发:就业市场的新热点~

金三银四在即,随着春节假期结束,各行各业纷纷复工复产,2024年的春季招聘市场也迎来了火爆的局面。最近发布的《2024年春招市场行情周报(第一期)》显示,尽管整体就业市场仍处于人才饱和状态,但华…

专业140+总分430+西南交通大学924信号与系统考研经验电子信息与通信工程,真题,大纲,参考书

今年报考西南交通大学,考研分数专业课924信号与系统140,总分430,各门分数都还是比较均衡,经过一年的复习,有得有失,总结一下自己的复习经历,希望给大家有点帮助,在复习中做的更好&am…

opencv编程

opencv编程 引言: ​ 本实验旨在介绍使用OpenCV进行图像处理和视频处理的基本操作。OpenCV(Open Source Computer Vision Library)是一个开源计算机视觉库,提供了丰富的图像和视频处理功能,既可以进行图像的读取、显示…

植物病虫害:YOLO玉米病虫害识别数据集

玉米病虫害识别数据集:玉米枯萎病,玉米灰斑病,玉米锈病叶,粘虫幼虫,玉米条斑病,黄二化螟,黄二化螟幼虫7类,yolo标注完整,3900多张图像,全部原始数据&#xff…

“大步迈进:探索未来的UI自动化测试框架“

源于一次测试 最近做了一些业务开发,功能本身还是挺简单的,由于测试资源不足,应测试要求,我就顺道接下了一些测试的活。测试任务也不复杂,无非是一些字段CURD来回变了法子的测试,各个字段分开,…

【OpenGL手册11】材质的模型

目录 一、说明二、材质表面和光照三、设置材质四、光的属性五、不同的光源颜色练习 一、说明 在现实世界里,每个物体会对光产生不同的反应。比如,钢制物体看起来通常会比陶土花瓶更闪闪发光,一个木头箱子也不会与一个钢制箱子反射同样程度的…

ROS基础学习—话题、服务、动作编程

ROS基础学习—话题、服务、动作编程 引言: ​ 通过本实验,我们将进行ROS基础学习内容主要包括:话题、服务、动作编程。掌握ROS的这些基础概念,进一步深入ROS的学习。 希望你在本次学习过后,能够有一定的收获&#xff0…

优先权的不同特征性质

目录 1.强占式,静态优先权,动态优先权 2.先来服务算法,高响应比优先算法,时间片轮转算法,非抢占式短任务优先 1.强占式,静态优先权,动态优先权 2.先来服务算法,高响应比优先算法&am…

Vue.js+SpringBoot开发海南旅游景点推荐系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户端2.2 管理员端 三、系统展示四、核心代码4.1 随机景点推荐4.2 景点评价4.3 协同推荐算法4.4 网站登录4.5 查询景点美食 五、免责说明 一、摘要 1.1 项目介绍 基于VueSpringBootMySQL的海南旅游推荐系统&#xff…