零样本视频生成无压力,基于飞桨框架实现Text2Video-Zero核心代码及依赖库

news2024/11/25 16:47:00

图片

项目背景

继 AI 绘画之后,短视频行业正迎来 AI 智能创作的新浪潮。AI 智能创作正在各个方面为创作者和用户带来新的体验和价值。AI 动漫视频、AI 瞬息宇宙、AI 视频风格化等诸多创作功能不仅为视频内容创作提供了全新灵感,而且大大降低了用户创作的门槛,提高了视频生产效率。

然而,现有的文本-视频生成方法需要极其高昂的计算资源和超大规模的文本-视频数据集(如:CogVideo、Gen-1),对大多数用户来说,成本较高。此外,很多时候单纯使用文本提示生成视频,生成的内容较为抽象,不一定符合用户的需求。因此,在某些情况下,用户需要提供参考视频,并通过文本提示来引导模型进行文本视频生成。与之对应,Text2Video-Zero 可以通过运动动力学(motion dynamics)、帧间注意力机制(frame-level self-attention)等技术手段对原始的文本-图像模型进行修改,使其可以完成文本-视频任务,且不需任何训练,是一种十分理想的文本-视频生成方法。本项目基于飞桨框架实现了 Text2Video-Zero 的核心代码及依赖库,并通过 PPDiffusers 的文本-图像生成模型实现了文本-视频生成、文本-视频编辑、姿态引导的文本-视频生成、边缘引导的文本-视频生成、深度图引导的文本-视频生成、边缘引导和 Dreambooth 定制的文本-视频生成在内的全部视频生成模块,并将该成果开源在 AI Studio 上。该实现对丰富飞桨 AIGC 生态具有极大的意义。

大模型专区 Text2Video-Zero-零样本文本到视频生成(上)

https://aistudio.baidu.com/aistudio/projectdetail/6212799

大模型专区 Text2Video-Zero-零样本文本到视频生成(下)

https://aistudio.baidu.com/aistudio/projectdetail/6389526

模型原理

Text2Video-Zero 以随机采样潜在编码 x T 1 x_T^1 xT1为起点,使用预训练的 Stable Diffusion 模型(SD),通过 DDIM 反向传播 Δ t \Delta t Δt步来获得。对于每一帧 k,作者使用变形函数将 x T ′ 1 x_{T^{\prime}}^{1} xT1 变换为 x T ′ k x_{T^{\prime}}^{k} xTk ,从而获得特定的运动场结果。通过使用运动动力学对潜在编码进行增强,模型可以确定全局场景和相机运动,从而实现背景和全局场景的时间一致性。之后,作者使用 DDPM 前向传播对潜在编码 x T k x_T^k xTk, k=1,…,m 进行传递。这里,概率 DDPM 方法可以实现更大自由度的物体运动。然后将潜在编码传递到使用帧间注意力机制修改后的 SD 模型中,帧间注意力机制使用第一帧的 key 和 value 来生成整个视频序列的图像。通过帧间注意力机制,前景物体的身份和外观可以在视频序列中保留。不仅如此,作者还对生成的视频序列使用了背景平滑技术。具体来说,作者使用显著目标检测来获得每一帧 k 中暗示了前景像素的掩码 M k M^k Mk ,并使用第一帧变换到第 k 帧的潜在编码 x t 1 x_t^1 xt1 和潜在编码 x t k x_t^k xtk 来进一步提高掩码 M k M^k Mk 中背景部分的时间一致性。该方法的整体架构图如下:

图片

图1 Text2Video-Zero 模型的整体架构图

由于 Text2Video-Zero 是一种通过对文本-图像模型进行零样本微调来生成视频的 AIGC 模型。因此,本项目会涉及到很多预训练的文本-图像生成模型,包括 Stable Diffusion V1.5、Instruct-Pix2Pix 、ControlNet 和张一乔老师(AI Studio昵称为笠雨聆月)的诺艾尔 Dreambooth 模型。其中,Stable Diffusion V1.5 模型用于文本-视频生成,Instruct-Pix2Pix 模型用于文本-视频编辑,ControlNet 模型用于姿态引导的文本-视频生成,边缘引导的文本-视频生成和深度图引导的文本-视频生成,诺艾尔 Dreambooth 模型用于边缘引导和 Dreambooth 定制的文本视频生成。所有开源模型附在文章最后,在此也对所有开源贡献者表示衷心感谢。

运动动力学核心代码

 1def create_motion_field(self, motion_field_strength_x, motion_field_strength_y, frame_ids, video_length, latents):
 2    reference_flow = paddle.zeros(
 3        (video_length-1, 2, 512, 512), dtype=latents.dtype)
 4    for fr_idx, frame_id in enumerate(frame_ids):
 5        reference_flow[fr_idx, 0, :,
 6                        :] = motion_field_strength_x*(frame_id)
 7        reference_flow[fr_idx, 1, :,
 8                        :] = motion_field_strength_y*(frame_id)
 9    return reference_flow
10
11def create_motion_field_and_warp_latents(self, motion_field_strength_x, motion_field_strength_y, frame_ids, video_length, latents):
12    motion_field = self.create_motion_field(motion_field_strength_x=motion_field_strength_x,
13                        motion_field_strength_y=motion_field_strength_y, latents=latents,            
14                        video_length=video_length, frame_ids=frame_ids)
15    for idx, latent in enumerate(latents):
16        out = self.warp_latents_independently(
17            latent[None], motion_field)
18        out = out.squeeze(0)
19        latents[idx]=out
20    return motion_field, latents
21
22x_t0_k = x_t0_1[:, :, :1, :, :].tile([1, 1, video_length-1, 1, 1])
23reference_flow, x_t0_k = self.create_motion_field_and_warp_latents(
24    motion_field_strength_x=motion_field_strength_x, motion_field_strength_y=motion_field_strength_y, latents=x_t0_k, video_length=video_length, frame_ids=frame_ids[1:])
25if t1 > t0:
26    x_t1_k = self.DDPM_forward(
27        x0=x_t0_k, t0=t0, tMax=t1, shape=shape, text_embeddings=text_embeddings, generator=generator)
28else:
29    x_t1_k = x_t0_k
30if x_t1_1 is None:
31    raise Exception
32x_t1 = paddle.concat([x_t1_1, x_t1_k], axis=2).clone().detach()
33ddim_res = self.DDIM_backward(num_inference_steps=num_inference_steps, timesteps=timesteps, skip_t=t1, t0=-1, t1=-1,    
34                            do_classifier_free_guidance=do_classifier_free_guidance,
35                            null_embs=null_embs, text_embeddings=text_embeddings, latents_local=x_t1, latents_dtype=dtype,  
36                            guidance_scale=guidance_scale,
37                            guidance_stop_step=guidance_stop_step, callback=callback, callback_steps=callback_steps, extra_step_kwargs=extra_step_kwargs, num_warmup_steps=num_warmup_steps)
38x0 = ddim_res["x0"].detach()

帧间注意力机制核心代码

 1class CrossFrameAttnProcessor:
 2    def __init__(self, unet_chunk_size=2):
 3        self.unet_chunk_size = unet_chunk_size
 4
 5    def __call__(
 6            self,
 7            attn,
 8            hidden_states,
 9            encoder_hidden_states=None,
10            attention_mask=None):
11        batch_size, sequence_length, _ = hidden_states.shape
12        attention_mask = attn.prepare_attention_mask(attention_mask, sequence_length, batch_size)
13        query = attn.to_q(hidden_states)
14        is_cross_attention = encoder_hidden_states is not None
15        if encoder_hidden_states is None:
16            encoder_hidden_states = hidden_states
17        elif attn.cross_attention_norm:
18            encoder_hidden_states = attn.norm_cross(encoder_hidden_states)
19        key = attn.to_k(encoder_hidden_states)
20        value = attn.to_v(encoder_hidden_states)
21        if not is_cross_attention:
22            video_length = key.shape[0] // self.unet_chunk_size
23            former_frame_index = [0] * video_length
24            f = video_length
25            b_f, d, c = key.shape
26            b = b_f//f
27            key = key.reshape([b,f, d, c])
28            key = paddle.gather(key, paddle.to_tensor(former_frame_index), axis=1)
29            key = key.reshape([-1,d,c])
30            b_f, d, c = value.shape
31            b = b_f//f
32            value = value.reshape([b,f,d,c])
33            value = paddle.gather(value, paddle.to_tensor(former_frame_index), axis=1)
34            value = value.reshape([-1,d,c])
35        query = head_to_batch_dim(query,attn.heads)
36        key = head_to_batch_dim(key,attn.heads)
37        value = head_to_batch_dim(value,attn.heads)
38        attention_probs = attn.get_attention_scores(query, key, attention_mask)
39        hidden_states = paddle.bmm(attention_probs, value)
40        hidden_states =  batch_to_head_dim(hidden_states, attn.heads)
41        hidden_states = attn.to_out[0](hidden_states)
42        hidden_states = attn.to_out[1](hidden_states)
43        return hidden_states

开发环境与实现过程

PPDiffusers 介绍

PPDiffusers 是一款支持多种模态(如文本图像跨模态、图像、语音)扩散模型(Diffusion Model)训练和推理的国产化工具箱。依托于飞桨框架和 PaddleNLP 自然语言处理开发库,PPDiffusers 提供了超过50种 SOTA 扩散模型 Pipelines 集合,支持文图生成(Text-to-Image Generation)、文本引导的图像编辑(Text-Guided Image Inpainting)、文本引导的图像变换(Image-to-Image Text-Guided Generation)、文本条件视频生成(Text-to-Video Generation)、超分(Super Resolution)在内的10余项任务,覆盖文本、图像、视频、音频等多种模态。2023年06月20日,飞桨正式发布 PPDiffusers 0.16.1 版本,新增 T2I-Adapter,支持训练与推理;ControlNet 升级,支持 reference only 推理;新增 WebUI Stable Diffusion Pipeline,支持通过 prompt 的方式动态加载lora、textual_inversion 权重;新增 Stable Diffusion HiresFix Pipeline,支持高分辨率修复;新增关键点控制生成任务评价指标 COCO eval;新增多种模态扩散模型 Pipelines,包括视频生成(Text-to-Video-Synth、Text-to-Video-Zero)、音频生成(AudioLDM、Spectrogram Diffusion);新增文图生成模型 IF。

GitHub链接

https://github.com/PaddlePaddle/PaddleNLP/tree/develop/ppdiffusers

安装指令

PPDiffusers 的安装指令如下:

1!pip install --user ftfy regex
2!pip install --user --upgrade ppdiffusers

在此基础上,也可选择其他环境安装:

1!pip install decord
2!pip install omegaconf
3!pip install --user scikit-image

实现效果

文本-视频生成效果

根据用户输入的文本提示词生成相应视频。

image.png

推理代码:

 1model = Model(device = "cuda", dtype = paddle.float16)
 2paddle.seed(1234)
 3prompt = "An astronaut dancing in Antarctica"
 4video_length = 2
 5params = {"t0": 44, "t1": 47 , "motion_field_strength_x" : 12, "motion_field_strength_y" : 12, "video_length": video_length }
 6output_dir = "/home/aistudio/work/Text2Video-Zero_paddle/output/text_to_video"
 7save_format = "gif"
 8out_path = '{}/{}.{}'.format(output_dir,prompt,save_format)
 9fps = 4
10chunk_size = 4
11model_path = "/home/aistudio/stable-diffusion-v1-5/runwayml/stable-diffusion-v1-5"
12model.process_text2video(prompt, model_name = model_path, fps = fps,save_path = out_path,save_format=save_format,chunk_size= chunk_size ,is_gradio = False, **params)

最终呈现的效果如图2所示:

640.gif

图2 文本视频生成效果

文本-视频编辑效果

根据用户输入的文本提示词对视频进行编辑。

图片

推理代码:

 1model = Model(device = "cuda", dtype = paddle.float16)
 2paddle.seed(1234)
 3prompt = "make it Van Gogh Starry Night style"
 4video_path = '__assets__/pix2pix video/camel.mp4'
 5output_dir = "/home/aistudio/work/Text2Video-Zero_paddle/output/video_instruct_pix2pix"
 6save_format = "gif"
 7out_path = '{}/{}.{}'.format(output_dir,prompt,save_format)
 8chunk_size = 8
 9model_path = "/home/aistudio/instruct_Pix2Pix/timbrooks/instruct-pix2pix"
10model.process_pix2pix(video_path, prompt=prompt, resolution=384,model_path =  model_path,chunk_size= chunk_size ,save_path=out_path,save_format=save_format,is_gradio = False)

最终呈现的效果如图3所示:

图片

图3 文本视频编辑效果

文本-视频编辑效果

根据用户输入的文本提示和运动姿态生成相应视频。

图片

推理代码如下:

 1model = Model(device = "cuda", dtype = paddle.float16)
 2paddle.seed(1234)
 3prompt = "an astronaut dancing in outer space"
 4motion_video_path = '/home/aistudio/work/Text2Video-Zero_paddle/__assets__/text_to_video_pose_control/dance5_corr.mp4'
 5output_dir = "/home/aistudio/work/Text2Video-Zero_paddle/output/text_to_video_pose_control"
 6save_format = "gif"
 7out_path = '{}/{}.{}'.format(output_dir,prompt,save_format)
 8stable_diffision_path="/home/aistudio/stable-diffusion-v1-5/runwayml/stable-diffusion-v1-5"
 9controlnet_path="/home/aistudio/controlnet/ppdiffusers/lllyasviel/sd-controlnet-openpose"
10model.process_controlnet_pose( motion_video_path, prompt=prompt, save_path=out_path,save_format=save_format,\
11chunk_size= 24, resolution=384,model_path_list=[stable_diffision_path,controlnet_path])

最终呈现的效果如图4所示:

图片

图4姿态引导的文本-视频生成效果

边缘引导的文本-视频生成

推理代码如下:

 1model = Model(device = "cuda", dtype = paddle.float16)
 2paddle.seed(1234)
 3prompt = 'oil painting of a deer, a high-quality, detailed, and professional photo'
 4video_path = '/home/aistudio/work/Text2Video-Zero_paddle/__assets__/text_to_video_edge_control/deer.mp4'
 5output_dir = "/home/aistudio/work/Text2Video-Zero_paddle/output/text_to_video_edge_control"
 6save_format = "gif"
 7out_path = '{}/{}.{}'.format(output_dir,prompt,save_format)
 8stable_diffision_path="/home/aistudio/stable-diffusion-v1-5/runwayml/stable-diffusion-v1-5"
 9controlnet_path="/home/aistudio/controlnet/ppdiffusers/lllyasviel/sd-controlnet-canny"
10model.process_controlnet_canny(video_path, prompt=prompt, save_path=out_path,save_format=save_format,\
11chunk_size=  16, resolution=384,model_path_list=[stable_diffision_path,controlnet_path])

最终呈现的效果如图5所示:

image.png

图5边缘引导的文本-视频生成效果

深度图引导的文本-视频生成

根据用户输入的文本提示和深度图生成相应视频。

image.png

推理代码如下:

 1model = Model(device = "cuda", dtype = paddle.float16)
 2paddle.seed(1234)
 3prompt = 'a santa claus, a high-quality, detailed, and professional photo'
 4video_path = '/home/aistudio/work/Text2Video-Zero_paddle/__assets__/text_to_video_depth_control/santa.mp4'
 5output_dir = "/home/aistudio/work/Text2Video-Zero_paddle/output/text_to_video_depth_control"
 6save_format = "gif"
 7out_path = '{}/{}.{}'.format(output_dir,prompt,save_format)
 8stable_diffision_path="/home/aistudio/stable-diffusion-v1-5/runwayml/stable-diffusion-v1-5"
 9controlnet_path="/home/aistudio/controlnet/ppdiffusers/lllyasviel/sd-controlnet-depth"
10model.process_controlnet_depth(video_path, prompt=prompt, save_path=out_path,save_format = save_format,\
11chunk_size=  16, resolution=384,model_path_list=[stable_diffision_path,controlnet_path])

最终呈现的效果如图6所示:

image.png

图6 深度图引导的文本-视频生成效果

边缘引导和 Dreambooth 定制的文本-视频生成

根据用户输入的文本提示、图像边缘和 Dreambooth 定制化模型生成相应视频。

image.png

推理代码如下所示:

 1model = Model(device = "cuda", dtype = paddle.float16)
 2paddle.seed(1234)
 3prompt = "Noelle with cat ears, blue hair"
 4video_path = '/home/aistudio/work/Text2Video-Zero_paddle/__assets__/text_to_video_dreambooth/woman1.mp4'
 5output_dir = "/home/aistudio/work/Text2Video-Zero_paddle/output/text_to_video_dreambooth"
 6save_format = "gif"
 7out_path = '{}/{}.{}'.format(output_dir,prompt,save_format)
 8dreambooth_model_path= '/home/aistudio/dream_outputs'
 9controlnet_path="/home/aistudio/controlnet/ppdiffusers/lllyasviel/sd-controlnet-canny"
10model.process_controlnet_canny_db(dreambooth_model_path, video_path, prompt=prompt, save_path=out_path,\
11 save_format=save_format,chunk_size=  16, resolution=384, model_path_list=[controlnet_path])

最终呈现的效果如图7所示:

图片

图7 边缘引导和 Dreambooth specialization 定制的文本-视频生成

结语

以上是本项目对 Text2Video-Zero 官方项目的全部实现。现有的文本-视频生成方法大多用于为用户提供灵感,很难为用户提供定制化视频生成服务。通过运动动力学、帧间注意力机制等技术手段对原始的文本-图像模型进行修改,Text2Video-Zero 很好地解决了上述问题,可以基于用户提供的文本提示、待编辑视频、运动姿态、边缘图像、深度图像和 Dreambooth 模型进行文本视频生成。该方法在无需训练的情况下,对主流的文本-图像生成模型进行微调,这意味着用户只需要训练出相应的文本-图像生成模型,就可以进行定制化的文本-视频生成,展现了 Text2Video-Zero 在文本-视频生成领域巨大的潜力。欢迎更多感兴趣的开发者参与到飞桨文本-视频生成生态的建设中,并依托百度飞桨AI技术开发出更多有趣的应用。

参考文献

[1] https://github.com/Picsart-AI-Research/Text2Video-Zero

[2] https://github.com/showlab/Tune-A-Video

[3] https://github.com/PaddlePaddle/PaddleNLP/tree/develop/ppdiffusers

[4] https://aistudio.baidu.com/aistudio/projectdetail/5972296

[5] https://aistudio.baidu.com/aistudio/projectdetail/5912535

往期推荐

  • 报名开启!2023大模型应用创新挑战赛来啦

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/702666.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringMVC原理分析 | 数据处理:ModelAndView

💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! 重定向和转发 ModelAndView 设置ModelAndView对象,根据view的名称、视图解析器跳转到指定的页面 页面:{视图解析器前缀} viewName {视图解析器…

git常用命令之命令集

15. 命令集 场景1. 构造1个文件的10个commit 命令作用for i in {1..10}; do date >> 66.txt && git add . && git commit -sm "update"; done自证 场景2. 构造10个文件 命令作用for i in {1..10}; do date >> "file_$i.log&quo…

Quiz 7: Files | Python for Everybody 配套练习_解题记录

文章目录 课程简介Quiz 7: Files 单选题(1-10)编程题Exercise 7.2 课程简介 Python for Everybody 零基础程序设计(Python 入门) This course aims to teach everyone the basics of programming computers using Python. 本课程…

项目——学生信息管理系统1

目录 创建项目 1. 修改Eclipse的编码为UTF-8,具体参考给的文档 1.1 设置代码自动保存 2. 创建Java项目 分包 添加数据库驱动jar包依赖 复制数据库驱动jar包到lib目录下 添加依赖 创建登陆页面 在 org.xingyun.view 包下创建 LoginFrm 选择 WindowBuilder下的 Swing D…

oracle 重复启动监听程序故障

又是一起 oracle 无法连接问题,检查配置都是正常的。 原来是碰到一个oralce的bugl了。 还真就是这个问题,子进程一kill掉,就恢复了。

微服务实战项目-学成在线-课程发布模块

学成在线-课程发布模块 1 模块需求分析 1.1 模块介绍 课程信息编辑完毕即可发布课程,发布课程相当于一个确认操作,课程发布后学习者在网站可以搜索到课程,然后查看课程的详细信息,进一步选课、支付、在线学习。 下边是课程编辑…

视频解说小程序看点小程序搭建上线,流量主对接实现广告收益

什么是视频解说小程序? 影视剪辑和解说,我们都知道有这类的抖音号,这时候就用到我们小程序了,流量主产生了收益。把视频解说上传到小程序,设置为广告观看,这样引导用户去小程序看,就产生一个广告…

(一)等值线 (Spatial Analyst)

等值线 (Spatial Analyst) 1.摘要 根据栅格表面创建等值线(等值线图)的线要素类。 等值线是用于连接各类等值点(如高程、温度、降雨量、污染或大气压力)的线。线的分布显示表面值的变化方式。值的变化量越小,线的间距就越大。值上升或下降得越快,线的间距就越小。 2.…

基于单片机的厨房安全监测

功能介绍 以STM32单片机作为主控系统; OLED液晶显示当前检测的气体浓度,温度,是否有火等信息; 按键可以设置温度上限、可燃气体浓度上限; 当温度超过我们设置自动开启风扇进行降温; 当检测到天然气泄露后蜂…

ROS学习篇之基础知识(一)-环境的安装

文章目录 一.ros的安装1.ros的一键安装:2.ros的验证是否安装成功3.安装导航必备的库: 二.VScode的配置1.安装ros插件2.安装cmake插件 三.VScode的简单使用1.快速注释: 四.pycharm的安装 一.ros的安装 1.ros的一键安装: wget htt…

shiro框架 shiro补充知识MD5加密

01.在用户登录时候,需要输入用户名和密码。 用户名用数据库的select来查询是否存在。 密码比较私密,就是后台的程序员也不可以查看,这需要加密。 一般的加密算法是MD5 02.例如: SecurityUtils 类是shiro框架的一个类。SecurityUt…

LabVIEW开发牵引控制动态仿真器

LabVIEW开发牵引控制动态仿真器 车辆牵引力控制包括轮胎在横向和纵向上的牵引力控制,以获得所需的车辆运动。决定轮胎牵引力的力来自路面和轮胎之间的相互作用,它们分解为两个组成部分:一个在横向,另一个在纵向。第一个组件取决于…

MSP432学习笔记11:定时器A的结构\基地址\函数汇总理解

今日得以继续我的电赛MSP432学习之路:所用开发板MSP432P401R 定时器是任何单片机开发板十分重要的模块,在几日的学习使用过程中,本人也对其使用原理等产生过许多疑问,他究竟是怎么存储计数值、捕获值的?一个定时器四个…

基于Java校园车辆管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

Arduino Proteus仿真DHT11自动浇水浇花浇土装置-0048

Arduino Proteus仿真DHT11自动浇水浇花浇土装置-0048 Proteus仿真小实验: Arduino Proteus仿真DHT11自动浇水浇花浇土装置-0048 功能: 硬件组成:ARDUINO -UNO-R3开发板、 LCD1602 、DHT11温湿度传感器、LED灯、电机模拟水泵、2个按键 1.单…

【详解代码】vue element el-select选择器多选下拉框实现全选功能和取消全选

目录 解决方法 下拉项增加一个【全部】⭐️效果图如下:默认全选情况一:下拉选项全都勾选时,【全部】自动勾选;情况二:下拉选项全都未勾选时,点击【全部】后,所有下拉选项全部勾选;情…

V90伺服驱动器实现一键优化的具体方法

V90伺服驱动器实现一键优化的具体方法 目的:解决运行中震动、异响等问题。 前提条件: 使用一键自动优化的前提:  对于带绝对值编码器的电机:位置限制由p29027决定,至少为180  对于带增量式编码器的电机:在开始优化时必须允许电机有2圈的自由旋转,p29027至少为720 使…

Linux挂载新磁盘到服务器新目录-干货分享

确认磁盘 新建分区 输入m查看帮助: 输入n新建分区,输入p建立分区(其他默认将全部空间进行分配): 输入w进行保存 lsblk再次确认分配完成后的新分区: 格式化分区 明确文件系统格式,一般有xf…

十四、Jenkins打包完成后,执行python脚本,将发行包打包压缩上传禅道提交版本

十四、Jenkins打包完成后,执行脚本,将版本发行包压缩上传禅道提交禅道版本 十三、禅道登录/提交版本/编辑版本接口 ,书接上回,在禅道中注册一个Jenkins账号,利用禅道的接口,提交到禅道中,具体代…

数据仓库系列:StarRocks 入门培训教程

文章目录 1. 什么是StarRocks?1.1. 适用场景1.2. [产品特性](https://docs.starrocks.io/zh-cn/latest/introduction/Features) 2. 系统架构2.1. 系统架构2.1.1. 整体架构2.1.2. 高可用实现方式 2.2. 数据如何管理? 3. 表模型3.1. 明细模型3.2. 聚合模型3.3. 更新模…