YOLOv8实战全链路:从环境配置到RK3588部署与CSL改进
简介这份PDF面向计算机视觉入门者与目标检测方向的开发者系统梳理YOLOv8的技术基础与实战要点帮助读者理解从YOLOv1到YOLOv8的演进脉络并掌握实时物体检测的落地思路。内容涵盖目标检测基本概念、网络结构与训练技巧的变化、AP与NMS等评估指标以及数据预处理、模型训练、测试与部署的完整流程同时延伸至自主车辆、视频监控、农业、医学影像、遥感与安防等应用场景。资源为单个PDF文件压缩包约29.18MB结构清晰便于按章节顺序阅读或按主题查阅。目前已有436人学习下载适合希望快速建立YOLOv8知识框架、对照算法原理与工程实践查漏补缺的读者参考。1. 从一份 YOLOv8 技术基础与实战 PDF 说起它到底能帮你解决什么很多人第一次接触 YOLOv8是在搜索框里敲下「YOLOv8技术基础与实战(第一版).pdf」这几个字。大概率是手头有个检测任务压着——要么是产线上的缺陷检测要么是毕设要跑通自己的数据集要么是老板丢过来一句「用 YOLO 搞一下」。这时候一份成体系的技术基础与实战资料价值不在于它讲了多少概念而在于它能不能让你从环境配置一路走到训练、推理、导出、部署中间不卡死。YOLOv8 是 Ultralytics 维护的目标检测框架相比前几代把检测头做成了 anchor-free训练和部署的链路被压缩得很短这也是它这两年热度一直下不来的原因。这份资料面向的是想真正把 YOLOv8 用起来的人会一点 Python、装过 PyTorch、知道什么是标注文件但还没完整跑通过一次「自己的数据集 → 训练 → 验证 → 导出」的闭环。下面我按自己踩过的路把这条链路拆开讲清楚。2. YOLOv8 环境配置与最小推理闭环先把第一次跑通2.1 为什么优先用官方 ultralytics 包而不是 clone 源码新手最容易翻车的地方是一上来就git clone官方仓库然后pip install -e .结果被 CUDA 版本、torch 版本、编译依赖折腾一整天。我的建议是先用 pip 装发布版把推理和训练跑通确认整条链路没问题再考虑改源码。原因是 ultralytics 这个包已经把模型定义、数据加载、训练循环、导出逻辑都封装好了你不需要碰源码就能完成 90% 的工作。只有当你需要改网络结构比如引入 CSL 这类改进时才需要动源码。环境配置的核心是版本对齐。PyTorch 和 CUDA 的对应关系是硬约束装错了要么报CUDA error: no kernel image is available要么直接 CPU 跑得你想砸键盘。下面是我一般用的安装流程# 先确认显卡驱动和 CUDA 版本nvidia-smi 右上角显示的 CUDA Version 是驱动支持的上限 nvidia-smi # 建独立环境别在 base 里折腾 conda create -n yolov8 python3.10 -y conda activate yolov8 # 按官方对应表装 torch这里以 CUDA 11.8 为例 pip install torch2.1.0 torchvision0.16.0 --index-url https://download.pytorch.org/whl/cu118 # 再装 ultralytics它会自动拉 numpy、opencv、matplotlib 等依赖 pip install ultralytics # 验证安装能打印版本且不报错就说明基础环境 OK yolo version这段命令的逻辑是先看硬件支持到哪再选对应的 torch 轮子最后装 ultralytics。参数上唯一要盯的是--index-url后面的 cu118它必须和你驱动支持的 CUDA 版本匹配驱动支持 12.x 也可以装 cu118 的轮子向下兼容。yolo version是 ultralytics 提供的命令行入口能跑通说明包和依赖都装好了。2.2 用预训练权重跑通第一张图的推理环境好了先别急着训练拿官方预训练权重跑一张图确认推理链路通。这一步能帮你排除掉「模型加载失败」「图像读取失败」「结果保存失败」这类基础问题。from ultralytics import YOLO # 加载官方 coco 预训练权重首次运行会自动下载到本地缓存 model YOLO(yolov8n.pt) # 对单张图推理saveTrue 会把带框的结果图存到 runs/detect/predict 下 results model(test.jpg, saveTrue, conf0.25, iou0.45) # 遍历结果打印每个检测框的类别和置信度 for r in results: boxes r.boxes for box in boxes: cls_id int(box.cls[0]) conf float(box.conf[0]) print(model.names[cls_id], round(conf, 3))逻辑说明YOLO(yolov8n.pt)里的 n 是 nano 版本最小最快适合先验证链路。conf是置信度阈值低于它的框会被丢掉iou是 NMS 的 IoU 阈值控制重叠框的合并程度。这两个参数是推理阶段最常调的conf调高召回下降、误检减少调低则相反。model.names是类别 id 到名称的映射coco 是 80 类。提示如果yolov8n.pt下载卡住可以手动下载权重文件放到当前目录再把路径改成相对路径避免走网络。2.3 训练自己的数据集前标注格式必须对齐YOLOv8 用的是 YOLO 格式的标注每张图对应一个同名 txt每行是class_id x_center y_center width height坐标都是归一化到 0~1 的。很多人从 LabelImg 导出的是 VOC 的 xml或者从别的框架拿来的是 COCO json直接喂进去会报格式错误。转换脚本是绕不开的一步下面是把 VOC xml 转成 YOLO txt 的核心逻辑import os import xml.etree.ElementTree as ET def voc_to_yolo(xml_path, img_w, img_h, class_map): tree ET.parse(xml_path) root tree.getroot() lines [] for obj in root.iter(object): cls_name obj.find(name).text if cls_name not in class_map: continue cls_id class_map[cls_name] bnd obj.find(bndbox) xmin float(bnd.find(xmin).text) ymin float(bnd.find(ymin).text) xmax float(bnd.find(xmax).text) ymax float(bnd.find(ymax).text) # 转成中心点 宽高并归一化 x_c (xmin xmax) / 2.0 / img_w y_c (ymin ymax) / 2.0 / img_h w (xmax - xmin) / img_w h (ymax - ymin) / img_h lines.append(f{cls_id} {x_c:.6f} {y_c:.6f} {w:.6f} {h:.6f}) return lines逻辑说明VOC 给的是左上角和右下角绝对坐标YOLO 要的是中心点加宽高的归一化值所以先算中心点再除以图像宽高。class_map是你自己定义的类别名到 id 的映射必须和后面 data.yaml 里的 names 顺序一致否则训练出来的类别会错位。归一化保留 6 位小数足够再多没必要。3. YOLOv8 训练自己的数据集参数怎么设、曲线怎么看3.1 data.yaml 的写法与目录结构训练前必须准备好 data.yaml它告诉框架去哪找图、去哪找标签、有几类。目录结构我一般这么组织dataset/ images/ train/ val/ labels/ train/ val/ data.yaml对应的 data.yamlpath: /home/user/dataset train: images/train val: images/val nc: 3 names: 0: helmet 1: person 2: vestpath是数据集根目录train和val是相对 path 的路径。nc是类别数names是 id 到名称的映射顺序必须和标注里的 class_id 严格对应。这里以安全帽检测场景举例三类分别是头盔、人、反光衣。如果 names 顺序写反了训练不会报错但推理结果会张冠李戴这是很隐蔽的坑。3.2 训练命令与关键参数yolo detect train \ datadataset/data.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ lr00.01 \ patience20 \ device0 \ projectruns/train \ namehelmet_v1参数说明epochs是训练轮数小数据集 100 轮起步imgsz是输入尺寸640 是默认值小目标多可以提到 1280 但显存翻倍batch按显存调8G 显存跑 640 大概能到 16lr0是初始学习率默认 0.01数据集小可以降到 0.001 防止震荡patience是早停耐心值20 轮验证指标不涨就停省时间device0指定第一块 GPU。project和name决定结果保存路径。3.3 损失函数曲线怎么读、怎么画训练完runs/train/helmet_v1/下会有results.csv里面记录了每轮的 box_loss、cls_loss、dfl_loss 和 mAP 指标。YOLOv8 的损失由三部分组成box_loss 是边界框回归损失cls_loss 是分类损失dfl_loss 是分布焦点损失负责把框的位置预测得更精细。三条 loss 都应该整体下降并趋于平稳如果某条一直震荡或者反弹说明学习率偏大或者数据有问题。画曲线用 pandas 加 matplotlib 几行就够import pandas as pd import matplotlib.pyplot as plt df pd.read_csv(runs/train/helmet_v1/results.csv) df.columns df.columns.str.strip() # 列名可能带空格先清理 fig, ax plt.subplots(1, 2, figsize(12, 4)) ax[0].plot(df[epoch], df[train/box_loss], labelbox) ax[0].plot(df[epoch], df[train/cls_loss], labelcls) ax[0].plot(df[epoch], df[train/dfl_loss], labeldfl) ax[0].set_title(train loss) ax[0].legend() ax[1].plot(df[epoch], df[metrics/mAP50(B)], labelmAP50) ax[1].plot(df[epoch], df[metrics/mAP50-95(B)], labelmAP50-95) ax[1].set_title(mAP) ax[1].legend() plt.savefig(curves.png, dpi150)逻辑说明results.csv的列名可能带前后空格直接按名字取会 KeyError所以先 strip。左图看 loss 收敛右图看 mAP 上升。mAP50 是 IoU 阈值 0.5 下的平均精度mAP50-95 是 0.5 到 0.95 多个阈值平均后者更严格。一般 mAP50 到 0.85 以上、mAP50-95 到 0.5 以上模型就基本能用了。4. 模型导出与 RK3588 部署从 pt 到 rknn 的完整链路4.1 为什么部署到 RK3588 要先转 ONNXRK3588 是瑞芯微的 SoC自带 NPU算力 6TOPS跑 YOLOv8 这种模型很合适。但它的 NPU 不认 PyTorch 的 pt需要经过 ONNX 再转成 rknn。所以导出链路是 pt → onnx → rknn。第一步导出 ONNXyolo export modelruns/train/helmet_v1/weights/best.pt formatonnx imgsz640 opset12 simplifyTrueopset12是 ONNX 算子集版本RKNN 工具链对 12 支持较好simplifyTrue会调用 onnxsim 做图优化去掉冗余节点这一步能显著减少转换时的算子不支持问题。导出后得到 best.onnx。4.2 用 rknn-toolkit2 转 rknn 模型rknn-toolkit2 建议在 x86 的 Linux 上跑Windows 支持有限。转换脚本from rknn.api import RKNN rknn RKNN(verboseTrue) # 配置量化参数do_quantizationTrue 会做 int8 量化精度略降但速度快很多 rknn.config( mean_values[[0, 0, 0]], std_values[[255, 255, 255]], target_platformrk3588, quantized_dtypeasymmetric_quantized-8 ) # 加载 onnx ret rknn.load_onnx(modelbest.onnx) assert ret 0, load onnx failed # 构建dataset.txt 里是若干张校准图路径量化需要 ret rknn.build(do_quantizationTrue, datasetdataset.txt) assert ret 0, build failed # 导出 rknn ret rknn.export_rknn(best.rknn) assert ret 0, export failed rknn.release()逻辑说明mean_values和std_values是归一化参数要和训练时的预处理一致YOLOv8 默认是 0~1 归一化所以 mean 0、std 255。do_quantizationTrue做 int8 量化模型体积缩到四分之一速度提升明显但精度会掉一点通常 1~2 个点。dataset.txt里放 100~200 张训练集里的图做校准图要有代表性别全放同一场景。4.3 板端推理与常见精度损失板端用 rknn-toolkit-lite2 或 C 的 rknn_api 推理。Python 侧大致流程是初始化 runtime、加载 rknn、输入预处理、推理、后处理。后处理要自己写 NMS因为 rknn 输出的是原始特征图。这里最容易出问题的是预处理不一致训练时用的是 letterbox 填充部署时如果直接 resize 会拉伸图像导致框位置偏移。所以板端预处理必须复刻 letterbox 逻辑记录缩放比例和填充量后处理时再映射回原图坐标。注意int8 量化后如果发现小目标漏检严重可以尝试混合量化把检测头部分保持 fp16或者干脆用 fp16 导出速度慢一点但精度稳。5. YOLOv8 实战避坑5 个我踩过的坑5.1 训练 loss 正常但 mAP 一直是 0现象训练日志里 box_loss、cls_loss 都在降但 mAP50 始终是 0 或者极低。原因最常见的是 data.yaml 里 names 顺序和标注 class_id 对不上或者标注文件根本没被读到路径写错、txt 文件名和图片名不一致。解决先检查 labels 目录下 txt 数量是否和 images 一致再随便打开一个 txt 确认 class_id 在 nc 范围内最后核对 names 顺序。5.2 显存溢出 CUDA out of memory现象训练跑几轮后报 OOM。原因batch 太大或者 imgsz 太高或者 dataloader 的 workers 太多导致内存碎片。解决先把 batch 减半再把 imgsz 从 640 降到 512 试workers设成 4 或 8 别设太大。如果还不行开ampTrue混合精度训练能省不少显存。5.3 导出 ONNX 后推理结果和 pt 不一致现象pt 推理框正常onnx 推理框全乱或置信度异常。原因导出时没加simplifyTrue或者 opset 版本和推理引擎不匹配或者预处理归一化参数不一致。解决重新导出加 simplifyopset 固定 12推理时确认输入是 RGB、归一化到 0~1、NCHW 排布和训练时完全一致。5.4 RK3588 上推理速度没达到预期现象转成 rknn 后帧率只有十几帧远低于 NPU 标称。原因没做量化或者输入分辨率太高或者后处理 NMS 在 CPU 上跑成了瓶颈。解决确认do_quantizationTrueimgsz 降到 640 甚至 416NMS 用 C 实现或者限制候选框数量。另外确认 NPU 频率没被限cat /sys/class/devfreq/fdab0000.npu/cur_freq看下当前频率。5.5 自己数据集上过拟合严重现象训练集 mAP 很高验证集很低差距大。原因数据量太少或者训练集和验证集场景分布不一致或者训练轮数太多。解决加数据增强mosaic、mixup 默认开着可以调概率增加验证集多样性用早停 patience 控制轮数必要时冻结 backbone 先训检测头再解冻微调。6. 进阶技巧用 CSL 改进 YOLOv8 做角度回归如果你的任务不是普通水平框检测而是带角度的旋转框比如遥感图像里的舰船、航拍里的车辆普通 YOLOv8 的水平框会框不准。这时候可以引入 CSLCircular Smooth Label把角度回归变成分类问题。核心思路是把 180 度分成若干份每份一个类别用分类损失代替回归损失避免角度周期性带来的边界跳变。实现上要改两处一是检测头输出维度从 4 个框参数变成 4 角度类别数二是在 loss 里加一项角度分类损失。下面是一个简化的角度编码函数import numpy as np def angle_to_csl(angle, num_bins180): 把角度编码成 CSL 的 one-hot 向量angle 单位是度范围 [0, 180) angle angle % 180 bin_size 180.0 / num_bins center int(angle / bin_size) vec np.zeros(num_bins, dtypenp.float32) # 用高斯窗代替 one-hot缓解边界不连续 for i in range(num_bins): diff abs(i - center) diff min(diff, num_bins - diff) # 环形距离 vec[i] np.exp(-(diff ** 2) / (2 * 2 ** 2)) return vec / vec.sum()逻辑说明num_bins是角度分桶数180 桶对应 1 度精度实际用 90 或 180 都行。用高斯窗而不是硬 one-hot是为了让相邻角度有平滑过渡训练更稳。diff取环形最小值是因为角度是循环的179 度和 0 度只差 1 度。这个编码在训练时对 GT 角度做推理时取输出向量最大值对应的桶再还原成角度。验证改进是否有效最直接的方法是看旋转框的 mAP 和角度误差。我一般会在验证集上单独统计角度误差的分布如果大部分样本误差在 2 度以内说明 CSL 起作用了。另外要注意CSL 会增加输出维度模型体积和推理时间会略增RK3588 上部署时要确认 NPU 支持新增的算子。我自己做旋转框检测时最开始图省事直接用水平框结果舰船的长宽比一大框就歪得没法看后来换成 CSL 才把角度误差压下来。这类改进没有银弹关键是先确认你的任务真的需要角度别为了改而改。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

集团精益智能工厂三年规划:70页模板的结构拆解与落地避坑指南

集团精益智能工厂三年规划:70页模板的结构拆解与落地避坑指南

/* 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 3:17:31 阅读更多 →
汽车传感器与执行器原理、驱动设计及故障排查全解析

汽车传感器与执行器原理、驱动设计及故障排查全解析

/* 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 3:17:31 阅读更多 →
工厂SCADA数据采集全解析:从PLC通讯到厂务监控落地

工厂SCADA数据采集全解析:从PLC通讯到厂务监控落地

/* 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 3:17:31 阅读更多 →

最新新闻

Python成绩统计作业复盘:从平行列表到字典与函数重构

Python成绩统计作业复盘:从平行列表到字典与函数重构

第二次作业发下来的那天,课程群里比平时安静了不少。第一次作业只要照着课堂示例把代码拼一拼,第二次题目一出,大家才发现要面对的是一整套流程:录入、存储、计算、排序、统计、输出。这道成绩统计题几乎在每个Python入门课程里都…

2026/10/12 5:52:28 阅读更多 →
前缀和进阶:哈希表、二维前缀和与树状数组

前缀和进阶:哈希表、二维前缀和与树状数组

刷LeetCode刷到一定量之后,你会发现前缀和就像一把“万能钥匙”:它能把区间求和从O(n)压到O(1),也能配合哈希表把子数组统计问题从O(n)压到O(n)。在上一个专题里,我详细讲过最基础的一维前缀和构造、区域和检索、中心下标这类直接…

2026/10/12 5:52:28 阅读更多 →
SpringBoot智能推荐卫生健康系统毕设实战:内容推荐算法实现

SpringBoot智能推荐卫生健康系统毕设实战:内容推荐算法实现

1. 项目概述1.1 这个毕设到底在做什么"基于springboot智能推荐的卫生健康系统的设计与实现",说人话就是:做一个能根据用户的身体状况、生活习惯和健康目标,主动给出个性化健康建议的Web平台。它不是一个简单的健康资讯网站&#xf…

2026/10/12 5:52:28 阅读更多 →
JAVA_HOME环境变量配置与排查:从报错到避坑全攻略

JAVA_HOME环境变量配置与排查:从报错到避坑全攻略

做了这么多年Java开发,几乎每个季度都得处理一次“JAVA_HOME环境变量”的幺蛾子。新同事入职第一件事是配JDK,老同事换项目第一件事是切版本,可翻来覆去出问题的,还是那个看起来人畜无害的JAVA_HOME。你可能也见过这样的报错&…

2026/10/12 5:52:28 阅读更多 →
3关键字B+树构建全解析:从分裂上提到删除合并

3关键字B+树构建全解析:从分裂上提到删除合并

如果你能在纸上从零构建一棵最多只装 3 个关键字的 B 树,那基本上就掌握了 B 树八成以上的难点。这是我当年准备面试时一个学长告诉我的,我照做之后发现确实如此——复杂的 m 阶 B 树,无非是把这里的“3”换成“几百”,分裂、上提…

2026/10/12 5:52:28 阅读更多 →
大模型推理优化实践:从KV Cache到语义缓存的三层缓存架构

大模型推理优化实践:从KV Cache到语义缓存的三层缓存架构

上个月排一个线上问题,我们的对外AI问答服务上线第三周,GPU没有扩容,但模型调用账单涨了快三倍。查了一圈下来最扎眼的还不是成本:平均每天十几万请求里差不多一半是“语义重复”——“附近有什么川菜馆”“川菜馆哪家好”“推荐一…

2026/10/12 5:51:27 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器: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 阅读更多 →