目录

1.实验目标

2.案例内容介绍

3.实验步骤

3.1安装和导入依赖包

3.2设定算法参数

3.3预览一下原视频

预览一下要替换的天空图片

3.4定义SkyFilter类

3.5开始处理视频

3.6对比原视频和处理后的视频

3.7 生成你自己的换天视频

1.实验目标

1.了解图像分割的基本应用;

2.了解运动估计的基本应用;

3.了解图像混合的基本应用。

2.案例内容介绍

案例链接OBS - JupyterLab (huaweicloud.com)

无论是拍人拍景或是其他,“天空”都可以说是摄像中的关键元素。比如,一张平平无奇的景色图加上落日余晖的天空色调,是不是有内味了?(随手就可以变换出各种天空效果:晴天、彩虹、晚霞、暮光、夕阳等等)

当然,自然的天空还不是最酷炫的,今天给大家介绍一款基于原生视频的AI处理方法,不仅可以一键切置换天空背景,还可以打造任意“天空之城”。比如,《星际迷航》等科幻电影中经常出现的浩瀚星空、宇宙飞船,也可以利用这项技术融入随手拍的视频中,路人拍摄的公路片也能秒变科幻片,画面毫无违和感。好像只要脑洞够大,利用这项AI技术,可以创作无限种玩法。

基于视觉的视频天空替换和协调方法,该方法可以在具有可控风格的视频中自动生成逼真的天空背景。与以前的天空编辑方法专注于静态照片或需要集成在智能手机中的惯性测量装置拍摄视频不同,该方法完全基于视觉,对捕获设备没有任何要求,并且可以很好地应用于在线或离线处理场景。

算法流程大致可以分为三个步骤:

(1) 天空抠图

这一步主要是通过对蒙版数据集进行训练,将图片中的天空和其它物体进行像素级的划分,将天空部分从图片中分离。

(2) 运动估计

对图片中物体的位移情况进行分析,预估相机的移动方向,使替换后的天空和之前的天空位移一致。

(3) 图像混合

将去掉天空的原视频和要替换后的天空视频进行融合,同时对非天空的部分采用色彩叠加,使天空和其它物体的视觉效果相近,使视频效果更加逼真。

最后,算法使用数据增强的方法模拟出同一张图片在不同光照和天气的情况下的图片,使算法具有更强的适应性。

3.实验步骤

3.1安装和导入依赖包

import os
import moxing as moxfile_name = 'SkyAR'
if not os.path.exists(file_name):mox.file.copy('obs://modelarts-labs-bj4-v2/case_zoo/SkyAR/SkyAR.zip', 'SkyAR.zip')os.system('unzip SkyAR.zip')os.system('rm SkyAR.zip')
mox.file.copy_parallel('obs://modelarts-labs-bj4-v2/case_zoo/SkyAR/resnet50-19c8e357.pth', '/home/ma-user/.cache/torch/checkpoints/resnet50-19c8e357.pth')
!pip uninstall opencv-python -y
!pip uninstall opencv-contrib-python -y
!pip install opencv-contrib-python==4.5.3.56
cd SkyAR/
import time
import json
import base64
import numpy as np
import matplotlib.pyplot as plt
import cv2
import argparse
from networks import *
from skyboxengine import *
import utils
import torch
from IPython.display import clear_output, Image, display, HTML%matplotlib inline# 如果存在GPU则在GPU上面运行
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

3.2设定算法参数

SkyAR算法提供了以下五个参数来调整换天的效果:

skybox_center_crop: 天空体中心偏移

auto_light_matching: 是否自动亮度匹配

relighting_factor: 补光

recoloring_factor: 重新着色

halo_effect: 是否开启光环效应

且提供了 datadir 和 skybox 两个参数来指定待处理的原视频和要替换的天空图片,通过路径进行指定即可,如下所示:

parameter = {"net_G": "coord_resnet50","ckptdir": "./checkpoints_G_coord_resnet50","input_mode": "video","datadir": "./test_videos/sky.mp4",  # 待处理的原视频路径"skybox": "sky.jpg",  # 要替换的天空图片路径"in_size_w": 384,"in_size_h": 384,"out_size_w": 845,"out_size_h": 480,"skybox_center_crop": 0.5,"auto_light_matching": False,"relighting_factor": 0.8,"recoloring_factor": 0.5,"halo_effect": True,"output_dir": "./jpg_output","save_jpgs": False
}str_json = json.dumps(parameter)

3.3预览一下原视频

video_name = parameter['datadir']def arrayShow(img):img = cv2.resize(img, (0, 0), fx=0.25, fy=0.25, interpolation=cv2.INTER_NEAREST)_,ret = cv2.imencode('.jpg', img)return Image(data=ret)# 打开一个视频流
cap = cv2.VideoCapture(video_name)frame_id = 0
while True:try:clear_output(wait=True) # 清除之前的显示ret, frame = cap.read() # 读取一帧图片if ret:frame_id += 1if frame_id > 200:breakcv2.putText(frame, str(frame_id), (5, 15), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1)  # 画frame_idtmp = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # 转换色彩模式img = arrayShow(frame)display(img) # 显示图片time.sleep(0.05) # 线程睡眠一段时间再处理下一帧图片else:breakexcept KeyboardInterrupt:cap.release()
cap.release()

预览一下要替换的天空图片

img= cv2.imread(os.path.join('./skybox', parameter['skybox']))
img2 = img[:, :, ::-1]
plt.imshow(img2)

3.4定义SkyFilter类

class Struct:def __init__(self, **entries):self.__dict__.update(entries)def parse_config():data = json.loads(str_json)args = Struct(**data)return argsargs = parse_config()
class SkyFilter():def __init__(self, args):self.ckptdir = args.ckptdirself.datadir = args.datadirself.input_mode = args.input_modeself.in_size_w, self.in_size_h = args.in_size_w, args.in_size_hself.out_size_w, self.out_size_h = args.out_size_w, args.out_size_hself.skyboxengine = SkyBox(args)self.net_G = define_G(input_nc=3, output_nc=1, ngf=64, netG=args.net_G).to(device)self.load_model()self.video_writer = cv2.VideoWriter('out.avi',cv2.VideoWriter_fourcc(*'MJPG'),20.0,(args.out_size_w, args.out_size_h))self.video_writer_cat = cv2.VideoWriter('compare.avi',cv2.VideoWriter_fourcc(*'MJPG'),20.0,(2*args.out_size_w, args.out_size_h))if os.path.exists(args.output_dir) is False:os.mkdir(args.output_dir)self.output_img_list = []self.save_jpgs = args.save_jpgsdef load_model(self):# 加载预训练的天空抠图模型print('loading the best checkpoint...')checkpoint = torch.load(os.path.join(self.ckptdir, 'best_ckpt.pt'),map_location=device)self.net_G.load_state_dict(checkpoint['model_G_state_dict'])self.net_G.to(device)self.net_G.eval()def write_video(self, img_HD, syneth):frame = np.array(255.0 * syneth[:, :, ::-1], dtype=np.uint8)self.video_writer.write(frame)frame_cat = np.concatenate([img_HD, syneth], axis=1)frame_cat = np.array(255.0 * frame_cat[:, :, ::-1], dtype=np.uint8)self.video_writer_cat.write(frame_cat)# 定义结果缓冲区self.output_img_list.append(frame_cat)def synthesize(self, img_HD, img_HD_prev):h, w, c = img_HD.shapeimg = cv2.resize(img_HD, (self.in_size_w, self.in_size_h))img = np.array(img, dtype=np.float32)img = torch.tensor(img).permute([2, 0, 1]).unsqueeze(0)with torch.no_grad():G_pred = self.net_G(img.to(device))G_pred = torch.nn.functional.interpolate(G_pred,(h, w),mode='bicubic',align_corners=False)G_pred = G_pred[0, :].permute([1, 2, 0])G_pred = torch.cat([G_pred, G_pred, G_pred], dim=-1)G_pred = np.array(G_pred.detach().cpu())G_pred = np.clip(G_pred, a_max=1.0, a_min=0.0)skymask = self.skyboxengine.skymask_refinement(G_pred, img_HD)syneth = self.skyboxengine.skyblend(img_HD, img_HD_prev, skymask)return syneth, G_pred, skymaskdef cvtcolor_and_resize(self, img_HD):img_HD = cv2.cvtColor(img_HD, cv2.COLOR_BGR2RGB)img_HD = np.array(img_HD / 255., dtype=np.float32)img_HD = cv2.resize(img_HD, (self.out_size_w, self.out_size_h))return img_HDdef process_video(self):# 逐帧处理视频cap = cv2.VideoCapture(self.datadir)m_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))img_HD_prev = Nonefor idx in range(m_frames):ret, frame = cap.read()if ret:img_HD = self.cvtcolor_and_resize(frame)if img_HD_prev is None:img_HD_prev = img_HDsyneth, G_pred, skymask = self.synthesize(img_HD, img_HD_prev)self.write_video(img_HD, syneth)img_HD_prev = img_HDif (idx + 1) % 50 == 0:print(f'processing video, frame {idx + 1} / {m_frames} ... ')else:  # 如果到达最后一帧break

3.5开始处理视频

sf = SkyFilter(args)
sf.process_video()

3.6对比原视频和处理后的视频

video_name = "compare.avi"def arrayShow(img):_,ret = cv2.imencode('.jpg', img)return Image(data=ret)# 打开一个视频流
cap = cv2.VideoCapture(video_name)frame_id = 0
while True:try:clear_output(wait=True) # 清除之前的显示ret, frame = cap.read() # 读取一帧图片if ret:frame_id += 1cv2.putText(frame, str(frame_id), (5, 15), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1)  # 画frame_idtmp = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # 转换色彩模式img = arrayShow(frame)display(img) # 显示图片time.sleep(0.05) # 线程睡眠一段时间再处理下一帧图片else:breakexcept KeyboardInterrupt:cap.release()
cap.release()

3.7 生成你自己的换天视频

三个步骤实现自定义视频的换天效果:

(1)在自己本地电脑上准备好一个待处理的mp4视频文件和一张天空图片;

(2)参考此文档,将视频文件和图片文件分别上传到ModelArts JupyterLab的SkyAR/test_videos目录和SkyAR/skybox目录下;

(3)修改步骤2 “设定算法参数” 中datadir 和 skybox 两个参数的路径为你刚上传的视频和图片路径;

(4)重新运行步骤2~6。

【深度学习】AI一键换天相关推荐

  1. 使用函数计算三步实现深度学习 AI 推理在线服务

    目前深度学习应用广发, 其中 AI 推理的在线服务是其中一个重要的可落地的应用场景.本文将为大家介绍使用函数计算部署深度学习 AI 推理的最佳实践,  其中包括使用 FUN 工具一键部署安装第三方依赖 ...

  2. faceswap深度学习AI实现视频换脸详解

    给大家介绍最近超级火的黑科技应用deepfake,这是一个实现图片和视频换脸的app.前段时间神奇女侠加尔盖朵的脸被换到了爱情动作片上,233333.我们这里将会从github项目faceswap开始 ...

  3. 本地函数定义是非法的_使用函数计算三步实现深度学习 AI 推理在线服务

    目前深度学习应用广发, 其中 AI 推理的在线服务是其中一个重要的可落地的应用场景.本文将为大家介绍使用函数计算部署深度学习 AI 推理的最佳实践, 其中包括使用 FUN 工具一键部署安装第三方依赖. ...

  4. PaddlePaddle开发者福利:深度学习环境一键部署+基础入门指导书

    2019独角兽企业重金招聘Python工程师标准>>> 由河北科技大学许云峰老师团队打造和分享,线下深度学习实验环境镜像(PaddlePaddle Fluid 1.1.0版+Pyth ...

  5. 深度学习AI美颜系列

    为什么要开始写AI美颜这个系列的内容? 人像美颜美妆滤镜现在来看,几乎成为了人们生活拍照,摄影的刚需,目前市面上绝大多数的算法依旧停留在传统的图像算法阶段,仅有少数的AI算法也尚属于探索研究阶段,比如 ...

  6. 大数据早报:原百度研究院院长林元庆宣布离职创业 比特采矿业巨头BitMain推出深度学习AI硬件(10.27)

    数据早知道,上乐投网看早报! 『百度』原百度研究院院长林元庆宣布离职创业 将投身AI领域 原百度深度学习实验室主任林元庆已经离职,接下来将在人工智能领域创业.据悉,林元庆在八月份便有离开的意向,十一之 ...

  7. 深度学习AI美颜系列---AI美颜磨皮算法一

    深度学习AI美颜系列---AI美颜磨皮算法一 转自:https://blog.csdn.net/trent1985/article/details/80661230 首先说明一点,为什么本结内容是&q ...

  8. 深度学习AI美颜系列---人脸数据增强

    深度学习AI美颜系列---人脸数据增强 在深度学习的训练中,我们经常会对较少的数据进行数据增强,一般而言,常用的数据增强包括如下几种: 1,旋转: 2,缩放: 3,镜像: 4,平移: 5,调色: 6, ...

  9. Infortrend存储 EonStor GSi 深度学习AI存储一体机

    要搭建一个深度学习环境的基本步骤相当繁琐,带有GPU的服务器首先需要安装OS以及深度学习框架的应用,在搭建时也需要考虑到交换机与存储系统,为了能简化繁琐的搭建过程,达到快速部署深度学习环境,Infor ...

  10. 深度学习AI美颜系列---肤色相似度计算(CIELAB色差计算)

    深度学习AI美颜系列---肤色相似度计算(CIELAB色差计算) 在AI美颜中,经常会用到肤色相似度计算,如何实现这个算法? 步骤如下: 1,人脸皮肤分割: 2,对人脸皮肤分割结果进行LAB颜色空间转 ...

最新文章

  1. 使用Word2010灵活掌握文档结构
  2. Exchange如何将邮件转发给外部邮件地址
  3. FreeRTOS学习笔记4-FreeRTOS配置管理
  4. golang 获取公网ip 内网ip 检测ip类型 校验ip区间 ip地址string和int转换 判断ip地区国家运营商
  5. 《精通Linux设备驱动程序开发》——1.7 编译内核
  6. java元婴期(21)----java进阶(spring(5)---事务管理AOP事务管理(全自动)spring整合Junit)
  7. Python使用proj将GPS经纬度数据转换为utm坐标系(真实的地理位置坐标系,以米为单位),然后可以进行轨迹显示
  8. PHP正则贪婪/懒惰匹配模式
  9. EventBus设计与实现分析——事件的发布
  10. [jQuery] 你知道自定义事件吗?jQuery里的fire函数是什么意思,什么时候用?
  11. 利用Python多进程执行,加快MySQL批量添加数据的执行速度
  12. mysql show 翻页_mysql show操作
  13. 【实践】SimSvr在微信推荐系统中的应用实践
  14. docker实践第二版pdf 网盘_【漫画】什么是 docker?docker 应用场景解析
  15. Android Studio使用编译framework.jar
  16. 如何学习PMP才算是成功?
  17. spring-boot-route(十九)spring-boot-admin监控服务
  18. window电脑H265(HEVC)编码的mp4不显示缩略图解决办法
  19. 在过程中要正式批准可交付成果_2014年PMP考试模拟题
  20. 請教阿泰一個有關水晶報表的問題

热门文章

  1. 为啥没有好用的开发单片机的国产IDE?
  2. 最小二乘法的嵌入式C语言实现
  3. java爬取携程酒店的评价信息以及eleven参数获取
  4. 开发了一个可以上班偷偷看小说的阅读器,欢迎大家批正
  5. Photoshop脚本 给图片添加噪点
  6. win10关闭远程端口
  7. UCC28951QPWRQ1 IC REG CTRLR 24TSSOP 稳压器
  8. 阿里云ECS云服务器租用价格表(2021年最新版)
  9. bzoj - 1002 【Kirchhoff矩阵】
  10. 安全巡检脚本(分模块)