ESP-IDF前端工具idf.py:从CMake到Ninja的构建链路拆解与TaoToken接入实践
1. idf.py 构建链路到底在做什么ESP32 项目 CMake 与 Ninja 协作全流程很多人第一次接触 ESP-IDF是在 VS Code 里点那几个小按钮Build、Flash、Monitor。点完之后终端刷出一堆日志最后告诉你Project build complete。但如果你问一句「这几个按钮背后到底跑了什么」答案就是idf.py。idf.py是 ESP-IDF 提供的一个 Python 命令行前端工具它本身不编译代码而是把 CMake、Ninja、esptool.py 这几个工具串成一条流水线。你可以把它理解成一个「包工头」CMake 负责画图纸生成构建规则Ninja 负责按图纸施工真正调用编译器esptool.py 负责把成品运到芯片里烧录。idf.py的工作就是决定什么时候叫谁上场、传什么参数。这条链路对 ESP32 开发者来说非常关键因为本地构建慢、组件依赖拉取不稳、build目录莫名其妙报错绝大多数问题都出在这条链路的某个环节上。搞懂它你才能定位卡点而不是每次都idf.py fullclean一把梭。先看一次完整构建里发生了什么。当你在工程根目录也就是有顶层CMakeLists.txt的那个目录执行idf.py build大致经历这几个阶段第一阶段idf.py检查build目录是否存在。不存在就创建默认路径是工程根目录下的build/你可以用-B参数改。这个目录里会放 CMake 的缓存、Ninja 的构建文件、编译产物.obj、最终固件.bin。第二阶段idf.py调用 CMake 做配置configure。CMake 读取顶层CMakeLists.txt再顺着EXTRA_COMPONENT_DIRS、COMPONENTS等变量去收集组件生成build/CMakeCache.txt和 Ninja 需要的build.ninja。这一步如果组件下载不下来就会卡在这里。第三阶段idf.py调用 Ninja 执行真正的编译。Ninja 读取build.ninja按依赖关系并行调用xtensa-esp32-elf-gcc或riscv32-esp-elf-gcc编译每个源文件最后链接出project.elf再转成project.bin。第四阶段如果你执行的是idf.py flashidf.py会在构建完成后调用 esptool.py把 bootloader、分区表、应用固件按地址烧进芯片。这里有个容易被忽略的点idf.py build是增量的。如果源文件和配置都没变Ninja 会发现没有需要重建的目标直接跳过。所以你看到「什么都没干就结束了」是正常的不是工具坏了。再说set-target。执行idf.py set-target esp32s3时它做的事情等价于先idf.py fullclean清掉构建目录再把旧的sdkconfig备份成sdkconfig.old然后用新的IDF_TARGET重新配置。这就是为什么切换芯片后第一次构建总是特别慢——所有东西都要重新编译。理解这条链路之后你就能明白构建慢可能是 Ninja 并行度不够或组件太多依赖拉取不稳是 CMake 配置阶段在访问组件仓库报错找不到build.ninja是 CMake 配置阶段失败了。接下来我们看怎么把组件下载这条链路接到一个更稳的通道上。2. TaoToken 前置准备把组件下载 endpoint 接到稳定通道在动手改配置之前先说清楚我们要解决什么问题。ESP-IDF 在 CMake 配置阶段会去拉取组件依赖。默认情况下这些请求走的是公共网络遇到网络波动就会卡住、超时甚至报出Failed to fetch component之类的错误。我们要做的是把组件下载相关的 endpoint 指向 TaoToken 提供的通道让拉取过程更稳定。TaoToken 在这里扮演的是一个统一的接入入口。它提供兼容的 API 地址你只需要把 Base URL 换成 TaoToken 的地址再配上自己的 Key就能让工具链的请求走这条通道。官网地址是https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentAPI 地址是https://taotoken.net/api这个不加 UTM 参数。你需要先拿到两样东西一个是 API Key一个是确认要用的 Model ID。Key 在控制台的 API Keys 页面生成地址是https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite。生成之后复制保存后面配置里要用。这里要强调一个原则Base URL、Key、Model ID 这三件套必须成套出现。只改 Base URL 不填 Key请求会返回 401Key 填错或过期同样是 401Model ID 写错可能报reading choices之类的解析错误。所以下面每一处配置我都会把三个值一起写出来。对于 ESP-IDF 的组件拉取场景我们主要关注的是 CMake 配置阶段用到的下载地址。ESP-IDF 的组件管理器IDF Component Manager支持通过环境变量或配置文件指定 registry 地址。你可以通过设置IDF_COMPONENT_REGISTRY_URL环境变量把组件注册表指向 TaoToken 的接入地址。在 Linux 或 macOS 下你可以在~/.bashrc或~/.zshrc里加一行export IDF_COMPONENT_REGISTRY_URLhttps://taotoken.net/api export TAOTOKEN_API_KEY你的Key在 Windows 的 PowerShell 里$env:IDF_COMPONENT_REGISTRY_URL https://taotoken.net/api $env:TAOTOKEN_API_KEY 你的Key设置完之后重新打开一个终端或者source一下配置文件让环境变量生效。你可以用echo $IDF_COMPONENT_REGISTRY_URL确认一下。如果你不想改全局环境变量也可以在工程级别配置。在工程根目录创建一个idf_component.yml或者在已有的里面加上 registry 相关字段。不过要注意不同 ESP-IDF 版本对字段名的支持略有差异建议先确认你的版本。用idf.py --version可以看到当前版本。还有一个更通用的做法在工程的CMakeLists.txt里通过set()设置 CMake 变量把下载相关的地址传进去。这种方式的好处是跟着工程走换机器不用重新配环境。具体片段在下一节给出。需要提醒的是TaoToken 的接入是为了让依赖拉取和模型调用更稳定它不是用来替代 ESP-IDF 本身的构建工具的。CMake 和 Ninja 该干的活还是它们干TaoToken 只是把其中涉及网络请求的那部分通道换掉。这个边界要清楚不然配置方向就错了。拿到 Key 之后建议先做一次最小验证确认通道是通的再去改工程配置。验证方法在第四节这里先把配置准备好。3. 可复制配置CMake、Ninja 与 settings 片段这一节给出可以直接复制粘贴的配置片段。我会分三块CMake 配置、Ninja 相关设置、以及一个 JSON 格式的 settings 片段。每一块都写清楚路径和原文你照着放就行。先说 CMake 配置。在工程根目录的CMakeLists.txt里include($ENV{IDF_PATH}/tools/cmake/project.cmake)这一行之前加入下面这段。它的作用是把组件下载相关的地址指向 TaoToken同时把 Key 通过环境变量传进去。# 组件下载通道配置 set(COMPONENT_REGISTRY_URL https://taotoken.net/api CACHE STRING Component registry endpoint) set(TAOTOKEN_API_KEY $ENV{TAOTOKEN_API_KEY} CACHE STRING TaoToken API Key) # 传递给组件管理器 if(DEFINED ENV{IDF_COMPONENT_REGISTRY_URL}) message(STATUS Using registry: $ENV{IDF_COMPONENT_REGISTRY_URL}) endif()注意TAOTOKEN_API_KEY这里是从环境变量读的所以你要先按上一节的方法把环境变量设好。如果你想把 Key 直接写在工程里不推荐尤其是要提交到代码仓库时可以把$ENV{TAOTOKEN_API_KEY}换成字符串但一定要确保这个文件不被提交。再说 Ninja 相关设置。Ninja 本身不涉及网络请求它只管编译。但构建慢的时候调整 Ninja 的并行度能明显提速。你可以在idf.py build时通过-j参数指定并行任务数idf.py build -j 8或者在 CMake 里设置默认并行度。在CMakeLists.txt里加set(CMAKE_BUILD_PARALLEL_LEVEL 8 CACHE STRING Ninja parallel jobs)这个值建议设成你 CPU 核心数的 1 到 1.5 倍。设太大反而会因为内存争抢变慢。我一般用nprocLinux或sysctl -n hw.ncpumacOS看一下核心数然后取个接近的值。如果你用的是 GNU Make 而不是 Ninja可以用-G Unix Makefiles显式指定但 ESP-IDF 默认推荐 Ninja速度更快。确认当前用的是哪个构建工具看build/目录下是build.ninja还是Makefile就知道了。接下来是 JSON 格式的 settings 片段。这个主要用于一些支持 JSON 配置的工具比如某些编辑器插件或 CLI 工具。路径一般放在工程根目录的.taotoken/settings.json或者你工具的配置目录下。内容如下{ base_url: https://taotoken.net/api, api_key: 你的Key, model_id: 你的ModelID, registry_url: https://taotoken.net/api, timeout_seconds: 60, retry_times: 3 }这里base_url、api_key、model_id就是前面说的三件套必须都填。registry_url是组件下载用的地址。timeout_seconds和retry_times是超时和重试设置网络不稳的时候把重试调大一点有用。如果你用的是 Claude Code 这类工具做代码辅助配置方式类似但字段名可能不同。Claude Code 的配置一般在~/.claude/settings.json或工程级的.claude/settings.json。核心还是那三件套Base URL 填https://taotoken.net/apiKey 填你的 KeyModel ID 填你要用的模型。具体可以参考接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite。配置放好之后不要急着构建。先做一次配置阶段的验证确认 CMake 能读到这些值。执行idf.py reconfigure这个命令只跑 CMake 配置不跑编译。如果配置阶段就报错你能更快定位问题。看到Configuring done和Generating done就说明配置通过了。4. 验证请求与成功结果确认通道生效配置改完最关键的一步是验证。很多人改完配置直接idf.py build结果报错了也不知道是配置没生效还是别的问题。所以我们要分层验证先验证环境变量再验证 CMake 读取最后验证实际请求。第一步验证环境变量。在终端执行echo $IDF_COMPONENT_REGISTRY_URL echo $TAOTOKEN_API_KEY第一个应该输出https://taotoken.net/api第二个应该输出你的 Key注意别在公开场合贴出来。如果第一个是空的说明环境变量没生效检查一下是不是忘了source或者开的新终端。第二步验证 CMake 读取。执行idf.py reconfigure在输出里找有没有Using registry:这一行。如果有说明 CMake 读到了环境变量。如果没有检查CMakeLists.txt里的message(STATUS ...)是不是加在了正确的位置。第三步验证实际请求。这一步我们用一个最小的模型对话请求来确认通道是通的。TaoToken 提供了模型对话入口地址是https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite。你可以用 curl 发一个请求curl -X POST https://taotoken.net/api/v1/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -d { model: 你的ModelID, messages: [{role: user, content: ping}] }如果返回里有choices字段说明通道通了。如果返回 401说明 Key 不对如果返回reading choices相关错误说明 Model ID 不对如果连接超时说明网络或地址有问题。第四步回到 ESP-IDF 构建。执行一次完整的idf.py build观察 CMake 配置阶段有没有组件拉取失败。如果之前卡在拉取组件的地方现在顺利通过了说明通道生效了。构建完成后你会看到类似这样的输出Project build complete. To flash, run: idf.py flash到这里通道验证就完成了。整个过程的核心就是环境变量 → CMake 读取 → 实际请求 → 构建通过一层层确认。如果你用的是 Coding Plan 做长期编码辅助验证方式类似入口在https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite。配置好之后同样先用一个小请求确认通道再放到实际工作流里用。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth这一节把最常见的几类报错列出来对照着排查。这些错误我在实际配置里都遇到过下面写清楚现象、原因和解法。先说 401。现象是请求返回401 Unauthorized或者构建日志里出现authentication failed。原因基本就三个Key 没填、Key 填错、Key 过期。排查方法是先echo $TAOTOKEN_API_KEY确认环境变量有值再用 curl 单独测一次。如果 curl 也 401那就是 Key 本身的问题去控制台重新生成一个。注意 Key 复制的时候不要带多余空格有时候从网页复制会带上换行。再说local proxy failed。这个错误通常出现在你本地配了某种转发规则但规则没生效或者端口不对。现象是请求发不出去日志里提示连接本地某个端口失败。排查方法是检查你的环境变量里有没有HTTP_PROXY、HTTPS_PROXY这类设置如果有确认它们指向的地址和端口是通的。如果你不需要转发就把这些变量清掉unset HTTP_PROXY unset HTTPS_PROXY然后是reading choices。这个错误一般出现在返回结果解析阶段提示读取choices字段失败。原因通常是 Model ID 写错了或者返回的不是预期的 JSON 结构。排查方法是先用 curl 看原始返回确认里面有choices字段。如果没有检查 Model ID 是不是拼错了。Model ID 要和你实际可用的模型一致不能随便写。最后是 OAuth 相关错误。如果你用的是 Claude Code 这类工具可能会遇到 OAuth 认证失败。现象是提示 token 无效或认证过期。原因是这类工具可能默认走 OAuth 流程而你配置的是 API Key 方式。解法是确认工具的认证方式设置把它切到 API Key 模式然后填上 Base URL、Key、Model ID 三件套。Claude Code 的接入可以参考https://taotoken.net/claude-code-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaude_codeutm_campaignrewrite。除了这四类还有一个常见的是构建目录损坏。现象是idf.py build报找不到build.ninja或者 CMake 缓存冲突。解法是idf.py fullclean清掉重建。注意这个命令会递归删除build/下所有文件但保留工程配置用之前确认一下没有手动放进build/的重要文件。排查的时候有个通用思路先分层再定位。环境变量层、CMake 配置层、网络请求层、编译层一层层确认。不要一上来就 fullclean那样会把现场破坏掉反而不好定位。6. 语义一致 CTA把通道用起来配置和验证都做完之后你就可以把这条通道用到日常开发里了。组件拉取稳定之后idf.py build卡在配置阶段的情况会明显减少尤其是团队协作或者换机器的时候不用每次都担心依赖拉不下来。如果你主要做模型对话类的调试可以走模型对话入口https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite。如果你做长期编码辅助或者 Agent 相关的工作Coding Plan 更合适https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite。Key 的管理在控制台https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite。接入细节看文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite。最后分享一个实用技巧把环境变量配置写成一个脚本放在工程根目录比如setup_env.sh每次开新终端先source一下。这样换机器或者多人协作时配置不会丢。脚本内容就是前面那两行export记得把 Key 用占位符真正的 Key 放在本地不提交的文件里。构建链路这东西理解一次就能一直用。idf.py 把 CMake、Ninja、esptool.py 串起来你只要知道每一环在干什么卡住的时候就知道该看哪里。通道配置只是其中一环但往往是最影响体验的一环。

相关新闻

应用工程师的核心能力:从芯片参数到产线稳定的工程直觉

应用工程师的核心能力:从芯片参数到产线稳定的工程直觉

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

2026/10/19 1:05:11 阅读更多 →
LED散热设计四维法则:结构、材料、仿真与成本协同优化

LED散热设计四维法则:结构、材料、仿真与成本协同优化

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

2026/10/19 1:04:11 阅读更多 →
FlyThings OS:嵌入式GUI作为专用运行时环境的三层架构解析

FlyThings OS:嵌入式GUI作为专用运行时环境的三层架构解析

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

2026/10/19 1:04:11 阅读更多 →

最新新闻

RAM盘与DISK盘真实性能对比测试方法

RAM盘与DISK盘真实性能对比测试方法

1. 项目概述:为什么一个“测速”动作值得花半天时间认真对待你有没有遇到过这样的情况:明明手里的固态硬盘标称读写速度是3500MB/s,但实际拷贝一个20GB的工程文件却要等三分钟?或者在做视频剪辑时,预览一帧要卡顿两秒&…

2026/10/19 1:33:18 阅读更多 →
AutoCAD圆弧开发的三大底层陷阱与鲁棒实现

AutoCAD圆弧开发的三大底层陷阱与鲁棒实现

1. 这个标题背后藏着的CAD开发真相:为什么“创建圆弧(4)”不是第四个例子,而是关键分水岭看到“2021-07-05 C#/CAD二次开发 创建圆弧(4)”这个标题,很多刚接触CAD开发的朋友第一反应是&#xff…

2026/10/19 1:33:18 阅读更多 →
为什么ShareGPT-4o被称为多模态训练“宝藏数据“?项目价值与核心亮点深度解析

为什么ShareGPT-4o被称为多模态训练“宝藏数据“?项目价值与核心亮点深度解析

【免费下载链接】ShareGPT-4o 项目地址: https://ai.gitcode.com/OpenGVLab/ShareGPT-4o 点击查看 免费下载 ShareGPT-4o 是由 OpenGVLab 开源的 多模态训练数据集(ShareGPT-4o-102K),收录了 10 万余条由 GPT-4o 生成的多轮图文对…

2026/10/19 1:33:18 阅读更多 →
OLYMPUS生化仪液面探测原理:电容+压力双模传感机制解析

OLYMPUS生化仪液面探测原理:电容+压力双模传感机制解析

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

2026/10/19 1:33:18 阅读更多 →
国产边缘AI芯片选型指南:十五款主流芯片拆解与避坑实操

国产边缘AI芯片选型指南:十五款主流芯片拆解与避坑实操

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

2026/10/19 1:33:18 阅读更多 →
一颗芯片搞定3.5A快充:宽压同步降压充电方案深度拆解

一颗芯片搞定3.5A快充:宽压同步降压充电方案深度拆解

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

2026/10/19 1:32:18 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 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/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于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/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 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/18 12:16:16 阅读更多 →