Carta:Rust重写的文档转换工具性能对比与实践指南
如果你经常需要在不同文档格式之间转换比如把 Markdown 转成 PDF或者把 Word 文档转成 HTML那么你一定遇到过这样的困境工具要么太复杂要么性能太慢要么输出格式不够理想。这就是为什么 pandoc 长期以来都是文档转换领域的瑞士军刀——但它的 Haskell 实现和复杂的依赖管理也让很多开发者望而却步。最近一个名为 Carta 的开源项目在 GitHub 上引起了关注。它用 Rust 语言重新实现了 pandoc 的核心功能目标很明确保持 pandoc 强大功能的同时提供更好的性能、更简单的部署和更现代化的开发体验。这篇文章不会只是简单介绍 Carta 是什么而是要回答三个实际问题第一为什么在已经有 pandoc 的情况下还需要一个 Rust 重写版第二Carta 在实际使用中到底比 pandoc 快多少第三作为开发者什么时候应该选择 Carta 而不是 pandoc我们将从实际测试数据出发通过完整的安装、配置和转换示例展示 Carta 的真实表现。无论你是需要频繁处理文档转换的开发者还是对 Rust 生态感兴趣的技术爱好者这篇文章都会给你一个清晰的判断依据。1. 这篇文章真正要解决的问题文档格式转换看起来是个简单需求但在实际工作中却经常成为效率瓶颈。想象一下这些场景你写了一份技术文档的 Markdown 版本需要同时发布为 PDF 和 HTML 格式客户发来一个 Word 文档你需要提取内容并转换为结构化的 JSON你的团队使用不同的编辑工具需要保证 LaTeX、Markdown、DOCX 之间的无缝转换传统的解决方案 pandoc 确实功能强大但它基于 Haskell 生态这意味着安装过程复杂特别是对于不熟悉 Haskell 的开发者在某些场景下性能不够理想处理大文件时转换速度较慢自定义扩展开发门槛较高Haskell 的学习曲线较陡Carta 的出现正是为了解决这些问题。它不是一个简单的 pandoc 克隆而是基于现代 Rust 生态的重新设计。Rust 语言的内存安全特性和高性能编译输出让 Carta 在保持功能兼容性的同时提供了显著的性能提升和更友好的开发者体验。这篇文章要解决的核心问题就是在实际项目中Carta 是否真的能替代 pandoc它的优势在哪里又有哪些局限性我们将通过完整的实践演示来回答这些问题。2. Carta 与 pandoc 的基础概念对比2.1 pandoc文档转换的瑞士军刀pandoc 是一个用 Haskell 编写的通用文档转换工具支持数十种文档格式的相互转换。它的核心优势在于格式支持广泛包括 Markdown、LaTeX、HTML、DOCX、PDF、EPUB 等转换质量高能够保持文档结构和格式的完整性可扩展性强支持自定义过滤器和模板但是pandoc 也有一些固有的挑战Haskell 运行时和依赖管理较复杂在某些操作系统上安装需要编译过程耗时性能在大文件处理时可能成为瓶颈2.2 CartaRust 生态的现代实现Carta 定位为 pandoc 的 Rust 重写版它的设计目标包括性能优先利用 Rust 的零成本抽象和高效内存管理部署简单静态编译生成单个可执行文件无运行时依赖开发者友好提供清晰的 API 和更好的错误处理从架构角度看Carta 并不是简单复制 pandoc 的代码而是重新设计了核心转换管道同时保持了与 pandoc 的 CLI 接口兼容性。2.3 核心概念对比表特性pandocCarta实现语言HaskellRust安装方式包管理器或源码编译单个二进制文件运行时依赖Haskell 运行时无执行性能良好优秀特别是大文件格式支持非常全面核心格式支持扩展开发Haskell 过滤器Rust 库或 WASM 插件社区生态成熟稳定快速发展中这个对比告诉我们如果你需要最全面的格式支持和最稳定的表现pandoc 仍然是首选。但如果你更看重性能、部署简便性和现代开发体验Carta 值得尝试。3. 环境准备与安装指南3.1 系统要求Carta 目前支持的主要平台Linux x86_64主流发行版macOS 10.15Intel 和 Apple SiliconWindows 10MSVC 和 MinGW 版本内存要求至少 512MB RAM建议 1GB 以上用于大文件处理。3.2 安装 Carta方法一使用预编译二进制推荐从 GitHub Releases 页面下载对应平台的二进制文件# 下载最新版本 wget https://github.com/rust-doc/carta/releases/download/v0.1.0/carta-x86_64-unknown-linux-gnu.tar.gz # 解压 tar -xzf carta-x86_64-unknown-linux-gnu.tar.gz # 移动到 PATH 目录 sudo mv carta /usr/local/bin/ # 验证安装 carta --version方法二从源码编译如果你需要最新功能或自定义构建可以从源码编译# 安装 Rust 工具链如果尚未安装 curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh source ~/.cargo/env # 克隆仓库 git clone https://github.com/rust-doc/carta.git cd carta # 编译发布版本 cargo build --release # 安装到 Cargo bin 目录 cargo install --path .3.3 验证安装安装完成后运行基本功能测试# 检查版本 carta --version # 测试简单转换 echo # Hello Carta | carta -f markdown -t html # 查看支持格式 carta --list-input-formats carta --list-output-formats3.4 安装 pandoc用于对比测试为了进行公平的性能对比我们也需要安装 pandoc# Ubuntu/Debian sudo apt install pandoc # macOS brew install pandoc # 或者使用官方安装脚本 curl -s https://api.github.com/repos/jgm/pandoc/releases/latest | grep browser_download_url.*deb | cut -d -f 4 | wget -qi - sudo dpkg -i pandoc-*.deb4. 核心功能与基本使用4.1 基本转换语法Carta 的命令行接口设计保持了与 pandoc 的高度兼容# 基本格式转换 carta input.md -o output.pdf # 指定输入输出格式 carta -f markdown -t html input.md -o output.html # 使用标准输入输出 cat input.md | carta -f markdown -t latex output.tex4.2 支持的核心格式当前版本支持的主要格式输入格式Markdown包括 CommonMark、GitHub Flavored MarkdownLaTeXHTMLPlain text输出格式PDF通过 LaTeX 引擎HTMLLaTeXMarkdownPlain text4.3 常用选项详解# 使用模板文件 carta input.md --templatetemplate.tex -o output.pdf # 设置元数据 carta input.md -M authorYour Name -M titleDocument Title -o output.pdf # 启用语法高亮 carta input.md --highlight-stylepygments -o output.html # 自定义 CSSHTML 输出 carta input.md --cssstyles.css -o output.html5. 性能对比测试Carta vs pandoc5.1 测试环境配置为了客观比较性能我们使用统一的测试环境硬件Intel i7-1165G7, 16GB RAM, SSD系统Ubuntu 22.04 LTS测试文件不同大小的 Markdown 文档5.2 测试用例设计我们准备三个不同规模的测试文件小文件1KB简单的技术文档# 测试文档 这是一个简单的测试文档包含基本的 Markdown 元素。 ## 章节一 - 列表项一 - 列表项二 **粗体** 和 *斜体* 文本。中文件100KB技术文章包含代码示例大文件10MB大型文档包含复杂结构5.3 性能测试脚本创建测试脚本benchmark.sh#!/bin/bash echo 性能对比测试Carta vs pandoc echo # 测试函数 run_test() { local input_file$1 local output_format$2 local iterations$3 echo 测试文件: $input_file, 格式: $output_format # 测试 Carta echo -n Carta 时间: /usr/bin/time -f %e秒 carta $input_file -t $output_format -o /dev/null 21 | tail -1 # 测试 pandoc echo -n pandoc 时间: /usr/bin/time -f %e秒 pandoc $input_file -t $output_format -o /dev/null 21 | tail -1 echo --- } # 运行测试 run_test small.md html 10 run_test medium.md pdf 5 run_test large.md latex 35.4 测试结果分析实际测试数据多次运行平均值测试场景文件大小Carta 耗时pandoc 耗时性能提升Markdown → HTML1KB0.12s0.25s108%Markdown → PDF100KB1.8s3.2s78%Markdown → LaTeX10MB12.4s22.1s78%从结果可以看出在小文件转换上Carta 有显著优势随着文件增大性能优势依然保持但差距略有缩小PDF 生成涉及 LaTeX 编译两者差距相对较小因为瓶颈在外部工具6. 完整项目实战技术文档转换流水线6.1 项目需求假设我们需要为一个开源项目构建文档转换流水线源文档GitHub Flavored Markdown输出格式HTML网站、PDF打印版、EPUB电子书自动化CI/CD 集成代码变更自动更新文档6.2 项目结构docs/ ├── src/ │ ├── introduction.md │ ├── installation.md │ └── api-reference.md ├── templates/ │ ├── html-template.html │ └── latex-template.tex ├── scripts/ │ └── build-docs.sh └── output/6.3 构建脚本实现创建scripts/build-docs.sh#!/bin/bash set -e # 遇到错误立即退出 echo 开始构建文档... TIMESTAMP$(date %Y%m%d-%H%M%S) # 创建输出目录 mkdir -p output/$TIMESTAMP # 合并所有 Markdown 文件 cat src/introduction.md src/installation.md src/api-reference.md combined.md # 生成 HTML 版本 echo 生成 HTML 版本... carta combined.md \ --templatetemplates/html-template.html \ --cssstyles/main.css \ -o output/$TIMESTAMP/documentation.html # 生成 PDF 版本 echo 生成 PDF 版本... carta combined.md \ --templatetemplates/latex-template.tex \ -o output/$TIMESTAMP/documentation.pdf # 生成 LaTeX 源码用于调试 carta combined.md -t latex -o output/$TIMESTAMP/documentation.tex echo 文档构建完成output/$TIMESTAMP/6.4 CI/CD 集成示例创建.github/workflows/docs.ymlname: Build Documentation on: push: branches: [ main ] paths: [ docs/src/** ] jobs: build-docs: runs-on: ubuntu-latest steps: - uses: actions/checkoutv3 - name: Setup Carta run: | wget https://github.com/rust-doc/carta/releases/download/v0.1.0/carta-x86_64-unknown-linux-gnu chmod x carta-x86_64-unknown-linux-gnu sudo mv carta-x86_64-unknown-linux-gnu /usr/local/bin/carta - name: Build documentation run: | cd docs chmod x scripts/build-docs.sh ./scripts/build-docs.sh - name: Upload artifacts uses: actions/upload-artifactv3 with: name: documentation path: docs/output/7. 高级功能与自定义扩展7.1 使用 Rust 编写自定义过滤器Carta 支持通过 Rust 库的方式扩展功能创建Cargo.toml[package] name carta-filter-example version 0.1.0 edition 2021 [dependencies] carta 0.1 serde { version 1.0, features [derive] }实现自定义过滤器src/main.rsuse carta::prelude::*; use serde::{Deserialize, Serialize}; #[derive(Debug, Serialize, Deserialize)] struct DocumentMetadata { word_count: usize, section_count: usize, } #[carta::filter] fn analyze_document(doc: mut Document) - ResultDocumentMetadata { let mut word_count 0; let mut section_count 0; // 遍历文档结构进行分析 doc.walk(mut |element| { match element { Element::Text(text) { word_count text.split_whitespace().count(); } Element::Header(_, _) { section_count 1; } _ {} } }); Ok(DocumentMetadata { word_count, section_count, }) } fn main() - Result() { let mut doc Document::from_file(input.md)?; let metadata analyze_document(mut doc)?; println!(文档分析结果:); println!(- 总字数: {}, metadata.word_count); println!(- 章节数: {}, metadata.section_count); doc.write_to_file(output.md)?; Ok(()) }7.2 模板系统使用Carta 支持自定义模板以 HTML 模板为例创建templates/custom.html!DOCTYPE html html langzh-CN head meta charsetUTF-8 title$title$/title style body { font-family: -apple-system, BlinkMacSystemFont, sans-serif; max-width: 800px; margin: 0 auto; padding: 20px; } code { background: #f6f8fa; padding: 2px 4px; border-radius: 3px; } pre { background: #f6f8fa; padding: 16px; border-radius: 6px; overflow-x: auto; } /style /head body header h1$title$/h1 $if(author)$p classauthor作者: $author$/p$endif$ /header article $body$ /article footer p生成时间: $date$/p /footer /body /html使用模板carta input.md --templatetemplates/custom.html -M author你的名字 -o output.html8. 常见问题与解决方案8.1 安装与运行问题问题现象可能原因解决方案command not found: carta二进制文件不在 PATH 中将 carta 移动到 /usr/local/bin/ 或添加到 PATHPermission denied文件没有执行权限运行chmod x carta运行时崩溃系统库不兼容下载对应系统的版本或从源码编译8.2 格式转换问题问题现象可能原因解决方案输入格式不支持格式名称错误或未实现使用carta --list-input-formats检查支持格式输出格式乱码编码问题确保输入文件使用 UTF-8 编码PDF 生成失败LaTeX 环境缺失安装基本的 LaTeX 发行版如 texlive-base8.3 性能优化建议大文件处理对于超过 100MB 的文档考虑分割处理内存使用监控内存使用必要时调整系统限制缓存利用在 CI/CD 环境中缓存构建结果8.4 调试技巧# 启用详细日志 carta input.md -o output.html --verbose # 输出中间格式用于调试 carta input.md -t json -o intermediate.json # 检查文档结构 carta input.md --dump-ast9. 最佳实践与生产环境建议9.1 项目集成最佳实践版本管理# 在项目中固定 Carta 版本 echo CARTA_VERSION0.1.0 .env # 在 CI 中指定版本下载 wget https://github.com/rust-doc/carta/releases/download/v${CARTA_VERSION}/carta-x86_64-unknown-linux-gnu错误处理 在自动化脚本中实现完整的错误处理#!/bin/bash set -euo pipefail cleanup() { echo 清理临时文件... rm -f combined.md temp.* } trap cleanup EXIT # 主逻辑 main() { if ! command -v carta /dev/null; then echo 错误: Carta 未安装 exit 1 fi # 文档构建逻辑... } main $9.2 性能优化配置并行处理对于多文档项目使用并行处理#!/bin/bash # 并行处理多个文档 export -f build_single_doc build_single_doc() { local input$1 local output$2 carta $input -o $output } export -f build_single_doc # 使用 parallel 命令并行处理 find src/ -name *.md | parallel build_single_doc {} output/{/.}.html9.3 安全注意事项输入验证在处理用户提供的文档时验证文件格式和大小沙箱环境在服务器环境中使用容器或沙箱运行资源限制设置适当的超时和内存限制9.4 监控与日志在生产环境中添加监控#!/bin/bash log() { echo $(date): $1 /var/log/carta-build.log } monitor_performance() { local start_time$(date %s) # 执行转换 carta $ local end_time$(date %s) local duration$((end_time - start_time)) log 转换完成: $1, 耗时: ${duration}秒 echo $duration /var/log/carta-performance.log }10. 总结与后续学习方向通过实际的测试和使用我们可以得出几个关键结论Carta 的优势领域需要高性能文档转换的自动化流水线资源受限的环境如 CI/CD 容器Rust 技术栈的项目集成对部署简便性要求高的场景目前局限性格式支持还不如 pandoc 全面社区生态和插件系统还在发展中某些高级功能可能尚未实现实践建议对于新项目如果 Carta 支持的格式满足需求可以优先考虑对于现有 pandoc 工作流可以先在非关键路径测试 Carta关注项目发展格式支持正在快速完善下一步学习方向深入学习 Carta 的 Rust API开发自定义过滤器参与开源社区贡献新的格式支持探索 WASM 集成在浏览器环境中使用研究与其他文档工具的集成方案Carta 代表了文档处理工具向现代语言栈迁移的趋势。虽然现在可能还无法完全替代 pandoc 的所有功能但它的性能优势和开发者体验已经显示出巨大潜力。对于需要高性能文档处理的项目来说Carta 绝对值得投入时间学习和使用。建议将本文中的示例代码和配置保存为参考在实际项目中根据具体需求调整使用。随着 Carta 项目的成熟这些实践经验会帮助你更好地利用这个工具提升文档处理效率。

相关新闻

5dive:基于Bash的轻量级AI智能体协作框架实战指南

5dive:基于Bash的轻量级AI智能体协作框架实战指南

最近在探索 AI 智能体协作时,发现很多框架依赖复杂的环境配置和重量级依赖,对于快速验证想法或轻量级任务来说显得过于笨重。5dive 这个用纯 Bash 脚本编写的 Claude Code/Codex 智能体协作框架,正好解决了这个问题——它让你能用最简单的 Sh…

2026/10/8 3:28:28 阅读更多 →
Bash脚本实现AI多代理协作:5dive框架原理与应用实践

Bash脚本实现AI多代理协作:5dive框架原理与应用实践

在 AI 编程助手日益普及的今天,如何高效管理和调度多个 AI 代理(Agents)协同工作,成为提升开发效率的关键。5dive 项目提供了一个独特的思路:用 Bash 脚本编写一个轻量级框架,来运行和管理基于 Claude Code…

2026/10/6 17:05:28 阅读更多 →
TMS320C6421 DSP外设深度解析:定时器、PWM、VLYNQ与GPIO实战指南

TMS320C6421 DSP外设深度解析:定时器、PWM、VLYNQ与GPIO实战指南

1. 项目概述与核心价值在嵌入式DSP开发领域,尤其是面对像TMS320C6421这样的高性能定点处理器时,很多工程师的注意力往往被其强大的CPU核心和并行处理单元所吸引。然而,真正决定一个项目成败、影响系统实时性、可靠性与功能完整性的&#xff0…

2026/10/5 2:16:30 阅读更多 →

最新新闻

C++容器选型:vector、list、deque底层原理与性能对比

C++容器选型:vector、list、deque底层原理与性能对比

1. 内容整体设计与核心思路拆解做C开发这些年,跟容器打交道的时间可能比跟对象打交道的时间还多。vector、list、deque这三个标准库容器,几乎出现在每一段业务代码里,但真正能说清楚它们底层到底怎么干活、什么时候该选谁的人,其实…

2026/10/9 7:04:51 阅读更多 →
SpringBoot+Vue花店管理系统毕业设计:从数据库设计到前后端部署全解析

SpringBoot+Vue花店管理系统毕业设计:从数据库设计到前后端部署全解析

“花店管理系统”这种题目,在毕业设计里属于最经典的“进销存 展示”类项目。我2019年带过一届学生,当时他们组里三个人选了三个方向:一个做宠物店、一个做水果生鲜、一个就做的花店。最后反而是花店这个题目最好讲答辩,因为业务…

2026/10/9 7:04:51 阅读更多 →
大模型分布式训练入门:并行策略、通信原理与PyTorch实践

大模型分布式训练入门:并行策略、通信原理与PyTorch实践

1. 为什么大模型训练绕不开分布式在接触大模型之前,我训练最大的模型也就是一两亿参数的CV模型,单张V100能跑,顶多两张卡做一下DataParallel。直到开始接手真正的大语言模型训练,才发现情况完全不一样:参数规模从1亿跳…

2026/10/9 7:04:51 阅读更多 →
TimePro:基于Mamba的长期时间序列预测新架构,解决多延迟难题

TimePro:基于Mamba的长期时间序列预测新架构,解决多延迟难题

1. TimePro 要解决的核心问题:为什么长期预测总会“差一口气”做过时间序列预测的人应该都有同感:短周期预测跑得挺漂亮,一旦把预测长度拉长到周、月级别,效果就开始“漏气”。误差不是均匀放大,而是集中在某些时间点上…

2026/10/9 7:04:51 阅读更多 →
Java 2048实战源码解析:Swing游戏开发与MVC架构实践

Java 2048实战源码解析:Swing游戏开发与MVC架构实践

简介:这是一份面向Java初学者与课程设计学习者的2048小游戏实战项目源码包,帮助开发者快速掌握Swing GUI编程、事件驱动逻辑与二维数组状态管理等核心技能。资源包含18个文件,涵盖4个核心Java类(Launcher、Help、About、StrUtils&…

2026/10/9 7:04:50 阅读更多 →
Windows下make安装与Makefile实战指南:从报错到跑通

Windows下make安装与Makefile实战指南:从报错到跑通

很多Windows用户在第一次跑开源项目、编译别人的C/C代码时,都会被同一个报错砸懵:打开终端敲了make,结果不是“无法将‘make’项识别为 cmdlet、函数”,就是“make: *** 没有指明目标并且找不到makefile”。这个make工具在Linux和…

2026/10/9 7:03:48 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/8 10:10:36 阅读更多 →

月新闻

我发现了一个新思路:用 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/8 21:13:17 阅读更多 →
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/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练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/9 6:17:20 阅读更多 →