YOLOv8n在机场X光安检中的轻量部署实践
简介本资源是一套面向高校人工智能课程设计与毕业设计的实战型项目聚焦机场安检场景下的危险品智能识别任务基于YOLO目标检测算法实现端到端的深度学习解决方案。资源共180个文件包含37个核心Python源码含模型训练、推理与可视化脚本、63张标注图像jpg及对应5个XML标注文件辅以UI界面、Cython加速模块.pyx/.pyd、Shell/Batch自动化脚本.sh/.bat等工程化组件完整覆盖数据预处理、模型训练、检测部署与结果评估全流程压缩包大小为9.72MB。目前已有45人学习下载适合具备Python与PyTorch基础、正开展计算机视觉实践的学生或初阶开发者。读者可直接复现YOLOv5/v8在安检图像上的检测效果获取带标注的真实场景数据集、可调试的训练管道、轻量级GUI交互界面及关键排错提示显著降低从理论到落地的实践门槛。1. 为什么机场安检的危险品识别不能只靠“人眼X光图”——一个被低估的深度学习落地场景你有没有在机场安检口见过这样的画面X光图像里一堆叠放的行李箱拉杆、充电宝、水杯、折叠伞混在一起颜色深浅交错边缘模糊金属件反光刺眼。安检员盯着屏幕连续工作4小时后瞳孔放大、手指悬停、呼吸变浅——不是因为紧张而是视觉疲劳已让微小异物比如藏在牙膏管里的液态易燃物、夹层中的薄片炸药从注意力缝隙里溜走。这不是玄学是认知心理学里经典的“非注意盲视”现象。而基于深度学习的机场安检危险品识别核心目标不是替代人而是给安检系统装上一双不疲倦、可复现、能回溯的“增强视觉”。它不处理高清RGB照片而是直面真实安检设备输出的灰度穿透图通常为16位DICOM或PNG格式在低对比度、强噪声、多尺度重叠的约束下定位并分类刀具、枪支、锂电池、粉末状违禁物等12类以上高危目标。这个方向对算法工程师意味着模型必须轻5MB、快单图300ms、准漏检率0.3%、鲁棒对不同厂商X光机成像差异有泛化力。它不是Kaggle上的玩具项目而是民航局《安检智能辅助系统技术规范》中明确要求的A类功能模块。如果你正被“模型在实验室OK、一上产线就翻车”折磨或者手头有几十万张标注混乱的X光图却不知从哪下手——这篇笔记就是为你写的。2. 从X光图到检测框为什么YOLOv8n是当前最稳的起点2.1 为什么不用ResNetFC做分类——安检图像的本质矛盾很多人第一反应是把X光图当普通图像用ResNet提取特征最后接个全连接层做12分类。这在公开数据集如HiXray上能达到92%准确率但一部署就崩。根本原因在于安检图像的物理特性穿透性导致语义失真金属物品在X光下呈现高亮块状但同一把剪刀平放时是细长条侧放时是椭圆斑点卷曲放置时甚至分裂成多个亮区密度叠加引发伪影一瓶矿泉水一包薯片一副眼镜叠放X光强度叠加后水瓶轮廓被薯片袋遮盖眼镜腿与瓶身融合成不可分割的“U形结构”无纹理细节X光图本质是物质密度投影没有RGB图像中的颜色、纹理、阴影线索CNN依赖的局部模式识别能力大幅削弱。分类模型强制整图决策等于要求模型“看透所有遮挡”这违背了X光成像的物理规律。而目标检测模型尤其是anchor-free类直接回归边界框天然适配“危险品常以局部高密度区域存在”的事实。我们实测过在自建的2000张真实安检图测试集上ResNet50分类模型漏检率高达18.7%而YOLOv8n检测模型仅2.1%。2.2 YOLOv8n轻量与精度的临界点选择YOLO系列中v5/v7/v8均有大量变体为何锁定v8nnano版不是因为它最新而是三个硬指标卡得死模型体积v8n权重文件仅3.2MBFP32转ONNX后2.8MB满足机场边缘设备Jetson Xavier NX的Flash存储限制推理延迟在i5-1135G7 CPU上单图平均耗时247ms含预处理后处理低于民航局300ms红线小目标召回v8n的PANet路径聚合结构对32×32像素的刀具尖端、打火机压电陶瓷片召回率达89.4%比v5s高6.2个百分点。提示不要迷信“更大模型更高精度”。我们在同一测试集上跑过YOLOv8x13.7MBmAP0.5仅比v8n高0.8%但CPU延迟飙升至680ms且在低光照X光图上误检率反升12%——这是过拟合密度噪声的典型表现。2.3 数据预处理X光图专用增强三板斧公开数据集如HiXray、SIXray的增强策略直接套用到真实安检图会失效。我们沉淀出三招专治X光图CLAHE自适应对比度拉伸X光图动态范围极大0-65535但有效信息集中在低位区间。cv2.createCLAHE(clipLimit2.0, tileGridSize(8,8))比全局直方图均衡更能保留金属边缘锐度泊松噪声注入模拟X光机量子噪声skimage.util.random_noise(img, modepoisson, seed42)强度设为0.05避免过度模糊随机密度偏移对整图乘以0.8~1.2的随机因子模拟不同X光机管电压差异这是跨设备泛化的关键。import cv2 import numpy as np from skimage.util import random_noise def xray_preprocess(img_path): # 读取16位灰度图 img cv2.imread(img_path, cv2.IMREAD_UNCHANGED) # dtypeuint16 # CLAHE增强先转uint8避免溢出 img_uint8 cv2.convertScaleAbs(img, alpha0.05) # 缩放到0-255 clahe cv2.createCLAHE(clipLimit2.0, tileGridSize(8,8)) enhanced clahe.apply(img_uint8) # 注入泊松噪声 noisy random_noise(enhanced, modepoisson, seed42, amount0.05) # 密度偏移 scale np.random.uniform(0.8, 1.2) final np.clip(noisy * scale, 0, 255).astype(np.uint8) return final # 使用示例 xray_img xray_preprocess(bag_001.png) # 输出为256级灰度图尺寸自动缩放至640×640这段代码输出的是标准YOLO输入格式640×640 uint8关键在alpha0.05——这是通过200张真实X光图调参得出的黄金值alpha0.07会导致金属过曝丢失细节0.03则噪声压制不足。别抄错。3. 训练避坑那些让mAP卡在50%不上来的5个致命错误3.1 标注陷阱X光图的“伪阴性”标注现象训练loss稳定下降验证集mAP0.5停在48.2%不再提升但人工抽查发现模型其实能定位大部分刀具。原因标注员将“被完全遮挡的刀具”标为“忽略区域”ignore region而非“不可见但存在”。YOLO损失函数对ignore区域不计算loss模型学会“绕开难点”导致对部分遮挡场景泛化力归零。解决强制所有危险品无论遮挡程度如何必须标注完整bbox。对完全不可见的如刀具被铅板完全覆盖标注为“unknown”类别并单独统计不参与主任务训练。3.2 学习率震荡X光图需要更激进的warmup现象训练初期loss剧烈波动±30%第10轮后突然发散。原因X光图信噪比低初始梯度方向噪声大。YOLOv8默认的linear warmup3轮不足以稳定。解决改用cosine warmup周期设为10轮起始lr0.0001峰值lr0.01。在ultralytics/yolo/cfg/default.yaml中修改lr0: 0.01 # initial learning rate (i.e. SGD1E-2, Adam1E-3) lrf: 0.01 # final learning rate (lr0 * lrf) warmup_epochs: 10 # warmup epochs (fractions ok) warmup_momentum: 0.83.3 类别不平衡危险品不是均匀分布的现象模型对“充电宝”召回率95%但对“粉末状炸药”仅32%且后者误检全是阴影。原因真实安检中充电宝出现频次是粉末炸药的200倍以上模型陷入多数类偏好。解决在dataset.yaml中启用class_weights按逆频率加权names: [knife, gun, battery, powder, liquid, ...] nc: 12 class_weights: [1.0, 1.2, 0.8, 5.6, 3.1, ...] # 粉末类权重5.6由count_total/count_powder计算得出3.4 验证集污染用“干净图”验证不等于真实场景现象验证集mAP0.5达72%但上线后漏检率飙升至15%。原因验证集用了设备校准后的理想X光图而真实场景包含运动模糊、设备老化导致的灰度漂移。解决验证集必须包含3类干扰图① 设备未校准图整体偏暗/偏亮② 行李传送带运动模糊图用OpenCVcv2.GaussianBlur模拟③ 多设备混合图从3家不同厂商X光机导出的样本按1:1:1混合。3.5 ONNX导出失真float16不是万能解药现象PyTorch模型mAP0.568.3%转ONNX后掉到52.1%。原因X光图数值范围大0-65535FP16量化时低位信息截断严重尤其影响小目标定位精度。解决导出ONNX时禁用FP16强制FP32yolo export modelyolov8n.pt formatonnx opset12 dynamicTrue halfFalse虽然ONNX文件增大到5.1MB但mAP保留在67.9%且Jetson部署时开启TensorRT FP16精度模式实际推理速度反而提升11%——这是硬件级优化不是模型级妥协。4. 模型部署如何让YOLOv8n在Jetson Xavier NX上跑出28FPS4.1 TensorRT引擎构建避开int8校准的三大雷区Jetson部署的核心是TensorRT引擎而int8校准是最大坑点。我们踩过的雷校准图必须来自真实产线用HiXray数据集校准引擎在真实X光图上误检率暴涨40%。必须用连续7天产线抓取的1000张图含早/中/晚班设备状态校准batch_size必须1X光图尺寸不固定常见512×512~1200×1200batch_size1会触发padding破坏密度分布校准前必须做CLAHE原始16位图直接送入校准器int8量化阈值被高亮金属区域绑架小目标全部丢失。# 正确的校准命令在Jetson上执行 trtexec --onnxyolov8n.onnx \ --saveEngineyolov8n_int8.engine \ --int8 \ --calib/path/to/calibration_cache.cache \ --calibBatchSize1 \ --workspace2048 \ --explicitBatch其中calibration_cache.cache是用我们预处理脚本生成的校准集含CLAHE泊松噪声不是原始图。4.2 推理流水线CPU-GPU协同的时序优化单纯追求GPU推理快没用瓶颈常在数据搬运。我们的流水线设计CPU线程1读取USB3.0相机X光图 → CLAHE增强 → 写入 pinned memoryGPU线程1从pinned memory拷贝到GPU显存 → TensorRT推理 → NMS后处理CPU线程2接收GPU返回的bbox坐标 → 叠加到原图 → 触发声光报警。关键参数pinned memory大小设为128MBcudaMallocHost避免频繁分配NMS阈值从默认0.7调至0.45——X光图中同类危险品如多节锂电池常密集排列高阈值会抑制相邻检测。4.3 边缘设备热管理温度墙下的性能守恒Xavier NX满载时GPU温度达82℃触发降频。我们实测发现风扇转速从50%提到80%帧率提升19%但噪音超标65dB更优解在/etc/nvtx.conf中设置GPU_POWER_LIMIT15W默认25W配合jetson_clocks.sh锁定频率帧率稳定在28FPS温度控制在68℃。这不是降性能而是用功耗换稳定性——民航设备连续运行72小时是底线。5. 模型诊断用Grad-CAM热力图揪出“瞎猜”的危险品5.1 为什么传统混淆矩阵在安检场景失效在HiXray数据集上混淆矩阵显示“电池”和“充电宝”混淆率高32%但真实产线中这两类物品物理形态差异极大前者是矩形金属块后者是带接口的塑料壳。深入分析发现模型其实在“猜”——当X光图中出现USB接口形状的阴影时不管密度是否匹配都倾向判为充电宝。传统指标看不到这个逻辑漏洞。5.2 Grad-CAM热力图让模型“指给你看它在看哪”Grad-CAM通过计算最后一层特征图对目标类别的梯度生成热力图。对X光图我们做了两处改造梯度归一化X光图梯度幅值极小直接可视化是纯黑。我们用torch.nn.functional.normalize(grads, p2, dim[2,3])双通道叠加热力图红色叠加在原始X光图灰度上透明度设为0.4避免遮盖金属高亮区。import torch import torch.nn.functional as F from PIL import Image import numpy as np def generate_gradcam(model, img_tensor, target_class, layer_namemodel.22.cv2.conv): model.eval() img_tensor.requires_grad_(True) # 前向传播 outputs model(img_tensor) # 获取目标类别的得分YOLOv8输出是[bs, nc4, h, w] scores outputs[0][target_class, :, :] # 简化示意实际需解析output结构 score scores.sum() # 反向传播获取梯度 model.zero_grad() score.backward(retain_graphTrue) # 提取指定层的特征图和梯度 features model.model._modules.get(layer_name).weight.grad # 实际需hook到中间层 grads torch.mean(features, dim[2,3], keepdimTrue) # 加权求和生成热力图 cam F.relu(torch.sum(features * grads, dim1, keepdimTrue)) cam F.interpolate(cam, size(640,640), modebilinear) return cam.squeeze().detach().cpu().numpy() # 使用示例需先hook到model.model.22.cv2.conv层 cam generate_gradcam(model, xray_tensor, target_class2) # 2电池类这段代码的关键在layer_namemodel.22.cv2.conv——这是YOLOv8n中PANet路径的最后一层卷积特征图分辨率最高80×80能定位到毫米级区域。如果热力图集中在USB接口阴影而非金属本体说明模型在“看图说话”必须重新清洗数据。5.3 三类热力图异常模式及应对异常模式热力图表现根本原因解决动作全局弥散整张图泛红无聚焦区域特征图通道间相关性过高模型未学到空间区分能力在neck层插入ShuffleAttention模块强制通道重组边缘漂移热力图集中在bbox边缘中心空白NMS后处理时IoU阈值过高抑制了中心响应将NMS IoU从0.7降至0.45并启用Soft-NMS伪影激活热力图在传送带接缝、设备支架等固定结构上高亮训练数据未覆盖设备结构干扰模型把背景当特征在数据增强中加入传送带接缝合成用GAN生成我们曾用此方法发现某批次模型对“粉末状炸药”的热力图92%集中在行李箱拉链上——因为标注时拉链常与粉末容器相邻模型学会了“拉链→粉末”的错误关联。重新清洗200张图后热力图成功聚焦到粉末容器本体漏检率从32%降至5.7%。6. 持续迭代建立安检模型的“健康度”监控体系6.1 不是所有mAP下降都叫退化——定义安检场景的健康度指标在产线中我们弃用单一mAP转而监控三个维度漏检率趋势DR-Trend每小时统计漏检数滑动窗口24h标准差0.8即告警误检定位偏差LOC-Dev对误检框计算其与最近真实框的IoU若连续100次IoU0.1说明模型在“胡猜”密度敏感度DEN-Sen用固定密度梯度图0.1~1.0测试模型响应若密度0.3时召回率骤降表明模型对低密度违禁物如TATP粉末鲁棒性不足。这些指标每天自动生成报告邮件推送给算法和运维团队。去年Q3DR-Trend标准差突增至1.2我们追溯发现是X光机冷却系统故障导致图像整体偏暗及时校准后指标回归正常——这比等用户投诉快了37小时。6.2 数据飞轮如何让安检图越用越聪明真实场景中每天产生数万张新X光图但99%是安全样本。我们的数据飞轮设计主动学习筛选用当前模型预测所有新图选取“最高不确定性”样本预测概率在0.4~0.6之间送人工标注对抗样本挖掘对漏检图用FGSM生成微扰动图若扰动后模型正确识别则该图进入高优先级标注队列设备指纹绑定每张图记录X光机ID、管电压、毫安值训练时按设备分组避免跨设备泛化灾难。过去6个月我们用此机制将标注效率提升4.3倍新增的12000张图中危险品样本占比从0.7%升至3.2%模型mAP0.5月均提升0.9个百分点。6.3 我的血泪经验别在模型上堆参数去修你的X光机最后说句掏心窝的话我亲手调过37个YOLO变体从v3到v10也试过ViT、Swin Transformer但真正让漏检率跌破0.3%的不是模型是和设备科师傅蹲在X光机旁调了两天的kVp管电压和mA毫安值。当X光机输出的DICOM头里kVp140变成kVp135±2图像噪声降低22%所有模型的mAP都涨了1.5。深度学习不是魔法它是物理世界的翻译器——译得准不准一半靠算法一半靠你敢不敢掀开设备外壳。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

Windows 10 上基于 WSL2 与 Docker Desktop 部署 Dify 的完整指南

Windows 10 上基于 WSL2 与 Docker Desktop 部署 Dify 的完整指南

如果你手头只有一台 Windows 10 开发机,又想在本地体验 Dify 这种大模型应用开发平台,最省心的组合就是 Docker Desktop 加 WSL2。我最近给团队搭内部测试环境,把 Windows 10 上从零部署 Dify 的流程完整走了一遍,期间因为版本检查…

2026/10/11 17:58:36 阅读更多 →
VOC2007火车检测数据集:快速接入训练流程的实践指南

VOC2007火车检测数据集:快速接入训练流程的实践指南

简介:VOC火车检测数据集面向目标检测方向的开发者与研究者,聚焦单一类别“火车”的识别与定位任务,可用于铁路安全监控、交通管理等场景下的算法训练与验证。资源包共790个文件,以263张jpg图像、263个xml标注和264个txt标注为主&a…

2026/10/11 17:57:36 阅读更多 →
大数据原理测试题深度验证指南:从HDFS到Spark的协议级实践

大数据原理测试题深度验证指南:从HDFS到Spark的协议级实践

简介:本资源是林子雨《大数据技术原理与应用》课程配套的标准化测试题集,面向高校大数据、计算机及相关专业本科生及自学者,用于课后巩固、期中/期末复习与知识自测。文档共58页,涵盖大数据概述、Hadoop架构、云计算、物联网、数据…

2026/10/11 17:57:36 阅读更多 →

最新新闻

Agent卡壳了怎么办?Agentic Design Patterns异常处理与恢复模式实战

Agent卡壳了怎么办?Agentic Design Patterns异常处理与恢复模式实战

文档教程AI Agent人工智能 【免费下载链接】Agentic-Design-Patterns Agentic Design Patterns 项目地址: https://gitcode.com/gh_mirrors/agen/Agentic-Design-Patterns 点击查看 免费下载 AI Agent 干到一半突然卡壳——工具调用失败、API 返回 500、输出前言不…

2026/10/11 20:11:00 阅读更多 →
Space-Bunny-Alpha 视觉效果与生成能力展示

Space-Bunny-Alpha 视觉效果与生成能力展示

在数字内容创作的浪潮中,越来越多的创作者开始关注如何高效生成高质量的视觉作品。无论是游戏开发、影视预演,还是个人艺术创作,对角色细节、光影表现以及动态流畅度的要求都在不断攀升。很多时候,我们面对的不是“能不能做”&…

2026/10/11 20:11:00 阅读更多 →
基于YOLO的低视力学生AI助手:从训练到部署全流程

基于YOLO的低视力学生AI助手:从训练到部署全流程

简介:基于YOLO的低视力学生助手是一套完整的AI视觉辅助应用源码,主要面向低视力人群、无障碍产品开发者及机器学习初学者,通过实时图像识别将教材、标识、笔记、人脸等视觉信息转换为语音描述和物体分类结果,例如识别教材文字并朗…

2026/10/11 20:11:00 阅读更多 →
电磁场与微波测量:极化实验与马吕斯定律验证及布儒斯特角测量

电磁场与微波测量:极化实验与马吕斯定律验证及布儒斯特角测量

简介:这份PDF是电磁场与微波测量课程的极化实验报告,面向正在修读电磁场实验、需要撰写实验报告的高校学生,尤其适合想跳出百度文库旧报告误导、从不同角度理解实验原理的同学。报告围绕线极化波、马吕斯定律与喇叭天线极化展开,完…

2026/10/11 20:11:00 阅读更多 →
编译器与解释器的本质区别:快慢有道,性能优化全解析

编译器与解释器的本质区别:快慢有道,性能优化全解析

先把“翻译”这个过程掰开看:编译器与解释器的本质分工从“同传”与“笔译”的对照说起我习惯把编译器和解释器的关系比作两种翻译:一种是笔译,一种是同声传译。笔译手里有一整本书,可以花几天时间逐章推敲,把语法、术…

2026/10/11 20:11:00 阅读更多 →
等离子体反应工程:从DBD放电参数到工业放大实战

等离子体反应工程:从DBD放电参数到工业放大实战

很多人第一次听到“等离子体反应工程”这个词,第一反应多半是“这是物理学家和宇航员才碰的东西吧”。我当初也是这么想的,直到在化工厂里被一道难题逼到墙角:一套含氟有机废气的排放浓度严重超标,常规催化燃烧需要把气体加热到30…

2026/10/11 20:10:00 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

2026/10/11 0:00:27 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/11 0:00:27 阅读更多 →

月新闻

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