ClkLog埋点分析系统数据迁移实战:拆解思路与踩坑指南
干过埋点分析系统的人大都有过这种经历业务数据攒了大半年平台要从测试环境迁到正式环境或者因为机房切换、私有化部署要求需要把整套ClkLog搬过去。ClkLog如今是不少团队在用的埋点分析系统平时跑报表很稳真到数据迁移这一步踩坑的人却不少。我前前后后做过几次ClkLog的迁移从单机几千行到集群上亿行都玩过这篇就围绕“ClkLog埋点分析系统支持数据迁移”这件事把实际操作中的拆解思路、执行流程和坑位整理出来给正在做迁移、或者准备做迁移的朋友一个参考。不管你是后端、数仓工程师还是负责数据平台的产品或运维这篇都适用。1. 迁移的整体思路先拆数据再谈工具1.1 为什么ClkLog的数据迁移不能一锅端先把ClkLog的数据组成讲清楚。埋点系统的核心是围绕事件日志做分析但存储在系统里的数据远不止事件日志本身。在我接触的ClkLog私有化部署里至少有三类数据。第一类是配置和元数据比如项目信息、事件定义、事件属性、用户属性、看板报表配置。这部分通常量不大但关系复杂一旦丢失或者ID对不上前端报表直接花掉。第二类是行为明细数据也就是事件表通常落在ClickHouse这类列式存储里按事件名、时间、用户ID等字段展开特点是单行小、总量大、按天增长。第三类是持续变化的状态比如用户的最后活跃时间、事件的首次上报时间、自动生成的自增ID、后台异步任务的批次记录等这部分最容易被忽略。如果直接把存储目录打包拷过去第一类数据里的自增ID会因为插入顺序不同发生变化第二类数据里的分区如果没按目标端的MergeTree配置落地查询时物化视图可能全部失效。所以我的第一个建议是不要试图用文件拷贝的方式做整库迁移而是把它拆成元数据、行为明细、持续状态三块分别制定策略。1.2 迁移前先明确你搬的到底是什么很多人一看支持数据迁移就以为有个一键导出导入按钮实际用下来ClkLog的数据迁移更像是在三个系统之间协同搬东西。MySQL里的配置库负责保存事件字典和报表配置ClickHouse里的分析库负责存储明细数据有时还会有对象存储或本地磁盘上的文件比如埋点SDK上报的原始日志包。这不是一个单体的“数据库搬家”而是一个多组件的数据搬迁。元数据迁移的难点在于一致性必须保证先导入父表、再导入子表外键关系不断。明细数据迁移的难点在于规模几百GB甚至上TB的数据靠一条insert select根本跑不完需要分片分批。持续状态迁移的难点在于连续性比如自增主键已经到哪个位置了迁移后新的上报事件会不会和旧数据的主键冲突。简单打个比方整套ClkLog就像一套房子元数据是装修图纸明细数据是所有家具家电持续状态是水电燃气的读数。搬家时图纸要先对照清楚家具要分类打包读数要记录最后才能复原成一个能正常住的房子。1.3 全量、增量、双写三种迁移方案怎么选根据停服时间和数据量的不同我一般会在三个方案里选。停机全量适合可接受数小时停服、数据总量不大的场景逻辑最简单结果最可控但停服时间长。全量加增量回放适合体量大、但可以安排停机窗口的场景全量一次性搬完增量小最受我偏爱。双写加切换适合体量大且几乎不能停服的场景平滑切换、风险低但双写期间两端数据一致性难保证。方案适用场景优点缺点停机全量可接受数小时停服数据总量不大逻辑简单、结果最可控停服时间长全量增量回放体量大但可以安排停机窗口全量一次性搬完增量小要设计校验点双写切换体量大且几乎不能停服平滑切换、风险低双写期两端数据一致性难保证我在实际项目里最常用的是全量加增量回放。先用一个凌晨窗口做全量迁移然后在迁完的瞬间记录一个日志位点等待业务侧停写后再把漏掉的那一小段增量补进去。这个方案对新人最友好出问题可以倒回源端重来纯靠脚本就能完成。2. 迁移前的准备工作环境核对比工具更重要2.1 源端和目标端的版本先对齐这是一个老生常谈但总有人犯的错。ClkLog升级过版本对应的MySQL表结构、ClickHouse的字典表、物化视图定义都可能变。如果源端是ClkLog 1.x目标端直接装了一个2.x迁移后你打开事件列表页面大概率发现一部分事件显示不出来。这不是数据丢了而是新版配置表里的字段含义变了。我通常把版本核对放在第一步有四个东西必须一致。ClkLog应用版本要尽量大版本一致小版本最好一致MySQL版本至少主版本一致避免字符集和排序规则冲突ClickHouse版本要在迁移物化视图时保持兼容版本不一致会导致语法解析失败JVM运行环境也要对齐Java应用版本、启动参数中的堆内存设置都会影响迁移后的稳定性。对象核对点ClkLog应用版本大版本尽量一致小版本最好一致MySQL版本至少主版本一致避免字符集和排序规则冲突ClickHouse版本迁移物化视图时版本不一致会导致语法解析失败JVM/运行环境Java应用版本、启动参数中的堆内存设置如果版本确实不一致建议先在目标环境跑一个最小数据集确认报表链路能通再做全量。不要拿生产数据去测试版本兼容性。我有一次就是偷懒没核对结果发现ClickHouse的小版本从21.x跨到23.x原先的物化视图语法直接不支持花了一整天才修回来。2.2 数据量评估与磁盘规划先算后搬动手前先搞清楚源端有多少数据。通常用ClkLog管理后台能看到存储占用但更准确的办法是直接查底层库。比如在ClickHouse里跑这样一条SQLSELECT toDate(event_time) AS d, count() AS events, uniqExact(user_id) AS users FROM event_table GROUP BY d ORDER BY d DESC LIMIT 30;通过这个结果你能知道每天新增事件量、活跃用户量再乘上单行字段数就能估算出目标端需要的磁盘。我的经验值是预留目标端磁盘至少为源端数据量的1.3倍因为迁移过程中会有临时文件、导入副本和校验表。另外要估算带宽。假设你有500GB的事件明细要在4小时窗口内迁完网络传输速度至少得达到500GB除以4小时再除以3600秒约等于35MB/s。如果目标是云上服务器机器带宽只有10Mbps那就得提前改方案改成增量长期同步或者直接在源端计算好压缩包再传到目标端解压。2.3 停服窗口与任务编排ClkLog是实时分析系统灾备迁移最好选在业务低峰比如凌晨2点到7点。但这个窗口不能拍脑袋定要结合两个因素。一是上游数据上报的节奏如果你们有海外用户凌晨同样是高峰这时候强制停服数据堆积到Kafka里恢复后要补偿很久。二是下游报表的使用时间运营和数据分析师通常在早上上班前看日报所以窗口结束前要留出至少30分钟做校验和快速冒烟测试。我在执行的时候会把任务拆成三步。第一步在迁移开始前10分钟停掉ClkLog的写入任务但要保持数据源端只读第二步依次迁移元数据、明细数据、增量补数第三步开启目标端同时保持源端可切换。每个步骤之间加一个sleep等待便于检查日志。2.4 权限与账号宁可少给不要乱给在源端给迁移账号只读权限目标端给单独的迁移账号不要直接用应用账号。目标端的迁移账号可以给写权限但严禁在迁移过程中给业务报表发流量。很多坑都是因为有人看到目标端已经有数据了就着急连看板结果把还没完整导入的分区查了个空数误导了校验。还要记住一个细节迁移前关闭目标端ClkLog后台的定时任务比如自动清理过期数据的TTL任务、周期合并分区任务、报表缓存刷新任务。这些任务会在你导入数据的时候偷偷改数据结构或删数据让校验结果变得一团糟。3. 核心环节ClkLog数据迁移的实操拆解3.1 第一步先搬元数据别急着碰行为明细元数据是整个迁移的地基一定要最先处理。以最常见的部署为例ClkLog的配置数据多半在MySQL库里里面包含project、event、property、dashboard、user_group这些表。导出命令我习惯用mysqldump关键参数是mysqldump -h源库 -u迁移账号 -p --single-transaction --set-gtid-purgedOFF --default-character-setutf8mb4 clklog_config clklog_config.sql加上--single-transaction是为了保证导出时数据一致性不锁表--set-gtid-purgedOFF是为了避免目标库没有相同GTID导致复制不了。导出结束后先在目标库把ClkLog应用停掉再执行mysql -h目标库 -u迁移账号 -p clklog_config clklog_config.sql这里的顺序很重要。导出的SQL里如果包含建库语句你必须确认目标库名和源库名一致否则后边的应用配置会连不上如果不一致要么改SQL里的库名要么提前在目标库建好同名库再导入。另外导入之前先把外键检查关掉等全部导入完再恢复可以省去父表和子表顺序颠倒导致的报错。3.2 第二步事件明细数据按天分批迁移大头的行为明细我建议按天做批量搬运。为什么按天因为ClkLog的事件表通常用日期做分区按天迁移不仅断点清晰还能方便后续校验和补数。如果在同机房内网可以考虑用ClickHouse的remote函数一条SQL就能把源端指定日期的数据塞到目标端INSERT INTO target_clklog.event_table SELECT * FROM remote(源端ClickHouse地址, source_clklog.event_table, 迁移账号, 密码) WHERE event_date 2024-06-01;不过这种写法只适合数据量小的场景。上亿级事件一次SELECT会把源端内存打满还会让目标端写入堆积。所以我更推荐把数据拆成“日期加事件名”的小块用脚本循环执行比如这样一个简化版的Shell脚本for d in 2024-06-01 2024-06-02 2024-06-03; do for e in page_view button_click login; do clickhouse-client --queryINSERT INTO target.event_table SELECT * FROM source.event_table WHERE event_date$d AND event_name$e done done这段脚本只是示例真实场景里事件不止三个日期也会有几十天直接用循环会很慢。我更倾向于把任务生成成一份清单每一行是一条分区迁移任务用一个线程池控制并行度在2到3个任务避免目标端写入过载。导入时注意导入前先CHECK TABLE确认目标表结构和源表字段顺序完全一致特别是Nullable字段和默认值。字段顺序不一致会在INSERT SELECT时发生错位造成事件属性张冠李戴这种问题校验时很难发现。3.3 第三步别落下用户属性与字典数据事件明细迁完之后用户画像、用户属性表也需要处理。ClkLog的用户属性不是固定在列上而是“事件加属性名加属性值”的字典结构所以先要把属性字典表保证ID对应再迁移具体的用户标签数据。我犯过一次错先迁了用户属性表没迁字典表结果报表页面上所有用户属性都变成了一串数字ID下拉框显示的标签名字全部为空。这是因为字典表里的属性ID和明细表里的属性ID没有对上。所以顺序一定要是项目表、事件表、属性字典表、用户属性表、报表配置表。如果源端的用户属性表也是ClickHouse表可以按用户ID哈希分片导出比如把用户ID后四位为00的、01的分别导出每个分片一个小文件最后再批量导入目标端。这样做的好处是单文件小、出错可重跑而且不会因为一个坏文件挂掉整批数据。3.4 第四步数据校验与补数脚本很多人迁完数据看到表行数一致就认为大功告成实际上行数一致可能掩盖了字段错位、属性丢失、用户重复的问题。我至少会做四层校验校验层校验SQL/方法目的总量对比源和目标event_table的count(*)防止大范围缺失分日按event_date分组对比每天count定位缺失分区分事件按event_name分组对比count检查事件类型缺失抽样抽3到5条明细对比user_id、event_time、完整属性防止字段错位一个可以落地的做法是写一条如下SQL分别跑在源端和目标端SELECT event_date, event_name, count() AS cnt, uniqExact(user_id) AS uv FROM event_table WHERE event_date 2024-06-01 AND event_date 2024-06-30 GROUP BY event_date, event_name ORDER BY event_date, event_name;把结果都导出成CSV用diff或者Excel比对。遇到数量不一致的日期和事件重新执行那一块的迁移脚本就可以不需要全量重来。这就是按天切分的好处。4. 常见问题与排查技巧实录4.1 迁移后报表日期差了8小时优先查时区我碰到过很多次类似反馈事件明细迁过去了总数也对上了但看板今天只显示昨天一半的量时间线上像是被切了一截。最后排查下来都是时区问题。ClkLog前端传给后端的时间通常是毫秒时间戳或ISO字符串数据库存储用的是UTC展示层再转成北京时间。如果源端表里存的是已经转过的东八区时间目标端又按UTC理解日期分区就会整体偏移8小时。遇到这种情况先不要急着再导一遍数据。取一条事件对比源端和目标端在数据库里看到的时间字段判断是差8小时、差一天的边界值还是没有差。如果差8小时可以把目标端的时间字段先批量加回8小时再更新分区字段。当然最稳妥的做法是在迁移脚本里统一约定时间字段全部存毫秒级时间戳只有分区字段才用格式化后的日期。4.2 事件ID和属性ID对应关系错位这个问题通常藏得很深。ClkLog元数据表里的ID是自增的源端A事件的ID是101目标端如果重新导入时自增计数器从1开始A事件就可能变成1而事件明细表里存的还是源端的101报表页面事件名就会全部错乱。解决方案并不复杂。mysqldump导出时把INSERT语句里的自增ID原样保留导入前把目标表的外键检查和自增重置关掉。如果确实更换了ID就一定要建立新旧ID的映射表并把明细表里的相关ID同步替换。我在脚本里会额外生成一张mapping表记录source_event_id和target_event_id迁移完成后跑一遍关联校验能快速找出没有匹配上的记录。4.3 迁移速度慢、任务中断怎么办大表迁移最常见的现象是跑到一半网络断开ClickHouse的写入连接超时然后就停在那一块。我最初用一次性INSERT SELECT迁一天的数据结果一天几亿条跑了40分钟也没跑完最后连接断了全功尽弃。后来改成“事件名加用户ID哈希”的拆分后每个任务只处理几十万到几百万条断在哪个任务就从哪个任务续跑速度反而快了很多。另外可以调整目标端ClickHouse的写入参数比如把max_insert_threads设置为16提升并行写入能力设置max_execution_time为0避免语句执行超时设置flush_interval_ms为5000让批量刷盘更平滑。但也别太贪并行开到8以上时CPU和磁盘IO会先打满反噬导入速度。4.4 增量与全量的衔接最后5分钟最容易出错如果采用全量加增量回放方式全量迁完不等于结束还要做增量补数。我通常会在源端记录一个迁移起始位点比如MySQL的binlog文件和position或者事件表里最大的event_time然后等业务侧停写后把该位点之后新增的数据单独导出导入。这个步骤最考验心细因为很多人会忘记把增量数据里的自增ID和全量数据保持一致或者漏了某个来源的埋点数据。我个人建议增量补数不要用UPDATE而要用INSERT并配合PRIMARY KEY或去重逻辑。ClkLog的明细表一般会以event_id或union_id加event_time做去重键增量的数据如果和全量有重叠重复插入会被去重逻辑吞掉不会造成行数虚增。如果表没有去重键就最好在迁移时先建一张带ReplacingMergeTree的表导入完再换成原始表结构这样能省很多麻烦。5. 一点经验之谈5.1 给准备迁移的人三条建议几次迁移做下来我最大的体会是迁移工具远没有迁移流程重要。ClkLog支持数据迁移但它不是把几个文件拖过去就结束的事。花半天时间在环境核对、拆任务、写校验脚本上反而比直接导数据快得多。第一条建议把校验脚本当成正式交付物迁移前就写好在源端和目标端运行的SQL不要临时抱佛脚。第二条建议改任何表结构或ID映射时先做一次小规模演练避免在几十亿数据上试错。第三条建议迁移窗口结束后不要立刻通知所有人“已完成”先让核心报表跑一遍手工点开两个看板确认事件名、用户属性、时间范围都正常。5.2 最后再留一次后路迁移结束后不要把源端环境立刻删除至少保留三天。很多问题是在第二天跑报表时才暴露出来的比如某个渠道的埋点事件有延迟迁移时还没产出等补偿数据生成后你还需要再补一次。有源端在这几分钟就能查到差的是哪一条。如果后续还有机会我会把增量同步和双写切换的细节再单独整理一篇。这次先把全量迁移的主链路讲清楚希望正在踩ClkLog数据迁移坑的你能少走一点弯路。

相关新闻

Flowable 6.7.2建表脚本详解:MySQL与Oracle初始化避坑指南

Flowable 6.7.2建表脚本详解:MySQL与Oracle初始化避坑指南

简介:面向Flowable工作流引擎的MySQL与Oracle数据库建表脚本包,针对6.7.2版本量身定制,解决部署时手工建表易缺漏、结构不统一的问题,同时兼顾两种主流数据库的语法差异,适合需要快速初始化流程引擎环境的Java开发人员…

2026/10/12 7:53:33 阅读更多 →
Artcraft:数字创作中意图、过程与物理现实的闭环工作流

Artcraft:数字创作中意图、过程与物理现实的闭环工作流

1. “Artcraft”不是新词,而是被低估的创作范式重构信号最近在多个设计协作平台、开源创意工具社区和跨学科工作坊里,“artcraft”这个词高频出现,但几乎没人给它下过准确定义。它不像“generative design”或“creative coding”那样有明确的…

2026/10/12 7:53:33 阅读更多 →
AnyPS5串流方案全解析:从原理到实操,实现PS5远程低延迟游玩

AnyPS5串流方案全解析:从原理到实操,实现PS5远程低延迟游玩

1. 从“AnyPS5”这个标题说起:它到底想解决什么问题第一次看到“AnyPS5”这个标题,我脑子里蹦出来的第一个念头是:这大概率是一个围绕“跨平台串流”或者“远程访问”做文章的项目。为什么这么判断?因为“Any”这个前缀在技术圈里…

2026/10/12 7:53:33 阅读更多 →

最新新闻

基于模型压缩的识别算法Python源码:蒸馏与剪枝实战

基于模型压缩的识别算法Python源码:蒸馏与剪枝实战

简介:这份资源是面向高校毕业设计与深度学习入门者的模型压缩识别算法Python源码包,聚焦知识蒸馏与剪枝两类主流压缩技术,帮助读者在有限算力下完成识别模型的轻量化改造与对比实验。包内共185个文件,以79个py源码为核心&#xff…

2026/10/12 10:02:52 阅读更多 →
小波神经网络在光伏辐照预测中的工程落地实践

小波神经网络在光伏辐照预测中的工程落地实践

简介:本资源是一篇发表于《可再生能源》期刊的学术论文,面向新能源、电力系统、人工智能交叉领域的研究者与工程技术人员,聚焦太阳能发电中关键的超短期辐照强度预测难题。论文提出一种融合小波分析与神经网络优势的WNN模型,针对春…

2026/10/12 10:02:52 阅读更多 →
数学证明的事件化记录:构建可追溯、可验证的AI推理过程

数学证明的事件化记录:构建可追溯、可验证的AI推理过程

1. 这不是“AI写证明”,而是让数学推理过程真正可追溯、可验证、可复盘的底层重构“事件模型下AI数学证明的事件化记录与透明性架构”——这个标题里没有一个字是虚的,它直指当前AI数学推理系统最痛的软肋:我们能看到结论,却看不见…

2026/10/12 10:02:52 阅读更多 →
轻型AI中台:解决中小企业重复录入与对账困难的工程化方案

轻型AI中台:解决中小企业重复录入与对账困难的工程化方案

1. 项目概述:为什么一个“轻型AI中台”能真正解决财务与运营一线的痛感“部署轻型AI中台,消除重复录入、消减对账困难”——这句话不是PPT里的口号,而是我去年在三家中小制造企业、两家连锁零售服务商现场蹲点三个月后,亲手推出来…

2026/10/12 10:02:52 阅读更多 →
Hive外部表映射HBase已有数据实战指南

Hive外部表映射HBase已有数据实战指南

1. 项目概述:为什么非得用 Hive 外部表去“看” HBase 已有数据? 在某次数据平台升级中,我接手了一个典型的老系统迁移任务:上游业务系统多年积累的用户行为日志,早已稳定写入 HBase 集群,表名 user_acti…

2026/10/12 10:02:52 阅读更多 →
three.js编辑器开发实战:从渲染循环到撤销重做的完整指南

three.js编辑器开发实战:从渲染循环到撤销重做的完整指南

1. 为什么我不建议你从零手写渲染循环很多人第一次接触 three.js 编辑器开发,脑子里蹦出来的第一个念头是"我要自己写一套渲染管线"。这个想法本身没错,但如果你真的从requestAnimationFrame开始一行行搭,大概率会在第三天卡在&quo…

2026/10/12 10:01:51 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 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/11 10:45:37 阅读更多 →
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/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练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/11 14:36:54 阅读更多 →