你这背景太假了,用AI自动合成,假吗?
来源:51CTO.COM
时间:2023-04-27 08:34:16 500浏览 收藏
今日不肯埋头,明日何以抬头!每日一句努力自己的话哈哈~哈喽,今天我将给大家带来一篇《你这背景太假了,用AI自动合成,假吗?》,主要内容是讲解等等,感兴趣的朋友可以收藏或者有更好的建议在评论提出,我都会认真看的!大家一起进步,一起学习!
哈喽,大家好。
前几天大家是不是都刷到了下面这个视频。
博主本来想证明自己背景是真的,结果引来网友恶搞,纷纷换成各种各样的背景来“打假”。
今天咱也凑个热闹,用 AI 技术自动替换背景。
思路并不难,我们先从原视频将人物分离出来,再将分离出来的人物“贴”到新背景视频中即可。
从视频中分类人物用到关键技术的是计算机视觉中的实例分割,我之前的文章中有介绍过目标检测技术,比如,人脸检测
目标检测是通过矩形框标注检测的目标,相对容易。而实例分割是一项更精细的工作,因为需要对每个像素点分类,物体的轮廓是精准勾勒的。
我们今天用 detectron2 做实例分割,它是Facebook AI研究院开源的项目,功能强大,使用简单。
1. 安装
detectron2 支持在Linux和macOS系统上安装,Linux可以直接通过pip安装,而mac只能通过源码编译的方式安装,建议大家用Linux。
支持GPU和CPU运行,我使用的是3090显卡、CUDA11.1、Pytorch1.8。
2. 运行
我们用官方提供的预训练模型对图片做实例分割。
2.1 加载模型配置文件
from detectron2.config import get_cfg
from detectron2 import model_zoo
cfg = get_cfg()
model_cfg_file = model_zoo.get_config_file('COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml')
cfg.merge_from_file(model_cfg_file)
COCO-InstanceSegmentation代表用coco数据集训练的实例分割模型。
mask_rcnn_R_50_FPN_3x.yaml是模型训练用到的配置信息。
从下图也可以看到,detectron2除了提供实例分割模型,还提供目标检测、关键点检测等模型,还是比较全面的。
2.2 加载模型
model_weight_url = model_zoo.get_checkpoint_url('COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml')
cfg.MODEL.WEIGHTS = model_weight_url
mask_rcnn_R_50_FPN_3x.yaml文件中存放了预训练模型的url。当进行实例分割时,程序会自动从url处将模型下载到本地。存放的位置为:
但程序自动下载的方式可能会比较慢,这时候你可以用迅雷自己下载模型文件,放到对应的路径中即可。
2.3 实例分割
首先,读取一张图片,图片大小480 * 640。
img = cv2.imread('./000000439715.jpg')
实例化DefaultPredictor对象。
from detectron2.engine import DefaultPredictor
predictor = DefaultPredictor(cfg)
对图片进行实例分割
out = predictor(img)
out变量中存放的是分割出来每个目标的类别id、检测框和目标遮罩。
out["instances"].pred_classes获取目标的类别id
这里一共检测到了 15 个目标,在配置文件中可以找到类别id和类别名称的映射关系。其中,0代表人,17代表马。
out["instances"].pred_masks获取目标的遮罩,我们取单个目标的遮罩研究一下它的用处。
可以看到,它的取值是布尔类型,并且shape和图片大小一样。
所以,遮罩是实例分割的结果,里面每个元素对应图片一个像素,取值为True代表该像素是检测出来的目标像素。
因此,我们可以通过遮罩给目标加上一层不透明度,从而把目标精确标注出来。
img_copy = img.copy()
alpha = 0.8
color = np.array([0, 255, 0])
img_copy[mask > 0, :] = img_copy[mask > 0, :] * alpha + color * (1-alpha)
上述给目标加上一层绿色的不透明度,效果如下:
可以看到,骑在马上的人已经被标注出来了。
3. 自动合成背景
有了上面的基础,我们就很容易合成视频了。
读取原视频每一帧中将人物分割出来,将分割出来的人物直接覆盖到新背景视频中对应的帧即可。
核心代码:
# 读取原视频
ret, frame_src = cap.read()
# 读取新背景视频
ret, frame_bg = cap_bg.read()
# 调整背景尺寸跟原视频一样
frame_bg = cv2.resize(frame_bg, sz)
# 分割原视频人物
person_mask = instance_seg.predict(frame_src)
# 合成
frame_bg[person_mask, :] = frame_src[person_mask, :]
文中关于开源,AI,自动合成的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《你这背景太假了,用AI自动合成,假吗?》文章吧,也可关注golang学习网公众号了解相关技术文章。
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
451 收藏
-
202 收藏
-
420 收藏
-
363 收藏
-
276 收藏
-
265 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 507次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习