用 Python 实现隐身,我可以 | 文末福利
作者 | 李秋键
头图 | 下载于视觉中国
出品 | AI 科技大本营(ID:rgznai100)
引言:
视频和图像的隐身术是指在视频或者图像中中,在没有任何输入遮罩的情况下,通过框选目标体,使得程序实现自动去除视频中的文本叠加和修复被遮挡部分的问题。并且最近的基于深度学习的修复方法只处理单个图像,并且大多假设损坏像素的位置是已知的,故我们的目标是在没有蒙皮信息的视频序列中自动去除文本。
今天,我们通过搭建一个简单而有效的快速视频解码器框架去实现视频中物体的去除。流程是构建一个编码器-解码器模型,其中编码器采用多个源帧,可以提供从场景动态显示的可见像素。这些提示被聚合并输入到解码器中。然后通过应用循环反馈进一步改进加强模型。循环反馈不仅加强了时间相干性,而且提供了强大的线索。
实现效果如下可见:
模型建立
1.1 环境要求
本次环境使用的是python3.6.5+windows平台
主要用的库有:
argparse模块是python自带的命令行参数解析包,可以用来方便地读取命令行参数;
subprocess是Python 2.4中新增的一个模块,它允许你生成新的进程,连接到它们的 input/output/error 管道,并获取它们的返回(状态)码。这个模块的目的在于替换几个旧的模块和方法
numpy模块用来矩阵和数据的运算处理,其中也包括和深度学习框架之间的交互等。
torch模块是一个python优先的深度学习框架,是一个和tensorflow,Caffe,MXnet一样,非常底层的框架在这里我们用来搭建网络层和直接读取数据集操作,简单方便。
Matplotlib模块用来可视化训练效果等数据图的制作。
1.2 程序的启动
程序的运行方式如下:
1、直接运行demo.py文件对图片进行处理
2、对视频进行处理python demo.py --data data/bag.avi。
import argparse
from mask import mask
from inpaint import inpaint
parser = argparse.ArgumentParser(description='Demo')
parser.add_argument('--resume', default='cp/SiamMask_DAVIS.pth', type=str,metavar='PATH', help='path to latest checkpoint (default: none)')
parser.add_argument('--data', default='data/Human6', help='videos or image files')
parser.add_argument('--mask-dilation', default=32, type=int, help='mask dilation when inpainting')
args = parser.parse_args()
mask(args)
inpaint(args)
1.3 算法概述
视频中物体的移除目的是从有字幕、有噪声的视频帧中预测原始帧。恢复的区域应该和原始的相同大小,或者无缝地融合到周围的像素中。基本的算法思想是从多个相邻帧(源帧)中收集提示,然后恢复目标帧。这是为了利用视频中的场景动态,在视频中,随着物体的移动或字幕的变化,被遮挡的部分通常会在滞后或引导帧中显示。同时还可以使用循环反馈连接作为额外的源流。直接估计一帧中的所有像素可能会不必要地接触到未损坏的像素。为了解决像素指标缺失的问题,采用残差学习算法对模型进行训练。具体来说,最终输出是通过按像素顺序将输入中心帧和预测残差图像相加得到的。这使得我们的网络明确地只关注损坏的像素,也防止全局色调失真。
1.4模型的搭建
模型算法核心设计是一个混合的编码器-解码器模型,其中编码器包括两个子网络:3D CNN和2D CNN。解码器遵循一个正常的2D CNN设计,该网络被设计成完全卷积的,可以处理任意大小的输入。最后的输出视频是通过自回归的方式应用函数得到的,我们的策略是从多个源帧中收集潜在的线索,这些帧可以提供从场景动态中显示的可见像素。此外,我们强制目标帧的生成与前一代保持一致。通过构造一个双流混合编码器,其中每个源流都经过训练以实现我们的目标。第一个编码器流由3D卷积组成,它可以直接从相邻帧捕获时空特征,第二个流是一个2D CNN,它将先前生成的尺寸为H×W×1×C的帧作为输入。
其中模型生成如下:
try: assert(opt.model == 'vinet_final')model = vinet.VINet_final(opt=opt)
except:print('Model name should be: vinet_final')
assert(opt.no_cuda is False)
model = model.cuda()
model = nn.DataParallel(model)
loaded, empty = 0,0
if opt.pretrain_path:print('Loading pretrained model {}'.format(opt.pretrain_path))pretrain = torch.load(opt.pretrain_path)child_dict = model.state_dict()parent_list = pretrain['state_dict'].keys()parent_dict = {}for chi,_ in child_dict.items():if chi in parent_list:parent_dict[chi] = pretrain['state_dict'][chi]#print('Loaded: ',chi)loaded += 1else:#print('Empty:',chi)empty += 1print('Loaded: %d/%d params'%(loaded, loaded+empty))child_dict.update(parent_dict)model.load_state_dict(child_dict)
视频处理
2.1 预定义
我们的任务将视频去除目标后尽可能的还原成背景场景。如果场景移动或者字幕在相邻帧中消失,被遮挡的部分就会被显示出来,这就为潜在的内容提供了关键的线索。为了使增益参数的最大化,需要为我们的模型找到最佳的帧采样间隔。当最小间隔为1时,输入帧将包含不重要的动态。另一方面,如果我们以较大的步伐跳跃,不相干的新场景就会被包括进来。最终通过测试,设定的参数如下:
opt = Object()
opt.crop_size = 512
opt.double_size = True if opt.crop_size == 512 else False
########## DAVIS
DAVIS_ROOT =os.path.join('results', args.data)
DTset = DAVIS(DAVIS_ROOT, mask_dilation=args.mask_dilation, size=(opt.crop_size, opt.crop_size))
DTloader = data.DataLoader(DTset, batch_size=1, shuffle=False, num_workers=1)
opt.search_range = 4 # fixed as 4: search range for flow subnetworks
opt.pretrain_path = 'cp/save_agg_rec_512.pth'
opt.result_path = 'results/inpainting'
opt.model = 'vinet_final'
opt.batch_norm = False
opt.no_cuda = False # use GPU
opt.no_train = True
opt.test = True
opt.t_stride = 3
opt.loss_on_raw = False
opt.prev_warp = True
opt.save_image = False
opt.save_video = True
2.2 视频处理
我们的模型不仅从当前帧中收集线索,还从未来和过去相邻帧中收集线索。另外,为了保持时间一致性,有条件地生成每一帧到前一帧的输出帧。
with torch.no_grad():for seq, (inputs, masks, info) in enumerate(DTloader):idx = torch.LongTensor([i for i in range(pre - 1, -1, -1)])pre_inputs = inputs[:, :, :pre].index_select(2, idx)pre_masks = masks[:, :, :pre].index_select(2, idx)inputs = torch.cat((pre_inputs, inputs), 2)masks = torch.cat((pre_masks, masks), 2)bs = inputs.size(0)num_frames = inputs.size(2)seq_name = info['name'][0]save_path = os.path.join(opt.result_path, seq_name)if not os.path.exists(save_path) and opt.save_image:os.makedirs(save_path)inputs = 2. * inputs - 1inverse_masks = 1 - masksmasked_inputs = inputs.clone() * inverse_masksmasks = to_var(masks)masked_inputs = to_var(masked_inputs)inputs = to_var(inputs)total_time = 0.in_frames = []out_frames = []lstm_state = Nonefor t in range(num_frames):masked_inputs_ = []masks_ = []if t < 2 * ts:masked_inputs_.append(masked_inputs[0, :, abs(t - 2 * ts)])masked_inputs_.append(masked_inputs[0, :, abs(t - 1 * ts)])masked_inputs_.append(masked_inputs[0, :, t])masked_inputs_.append(masked_inputs[0, :, t + 1 * ts])masked_inputs_.append(masked_inputs[0, :, t + 2 * ts])masks_.append(masks[0, :, abs(t - 2 * ts)])masks_.append(masks[0, :, abs(t - 1 * ts)])masks_.append(masks[0, :, t])masks_.append(masks[0, :, t + 1 * ts])masks_.append(masks[0, :, t + 2 * ts])elif t > num_frames - 2 * ts - 1:masked_inputs_.append(masked_inputs[0, :, t - 2 * ts])masked_inputs_.append(masked_inputs[0, :, t - 1 * ts])masked_inputs_.append(masked_inputs[0, :, t])masked_inputs_.append(masked_inputs[0, :, -1 - abs(num_frames - 1 - t - 1 * ts)])masked_inputs_.append(masked_inputs[0, :, -1 - abs(num_frames - 1 - t - 2 * ts)])masks_.append(masks[0, :, t - 2 * ts])masks_.append(masks[0, :, t - 1 * ts])masks_.append(masks[0, :, t])masks_.append(masks[0, :, -1 - abs(num_frames - 1 - t - 1 * ts)])masks_.append(masks[0, :, -1 - abs(num_frames - 1 - t - 2 * ts)])else:masked_inputs_.append(masked_inputs[0, :, t - 2 * ts])masked_inputs_.append(masked_inputs[0, :, t - 1 * ts])masked_inputs_.append(masked_inputs[0, :, t])masked_inputs_.append(masked_inputs[0, :, t + 1 * ts])masked_inputs_.append(masked_inputs[0, :, t + 2 * ts])masks_.append(masks[0, :, t - 2 * ts])masks_.append(masks[0, :, t - 1 * ts])masks_.append(masks[0, :, t])masks_.append(masks[0, :, t + 1 * ts])masks_.append(masks[0, :, t + 2 * ts])masked_inputs_ = torch.stack(masked_inputs_).permute(1, 0, 2, 3).unsqueeze(0)masks_ = torch.stack(masks_).permute(1, 0, 2, 3).unsqueeze(0)start = time.time()最终完成效果如下:
完整代码链接:
https://pan.baidu.com/s/1tCB0MTBbvfSokeU1AAKBQQ
提取码:nfhk
作者简介:李秋键,CSDN博客专家,CSDN达人课作者。硕士在读于中国矿业大学,开发有taptap竞赛获奖等。
你还知道哪些 Python 的新奇用法?
欢迎来评论区唠唠~
AI科技大本营将选出三名优质留言
携手【北京大学出版社】送出
《Python入门到人工智能实战》一本
截至4月18日14:00点
更多精彩推荐
无人机、IoT 设备都有漏洞?专访以色列老牌安全企业Check Point
听完姚期智的一句“嘟囔”,他开始第二次创业AI 3D 传感器市场竞争白热化,中国掌握自主可控核心技术时不我待!小心!你家的 IoT 设备可能已成为僵尸网络“肉鸡”点分享点收藏点点赞点在看
相关文章:

改变myeclipse北京颜色
经常用 MyEclipse 写代码,时间久了会觉得白色的背景颜色很刺眼,于是乎便想要换一种柔和些的颜色来缓解视力疲劳,那么怎么样来修改 MyEclipse 代码编辑区域的背景颜色呢? 依次展开菜单 Window >> Preferences >> Gener…

redis 代理工具Predixy安装部署
PredixyPredixy 是一款高性能全特征redis代理,支持redis-sentinel和redis-cluster特性高性能并轻量级支持多线程多平台支持:Linux、OSX、BSD、Windows(Cygwin)支持Redis Sentinel,可配置一组或者多组redis支持Redis Cluster支持redis阻塞型命…

超级详细的 Python 数据分析指南
来源 | 算法进阶头图 | 下载于视觉中国前言:数据分析是通过明确分析目的,梳理并确定分析逻辑,针对性的收集、整理数据,并采用统计、挖掘技术分析,提取有用信息和展示结论的过程,是数据科学领域的核心技能。…

C#实现-移位加密
/* Filename: encrypt_string.cs Author : zhanghua Date : 2005-08-11 Fuction : input a strig and encrypt a string 加密后的字符串的第一个字符是原先字符串的最后一个字符, 其余的每一个字符是对应的原字符串中的前一个字符的值…

oracle相关操作
查看用户系统权限:select * from dba_sys_privs;select * from session_privs;select * from user_sys_privs;查看用户对象权限:select * from dba_tab_privs;select * from all_tab_privs;select * from user_tab_privs;修改数据库密码:alte…

Ansible批量安装mysql数据
1.构建安装目录mkdir -p /ansible/roles/mysql/{defaults,files,handlers,meta,tasks,templates,vars}defaults 默认寻找路径tasks 存放playbooks路径files 存放文件和脚本,copy模块文件搜索路径templates 模版存放路径handlers notify调用部分playbook存放路径vars…

C#在客户端和服务端操作Excel文件
一、在客户端把数据导入到Excel文件步骤1、创建Excel application对象,打开或生成Excel文件//服务端创建StringBuilder对象System.Text.StringBuilder sbnew System .Text .StringBuilder (); //指定客户端执行语言sb.Append ("<Script LanguageVBScript&g…

oracle数据库同步交换的方法
oracle数据同步方案与实现:如何在两个oracle服务器之间交换数据?来源:无忧模板 作者:网络编辑 更新时间:2010-08-09 18:10 点击:次 方案一:建立两个数据库之间的DATA_LINK,直接将新数据写入另一数据库方案二:使用SQL *…

让语音助手听懂方言,这个数据集能搞定
来源 | HyperAI超神经头图 | 来源于网络 侵删方言是语音识别技术发展中必须要迈过去的坎儿,那么如何让模型能够听懂和理解方言呢?使用优质的数据集是一种的方法,本文将介绍一个经典的方言录音数据集 TIMIT。随着科技的成熟,语音识…

Django内置Admin
Django内置的Admin是对于model中对应的数据表进行增删改查提供的组件,使用方式有:依赖APP:django.contrib.authdjango.contrib.contenttypesdjango.contrib.messagesdjango.contrib.sessions模板的context_processors:django.cont…

Puppet扩展篇1-自定义fact结合ENC(hirea)的应用实践
零基础学习Puppet自动化配置管理系列文档在大量节点加入Puppet之后,你至少会面临两个比较大的问题:1、由于节点数的增多,site.pp文件必然会编写更多的节点条目,以及节点包含的类。假设你用Puppet管理500个节点,存在三种…

C#WinForm制作异形窗体/控件
制作异形窗体或控件的思路一般都是想办法生成一个region,然后设置给指定的窗口或控件。生成region的方法有很多,最常用的就是从一幅图片生成,把该图片中的透明色部分“抠”掉,剩下的部分作为一个region。设置窗口或控件的region可…

谷歌提出纯 MLP 构成的视觉架构,无需卷积、注意力 !
来源 | 迈微AI研习社责编 | 寇雪芹头图 | 下载于视觉中国当前,卷积神经网络(CNN)和基于自注意力的网络(如近来大火的 ViT)是计算机视觉领域的主流选择,但研究人员没有停止探索视觉网络架构的脚步。近日&…

HttpApplication事件ASP.NET页面周期
学习吧少年........................... 修改中........... 当一次请求到达IIS 1、http.sys将请求发送到指定的应用程序池。 2、应用程序池再将请求交给池中的工作进程(w3wp.exe), 3、w3wp.exe根据请求URL的后缀,决定加载那个ISAP…

C#实现对象的Xml格式序列化及反序列化
要序列化的对象的类: [Serializable]public class Person{private string name;public string Name{get{return name;}set{namevalue;}}public string Sex;public int Age31;public Course[] Courses;public Person(){}public Person(string Name){nameName;Sex&qu…

outlook2010 打开总是提示“正在加载配置文件”
公司员工的电脑一打开OUTLOOK2010的时候,总是提示“正在加载配置文件”,要重新启动,还是无法打开,尝试了卸载和重装的方法也没有用.其实,只需下载一个windows search 4.0即可解决.转载于:https://blog.51cto.com/shidilun/1400227

腾讯云存储产品矩阵全面升级,发布三维生态战略
5月10日,腾讯云在北京举行存储产品战略发布会,发布了业界首款十微秒级的极速型云硬盘、业界首款突破百GB 吞吐的文件存储、以及业界首创能够10倍提升数据湖存储分析性能的对象存储三级加速器等新一代云存储产品矩阵。 同时,腾讯云还宣布将围…

围绕云计算 虚拟化技术又呈现新面貌
本文讲的是围绕云计算 虚拟化技术又呈现新面貌,【IT168 资讯】虚拟化技术的三项基本使命-即作为客户端技术,作为服务器技术和作为网络技术,如今正在围绕云计算理念相结合在一起。 起源于X86服务器的虚拟化技术已经快速扩展到存储和网络领域。…

C#字符串处理类
首先介绍一下常用的几个功能: Compare(str1,str2)——比较两个字符串 str1,str2的大小,如果大于返回正数,等于返回0,小于返回负数! IndexOf——定位字符串中第一次出现某个给定字符串的位置PadLeft和PadRight——在字…

linux严谨的telnet搭建并用防火墙开通与禁行
今天本打算练练防火墙iptables的东西,本想拿telnet的23号端口练手,没想到在敲实验的时候遇到了些曲折,经过一番努力,把本次实验过程生成文档。实验环境:rhel5.6及系统盘实验目的:通过iptables对telnet服务2…

孩子、老人与海豚,如何用 AI 伴他们走出孤独
“万里归来颜愈少。微笑。笑时犹带岭梅香。试问岭南应不好。却道。此心安处是吾乡。”苏轼的一首《定风波》道出老人心愿,道出人生百态,也道尽世间炎凉。当你走出万里,无论天涯或是海角,每个人的身上都带着自己独有的印记。这份印…

Linux之 手动释放内存
我们在进程中要怎样去描述一个文件呢?我们用目录项(dentry)和索引节点(inode)。它们的定义如下: 所谓"文件", 就是按一定的形式存储在介质上的信息,所以一个文件其实包含了两方面的信息,一是存储的数据本身,二是有关该文…

C#操作Excel导入导出
前些日子,有很多朋友说需要C#导出到Excel的代码,现共享给大家 /// <summary> /// 读取Excel文档 /// </summary> /// <param name"Path">文件名称</param> /// <returns>返回一个数据集</returns> …

中国安全态势越来越好,专访山石网科CSO蒋东毅 | 拟合
从无序中寻找踪迹,从眼前事探索未来。2021 年正值黄金十年新开端,CSDN 以中立技术社区专业、客观的角度,深度探讨中国前沿 IT 技术演进,推出年度重磅企划栏目——「拟合」,通过对话企业技术高管大咖,跟踪报…

《大数据、小数据、无数据:网络世界的数据学术》一 导读
前 言‖ 在“大数据”风靡的当代,学术研究中的“小数据”依旧不容小觑。随着绝对数据量的增加,学者们进行个体研究的能力却不断退化。因为他们从未距离研究对象如此遥远。新工具和新视角成为学术研究的必需品。但相对于“小数据”而言,“大…

UIView旋转角度
2019独角兽企业重金招聘Python工程师标准>>> 最近做一个视图的旋转、放大、拖动、拉伸,其他的都慢慢解决了,就是旋转之后各种问题不好处理,最终归结到旋转角度的不能获取,纠结了好几天,终于找到了获取旋转角…

生成静态文件的新闻系统核心代码
在网上看了许多能生成静态页的新闻系统,但基于asp.net的系统极少,闲下时间来自己写了一个,发出来,大家一起研究,代码没做什么优化,只是实现了功能 using System;using System.Collections;using System.Com…

「软件」2.0时代已经到来,你需要这样的开发工具
互联网催生了软件的繁荣,而在AI浪潮的推动下,软件正在朝着更「智能」的方向发展,也就是「软件2.0」时代。「软件2.0」其实就是神经网络,也就是这一波AI浪潮的基石。 在「软件1.0」时代,程序员用Java、Python、C等语言…

WF4 Beta,RC版文章总结
Visual Studio 2010明天就要发布正式版了,伴随Visual Studio 2010的发布微软的新一代工作流框架Workflow Foundation 4也会正式发布。从Beta版开始就断断续续的开始关注了,并写了一些文章,今天总结下: WF4 Beta1的几篇文章&#x…

亚马逊云科技在中国区域上线机器学习新服务,打造广泛而深入的人工智能与机器学习工具集
2021年5月11日,在完全托管的机器学习服务Amazon SageMaker落地中国区域一周年之际,亚马逊云科技宣布通过与光环新网和西云数据的紧密合作在中国区域进一步落地多项人工智能与机器学习的新服务和功能,丰富了其针对不同企业需求而打造的人工智能…