从零部署VideoChat2:多模态视频理解模型实战指南

news2026/4/30 8:43:42
1. 项目概述从“看图说话”到“看视频聊天”的进化如果你在过去一年里关注过AI领域尤其是多模态大模型MLLM的进展那你一定对“给图片生成描述”或“回答关于图片的问题”这类功能不陌生。从早期的CLIP到后来的BLIP再到如今遍地开花的各种视觉-语言模型让AI理解静态图像已经逐渐从一个研究课题变成了可落地的应用。但当我第一次尝试让AI去理解一段动态的视频并回答其中复杂的时序、因果、行为意图问题时发现事情远没有想象中那么简单。视频不仅仅是多张图片的堆叠它包含了随时间流动的丰富信息——动作的连续性、事件的因果关系、人物交互的意图这些都对模型提出了更高的要求。OpenGVLab开源的Ask-AnythingVideoChat Family项目正是为了解决“让AI真正看懂视频”这一核心挑战而生的。它不是一个单一的模型而是一个围绕视频对话Video Chat构建的完整工具家族。这个项目的核心价值在于它提供了一套从基准测试、数据构建到模型训练与部署的完整开源方案让研究者和开发者能够基于此快速构建或评估自己的视频理解模型。简单来说它试图回答一个问题我们如何才能像和人聊天一样与AI深入讨论一段视频的内容我最初接触这个项目时最吸引我的是它的务实和系统性。它没有停留在炫技式的Demo而是扎扎实实地做了两件事一是推出了持续迭代的VideoChat系列模型从早期依赖ChatGPT的版本发展到如今完全端到端的VideoChat2二是构建了目前最全面的视频理解评测基准MVBench。这意味着你不仅可以“用”还可以“评”知道自己用的模型到底在什么水平线上。对于像我这样既想快速应用又想深入理解背后机理的开发者来说这无疑是一个绝佳的切入点。2. 核心架构演进从“拼接”到“融合”的三代设计要理解VideoChat家族最好从其架构的演变入手。这不仅仅是模型版本的升级更反映了业界对“视频-语言”对齐问题思考的深化。2.1 第一代基于ChatGPT的显式通信架构最早的video_chat_with_ChatGPT方案代表了2023年初的典型思路“分而治之”。其核心流程可以概括为“视觉特征抽取 - 文本描述生成 - 大语言模型理解”的三段式管道。视觉编码使用一个强大的视觉主干网络如Video Swin Transformer、InternVideo对输入视频进行采样和编码提取出一系列帧级的视觉特征。描述生成将这些视觉特征输入一个预训练的“视觉-语言”模型例如一个基于图像描述的模型被适配用于视频生成一段对视频内容的文本描述摘要。这一步是关键瓶颈因为生成的描述质量直接决定了后续对话的上限。对话交互将生成的文本描述连同用户的问题一起提交给ChatGPT通过API。由ChatGPT来负责理解描述、结合问题并生成最终的回答。注意这种架构的优劣非常明显。优势在于快速验证了视频对话的可行性且能利用ChatGPT强大的推理和语言生成能力。但劣势是致命的信息损耗严重。一段几分钟的视频被压缩成几百个字的描述大量的时序细节、空间关系、微妙动作全部丢失了。而且它严重依赖外部API成本、延迟和可控性都是问题。2.2 第二代端到端的隐式通信架构VideoChat1第一代的局限性催生了video_chat即VideoChat1的诞生。其核心思想是绕过文本描述这个“中间商”让视觉特征直接与大语言模型LLM对话。这就是所谓的“隐式通信”或“端到端”训练。统一编码器项目选用了像UMTUnMasked Teacher这样的视频-语言预训练模型作为视觉编码器。UMT本身就在海量视频-文本对上学过其输出的特征已经蕴含了丰富的语义信息比单纯的视觉特征更接近“语言空间”。特征投影对齐这是最关键的一步。UMT输出的高维视觉特征通过一个可训练的线性投影层MLP被映射到LLM如Vicuna的文本嵌入空间中。你可以把这个投影层想象成一个“翻译器”它学习将视觉的“语言”翻译成LLM能听懂的“语言”。指令微调将投影后的视觉特征视为特殊的“视觉词元”与问题的文本词元拼接在一起输入给LLM。然后使用大规模的视频-指令数据对整套模型投影层LLM进行端到端的微调。模型学习的是根据“视觉词元”和文本问题直接生成答案。为什么这个设计更优因为它保留了更多的原始视觉信息。特征投影层虽然会带来一些压缩但相比生成文本描述其信息保真度要高得多。模型在训练中学会了如何从这些原始特征中提取回答问题所需的信息实现了真正的多模态融合。这也是当前主流MLLM如LLaVA采用的核心范式。2.3 第三代高性能基线模型与统一评测基准VideoChat2 MVBenchVideoChat2 可以看作是VideoChat1理念的成熟和规模化实践。它不再是一个探索性的Demo而是一个旨在建立稳健高性能基线的工程。更强的视觉编码器VideoChat2基于InternVideo等更强大的视频基础模型来提取特征。InternVideo在多项视频任务上都有出色表现提供了更高质量的视频表示。多样化的LLM后端项目提供了基于不同LLM的版本如VideoChat2-vicuna,VideoChat2-mistral,VideoChat2-phi3。这体现了其设计上的灵活性你可以根据对性能、速度、许可协议的不同需求选择后端。例如Mistral版本在多项评测中表现更优而Phi-3版本则更轻量、更快。大规模高质量指令数据VideoChat2的成功离不开其开源的2M200万视频-指令数据对。这些数据不是简单爬取的而是通过精心设计的管道生成的涵盖了描述、问答、推理等多种任务类型。高质量的数据是模型性能的基石。MVBench统一的评测标尺这是VideoChat2项目另一个巨大贡献。以往评估视频模型很麻烦需要在多个数据集上跑测试指标还不统一。MVBench整合了20个现有的视频理解数据集涵盖了动作识别、时序定位、因果推理、意图预测等8大类核心能力提供了一个标准化、可复现的评估框架。你现在可以用一个脚本在MVBench上跑出模型的总分和各分项能力得分横向对比一目了然。实操心得模型选型建议对于大多数想要尝鲜或进行应用开发的用户我建议直接从VideoChat2-mistral或VideoChat2-phi3开始。Mistral版本综合能力更强尤其在复杂推理任务上Phi3版本则部署成本更低响应更快。如果你非常关注模型对视频细节如细小物体、文字的理解那么VideoChat2-HD高分辨率微调版是更好的选择它在需要细粒度感知的任务上优势明显。3. 从零开始部署与实操以VideoChat2为例理论讲得再多不如亲手跑起来。下面我将以VideoChat2-mistral为例详细拆解本地部署和运行的全过程其中会包含我踩过的一些坑和优化技巧。3.1 环境准备依赖管理与CUDA兼容性首先你需要一个具备足够显存的GPU环境。经测试16GB显存如RTX 4080, RTX 4090是流畅运行7B参数模型的最低舒适线。8GB显存如RTX 3070可以通过量化如8bit、4bit加载勉强运行但推理速度会较慢且批次处理能力受限。# 1. 克隆仓库并进入目录 git clone https://github.com/OpenGVLab/Ask-Anything.git cd Ask-Anything/video_chat2 # 2. 创建并激活Python虚拟环境强烈推荐避免依赖冲突 conda create -n videochat2 python3.10 -y conda activate videochat2 # 3. 安装PyTorch请务必根据你的CUDA版本选择 # 例如CUDA 11.8的用户 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # 你可以去PyTorch官网核对最新的安装命令。 # 4. 安装项目核心依赖 pip install -r requirements.txt踩坑记录transformers与accelerate版本冲突项目依赖的transformers版本可能较新有时会与accelerate产生兼容性问题。如果遇到“Cannot import name ‘is_torch_xla_available‘ from ‘transformers.utils’”之类的错误可以尝试固定版本pip install transformers4.36.0 accelerate0.25.0这是经过测试比较稳定的组合。3.2 模型下载与加载使用国内镜像加速VideoChat2的模型权重托管在Hugging Face Hub上。对于国内用户直接下载可能非常缓慢甚至失败。这里强烈推荐使用ModelScope魔搭社区或OpenXLab的镜像。# 方法一使用 huggingface-cli需配置镜像 # 首先安装huggingface-hub pip install huggingface-hub # 设置环境变量使用国内镜像例如使用阿里云镜像 export HF_ENDPOINThttps://hf-mirror.com # 然后通过代码下载或在代码中指定 cache_dir # 方法二手动下载最可靠 # 访问 https://huggingface.co/OpenGVLab 找到对应模型如 VideoChat2-Mistral # 使用 git lfs clone 或下载工具如 hfd将整个仓库下载到本地目录例如 ./model/VideoChat2-Mistral在代码中加载模型时指向你的本地路径from video_chat2.model.builder import load_pretrained_model from video_chat2.utils import disable_torch_init # 禁用Torch的初始化优化避免某些版本下的警告 disable_torch_init() # 加载模型和处理器 model_path ./model/VideoChat2-Mistral # 你的本地路径 tokenizer, model, image_processor, context_len load_pretrained_model( model_pathmodel_path, model_baseNone, model_namevicuna, # 注意即使后端是mistral这里可能仍写vicuna具体看模型配置文件 load_8bitTrue, # 8位量化节省显存精度损失可接受 load_4bitFalse, # 4位量化更省但可能影响效果 )关键参数解析load_8bitTrue启用LLM.int8()量化能将7B模型的显存占用从约14GB降低到8GB左右是性价比最高的选择。load_4bitTrue启用GPTQ或NF4量化显存占用可降至4-5GB但推理速度可能下降且部分模型可能不兼容。model_name这个参数很重要它决定了使用哪种对话模板。必须与模型训练时使用的模板一致否则会导致性能严重下降。具体值需要查看模型配置文件config.json中的architectures或_name_or_path字段。3.3 视频预处理与推理流程详解加载好模型后下一步就是处理视频并提问。这个过程包含了多个细节步骤。import torch from PIL import Image import numpy as np from decord import VideoReader, cpu def load_video(video_path, num_frames8, image_processorNone): 加载视频并均匀采样指定数量的帧。 Args: video_path: 视频文件路径。 num_frames: 采样的帧数默认8帧是平衡效果与效率的常见选择。 image_processor: 模型对应的图像处理器。 Returns: video_tensor: 处理后的视频张量形状为 (C, num_frames, H, W)。 # 使用decord读取视频比OpenCV更高效且与训练代码一致 vr VideoReader(video_path, ctxcpu(0)) total_frames len(vr) # 均匀采样帧索引 frame_indices np.linspace(0, total_frames-1, numnum_frames, dtypeint) # 读取帧并转换为PIL Image列表 frames [] for index in frame_indices: frame vr[index].asnumpy() # 获取numpy数组 frame_pil Image.fromarray(frame) frames.append(frame_pil) # 使用图像处理器统一处理所有帧 # 这里image_processor会负责resize、归一化、转换为tensor等操作 video_tensor image_processor.preprocess(frames, return_tensorspt)[pixel_values] # 输出形状通常是 [num_frames, C, H, W]需要调整维度顺序以适应模型输入 video_tensor video_tensor.permute(1, 0, 2, 3) # - [C, num_frames, H, W] return video_tensor.unsqueeze(0) # 增加batch维度 - [1, C, num_frames, H, W] # 准备问题和对话模板 video_path your_video.mp4 question What is the person in the blue shirt doing at the beginning of the video? # 1. 加载并处理视频 video_tensor load_video(video_path, num_frames8, image_processorimage_processor) video_tensor video_tensor.to(model.device, dtypetorch.float16) # 使用半精度节省显存 # 2. 构建模型输入 # 首先需要将问题和视频整合成模型约定的对话格式。 # VideoChat2通常使用类似Vicuna的对话模板 # “USER: ImageImage...Image {question} ASSISTANT:” # 这里的Image是视觉特征的占位符。 # 具体模板函数通常在 model/builder.py 或 utils/conversation.py 中定义。 # 我们需要使用tokenizer和模型内置的方法来构建。 from video_chat2.utils import Conversation, SeparatorStyle # 创建一个对话实例并添加用户消息包含视频和问题 conv Conversation( systemA chat between a curious user and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the users questions., roles(USER, ASSISTANT), messages(), offset0, sep_styleSeparatorStyle.TWO, sep , sep2/s, ) conv.append_message(conv.roles[0], [video] [question]) # 注意这里video是占位符 conv.append_message(conv.roles[1], None) prompt conv.get_prompt() # 3. 将文本提示转换为token ids并准备视觉输入 input_ids tokenizer(prompt).input_ids input_ids torch.as_tensor([input_ids]).to(model.device) # 4. 执行模型推理 with torch.inference_mode(): output_ids model.generate( input_ids, imagesvideo_tensor, # 传入视频特征 do_sampleTrue, # 启用采样使回答更自然。若需确定性结果可设为False。 temperature0.2, # 采样温度越低越确定越高越随机有创意。 max_new_tokens512, # 生成答案的最大长度。 use_cacheTrue, ) # 5. 解码输出 output tokenizer.decode(output_ids[0], skip_special_tokensTrue).strip() # 输出中包含了整个对话历史我们需要提取助手的回答部分。 answer output.split(ASSISTANT:)[-1].strip() print(fQuestion: {question}) print(fAnswer: {answer})核心细节与技巧帧采样策略num_frames8是一个经验值。对于动作缓慢的视频8帧可能足够对于快速运动或复杂事件可以增加到16或32帧但会线性增加计算量。更高级的策略是关键帧采样或动态采样但当前代码以均匀采样为主。设备与精度video_tensor.to(model.device, dtypetorch.float16)这行代码至关重要。确保视觉特征与模型权重在同一设备GPU上且使用半精度float16可以大幅减少显存占用并加速计算。对话模板这是最容易出错的地方。不同的LLM后端Vicuna, Mistral, Llama2有不同的对话模板。务必使用模型配套的conversation.py中定义的模板直接拼接字符串很容易导致模型误解指令输出混乱。生成参数temperature0.2对于事实性问答较低的温度0.1-0.3能产生更准确、确定的回答。对于创意性描述可以提高到0.7-1.0。max_new_tokens512根据问题复杂度调整。简单问答128足够复杂推理或长描述可能需要1024。3.4 使用Gradio快速构建Web Demo对于演示和快速测试Gradio是最佳选择。VideoChat2项目提供了现成的Demo脚本。# 进入demo目录 cd video_chat2/demo # 运行Gradio应用 python app.py --model-path /path/to/your/model --load-8bitapp.py脚本通常会做以下几件事加载模型复用之前的加载函数。定义一个inference函数接收视频文件和问题文本返回答案。使用Gradio创建界面包含视频上传组件、文本框和输出框。部署优化建议如果你在服务器部署可以通过在launch()函数中添加server_name0.0.0.0参数来允许远程访问。对于多用户场景默认设置可能造成显存溢出。可以考虑使用queue()方法对请求进行排队或者部署多个后端实例配合负载均衡。4. 深入MVBench如何科学评估你的视频模型训练或选择了一个模型我们怎么知道它好不好好在哪方面MVBench就是为此设计的“体检中心”。理解和使用MVBench能让你对模型的性能有量化的认识。4.1 MVBench的构成与设计哲学MVBench不是一个新数据集而是一个精心编排的“测试集合集”。它从20个已有的数据集中为每类能力挑选了最具代表性的255个样本总共2040个问题。其设计有两大亮点能力维度全面它涵盖了人类理解视频所需的8个核心维度动作识别视频中的人在做什么如Kinetics-700时序定位某个事件发生在什么时候如ActivityNet-QA因果推理为什么这个事件会发生如Causal-VidQA时序顺序这些事件发生的先后顺序是什么对象关系视频中的物体和人物之间如何交互意图预测人物接下来可能会做什么如IntentQA场景理解视频发生在什么环境如MSRVTT-QA属性识别物体的颜色、大小等属性是什么评估方式标准化所有问题都被转化为多项选择题通常是4选1。这使得评估变得极其简单和统一直接计算模型预测答案与标准答案的匹配准确率。这种设计屏蔽了不同数据集答案格式的差异让模型间的对比变得公平直接。4.2 运行MVBench评测项目提供了评测脚本通常位于video_chat2/eval/目录下。# 假设你在 video_chat2 目录下 python eval/eval_mvbench.py \ --model-name /path/to/your/model \ --question-file ./data/MVBench.json \ # MVBench问题文件 --answers-file ./output/your_model_answers.jsonl \ # 模型输出答案保存路径 --num-frames 8 \ --conv-mode vicuna_v1 # 对话模式根据你的模型选择如 mistral_v1脚本会遍历MVBench中的所有问题为每个问题调用你的模型生成答案并将答案保存到--answers-file指定的JSONL文件中。然后你需要运行另一个评分脚本python eval/convert_mvbench_for_eval.py \ --answers-file ./output/your_model_answers.jsonl \ --output-file ./output/your_model_results.json python eval/eval_output.py \ --result-file ./output/your_model_results.json最终你会得到一份详细的评测报告包括总体准确率和8个子维度的准确率。解读评测结果 假设你的模型总体准确率是58.2%。不要只看这个数字一定要看分项得分。例如如果“动作识别”得分很高80%但“因果推理”得分很低30%说明你的模型擅长识别“是什么”但不擅长理解“为什么”。这可能是因为训练数据中因果推理的样本不足。如果“时序定位”得分低可能需要考虑改进视频的帧采样策略或者引入更擅长捕捉时序信息的视觉编码器。4.3 利用评测结果指导模型优化MVBench不仅是“打分器”更是“诊断仪”。通过分析模型在各类问题上的表现你可以有针对性地进行优化数据层面如果某类能力如“意图预测”得分低可以去寻找或构建更多该类型的指令数据加入到你的训练集中。VideoChat2开源的2M数据就是一个很好的起点你可以在此基础上进行增补。模型层面如果“场景理解”和“对象关系”得分都低可能说明视觉编码器提取的全局和局部特征不够好可以考虑更换或微调视觉编码器。推理层面如果模型在需要长上下文理解的问题上表现不佳如涉及视频开头和结尾关联的问题可以尝试增加采样帧数num_frames或者采用更智能的帧采样方法。5. 实战避坑指南与高阶技巧在深度使用VideoChat系列项目的过程中我积累了一些文档中不会提及的经验和技巧。5.1 显存优化与推理加速对于资源有限的开发者如何让大模型跑得更快、更省是关键。量化策略组合拳LLM部分使用load_8bitTrue或load_4bitTrue是最直接的显存节省方法。推荐使用bitsandbytes库进行的8位量化性能损失极小。视觉编码器部分视觉编码器如InternVideo往往也很大。可以尝试对其也进行动态量化Dynamic Quantization或使用更小的预训练版本。# 示例对视觉编码器进行动态量化PyTorch内置 from torch.quantization import quantize_dynamic model.visual_encoder quantize_dynamic(model.visual_encoder, {torch.nn.Linear}, dtypetorch.qint8)使用vLLM进行高性能推理 对于纯文本生成部分如果剥离出来可以使用vLLM这个高性能推理引擎它通过PagedAttention等技术极大地提高了生成速度并降低了显存开销。VideoChat2项目提供了专门的vllm分支集成了这一优化。视频预处理优化帧缓存如果需要对同一段视频进行多次不同问题的提问可以将预处理好的视频张量缓存起来避免重复解码和采样。提前采样在数据准备阶段可以预先将视频采样并保存为帧的图片序列或numpy数组推理时直接加载省去实时解码的开销。5.2 提升模型回答质量的技巧提示工程Prompt Engineering 虽然模型是端到端的但问题的表述方式依然影响答案质量。具体化不要问“视频里发生了什么”而是问“视频开头穿红色衣服的女人走向汽车后做了什么”分步引导对于复杂问题可以尝试让模型“先描述场景再分析动作最后总结”。少样本提示Few-shot在问题前给一两个例子演示你想要的问答格式和详细程度。后处理与校验 模型的输出有时会包含无关的重复或套话如“根据视频……”。可以编写简单的后处理规则进行过滤。对于关键应用可以引入一个更小的“校验模型”或规则引擎对答案的合理性进行二次判断。5.3 处理长视频的挑战与方案VideoChat2默认采样8帧这对于短视频10-30秒是有效的。但对于几分钟甚至更长的视频信息丢失会非常严重。项目也提供了长视频支持的分支long_video_support其核心思路是结合LangChain和Whisper分段与摘要使用LangChain的文本分割器将长视频按场景或时间切分成多个短片断。多模态摘要对每个短片断用VideoChat生成一段文本摘要。同时用Whisper生成整个视频的语音转录文本。信息融合将所有的短片断摘要和转录文本作为上下文提供给一个大语言模型如ChatGPT或本地LLM让它来综合回答关于长视频的问题。这是一种“分治-聚合”的策略虽然增加了复杂度但是目前处理长视频的可行方案。其效果很大程度上取决于分段的质量和摘要的准确性。5.4 常见错误与排查错误现象可能原因解决方案RuntimeError: CUDA out of memory显存不足。1. 启用load_8bitTrue。2. 减少num_frames如从8减到4。3. 减少max_new_tokens。4. 使用更小的模型变体如Phi-3。模型输出乱码或无关内容对话模板不匹配。检查--conv-mode参数是否与模型训练时使用的模板一致。查看模型配置文件或训练代码确认。视频处理速度极慢decord解码或CPU瓶颈。1. 确保安装了带CUDA支持的decord (pip install decord -U)。2. 考虑预提取视频帧。评估脚本报KeyErrorMVBench数据路径错误或格式不对。确保--question-file指向正确的MVBench.json文件并且该文件是从项目仓库正确下载的。回答总是很短或笼统生成温度temperature太低或训练数据偏差。1. 适当提高temperature(如0.5-0.7)。2. 在提示词中明确要求“详细描述”或“分点说明”。这个项目最让我欣赏的一点是它的“开放性”和“工程友好性”。它不仅仅给出了一个模型而是给出了构建视频对话系统的一整套方法论、工具链和评估标准。从最初的ChatGPT桥接方案到端到端的VideoChat2再到专门用于评估的MVBench和用于长视频处理的扩展它清晰地展示了一条技术演进的路径。对于研究者它是绝佳的基线系统和创新平台对于开发者它是将视频理解能力快速集成到应用中的利器。在实际使用中从模型选型、环境配置到提示词微调每一步都需要结合具体场景仔细斟酌。尤其是在资源有限的情况下如何在效果、速度和成本之间找到平衡点是工程落地的核心挑战。我个人的经验是先从轻量级的Phi-3版本开始原型验证待流程跑通、价值验证后再根据性能需求升级到Mistral或HD版本。同时一定要善用MVBench这把尺子它能让你的优化方向变得清晰可见。

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

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…