多模态模型视觉输入失效排查:从数据流对齐到框架兼容性
1. 项目概述当视觉模型“失明”时最近在折腾一个挺有意思的项目把Qwopus3.5-9B这个多模态大模型部署到苹果的MLX框架oMLX环境里。Qwopus这个模型挺强的号称是能看图说话、理解图片内容。但刚跑起来就遇到了一个让人头大的问题模型对输入的图片完全没反应就像“失明”了一样。你喂给它一张猫的图片它跟你聊天气你给它看一张表格它开始吟诗。这显然不是我们想要的多模态交互。这个问题在调试AI模型尤其是涉及跨框架、跨硬件的部署时其实挺典型的。表面上看是“无法识别图片”但背后可能牵扯到数据预处理流水线不匹配、模型权重加载错误、框架版本兼容性甚至是底层内存或张量格式的细微差异。这不像解决一个简单的编译错误有明确的报错信息它更像是一种“静默失败”——程序能跑但结果不对排查起来需要像侦探一样从输入到输出逐层推理。如果你也在oMLX或者其他类似框架比如PyTorch、JAX的不同后端上部署视觉语言模型时遇到了模型对视觉输入“无动于衷”的情况那么我这次踩坑和填坑的经历或许能给你提供一个清晰的排查思路。整个过程不涉及复杂的网络配置纯粹是模型部署和调试层面的技术活。2. 核心问题拆解与初步诊断首先我们得明确问题边界。所谓“无法识别图片”在技术层面可以分解为几个子问题图片数据是否被正确读入并转换为模型可接受的格式这是最基础的环节。模型的多模态编码器特别是视觉编码器部分是否被成功加载并激活模型可能只加载了语言部分。输入数据的维度和张量类型是否符合oMLX/MLX框架的预期MLX使用自己的mlx.core数组与NumPy或PyTorch张量不直接兼容。前向传播过程中视觉特征是否被正确地与文本特征融合可能存在特征拼接或对齐的错误。我的环境是macOSMLX框架加载的模型是Qwopus3.5-9B的MLX适配版本。初步的代码看起来一切正常import mlx.core as mx import mlx.nn as nn from PIL import Image # ... 假设有模型加载代码 ... image Image.open(cat.jpg).convert(RGB) text_prompt 描述这张图片。 # 调用模型生成 output model.generate(image_inputimage, text_inputtext_prompt) print(output)输出结果却是与图片内容完全无关的文本。第一步我决定进行一个最直接的“健康检查”确认输入数据流。2.1 输入数据流健康检查我写了一个简单的调试脚本来拦截和检查输入数据def debug_input_pipeline(image_path): # 1. 原始图片加载 img Image.open(image_path) print(f1. 原始图片模式: {img.mode}, 尺寸: {img.size}) # 2. 模型预期的预处理这里需要根据Qwopus的具体要求来通常是resize, normalize # 假设我们知道预处理函数是 transform processed_img transform(img) # transform 应返回一个张量 print(f2. 预处理后张量形状: {processed_img.shape}, 类型: {type(processed_img)}) # 3. 转换为MLX数组 # 关键步骤如果预处理返回的是PyTorch Tensor或NumPy array需要转换 if hasattr(processed_img, numpy): processed_img processed_img.numpy() mlx_array mx.array(processed_img) # 将numpy数组转为mlx数组 print(f3. MLX数组形状: {mlx_array.shape}, 数据类型: {mlx_array.dtype}) # 4. 检查维度视觉模型通常需要 [Batch, Channel, Height, Width] # 而PIL或某些预处理输出可能是 [H, W, C] 或 [C, H, W] print(f4. 数组维度顺序: {mlx_array.shape}) return mlx_array运行这个脚本后我发现了一个关键点processed_img在转换成MLX数组前其形状是(3, 224, 224)这符合[C, H, W]的PyTorch惯例看起来没问题。但是MLX框架在某些操作或模型层中其默认的维度顺序可能与PyTorch不同。虽然mx.array接受了这个形状但模型内部的视觉编码器比如一个ViT可能预期的是[H, W, C]。实操心得一框架间的“隐式约定”不同深度学习框架对张量通道顺序的“默认”约定可能不同。PyTorch常用(N, C, H, W)而TensorFlow常用(N, H, W, C)。MLX作为较新的框架其社区模型可能沿用了某种约定但如果你加载的模型权重是来自PyTorch而预处理代码是照搬的这里就可能出现通道顺序不匹配的问题。视觉编码器处理[C, H, W]和[H, W, C]会得到完全不同的特征导致后续融合失败。2.2 模型结构探查与视觉编码器验证输入数据格式没问题至少看起来那问题可能出在模型本身。我需要确认Qwopus模型的视觉编码器是否被正确初始化和加载。在MLX中我们可以通过打印模型子模块来探查结构。但首先需要知道Qwopus这类多模态模型通常的架构一个视觉编码器如CLIP的ViT 一个语言模型如LLaMA 一个连接两者的投影层通常是一个线性层。# 假设model是已加载的Qwopus模型 print(模型类型:, type(model)) # 尝试列出其属性寻找视觉相关组件 import inspect members inspect.getmembers(model) for name, obj in members: if vision in name.lower() or visual in name.lower() or image in name.lower(): print(f发现视觉相关属性: {name} - {type(obj)}) if encoder in name.lower() and (vit in name.lower() or clip in name.lower()): print(f发现视觉编码器: {name}) # 更直接的方法如果模型有已知的属性名 if hasattr(model, vision_model): print(找到 vision_model) # 尝试用一张图片输入看是否有输出 test_output model.vision_model(mlx_array) print(f视觉编码器输出形状: {test_output.shape}) else: print(未找到明确的视觉模型属性。)在我的排查中hasattr(model, vision_model)返回了True这是一个好迹象。但是当我尝试将mlx_array输入model.vision_model时程序报错了错误信息提示张量维度不匹配。错误信息是关键它明确指出了期望的输入形状是(N, H, W, C)而我提供的是(C, H, W)缺少了Batch维度N。同时它也暗示了通道C的位置在最后。注意事项Batch维度的缺失即使在单张图片推理时模型也通常要求输入包含一个批处理维度batch dimension。这是深度学习模型的普遍要求。你需要使用mx.expand_dims(array, axis0)来添加一个批次维度将(C, H, W)变为(1, C, H, W)或(1, H, W, C)具体取决于模型要求。3. 问题根源定位与解决方案实施综合前面的排查问题的根源变得清晰维度顺序不匹配我使用的预处理流程产出了PyTorch风格的[C, H, W]张量但目标MLX模型中的视觉编码器期望的是[H, W, C]。缺少批处理维度输入张量缺少最前面的Nbatch size维度。数据转换链断裂从PIL Image到MLX Array的转换链中可能丢失了必要的转置transpose操作。3.1 修正输入预处理流水线解决方案是重构一个针对MLX框架的预处理函数import mlx.core as mx from PIL import Image import numpy as np def preprocess_image_for_mlx(image_path, target_size224): 针对MLX框架且视觉编码器期望[H, W, C]输入的图片预处理。 # 1. 打开并转换图片 img Image.open(image_path).convert(RGB) # 2. 调整大小使用高质量的缩略图算法 img img.resize((target_size, target_size), Image.Resampling.LANCZOS) # 3. 转换为NumPy数组并归一化到[0, 1] img_array np.array(img).astype(np.float32) / 255.0 # 此时 img_array 形状为 (H, W, C) # 4. 应用模型特定的归一化例如ImageNet的均值和标准差 # 假设使用CLIP的归一化参数 mean mx.array([0.48145466, 0.4578275, 0.40821073]) std mx.array([0.26862954, 0.26130258, 0.27577711]) # 注意mx.array可以直接广播进行逐元素运算 img_array mx.array(img_array) # 先转为MLX数组 img_array (img_array - mean) / std # 5. 添加批处理维度 - (1, H, W, C) img_array mx.expand_dims(img_array, axis0) return img_array # 使用修正后的预处理 correct_mlx_input preprocess_image_for_mlx(cat.jpg) print(f修正后输入形状: {correct_mlx_input.shape}) # 应输出 (1, 224, 224, 3)这个函数的关键在于保持了(H, W, C)的维度顺序。在转换为MLX数组后进行归一化充分利用MLX的向量化运算。显式地添加了批处理维度。3.2 验证视觉编码器输出用修正后的输入再次测试视觉编码器# 确保模型处于eval模式如果支持 if hasattr(model, eval): model.eval() # 提取视觉特征 with mx.eval_scope(): # 使用eval_scope来避免不必要的计算图构建 visual_features model.vision_model(correct_mlx_input) print(f视觉特征输出形状: {visual_features.shape})这次visual_features成功输出了一个形状为(1, 257, 768)的张量假设使用ViT-Base。1是批次257是序列长度[CLS]token 16x16的196个图像块 可能的位置编码768是特征维度。这证明视觉编码器工作正常了。3.3 整合与端到端测试视觉编码器好了但整个多模态生成流程可能还有坑。Qwopus模型需要将视觉特征与文本token嵌入进行融合。通常视觉特征会通过一个投影层projection layer映射到与语言模型隐藏层相同的维度然后作为前缀prefix或交叉注意力cross-attention的输入。我需要检查模型的主生成函数或调用方法。有时社区提供的封装好的generate函数内部可能对输入有特定的封装格式。# 查看模型generate函数的签名或文档 import inspect sig inspect.signature(model.generate) print(Generate函数参数:, sig.parameters) # 如果发现它期望一个字典或特定的命名参数例如 # generate(imageNone, text_input) # 那么正确的调用方式可能是 text_prompt 描述这张图片里有什么。 # 假设模型封装好了多模态输入处理 output_ids model.generate(imagecorrect_mlx_input, text_inputtext_prompt) # 然后解码output_ids得到文本 output_text tokenizer.decode(output_ids[0]) print(模型输出:, output_text)在我的案例中问题恰恰出在这里。原始的generate函数内部有一个条件判断如果image参数不是None它会调用一个内部方法_encode_image。但我传入的correct_mlx_input虽然格式对了却因为一个内部类型检查检查是否是mx.array的特定子类而失败导致分支跳转错误实际上没有执行视觉编码。最终的修复方案是修改模型调用代码确保传入的图像数据不仅形状正确类型也完全符合内部函数的预期。有时需要直接调用底层的_encode_image和_generate_text方法绕过顶层的封装。# 最终有效的调用方式根据具体模型实现调整 def generate_description(image_path, prompt): # 1. 预处理图片 img_tensor preprocess_image_for_mlx(image_path) # 2. 编码图像 with mx.eval_scope(): # 直接调用视觉编码器和投影层 visual_embeds model.vision_model(img_tensor) visual_embeds model.visual_projection(visual_embeds) # 假设有投影层 # 3. 编码文本 input_ids tokenizer.encode(prompt) # 4. 融合并生成这里简化实际可能涉及复杂的注意力机制 # 将 visual_embeds 作为前缀拼接到 input_ids 对应的 embeddings 前面 combined_embeddings mx.concatenate([visual_embeds, text_embeddings], axis1) # 5. 将 combined_embeddings 输入语言模型进行自回归生成 # ... (使用model.language_model进行生成) ... output_ids model.language_model.generate(inputs_embedscombined_embeddings) # 6. 解码 return tokenizer.decode(output_ids[0]) # 测试 result generate_description(cat.jpg, 这是一只) print(result)4. 通用排查清单与深度避坑指南经过这次折腾我总结了一个在oMLX或类似框架中多模态模型“视觉失灵”的通用排查清单。你可以像医生问诊一样一步步对照检查排查步骤检查点可能的问题与解决方案1. 输入数据图片格式与模式确保是RGB模式不是RGBA或L。用PIL.Image.convert(‘RGB’)。预处理与归一化确认使用的resize尺寸、crop方式、归一化均值/标准差与模型训练时完全一致。一个参数不对特征就可能南辕北辙。张量形状与顺序重中之重用print或调试器确认预处理后张量的形状。与模型文档或源码中期望的形状进行逐维度对比。常见陷阱[C, H, W]vs[H, W, C]。使用np.transpose或mx.transpose调整。批处理维度确认输入是否包含批处理维度N。即使单张图也应是(1, ...)。使用mx.expand_dims(array, axis0)添加。MLX数组类型确保最终输入是mx.array而不是np.ndarray或torch.Tensor。检查dtype通常是float32。2. 模型本身权重加载完整性确认下载的MLX适配版模型文件包含视觉编码器权重如vision_model.*.safetensors。有时分拆的权重文件可能遗漏。模型初始化在加载模型后立即打印模型结构确认vision_model、visual_projection等关键子模块存在且参数非零。视觉编码器独立测试剥离语言模型单独用预处理好的图片数据输入vision_model检查其输出特征是否合理非全零、NaN或异常大/小值。3. 前向传播特征融合点定位视觉特征与文本特征是在哪个阶段融合的前缀、交叉注意力。检查融合前的特征维度是否匹配。投影层的输入/输出维度是否正确。注意力掩码如果使用融合特征对应的注意力掩码attention mask是否被正确扩展以涵盖视觉token模型模式确保模型在推理前处于.eval()模式这会影响Dropout、BatchNorm等层的行为。4. 框架与环境MLX版本检查MLX和mlx-lm等库的版本。不同版本间API可能有细微变动。使用pip listPython依赖确保Pillow、NumPy等基础依赖版本兼容无冲突。内存问题虽然MLX优化了Apple Silicon内存但处理大图片或大模型时仍可能因内存不足导致静默错误。监控活动监视器中的内存压力。深度避坑指南理解“静默失败”深度学习部署中最棘手的问题就是“静默失败”Silent Failure。模型不报错但输出 nonsense。除了上述清单还有几个高阶技巧梯度流检查仅训练时在训练或微调时计算损失并反向传播检查视觉编码器参数的梯度是否不为零。如果梯度为零说明视觉部分没有参与到计算图中。特征可视化将vision_model输出的第一个[CLS]token特征或所有patch特征取平均值与一个全零张量输入的特征进行对比。如果两者相似说明编码器没起作用。简化测试用一张全黑、全白或带有明显色块的简单图片测试模型应该能给出“黑色图片”、“白色背景”或“色块”这类基础描述。如果连这都做不到问题一定出在视觉输入的最前端。查阅模型源码最终极的方法。找到该模型原始如PyTorch实现的预处理和模型前向传播代码逐行与你的MLX实现进行对比。差异点往往就是问题所在。5. 扩展性能优化与内存管理问题解决后模型可以正确识别图片了。但在实际使用中你可能会遇到性能或内存问题。这里分享几个在oMLX环境下的优化点使用mlx.core.eval和mlx.core.compileMLX的计算是惰性的。使用mx.eval()可以立即执行计算但在循环中频繁调用会影响性能。更好的做法是将整个生成函数用mx.compile装饰MLX会将其编译为优化的Metal着色器内核显著提升速度尤其是对于像自回归生成这种循环结构。mx.compile def generate_step(model, combined_embeddings): # 单步生成逻辑 return model.language_model.generate_step(combined_embeddings)管理KV缓存对于大语言模型生成键值缓存KV Cache是节省计算量的关键。确保你的生成循环正确地更新和复用KV缓存避免重复计算。图片分辨率与分块视觉编码器如ViT的计算量随图片token数与分辨率平方成正比增长。如果处理高分辨率图片导致内存不足或速度慢可以考虑在预处理时直接缩放到模型支持的标准尺寸如224x224。如果模型支持使用动态分块tiling策略将大图分割成多个小块分别编码再融合特征但这需要模型结构支持并非通用方案。利用Metal性能分析工具在macOS上可以使用Instruments工具中的Metal System Trace模板来分析MLX应用对GPUMetal的利用情况查看是否有瓶颈。6. 总结与个人体会这次排查花了差不多一整天时间从怀疑人生到豁然开朗。核心教训就是在跨框架部署模型时数据流的对齐是第一位其重要性甚至超过模型本身。一个维度的顺序、一个缺失的批处理维度、一组错误的归一化参数都足以让一个强大的多模态模型“失明”。MLX框架以其在Apple芯片上的高效和易用性吸引了大量开发者但生态相比PyTorch仍在成长中。很多模型都是社区从PyTorch转换而来这个转换过程可能不会100%覆盖所有细节尤其是数据预处理这种“脏活累活”。作为使用者我们必须具备深入模型内部、对比输入输出、逐层调试的能力。最后给同样在MLX上折腾多模态模型的你一个建议建立一个可复现的最小化测试用例。从一开始就写一个只包含图片加载、预处理、视觉编码器前向传播、输出特征打印的脚本。把这个基础流程跑通确保视觉特征看起来是合理的有数值变化不是常数或NaN然后再去对接复杂的语言模型和生成逻辑。这种由简入繁、步步为营的方法能帮你快速定位问题阶段节省大量盲目调试的时间。模型部署就像拼图每一块都必须严丝合缝。当图片输入这块关键的拼图被正确放置后Qwopus-9B终于在我的Mac上“睁开了眼睛”开始准确地描述眼前的世界。这种解决问题的成就感或许就是技术折腾最大的乐趣所在。

相关新闻

信号与系统高分突破:从知识点到知识网络的认知重构

信号与系统高分突破:从知识点到知识网络的认知重构

信号与系统这门课,很多人学到强化阶段,会陷入一种“什么都学了,但分数就是上不去”的困境。公式背了,题也刷了,但一到综合题或者稍微变形的题目,就感觉无从下手,分数卡在90到110之间&#xff0c…

2026/10/13 12:18:27 阅读更多 →
构建AI长期记忆系统:从向量检索到记忆宫殿的工程实践

构建AI长期记忆系统:从向量检索到记忆宫殿的工程实践

1. 项目概述:当AI拥有了“记忆宫殿”最近在AI圈子里,一个名为“MemPalace”的开源项目引起了不小的轰动。它被戏称为“生化危机女主角亲自开源”,这个梗源自其项目作者在GitHub上的头像和昵称,让人会心一笑。但抛开这个有趣的标签…

2026/10/10 4:25:06 阅读更多 →
FFmpeg命令行实战:高效批量将MP4转换为GIF动图

FFmpeg命令行实战:高效批量将MP4转换为GIF动图

1. 先搞清楚 FFmpeg 转 GIF 到底要解决什么问题如果你在网上搜过“MP4转GIF”,大概率会遇到几个头疼的问题:要么是找到的在线工具要付费、限制大小、带水印;要么是下载的软件捆绑一堆垃圾;要么是批量处理几十个视频时,…

2026/10/10 4:19:35 阅读更多 →

最新新闻

程序员英语词汇宝典词条精讲:exclamation mark(感叹号 `!`)——发音、词义与编程实战用法

程序员英语词汇宝典词条精讲:exclamation mark(感叹号 `!`)——发音、词义与编程实战用法

教程 【免费下载链接】most-frequent-technology-english-words 程序员工作中常见的英语词汇 项目地址: https://gitcode.com/gh_mirrors/mo/most-frequent-technology-english-words 点击查看 免费下载 本文以开源仓库 most-frequent-technology-english-words&am…

2026/10/15 2:27:21 阅读更多 →
Mixed‑Content 混合内容坑,HTTPS 页面加载 HTTP 的 M3U8 资源排错

Mixed‑Content 混合内容坑,HTTPS 页面加载 HTTP 的 M3U8 资源排错

一、混合内容带来播放黑屏的业务现象 现在绝大多数业务网站都升级为 HTTPS 安全页面。很多同学会遇到一个很迷惑故障:网页本身是 HTTPS,M3U8 播放地址打开黑屏,但是复制 M3U8 链接新开标签页播放却完全正常。 这个问题很多新手不了解&#…

2026/10/15 2:27:21 阅读更多 →
手写SURF特征点检测器:C++从零实现与工程避坑指南

手写SURF特征点检测器:C++从零实现与工程避坑指南

简介:本资源是一份面向计算机视觉初学者与算法工程师的SURF特征检测技术学习包,聚焦于算法原理理解与C工程实现能力提升。内容涵盖2006年Pfister等人提出的SURF核心思想详解——包括基于积分图像的快速尺度空间构建、Hessian矩阵关键点定位、Haar小波描述…

2026/10/15 2:27:21 阅读更多 →
上下文模式实战:从ThreadLocal到AI对话的上下文管理

上下文模式实战:从ThreadLocal到AI对话的上下文管理

1. 从“上下文模式”说起:一个被低估的工程概念第一次听到“context-mode”这个词,很多人会下意识觉得它是个抽象得没边儿的概念,像是架构师在PPT里才会用的词。但如果你真正在项目里踩过坑,就会明白它其实是一个非常接地气的工程…

2026/10/15 2:27:21 阅读更多 →
Three.js入门指南:3D网页开发核心概念与实战技巧

Three.js入门指南:3D网页开发核心概念与实战技巧

1. Three.js入门:从实际问题出发的基础指南最近在项目中遇到一个需求:需要在网页中展示3D模型并实现交互操作。作为一个前端开发者,我首先想到的就是Three.js这个强大的JavaScript 3D库。但在实际使用过程中,我发现很多教程都是从…

2026/10/15 2:27:21 阅读更多 →
Qt6计算器开发全解析:信号槽、表达式解析与工程实战

Qt6计算器开发全解析:信号槽、表达式解析与工程实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 2:26:21 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →