☰
集装箱缺陷识别数据集与YOLOv8目标检测训练部署全流程
2026/9/28 13:52:22 网站建设 项目流程

简介:面向集装箱表面缺陷自动检测的目标检测数据集,适合使用YOLOv5~YOLOv10、Faster RCNN、SSD等框架的深度学习开发者与工业质检项目。数据集聚焦四个缺陷类别:DAMAGE-DEFRAME、DENT、DAMAGE-RUST、DAMAGE-HOLE,标注文件已按训练集、验证集和测试集划分,并带有指定类别信息的yaml配置文件,可直接用于YOLO系列算法训练。压缩包共2000个文件,以1999个txt标签文件为主,txt标签记录目标类别与位置信息,yaml文件定义类别名称与ID,整体约365.77MB,组织清晰便于直接接入训练流程。已有554人浏览学习,适合集装箱外观缺陷识别、工业视觉检测算法验证等真实场景。下载即可获得现成的数据划分与统一标注格式,省去自行整理标签和拆分数据集的环节,能帮助快速启动目标检测模型训练和调优实验,便于在此基础上开展模型效果对比与迭代调优。

1. 集装箱缺陷识别数据集:从港口人工巡检到目标检测的必选题

集装箱缺陷识别是港口运营、航运保险和货损理赔绕不开的环节。传统人工巡检一箱要看几十个部位,效率低且漏检率高,而目标检测模型的介入让“相机代替人眼”成为可落地的方案。这里说的集装箱缺陷识别数据集,就是用来训练这一类目标检测模型的核心资产——它包含箱体表面凹坑、锈蚀、裂纹、孔洞、变形和门封破损等缺陷的标注图片。这篇文章瞄准的读者很具体:准备做港口智能巡检、集装箱验箱系统,或者接手这类项目但手里没有现成数据的人。全文会从数据集的结构分析一路讲到用 YOLOv8 训练自己的缺陷检测模型,并把训练与部署中的踩坑点逐一拆开,让新手能照着做,熟手能直接抄参数。

2. 先摸清数据集的底细:缺陷类别、标注规则与样本分布

2.1 集装箱常见的六类缺陷目标与判定边界

集装箱缺陷识别数据集的标签体系通常参考 IICL 检验标准,但实际落地时会按“是否影响适货性”和“视觉上是否容易判定”重新打包成目标检测的类别。我接触过的大多数项目,缺陷类别最终归成以下六类:

  1. 凹坑:外力撞击造成的壁面凹陷,重点标注凹陷区域的轮廓,而不是整面箱体。
  2. 锈蚀:漆面破损后的金属氧化,视觉上呈棕红色块,标注时要把颜色过渡带一并包含。
  3. 裂纹:结构件或壁板上的线状裂缝,通常细长、曲折,是目标检测里典型的困难样本。
  4. 孔洞:穿透箱体的破损,面积可大可小,孔洞边缘有毛刺时不能只框干净的破口。
  5. 变形:箱体整体结构扭曲,多见于角柱和底横梁,常与凹坑同时出现。
  6. 门封破损:门框、锁杆、密封条损坏,这类目标有固定的几何位置,模型学起来相对容易,但容易和锈蚀混淆。

判定边界是标注规范里最先要定的东西。比如凹坑面积小于多少平方厘米不算缺陷,锈蚀只影响漆面但未伤及钢板算不算,这些边界如果不统一,后面训练出来的模型在验收时会被人工复核打回。建议在标注前先做一轮“预标注试跑”:挑 50 张典型图,让标注员各自标一遍,再统一争议样本的判定口径。

传统工业视觉方案用 Halcon 做边缘检测和灰度阈值分割,在固定光照、固定机位的场景下确实能解决一部分问题。但这套方案对光照变化、表面反光和集装箱本身的大量加强筋纹理非常敏感,误报率很容易失控,这也是为什么现在做集装箱缺陷识别的项目基本都转向目标检测路线。开放词汇目标检测虽然能从通用的预训练模型里识别出凹坑、锈蚀这类概念,但集装箱缺陷是高度专业化的视觉形态,通用模型的召回率不够,必须用专用数据集微调。数据集的地位由此变得不可替代。

2.2 标注格式选型:VOC、COCO 还是 YOLO txt

目标检测的标注格式有三大家族,集装箱缺陷识别数据集在交付时通常混着给,但训练前必须统一成一套。

格式文件后缀坐标描述适用场景
VOC XML.xml绝对像素 xmin, ymin, xmax, ymax最早普及,LabelImg 默认输出
COCO JSON.json绝对像素 x, y, width, height检测/分割通用,COCO2017 数据集就是这种结构
YOLO txt.txt归一化 cx, cy, width, heightYOLO 系模型直读,Roboflow 也默认输出这种

三种格式本身没有优劣,主要看训练框架吃什么。YOLOv8 训练自己的数据集时,官方工具直接支持 YOLO txt 和 COCO JSON,但转换过程中最容易出错的环节是坐标归一化。COCO 存的是绝对值,YOLO 要的是相对图片宽高的 0~1 小数;COCO 的框是“左上角 + 宽高”,YOLO 的框是“中心点 + 宽高”。很多人从网上下数据集后直接跑训练,格式转换时把 cx 写成 x,或者漏掉除以宽高,训练出来的模型就变成玄学——loss 在降,但框全部偏到图外。

如果你的数据集来自不同标注工具(LabelImg、CVAT、Label Studio),建议在汇总时统一转成 YOLO txt。原因有三:第一,YOLO txt 是纯文本,任何脚本都能读;第二,它不依赖图片路径,换目录结构不会导致 XML 里的绝对路径失效;第三,Ultralytics 加载这种格式最快,减少训练前的数据预处理时间。这三条看着不起眼,实际做到位能省掉后面一大半的排错时间。

2.3 数据集的真实短板:类别不均衡与场景单一性

集装箱缺陷识别数据集最大的问题不是数量,而是分布。现实中锈蚀和凹坑占所有缺陷的 60% 以上,孔洞和门封破损加起来可能不到 5%。如果直接拿原始数据集训练,模型会倾向于输出大量“锈蚀”预测,因为这对损失函数来说是安全的。解决不均衡的常见做法有三种:

第一,过采样:对少数类图片做重复采样,让每个 epoch 里少数类出现的次数不低于某个下限。第二,损失加权:在检测头里按类别频率分配损失权重,工程量偏大。第三,复制粘贴增强:把少数类缺陷的像素块粘贴到正常集装箱表面,同时自动生成对应的标注框,这是目标检测里相对成熟的增强手段,只要粘贴位置不重叠箱体边缘,效果一般不错。

另一个短板是场景单一性。很多开源集装箱图片来自固定的港口堆场机位,视角、距离、光照都很一致,模型在这个场景里 mAP 可能很高,一旦换到另一家港口的不同机位,性能立刻跳水。这是目标检测模型微调崩了的典型原因之一,后面第 5 章会展开讲怎么用真实场景采样来弥补。

3. 把原始数据组装成可训练项目:目录结构、格式转换与划分

3.1 标准目录结构:图像与标签必须一一对应

用 YOLOv8 训练自己的数据集,第一步是把所有图片和标签按统一目录结构摆放。常见做法是:

datasets/ train/ images/ labels/ val/ images/ labels/ test/ images/ labels/

train 和 val 必须有 images 与 labels 两个子目录,每张图片对应一个同名 .txt 标签文件。图片是 jpg 还是 png 都行,但文件名不能有空格和中文,否则 Ultralytics 在加载时会因编码问题报错。test 目录在训练阶段不是必须的,但建议预留出来,用于最后一次验证。

这里多说一句:标签文件和图片必须同名,只有后缀不同。比如 container_001.jpg 对应的标签文件必须是 container_001.txt。不少人把标签文件名写错一个字符,训练时模型会把该图片当背景帧处理,拉低精度。这种问题在日志里几乎不会报错,排查起来很费时间。

3.2 用脚本把 COCO JSON 转成 YOLO txt

现在网上流传的集装箱缺陷识别数据集大多以 COCO 格式打包。我一般用下面这个 Python 脚本把它转成 YOLO txt,适用于按类别标注的检测任务:

# coco2yolo.py import json import os import cv2 from collections import defaultdict def convert(coco_json_path, img_dir, out_dir): """ 把 COCO JSON 标注转成 YOLO txt。 coco_json_path: COCO 标注文件 img_dir: 原图目录,用于读取真实宽高 out_dir: 输出的 labels 目录 """ with open(coco_json_path, 'r', encoding='utf-8') as f: coco = json.load(f) # 类别 id 重映射:COCO 的 id 可能不连续,压缩成 0 开始的连续编号 cat_id_map = {c['id']: i for i, c in enumerate(coco['categories'])} # 每个 image_id 对应一批标注 ann_by_img = defaultdict(list) for ann in coco['annotations']: ann_by_img[ann['image_id']].append(ann) os.makedirs(out_dir, exist_ok=True) for img in coco['images']: img_id = img['id'] # 用实际图片路径读取宽高,而不是标注里的宽高 img_path = os.path.join(img_dir, img['file_name']) h, w = cv2.imread(img_path).shape[:2] lines = [] for ann in ann_by_img.get(img_id, []): cls_id = cat_id_map[ann['category_id']] x, y, bw, bh = ann['bbox'] # COCO: 左上角 + 宽高 cx = (x + bw / 2) / w # 转 YOLO 中心点坐标 cy = (y + bh / 2) / h nw = bw / w nh = bh / h # 边界裁剪,防止标注越界导致损失计算异常 cx = max(0.0, min(1.0, cx)) cy = max(0.0, min(1.0, cy)) nw = max(0.0, min(1.0, nw)) nh = max(0.0, min(1.0, nh)) lines.append(f"{cls_id} {cx:.6f} {cy:.6f} {nw:.6f} {nh:.6f}") txt_name = os.path.splitext(img['file_name'])[0] + '.txt' with open(os.path.join(out_dir, txt_name), 'w', encoding='utf-8') as f: f.write('\n'.join(lines)) print(f"done: {len(coco['images'])} images, {out_dir}")

这段代码的关键点有三个。一是用 cv2 读取实际图片的宽高,而不是直接用 COCO 标注里的宽高。偶尔会有标注宽高和实际图片不一致的情形,统一以实际图片为准可以避免框整体偏移。二是对归一化后的坐标做了 0~1 裁剪,因为有的标注框会略微超界,超界坐标可能导致 YOLO 在计算框交并比时出现索引错误。三是类别 id 重映射,COCO 的 id 可能从 1 开始且中间有跳跃,YOLO 要求从 0 开始连续编号,否则后面 data.yaml 里的 nc 会设错。

参数方面,这个脚本没有额外外部参数,调用时填入三个路径即可。转换完成后,建议随机挑 30 张图把标注框画回图片上人工目检一遍,重点看框的位置和尺寸是否正常,这一步是廉价且可靠的质检手段。

3.3 数据划分脚本:train/val/test 的比例与随机种子

数据集划分也是一个容易翻车的地方。目标检测训练时通常不要求严格按场景分割,但 val 和 test 不能跟 train 来自同一批连续帧。如果用视频抽帧,相邻帧几乎一模一样,模型记住了训练集帧的纹理,val 上看着很好,实际部署全废。参考做法是:

# split_dataset.py import os import random import shutil random.seed(42) def split_dataset(src_img_dir, src_label_dir, out_root, train_ratio=0.7, val_ratio=0.2): """ 按图片名随机划分 train/val/test,并复制对应图片和标签。 """ images = [f for f in os.listdir(src_img_dir) if f.lower().endswith(('.jpg', '.jpeg', '.png'))] images.sort() # 先排序再 shuffle,保证可复现 random.shuffle(images) train_cnt = int(len(images) * train_ratio) val_cnt = int(len(images) * (train_ratio + val_ratio)) split_map = { 'train': images[:train_cnt], 'val': images[train_cnt:val_cnt], 'test': images[val_cnt:], } for split_name, img_names in split_map.items(): img_dst = os.path.join(out_root, split_name, 'images') lab_dst = os.path.join(out_root, split_name, 'labels') os.makedirs(img_dst, exist_ok=True) os.makedirs(lab_dst, exist_ok=True) for img_name in img_names: shutil.copy2(os.path.join(src_img_dir, img_name), os.path.join(img_dst, img_name)) label_name = os.path.splitext(img_name)[0] + '.txt' src_label = os.path.join(src_label_dir, label_name) if os.path.exists(src_label): shutil.copy2(src_label, os.path.join(lab_dst, label_name)) print(f"{split_name}: {len(img_names)} images") if __name__ == '__main__': split_dataset('raw_images', 'raw_labels', 'datasets')

train:val:test 用 7:2:1 是目标检测里比较保守的比例。如果你的集装箱缺陷数据集只有两千多张,test 可以再压缩到 5%,因为训练过程真正看的是 val,test 留给你最后一次人工验证。随机种子要固定,这样后面任何一次复现训练,划分结果都一致;否则换台机器重跑一次,模型好坏就分不清是数据变了还是代码变了。

4. 用 YOLOv8 把模型跑起来:训练命令与关键参数

4.1 最小可复现的训练命令

数据准备好了,接下来就是训练。我用的比较多的是 Ultralytics 提供的 YOLOv8,因为它对数据格式要求宽松,训练参数调整最直接。训练前先写一个 data.yaml:

# container_defect.yaml path: ../datasets # 数据集根目录,相对于当前工作目录 train: train/images # 训练图片目录,相对 path val: val/images # 验证图片目录,相对 path test: test/images # 测试图片目录,可选 # 类别数,必须和 labels 里的类别 id 范围匹配 nc: 6 # 类别名,顺序与 id 一一对应 names: 0: dent 1: corrosion 2: crack 3: hole 4: bend 5: door_damage

这里的 nc 是 6,如果你的转换脚本从 0 开始重映射了类别 id,那么 names 的索引也要从 0 排到 5。YOLO 只认 id 数字和 names 的对应关系,不会自己推断类别名。写错一个顺序,模型训练出来的结果就是类别错位的。

训练命令:

yolo train model=yolov8m.pt data=container_defect.yaml \ epochs=100 imgsz=1280 batch=8 lr0=0.001 \ project=runs/container_defect name=exp1

model=yolov8m.pt表示从预训练的 YOLOv8m 权重开始微调。集装箱外观与 COCO 里的目标差别较大,但预训练模型已经具备很强的边缘、纹理提取能力,从它开始微调比完全从头训快很多。imgsz=1280是关键参数,集装箱缺陷里的裂纹和孔洞在图片里往往只占几十个像素,按默认的 640 训练,这些关键小目标会被直接缩小到几乎不可见。batch=8在 1280 分辨率下对显存的要求是 16GB 左右,12GB 的卡把批次降到 4。lr0=0.001适合微调阶段,目标检测模型微调崩了,多半就是学习率没调;从随机权重训练用 0.01 没问题,但加载预训练权重后还按 0.01 跑,损失会在几十个迭代内飙上去。

如果你的老项目已经在用 YOLOv5,那训练流程几乎一样,把模型换成 yolov5mu.pt,参数语法稍微不同。SSD 检测器是更早一代的方案,小目标精度明显不如 YOLOv8,新项目不建议再选。

4.2 四个必须理解的训练参数:imgsz、batch、epochs 与增强策略

这四组参数里,imgsz 对最终精度影响最大,batch 对显存影响最大,epochs 决定训练是否收敛,增强策略决定泛化上限。

参数推荐值影响
imgsz1280(小缺陷多时)分辨率越高,小目标保留的像素越多,显存占用线性上涨
batch8(16GB 显存)越大梯度越稳,但受显存约束
epochs100~150集装箱缺陷类别较少,100 轮足够,再多容易过拟合
augmentTrue,可自定义决定模型对光照、天气、视角变化的鲁棒性

imgsz 的取舍要结合现场机位相机分辨率。如果用 500 万像素工业相机,原始图是 2448×2048,训练时直接缩到 640 会丢掉大量暗部细节。正确做法是保持 imgsz=1280 或更高,显存不够就先用小图跑前 50 轮,再用大图精调后 50 轮。Ultralytics 没有直接支持这种两阶段训练,但你可以把前 50 轮的 best.pt 当作下一轮训练的 pretrained 权重。

epochs 不建议一上来就设 300,先 100 轮看 val 曲线走势。如果 val mAP 在最后 20 轮还在上升,说明还没收敛,加 50 轮重跑;如果 50 轮之前就开始下降,说明过拟合了,这时要回退权重或加强数据增强。增强策略方面,集装箱缺陷场景最有用的是 HSV 扰动:港口光照变化极大,晴天阴影、阴天散射、夜间补光都会让缺陷颜色发生变化。YOLOv8 的默认增强里 hsv_v 亮度扰动偏低,我一般会从 0.4 调到 0.6,模拟更宽的亮度变化。

4.3 类别不平衡下的实操调整

数据集的类别分布我们前面说过,锈蚀和凹坑可能占了一大半,孔洞和门封破损是少数。遇到这种情况,先不急着处理,用默认损失跑一轮 50 轮的小实验看混淆矩阵。如果少数类大量被预测成背景或相邻类别,再动手调整。

调整方式有两条路线。一条是数据路线:对少数类图片做离线过采样,直接把少数类图片复制进 train/images,标签跟着复制,代价是模型会对重复图片过拟合。更有效的做法是复制粘贴增强,把少数类缺陷像素块粘贴到没有缺陷的集装箱表面图上,粘贴时加随机旋转和缩放,同时更新标注框。另一条是损失路线:在检测头里按类别频率对损失加权,实现上要改损失源码,适合有时间精调的人。我通常先做采样配平,不动损失函数,因为损失加权改变了训练目标,后期排查问题时会多一个变量。

5. 训练与部署避坑清单:六个典型翻车现场

5.1 损失下降但 mAP 不动:背景框污染

现象:loss 稳定下降,train 的 mAP 持续走高,但 val 的 mAP 在 0.1 以下徘徊。目标检测模型微调崩了,最常见的就是这种。

原因:数据集的 labels 里有大量空标签文件,也就是 txt 存在但里面没有一行,或者某个类别 id 超出 nc 范围。这些空标签文件会让模型把这批图片当作背景,val 阶段背景误报率高,mAP 自然上不去。

解决:训练前写一个检查脚本,遍历 train 和 val 的 labels 目录,统计每个 txt 的行数和类别 id 是否越界。空标签文件直接删除对应图片或标签,越界 id 按重映射规则修正。还有另一个隐藏坑:做复制粘贴增强生成新图片时,如果原图本身已有目标,记得把原目标和新目标都写入同一个 txt,不要覆盖。

5.2 小缺陷框全部乱飞:imgsz 与原始分辨率不匹配

现象:肉眼能看清的裂纹模型检测不出来,或者检测出一堆 90×90 像素的小框叠在整面箱体上。

原因:默认 640 训练分辨率下,原始图里 20×20 像素的裂纹被缩到 5×5 像素以下,在特征图上只剩 1 个像素,检测头根本分辨不出来。箱体表面纹理和加强筋在这尺度下看起来跟裂纹一样。

解决:第一步提高 imgsz 到原始分辨率的 1/2 以上,例如 1280。第二步考虑切片推理:把原始大图切成 4 份或 9 份,每份单独送入模型,再把结果合并到整图坐标。这种滑窗推理方案在遥感图像目标检测中很常用,移植到集装箱缺陷上同样有效。如果推理设备性能不足,可以在离线阶段用高分辨率切片推理处理视频帧,再把结果存成带坐标的 JSON,而不是每帧实跑。

5.3 验证集 mAP 高但现场漏检多:标注框过紧或类别边界不清

现象:验证集 mAP 0.85 以上,上到港口机位后 30% 缺陷漏检,人工复核发现模型预测框普遍比标注框小一圈。

原因:标注框画得太紧,只框了缺陷最明显的区域,而现场缺陷有扩散带。比如锈蚀周边的漆面起泡,当缺陷处于早期阶段时,模型看到的特征只有标注框外的一圈边缘,与训练时的正样本不匹配,置信度就低。

解决:标注规范里就写明,每个缺陷框外扩 5~10% 作为缓冲区,让模型学到缺陷与背景的过渡带。如果数据已经标注完不想全部重标,可以在训练时对标注框做随机扩充。YOLOv8 的 scale 增强默认是 0.9 到 1.1 倍随机缩放,调成 0.7~1.3 可以缓解。

5.4 同一缺陷被重复检出多个框:NMS 阈值与类别混淆

现象:一个凹坑同时输出四五个重叠框,且类别各不相同,有的标成 dent,有的标成 bend。

原因:标注数据里同一缺陷被多个标注员重复标了,且相邻类别边界没统一。例如凹坑严重到一定深度后,标注员 A 标 dent,标注员 B 标 bend。模型学到的是两个类别同时存在的概率分布,推理时就会输出多个类别。

解决:第一步在标注数据里把这类争议样本双人复核,统一规则:只有涉及箱体结构整体变形的才标 bend,局部凹陷一律标 dent。第二步在推理阶段调整 NMS 的 IOU 阈值。Ultralytics 里 NMS 的 iou 参数默认 0.7,重叠框 IOU 大于 0.7 才会被合并,对密集重叠情况可以降到 0.5。需要说明的是,降低 NMS 阈值会一并把相邻缺陷的正确框合并掉,要结合现场人工复核来判断,不要盲目调低。

5.5 训练时显存溢出:batch、图像缓存与 worker 数量的取舍

现象:batch 设 8,imgsz 1280,训练到第 5 个 epoch 时显存直接 OutOfMemory,进程被杀。

原因:数据加载器用 Mosaic 增强时会把 4 张图拼成一张大图,如果 imgsz 是 1280,Mosaic 合成画布尺寸接近 2560×2560,显存需求暴增。YOLOv8 默认每批次还会把图像缓存到显存做 preload,进一步加大压力。

解决:优先把 batch 降到 4 或 2。如果 batch 不能降,第二选择是关掉 Mosaic 增强,在增强配置里把 mosaic 设为 0,但会显著影响小目标学习。第三选择是打开 cache=False,让图像在内存而不是显存中做缓存,训练速度会下降,但显存压力小很多。显存 12GB 的机器,imgsz=1280、batch=4、cache=False 是可以跑通的。

5.6 微调阶段损失异常上升:学习率与零面积标注框

现象:加载预训练权重开始微调,前 3 个 epoch 损失不降反升,之后爆炸成 NaN。

原因:最常见的是学习率太高。yolov8m.pt 的权重分布已经稳定,lr0=0.01 时反向传播的梯度会把 BN 层统计量打乱,损失在几十个迭代内飙升。另一个隐藏原因是数据集的标注框有大量 0 宽度或 0 高度,这些框在损失计算里会触发除零,变成 NaN。

解决:把 lr0 降到 0.001,必要时加一个 warmup。训练前用脚本过滤掉宽高小于 3 像素的标注框。同时检查标签文件里有没有空行、尾行空格、非 ASCII 字符,这些字符在读取时会让数据加载器静默失败,表现为一个 epoch 的损失突然跳到几千。

6. 验证与部署最后一公里:混淆矩阵、现场采样与推理留后手

6.1 用混淆矩阵看漏检与误检的方向

训练结束后不要只看 mAP。mAP 是加权综合指标,它不告诉你模型到底在哪个类别上翻车。正确做法是先跑一组推理验证,把 val 集的预测结果和真实标注对齐,画混淆矩阵。混淆矩阵横轴是真实类别,纵轴是预测类别,对角线是正确预测,对角线外是混检。如果“孔洞”这一列大量落在“背景”行,说明模型完全漏检;如果“锈蚀”这一列大量落在“裂纹”行,说明两个类别的边界没划清。

针对混淆矩阵里最大的几个混检块,下一步有两条路:一是回到标注数据,把两类的判定边界重新统一,人工复核标注;二是针对混检对做难例挖掘,把模型预测置信度在 0.3~0.7 之间的困难样本挑出来,加入训练集。我通常先走第一条,因为标注统一带来的收益往往超过调模型。

6.2 现场采样验证:固定机位、连续帧采样与人工复核

现场验证最容易犯的错误是把模型拿到新场景直接看几个视频片段就下结论。正式的流程是:固定机位,连续拍摄 1 小时以上,按 5 秒间隔抽帧,避免相邻帧过于相似;抽出的帧全部跑模型推理,保留预测框和置信度;最后人工复核模型漏掉的和错检的框。

人工复核这一环不能省。集装箱缺陷识别的现场背景复杂,箱号、集装箱锁具、加强筋都会产生误检。人工复核的结果要按漏检率和误检率分别记录,并统计两类错误对应图像特征。这样一来,误检和漏检的定位就很清楚,下一步是去补数据还是调阈值,方向不会错。

6.3 推理阈值、NMS 与边缘部署的后悔药

部署到现场后,把模型权重导出成 TensorRT 或 ONNX,推理速度能提升 3~5 倍。边缘设备或者单片机上的目标检测一般只能用 int8 量化的模型,量化后精度掉 1~3 个点,对缺陷检测这个场景完全可以接受。

关键是要给现场调试留后悔药。部署系统里至少要能调两个参数:置信度阈值 conf 和 NMS 的 IOU 阈值。现场光照变化大的时候,我一般这么调:白班 conf=0.4,夜班补光后 conf=0.3,因为夜间补光会削弱缺陷特征;IOU 保持 0.5。如果现场出现大面积重叠框,IOU 调到 0.4;如果出现漏检,调低 conf 而不是调低 IOU,两者对误报的影响不同。

还有一件事必须做:把每次现场复核的图片主动收集到一个“现场难例集”里,每周回灌训练集做增量训练。集装箱缺陷识别的难点从来不在模型结构,而在于你能不能持续获取并标注接近现场分布的数据。这个习惯救了我不少项目,也希望帮到你。

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询