资讯动态

电塔鸟巢检测:VOC+YOLO数据集与YOLO训练避坑指南

发布时间:2026/10/5 1:37:55 来源:尧图企业网站定制
简介面向计算机视觉与电力巡检场景的目标检测数据集包含1165张电塔鸟巢真实场景图片聚焦鸟巢识别与定位适合训练YOLO、Faster R-CNN等主流检测模型服务于生态研究、电网安全监控及隐患预警等应用。压缩包共2000个文件主要分为VOC格式XML标注文件和YOLO格式TXT标注文件整体大小87.32MB标注与图片一一对应接入主流框架即可直接使用。数据集采用labelImg工具手工标注类别为单一nest鸟巢共1187个目标框矩形框准确框出每一处鸟巢位置可完整支撑目标检测模型的训练、验证与测试。目前已有202人学习使用规范的结构能够帮助开发者省去大量数据采集与整理工作无论是学术实验还是电力铁塔鸟巢自动巡检项目都是可直接落地的优质训练资源。1. 电塔鸟巢检测1165张双格式数据先解决目标检测最缺的数据问题冬季巡线时电塔上的鸟巢是运维老大难鸟粪闪络、异物搭接引起线路跳闸的事故年年都有。但要专门训练一个目标检测模型最卡脖子的不是算法而是带标注的现场数据。目标检测电塔上鸟巢检测数据集1165张VOCYOLO格式这套资源补的正是这个冷门场景的数据缺口1165张电塔实拍影像同时给出 Pascal VOC 的 XML 标注和 YOLO 的 txt 标注拿到手不用二次转换就能直接喂给 ultralytics 训练。它适合电力巡检算法验证、本科毕设以及想快速搭一版鸟巢识别原型的工程师。后面要讲的拆包核对、转换脚本、训练参数和踩坑都围绕这 1165 张数据展开。2. 拆包与数据校验目录结构、VOC 转 YOLO 脚本与可视化验框2.1 解压后的第一件事核对目录结构和三份文件是否能对上有些朋友拿到数据集压缩包解压后直接打开训练脚本就开跑结果报了文件找不到才回头检查目录。我的习惯是先花十分钟把目录看明白尤其是这种双格式打包的资源。常见的 VOC 格式发布目录大致长这样一个放图片的目录可能是 JPEGImages也可能是 images、一个放 XML 标注的目录Annotations以及一个 ImageSets/Main 目录里面是 train.txt、val.txt 这类按图片名划分的清单YOLO 标签一般是 labels 目录里面每张图对应一个同名 txt。但作者打包习惯未必统一有的把 train/val 直接分好了目录有的把所有图平铺在一起自己写划分脚本。先确认属于哪种再动手。我一般会先跑一遍文件数量和配对检查命令如下unzip -q 目标检测电塔上鸟巢检测数据集1165张VOCYOLO格式.zip -d birdnest_dataset cd birdnest_dataset find . -type f | awk -F. {print $NF} | sort | uniq -c第一条命令解压-q是安静模式避免刷屏第二条按扩展名统计文件类型。输出里应该同时看到 jpg/jpeg、xml、txt 三类数量级要和“1165”对得上。如果发现某些图片没有对应 XML或者 txt 多了好几个先别急着转格式把不配对的文件单独拎出来人工看这种情况通常是作者去重时漏删了标注或者某几张图本身就是负样本图中没有鸟巢所以不配标注。接下来做配对检查把图名和标注名取交集ls JPEGImages/*.jpg images/*.jpg 2/dev/null | sed s/.*\///; s/\.jpg$//; s/\.jpeg$// | sort img_names.txt ls Annotations/*.xml 2/dev/null | sed s/.*\///; s/\.xml$// | sort xml_names.txt ls labels/*.txt 2/dev/null | sed s/.*\///; s/\.txt$// | sort txt_names.txt comm -23 img_names.txt xml_names.txt comm -23 img_names.txt txt_names.txtcomm的-23表示只输出第一份文件里有、第二份里没有的行也就是“图片但缺标注”的名字。缺的这部分直接决定你后续训练集的有效数量别嫌麻烦。如果作者给的是双格式都齐全的包这一步通常不会有输出但跑一遍也就几秒钟能买个放心。2.2 VOC 转 YOLO 脚本归一化坐标和类别编号一次到位虽然资源标题写着 VOCYOLO 双格式但实际拿到手常常会出现一种情况某张图有 XML 却没有 txt或者作者只给了一种格式让你自己补。更常见的是你自己后面扩了一批 VOC 标注的数据需要并进这个数据集训练。所以 VOC 转 YOLO 的脚本几乎是必写的一小段工具代码。YOLO 的 txt 格式每行是一个目标类别id 中心点x 中心点y 宽度w 高度h四个坐标值都是用图片宽高归一化到 0~1 的浮点数而 VOC 的 XML 里存的是左上角 (xmin, ymin) 和右下角 (xmax, ymax) 的像素绝对坐标。转换就是把绝对坐标变成相对坐标再做一次中心化。import os import xml.etree.ElementTree as ET CLASSES [bird_nest] # 与训练 yaml 中的 names 保持一致顺序即类别 id def voc_to_yolo(xml_path, out_label_dir): tree ET.parse(xml_path) root tree.getroot() img_w int(root.findtext(size/width)) img_h int(root.findtext(size/height)) if img_w 0 or img_h 0: print(f跳过 {xml_path}: 图片尺寸异常 {img_w}x{img_h}) return lines [] for obj in root.iter(object): name obj.findtext(name) if name not in CLASSES: continue # 过滤掉不参与训练的其他类别 cls_id CLASSES.index(name) box obj.find(bndbox) xmin float(box.findtext(xmin)) ymin float(box.findtext(ymin)) xmax float(box.findtext(xmax)) ymax float(box.findtext(ymax)) x_center ((xmin xmax) / 2) / img_w y_center ((ymin ymax) / 2) / img_h w (xmax - xmin) / img_w h (ymax - ymin) / img_h x_center min(max(x_center, 0.0), 1.0) y_center min(max(y_center, 0.0), 1.0) w min(max(w, 0.0), 1.0) h min(max(h, 0.0), 1.0) lines.append(f{cls_id} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f}) txt_name os.path.splitext(os.path.basename(xml_path))[0] .txt with open(os.path.join(out_label_dir, txt_name), w, encodingutf-8) as f: f.write(\n.join(lines)) # 批量调用 xml_dir Annotations out_dir labels_yolo os.makedirs(out_dir, exist_okTrue) for xml_file in os.listdir(xml_dir): if xml_file.endswith(.xml): voc_to_yolo(os.path.join(xml_dir, xml_file), out_dir)这段逻辑不复杂但有几个点容易出问题。第一CLASSES的顺序决定了类别 id一个类别的时候只有 0没问题如果后面加入“绝缘子”“异物”做多类顺序一旦和训练 yaml 里的 names 不一致训练出的类别标签就串了。第二XML 里如果存在被遮挡或被截断的鸟巢标注坐标可能略微越界比如 xmax 大于图片宽度我加了 clamp 把四个值都限制在 0~1避免后面训练时出现 out of bounds 断言但你最好回去看一眼越界幅度如果整体偏大说明是原始标注质量问题不是简单的舍入误差。第三findtext(size/width)的前提是 XML 里必须有 size 节点有些标注工具不写 size遇到这种情况要么从图片读宽高要么直接跳过这张图。注意转换前后的类别名要严格一致。作者 XML 里如果写的是 BirdNest 而不是 bird_nest你的 CLASSES 匹配不上会把这张图所有目标都过滤掉等训练完发现 mAP 很高但一张图都没学到就晚了。2.3 把框画回图上验一遍训练前的最后一个后悔药转换完成不代表数据没问题。坐标计算错、图片方向和标注方向不一致、类别名匹配错这些都不会在执行时报错只会让模型学错东西。所以训练前我会随机抽 20~30 张图把 YOLO 的 txt 画回原图人工过一遍。这一步相当于吃后悔药问题在训练前发现成本只有几分钟拖到训练结束才发现重训一轮就是几个小时加一次踩坑复盘。import os import cv2 def draw_yolo_boxes(img_path, label_path, class_names, out_path): img cv2.imread(img_path) h, w img.shape[:2] with open(label_path, r) as f: for line in f: parts line.strip().split() if len(parts) ! 5: continue cls_id int(parts[0]) x_center float(parts[1]) * w y_center float(parts[2]) * h box_w float(parts[3]) * w box_h float(parts[4]) * h x1 int(x_center - box_w / 2) y1 int(y_center - box_h / 2) x2 int(x_center box_w / 2) y2 int(y_center box_h / 2) color (0, 0, 255) label class_names[cls_id] if cls_id len(class_names) else str(cls_id) cv2.rectangle(img, (x1, y1), (x2, y2), color, 2) cv2.putText(img, label, (x1, max(y1 - 5, 0)), cv2.FONT_HERSHEY_SIMPLEX, 0.6, color, 1) cv2.imwrite(out_path, img) img_dir images label_dir labels_yolo out_dir check_visual os.makedirs(out_dir, exist_okTrue) for img_name in os.listdir(img_dir): base os.path.splitext(img_name)[0] label_path os.path.join(label_dir, base .txt) if os.path.exists(label_path): draw_yolo_boxes( os.path.join(img_dir, img_name), label_path, [bird_nest], os.path.join(out_dir, img_name) ) if len(os.listdir(out_dir)) 30: break画完之后重点看两类图一类是鸟巢在画面里很小的远拍图这类图决定模型能不能守住召回率另一类是鸟巢和绝缘子串、横担靠得很近的图标注框如果松松垮垮或者框进了大量背景后面训练出来的预测框也会跟着松。发现比例超过两三成建议先修正标注再训练不要指望模型自己学出更紧的框。YOLO 训练是有增强的但对标注噪声的容忍度没那么高尤其是小目标框偏一点 IoU 就掉得厉害。3. 用 ultralytics 把鸟巢模型训出来环境配置、yaml 与最小训练命令3.1 环境配置ultralytics 装完先验证 GPU再跑一次推理很多刚开始接触 YOLO 的读者担心环境很难配实际上用 ultralytics 这个框架一条 pip 命令就能装好网上看到的“yolov11(ultralytics)环境配置,适合0基础纯小白”这类教程核心也就是先装环境再验证。我通常在干净的 conda 环境里执行conda create -n birdnest python3.10 -y conda activate birdnest pip install ultralytics装完不要直接开训先验证两件事CUDA 是否可用、基础推理是否正常。CPU 也能训练但 1165 张图几百轮跑下来要很久如果显存不够优先减小 batch 而不是换 CPU 硬扛。python -c import torch; print(CUDA available:, torch.cuda.is_available(), | GPU:, torch.cuda.get_device_name(0) if torch.cuda.is_available() else None) yolo detect predict modelyolov8n.pt sourcehttps://ultralytics.com/images/bus.jpg device0torch.cuda.is_available()输出True说明 PyTorch 找到了 GPU接下来yolo detect predict用官方自带权重跑一张示例图验证从模型加载到推理的整条链路是通的。我第一次用这个框架时就是没验证直接开训结果 training loop 卡在 dataloader 上浪费了半天才排查到是环境变量问题。基础链路通了之后再开始准备训练用的数据目录就稳得多。这里多说一句很多人关心 yolo 损失函数的实现细节但用 ultralytics 训练时你并不需要手写损失只需要理解两个行为框回归用的是 CIoU 这类边界框损失分类用 BCE训练日志里的 box_loss 和 cls_loss 下降趋势比绝对值更有参考价值。后面调参时你会发现小目标漏检往往和 box_loss 降不下去相关。3.2 数据 yaml 怎么配路径、nc 和 names 三者必须自洽ultralytics 训练时读的是一个 yaml 文件里面指定数据路径和类别信息。很多时候训练能跑起来但验证集 mAP 一直为 0问题就出在 yaml 的路径或者类别计数上。下面这份是单类鸟巢检测的配置# bird_nest.yaml path: /path/to/birdnest_dataset # 数据集根目录最好写绝对路径 train: train/images # 训练图片目录相对 path val: val/images # 验证图片目录相对 path nc: 1 # 类别数量 names: 0: bird_nest # 类别名必须与转换脚本 CLASSES 一致三个地方最容易出错。第一train和val指向的目录里必须只有图片而同级兄弟目录labels里是转换好的 txtultralytics 是根据图片路径自动找同名 labels 的它会把图片路径里的/images/替换成/labels/去找标注。如果把标注放错层级训练时每张图都会提示WARNING: ignoring corrupt image/label这基本就等于白训。第二nc写错比如写成 2但 names 只有一个训练不会报错模型会多学一个空的类别验证指标也会变得很难看。第三path写成相对路径时如果你在别的目录下执行命令容易找不到数据我一般直接写绝对路径或写相对当前工作目录的路径。数据通路是否真的打通最快的验证方式是先只跑 1 个 epoch如果训练日志里没有出现 corrupt image/label 的警告说明图片和标签能正常被加载yolo detect train databird_nest.yaml modelyolov8n.pt epochs1 imgsz640 device0这个命令会用随机权重跑一轮目的不是看精度而是看数据加载阶段报不报错。如果报错优先检查上面说的路径和 labels 目录位置。等这步通过后再换成预训练权重跑完整训练。3.3 最小训练命令imgsz、batch、epochs、patience 怎么定数据没问题之后训练命令本身并不复杂。我一般用下面的最小命令跑第一版基线yolo detect train \ databird_nest.yaml \ modelyolov8s.pt \ imgsz640 \ batch16 \ epochs100 \ patience20 \ seed0 \ device0modelyolov8s.pt不是从零训练而是加载 COCO 预训练权重做迁移学习这对 1165 张的小样本数据集非常关键。模型在 COCO 上学过的边缘、纹理和物体概念可以迁移到电塔场景收敛速度和最终精度都明显好于随机初始化。imgsz640是速度和显存的平衡点但鸟巢在电塔画面里通常只占很小一块如果验证下来 recall 偏低建议把 imgsz 提到 960 或 1280代价是显存占用近似平方上涨batch 可能要相应减半。patience20表示验证集指标连续 20 个 epoch 不提升就早停小样本训练经常在 40~60 轮就到顶后面全是震荡早停能省下大量时间。seed0是很多人忽略的细节固定随机种子后数据增强、模型初始化、shuffle 顺序都可复现后面调参才谈得上公平对比。关键参数的取舍我整理成了下表方便照着改参数我常用的值一句话说明imgsz640 起步效果差再上 960/1280小目标检测主要靠它显存不够就降 batchbatch显存能容纳的最大值16 或 32小 batch 梯度噪声大大 batch 内存吃紧epochs100配合 patience 早停小样本 100 轮足够别盲目 300 轮patience20验证指标不涨就停省电省时间seed0固定随机性保证实验可复现device0指定第一块 GPU多卡才写 0,1第一版基线跑完在验证集上先看两个数字mAP50和recall。mAP50 能到 0.7 以上说明这个数据集基本能训出可用的模型如果只有 0.4 左右别急着加数据先回头看标注质量、imgsz 和是否踩了下一章里的坑。4. 鸟巢训练避坑清单1165张小样本最容易翻车的5个节点这 5 个坑是我用类似小样本巡检数据集做目标检测时反复踩过的基本覆盖了从数据准备到训练完成的主要环节。每一条都按“现象、原因、解决”来讲方便你对号入座。4.1 数据泄漏同一基塔的照片进了 train 和 val验证集形同虚设现象训练时 loss 很漂亮val mAP 也很高但拿一段现场巡检视频去测漏检和误检都惨不忍睹和验证结果完全对不上。原因电塔通常在同一个机位连拍多张或者巡检视频里同一座塔出现了几十帧。这些帧之间背景、角度、光照高度相似如果随机划分 train/val同一个塔的相似帧很可能同时出现在两边。模型在训练时已经“见过”几乎一样的画面验证指标虚高一到真正没见过的新塔就暴露泛化不足。解决按塔分组划分数据。先按塔号给图片分组再把整组放进 train 或 val保证同一个塔的照片不会跨集合。手工整理时可以先按文件名前缀分类再写几行脚本按组打散如果文件名里没有塔号信息就把同场景连拍的图当成一组每 N 帧抽 1 帧再从抽出来的帧里划分。数据泄漏问题在校验指标越好看时越要警惕。4.2 小目标被增强切坏mosaic 把鸟巢腰斩recall 上不去现象训练日志里 cls_loss 降得很低但 recall 一直在 0.3 附近徘徊甚至越训越低画预测结果时发现模型对画面中占比较大的鸟巢能检测出来对远处针尖大小的鸟巢几乎全部漏掉。原因ultralytics 默认开启 mosaic 增强每轮会把 4 张图拼成一张再随机裁剪。电塔鸟巢本身是小目标原图中可能只占 40x40 像素经过拼接和裁剪后经常被切成只剩 10 个像素的碎片标注框也一起被裁掉大半模型相当于在学一堆残缺样本。这种现象在小目标数据集上不是个例做遥感目标检测的同行也会遇到。解决把 mosaic 关掉或降到很低的概率mosaic0.0或mosaic0.3。同时可以把scale增强降低避免鸟巢被缩得太小。具体命令在训练参数后面追加yolo detect train \ databird_nest.yaml modelyolov8s.pt \ imgsz960 batch8 epochs100 patience20 \ mosaic0.3 scale0.4 seed0 device0代价是增强变弱后模型泛化能力下降所以小样本场景下更要把 imgsz 提上来、合理设置早停让模型在有限的真实样本里把特征学扎实。4.3 坐标越界与类别名不一致训练中途报 assert 或 mAP 恒为 0现象训练跑到一半直接报AssertionError: bbox out of bounds或者整个训练过程很顺利但 val mAP 一直是 0。原因YOLO 的坐标要求归一化后在 0~1 区间。原始 VOC 标注里如果有 xmax 超出图片宽度、ymin 为负数这类脏数据转出来的 txt 就会越界类别名不一致则会让转换脚本把所有 object 过滤掉生成空标注文件模型学不到任何目标mAP 自然恒为 0。解决转换脚本里统一做 clamp再用一个简单脚本扫描所有 txt检查是否存在坐标小于 0 或大于 1 的情况awk {for(i2;i5;i) if($i0 || $i1) print FILENAME, $0} labels/*.txt有输出就把对应图片和 xml 拎出来修。类别名问题用 2.3 的可视化验框最直观画完一张图如果发现完全没有框先查 CLASSES 匹配。4.4 正负样本失衡模型把横担、绝缘子串当成鸟巢现象推理时鸟巢能框住但绝缘子串、横担节点、甚至塔材阴影也被框出来误检率偏高。原因这份数据集是正样本驱动每张图里的标注框都是鸟巢模型从来没被教会“这不是鸟巢”。电塔上绝缘子串和鸟巢在纹理、位置上有些相似模型学到的决策边界会往错误方向偏。解决两个方向。一是往训练集里混入不带标注的电塔负样本图让模型看到大量“没有鸟巢”的塔材画面ultralytics 会自动把它们当作背景样本二是把无目标的图单独放在一个目录里不加标签避免对标注缺失告警的干扰。加负样本后 mAP 不一定会变高但误检率通常会明显下降这在电力场景里往往比 mAP 更重要。4.5 不固定 seed 和划分实验复现全靠运气现象同一份数据、同一套参数连跑两次val mAP 一个 0.6 一个 0.75你以为调参调好了实际是运气好。原因ultralytics 默认会对 train/val 做自动划分如果没指定固定 seed每次划分都不一样增强、dropout、shuffle 也全部随机训练结果自然不可复现。小样本数据对划分尤其敏感个别难图进没进验证集能直接撼动好几个点的 mAP。解决手动完成划分并固定下来训练命令里显式写seed0。手动划分的脚本很简单把图片名随机打散后按 8:1:1 写入 train.txt、val.txt、test.txt后续训练直接用拆分好的目录不再依赖自动划分。我现在的默认操作是先把划分结果存成文件名清单保存好谁要复现就按同一份清单跑省去无穷无尽的“你那边怎么比我高 0.05”的口水仗。5. 验证与调优漏检误检怎么算置信度和 NMS 怎么设5.1 别只看 mAP用验证结果重算每个置信度下的精确率和召回率训练结束大家第一个看的是 mAP50、mAP50-95但这两个指标是平均意义掩盖了鸟巢检测最关心的两个问题漏检率高不高、误检多不多。我会用训练好的 best.pt 对验证集重新跑一遍推理把每个置信度阈值下的 precision 和 recall 算出来再决定现场用多高的置信度。from ultralytics import YOLO model YOLO(runs/detect/train/weights/best.pt) metrics model.val(databird_nest.yaml, splitval, conf0.001, iou0.5, verboseFalse) print(mAP50:, metrics.box.map50) print(mAP50-95:, metrics.box.map) print(precision:, metrics.box.mp) print(recall:, metrics.box.mr)conf0.001是把置信度阈值压到几乎不设防这样算出来的 recall 是模型的能力上限。如果这个上限只有 0.5说明模型本身漏检严重调阈值救不回来得回头做 4.2 里的事如果上限有 0.9但默认阈值 0.25 下实测漏检很多那就是选阈值的问题不是模型的问题。这两类问题在跟现场沟通时经常被混为一谈先分清是哪一种再决定动模型还是动阈值。5.2 推理时的 conf 和 iou漏检与重框的取舍训练和推理是两个阶段训练完部署时还可以用conf和iou两个参数做最后一轮调优。下面是电力巡检图片推理的常用命令yolo detect predict \ modelruns/detect/train/weights/best.pt \ sourceimages/现场图片 \ conf0.15 \ iou0.6 \ saveTrueconf是置信度阈值低于这个值的结果被丢弃。巡检抓拍的照片质量高、塔位清晰可以设 0.25 以上宁可漏检也不能出太多误检因为误检到了工单系统里是要人工复核成本的但如果是无人机视频流里的小目标我会把 conf 降到 0.1 到 0.15先把所有可疑目标框出来再靠后端逻辑或人工筛选。iou是 NMS 的 IoU 阈值iou越小抑制越狠重叠框保留越少。拍同一个鸟巢时如果经常出现一个框套着一个框把iou从 0.7 调到 0.5 就能解决反过来两个紧挨着的鸟巢被合并成一个框就调大iou。NMS 参数有时候有点玄学它和你的数据重叠模式强相关我给不出一个通吃所有场景的固定值只能给出这个调参方向同类目标密集就调大 iou误检虚框多就调高 conf漏检多就调低 conf。一次只动一个参数别两个一起改否则无法判断是哪一步起作用。5.3 用热力图确认模型注意力的落点验证指标之外我还会用热力图看一眼模型的注意力区域。给模型输入一张测试图用梯度加权类激活映射这类常见的可视化方法让热力高亮落到模型“认为关键”的区域。如果模型对一张带有鸟巢的电塔图判断正确但高亮区域集中在绝缘子或塔身说明模型可能学到了背景捷径这张图换成陌生塔型时大概率会出问题。这类工具在 ultralytics 生态里没有内置一键命令常见的做法是借助 grad-cam 之类的开源实现或者直接用results[0].plot()看预测框的位置是否和人工标注贴合。我个人的判断标准是热力图的高亮中心最好落在鸟巢巢材上而不是周边金属结构上如果多次出现后者即使 mAP 达标我也会认为这个模型还不够稳需要补充负样本或换更强的数据增强再训一轮。6. 一次训练只是开始半自动标注、冻结微调与部署验证1165 张数据训出的模型只是起点。拿第一版模型去现场拍新的塔位照片跑完推理后会看到两类结果一部分鸟巢被高置信度检出另一部分漏了但框附近有明显目标特征。最有效的做法是半自动标注用模型对新图预测画出预测框再用标注工具人工确认和修正只改漏检和错检。这个过程能把一张图的标注时间从几分钟压到十几秒新增几百张样本半天就能完成合入旧数据重训模型越滚越稳。如果新样本和原数据集场景差异不大别从头训练。用冻结层微调固定骨干网络只更新检测头训练更快也更难过拟合。ultralytics 直接支持yolo detect train databirdnest_new.yaml modelruns/detect/train/weights/best.pt freeze10 imgsz960 batch8 epochs50 patience10 seed0freeze10表示冻结前 10 层骨干让模型保留已经学到的电塔与鸟巢基础特征只微调任务层。有过一次训练基础再微调通常 20~30 轮就能收敛比首次训练快一半以上。模型在电脑上跑通后还要落到现场设备。输出格式转换最好提前做避免部署时手忙脚乱yolo export modelruns/detect/train/weights/best.pt formatonnx dynamicTrue imgsz960 yolo export modelbest.pt formatengine device0 imgsz960 halfTrue先导出 ONNX 验证网络结构再用 TensorRT 导出 engine 做加速。做实时在线监测要留个心眼推理速度在 640 分辨率下看着快但现场链路还有解码、预处理、后处理和告警推送1080p 25 帧码流实际能支撑的路数通常比纸面推算值低不少。最后说一条我自己的教训以前拿到数据集总想跳过校验直接训练觉得机时便宜后来连续两次因数据划分泄漏和坐标越界返工。现在我把“先校验、再训练、固定 seed、按塔划分”当成默认流程这类小样本冷门项目才能稳定复现。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑