边缘AI系统端到端延迟预算分配模型:从传感器曝光到结果输出的时隙分解框架
边缘AI系统端到端延迟预算分配模型从传感器曝光到结果输出的时隙分解框架一、问题定义端到端延迟不是推理时间边缘 AI 系统的性能指标不是单点推理速度而是端到端延迟——从传感器曝光采集到结果输出执行器动作或决策下发的完整时间链路。一个目标检测系统的端到端延迟包含传感器曝光 → 数据传输 → 预处理 → 推理 → 后处理 → 结果下发六个环节串行执行总延迟是各环节之和。实测数据揭示了一个关键问题推理只占端到端延迟的 40%~60%。在 RK3588 目标检测系统中推理延迟 26ms但端到端延迟 62ms——推理之外的 36ms 占了 58% 的总延迟。这些非推理环节往往被忽视却是系统优化的盲区。本文建立端到端延迟的时隙分解框架将总延迟预算分配到六个环节每个环节有独立的优化策略和实测数据支撑。二、技术方案六个时隙的延迟分析与优化2.1 时隙 T1传感器曝光与采集5~33ms传感器曝光是端到端延迟的最大变量。CMOS 传感器的曝光时间由光照条件决定强光场景曝光 5ms1/200s正常场景曝光 15ms1/67s低光场景曝光 33ms1/30s30fps 下限曝光时间无法软件优化物理约束但可以优化采集时机策略一流水线曝光——推理上一帧时曝光下一帧/* 流水线采集架构曝光与推理并行含帧同步机制 */ #include pthread.h #include semaphore.h typedef struct { uint8_t *frame_data; int frame_id; int width, height; sem_t ready_sem; /* 帧就绪信号量 */ sem_t done_sem; /* 帧处理完成信号量 */ } frame_buffer_t; #define FRAME_POOL_SIZE 3 /* 三缓冲曝光/推理/后处理各占一个 */ static frame_buffer_t frame_pool[FRAME_POOL_SIZE]; /* 采集线程曝光完成后通知推理线程 */ void *capture_thread(void *arg) { int write_idx 0; while (1) { /* 等待上一个帧被推理线程释放 */ sem_wait(frame_pool[write_idx].done_sem); /* 执行曝光和DMA传输与推理线程并行 */ int ret camera_capture(frame_pool[write_idx].frame_data, frame_pool[write_idx].width, frame_pool[write_idx].height); if (ret ! 0) { fprintf(stderr, [ERROR] 摄像头采集失败, frame_id%d\n, frame_pool[write_idx].frame_id); continue; } frame_pool[write_idx].frame_id; /* 通知推理线程新帧就绪 */ sem_post(frame_pool[write_idx].ready_sem); write_idx (write_idx 1) % FRAME_POOL_SIZE; } return NULL; } /* 推理线程处理就绪帧 */ void *inference_thread(void *arg) { int read_idx 0; while (1) { /* 等待采集线程提供新帧 */ sem_wait(frame_pool[read_idx].ready_sem); /* 执行推理此时采集线程正在曝光下一帧 */ inference_result_t result run_inference(frame_pool[read_idx].frame_data); /* 执行后处理和结果下发 */ process_and_dispatch(result); /* 通知采集线程当前帧已释放 */ sem_post(frame_pool[read_idx].done_sem); read_idx (read_idx 1) % FRAME_POOL_SIZE; } return NULL; }流水线模式下曝光时间与推理时间并行而非串行端到端延迟从T_exposure T_inference变为max(T_exposure, T_inference)。实测数据串行模式T1(15ms) T4(26ms) 41ms流水线模式max(T1, T4) max(15ms, 26ms) 26ms1.58 倍延迟压缩推理成为瓶颈而非曝光2.2 时隙 T2数据传输1~5ms传感器到处理器的数据传输路径取决于硬件架构MIPI CSI-2摄像头到 SoCDMA 直传~1msSPI/I2C低速传感器到 MCU总线带宽限制35msUSB外部摄像头驱动开销23ms优化策略DMA 直传替代 CPU 拷贝/* DMA传输摄像头数据含超时与一致性处理 */ int camera_dma_transfer(uint8_t *src, uint8_t *dst, uint32_t size) { if (!src || !dst || size 0) { fprintf(stderr, [ERROR] DMA传输参数非法, size%u\n, size); return -1; } /* 启动DMA传输 */ HAL_StatusTypeDef status HAL_DMA_Start(hdma_mipi_csi, (uint32_t)src, (uint32_t)dst, size); if (status ! HAL_OK) { fprintf(stderr, [ERROR] DMA启动失败, status%d\n, status); /* 回退到CPU拷贝慢但可靠 */ memcpy(dst, src, size); return 1; /* 回退模式返回1 */ } /* 等待DMA完成超时3ms */ status HAL_DMA_PollForTransfer(hdma_mipi_csi, HAL_DMA_FULL_TRANSFER, 3); if (status HAL_TIMEOUT) { fprintf(stderr, [WARN] DMA传输超时, 回退到CPU拷贝\n); HAL_DMA_Abort(hdma_mipi_csi); memcpy(dst, src, size); return 1; } /* Cache一致性DMA写入的区域需要无效化D-Cache */ SCB_InvalidateDCache_by_Addr((uint32_t *)dst, size); return 0; /* DMA成功返回0 */ }实测对比RK3588640×480 RGB 图像921KBCPU memcpy~3.5msCPU 被占用无法并行推理DMA 直传~0.8msCPU 空闲可并行预处理4.4 倍传输加速 CPU 解耦2.3 时隙 T3预处理2~8ms预处理包含颜色空间转换、缩放、归一化、数据布局重排NHWC→NCHW。这些操作的计算量不大~50M OPS但内存访问密集逐像素遍历。优化策略NEON SIMD 加速预处理/* NEON加速RGB→BGRNormalize预处理含边界处理 */ #include arm_neon.h void preprocess_neon(const uint8_t *rgb, float *output, int pixel_count, float scale, float *mean) { if (!rgb || !output || pixel_count 0) { fprintf(stderr, [ERROR] 预处理参数非法, pixels%d\n, pixel_count); return; } /* NEON向量处理16像素一组 */ float32x4_t v_scale vdupq_n_f32(scale); float32x4_t v_mean_r vdupq_n_f32(mean[0]); float32x4_t v_mean_g vdupq_n_f32(mean[1]); float32x4_t v_mean_b vdupq_n_f32(mean[2]); int i 0; for (; i 15 pixel_count; i 16) { /* 加载16个RGB像素48字节 */ uint8x16x3_t rgb_batch vld3q_u8(rgb i * 3); /* R通道uint8→float32, 减均值, 乘缩放 */ uint16x8_t r_lo vmovl_u8(vget_low_u8(rgb_batch.val[0])); uint16x8_t r_hi vmovl_u8(vget_high_u8(rgb_batch.val[0])); float32x4_t r0 vmulq_f32(vsubq_f32(vcvtq_f32_u32(vmovl_u16(vget_low_u16(r_lo))), v_mean_r), v_scale); float32x4_t r1 vmulq_f32(vsubq_f32(vcvtq_f32_u32(vmovl_u16(vget_high_u16(r_lo))), v_mean_r), v_scale); float32x4_t r2 vmulq_f32(vsubq_f32(vcvtq_f32_u32(vmovl_u16(vget_low_u16(r_hi))), v_mean_r), v_scale); float32x4_t r3 vmulq_f32(vsubq_f32(vcvtq_f32_u32(vmovl_u16(vget_high_u16(r_hi))), v_mean_r), v_scale); /* 存储到outputBGR顺序通道连续 */ vst1q_f32(output i, r0); vst1q_f32(output i 4, r1); vst1q_f32(output i 8, r2); vst1q_f32(output i 12, r3); } /* 处理剩余像素NEON无法覆盖的尾部 */ for (; i pixel_count; i) { output[i] ((float)rgb[i * 3] - mean[0]) * scale; /* R→BGR[2] */ } }实测数据RK3588 A55640×480 图像CPU 逐像素预处理~6msNEON SIMD 预处理~2ms3 倍加速预处理从瓶颈变为非瓶颈2.4 时隙 T4推理15~50ms推理是端到端延迟的核心环节也是优化投入最大的环节。推理优化的具体方法已在前面文章算子→模型→引擎→系统四层金字塔中详述此处给出端到端视角下的推理预算分配原则推理预算 端到端目标延迟 × 50%如果端到端目标延迟是 50ms20fps推理预算 ≤ 25ms。超出 25ms 的推理会压缩其他环节的预算空间导致流水线断裂。推理预算内选模型的原则推理 ≤ 25ms → MobileNetV2-SSDLiteINT8RK3588 A55 ~26ms略超预算推理 ≤ 15ms → MobileNetV1-0.25INT8RK3588 A55 ~12ms推理 ≤ 50ms → YOLOv5sINT8RK3588 A55 ~40ms模型选择不是越大越好而是推理预算决定模型上限模型上限决定检测精度上限。这是一个三变量约束系统。2.5 时隙 T5后处理1~3ms后处理包含NMS非极大值抑制、边界框解码、置信度过滤。NMS 是最耗时的操作但计算量远小于推理。/* 简化NMS实现含排序和IoU计算 */ float compute_iou(const float *box_a, const float *box_b) { float x1 fmax(box_a[0], box_b[0]); float y1 fmax(box_a[1], box_b[1]); float x2 fmin(box_a[2], box_b[2]); float y2 fmin(box_a[3], box_b[3]); float intersection fmax(0.0f, x2 - x1) * fmax(0.0f, y2 - y1); float area_a (box_a[2] - box_a[0]) * (box_a[3] - box_a[1]); float area_b (box_b[2] - box_b[0]) * (box_b[3] - box_b[1]); if (area_a 0 || area_b 0) { fprintf(stderr, [WARN] 检测框面积异常: A%.0f, B%.0f\n, area_a, area_b); return 0.0f; } float union_area area_a area_b - intersection; return (union_area 0) ? intersection / union_area : 0.0f; }后处理的优化空间有限计算量小但有一个关键优化将 NMS 从 CPU 移到推理引擎内部执行。NCNN 支持在计算图中嵌入 NMS 算子推理后处理一次完成省掉 CPU 和引擎之间的数据搬运开销~0.5ms。2.6 时隙 T6结果下发0.5~2ms结果下发的方式决定了延迟本地执行器GPIO/UART~0.1ms直连CAN 总线~0.5ms帧发送时间网络下发UDP~1ms发包确认网络下发TCP~2ms发包ACK等待优化策略UDP 替代 TCP 用于实时结果下发实时控制场景不需要 TCP 的可靠传输——检测结果丢失一帧不会导致系统崩溃下一帧会覆盖。UDP 的无连接发送延迟仅 ~0.5ms比 TCP 的 ~2ms 快 4 倍。/* UDP实时结果下发含超时与重传策略 */ int send_result_udp(const inference_result_t *result, const char *dst_ip, int dst_port) { if (!result || !dst_ip) { fprintf(stderr, [ERROR] UDP下发参数非法\n); return -1; } struct sockaddr_in addr; addr.sin_family AF_INET; addr.sin_port htons(dst_port); inet_pton(AF_INET, dst_ip, addr.sin_addr); /* 序列化检测结果为二进制帧 */ uint8_t buf[256]; int buf_len serialize_result(result, buf, sizeof(buf)); if (buf_len 0) { fprintf(stderr, [ERROR] 检测结果序列化失败\n); return -2; } /* UDP发送无等待单次sendto */ int ret sendto(udp_sock, buf, buf_len, 0, (struct sockaddr *)addr, sizeof(addr)); if (ret 0) { fprintf(stderr, [WARN] UDP发送失败(errno%d), 不重传(实时优先)\n, errno); return 0; /* UDP不重传丢帧可容忍 */ } return ret; }三、数据验证端到端延迟预算分配与优化效果RK3588 目标检测系统640×480 RGBMobileNetV2-SSDLite INT8的端到端延迟分解串行模式基线时隙环节基线延迟(ms)优化后(ms)优化手段占比T1传感器曝光1515并行化消除流水线并行0%T2数据传输3.50.8DMA直传2%T3预处理62NEON SIMD5%T4推理2626已优化65%T5后处理21引擎内NMS2.5%T6结果下发20.5UDP1.3%总延迟—54.529.3流水线DMANEONUDP—流水线模式下 T1 与 T4 并行T1 的 15ms 被消除。端到端延迟从 54.5ms 降至29.3ms1.86 倍压缩。延迟预算分配原则端到端延迟预算 50ms20fps目标 分配 T1(曝光): 0ms流水线并行消除 T2(传输): ≤2msDMA直传 T3(预处理): ≤3msNEON加速 T4(推理): ≤40ms核心预算占80% T5(后处理): ≤2ms引擎内NMS T6(下发): ≤3msUDP容许丢帧 合计: 50ms推理预算 40ms 对应 YOLOv5s INT8~40ms或 MobileNetV2-SSDLite~26ms 余量。如果推理超预算端到端延迟超标帧率下降。不同场景的预算分配对比场景目标fps端到端预算推理预算适用模型工业检测30fps33ms≤20msMobileNetV1-0.5车载辅助20fps50ms≤40msYOLOv5s安防监控10fps100ms≤80msYOLOv5m无人机避障50fps20ms≤12msMobileNetV1-0.25四、工程实践端到端延迟优化的常见错误错误一只优化推理忽略流水线并行推理从 26ms 优化到 15ms但如果不做流水线并行端到端延迟仍然是 15150.8210.5 34.3ms。做了流水线并行后端到端延迟是 max(15ms曝光, 15ms推理) 0.8 2 1 0.5 19.3ms。流水线并行比推理优化更有效。错误二三缓冲不够导致流水线阻塞三缓冲曝光/推理/后处理确保每个环节独占一个帧缓冲区。如果只有双缓冲推理和曝光共享缓冲区推理未完成时曝光无法写入流水线阻塞。三缓冲是流水线并行运行的最低要求。错误三预处理和推理的数据搬运被忽视预处理输出在 AXI SRAM 中推理输入在 DTCM 中两者之间的数据搬运需要 DMA 或 CPU memcpy。如果这步搬运没有优化T2 和 T3 之间的 ~1ms 搬运开销会被遗漏在延迟预算中。解决方案将预处理输出直接写入推理输入的地址空间零拷贝。错误四UDP下发丢帧未处理UDP 不保证送达连续丢帧会导致执行器误动作。需要设计丢帧容忍策略连续丢帧 ≤2忽略使用上一帧结果连续丢帧 ≥3触发安全模式停止执行器等待恢复帧序号检测接收端检查帧序号连续性跳帧则使用上一帧/* 丢帧容忍策略含安全模式触发 */ void handle_frame_loss(int expected_id, int received_id) { int lost_frames received_id - expected_id; if (lost_frames 0) { /* 正常或重复帧 */ return; } if (lost_frames 2) { printf([INFO] 丢失%d帧, 使用上一帧结果(容许)\n, lost_frames); /* 使用缓存的上一帧结果 */ use_cached_result(); } else { fprintf(stderr, [EMERGENCY] 连续丢失%d帧, 触发安全模式!\n, lost_frames); /* 安全模式停止执行器等待恢复 */ enter_safe_mode(); } }五、总结边缘 AI 系统的端到端延迟是一个六时隙串行链路传感器曝光(T1) → 数据传输(T2) → 预处理(T3) → 推理(T4) → 后处理(T5) → 结果下发(T6)。推理只占端到端延迟的 40%~65%其余环节是优化盲区。流水线并行是端到端优化的最有效手段——将 T1(曝光) 与 T4(推理) 并行执行端到端延迟从各环节之和变为瓶颈环节的最大值实测 1.86 倍压缩。DMA 直传、NEON SIMD 预处理、引擎内 NMS、UDP 下发分别优化各环节的延迟叠加后端到端延迟从 54.5ms 降至 29.3ms。核心认知端到端延迟优化的第一原则是流水线并行第二原则是预算分配。流水线并行消除最大串行环节预算分配确保每个环节在约束内运行。推理预算 端到端目标 × 50%~80%超出预算的模型无论精度多高都不能用——延迟超标意味着帧率不足帧率不足意味着系统失效。工程师的任务是先建立端到端延迟预算模型再在预算约束内选择模型和优化各环节。资料说明本文中的协议、版本、性能、成本和行业趋势应以可核验的一手资料为准。未标注统计口径的比例、时间表和预测仅作工程讨论不应视为行业事实。可参考 0730 资料来源索引并在发布前将具体来源贴到对应断言之后。

相关新闻

《论单元测试及其应用》

《论单元测试及其应用》

《论静态测试方法及其应用》 测试驱动开发方法(TDD)在之前的考试中并没有考过,但我感觉未来还是有考察的可能性的,因为它是一种可以有效提高软件质量的开发方法。万一考到了,我们要有方法应对。应对方法也很简单&#…

2026/10/16 6:44:20 阅读更多 →
Jenkins与Gitee Webhook配置实战:实现代码推送自动部署

Jenkins与Gitee Webhook配置实战:实现代码推送自动部署

1. 项目概述与核心价值上次我们聊了Jenkins和Gitee对接的基础配置,把代码拉取和构建的架子搭起来了。但很多朋友在实际操作时,发现从“构建成功”到“服务上线”这最后一步,才是真正考验人的地方。今天这篇,我们就来啃这块硬骨头&…

2026/10/16 22:18:30 阅读更多 →
在Windows上解锁Mesa3D的图形潜能:开源驱动完全指南

在Windows上解锁Mesa3D的图形潜能:开源驱动完全指南

在Windows上解锁Mesa3D的图形潜能:开源驱动完全指南 【免费下载链接】mesa-dist-win Pre-built Mesa3D drivers for Windows 项目地址: https://gitcode.com/gh_mirrors/me/mesa-dist-win 想要在Windows系统上获得强大的开源图形支持吗?Mesa3D fo…

2026/10/17 3:44:57 阅读更多 →

最新新闻

NPDP备考核心:从产品创新工具到组合管理的实战指南

NPDP备考核心:从产品创新工具到组合管理的实战指南

简介:《NPDP Body of Knowledge-2nd》是产品开发与管理协会(PDMA)官方出版的产品创新与产品管理知识体系指南,主要面向备战NPDP认证考试的产品经理和产品开发从业者,也适合希望系统构建产品创新方法论的初中级产品人员…

2026/10/17 23:10:03 阅读更多 →
Raymarching 入门:SDF 与光线步进实现实时渲染

Raymarching 入门:SDF 与光线步进实现实时渲染

1. 从零理解 raymarching:它到底在解决什么问题第一次接触 raymarching 的人,多半是被 Shadertoy 上那些炫酷的实时渲染画面吸引过来的——一个纯片元着色器,没有模型文件,没有顶点数据,却能渲染出体积云、无限分形、流…

2026/10/17 23:10:03 阅读更多 →
Excel数据透视表实战:从数据清洗到多维分析全链路

Excel数据透视表实战:从数据清洗到多维分析全链路

简介:本资源是一份面向Excel初学者与办公人员的《数据透视表应用大全》系统教程,聚焦企业数据分析场景下的核心技能提升。文档全面解析数据透视表的创建逻辑、字段布局规则、多维汇总技巧及常见结构优化方法,覆盖销售分析、区域对比、产品统计…

2026/10/17 23:10:03 阅读更多 →
Python图像处理全流程:从像素操作到连通域分析的避坑指南

Python图像处理全流程:从像素操作到连通域分析的避坑指南

简介:这是一份Python图像处理入门PDF,面向对图像分析与处理感兴趣的初学者,也适合需要快速回顾常用工具方法的技术人员。文档从图像在计算机中的表示讲起:单通道灰度图像对应8位无符号整型矩阵,多通道图像则由红绿蓝三…

2026/10/17 23:10:03 阅读更多 →
无损验证环的秘密:NVIDIA-Nemotron-3.5-Lightning-30B-A3B-DSpark-bf16 中 Mamba-2 递归状态回滚机制解析

无损验证环的秘密:NVIDIA-Nemotron-3.5-Lightning-30B-A3B-DSpark-bf16 中 Mamba-2 递归状态回滚机制解析

【免费下载链接】NVIDIA-Nemotron-3.5-Lightning-30B-A3B-DSpark-bf16 项目地址: https://ai.gitcode.com/hf_mirrors/mlx-community/NVIDIA-Nemotron-3.5-Lightning-30B-A3B-DSpark-bf16 点击查看 免费下载 NVIDIA-Nemotron-3.5-Lightning-30B-A3B-DSpark-bf16 是…

2026/10/17 23:10:03 阅读更多 →
Python Flask + MySQL学生成绩管理系统源码全解析

Python Flask + MySQL学生成绩管理系统源码全解析

简介:面向需要完成数据库课程设计的高校学生,这份MySQL学生成绩管理系统课设报告提供了一套完整的系统设计与实现方案。该系统基于Python Flask与MySQL构建,覆盖管理员、教师、学生三类用户角色,实现选课、成绩录入、修改、删除、…

2026/10/17 23:09:02 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/16 15:04:24 阅读更多 →

月新闻

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