深入理解DiT:视频生成背后的统一架构
Sora刚发布那阵子整个视频生成圈子几乎可以用炸锅来形容。大家看完官方放出的几个demo第一反应是画质真高、时长真长、物理规律像模像样第二反应才是琢磨这玩意到底是怎么做的OpenAI没发技术报告只透露了一个词——Diffusion Transformer也就是DiT。当时很多人还没意识到这个词不仅解释了Sora还预告了接下来一年多整个视频生成赛道唯一的主线剧情。事实也确实是这么发展的。后Sora时代你随便数几家头部玩家Runway的Gen-3、快手可灵、字节豆包视频生成、智谱CogVideoX、腾讯混元视频、Mistral的Magnetic、Google的Veo 2……架构清一色指向同一个剧本VAE把视频压缩成隐空间tokenDiT做核心的去噪骨干网络。区别只在patch怎么切、条件怎么注入、模型怎么缩放。所以这篇文章我不想重复那些浮在表面的产品对比而是把DiT本身拆开看一看——它解决了什么问题、它凭什么统一了视频生成、抄同一个剧本的各个团队各自在抄什么、改什么以及如果你想自己上手训练或复现一个视频模型最需要关注哪些细节。1. 为什么视频模型集体转向了 DiT大概从2022年开始图像生成领域的主力架构一直是U-Net。Stable Diffusion、Midjourney早期版本、DALL·E 2全都建立在一个带有跨层跳跃连接的卷积网络上。它做图像生成效果不错所以当Sora出现时如果OpenAI只是把U-Net的时间维拓展一下大家并不会感到意外。但OpenAI选择了Transformer这个选择在后来被证明带有一层更深的意义——Diffusion模型从设计一个特殊的网络变成了找一个足够强的通用网络然后用Diffusion目标去训练它。DiT论文全称是Diffusion Transformers for High-Resolution Image Synthesis来自William Peebles和谢赛宁2023年初挂在arXiv上。核心思路极简单Diffusion模型的去噪网络不一定非得是卷积的U-Net完全可以把图像切成patch变成token序列喂给标准的Transformer。整个扩散过程不变变的是去噪网络本身。这个替换看起来轻描淡写实际上把视频生成路线的逻辑彻底改变了。为什么这么说我自己的理解是三点第一Transformer提供了一个真正可扩展的骨架。U-Net做深度增加效果提升迅速进入瓶颈期。而Transformer吃数据、吃算力、吃参数的能力是有完整scaling law背书的今天语言模型已经证明过了拿来直接用。Sora特别强调视频是世界的模拟器本质上意味着这个模型要把规模推得足够大而只有Transformer这种架构才能持续加参数、加数据来换能力提升。第二视频本质上是比图像更高维、更序列化的数据。U-Net天生有一个固定的输入输出空间都是2D特征图扩展成3D后虽然可行但网络的归纳偏置限制了时空交互的灵活性。Transformer对输入没有任何空间结构假设只要能把视频表示成token序列就能用注意力机制自由地建模任意位置之间的关系——前一帧的某个像素可能和十帧之后远端的某个区域相关这种长程依赖用卷积处理是非常吃力的。第三架构统一带来的生态红利。DiT让视觉生成和语言模型用上了同一套底层思路、同一套分布式训练框架、同一套推理优化工具。这意味着视觉团队可以直接踩着大语言模型基础设施往前走不用自己从零造一套分布式训练引擎。后Sora时代的算力竞赛对训练效率要求极高统一架构让这个目标变得可及。所以视频模型转向DiT不是某一家公司的拍脑袋决定而是从扩展性、建模能力到工程生态三方面同时被验证之后的结果。2. DiT 的核心运行机制图像变 TokenToken 在变如果你没读过原论文我尽量用一套直观的三步走来描述DiT工作流。这里以最经典的DiT图像模型作为切入点视频模型的基本构件完全一致。2.1 第一步Patchify——把连续图像切成离散TokenLatent Diffusion的思路是先用一个预训练好的VAE/VQVAE把图像压缩到隐空间。比如一张256x256的图像经过VAE编码后得到32x32的隐空间特征图通道数可能只有4或8。DiT在这个隐空间上进行操作。Patchify操作类似于NLP中的token化把32x32的隐空间特征图切成8x8的小块每个patch的尺寸是8x8xC然后展平成一个向量经过一个线性投影得到指定维度的token embedding。这样32x32的特征图会被切成32/8²16个patch也就是16个token。Patch的大小直接影响序列长度和算力消耗patch越大token越少模型越轻但空间粒度越粗糙。如果你想让序列变长把patch调小到4x4token就变成64个翻四倍。这里我想强调一个容易误解的点很多人把DiT直接类比成ViT概念上没问题但ViT的class token在DiT这里是没有的。DiT不需要将整个图像压缩成一个全局表示它需要的是每个位置local token因为生成任务是逐位置重建的全局语义由注意力机制隐式捕获。2.2 第二步Transformer块——用注意力做去噪Token序列经过标准的Transformer Encoder通常包含多头自注意力和MLP中间有时间步嵌入和条件嵌入的注入。DiT论文里比较了几种条件注入方式最常见的是AdaLNAdaptive Layer Normalization也就是把扩散时间步、类别标签或文本向量经过MLP处理之后生成缩放和偏移参数直接调制每一层的LayerNorm输出。AdaLN之所以胜出原因是高效。Cross-Attention需要在每个Transformer块里额外计算文本特征和图像token的交叉注意力计算开销很大。而AdaLN只增加两个简单的回归预测头参数和算力都非常小。视频模型现在普遍也会用更激进的做法比如把文本条件通过cross-attention注入单独的编码器然后在特定层做融合这是后话了。2.3 第三步从噪声到视频的推导流程实际推理阶段DiT做的是从一个纯高斯噪声的token序列出发按照DDPM或DDIM采样逻辑迭代T步每步把估计的噪声减去一部分逐步逼近干净的数据内容。每一步Transformer输入是加了特定程度噪声的隐空间token、当前时间步t的embedding、条件输入文本、图像、音频等。等到T步迭代结束用VAE的Decoder把隐空间特征还原成像素级视频序列。如果你接触过AI绘画这套流程就很熟悉。视频模型不过是把token从一张图换成了帧序列patchify也从2D patch换成了3D时空patch。3. 视频版的 DiT从 Patch 到时空建模的关键改造严格意义上的图像DiT和视频DiT之间隔着一层时序维度。Sora的技术报告中有一个词反复出现——spacetime patches。原理很简单把一段视频按时间方向也做patch化。比如8x8的空间patch搭配1帧的时间深度那么一个token覆盖的是某个8x8区域在第k帧的局部块。决定token按时间还是空间展开以及如何把它们拼成序列直接决定了模型对时间关系的感知。这里主流有两种策略一种是把视频看成很多帧图像的堆叠每一帧独立patchifytoken按帧序优先或空间位置优先排列。相邻token可能来自于同一帧、相邻空间位置也可能来自不同帧的对应区域。自注意力默认可以跨所有token计算所以时序关系是隐式建模的。OpenAI的做法倾向于把所有时空patch压成一维序列随便怎么组织注意力自动学。另一种是显式地给token加上时间位置编码。2D位置编码如果只编码空间坐标模型区分不出同一空间位置在第1帧和第50帧的差异所以视频DiT往往需要3D位置嵌入让token能感知自己的空间坐标和时间坐标。这看起来是一个小改动实际训练中如果位置编码设计不当模型很容易把时序信息学歪生成视频出现同一帧内容反复闪烁或者物体瞬移的问题。在模型内部视频DiT的主干通常仍是一个标准的Transformer Block序列。但不同团队在细节上分化很大这直接给了单流和双流的说法以不同的含义。这个概念有两种理解路径一是token本身的通道构成方式二是铺成一层Transformer还是两层独立Transformer。我建议你当成前者来理解后面再细说。单流设计把所有条件信息文本嵌入、时间步、结构图直接拼接进token序列里走同一个Transformer——很直接但如果文本本身很长token数会被拉得非常离谱计算量吃不消。双流设计则先用两条独立的Transformer分支分别处理视频token和文本token两条分支独立走N层再在某个特定层把两条流的输出拼接/融合起来之后继续走联合Transformer。这个设计兼顾了语义控制力和算力开销是目前头部视频模型最常用的方案。可灵、CogVideoX、Open-Sora这些开源项目大多落在类双流联合注意力模式上。所谓联合注意力就是在融合层里把视觉token和文本token放在同一个注意力矩阵里计算让视觉能看到文本语义同时文本也能按需看到视觉结构。4. 我不建议从零训练一个 DiT先搞懂训练策略的几个关键点关于训练DiT视频模型我见过最多的问题是我能不能用一张消费级显卡训一个视频DiT。答案很残酷能训但效果大概率让你崩溃。不是DiT本身有问题而是视频模型的训练容错率和性价比远低于图像模型。但不代表普通开发者就没法实际接触DiT你完全可以从微调开源模型、理解训练数据管线入手。无论哪种路线下面几个点是共通的。4.1 训练数据是最大的胜负手甚至比模型结构更关键很多技术文章讲DiT时喜欢聚焦注意力机制但我实际踩坑的体会是视频模型的效果上限一半以上由数据决定。拿CogVideoX来说它的训练数据经过了极其精心的清洗和过滤剔除低分辨率、带水印、大幅度抖动、字幕压框过重的视频还要按文本相关性做重排。用低质量数据训练出的模型出现鬼影、肢体扭曲、语义断裂几乎是必然的这不是超参能救回来的。如果你只做微调数据量不需要像底座训练那么多但质量要求不变。我建议宁可把数据规模缩小30%也要把每一条样本人工抽查一遍。这种工作很枯燥但实际看到模型输出的第一帧之后你会明白一切都值得。4.2 分辨率与时长先从低分辨率、短视频开始渐进式训练训练视频模型沿用图像生成社区常见的多阶段策略。第一阶段在256x256、2到4秒的视频上训练模型先学会运动趋势和基础语义第二阶段把分辨率提到512或768时长扩到8到10秒第三阶段再上高清和更长时间。Sora据说内部做了多阶段渐进式训练每阶段不仅要变换分辨率还要按比例混合不同质量的数据。我实践过的经验是直接在1080p上用6秒的视频开训是完全可能的但单条样本的显存占用会让你连一个batch都塞不下而且模型在早期学说话阶段分配那么高分辨率纯属浪费。低分辨率学好结构高分辨率只做精修阶梯式推进才是成熟做法。4.3 Batch Size和梯度累积DiT训练最容易被忽略的陷阱DiT是典型的batch越大效果越稳的模型。原因很简单扩散过程的每一步训练目标都是预测噪声这个任务的监督信号本身很稀疏batch太小会导致梯度噪声大、模型进展慢。在视频模型里取batch size16都是一个偏小的值——如果它甚至装不进显存先缩短视频长度、降低分辨率、减少patch数而不是硬蹭一个大batch。真实训练中我发现梯度累积确实能缓解显存压力但效果不能完全等同于真实大batch。Diffusion训练里BN统计量或梯度噪声的差异会明显影响去噪稳定度。如果显存有限另一种更推荐的做法是启用梯度检查点activation checkpointing以少量计算换大幅显存节省。我在4090上训8到10秒的短视频DiT时配合混合精度和梯度检查点batch size可以从4提到12训练效率提升立竿见影。4.4 推理时要注意CFG、步数和时序一致性的三角平衡训练完成后的推理参数也很有讲究。DiT模型推理最常用的操作是classifier-free guidanceCFG也就是同时跑无条件生成和有条件生成然后外推拉开两者差距。CFG能让文本相关性更强、画面更符合输入描述但数值设置太高会让视频发灰、过饱和甚至画面崩坏。常见取值在3.0到7.5之间视频模型一般比图像模型保守一些很多开源项目默认用3.5到4.5。步数方面DiT通常支持DDIM采样20到50步跑出不错的效果再低就考验蒸馏水平了。需要警惕的是视频模型每一步推理的成本是按帧数乘分辨率算的20步看起来不多但每一步都是一整批视频token参与完整注意力计算。如果生成10秒720p视频的实时性要求很高就必须考虑步数蒸馏和并行采样了。关于时间一致性一个常见的误区是增加CFG就能让视频前后保持一致。不一定高CFG甚至可能把每一帧都拉向独立的语义模板导致帧间连贯性反而变差。如果视频中物体身份漂移优先检查数据集时长是否足够、3D位置编码是否完整、采样时是否用了独立噪声策略而不是急着加大CFG。5. 开源 DiT 视频模型的对比与选型思路既然所有视频模型都在抄同一个剧本那动手选型时其实非常省心——你只要挑一个最适合自己算力和场景的开源实现即可。我拿几款代表性项目说说差异。CogVideoX是目前对个人开发者最友好的一档。它开源了完整推理代码、微调脚本和多个规格的权重甚至贴心地提供了不同显存档位的配置说明。架构上是典型的VAE加DiT文本通过编码器做深度融合视觉token以patch序列形式进Transformer。这个模型生成的视频风格偏稳适合做短时长的语义理解类生成。Open-Sora是另一个绕不开的项目由ColossalAI团队发起直接目标是复现Sora。它的架构演进分了好几个版本从早期偏2D DiT逐步演进到3D时空注意力。这个项目最大的价值不在最终效果而是它把视频DiT训练管线的每一步都具象化了——数据预处理、VAE训练、DiT训练、并行策略都有完整代码。如果你想深入理解DiT视频模型的工程实现Open-Sora几乎是最好的教材。Google Veo 2闭源但架构传闻是多层DiT与自回归并行代表另一个方向DiT不一定非得是纯扩散模型可以和自回归token生成结合。这提醒我们抄同一个剧本不代表完全一致主干是DiT但内部采样策略和token建模仍有很多创新空间。选型时我给一个实用判断标准先看自己的目标任务是质量优先还是可控性优先。质量优先选参数量大的开源底座可控性优先优先看项目是否提供了强条件注入机制和微调接口。永远不要只凭demo效果选模型训练数据分布决定了这个模型在你业务场景上的表现所以一定要用你的实际素材做小规模测试。6. 踩坑记录与问题速查最后一部分整理几个我玩DiT视频模型时遇到的问题和排查思路很多坑在网上都不太容易搜到。第一个高频问题显存不够。很多人一上来就想用16G显存跑10秒720p视频推理结果OOM。我的建议是优先减少patch数量把patch size调大到16x16token数会显著下降。另一个技巧是分帧推理——先生成关键帧再对关键帧之间做插值或补帧这样能用低显存做长视频。虽然效果略逊于一次生成但工程上灵活很多。第二个高频问题训练loss下降但视频完全没有运动。这个现象多半是数据分布问题——如果训练数据里静态镜头占比太高模型学到的最安全策略就是输出静止画面。要强迫模型学到运动需要保证训练集中包含大量有明显位移的视频且采样时长要足够。我在某个微调实验里把静态样本全部过滤后同一个模型立刻开始出现合理运动。第三个高频问题生成视频的前几帧崩坏、后面恢复。这是典型的时序位置编码没有做好。排查方式很简单换用一个显式3D位置编码的开源实现同时检查采样器的首帧条件注入方式。很多模型支持首帧条件生成如果你传入参考图像作为起点前几帧崩坏的几率会大幅下降。第四个常见问题文本指令跟视频内容对不上。别急着怪模型先检查文本编码器。老版本开源模型常用CLIP文本编码器它对复杂指令的理解很有限。换成T5或更新的大语言文本编码器后语义对齐效果通常立竿见影。第五个细节问题生成视频有闪烁或横条伪影。这属于VAE解码端的痕迹和DiT本身关系较小。可以尝试升级项目的VAE模块比如用更高重建质量的视频VAE替换默认版本或者减少扩散采样步数来降低累积误差。如果伪影呈周期性分布检查patch排列方式是否正确个别实现里帧序被错误拼接也会产生类似现象。7. 写在最后一线的个人体会我对DiT最深的感触是它本身不复杂读原论文四十分钟就能看懂框架。真正复杂的是围绕这个框架做出来的工程巨兽——数据清洗、分布式训练、采样优化、视频评测每一环都能消耗一个团队整整一年。现在入局视频模型的门槛并没有因为开源而降得很低但理解门槛确实低了很多。如果你关注这个赛道先去跑通一个Open-Sora或CogVideoX的微调再去看各家最新技术报告很多术语会从认识变成感同身受那种体验和纯看文章是完全不一样的。最后分享一个工作习惯每次跑完一个视频生成任务把生成结果按frame频率抽帧存档用连续帧拼成网格图肉眼检查。模型指标看多了往往不如直接看帧序列更真实——很多细节问题比如物理规律违背、边缘闪烁、目标闪烁都是肉眼帧序列一眼就能看出来的。视频DiT的进步和翻车都格外直观做这个领域的最大红利就是你每天都在看自己亲手生成的世界慢慢变得更合理这比任何benchmark数值都带劲。

相关新闻

对话式地图助手落地实践:语言模型到地图动作的适配层设计

对话式地图助手落地实践:语言模型到地图动作的适配层设计

从聊天机器人一脚踩进地图场景的那段时间,我被一个问题折磨了很久:语言模型再能聊,跟地图引擎之间始终隔着一道墙。用户在对话框里说"帮我找滨河公园附近评分高的粤菜馆,然后规划一条地铁过去的路线",前端却…

2026/10/14 10:09:42 阅读更多 →
Agent-Skills架构实战:如何设计可复用、可组合的智能体技能模块

Agent-Skills架构实战:如何设计可复用、可组合的智能体技能模块

1. 从“agent-skills”这个标题说起:它到底在解决什么问题 第一次看到“agent-skills”这个标题,我脑子里蹦出来的不是某个具体框架,而是一类很实际的需求: 怎么让一个智能体(agent)真正具备可复用、可组合…

2026/10/14 10:09:42 阅读更多 →
SwiftUI 与 Agent 结合:声明式 UI 驱动智能体技能开发实战

SwiftUI 与 Agent 结合:声明式 UI 驱动智能体技能开发实战

1. 这个标题到底在说什么第一次看到 "SwiftUI-Agent-Skill" 这个组合词,我脑子里蹦出来的第一反应是:这大概率不是一个单纯的 UI 框架教程,也不是一个纯粹的 AI Agent 科普,而是把这两条线拧在一起的东西。拆开看就很清…

2026/10/14 10:09:42 阅读更多 →

最新新闻

Python实现重复文档查找与清理工具

Python实现重复文档查找与清理工具

1. 重复文档查找工具的设计与实现在日常工作中,我们经常会遇到文档重复的问题,特别是从QQ、微信等平台接收的文件,经常会在不同文件夹中保存多份相同内容但不同名称的文件。这些重复文件不仅占用宝贵的存储空间,还会导致文件管理混…

2026/10/14 11:02:10 阅读更多 →
SpringBoot文旅系统开发:微服务架构与智能推荐实践

SpringBoot文旅系统开发:微服务架构与智能推荐实践

1. 项目背景与核心价值 绍兴作为拥有2500年建城史的文化名城,其"水乡、桥乡、酒乡、书法之乡"的文旅资源数字化呈现具有典型示范意义。这个基于SpringBoot的旅游系统毕业设计,实际上构建了一个可复用的区域文旅数字化解决方案原型。我在参与某…

2026/10/14 11:02:10 阅读更多 →
自考备考:8款工具有效降低AI误判率

自考备考:8款工具有效降低AI误判率

1. 项目背景与核心价值作为一名连续5年参与自学考试辅导的从业者,我深刻理解考生在备考过程中面临的核心痛点。2023年某省自考办统计数据显示,78%的考生在主观题作答时因表述不规范被系统误判为AI生成内容,导致平均每科损失12-15分。这种现象…

2026/10/14 11:02:10 阅读更多 →
AI辅助自考工具测评:如何科学选择与使用

AI辅助自考工具测评:如何科学选择与使用

1. 自考备考新趋势:AI辅助工具的崛起与选择困境作为一名连续三年跟踪自考工具演变的备考顾问,我亲眼见证了AI技术如何重塑自学考试的准备方式。2023年以前,考生们还在用纸质笔记和传统题库;而到了2025年,已有78%的自考…

2026/10/14 11:02:10 阅读更多 →
给AI Agent配一套Skills工程工作流:从玩具到工具的落地指南

给AI Agent配一套Skills工程工作流:从玩具到工具的落地指南

最近一段时间,AI Agent 的热度又起来了,但真正能把 Agent 用进生产环境的人其实不多。我见过太多团队把 Agent 当成一个“聊天机器人”来调,结果 Chat 的时候什么都好,一放到工作流里就怎么都不对。今天想聊的这套东西&#xff0c…

2026/10/14 11:02:10 阅读更多 →
C++字符类型char与wchar_t深度解析

C++字符类型char与wchar_t深度解析

1. 理解C中的字符类型本质在C开发中,字符处理是每个程序员都会遇到的基础问题。char和wchar_t看似简单,但背后涉及字符编码、国际化支持等复杂概念。我们先从内存层面理解它们的物理差异:char类型保证至少8位宽度,这源于C语言的遗…

2026/10/14 11:01:09 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

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

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

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

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

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

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

2026/10/13 16:22:04 阅读更多 →
影刀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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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 阅读更多 →