100 天构建 AI 视频编辑器原型
CSDN
2023-11-16 20:05:44
0

原标题:100 天构建 AI 视频编辑器原型

这篇文章探讨了生成人工智能(AI)对艺术家的影响,指出这些技术通常更侧重于商业利益而非艺术家的利益。文章强调,虽然艺术家面临由新技术带来的挑战,但生成式 AI 提供了新的创作方法,可以赋予艺术家更大的创造空间。作者以此为出发点,尝试用 Python 构建一个开源AI视频编辑器,利用了现代图形库和 NVIDIA 的 Python 库以探索在视频创作中的应用可能性。

原文链接:https://www.makeartwithpython.com/blog/building-an-ai-video-editor/

未经允许,禁止转载!

作者 | Kirk Kaiser 译者| 明明如月

责编 | 夏萌

出品 | CSDN(ID:CSDNnews)

目前的生成式人工智能,尽管在很多方面为艺术家带来了便利和创新机会,但也存在争议,因为有观点认为它们更多是为了追求商业利益而设计。生成式人工智能的训练模型需要大量的资金、数据以及电力资源。

许多生成式人工智能模型是在庞大的艺术作品库上进行训练,但对于原创艺术家的补偿问题,不同的模型和使用条款有所不同。

然而,生成式人工智能完全有潜力增强艺术家的创作能力,并提升艺术作品的价值。

艺术家与颠覆性技术的关系

当流媒体技术兴起时,许多电视节目和音乐的创作者并未从流媒体交易中获益。例如,戴夫·查普尔(美国单口喜剧演员,编剧,制片人,演员)的节目在 Netflix 上播放时,他并未获得任何补偿,他不得不努力说服高管下架这个节目,以维护公平原则。泰勒·斯威夫特(一名美国创作歌手及音乐制作人)也曾通过艰苦谈判,为了确保公平的版税,她一度将自己的音乐从 Spotify 上撤下,直到 Spotify 同意调整她的版税费率。

在这种背景下,为创意工作者设计的生成工具必须有非常精准地定位。如果这些工具想要获得艺术家的认可,它们必须证明自己能够提升艺术作品的价值,并为独立艺术家开拓更广阔的市场。

资本力量倾向于利用新技术对艺术家施加财务压力,以增加对大资本持有者的回报,而这通常会损害艺术家的法律保护和经济利益。

讲故事、音乐和视觉艺术丰富了我们共同的人类体验。设计不佳的生成式人工智能可能会产生大量单调乏味的二次生成内容,这些内容可能会混淆我们的主要集体公共空间——互联网。

利用生成式人工智能为艺术家提供竞争优势

面对艺术家所面临的众多挑战,我们应该如何着手呢?如果生成式人工智能将改变创意过程,我们如何确保艺术家在这一变革中能够占有一席之地?

我尚无确切答案。

但我愿意去探索这个问题。

我发现,对一个领域感兴趣时,亲自动手构建东西能促进学习。而在创造新事物时,从最简单的想法开始往往是最佳选择。

与其开发一个复杂的系统来支持艺术家,不妨利用现有的模型来探索创新的创作方法。

我的专长主要在计算机视觉领域,因此我选择从这个领域入手。作为像 cyriak这样艺术家的粉丝,我渴望建造一款工具,赋予世界 cyriak 式的风格。

开始,我找到了一个令人印象深刻的风格:

已关注

关注

重播分享

关闭

观看更多

更多

正在加载

    正在加载

    退出全屏

    视频加载失败,请刷新页面再试

    刷新

    视频详情

    要实现此类效果,Facebook 的 Segment Anything模型是理想选择。

    原始艺术家在 After Effects 中的创作过程需要极大的耐心,以及大量手动遮罩的工作。当然,才华横溢的舞者像 Clay,他编排了自己的故事线以展现这种效果。但是,人物轮廓的操作和遮罩工作非常复杂。

    一个能够帮助你创造性地探索视频片段,并提供更优化的遮罩工具,将是一个良好的起点。

    因此,我开始了我的探索之旅...(大约 100 天)。

    用 Python 构建开源人工智能视频编辑器?

    随着机器学习模型的不断进步,使用 Python 开发一款辅助艺术家制作类似于 Clay 视频的软件,显得尤为合适。尽管我平时更多使用 Python 来开发后端基础架构而非桌面应用程序,但 Python 的使用领域实际上非常广泛。

    因此,我开始探索使用 Python 构建视频编辑器的可能性,并搜索了相关工具包。

    经过研究,我发现 ModernGL结合 ModernGL-Window 能够提供一个在 Mac、Windows 和 Linux 上运行的高效 OpenGL 接口。此外,NVIDIA 提供了一个支持 NVIDIA 显卡进行视频硬件解码和编码的 Python 库

    当然,我还需要一个与正在编辑的视频交互的方法。为了实现这一点,我采用了 PyImgui ,在 OpenGL 窗口上构建用户界面。

    使用 Imgui 构建原型界面

    使用 moderngl-window,你能够明确定义并构建你的渲染循环:

    import moderngl_window from moderngl_window.text.bitmapped import TextWriter2D

    class App(moderngl_window.WindowConfig):title = "Text"aspect_ratio = None

    def __init__(self, *args, **kwargs):super.__init__(*args, **kwargs)self.writer = TextWriter2Dself.writer.text = "Hello ModernGL!"

    def render(self, time, frame_time):self.writer.draw((240, 380), size=120)

    App.run

    __init__方法中,可以设置窗口分辨率和其他所需配置。

    Moderngl-window 也集成了 imgui,其添加过程非常简单:

    import moderngl_windowimport imguifrom moderngl_window.integrations.imgui import ModernglWindowRendererfrom moderngl_window.text.bitmapped import TextWriter2D

    classApp(moderngl_window.WindowConfig):title = "Text"aspect_ratio = None

    def__init__(self, *args, **kwargs):super.__init__(*args, **kwargs)imgui.create_contextself.imgui = ModernglWindowRenderer(self.wnd)self.writer = TextWriter2Dself.writer.text = "Hello ModernGL!"

    defrender(self, time, frame_time):self.writer.draw((240, 380), size=120)imgui.new_frameimgui.begin("Custom window")imgui.text("hello world")imgui.endimgui.renderself.imgui.render(imgui.get_draw_data)

    defresize(self, width:int, height:int):self.imgui.resize(width, height)

    defkey_event(self, key, action, modifiers):self.imgui.key_event(key, action, modifiers)

    defmouse_position_event(self, x, y, dx, dy):self.imgui.mouse_position_event(x, y, dx, dy)

    defmouse_drag_event(self, x, y, dx, dy):self.imgui.mouse_drag_event(x, y, dx, dy)

    defmouse_scroll_event(self, x_offset, y_offset):self.imgui.mouse_scroll_event(x_offset, y_offset)

    defmouse_press_event(self, x, y, button):self.imgui.mouse_press_event(x, y, button)

    defmouse_release_event(self, x:int, y:int, button:int):self.imgui.mouse_release_event(x, y, button)

    defunicode_char_entered(self, char):self.imgui.unicode_char_entered(char)

    App.run

    虽然代码量增加了,但大部分代码用于将事件传递给 imgui 实例,这样它就能识别我们的点击时间和位置。

    Imgui 使用即时模式,允许在循环中直接定义 UI,极大地加快了原型构建的迭代速度。使用它,你可以迅速地构建和测试新想法。

    在 OpenGL 中加载和处理视频

    显然,只有当创意工具能够实时操作时,它们才真正发挥作用。

    为了达到这一效果,我利用了大多数新型 NVIDIA 显卡内置的硬件加速解码器。

    这允许我们使用 GPU 上的专用芯片解码每个视频帧。这样做可以加快搜索和播放速度,减少延迟,并且通常无需对加载的文件进行格式转换。

    在 NVIDIA 硬件上,可以使用强大的 VideoProcessingFramework。它甚至提供了示例代码,演示了如何将视频从输入色彩空间解码为 Pytorch 张量或 OpenGL 纹理:

    # 定位到特定帧src_surface = nvDec.DecodeSingleSurface(nvc.SeekContext(frame_no))

    # 使用管线转换为RGB色彩空间rgb_pln = to_rgb.run(src_surface)

    # 转换为Pytorch张量src_tensor = surface_to_tensor(rgb_pln)

    # 推送到CPU,作为numpy数组b = src_tensor.cpu.numpy

    这提供了可在 Pillow或 PyTorch/Numpy 中操作的数据,方便在原型制作中保存为帧。

    有了这些基础,我们就可以结合使用 Segment Anything,并通过 imgui 选择 OpenGL 帧中的目标点。但需注意,在实现这一点之前,虽然 ModernGL-Window 支持 MacOS,但 MacOS 并不支持任何 NVIDIA 硬件。

    在 MacOS 中构建硬件视频解码和 Stable Diffusion XL

    虽然我花了时间探索,但在 MacOS 上,包括 M1 和 M2 系列处理器,实现硬件解码依然困难。

    因此,我尝试为 MacOS 编写一个 Python 硬件播放库,尽管苹果公司已用 Objective-C 开发了用于硬件解码的扩展,但这些 API 尚未有 Python 接口。

    为了实现这一目标,我采用了 Cython,并参考了 OpenFramework 的视频播放器实现。这一方法使我得以将Objective-C 代码转换为 C++,进而转换为一个能够播放视频的 Python API 。

    经过多次尝试和错误,我终于完成了一个可在 MacOS 机器上导入和运行的库。这个库拥有一个合理的 API ,与 NVIDIA 的 VideoProcessingFramework 大致相似:

    import videoplayback

    player = videoplayback.AVFPlayerplayer.load("filename")

    # 不幸的是,加载文件的操作还不是同步的time.sleep(.3)

    numFrames = player.length_in_framesw = player.widthh = player.height

    destination_frame = 1# 获取一帧player.seek(destination_frame)image = np.asarray(player.imageframe)image = image.view(np.uint8).reshape(image.shape + (-1,))# 形状 (1080, 1920, 4)image = image[:,:,0:3]b[:,:,[0,2]] = b[:,:,[2,0]]# 形状 (1080, 1920, 3)image = image.copy(order='C')

    关于 Stable Diffusion XL,苹果发布了一个部分优化的库,使得在 M1 和 M2 硬件上能使用硬件加速生成图像。

    然而,这些优化导致在我的 64GB 内存的 M1 MacBook Pro 上生成单张图片需约 2 分钟。对创意工作者而言,这并非理想的反馈周期。相比之下,在我配备 4090 显卡的台式电脑上,生成一个 Stable Diffusion XL 图像只需几秒。然而,通过使用像 Modal 这样的服务,我可以借助无服务器 GPU 实例将推理时间缩减至几秒。

    早期反馈的获取

    当我向一位朋友展示了视频编辑器原型时,他对视频中的实时物体分割功能表现出极大兴趣。

    因此,我采用了 De-AOT 模型来实现这一功能,该模型能预测视频中接下来约 20 帧的内容,并几乎达到了预期效果。

    在此过程中,我探索了使用 Stable Diffusion 的新方法,这些方法不仅可以模仿创意工作者的作品,还可以作为赋能工具。

    构建用于资产生成的模型管道

    通常,扩散模型并不是为融入现有框架或上下文而设计的。它们的主要目的是根据文本提示从头开始创造图像,从噪声中构想出图像的可能样貌,并逐步将其实现。

    为在视频中生成透明资产(如 UFO 或箭头),我们需能自动从图像中分离和提取所需元素。

    有了这些技术,我们现在可以生成并查看内容:

    def generate_segmented_diffusion(object, prompt, negative_prompt="", auto=True, seed=None):if seed is not None:generator = torch.Generator(device="cuda").manual_seed(seed) pipeline_text2image = AutoPipelineForText2Image.from_pretrained("stabilityai/stable-diffusion-xl-base-1.0", torch_dtype=torch.float16, variant="fp16", use_safetensors=True,cache_dir="/app/.cache", generator=generator).to("cuda")else:pipeline_text2image = AutoPipelineForText2Image.from_pretrained("stabilityai/stable-diffusion-xl-base-1.0", torch_dtype=torch.float16, variant="fp16", use_safetensors=True,cache_dir="/app/.cache").to("cuda")

    img = pipeline_text2image(prompt=prompt,negative_prompt=negative_prompt).images[0]

    if auto: # 仅使用 SAM 的第一个掩码model = get_dino_modelimg_ground = transform_pil_image_for_grounding(img)b, p = get_grounding_output(model=model, image=img_ground, caption=object, box_threshold=.35, text_threshold=.25)boxes = b * 1024 # 1024 x 1024 的 SDXL 图像boxes = box_convert(boxes=boxes, in_fmt="cxcywh", out_fmt="xyxy").numpypredictor.set_image(np.asarray(img))masks, _, _ = predictor.predict(box=boxes[0]) # 仅使用第一个进行自动预测masks = np.where(masks, 255, 0)masks = masks.copy(order='C')img_cutout = Image.new('RGBA', (1024, 1024), color=(0,0,0,0))mask = Image.fromarray(masks[0].astype('uint8'))img_cutout.paste(img, (0,0), mask=mask)img_cutout = img_cutout.transpose(Image.Transpose.FLIP_TOP_BOTTOM)return img_cutoutelse: # 返回图像和掩码model = get_dino_modelimg_ground = transform_pil_image_for_grounding(img)b, p = get_grounding_output(model=model, image=img_ground, caption=object, box_threshold=.35, text_threshold=.25)boxes = b * 1024 #

    1024 x 1024 的 SDXL 图像boxes = box_convert(boxes=boxes, in_fmt="cxcywh", out_fmt="xyxy").numpypredictor.set_image(np.asarray(img))masks, _, _ = predictor.predict(box=boxes[0]) # 仅使用第一个进行自动预测masks = np.where(masks, 255, 0)masks = masks.copy(order='C')return img, masks

    现在,我们可以探索现有艺术愿景,而非完全从头创造图像。(顺便提一下,我之前对 Stable Diffusion 及其训练数据集持有怀疑。我觉得(可能我错了)结合反馈,而非完全自动生成,可能是更好的方法。但我仍不确定。)

    使用 ControlNet 与图像协作

    ControlNet 是一种用于引导和控制扩散过程的技术,通过使用自定义输入来训练模型,实现扩散模型生成中的精准控制。

    例如,使用 OpenPose 这样的模型,可以精确控制图像中人物的姿势。ControlNet 则能准确设定图像中人物的数量和位置。

    此外,要将物体转化为扩散图像时,可以用 Canny 边缘检测等方法获取物体轮廓,引导生成过程。

    这些模型可用于调整视频中的主体,同时维持其原始比例。在上述视频示例中,我将一个橙色障碍物转换成了混凝土障碍物。

    但仔细观察会发现一些问题。理想情况下,应该有一个能随着相机移动而变化的虚拟 3D 主体。

    TokenFlow:视频扩散网络的应用

    然而,仅使用 ControlNet 处理视频效果并不理想,如下方视频所示,扩散模型因输入噪声不同而产生多样结果,造成画面频繁闪烁。即使使用相同的初始种子图像保持帧间一致,由于扩散模型的工作原理,仍然会出现闪烁。

    有技术如 AnimateDiff可减少闪烁,通过在扩散器中加入时间层。但这些技术并非完美。

    我所见最佳时间稳定性实现是 TokenFlow,它用名为 Plug and Play 的方法引导图像生成,同时保持空间连贯性。例如,视频中展示的片段,提示是“一个人在冲浪”。

    Plug and Play 技术使用一个初始图像,通过 DDIM 反转为噪声,然后通过扩散过程提取生成图像的关键特征。这些特征随后被注入扩散模型的自我关注层,同时使用与原始图像相同的反转噪声。

    结合此技术与帧间相关性,能生成时间上一致且相对无闪烁的视频,如上面的视频所示。然而,这两种技术看起来都带有一定的人工痕迹,与“人工智能视频”相关的特定人工制品。

    构建 ebsynth 的模型导出器

    Ebsynth是一种基于非深度学习的方法,专门用于将视频的纹理替换为另一种艺术风格。它的工作原理是采用一系列视频帧,并结合一些已经绘制成目标视频风格的关键帧。

    可以结合 ControlNet 和 Stable Diffusion 来处理视频,探索基于文本提示的各种纹理创意。

    在这个例子中,我使用了“红热熔岩火山火焰”作为提示,目的是为了创造一个发光的效果。

    已关注

    关注

    重播分享

    关闭

    观看更多

    更多

    正在加载

      正在加载

      退出全屏

      视频加载失败,请刷新页面再试

      刷新

      视频详情

      对于 ControlNet,我首先检测图像中是否有人物,如果有,就结合使用针对 OpenPose 的加权 ControlNet 和 Canny 图像 ControlNet。

      鉴于我们已经构建的其他工具,将 ebsynth 生成集成进来相对简单。我们需要选取一部分帧,并在这些帧上运行 Stable Diffusion。这样做可以确保它们都源自同一扩散模型生成路径。我还为视频添加了掩码模式,可专门为特定人物创作纹理,而非整个视频。

      这样,我们就能够在视频中为单个主题生成特殊效果,确保效果的一致性。

      完成这些之后,我们可以将生成的角色版本重新放入视频中。

      为艺术家构建人工智能

      在花费数月时间利用计算机视觉模型和生成性人工智能构建编辑器后,我的收获是什么?

      视频本质上是多模态的,涵盖了图像、音频和叙述等多个方面。虽然一些机器学习模型能处理多模态输入,但视频创作的日常工作仍未完全适应单一模型。我发现,传统视频编辑与模型协作的结合产生了最有趣的结果。

      但这些工具并未取代创造力!创造力的关键在于坚持不懈的日常工作。有时你会感觉工作进展顺利,而有时似乎一切都难以进行。

      我们在生成式人工智能的探索之路上还处于初期阶段,我还无法确切预测未来的发展。我能看到工具逐渐成型,但具体哪些工具会胜出,或者事情将如何发展,目前还不得而知。

      我们的目标是超过那些试图替代创意工作者的资本巨头,而是助力创意工作者获得成功。

      相关链接:

      1、ModernGL:https://moderngl.readthedocs.io/en/5.8.2/

      2、ModernGL-Window :https://moderngl-window.readthedocs.io/en/latest/

      3、Python 库:https://github.com/NVIDIA/VideoProcessingFramework

      4、PyImgui :https://github.com/pyimgui/pyimgui

      5、VideoProcessingFramework:https://github.com/NVIDIA/VideoProcessingFramework/

      6、用于硬件解码的扩展:https://developer.apple.com/documentation/avfoundation/media_playback?language=objc

      7、OpenFramework 的视频播放器实现:https://github.com/openframeworks/openFrameworks/blob/cce8428e1b6754f0457b14a81aa19d7434be06a3/addons/ofxiOS/src/video/AVFoundationVideoPlayer.m

      8、De-AOT 模型:https://arxiv.org/abs/2210.09782

      9、Plug and Play :https://arxiv.org/abs/2211.12572

      ▶一行代码,为何造成 6000 万美元的损失?

      ▶GPT-5 正在开发中!OpenAI:希望微软能再给资金支持

      ▶年薪超 80 万美元,成为全美收入最高的 1% 后,Meta 前技术主管亲述晋升经历:我曾与焦虑作斗争!

      相关内容

      热门资讯

      评测!金花房卡怎么购买,斗牛房... rs3.全系电池大提升,其中标准版iPhone 14版本电池容量将会扩充为3228mAh,续航会比上...
      游戏指南!微信金花房卡充值,金... y从外观屏幕来看,这款OPPO Reno10新机采用了一块6.79英寸的三星AMOLED曲面屏设计,...
      游戏介绍!正规房卡链接在哪购买... XqzeP于iPhone 15 Pro系列机型,还有不少的爆料。比方说为了给该系列机型减重,更换了机...
      游戏知识!牛牛房卡是在哪里买的... gBK4Z3.全系电池大提升,其中标准版iPhone 14版本电池容量将会扩充为3228mAh,续航...
      游戏!正规房卡链接在哪购买,牛... i1YFlzG除了屏幕和后置相机的变化之外,iPhone16Pro还将会支持手写笔的使用,所以后续用...
      游戏测评!房卡游戏代理要多少钱... SiPhone13配备6.1英寸超视网膜XDR显示屏,虽说屏幕没有高刷新率,但60Hz对于一块小尺寸...
      游戏推荐微信大厅房卡充值,金花... 3pcxT在苹果公司的 iOS系统中,我们已经可以通过控制中心来控制手机的亮度、音量、Wi-Fi和蓝...
      游戏知识!微信金花房卡链接,微... oGbJpZSi苹果公司计划在 iPhone 15系列中引入一种新的相机传感器,并将其命名为“Pro...
      游戏指南!牛牛房卡批发市场,正... pV5qq虽然距离传感器的位置改变,不过对于iPhone15系列手机来说灵动岛几乎没有变化,这种调整...
      评测!微信金花房卡到哪里买,金... xSV5hhKG第一则是坏消息,有爆料信息称会iPhone14系列会搭载A16处理器,但这款处理器的...
      游戏推荐斗牛房卡购买联系方式,... Zc苹果手机虽然备受消费者的欢迎,同时也搭载的是自研的iOS系统,但是在很多方面,苹果也借鉴和参考了...
      游戏指南!房卡充值平台,微信大... jAx0Yd对于预算不算充足或者说对14系列不满意的朋友来说,如今正在打折促销的苹果手机产品都是值得...
      游戏15元100张房卡代理,1... a3q而且根据最新消息显示苹果今年推出的iPhone15系列手机中其距离传感器将会位于灵动岛的区域内...
      游戏介绍!金花房卡充值,牛牛房... rJEOPPO原来的系统确实做得一般,但是近几年已经有了很大的改善,流畅了很多,比如OPPO Ren...
      游戏!正规房卡链接在哪购买,微... FjF而且根据最新消息显示苹果今年推出的iPhone15系列手机中其距离传感器将会位于灵动岛的区域内...
      游戏知识!牛牛房卡批发市场,正... 9No1ju4据悉,“灵动岛”是苹果公司最新的手机设计语言,其能够将通知和其他信息以类似于动画的方式...
      评测!大厅房卡哪里有卖,微信链... JiPhone16Pro的单打孔和安卓手机的打孔屏完全不同,因为苹果保留了FaceID,所以前置相机...
      游戏介绍!牛牛房卡哪家便宜,斗... 8苹果手机虽然备受消费者的欢迎,同时也搭载的是自研的iOS系统,但是在很多方面,苹果也借鉴和参考了安...
      游戏介绍!金花房卡软件联系微信... EA在摄像头方面,这款摩托罗拉X50mini采用了后置三摄设计,后置三摄集成在手机背部左上方的一个矩...
      游戏介绍!斗牛房卡价格,微信金... w1bhG7g不管怎么进行调整,应该都要比iPhone13标准版的性能更强,不然也就很难让用户产生换...