社区编辑申请
注册/登录
你这背景太假了,用AI自动合成,假吗?
人工智能
我们今天用 detectron2 做实例分割,它是Facebook 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, :]


责任编辑:武晓燕 来源: 渡码
相关推荐

2022-06-13 15:28:42

人工智能机器学习数据

2022-04-01 15:23:06

人工智能AI换脸数据

2022-07-06 11:38:40

2022-06-19 21:09:59

AI人工智能

2022-03-28 18:48:42

人工智能AI

2021-12-21 08:05:19

2022-07-20 11:32:09

人工智能人工智能算法

2021-06-08 10:23:12

人工智能人脸识别Deepfake

2019-01-30 13:00:16

人工智能机器学习无人驾驶

2020-03-30 09:22:03

AI语音技术机器视觉

2021-12-01 16:22:44

2021-11-04 09:56:28

2019-10-10 10:12:25

AI职业人工智能

2020-10-14 12:28:19

AI人工智能道德

2020-09-21 21:40:19

AI 数据人工智能

2019-03-11 15:29:32

自动驾驶AI无人车

2019-12-02 10:18:22

AI 数据人工智能

2020-01-19 09:25:58

失独AI技术

2020-01-16 16:18:49

AI人工智能谷歌

2019-07-15 08:00:00

AI人工智能

同话题下的热门内容

如何创建一个无代码的自助客户聊天机器人使用机器学习评估异质治疗效果中科院打脸谷歌:普通电脑追上量子优越性,几小时搞定原本要一万年的计算负责任的机器学习--“玻璃盒”方法玩转文字、文采飞扬,你也可以是这样的昇腾AI程序员!PathAI利用机器学习推动药物开发AI到底是如何工作的?七月超受欢迎的AI研究榜单出炉,马毅最新「标准模型」排名第九

编辑推荐

转转公司架构算法部孙玄:AI下的微服务架构Facebook开源相似性搜索类库Faiss,超越已知最快算法8.5倍运维:对不起,这锅,我们不背快消品图像识别丨无人店背后的商品识别技术最全面的百度NLP自然语言处理技术解析
我收藏的内容
点赞
收藏

51CTO技术栈公众号