news 2026/9/24 18:26:14

遥感油罐检测数据集全解析:YOLO三种标签格式与训练避坑指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
遥感油罐检测数据集全解析:YOLO三种标签格式与训练避坑指南

简介:YOLO遥感油罐检测数据集面向计算机视觉目标检测学习者与研究人员,收录1000张真实遥感场景下的油罐图片,场景丰富,经LabelImg精细标注,框体质量高,配套VOC(xml)、COCO(json)及YOLO(txt)三种格式标签,分别存放,可直接用于YOLO系列模型训练,无需额外转换格式。压缩包共2000个文件,除xml与txt标签外,还包含6个html操作教程、3个Python数据集划分脚本及1个Yaml配置文件,整体大小224.22MB。教程覆盖Linux与Windows两套环境下的YOLO环境搭建与训练流程,并给出基于案例修改以适配自定义数据集的完整思路;脚本支持将图片与标签按训练集、验证集、测试集自动划分写入新文件夹,也可生成ImageSets文件。已有247人学习下载,适合需要快速上手遥感目标检测或进行数据预处理的用户。

1. 遥感油罐检测:这个数据集为什么能让你少走三天弯路

看到"YOLO遥感油罐检测数据集(含1000张图片)+对应voc、coco和yolo三种格式标签+划分脚本+训练教程.rar"这个压缩包,第一反应是:终于不用自己画油罐了。遥感图像里的油罐是典型的小目标,罐体是圆形,顶面有阴影,人工标注一千张图要消耗两三天,还不算把LabelImg导出的VOC格式转成COCO或YOLO格式的功夫。这个数据集把图片、三种格式标签、划分脚本和训练教程打包在一起,解决的不只是"有没有数据"的问题,而是"拿到手能不能直接开训"的问题。对准的人有三类:做遥感目标检测课题的学生,想快速验证YOLO在圆形小目标上表现的算法工程师,以及拿来做算法对比的基准数据需求者。后面几章我会按解压、核对、划分、训练、验证的路径讲一遍,把容易翻车的地方提前点给你。

2. 数据集里有什么:1000张遥感油罐图的目录结构与标签格式

2.1 压缩包解压后的目录布局:图片、标签、脚本、文档各归其位

拿到.rar文件别急着双击解压到桌面,先把它放成一个独立的工程目录。常见做法是解压后得到images、Annotations、labels、annotations这几个顶层目录,外加一个划分脚本(可能叫split.py或divide.py)和一份训练教程文档。我一般会用tree命令先扫一遍目录结构,确认作者是不是按约定俗成的顺序摆的:

tree -L 2

逻辑说明:tree命令把目录层级打印成树状图,-L 2只显示两层,避免训练教程里嵌套的图片目录刷屏。如果你在Windows上,用PowerShell的tree /F效果类似,能同时看到文件名。这一步的核心目的是判断图片和标签是不是一一对应:油罐数据集的命名通常是oil_tank_001.jpgoil_tank_001.xml这样的同前缀结构,也有直接用四位数字编号的。只要前缀能对上,后面写路径匹配脚本就省事。

接下来我会再用一条命令统计图片总数,看看和标题里说的1000张是否一致:

find images -type f | wc -l

逻辑说明:递归查找images目录下所有文件并计数。如果结果不是1000,不要慌,先看看是不是有隐藏文件或者子目录里还放了别的图片。有些作者会把原始大图和切片图放在不同文件夹,标题写的是切片后的数量。确认好数量之后,再抽查几个文件名,确认JPG和TXT的命名完全一致。一个容易踩的坑是,有的图片带后缀_aug,但标签还是原名,这就导致标签对不上图。

提示:整个数据集目录一定放在纯英文路径下,比如D:\oil_tank_dataset。ultralytics的YOLO实现读取训练路径时对中文兼容性差,报错信息往往还是"file not found",排查了半天才发现是中文目录名的问题。这个坑至少能浪费你半小时。

解压后还要看训练教程文档是哪种格式,常见的可能是Markdown或PDF。不要跳过它,先翻到"环境要求"那一段,看看作者用的框架版本和你本机是否一致。我自己遇到过教程里写的是YOLOv5的依赖,但实际压缩包里的划分脚本是用ultralytics风格写的,版本对不上,训练命令直接报参数错误。所以解压后第一件事永远是"看文档、跑脚本、数文件",顺序不能乱。

2.2 VOC、COCO、YOLO三种标签格式的字段差异与换算关系

三种格式是目标检测领域最常见的标签组织方式:VOC是XML文件,一个图片配一个XML;COCO是单个JSON文件,所有标注集中在一起;YOLO是每张图片配一个TXT,每行一个目标。它们描述同一个油罐目标,但坐标体系完全不同,拿到手后不能混用。下表帮你看清三者的差异:

格式文件组织框坐标表示类别表示适用框架
VOC每图一个.xmlxmin, ymin, xmax, ymax(绝对像素)标签名字符串,如oil_tankMMDetection、Faster R-CNN、SSD
COCO单文件.json[x, y, width, height],左上角原点绝对像素category_id,一般从1开始Detectron2、MMDetection
YOLO每图一个.txtcx, cy, w, h,全部归一化到0~1class_id,从0开始YOLO系列

这张表里藏着最典型的一个坑:VOC和COCO是绝对像素坐标,YOLO是归一化坐标。很多人会用LabelImg打标后导出VOC,再转YOLO时忘了除以图片宽高,导致所有的中心点和宽高都落在1.0以上,训练时loss直接飞掉。坐标换算的常见公式只有两组:

YOLO的cx = (xmin + xmax) / 2 / width YOLO的cy = (ymin + ymax) / 2 / height YOLO的w = (xmax - xmin) / width YOLO的h = (ymax - ymin) / height

反过来从YOLO转VOC时,用图片宽高反乘回去,注意四舍五入后的边界框不要出现xmin为0但xmax为1这种合法但不合理的极端值。COCO的[x, y, w, h]中x、y是左上角坐标,不是中心点,新手最容易在这里搞混:把COCO当YOLO去画框,框直接偏到右上角去了。

注意:COCO的category_id和YOLO的class_id起始值不同。COCO如果只有一个类,经常从1开始,而YOLO从0开始。转换时要统一偏移,否则评测时mAP全部是0,因为模型预测的类别编号和真实标注的类别编号完全错位。

如果这个数据集三种格式都齐,我拿到后会随机抽一张图,把三种标签的框画上去做叠加对比:VOC用绝对坐标画框,COCO用坐标加宽高画框,YOLO用中心点和宽高画框,三个框应该完全重叠。差一个像素以内是正常的,差几十个像素就说明转换过程有偏移。我一般会写一个快速脚本检查所有YOLO标签的坐标合法性,因为TXT格式最容易被误改:

import glob import os for txt_path in glob.glob('labels/*.txt'): if os.path.basename(txt_path) == 'classes.txt': continue with open(txt_path) as f: for line in f: parts = line.strip().split() if len(parts) != 5: print(f'字段数错误: {txt_path} -> {line.strip()}') continue cid = int(parts[0]) cx = float(parts[1]) cy = float(parts[2]) w = float(parts[3]) h = float(parts[4]) if not (0 <= cx <= 1 and 0 <= cy <= 1 and 0 <= w <= 1 and 0 <= h <= 1): print(f'坐标越界: {txt_path} -> {line.strip()}') if w <= 0 or h <= 0: print(f'宽高为负: {txt_path} -> {line.strip()}')

逻辑说明:遍历labels目录下所有txt文件,跳过classes.txt,每行按空格切分后判断字段数和坐标范围。YOLO标签的格式是类别 中心x 中心y 宽 高,五个字段缺一不可;宽高归一化后必须在0到1之间,而且必须为正数。中心点也必须在0到1之间,否则说明训练时这张图会提供无效回归目标。

参数说明:glob路径按实际目录改就行。if os.path.basename(txt_path) == 'classes.txt'这一行非常重要,因为YOLO的labels目录里通常还放着一个classes.txt,它里面只有类别名,没有坐标,不跳过的话会被误判成格式错误。运行后如果没有任何输出,说明标签基本干净;如果有输出,按文件名找到对应图片,用可视化工具看问题在哪。

还要注意类别名的统一。VOC的XML里写的是oil_tank,YOLO的classes.txt里写的也得是oil_tank,COCO的JSON里categories列表下的name字段也一样。如果哪个文件里写成了"oil tank"带空格,或者写成了中文"油罐",YOLO训练时会把它当作两个不同的类,最后分类结果全乱套。数据集作者通常不会犯这种错,但你要在正式训练前检查一遍,尤其是当你准备在这个数据集基础上再追加自己标注的图片时。

3. 用划分脚本把数据切成训练/验证/测试集:参数与输出

3.1 划分脚本的工作流程:从全量文件到三份清单

划分脚本是整个数据集的灵魂。很多人拿到数据集后习惯手动建train和val文件夹,把图片拖动分开,标签也跟着拖,这是最原始也最容易出错的做法。常见做法是划分脚本只生成三个文本清单:train.txt、val.txt、test.txt,每一行是一个图片路径。YOLO训练时直接读清单,不会真的把图片挪动位置,这样原来的目录结构保持不变,后期调整比例只需要重新跑一遍脚本,不需要搬文件。

一个典型的最小划分脚本用Python写的话大概是这样:

import os import random data_root = 'oil_tank_dataset' images_dir = os.path.join(data_root, 'images') # 收集所有图片路径 img_paths = [os.path.join(images_dir, f) for f in os.listdir(images_dir) if f.lower().endswith(('.jpg', '.jpeg', '.png'))] # 固定随机种子,保证划分结果可复现 random.seed(42) random.shuffle(img_paths) # 按比例切分,test自动占剩余比例 train_ratio = 0.8 val_ratio = 0.1 n_train = int(len(img_paths) * train_ratio) n_val = int(len(img_paths) * val_ratio) n_test = len(img_paths) - n_train - n_val splits = { 'train': img_paths[:n_train], 'val': img_paths[n_train:n_train + n_val], 'test': img_paths[n_train + n_val:], } for split_name, paths in splits.items(): out_path = os.path.join(data_root, f'{split_name}.txt') with open(out_path, 'w') as f: for p in paths: f.write(p.replace(data_root + os.sep, '') + '\n') print(f'{split_name}: {len(paths)} 张')

逻辑说明:先把images目录下所有图片路径收集起来,设置随机种子后打乱顺序,然后按比例切成三段。切分时用列表切片,train取前80%,val取中间10%,test取最后剩余部分。写入文本时,路径用相对路径而不是绝对路径,这样整个数据集目录移到别的机器上也能直接用,只要在data.yaml里改一下根目录就行。

参数说明:train_ratio=0.8val_ratio=0.1是常用配置,测试集自动得到0.1也就是100张左右。如果你的数据总量只有几百张,测试集比例不要低于0.1,否则评估结果波动太大,单张图的偶然漏检都会让mAP掉好几个点。random.seed(42)是固定随机种子的典型写法,数值本身没有特殊含义,关键是固定下来以后,每次运行脚本得到的划分结果完全一致,这样调参的时候才能排除数据划分带来的干扰。

跑完脚本后一定要检查三个txt里的路径是否存在。我见过写完脚本后不检查,直接拿去训练,结果train.txt里有一张图片已经被移动走了,YOLO训练时报"image not found"但不会中止,只是默默跳过,最后训练集少了一张图,你根本察觉不到。检查办法很简单:

while read line; do test -f "oil_tank_dataset/$line" || echo "缺失: $line"; done < oil_tank_dataset/train.txt

逻辑说明:逐行读取train.txt,检查oil_tank_dataset/加上该行路径是否是一个真实文件,不存在则打印出来。如果最后没有任何输出,说明所有路径有效。

3.2 划分比例、随机种子与类别映射的参数设置

划分比例怎么定,取决于你的数据场景。油罐检测是单类小目标任务,1000张图不算多,我一般会用80/10/10或者70/15/15。如果这个数据集的图片是从同一张遥感大图上切出来的切片,那么相邻切片的内容高度相似,纯随机划分会让验证集和训练集几乎"长得一样",评估出来的mAP虚高,在真实场景下一测就露馅。这种情况需要按来源分组:先看文件名里有没有scene编号,把同一个场景的切片全部放进同一个集合,绝不让它横跨训练集和验证集。

判断文件名是否带场景号,可以先用一条Shell命令统计:

ls images | awk -F'_' '{print $1}' | sort | uniq -c

逻辑说明:awk按下划线切分文件名,取第一部分作为场景编号,sort后uniq -c统计每个编号下的图片数量。假设文件名叫scene01_oil_0132.jpg,取到的就是scene01。如果每个场景的图片数量很平均,随机划分问题不大;如果发现某个场景占了300张图,那必须按场景划分,否则验证集里会混进和训练集连续帧一样的切片。

随机种子这一步,我要多提醒一句:种子只决定打乱顺序,不改变图片内容。固定种子之后,你调学习率、改batch size时,看到的效果变化全部来自参数,而不是数据划分,这样才能准确判断哪个改动真正有效。我自己习惯用random.seed(2024),也会在脚本里把种子值写进输出文件名,比如train_2024.txt,这样即使后来改过种子,也能知道手里的清单是哪个版本生成的。

类别映射是另一个容易被忽略的点。YOLO的txt每行第一个数字是类别ID,从0开始。如果这个数据集只有油罐一类,那classes.txt只有一行oil_tank,所有txt里的类别ID应该全是0。检查类别集合可以用一段很短的Python:

import glob class_ids = set() for f in glob.glob('labels/*.txt'): with open(f) as fp: for line in fp: if line.strip(): class_ids.add(line.split()[0]) print('类别ID集合:', sorted(class_ids))

逻辑说明:遍历所有YOLO标签文件,把每行的第一个字段加入集合,最后打印出去重后的结果。正常情况下输出是类别ID集合: ['0']。如果出现了['0','1'],说明有某个标注文件把类别ID写成了1,而classes.txt里根本没有第二个类,这会导致训练时报类别数错误。

参数说明:class_ids.add(line.split()[0])中line.split()按空白字符切分,第一个字段就是类别ID。加if line.strip()是为了跳过空行,空行虽然不影响训练,但统计时会被split解析成空列表,触发IndexError。跑完这个脚本,再结合前面2.2节的坐标校验,标签这块基本就算把关过了。以后你自己用LabelImg打标再导YOLO格式时,这两个检查脚本可以直接复用。

4. 训练教程与常见问题排查:五个让YOLO训练翻车的坑

4.1 环境配置与目录准备:YOLO的data.yaml怎么写才能不报错

划分出train/val/test三个清单之后,下一步是写YOLO的data.yaml。无论你用的是ultralytics的YOLOv8,还是老一些的YOLOv5,data.yaml的结构都差不多。我一般建议用Anaconda建一个独立环境,Python版本3.9左右,直接pip安装ultralytics,然后准备一个这样的配置文件:

path: /home/user/oil_tank_dataset train: train.txt val: val.txt test: test.txt names: 0: oil_tank

逻辑说明:path是数据集根目录,train/val/test写的是相对于根目录的文本清单文件名。YOLO会读取train.txt中每一行图片路径,然后自动把路径中的images替换成labels找标签文件。所以你的目录结构里,图片所在文件夹必须叫images,标签文件夹必须叫labels,这是一个硬编码映射关系,不需要在yaml里指定标签目录。如果图片文件夹叫imgs,标签文件夹叫labels,YOLO会找不到标签,日志里出现"WARNING: no labels found in xxx"。

参数说明:path必须写绝对路径。Linux下写~开头虽然shell能识别,但YOLO内部解析时不一定展开,容易报路径找不到。Windows下尤其糟糕,反斜杠方向错误、盘符带中文都会出问题。最省心的方法是在data.yaml里写纯英文绝对路径,比如D:/dataset/oil_tank_dataset,正斜杠和反斜杠的区别经常让人抓狂。names里的类别索引要和YOLO标签里的class_id严格对应,只有一类就只写0: oil_tank

环境验证跑通这一步也很重要。不要一上来就训练,先加载预训练权重做一次前向推理,确认框架和CUDA正常:

yolo predict model=yolov8s.pt source=oil_tank_dataset/images/oil_tank_001.jpg

逻辑说明:这是ultralytics的命令行预测入口,会下载或读取yolov8s.pt,对指定图片做一次推理并保存结果。如果这一步能跑通,说明CUDA、PyTorch、ultralytics的链路没有问题,接下来训练才会顺利。如果报错,绝大多数情况是PyTorch版本和CUDA版本不匹配,去查对应版本的安装命令,不要硬着头皮往下走。

4.2 训练命令与关键参数:imgsz、batch、epochs怎么定

环境就绪后,训练命令可以写成这样:

yolo train data=oil_tank.yaml model=yolov8s.pt epochs=200 imgsz=640 batch=16 patience=30

逻辑说明:data指向yaml文件,model指定预训练权重,epochs设上限200,配合patience早停。imgsz=640是训练输入边长,batch=16是批次大小。油罐是圆形小目标,yolov8s这个体量足够,不一定非要上larger模型,因为模型越大,1000张图的训练集越容易过拟合。patience=30表示连续30个epoch验证集mAP没有提升就自动停止,省时间又不会错过最优权重。

参数说明:imgsz这个参数在遥感场景里要特别上心。油罐数据集里的原图可能有大几千像素,如果你直接imgsz=1280,显存占用是640的四倍,目标确实大了一点,但batch只能降到4,训练速度大幅下降,还不见得能提升精度。更合理的路线是保持640或512,配合第5章的切片推理策略。batch=16对8G显存来说是安全值,12G可以尝试32,显存不够时优先减batch,不要轻易动imgsz。epochs=200只是理论上限,实际1000张图往往在80到120个epoch就收敛了,早停能帮你省下一半时间。

训练过程中要看什么?不要盯着训练loss曲线,它下降不代表模型好用。重点关注验证集mAP50和mAP50-95这两个指标。mAP50是IoU阈值0.5下的平均精度,油罐这种小目标更看重它;mAP50-95更严格,更适合对比算法性能。如果mAP50已经到0.9但mAP50-95还在0.6以下,说明框虽然能框住油罐,但位置和边界还不够准,这时候可以试试调低置信度门限或者增加训练轮次。

训练结束后会生成runs/detect/train/weights/best.pt和last.pt,前者是验证集上表现最好的权重,后者是最后一次epoch的权重。实际使用中一定用best.pt,不要迷信last.pt。这里也有个玄学问题:有时候best.pt的mAP比last.pt高不少,但因为验证集只有100张,best也可能是过拟合验证集的产物。稳妥的做法是最后再看test集的表现,如果test集的mAP比val低很多,说明泛化有问题,需要回看是不是数据划分出了泄漏。

4.3 五个必踩的坑:现象、原因与解决办法

坑一:loss不下降,训练曲线一路横盘。现象是前几个epoch的box_loss就有几,十几个epoch过去纹丝不动。原因绝大多数是标签格式出了问题,比如YOLO的归一化坐标没有除以图片宽高,或者类别ID从1开始而names里只写了0。解决办法是把第2.2节那个坐标校验脚本跑一遍,查一下坐标范围是否在0到1之间,类别ID是否连续且从0开始;也可以用可视化工具把txt标签画到原图上,直接看框是否贴合油罐。

坑二:训练日志里出现大量"no labels found in train set"。现象是图片路径都有效,但YOLO提示所有图片都没有标签。原因是图片目录名不是images,或者标签目录里根本没有与图片同名的txt文件。解决办法是把目录命名调整为images和labels两兄弟,确保oil_tank_001.jpg对应labels/oil_tank_001.txt。注意大小写,YOLO在Linux下区分大小写,Images不等于images

坑三:验证集mAP很高,但把整张遥感大图喂进去一个目标都检测不到。现象是训练时mAP50到了0.9,推理大图时输出框为零。原因是训练和评估都用了小尺寸切片,而推理时整图直接被resize到640,油罐被压缩到十几个像素,池化之后特征全没了。解决办法分两步:第一步推理时把置信度门限从默认的0.25降到0.1,看看是不是有低置信度的框;第二步对大图做切片推理,先用滑窗切成512或640的小块,逐块检测后把结果映射回原图坐标,再按NMS合并重叠框。这一步是遥感小目标落地的关键,不能省。

坑四:训练中途报CUDA out of memory。现象是前几个epoch正常,突然显存爆掉。原因可能是batch太大,也可能是开了太多并行加载线程导致内存不足。解决办法是先把batch减半,从16降到8,再考虑把imgsz从640降到512。如果还不够,用nvidia-smi看显存占用,确认没有其他进程霸占显存。这里不要开着浏览器和视频软件就开训,浏览器挂十几个标签页能吃掉几个G显存。

坑五:train/val/test三个清单之间有重复图片。现象是训练loss高但验证loss很低,明显不合理。原因是划分脚本被运行了多次且没有清空旧输出,或者原始列表本身有重复。解决办法是在划分脚本末尾加三段断言,把三个集合两两做交集,只要有重复就直接报错,不要等到训练完才发现。

train_set = set(splits['train']) val_set = set(splits['val']) test_set = set(splits['test']) assert len(train_set & val_set) == 0, 'train和val有重复' assert len(train_set & test_set) == 0, 'train和test有重复' assert len(val_set & test_set) == 0, 'val和test有重复'

逻辑说明:把三个列表都转成set,用集合的交集运算符&计算共同元素数量。正常情况应该是0,一旦有重复就触发AssertionError,脚本在写文件之前停下来,避免带着脏数据去训练。注意这里需要把路径去重后再比较,因为绝对路径和相对路径即使指向同一个文件,字符串也不一样,所以划分脚本里要统一用同一套路径表示法。

参数说明:断言语句不需要额外参数,但如果你的数据集中有同一张图片复制成两个文件名的情况,set比较不会发现,因为文件名不同。这种情况更隐蔽,只能通过计算图片内容的哈希值去重,不过一般的数据集很少会出现这种问题。

5. 训练完怎么验证成果:用PR曲线和切片推理让结果真正落地

训练结束拿到best.pt,先用官方验证命令看一眼整体指标,同时生成PR曲线和混淆矩阵:

yolo val data=oil_tank.yaml model=runs/detect/train/weights/best.pt conf=0.25

逻辑说明:val子命令会在验证集上跑一遍,输出mAP50、mAP50-95,并保存PR曲线图。PR曲线的横轴是召回率,纵轴是精确率,曲线越靠近右上角说明模型越可靠。油罐检测这类单类任务,PR曲线比mAP数字更能说明问题:如果曲线在召回率0.8之前保持平直,到0.8之后急剧下降,说明有接近两成的油罐被漏掉,这时候需要降低置信度门限来换召回率。

参数说明:conf=0.25是推理时的置信度门限。调参技巧是:如果业务场景更看重"不能漏罐",就把conf降到0.1,代价是误检变多;如果更看重"报警就得准",就调到0.4以上。没有绝对正确的值,要看你的使用场景。我自己习惯把0.1到0.5每隔0.1测一轮,挑一个精确率和召回率的平衡点,再结合PR曲线决定。

真正的遥感大图推理,我强烈建议做切片。以一张5000×5000的原始影像为例,先按512×512滑窗切成大约100个小块,每块之间重叠64像素,然后把每个小块分别送入模型,检测出的框坐标加上窗口偏移,映射回原图坐标,最后用非极大值抑制把重叠区域的重复框合并。这个过程看起来简单,但窗口大小、重叠率、边缘裁剪都会影响结果。油罐直径在切片上的占比至少要有20像素,否则网络学到的特征不够用。如果切片后大多数油罐仍然小于32×32,就得考虑把imgsz提高到1024,或者换更擅长小目标的检测头。

切片推理之外,还有一个容易被忽略的验证动作:统计测试集上每个油罐框的置信度分布。置信度普遍在0.9以上,说明模型学得很确定;置信度大多在0.5左右徘徊,说明标注本身可能存在边缘不清的问题,比如油罐有没有把阴影包进去,不同标注者可能有不同理解。我现在的习惯是:每次标注新一批数据时,固定一个人统一规范,罐体用外接矩形,阴影不算目标,这样模型学到的特征才不会前后矛盾。

这个油罐数据集的方向值不值得投入,取决于你的任务颗粒度。如果只是做算法验证和课程设计,1000张图足够把YOLO的训练流程跑顺,三种格式标签也省去了写转换脚本的时间,完全够用。如果要做真实业务,比如能源设施巡护或违规占地监测,那1000张图明显偏少,尤其是不同分辨率、不同季节、不同云层遮挡的情况,模型会很快露馅。我的做法是把这个数据集当"冷启动种子",先跑通管线和基准指标,之后再用半自动标注扩展新样本:用训练好的模型打预标注,人工只修边界,效率能提升好几倍。

还有一点是我的个人习惯:每个训练项目都单独建一个目录,把data.yaml、train.txt、best.pt和PR曲线放进同一个文件夹,并写上备注用的是哪个种子、哪个划分脚本版本。因为训练时各种参数组合实在太多,光靠模型文件名区分迟早会记混。导出模型的时候也记得看一下输入尺寸,因为推理端如果用TensorRT或OpenVINO,输入的imgsz必须跟导出时一致,不然框的位置会整体偏移。这些小问题看起来不起眼,却在部署时浪费了我最多时间。这个数据集本身就是帮你跳坑的,把它用好,再往后扩展自己的数据时就能少踩不少雷。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/24 18:26:13

企业协作安全盲区:Teams社交工程、隐蔽后门与检测防御实践

Teams几乎已经是很多公司的“线上办公室”&#xff0c;打开电脑第一件事就是登录Teams&#xff0c;开会、传文件、聊工作、发通知全在这一个工具里。这个习惯本身没什么问题&#xff0c;但安全团队如果还把它当普通聊天工具看待&#xff0c;很容易忽视一条非常现实的攻击路径。…

作者头像 李华
网站建设 2026/9/24 18:25:47

Java团队转型AI应用开发:从CRUD思维到Agent工程化实战

“Java 团队转去做 AI 应用开发&#xff1f;那不是抛弃十几年积累的 Spring 生态&#xff0c;去跟 Python 那帮人抢饭吃吗&#xff1f;”——这是过去一年里&#xff0c;我听到最多的一句话。尤其是 2026 年这个节点&#xff0c;AI 应用和智能体&#xff08;Agent&#xff09;开…

作者头像 李华
网站建设 2026/9/24 18:24:05

YOLOv8门禁系统实战:从环境配置到边缘部署完整指南

简介&#xff1a;面向计算机视觉、人工智能等专业毕业设计或课程设计场景&#xff0c;这是一套基于YOLOv8的智能门禁系统&#xff0c;自带源码、数据集、可视化界面与部署教程&#xff0c;可快速搭建完整应用。压缩包共97个文件&#xff0c;以70个Python源码文件为主体&#xf…

作者头像 李华
网站建设 2026/9/24 18:23:09

三维重建:摄像头标定与双目立体校正的点云体积计算实战

简介&#xff1a;面向三维重建与视觉测量开发者&#xff0c;这份优质项目分享以双目摄像头为对象&#xff0c;完整演示了从摄像头标定、立体校正到点云生成与体积计算的闭环流程&#xff0c;涵盖机器人导航、增强现实等场景中的核心视觉技术。资源共5个文件&#xff0c;包含3个…

作者头像 李华