Blender自动化插件开发指南:从Python脚本到自定义工具集
1. 为什么你需要一个“套卡”插件从重复劳动到一键操作如果你经常用 Blender 做建模、渲染或者动画肯定遇到过这种场景每次新建项目都要手动设置一遍渲染引擎、采样率、输出路径每次导入一批模型都要逐个调整材质节点或者应用变换每次做批量操作比如给一堆物体添加相同的修改器或约束都得一个个点过去。这些操作本身不复杂但重复几十上百次不仅耗时还容易出错。“套卡”插件听起来有点抽象其实核心就一件事把一系列你经常重复的 Blender 操作打包成一个“卡片”或者说一个预设动作集下次遇到同样需求点一下这个“卡片”就能自动执行所有步骤。它不是某个特定的现成插件而是一种解决思路和实现方法。你可以把它理解成 Blender 里的“宏”或者“动作录制”但更灵活可以深度结合 Python 脚本。所以这篇文章不是教你安装某个叫“套卡”的插件而是分享如何从零开始为自己量身打造一个这样的自动化工具。适合所有被 Blender 中重复性操作困扰的用户无论你是想提升个人工作效率的独立创作者还是需要规范团队流程的 TA技术美术。最关键的价值是把经验固化下来减少手动操作提升一致性和容错率。2. 动手之前明确你的“重复操作”到底是什么在开始写代码之前最忌讳的就是漫无目的。你需要先明确你最想自动化的是哪类操作。根据常见的 Blender 工作流我一般会把“套卡”的应用场景分成几类你可以对号入座2.1 项目初始化与标准化配置这是最普遍的用途。比如渲染设置套卡创建文件后自动设置 Cycles 为渲染引擎采样设为 128开启降噪输出格式设为 PNG路径指向固定的./renders文件夹。场景初始化套卡自动创建地面平面、三盏基础灯光Key Fill Rim、一个摄像机并排好大概位置。单位与轴向前置套卡强制将场景单位设为米缩放设为 1.0并将所有物体的变换轴心设为原点。2.2 模型处理与批量操作当你需要处理大量资产时手动操作简直是噩梦。导入后处理套卡针对从特定网站如 Sketchfab下载的模型自动应用所有变换、合并重叠顶点、重计算法线朝外。材质标准化套卡为选中的多个物体自动添加一个 Principled BSDF 材质并连接到输出节点甚至可以根据物体名称关键词如 “_glass”自动分配粗糙度、透射等参数。批量修改器套卡为选中的一堆物体统一添加表面细分修改器设为简单型视图层级2或者实体化修改器。2.3 特定工作流加速这类更个性化但效率提升最明显。动画预备套卡为角色骨骼自动添加并配置常用的 IK 约束、复制旋转约束等。UV 处理套卡自动执行“智能 UV 投射”并打包到 0-1 空间。导出优化套卡在导出 FBX 或 GLTF 前自动检查并修复常见的警告项如非 manifold geometry非流形几何体。我的建议是先从你最痛的一个点开始。不要试图做一个“万能套卡”。选一个你每天都要做至少3次以上的操作把它作为你的第一个插件目标。3. 环境与工具准备不只有 Blender打造“套卡”插件核心是写 Python 脚本。你不需要是编程专家但需要了解 Blender Python API (bpy) 的基本操作。环境很简单Blender任何 2.8 以上的稳定版本都可以。建议用较新的 LTS 版本API 更稳定。文本编辑器Blender 内置的文本编辑器就够用。当然用你熟悉的 VSCode、PyCharm 等外部编辑器体验更好可以享受代码补全和语法高亮。如果需要连接外部编辑器可以配置 Blender 的“开发者模式”。基础 Python 知识了解变量、列表、循环for、条件判断if即可。Blender API 的调用很像在界面里点按钮有很强的对应关系。一个关键心态不要怕看官方文档和社区脚本。Blender Python API 文档是必查的当你想知道“如何用代码选中物体”时就去搜bpy.ops.object.select_all。社区如 Blender Stack Exchange有大量现成代码片段你的“套卡”完全可以由多个片段组合、修改而成。4. 从零打造你的第一个“套卡”插件以“渲染设置”为例我们以“创建新文件后一键配置好我的常用渲染设置”这个最实用的场景来走通整个流程。这个过程分为四步录制操作、翻译成代码、封装成按钮、安装为插件。4.1 第一步在界面中手动操作并“录制”打开 Blender新建一个常规文件。打开“脚本”工作区如果没有在顶部工作区选择器里找。在文本编辑器中新建一个文本文件命名为setup_render.py。在文本编辑器菜单栏找到“模板” - “Python” - “操作记录”。点击后Blender 会开始记录你在界面上的大部分操作。现在像平时一样去设置渲染点击属性面板的渲染属性相机图标。将渲染引擎从 Eevee 改为 Cycles。将设备从 CPU 改为 GPU如果你有的话。找到采样部分将渲染采样和视口采样都改为 128。找到光程部分将最大反弹次数适当调高如全局光照调为3。找到降噪部分勾选渲染降噪选择 OpenImageDenoise。切换到输出属性打印机图标将分辨率百分比设为 100%输出路径改为//renders//表示相对路径基于当前 blend 文件位置。将输出格式改为 PNG颜色深度改为 16 位。操作完成后回到文本编辑器停止记录。你会看到编辑器里自动生成了一大段 Python 代码这就是你刚才所有操作的“翻译”。4.2 第二步清理与优化生成的代码自动生成的代码通常很“啰嗦”包含很多不必要的上下文操作。我们需要把它精简成稳定、可重复执行的脚本。原始生成的代码可能长这样已简化import bpy # 切换到 Cycles bpy.context.scene.render.engine ‘CYCLES‘ # 设置设备 bpy.context.preferences.addons[‘cycles‘].preferences.compute_device_type ‘CUDA‘ bpy.context.scene.cycles.device ‘GPU‘ # 设置采样 bpy.context.scene.cycles.samples 128 bpy.context.scene.cycles.preview_samples 128 # 设置降噪 bpy.context.scene.cycles.use_denoising True bpy.context.scene.cycles.denoiser ‘OPENIMAGEDENOISE‘ # 设置输出 bpy.context.scene.render.resolution_percentage 100 bpy.context.scene.render.filepath ‘//renders/‘ bpy.context.scene.render.image_settings.file_format ‘PNG‘ bpy.context.scene.render.image_settings.color_depth ‘16‘优化点移除界面交互代码删除所有bpy.ops.wm.*或bpy.ops.screen.*这类单纯切换界面焦点的代码。处理偏好设置像compute_device_type这类属于用户偏好而非场景设置。直接设置bpy.context.scene.cycles.device ‘GPU‘通常就够了Blender 会使用当前激活的 GPU。如果担心跨电脑兼容可以加个判断。增加容错判断比如在设置设备前先检查系统是否有 GPU 支持。使用变量把采样数 128 等常用参数定义为变量方便后期统一修改。优化后的核心代码可能像这样import bpy def setup_my_render(): scene bpy.context.scene # 1. 渲染引擎与设备 scene.render.engine ‘CYCLES‘ # 尝试设置为 GPU如果失败如无CUDA则回退到 CPU try: scene.cycles.device ‘GPU‘ # 尝试启用所有可用的 GPU 设备针对多卡 prefs bpy.context.preferences.addons[‘cycles‘].preferences for device in prefs.devices: device.use True except: scene.cycles.device ‘CPU‘ print(“警告未检测到 GPU已回退至 CPU 渲染”) # 2. 采样设置 render_samples 128 preview_samples 64 scene.cycles.samples render_samples scene.cycles.preview_samples preview_samples # 3. 光程提升间接光质量 scene.cycles.max_bounces 128 scene.cycles.diffuse_bounces 4 scene.cycles.glossy_bounces 4 # 4. 降噪 scene.cycles.use_denoising True scene.cycles.denoiser ‘OPENIMAGEDENOISE‘ # 5. 输出设置 scene.render.resolution_percentage 100 # 使用相对路径自动创建 renders 文件夹 import os output_dir os.path.join(os.path.dirname(bpy.data.filepath), “renders”) os.makedirs(output_dir, exist_okTrue) scene.render.filepath output_dir os.sep scene.render.image_settings.file_format ‘PNG‘ scene.render.image_settings.color_depth ‘16‘ print(“渲染设置套卡应用完成”) # 执行函数 if __name__ “__main__”: setup_my_render()4.3 第三步将脚本封装成 Blender 插件添加界面按钮一个独立的.py文件需要手动打开并运行。做成插件就能在 Blender 的界面里拥有一个专属按钮或菜单项。在刚才的脚本基础上添加 Blender 插件规定的结构bl_info { “name”: “My Render Setup Kit“, “author”: “Your Name“, “version”: (1, 0), “blender”: (3, 0, 0), “location”: “View3D Sidebar My Tab“, “description”: “一键应用我的常用渲染设置“, “category”: “Render“, } import bpy import os class MYRENDER_OT_setup(bpy.types.Operator): “”“应用渲染设置”“” bl_idname “myrender.setup“ bl_label “Setup My Render“ bl_options {‘REGISTER‘, ‘UNDO‘} # 可以在这里定义一些属性让用户在点击按钮前调整比如采样数 samples: bpy.props.IntProperty( name“Render Samples“, description“设置渲染采样数“, default128, min1, max4096 ) def execute(self, context): scene context.scene # ... (这里放入上面优化后的 setup_my_render 函数核心代码) # 将写死的 128 改为 self.samples scene.cycles.samples self.samples # ... 其他代码 self.report({‘INFO‘}, f“渲染设置已应用采样数: {self.samples}“) return {‘FINISHED‘} class MYRENDER_PT_panel(bpy.types.Panel): “”“创建一个侧边栏面板”“” bl_label “My Render Kit“ bl_idname “MYRENDER_PT_panel“ bl_space_type ‘VIEW_3D‘ bl_region_type ‘UI‘ bl_category “My Tab“ # 侧边栏的标签名 def draw(self, context): layout self.layout # 在面板中添加一个按钮点击它执行我们的操作 layout.operator(“myrender.setup“) # 可以显示或修改属性 op_props layout.operator(“myrender.setup“) op_props.samples 256 # 可以设置默认值或绑定到场景属性 def register(): bpy.utils.register_class(MYRENDER_OT_setup) bpy.utils.register_class(MYRENDER_PT_panel) def unregister(): bpy.utils.unregister_class(MYRENDER_PT_panel) bpy.utils.unregister_class(MYRENDER_OT_setup) if __name__ “__main__“: register()现在这个文件就是一个完整的 Blender 插件了。4.4 第四步安装与使用你的“套卡”将上面的完整代码保存为一个.py文件例如my_render_kit.py。在 Blender 中打开编辑 - 偏好设置 - 插件。点击右上角的“安装…”找到并选择你的my_render_kit.py文件。在插件列表中找到 “My Render Setup Kit”勾选启用它。现在在 3D 视图的右侧侧边栏按N键可开关你应该能看到一个名为 “My Tab” 的新标签页里面有一个 “Setup My Render” 的按钮。点击它所有预设的渲染设置就会一键应用。至此你的第一个“套卡”插件就完成了。它解决了一个非常具体的重复操作问题。5. 进阶打造更强大的“套卡”系统单个插件解决一个问题。但“套卡”的终极形态是一个可以管理多种自动化任务的系统。你可以沿着这个思路扩展5.1 创建多功能面板不要为每个功能都做一个独立的插件。可以在一个插件里定义多个Operator操作类然后在一个面板里用多个按钮来调用它们。例如一个“我的工具箱”面板里面包含按钮1应用渲染设置按钮2清理并重计算选中物体的法线按钮3为选中物体批量添加细分修改器按钮4将活动物体设置为所有选中物体的父级并保持变换每个按钮背后都是一个独立的execute函数。5.2 处理用户输入与交互简单的按钮可能不够。有时需要用户输入一些参数。使用属性Property就像上面例子里的samples你可以在 Operator 类里定义IntProperty、FloatProperty、StringProperty、EnumProperty等。它们会自动在按钮的弹出窗口或面板中生成可交互的输入框、滑块、下拉菜单。文件选择器如果需要用户选择一个文件或目录可以使用bpy.types.OperatorFileListElement或相关的文件操作 API。5.3 操作选中物体与场景数据“套卡”的核心是操作 Blender 内部数据物体、网格、材质等。遍历选中物体for obj in bpy.context.selected_objects:这是最常用的循环。检查物体类型if obj.type ‘MESH‘:确保只对网格物体进行操作。访问和修改数据obj.data可以访问网格数据obj.modifiers可以访问修改器列表obj.material_slots可以访问材质槽。应用变换bpy.ops.object.transform_apply(locationTrue, rotationTrue, scaleTrue)这是一个操作需要在特定上下文中执行通常先选中物体。5.4 错误处理与日志反馈健壮的插件必须有错误处理。使用 try-except在可能出错的地方如文件读写、API调用包裹 try-except用self.report({‘ERROR‘}, “错误信息”)反馈给用户。提供进度信息对于批量操作可以使用bpy.context.window_manager.progress_begin和progress_update来显示进度条让用户知道没有卡死。5.5 打包与分享当你积累了一套好用的“套卡”后可以打包分享给团队。将所有相关代码、图标如果有放在一个文件夹里。在文件夹根目录创建__init__.py文件在这个文件里导入并注册你所有的操作类和面板类。将这个文件夹压缩成.zip文件。其他人就可以通过 Blender 的“安装…”功能直接安装这个 zip 包得到一个完整的多功能工具箱。6. 避坑指南与经验之谈在开发和使用的过程中我踩过不少坑这里总结几个最关键的点6.1 上下文Context是万恶之源Blender 的bpy.ops操作运算符严重依赖当前上下文。在脚本中直接调用bpy.ops.object.select_all(action‘SELECT‘)很可能失败因为它可能不在物体模式下或者没有活动的 3D 视图。解决方案1使用bpy.context中的view_layer、selected_objects等数据直接进行修改这比调用ops更稳定。例如用obj.select_set(True)代替bpy.ops.object.select_all。解决方案2如果必须用ops可以临时覆盖上下文。这是一个高级用法需要查阅bpy.context.temp_override。经验能不用bpy.ops就不用优先使用数据 API 直接赋值。6.2 撤销Undo与重做Redo你的操作应该支持 Blender 的撤销栈。在定义 Operator 时设置bl_options {‘REGISTER‘, ‘UNDO‘}很重要。‘UNDO‘选项会让你的操作可以被撤销。对于复杂的、多步骤的操作你可能需要将一系列操作打包成一个“宏”以确保它们能作为一个整体被撤销。6.3 性能考量批量操作 vs 循环调用 ops假设你要给 1000 个物体添加修改器。如果在for循环里调用 1000 次bpy.ops.object.modifier_add(...)会非常慢因为每次调用都会触发界面更新和撤销栈记录。高效做法直接操作物体的modifiers数据列表。for obj in selected_objects: if obj.type ‘MESH‘: mod obj.modifiers.new(name“MySubdiv“, type‘SUBSURF‘) mod.levels 2这样效率高几个数量级。6.4 插件的加载与依赖你的插件不应该依赖其他第三方 Python 库如 numpy除非你明确知道团队成员的环境都有。如果必须用需要在插件的register()函数中检查并提示用户安装但这会大大增加复杂度。对于“套卡”插件尽量只使用 Blender 内置的bpy和 Python 标准库。6.5 从“能用”到“好用”用户体验清晰的按钮文字和提示bl_label和description要写清楚。合理的默认值你定义的属性Property要有符合常理的默认值。视觉反馈操作完成后使用self.report({‘INFO‘}, “完成”)在状态栏给出提示。对于耗时操作使用进度条。失败时优雅退出如果前置条件不满足如未选中物体应该在execute函数开头就检查并返回{‘CANCELLED‘}并给出友好提示。7. 总结让工具服务于你的流程打造“套卡”插件的本质是一次对个人或团队工作流的梳理和固化。它不是一个一蹴而就的庞大工程而是一个持续迭代的过程。我的建议是从小处着手先自动化一个你最厌烦的、5步以内的重复操作。先实现再优化第一版代码可以全是bpy.ops先跑通。然后再研究如何替换成更高效的数据 API。建立你的“套卡”库每解决一个问题就把对应的 Operator 和 Panel 代码整理好放入你的“工具箱”插件目录中。分享与协作在团队内部分享你的插件收集反馈。别人可能会发现你没想到的用例或边界情况。最终你会发现花在编写和调试插件上的时间会通过未来无数次的“一键操作”加倍回报回来。更重要的是它让你从重复的体力劳动中解放出来更能专注于创作本身。Blender 的强大不仅在于其内置功能更在于它通过 Python API 赋予用户的这种“塑造工具”的能力。

相关新闻

数据中心网络PFC流量控制:原理、配置与实战指南

数据中心网络PFC流量控制:原理、配置与实战指南

1. 项目概述:数据中心网络为何需要“流量控制”?如果你在数据中心或者高性能计算领域工作,一定对网络拥塞导致的“大象流”问题深恶痛绝。想象一下,一个服务器节点正在执行大规模的数据备份或者AI模型训练,瞬间产生了一…

2026/10/18 9:19:13 阅读更多 →
企业官网转化率提升的心理学原理与技术优化

企业官网转化率提升的心理学原理与技术优化

1. 官网流量转化困境的本质分析每天看着后台统计的访问量数据挺漂亮,但咨询表单始终空空如也——这是许多企业官网运营者共同的痛点。问题的根源往往不在于文案本身是否华丽,而在于整个用户路径的设计是否真正符合认知心理学规律。我服务过37个行业的官网…

2026/10/18 9:18:42 阅读更多 →
OpenClaw AI智能体安全:从提示词注入到动态防御的实战指南

OpenClaw AI智能体安全:从提示词注入到动态防御的实战指南

1. 项目概述:OpenClaw为何成为AI安全的新焦点最近在AI圈和安全圈,OpenClaw这个名字被提及的频率越来越高。它不再仅仅是一个酷炫的开源项目,而是迅速演变成了一个全新的、充满挑战的安全研究战场。如果你是一名AI应用开发者、企业安全工程师&…

2026/10/15 16:01:58 阅读更多 →

最新新闻

代码视频不是AI生成的,而是五步确定性流水线

代码视频不是AI生成的,而是五步确定性流水线

1. 项目概述:别被“AI生成视频”带偏了——代码视频的本质是精密流水线最近刷到不少标题党内容,说什么“Claude Opus 5.5已支持原生视频生成”“大模型终于能直接吐出MP4”,点进去一看,全是把一段Python脚本跑完后自动合成的GIF塞…

2026/10/18 9:18:27 阅读更多 →
智能问数系统开发环境搭建指南:从零实现自然语言转SQL闭环

智能问数系统开发环境搭建指南:从零实现自然语言转SQL闭环

最近连续几个做数据平台的朋友都在问类似的问题:想搭一个“能查数的聊天框”,但环境搭了两天还在折腾依赖。这个场景我太熟悉了,我自己第一次搭智能问数系统开发环境时,光是数据库连接和大模型服务就反复重来了三轮。这篇文章我把…

2026/10/18 9:18:27 阅读更多 →
GPT-5.2与Gemini 3 Pro API调用实战:选型、参数与成本控制

GPT-5.2与Gemini 3 Pro API调用实战:选型、参数与成本控制

2026年模型市场有点意思,GPT-5.2和Gemini 3 Pro几乎是前后脚发布,两边都在抢开发者的调用量。我花了两周时间把这两个模型的API都跑了一遍,包括日常对话、长文档总结、多模态识别、结构化输出这类真实业务场景,今天就把可以落地的…

2026/10/18 9:18:27 阅读更多 →
2026年Git进阶实践指南:分支管理、历史改写与日常协作的高频命令与避坑思路

2026年Git进阶实践指南:分支管理、历史改写与日常协作的高频命令与避坑思路

很多人学了三年 Git,还是复制粘贴那七八个命令。add、commit、push、pull,再多就发怵。可一旦遇到需要回滚、整理历史、修复冲突的场景,就只能靠删库重来或者去找“保命命令”的帖子。2026 年了,Git 自身的能力早就不是当年那个只…

2026/10/18 9:18:27 阅读更多 →
从零搭建智能问数系统开发环境:选型、依赖与排坑实战

从零搭建智能问数系统开发环境:选型、依赖与排坑实战

最近帮一个团队搭了一套智能问数系统的开发环境,项目标题起得挺朴素——“从 0 到 1 搭建智能问数系统开发环境”,但真正动手后才发现,这个“0 到 1”每一步都藏着坑。所谓智能问数,说白了就是让用户用大白话提问,系统…

2026/10/18 9:18:27 阅读更多 →
3D高斯泼溅实操指南:环境搭建、参数调优与踩坑避坑

3D高斯泼溅实操指南:环境搭建、参数调优与踩坑避坑

简介:面向从事三维重建与深度学习研究、开发的工程师和学生,这份资源是完整的三维高斯溅射(Gaussian Splatting)工程代码包,同时附带苹果手机实拍的可重建数据集,能够帮助使用者在已有照片基础上快速生成三…

2026/10/18 9:17:27 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 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/18 0:55:02 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →