纯净无噪,智见未来——MAGI-1本地部署教程,自回归重塑数据本质
一、MAGI-1简介
MAGI-1 是一种逐块生成视频的自回归去噪模型,而非一次性生成完整视频。每个视频块(含 24 帧)通过整体去噪处理,当前块达到特定去噪阈值后,立即启动下一块的生成。这种流水线设计支持 最多 4 个块的并发处理 ,显著提升视频生成效率。
- 基于 Transformer 架构的变分自编码器(VAE)
- 采用 Transformer 架构的变分自编码器,支持 8 倍空间压缩和 4 倍时间压缩 ,在实现最快平均解码速度的同时,具备高度竞争性的重构质量。
SandAI提供了 MAGI-1 的预训练权重,包括 240 亿参数和 45 亿参数的模型,以及对应的蒸馏模型(Distill)和蒸馏 + 量化模型(Distill+Quant)。所有模型权重的下载链接详见表中内容。
Model | Link | Recommend Machine |
---|---|---|
T5 | T5 | - |
MAGI-1-VAE | MAGI-1-VAE | - |
MAGI-1-24B | MAGI-1-24B | H100/H800 * 8 |
MAGI-1-24B-distill | MAGI-1-24B-distill | H100/H800 * 8 |
MAGI-1-24B-distill+fp8_quant | MAGI-1-24B-distill+quant | H100/H800 * 4 or RTX 4090 * 8 |
MAGI-1-4.5B | MAGI-1-4.5B | RTX 4090 * 1 |
二、本地部署
环境 | 版本 |
---|---|
Python | >=3.10 |
PyTorch | =2.4.0 |
Ubtuntu | =22.4.0 |
注意由于官方目前并没有开放4.5B的模型,因此本次部署的是MAGI-1-24B-distill+fp8_quant这个模型,需要显卡H100/H800 * 4 or RTX 4090 * 8
1.创建虚拟环境
1.1安装Miniconda
步骤1:更新系统
首先,更新您的系统软件包:
sudo apt update
sudo apt upgrade -y
步骤2:下载Miniconda安装脚本
访问Miniconda的官方网站或使用以下命令直接下载最新版本的安装脚本(以Python 3为例):
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
步骤3:验证安装脚本的完整性(可选)
下载SHA256校验和文件并验证安装包的完整性:
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh.sha256
sha256sum Miniconda3-latest-Linux-x86_64.sh
比较输出的校验和与.sha256文件中的值是否一致,确保文件未被篡改。
步骤4:运行安装脚本
为安装脚本添加执行权限:
chmod +x Miniconda3-latest-Linux-x86_64.sh
运行安装脚本:
./Miniconda3-latest-Linux-x86_64.sh
步骤5:按照提示完成安装
安装过程中,您需要:
阅读许可协议:按Enter键逐页阅读,或者按Q退出阅读。
接受许可协议:输入yes并按Enter。
选择安装路径:默认路径为/home/您的用户名/miniconda3,直接按Enter即可,或输入自定义路径。
是否初始化Miniconda:输入yes将Miniconda添加到您的PATH环境变量中。
步骤6:激活Miniconda环境
安装完成后,使环境变量生效:
source ~/.bashrc
步骤7:验证安装是否成功
检查conda版本:
conda --version
步骤8:更新conda(推荐)
为了获得最新功能和修复,更新conda:
conda update conda
1.2.创建虚拟环境
conda create -n magi python==3.10.12
2.下载PyTorch
#进入虚拟环境
conda activate magi
#下载pytorch
conda install pytorch==2.4.0 torchvision==0.19.0 torchaudio==2.4.0 pytorch-cuda=12.4 -c pytorch -c nvidia
3.克隆MAGI-1仓库
自动下载
git clone https://github.com/SandAI-org/MAGI-1.git
或者可以进入下面的网页收到过下载到本地
网址:SandAI-org/MAGI-1:MAGI-1:大规模自回归视频生成
4.安装依赖
#进入项目目录
cd /MAGI-1
#安装依赖
pip install -r requirements.txt
# Install ffmpeg
conda install -c conda-forge ffmpeg=4.4
5.安装MagiAttention
#下载MagiAttention
git clone https://github.com/SandAI-org/MagiAttention.git
#进入文件夹
cd /MAGI-1/MagiAttention
#安装依赖
git submodule update --init --recursive
pip install --no-build-isolation .
6.启动
6.1.参数说明
--config_file
:指定配置文件的路径,其中包含模型配置参数,例如 .example/24B/24B_config.json
--mode
:指定作模式。可用选项包括:t2v
: 文本到视频i2v
: 图像到视频v2v
: 视频到视频
--prompt
:用于生成视频的文本提示,例如 ."Good Boy"
--image_path
:图像文件的路径,仅在 mode 中使用。i2v
--prefix_video_path
:前缀视频文件的路径,仅在 mode 中使用。v2v
--output_path
:保存生成的视频文件的路径。
6.2.Bash 脚本
#!/bin/bash
# Run 24B MAGI-1 model
bash example/24B/run.sh# Run 4.5B MAGI-1 model
bash example/4.5B/run.sh
视频保存路径:/MAGI-1/example/assets/
6.3.自定义参数
您可以根据需要修改 中的参数。例如:run.sh
- 要使用 Image to Video 模式 (),请设置为 并提供 :
i2v``--mode``i2v``--image_path
--mode i2v \ --image_path example/assets/image.jpeg \
- 要使用 Video to Video 模式 (),请设置为 并提供 :
v2v``--mode``v2v``--prefix_video_path
--mode v2v \ --prefix_video_path example/assets/prefix_video.mp4 \
通过调整这些参数,您可以灵活地控制输入和输出以满足不同的要求。
7.使用本地下载模型(推荐)
在启动MAGI-1中它会在Hugging Face中下载模型,但是由于网络等原因会出现下载失败的问题,因此推荐本地下载模型
在魔搭社区中下载
#下载模型
modelscope download --model sand-ai/MAGI-1
#下载到指定文件夹modelscope download --model 'sand-ai/MAGI-1' --local_dir 'path/to/dir'
7.1.配置模型路径
路径:/MAGI-1/example/24B/24B_config.json
按照自己的模型路径修改框中的三个参数
8.启动Web页面(可选)
官方发布的模型是没有web页面,本页面为自制,需要的可以设置
安装依赖
pip install gradio==5.26.0 python-dotenv psutil
8.1.目录结构
按照结构创建web及其web中的文件
/MAGI-1/
├── web/
│ ├── app.py # 主程序
│ ├── config_manager.py # 配置文件操作
│ ├── run_script.py # 脚本执行器
│ └── presets/ # 预设配置存储
└── example/└── 24B/└── 24B_config.json # 模型配置文件
还要创建log
mkdir -p /MAGI-1/log
设置执行权限
chmod +x /MAGI-1/example/24B/run.sh
8.2.Gradio 前端实现 (app.py)
import gradio as gr
import json
import os
import time
from config_manager import update_config, load_config
from run_script import run_generationBASE_DIR = "/MAGI-1"
CONFIG_PATH = os.path.join(BASE_DIR, "example/24B/24B_config.json")
PRESETS_DIR = os.path.join(BASE_DIR, "web/presets")
OUTPUT_DIR = os.path.join(BASE_DIR, "example/assets") # 明确输出目录# 初始化配置
def init_ui():config = load_config(CONFIG_PATH)return [config["num_frames"],config["video_size_h"],config["video_size_w"],config["num_steps"],config["window_size"],config["fps"]]# 动态显示输入组件
def toggle_inputs(mode):return [gr.File(visible=mode == "i2v", file_types=["image/*"]), # 允许所有图片类型gr.File(visible=mode == "v2v", file_types=["video/*"]), # 允许所有视频类型gr.Text(visible=True)]# 保存预设
def save_preset(name, params):preset_path = os.path.join(PRESETS_DIR, f"{name}.json")with open(preset_path, "w") as f:json.dump(params, f)return f"预设 {name} 保存成功!"# 加载预设
def load_preset(name):preset_path = os.path.join(PRESETS_DIR, f"{name}.json")with open(preset_path, "r") as f: # 正确加载 JSON 文件params = json.load(f)return list(params.values()) # 返回参数列表with gr.Blocks(title="MAGI-I 视频生成系统", theme=gr.themes.Soft()) as app:gr.Markdown("# 🎥 MAGI-I 智能视频生成系统")with gr.Row():with gr.Column(scale=1):mode = gr.Radio(label="生成模式",choices=["t2v", "i2v", "v2v"],value="t2v")prompt = gr.Textbox(label="输入提示", placeholder="请输入提示词...")image_input = gr.File(label="上传图片", visible=False, type="binary")video_input = gr.File(label="参考视频", visible=False, type="binary")num_frames = gr.Slider(4, 128, step=8, label="视频帧数")video_size_h = gr.Slider(256, 1080, step=16, label="视频高度")video_size_w = gr.Slider(256, 1920, step=16, label="视频宽度")num_steps = gr.Slider(1, 20, step=1, label="生成步数")window_size = gr.Slider(1, 8, step=1, label="窗口大小")fps = gr.Slider(12, 60, step=1, label="帧率")with gr.Accordion("预设管理", open=False):preset_name = gr.Textbox(label="预设名称")save_btn = gr.Button("保存当前配置")preset_status = gr.Textbox(label="操作状态")load_dropdown = gr.Dropdown(label="加载预设",choices=[f.split(".")[0] for f in os.listdir(PRESETS_DIR)])start_btn = gr.Button("🚀 开始生成", variant="primary")with gr.Column(scale=2):output_video = gr.Video(label="生成结果", format="mp4")progress = gr.Slider(0, 100, label="生成进度", interactive=False)duration_display = gr.Textbox(label="生成耗时(秒)") # 新增时间显示logs = gr.Textbox(label="生成日志", lines=10)with gr.Accordion("生成历史", open=True):history = gr.DataFrame(headers=["时间", "模式", "提示词", "输出文件", "耗时"],datatype=["str", "str", "str", "str", "str"],interactive=False)# 事件绑定mode.change(toggle_inputs, inputs=mode, outputs=[image_input, video_input, prompt])save_btn.click(save_preset,inputs=[preset_name, num_frames, video_size_h, video_size_w, num_steps, window_size, fps],outputs=preset_status)load_dropdown.change(load_preset,inputs=load_dropdown,outputs=[num_frames, video_size_h, video_size_w, num_steps, window_size, fps])start_btn.click(run_generation, # 确保该函数返回 durationinputs=[mode, prompt, image_input, video_input,num_frames, video_size_h, video_size_w,num_steps, window_size, fps],outputs=[output_video, progress, logs, history, duration_display])if __name__ == "__main__":app.launch(server_port=8080,server_name="0.0.0.0",allowed_paths=[OUTPUT_DIR, # 使用变量定义允许路径PRESETS_DIR],app_kwargs={"static_dirs": {"/assets": OUTPUT_DIR # 确保静态路径映射正确}})
8.3.配置文件管理 (config_manager.py)
import json
import osdef load_config(path):with open(path, "r") as f:return json.load(f)def update_config(path, params):config = load_config(path)config.update({"num_frames": int(params[0]),"video_size_h": int(params[1]),"video_size_w": int(params[2]),"num_steps": int(params[3]),"window_size": int(params[4]),"fps": int(params[5])})with open(path, "w") as f:json.dump(config, f, indent=2)
8.4.脚本执行器 (run_script.py)
import subprocess
import time
import os
from threading import Thread
from queue import Queue, EmptyBASE_DIR = "/MAGI-1"
LOG_DIR = os.path.join(BASE_DIR, "log")
OUTPUT_DIR = os.path.join(BASE_DIR, "example/assets") # 明确定义输出目录def convert_video(input_path):"""使用ffmpeg转码为H.264格式(增加错误处理)"""if not os.path.exists(input_path):return input_pathoutput_path = input_path.replace(".mp4", "_converted.mp4")try:subprocess.run(["ffmpeg", "-v", "error", # 隐藏非必要日志"-i", input_path,"-c:v", "libx264","-preset", "fast","-movflags", "+faststart", # 优化网络播放"-y",output_path], check=True, stderr=subprocess.PIPE)print(f"转码成功: {input_path} -> {output_path}")return output_pathexcept subprocess.CalledProcessError as e:print(f"转码失败: {e.stderr.decode()}")return input_pathexcept Exception as e:print(f"未知错误: {str(e)}")return input_pathdef run_generation(mode, prompt, image, video, *params):start_time = time.time()# 初始化临时文件变量temp_image = Nonetemp_video = None# 确保输出目录存在os.makedirs(OUTPUT_DIR, exist_ok=True)# 生成唯一文件名(包含原始模式标记)timestamp = int(time.time())base_name = f"output_{mode}_{timestamp}"raw_path = os.path.join(OUTPUT_DIR, f"{base_name}.mp4")if not prompt or prompt.strip() == "":raise ValueError("提示词不能为空!")# 构建命令参数(使用列表格式避免注入风险)cmd_args = ["bash", os.path.join(BASE_DIR, "example/24B/run.sh"),"--mode", mode,"--prompt", prompt.strip(), # 添加清理空格处理"--output_path", raw_path]# 处理输入文件(使用临时文件拷贝)if mode == "i2v" and image:temp_image = os.path.join(OUTPUT_DIR, f"temp_{timestamp}.jpg")with open(temp_image, "wb") as f:f.write(image) # 直接写入二进制数据cmd_args.extend(["--image_path", temp_image])if mode == "v2v" and video:temp_video = os.path.join(OUTPUT_DIR, f"temp_{timestamp}.mp4")with open(temp_video, "wb") as f:f.write(video) # 直接写入二进制数据cmd_args.extend(["--prefix_video_path", temp_video])# 执行生成(禁用shell=True提高安全性)logs = []try:process = subprocess.Popen(cmd_args,stdout=subprocess.PIPE,stderr=subprocess.STDOUT,text=True,encoding="utf-8",errors="replace")# 实时日志捕获def logger():while True:output = process.stdout.readline()if output == '' and process.poll() is not None:breakif output:logs.append(output.strip())log_thread = Thread(target=logger)log_thread.start()process.wait()log_thread.join()except Exception as e:logs.append(f"执行错误: {str(e)}")finally: # 清理临时文件for f in [temp_image, temp_video]:if f is not None and os.path.exists(f):os.remove(f)# 转码处理final_path = convert_video(raw_path)# 设置文件权限(兼容Windows)if os.name != 'nt':os.chmod(final_path, 0o644)# 生成web路径(与static_dirs配置对应)web_path = f"/assets/{os.path.basename(final_path)}"# 计算耗时(包含转码时间)time_cost = time.time() - start_time# 构建历史记录history_entry = [time.strftime("%Y-%m-%d %H:%M:%S"),mode.upper(),prompt[:20] + "..." if len(prompt) > 20 else prompt,os.path.basename(final_path),f"{time_cost:.1f}秒"]return (final_path, # 输出视频路径,返回绝对路径100, # 进度"\n".join(logs), # 日志[history_entry], # 历史记录f"{time_cost:.1f}秒" # 耗时显示)
8.5.需要修改的 run.sh 脚本
路径:/MAGI-1/example/24B/run.sh
#!/bin/bash# ...保持原有环境变量设置不变...# 解析命令行参数
while [[ $# -gt 0 ]]; docase "$1" in--mode)MODE=$2shift 2;;--prompt)PROMPT=$2shift 2;;--image_path)IMAGE_PATH=$2shift 2;;--prefix_video_path)PREFIX_VIDEO_PATH=$2shift 2;;--output_path)OUTPUT_PATH=$2shift 2;;*)shift;;esac
done# 更新运行命令
torchrun $DISTRIBUTED_ARGS inference/pipeline/entry.py \--config_file example/24B/24B_config.json \--mode ${MODE:-t2v} \--prompt "${PROMPT:-Good Boy}" \${IMAGE_PATH:+--image_path $IMAGE_PATH} \${PREFIX_VIDEO_PATH:+--prefix_video_path $PREFIX_VIDEO_PATH} \--output_path ${OUTPUT_PATH:-example/assets/output.mp4}
8.6.修改路径
路径:/MAGI-1/inference/pipeline/prompt_process.py
将prompt_process.py文件中框出来的部分修改为如图所示
8.7.启动 Web 服务
cd /MAGI-1/web
python app.py
结果:
#在浏览器中输入网址
http://127.0.0.1:8080
web页面:
相关文章:
纯净无噪,智见未来——MAGI-1本地部署教程,自回归重塑数据本质
一、MAGI-1简介 MAGI-1 是一种逐块生成视频的自回归去噪模型,而非一次性生成完整视频。每个视频块(含 24 帧)通过整体去噪处理,当前块达到特定去噪阈值后,立即启动下一块的生成。这种流水线设计支持 最多 4 个块的并发…...
BG开发者日志0427:故事的起点
1、4月26日晚上,BG项目的gameplay部分开发完毕,后续是细节以及试玩版优化。 开发重心转移到story部分,目前刚开始, 确切地说以前是长期搁置状态,因为过去的四个月中gameplay部分优先开发。 --- 2、BG这个项目的起点…...
直播预告|TinyVue 组件库高级用法:定制你的企业级UI体系
TinyVue 是一个跨端跨框架的企业级 UI 组件库,基于 renderless 无渲染组件设计架构,实现了一套代码同时支持 Vue2 和 Vue3,支持 PC 和移动端,包含 100 多个功能丰富的精美组件,可帮助开发者高效开发 Web 应用。 4 月 …...
基于Jamba模型的天气预测实战
深入探索Mamba模型架构与应用 - 商品搜索 - 京东 DeepSeek大模型高性能核心技术与多模态融合开发 - 商品搜索 - 京东 由于大气运动极为复杂,影响天气的因素较多,而人们认识大气本身运动的能力极为有限,因此以前天气预报水平较低 。预报员在预…...
Customizing Materials Management with SAP ERP Operations
Customizing Materials Management with SAP ERP Operations...
使用 NServiceBus 在 .NET 中构建分布式系统
在 .NET 中,NServiceBus 依然是构建可靠、可扩展、异步消息驱动架构的强大工具。本文将为你讲解如何在 .NET 环境下集成 NServiceBus,帮助你理解其核心概念及配置方法,并快速上手构建基于消息的系统。 一、NServiceBus 简介 NServiceBus …...
【Linux网络与网络编程】13.五种 IO 模型
前言 在前面的学习中,有一个问题一直没有展开来说,即 IO 问题。 IO 到底有多少种方式呢?什么是高效的 IO 呢? IO 本质上就是 INPUT 和 OUTPUT 。在网络中 INPUT 就是从网卡中获取数据,而 OUTPUT 就是向网卡中发送数据…...
Java后端开发day37--源码解析:TreeMap可变参数--集合工具类:Collections
(以下内容全部来自上述课程) 1. TreeMap 1.1 须知 1.1.1 Entry 节点初始为黑色:提高代码阅读性 1.1.2 TreeMap中的成员变量 comparator:比较规则root:红黑树根节点的地址值size:集合的长度和红黑树…...
海关 瑞数 后缀分析 rs
声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 逆向过程 部分python代码 cp execj…...
【合新通信】---Mini单路光模块(Mini SFF/USOT)
产品特性 l 高可靠、全金属外壳、抗振动设计 l 紧凑的结构设计, 超小模块尺寸 l 可插拔标准LC单模光纤连接器接口,方便动态和灵活的配置数据连接 l 每通道工作速率可达1.25Gbps,速率可向下兼容 l 单路发射光纤通道,内置1310nm波长光发射…...
Java详解LeetCode 热题 100(02):LeetCode 49. 字母异位词分组(Group Anagrams)详解
文章目录 1. 题目描述2. 理解题目3. 解法一:排序法3.1 思路3.2 Java代码实现3.3 代码详解3.4 复杂度分析3.5 适用场景4. 解法二:计数法4.1 思路4.2 Java代码实现4.3 代码详解4.4 复杂度分析4.5 适用场景5. 解法三:字符串哈希法5.1 思路5.2 Java代码实现5.3 代码详解5.4 复杂…...
【每日随笔】文化属性 ① ( 天机 | 强势文化与弱势文化 | 文化属性的形成与改变 | 强势文化 具备的特点 )
文章目录 一、文化属性1、天机2、文化属性的强势文化与弱势文化强势文化弱势文化 二、文化属性的形成与改变1、文化属性形成2、文化属性改变3、文化知识的阶层 三、强势文化 具备的 特点 一、文化属性 1、天机 如果想要 了解这个世界的 底层架构 , 就需要掌握 洞察事物本质 的能…...
Java + Seleium4.X + TestNG自动化技术
系列文章目录 文章目录 系列文章目录前言一、 Java版Selenium自动化测试框架介绍和原理1.1 什么是Seleium1.2 特点1.3 注意点 二、安装SeleiumChrome环境 创建Maven项目2.1 安装Seleium Chrome环境2.2 Maven环境 三、Selenium4.X UI元素定位实战3.1 ID选择器3.2 Name选择器3.…...
Spark SQL核心概念与编程实战:从DataFrame到DataSet的结构化数据处理
一、Spark-SQL是什么 Spark SQL 是 Spark 用于结构化数据(structured data)处理的 Spark 模块。 二、Hive and SparkSQL SparkSQL 的前身是 Shark,Shark是给熟悉 RDBMS 但又不理解 MapReduce 的技术人员提供的快速上手的工具。 Hive 是早期唯一运行在 Hadoop 上的 S…...
electron-vite 应用打包自定义图标不显示问题
// 修改electron-builder.yml ... win:executableName: xxx //可执行文件名称icon: build/icon.ico //你的图标路径 ...打包后,自定义图标不显示原因: 1 cannot execute causeexit status 2,安装包无法生成 用管理员身份运行,win11右击开始…...
AI中Token的理解与使用总结
AI中Token的理解与使用总结 什么是Token 在AI领域,特别是自然语言处理(NLP)中,Token是指将文本分割成的最小处理单元。Tokenization(分词)是将原始文本分解为Token的过程。 Token的几种形式 单词级Token:以单词为基本单位 示例:“Hello world” → [“Hello”, “world”…...
C++/SDL 进阶游戏开发 —— 双人塔防(代号:村庄保卫战 14)
🎁个人主页:工藤新一 🔍系列专栏:C面向对象(类和对象篇) 🌟心中的天空之城,终会照亮我前方的路 🎉欢迎大家点赞👍评论📝收藏⭐文章 文章目录 二…...
全栈量子跃迁:当Shor算法破解RSA时,我们如何用晶格密码重构数字世界的信任基岩?
一、量子威胁的降维打击 1. Shor算法的毁灭性力量 # Shor算法量子电路简化示例(Qiskit实现) from qiskit import QuantumCircuit from qiskit.circuit.library import QFTdef shor_circuit(n: int, a: int) -> QuantumCircuit:qc QuantumCircuit(2…...
python实战项目65:drissionpage采集boss直聘数据
python实战项目65:drissionpage采集boss直聘数据 一、需求简介二、流程分析三、完整代码一、需求简介 boss直聘网站近期改版,改版之后代码需要做相应的升级维护。drissionpage采集网页数据是一种不错的方式,笔者认为比Selenium好用,使用方法大家可以自行查阅资料。boss直聘…...
常用的性能提升手段--提纲
上一篇文章里,介绍了提升性能的一种优化手段:池化。 这篇文章来归纳整理一下其他的常见的提升性能的手段 1. 缓存 (Caching) 缓存可以说是计算机领域的万金油了,它无处不在。 举个最简单的例子,CPU -> L1,L2,L3 Cache -> 内存 。 CPU的处理速度要比内存快几个数量…...
天梯——现代战争
第一次做的时候,直接暴力,显然最后超时。 暴力代码如下: #include<bits/stdc.h> using namespace std; const int N10005; bool mark1[N]{0},mark2[N]{0}; int p[N][N]; int main(){int n,m,k,a,b;cin>>n>>m>>k;fo…...
Codeforces Round 1021 (Div. 2) D. Baggage Claim(建图)
每周五篇博客:(4/5) https://codeforces.com/contest/2098/problem/D 题意 每个机场都有一个行李索赔区,巴尔贝索沃机场也不例外。在某个时候,Sheremetyevo的一位管理员提出了一个不寻常的想法:将行李索…...
常用第三方库:shared_preferences数据持久化
常用第三方库:shared_preferences数据持久化 前言 shared_preferences是Flutter中最常用的轻量级数据持久化解决方案,它提供了一个简单的key-value存储机制,适合存储用户配置、应用设置等小型数据。本文将从实战角度深入讲解shared_prefere…...
项目驱动 CAN-bus现场总线基础教程》随笔
阅读:《项目驱动 CAN-bus现场总线基础教程》 仲裁段的实现 有感而发 感觉出人意外之处 感觉出人意外之处 最近在阅读入门的CAN相关书籍时,在介绍仲裁段是如何实现各节点之间,通讯仲裁功能的章节中,有如下一段描述: …...
WPF之XAML基础
文章目录 XAML基础:深入理解WPF和UWP应用开发的核心语言1. XAML简介XAML与XML的关系 2. XAML语法基础元素语法属性语法集合语法附加属性 3. XAML命名空间命名空间映射关系 4. XAML标记扩展静态资源引用数据绑定相对资源引用常见标记扩展对比 5. XAML与代码的关系XAM…...
测试基础笔记第十四天
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、字符串1.字符串2.字符串切片3.查找find()4.去除两端空白字符 strip5.字符串转换大小写 lower、upper5.拆分 split()6.字符串的其他常见方…...
Java详解LeetCode 热题 100(01):LeetCode 1. 两数之和(Two Sum)详解
文章目录 1. 题目描述2. 理解题目3. 解法一:暴力枚举法3.1 思路3.2 Java代码实现3.3 代码详解3.4 复杂度分析3.5 适用场景 4. 解法二:哈希表法4.1 思路4.2 Java代码实现4.3 代码详解4.4 复杂度分析4.5 适用场景 5. 解法三:两遍哈希表法5.1 思…...
机器学习之三:归纳学习
正如人们有各种各样的学习方法一样,机器学习也有多种学习方法。若按学习时所用的方法进行分类,则机器学习可分为机械式学习、指导式学习、示例学习、类比学习、解释学习等。这是温斯顿在1977年提出的一种分类方法。 有关机器学习的基本概念,…...
AI声像融合守护幼儿安全——打骂/异常声音报警系统的智慧防护
幼儿园是孩子们快乐成长的摇篮,但打骂、哭闹或尖叫等异常事件可能打破这份宁静,威胁幼儿的身心安全。打骂/异常声音报警系统,依托尖端的AI声像融合技术,结合语音识别、情绪分析与视频行为检测,为幼儿园筑起一道智能安全…...
2024ICPC网络赛第二场题解
文章目录 F. Tourist(签到)I. Strange Binary(思维)J. Stacking of Goods(思维)A. Gambling on Choosing Regionals(签到)G. Game(数学)L. 502 Bad Gateway(数学)E. Escape(BFS)C. Prefix of Suffixes(kmp结论)K. match(01trie分治多项式乘法组合数) 题目链接 F. Tourist(签到…...
风控策略引擎架构设计全解析:构建智能实时决策系统
摘要 本文深入探讨现代风控策略引擎的核心架构设计,结合金融反欺诈、电商交易风控等典型场景,详细解析实时决策、规则引擎、特征计算等关键技术模块的实现方案。通过分层架构设计、分布式计算优化、策略动态编排等创新方法,展示如何构建支撑每秒万级决策的高可用风控系统。…...
TensorFlow 安装全攻略
选择 TensorFlow 的原因: TensorFlow 是一个端到端平台,它提供多个抽象级别,因此您可以根据自己的需求选择合适的级别。您可以使用高阶 Keras API 构建和训练模型,该 API 让您能够轻松地开始使用 TensorFlow 和机器学习。如果您需…...
Dijkstra 算法代码步骤[leetcode.743网络延迟时间]
有 n 个网络节点,标记为 1 到 n。 给你一个列表 times,表示信号经过 有向 边的传递时间。 times[i] (ui, vi, wi),其中 ui 是源节点,vi 是目标节点, wi 是一个信号从源节点传递到目标节点的时间。 现在,…...
Ubuntu22.04/24.04 P104-100 安装驱动和 CUDA Toolkit
硬件环境 使用一块技嘉 B85m-DS3H 安装 P104-100, CPU是带集成显卡的i5-4690. 先在BIOS中设置好显示设备优先使用集成显卡(IGX). 然后安装P104-100开机. 登入Ubuntu 后查看硬件信息, 检查P104-100是否已经被检测到 # PCI设备 lspci -v | grep -i nvidia lspci | grep NVIDIA …...
Golang 学习指南
目录 变量与常量数据类型与控制结构常用数据结构函数与错误处理指针与并发Gin 框架与 go mod小结与参考资料 1. 变量与常量 变量(var) 用于定义可变的值。可以指定类型,也可以自动推断类型。示例:var name string "Golang…...
Ubuntu 磁盘空间占用清理(宝塔)
目录 前言1. 基本知识2. 实战 前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 爬虫神器,无代码爬取,就来:bright.cn 本身自搭建了一个宝塔,突然一下子多了好些空…...
AntBio: 2025 AACR Meeting - Charting New Oncology Frontiers Together
AntBio cordially invites you to attend the 2025 AACR Annual Meeting and jointly chart a new course in oncology research! The global benchmark for cancer research and therapeutics—the 2025 American Association for Cancer Research (AACR) Annual Meeting—wi…...
数模学习:二,MATLAB的基本语法使用
注释代码: (1)在每行语句后面加上分号,则不显示该行代码的运算结果。 在每行代码前加%,则该行代码会被注释掉 (2) 多行注释: 选中要注释的多行语句,按快捷键Ctrl R (3) 取消注释: 选中要注释的多行语句…...
【Webpack \ Vite】多环境配置
环境变量脚本命令 如何通过不同的环境变量或不同的配置文件进行项目区分,动态加载配置。通常,使用环境变量是最简单且灵活的方法,因为它不需要改变构建命令或创建多个配置文件 环境变量 在根目录下创建 .env.xxx 文件,为不同的环…...
已知漏洞打补丁
. 打补丁 根据MS漏洞编号或者CVE漏洞编号都可以找到对应的HotfixID。 1.根据MS漏洞编号可以使用:https://learn.microsoft.com/zh-cn/security-updates/securitybulletins/securitybulletins 即可找到KB编号。 2.根据CVE漏洞编号可以使用:https://cve…...
WGS84(GPS)、火星坐标系(GCJ02)、百度地图(BD09)坐标系转换Java代码
在做基于百度地图、高德地图等电子地图做为地图服务的二次开发时,通常需要将具有WGS84等坐标的矢量数据(如行政区划、地名、河流、道路等GIS地理空间数据)添加到地图上面。 然而,在线地图大多使用的是火星坐标系,需要…...
R语言操作n
1.加载安装vegan包 2.查看data(varechem)和data(varespec),探索其维度和结构 3.基于varespec构建物种互作网络,输出gml文件并采用gephi可视化为图片,输出pdf,阈值为r>0.6,p<0.05 4.基于varespec和varechem构建物种-环境互作…...
ChatGPT与DeepSeek在科研论文撰写中的整体科研流程与案例解析
随着人工智能技术的快速发展,大语言模型如ChatGPT和DeepSeek在科研领域展现出强大的潜力,尤其是在论文撰写方面。本文旨在介绍如何利用ChatGPT和DeepSeek提升科研论文撰写的效率与质量,并提供一个具体案例,详细阐述其技术流程及公…...
VScode在 Markdown 编辑器中预览
1. 使用在线 Mermaid 编辑器 步骤: 打开 Mermaid Live Editor。将你 .md 文件中的 Mermaid 代码(从 mermaid 到结束的代码块)复制粘贴到编辑器的左侧输入框。编辑器会自动在右侧生成可视化的 ER 图。你可以点击右上角的下载按钮,…...
驱动开发硬核特训 · Day 22(下篇): # 深入理解 Power-domain 框架:概念、功能与完整代码剖析
一、Power-domain 框架基础概念 ✏️ 什么是 Power-domain? 在 Linux 内核中,Power-domain(电源域) 是指一组硬件模块的逻辑集合,这些模块可以被统一控制电源状态(上电、断电)。 Linux 内核通…...
无人机超声波避障技术要点与难点!
一、超声波避障技术要点 4. 障碍物建模 通过最小二乘法平面拟合,将单点测距数据转化为障碍物表面模型,提高避障准确性。 使用队列(wallqueue)存储障碍物信息,并进行去重处理,避免重复避障。 5. 避障轨…...
ASCII字符编码标准及字符表
目录 概述 1 标准 ASCII 表(0-127) 2 大写字母(A-Z) 3 小写字母(a-z) 4 说明 概述 ASCII(American Standard Code for Information Interchange,美国信息交换标准代码ÿ…...
联想昭阳笔记本 风扇一键静音优化操作指南
【联想昭阳笔记本 一键静音优化操作指南】 第1步:安装官方工具 Lenovo Vantage 打开【开始菜单】→ 搜索【Microsoft Store】,打开。在 Store 里搜索【Lenovo Vantage】,下载安装。安装好后,打开【Lenovo Vantage】。进入【设备…...
go语言八股文(三)
1.java和go的区别 1. 语言设计目标 Java: 通用性:设计为一种通用的、面向对象的编程语言,适用于多种应用场景,如桌面应用、服务器端应用、移动应用等。跨平台性:通过“一次编写,到处运行”(Wr…...
Flutter 学习之旅 之 flutter 有时候部分手机【TextField】无法唤起【输入法软键盘】的一些简单整理
Flutter 学习之旅 之 flutter 有时候部分手机【TextField】无法唤起【输入法软键盘】的一些简单整理 目录 Flutter 学习之旅 之 flutter 有时候部分手机【TextField】无法唤起【输入法软键盘】的一些简单整理 一、简单介绍 二、现象描述 三、尝试的解决方案 1、根据应用的…...