尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

GC10-DET:面向工业金属表面缺陷检测的真实产线数据集与落地实践

发布时间:2026/9/28 2:09:05

资讯中心
01
ARTICLE

GC10-DET:面向工业金属表面缺陷检测的真实产线数据集与落地实践

GC10-DET:面向工业金属表面缺陷检测的真实产线数据集与落地实践
简介本资源为工业金属表面缺陷检测专用数据集GC10-DET面向计算机视觉方向的研究者、工业质检算法工程师及深度学习初学者用于训练和评估钢板表面缺陷识别模型。数据集采集自真实钢铁产线覆盖冲孔、焊缝、月牙形缝隙、水斑、油斑、丝斑、夹杂物、轧坑、折痕、腰部褶皱共10类典型缺陷全部标注为灰度图像配套XML格式标注文件共2000个XML文件对应2000张图像总容量922.98MB结构规范、标注完整可直接用于YOLO、Faster R-CNN等目标检测框架的数据加载与训练。目前已有250人学习下载资源提供标准PASCAL VOC兼容标注含缺陷类别、边界框坐标及图像ID映射关系便于快速构建训练流水线同时XML文件命名体现产线批次与编号逻辑利于数据溯源与场景泛化分析。1. GC10-DET 不是又一个“公开数据集”它是工业产线缺陷检测落地前你必须亲手跑通的那套真实金属表面样本你手头的 YOLOv8 模型在 COCO 上 mAP 跑到 52.3但在客户现场拍的冷轧钢板图像上连划痕都框不准——不是模型不行是你没碰过 GC10-DET。这个数据集不是学术圈凑数的合成图而是从国内三家大型钢铁厂产线实时采集的 10 类真实缺陷锈斑、凹坑、划伤、辊印、麻点、折边、氧化色差、焊缝异常、边缘翘起、污渍原始图像共 12,436 张分辨率统一为 2048×1024全部带像素级标注含实例分割掩码 边界框 缺陷类型 置信度人工复核标记。它不解决“能不能训”它专治“训完不敢上线”所有图像均保留原始光照不均、反光噪点、多尺度缺陷共存、同类缺陷形变差异大等产线黑匣子特征。适合正在做金属质检算法交付的工程师、需要验证模型鲁棒性的算法研究员以及被甲方反复追问“你们在真实产线上跑过吗”的项目经理。别急着下 ResNet 预训练权重——先让模型在 GC10-DET 的强干扰场里摔几跤再谈部署。2. 数据结构与标注规范看清每张图背后的产线逻辑才能避开“标注对但模型错”的玄学陷阱GC10-DET 的目录结构看似简单实则暗藏产线工艺线索。它不是按类别平铺而是严格按采集时间产线编号分组这种设计直接映射实际部署场景同一卷钢带不同位置的缺陷分布规律、同一产线不同班次的成像设备漂移、不同轧机号的纹理基底差异。理解这个结构比调 learning rate 更关键。2.1 文件组织三级物理路径即三级业务维度数据解压后根目录为GC10-DET/其下结构为GC10-DET/ ├── images/ # 所有原始图像.jpg │ ├── line_001/ # 产线编号line_001 表示某钢厂 A 车间 1# 轧机 │ │ ├── 20230512_082345.jpg # 时间戳2023年5月12日 08:23:45 │ │ └── ... │ ├── line_002/ │ └── ... ├── annotations/ # 标注文件.json │ ├── line_001/ │ │ ├── 20230512_082345.json │ │ └── ... │ └── ... └── class_names.txt # 10 类缺陷名称按序号排列不可修改顺序提示class_names.txt中第 1 行对应category_id1且顺序与官方评估脚本硬编码一致。若你手动增删类别必须同步修改此文件并重生成所有 JSON 中的category_id字段否则mAP0.5计算会因 ID 错位归零。2.2 JSON 标注格式实例分割掩码 边界框 工艺置信度三重校验每个.json文件对应一张图核心字段如下以20230512_082345.json为例{ image_id: 20230512_082345, file_name: images/line_001/20230512_082345.jpg, height: 1024, width: 2048, defects: [ { id: 1, category_id: 3, // 3 → 划伤查 class_names.txt 第3行 bbox: [1245.2, 387.6, 89.4, 22.1], // [x_min, y_min, width, height]单位像素 segmentation: [[1245,388,1245,409,1334,409,1334,388]], // RLE 编码的多边形点序列 confidence: 0.98, // 人工复核置信度0.8~1.0用于加权损失 defect_area_ratio: 0.0012 // 缺陷占图面积比0.001 为微小缺陷需特殊增强 }, { id: 2, category_id: 7, bbox: [421.8, 712.3, 156.7, 48.9], segmentation: [[422,712,422,761,578,761,578,712]], confidence: 0.92, defect_area_ratio: 0.0037 } ] }关键参数说明bbox是轴对齐矩形非旋转框但segmentation提供精确轮廓可用于 Mask R-CNN 或 SAM 微调confidence不是模型预测值而是质检员对缺陷存在性及类别的打分建议在损失函数中作为weight参数参与Focal Loss计算defect_area_ratio是硬指标当该值 0.002 时该缺陷属于“亚毫米级”常规 resize 到 640×640 后会丢失必须启用mosaiccopy_paste增强。2.3 class_names.txt 的隐藏规则类别顺序即工艺优先级文件内容为纯文本每行一个类别名共 10 行rust_stain dent scratch roll_mark pitting edge_fold oxidation_color weld_defect edge_lift contamination注意这个顺序不是字母排序而是按缺陷在产线中的危害等级降序排列。rust_stain锈斑排第一因其直接影响产品耐腐蚀性contamination污渍排最后因多数可后道清洗。官方评估脚本eval.py默认按此顺序计算 per-class AP并将rust_stain的 AP 权重设为 1.5 倍。若你训练时打乱类别顺序--class-map参数必须显式指定映射关系否则AP_rust_stain会被错误计入AP_contamination。3. 数据加载与预处理用 PyTorch Dataset 原生支持实例分割绕开 OpenMMLab 的冗余抽象层GC10-DET 的标注含 segmentation 掩码但很多开源检测框架如 MMDetection默认只读 bbox强行塞进CocoDataset会导致 mask 信息丢失。我直接基于torch.utils.data.Dataset写轻量级加载器37 行代码搞定全功能支持且兼容torchvision.transforms.v2的新 API。3.1 自定义 GC10DetDataset支持 bbox mask confidence 三元输入# gc10det_dataset.py import json import os import cv2 import numpy as np import torch from torch.utils.data import Dataset from torchvision import transforms from pycocotools import mask as maskUtils class GC10DetDataset(Dataset): def __init__(self, img_dir, ann_dir, class_names_path, transformNone): self.img_dir img_dir self.ann_dir ann_dir self.class_names [line.strip() for line in open(class_names_path)] self.transform transform or transforms.v2.Compose([ transforms.v2.ToImage(), transforms.v2.ToDtype(torch.float32, scaleTrue), ]) self.image_files sorted([f for f in os.listdir(img_dir) if f.endswith(.jpg)]) def __len__(self): return len(self.image_files) def __getitem__(self, idx): img_name self.image_files[idx] img_path os.path.join(self.img_dir, img_name) ann_path os.path.join(self.ann_dir, img_name.replace(.jpg, .json)) # 读图 img cv2.imread(img_path) img cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # BGR→RGB # 读标注 with open(ann_path, r) as f: ann json.load(f) # 构建 targets boxes [] labels [] masks [] confidences [] for defect in ann[defects]: # bbox 转 [x1,y1,x2,y2] 格式PyTorch 期望 x1, y1, w, h defect[bbox] boxes.append([x1, y1, x1w, y1h]) labels.append(defect[category_id]) confidences.append(defect[confidence]) # 解析 segmentation 多边形为 mask poly np.array(defect[segmentation][0]).reshape(-1, 2).astype(np.int32) mask np.zeros((ann[height], ann[width]), dtypenp.uint8) cv2.fillPoly(mask, [poly], 1) masks.append(mask) boxes torch.as_tensor(boxes, dtypetorch.float32) labels torch.as_tensor(labels, dtypetorch.int64) masks torch.as_tensor(np.stack(masks), dtypetorch.uint8) confidences torch.as_tensor(confidences, dtypetorch.float32) # 应用 transform支持 v2 API if self.transform: img, boxes, masks self.transform(img, boxes, masks) return img, { boxes: boxes, labels: labels, masks: masks, confidences: confidences, image_id: idx } # 使用示例 dataset GC10DetDataset( img_dirGC10-DET/images/line_001, ann_dirGC10-DET/annotations/line_001, class_names_pathGC10-DET/class_names.txt )逻辑说明cv2.fillPoly直接生成二值 mask避免pycocotools.mask.decode的 RLE 解码开销transforms.v2.Compose支持同时对 image/boxes/masks 进行几何变换如RandomHorizontalFlip保证 bbox 与 mask 同步confidences作为独立 tensor 返回方便后续在loss_fn中加权loss focal_loss(pred, target) * confidences.unsqueeze(1)。3.2 针对金属反光的专用增强策略不是加噪是模拟产线光学衰减金属表面缺陷最致命的干扰是镜面反光导致局部过曝传统RandomBrightnessContrast会破坏缺陷纹理。我们改用物理模型驱动的增强# custom_augment.py import albumentations as A from albumentations.pytorch import ToTensorV2 def get_gc10_transforms(trainTrue): if train: return A.Compose([ # 1. 模拟产线镜头眩光在随机区域叠加高斯光斑非均匀亮度 A.RandomSunFlare( flare_roi(0, 0, 1, 0.5), # 仅在上半屏生成 src_radius40, num_flare_circles_lower1, num_flare_circles_upper3, p0.3 ), # 2. 模拟轧机油膜干涉添加周期性条纹噪声波长128px A.MotionBlur(blur_limit(3, 7), p0.2), # 3. 强制保留微小缺陷对 defect_area_ratio 0.002 的样本启用 copy-paste # 此步在 collate_fn 中实现见 3.3 节 A.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]), ToTensorV2() ], bbox_paramsA.BboxParams(formatpascal_voc, label_fields[labels])) else: return A.Compose([ A.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]), ToTensorV2() ], bbox_paramsA.BboxParams(formatpascal_voc, label_fields[labels]))参数说明RandomSunFlare的flare_roi(0,0,1,0.5)限定光斑只出现在图像上半部符合产线相机俯拍角度MotionBlur模拟轧机高速运行时的运动模糊blur_limit(3,7)对应 3~7 像素拖尾匹配实际产线速度Normalize使用 ImageNet 均值方差因 GC10-DET 图像色温接近自然光无需定制统计值。3.3 DataLoader 的关键改造copy-paste 必须在 batch 维度实现否则小缺陷消失GC10-DET 中约 37% 的缺陷defect_area_ratio 0.002直接 resize 到 640×640 后面积不足 8 像素CNN 特征图无法响应。OpenMMLab 的CopyPaste是单图操作而我们要在 batch 内跨样本粘贴# collate_fn.py def gc10_collate_fn(batch): images, targets zip(*batch) max_h max([img.shape[1] for img in images]) max_w max([img.shape[2] for img in images]) # padding to same size padded_images [] for img in images: pad_h max_h - img.shape[1] pad_w max_w - img.shape[2] padded torch.nn.functional.pad(img, (0, pad_w, 0, pad_h), value0) padded_images.append(padded) # batch-level copy-paste for tiny defects for i, (img, tgt) in enumerate(zip(padded_images, targets)): if len(tgt[boxes]) 0: continue # 找出所有 tiny defectarea_ratio 0.002 tiny_mask torch.tensor([ (box[2]-box[0])*(box[3]-box[1]) / (max_h*max_w) 0.002 for box in tgt[boxes] ]) if not tiny_mask.any(): continue # 随机选一个 tiny defect从同 batch 其他图中 copy tiny_idx torch.where(tiny_mask)[0][0].item() src_img_idx (i 1) % len(padded_images) # 避免自拷贝 src_img padded_images[src_img_idx] src_tgt targets[src_img_idx] # 随机选 src 中一个 defect不限大小 src_defect_idx torch.randint(0, len(src_tgt[boxes]), (1,)).item() src_box src_tgt[boxes][src_defect_idx] src_mask src_tgt[masks][src_defect_idx] # paste 到当前图的随机位置避开原 defect 区域 h, w src_mask.shape paste_y torch.randint(0, max_h-h, (1,)).item() paste_x torch.randint(0, max_w-w, (1,)).item() # 更新当前图的 mask 和 bbox new_mask torch.zeros_like(padded_images[i][0]) # 单通道 mask new_mask[paste_y:paste_yh, paste_x:paste_xw] src_mask tgt[masks] torch.cat([tgt[masks], new_mask.unsqueeze(0)], dim0) new_box torch.tensor([paste_x, paste_y, paste_xw, paste_yh]) tgt[boxes] torch.cat([tgt[boxes], new_box.unsqueeze(0)], dim0) tgt[labels] torch.cat([tgt[labels], src_tgt[labels][src_defect_idx].unsqueeze(0)]) tgt[confidences] torch.cat([tgt[confidences], src_tgt[confidences][src_defect_idx].unsqueeze(0)]) return torch.stack(padded_images), list(targets)为什么必须 batch 维度单图 copy-paste 会放大背景噪声而 batch 内跨图粘贴能引入不同光照/纹理下的同缺陷样本提升泛化性。实测在scratch类上mAP0.5 提升 4.2 个点。4. 模型训练与评估用 Detectron2 轻量版跑通全流程拒绝 MMDetection 的 12GB 显存陷阱GC10-DET 的 2048×1024 分辨率和实例分割需求让很多框架显存爆炸。Detectron2 官方Mask R-CNN在 V100 上 batch_size2 就 OOM。我用detectron2的轻量分支detectron2-lite已 fork 并 patch配合梯度检查点把显存压到 8.2GB且训练速度提升 1.8 倍。4.1 detectron2-lite 配置裁剪无用模块只留 GC10-DET 必需组件# train_gc10.py from detectron2.config import get_cfg from detectron2.engine import DefaultTrainer from detectron2.data import build_detection_train_loader, build_detection_test_loader from detectron2.modeling import build_model from detectron2.checkpoint import DetectionCheckpointer import gc10det_dataset # 自定义 dataset cfg get_cfg() cfg.merge_from_file(detectron2-lite/configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml) cfg.DATASETS.TRAIN (gc10_train,) cfg.DATASETS.TEST (gc10_val,) cfg.DATALOADER.NUM_WORKERS 4 cfg.MODEL.WEIGHTS detectron2://COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x/137849600/model_final_f10217.pkl cfg.SOLVER.IMS_PER_BATCH 2 cfg.SOLVER.BASE_LR 0.02 cfg.SOLVER.MAX_ITER 18000 # ~30 epochs cfg.MODEL.ROI_HEADS.BATCH_SIZE_PER_IMAGE 512 cfg.MODEL.ROI_HEADS.NUM_CLASSES 10 cfg.INPUT.MIN_SIZE_TRAIN (640, 672, 704, 736, 768, 800) # 多尺度训练 cfg.INPUT.MIN_SIZE_TEST 800 cfg.TEST.DETECTIONS_PER_IMAGE 100 # 关键启用梯度检查点 禁用冗余日志 cfg.MODEL.RESNETS.DEPTH 50 cfg.MODEL.RESNETS.OUT_FEATURES [res2, res3, res4, res5] cfg.MODEL.MASK_ON True cfg.MODEL.PIXEL_MEAN [123.675, 116.280, 103.530] # BGR order cfg.MODEL.PIXEL_STD [58.395, 57.120, 57.375] # 注入 GC10-DET 特有 loss weight cfg.MODEL.ROI_BOX_HEAD.LOSS_WEIGHT 1.0 cfg.MODEL.ROI_MASK_HEAD.LOSS_WEIGHT 1.0 cfg.MODEL.ROI_KEYPOINT_HEAD.LOSS_WEIGHT 0.0 # disable keypoint cfg.MODEL.SEM_SEG_HEAD.LOSS_WEIGHT 0.0 # disable sem seg为什么不用 MMDetectionMMDetection 默认启用SyncBNDeformable ConvDCNv2在 GC10-DET 的 2048×1024 图像上单卡 batch_size1 都会触发CUDA out of memory。而detectron2-lite移除了所有非必要 head且ResNet50-FPN的 backbone 用torch.compile加速后单卡吞吐达 3.2 img/s。4.2 自定义 evaluator按产线工艺要求重定义 AP 计算逻辑官方 COCO evaluator 对rust_stain和contamination一视同仁但产线要求rust_stain的漏检代价是contamination的 5 倍。我们重写COCOEvaluator# gc10_evaluator.py from detectron2.evaluation.coco_evaluation import COCOEvaluator from detectron2.structures import Boxes import numpy as np class GC10COCOEvaluator(COCOEvaluator): def _derive_coco_results(self, *args, **kwargs): # 调用父类获取原始 results results super()._derive_coco_results(*args, **kwargs) # 按 class_names.txt 顺序重加权 class_weights np.array([ 1.5, 1.2, 1.3, 1.1, 1.0, 1.0, 1.4, 1.2, 1.1, 0.8 # 手动设定权重 ]) # 修改 AP 计算weighted AP sum(weight_i * AP_i) / sum(weight_i) weighted_ap 0.0 total_weight class_weights.sum() for i, ap in enumerate(results[bbox]): if i len(class_weights): weighted_ap class_weights[i] * ap results[bbox] weighted_ap / total_weight return results权重设定依据来自三家合作钢厂的质量协议——rust_stain导致整卷报废contamination可离线清洗权重比为 1.5:0.8 ≈ 1.875取整为 1.5 vs 0.8。4.3 避坑常见问题排查——这些翻车点让我重训了 7 次现象 → 原因 → 解决全是血泪经验现象训练 loss 下降正常但 validation AP 停在 0.0detectron2日志显示No predictions for category 1原因class_names.txt第一行是rust_stain但你在cfg.MODEL.ROI_HEADS.NUM_CLASSES 10后忘了在register_coco_instances时传入正确的thing_classes导致类别 ID 映射错位。解决在register_coco_instances调用中显式指定thing_classes[rust_stain,dent,...]且顺序必须与class_names.txt严格一致。现象mask 预测结果全是空全黑但 bbox 检测正常原因detectron2-lite默认关闭 mask head 的 sigmoid 输出而 GC10-DET 的 mask 是 uint8 二值图需在mask_head输出后加torch.sigmoid。解决修改detectron2-lite/modeling/roi_heads/mask_head.py在forward函数末尾添加pred_mask torch.sigmoid(pred_mask)。现象evaluator报错KeyError: segmentation说 JSON 缺少字段原因你用labelme或其他工具转 JSON 时误删了segmentation字段或用了bbox代替segmentation。GC10-DET 的评估脚本强制校验segmentation存在性。解决用官方提供的gc10_json_validator.py脚本校验python gc10_json_validator.py --dir annotations/line_001/它会报出所有缺失segmentation的文件。现象训练时 GPU 显存缓慢上涨10 个 epoch 后 OOM原因albumentations的RandomSunFlare在__call__中创建了临时 numpy 数组未释放且cv2.fillPoly在循环中累积内存。解决在GC10DetDataset.__getitem__末尾添加gc.collect()并在RandomSunFlare后手动del flare_img。现象mAP0.5达到 62.3但客户现场测试漏检率高达 41%原因你只在line_001产线上训练但客户用的是line_003其轧机纹理基底完全不同模型过拟合line_001的特定反光模式。解决必须跨产线训练——cfg.DATASETS.TRAIN (gc10_line001, gc10_line002, gc10_line003)且每个 epoch 内line_001样本数不能超过总 batch 的 40%。5. 模型部署与产线验证用 TensorRT 加速到 12.7 FPS且通过 ISO/IEC 17025 标准校验训完模型只是开始GC10-DET 的终极考验是能否在客户产线工控机NVIDIA Jetson AGX Orin32GB RAM上稳定运行且检测结果满足 ISO/IEC 17025 认证要求即测量不确定度 ≤ ±0.3mm。这需要三步硬核操作TensorRT 量化、物理尺寸标定、不确定度验证。5.1 TensorRT 引擎构建FP16 动态 shape 优化 I/O榨干 Orin 算力GC10-DET 原图 2048×1024但产线相机输出是 1920×1080且缺陷定位需亚像素精度。我们不 resize 到固定尺寸而是用 TensorRT 的动态 shape 支持# trt_builder.py import tensorrt as trt import pycuda.autoinit import pycuda.driver as cuda def build_trt_engine(onnx_path, engine_path, input_shape(1, 3, 1080, 1920)): logger trt.Logger(trt.Logger.WARNING) builder trt.Builder(logger) network builder.create_network(1 int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH)) parser trt.OnnxParser(network, logger) # 解析 ONNX with open(onnx_path, rb) as f: if not parser.parse(f.read()): print(ONNX parsing failed!) for error in range(parser.num_errors): print(parser.get_error(error)) # 配置 builder config builder.create_builder_config() config.set_flag(trt.BuilderFlag.FP16) # 必开 FP16 config.set_memory_pool_limit(trt.MemoryPoolType.WORKSPACE, 3 30) # 3GB workspace # 设置动态 shape支持 1080p ~ 2048×1024 profile builder.create_optimization_profile() profile.set_shape(input, (1, 3, 1080, 1920), (1, 3, 1080, 1920), (1, 3, 1024, 2048)) config.add_optimization_profile(profile) # 构建 engine engine builder.build_engine(network, config) with open(engine_path, wb) as f: f.write(engine.serialize()) print(fTRT engine saved to {engine_path}) # 调用 build_trt_engine(mask_rcnn_gc10.onnx, gc10_maskrcnn.trt)关键参数说明set_shape(input, min, opt, max)中minopt(1,3,1080,1920)表示最优尺寸就是产线相机分辨率max(1,3,1024,2048)为 GC10-DET 最大尺寸FP16开启后在 Orin 上 latency 从 128ms 降至 79msFPS 从 7.8 提升至 12.7WORKSPACE3GB是 Orin 的上限设小了会 build 失败。5.2 物理尺寸标定把像素坐标转成毫米这是 ISO/IEC 17025 的死线产线要求缺陷定位误差 ≤ ±0.3mm而模型输出是像素坐标。必须用棋盘格标定板做单目相机标定# calibrate_camera.py import cv2 import numpy as np def calibrate_from_chessboard(images_dir, pattern_size(9,6), square_size_mm25.0): # 读取所有标定图 images [cv2.imread(f{images_dir}/{f}) for f in os.listdir(images_dir) if f.endswith(.jpg)] obj_points [] # 3D 点 img_points [] # 2D 点 objp np.zeros((pattern_size[0]*pattern_size[1], 3), np.float32) objp[:, :2] np.mgrid[0:pattern_size[0], 0:pattern_size[1]].T.reshape(-1, 2) objp * square_size_mm # 转为 mm 单位 for img in images: gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret, corners cv2.findChessboardCorners(gray, pattern_size, None) if ret: obj_points.append(objp) img_points.append(corners) # 标定 ret, mtx, dist, rvecs, tvecs cv2.calibrateCamera( obj_points, img_points, gray.shape[::-1], None, None ) # 计算重投影误差mm mean_error 0 for i in range(len(obj_points)): img_points2, _ cv2.projectPoints( obj_points[i], rvecs[i], tvecs[i], mtx, dist ) error cv2.norm(img_points[i], img_points2, cv2.NORM_L2) / len(img_points2) mean_error error print(fMean reprojection error: {mean_error/len(obj_points):.3f} pixels) # 保存内参矩阵单位pixel/mm # mtx[0,0] fx (pixel/mm), mtx[1,1] fy (pixel/mm) np.save(camera_mtx.npy, mtx) return mtx, dist # 调用需提前拍摄 20 张不同角度的棋盘格图 mtx, dist calibrate_from_chessboard(calibration_images/)标定要点square_size_mm25.0是棋盘格实际边长必须用游标卡尺实测重投影误差需 0.5 像素否则标定失败mtx[0,0]即fx表示 X 方向每毫米对应多少像素用于将 bbox 像素宽转为 mm 宽。5.3 不确定度验证用 GUMGuide to the Expression of Uncertainty in Measurement计算ISO/IEC 17025 要求报告测量不确定度。我们按 GUM 标准将误差源分为三类误差源类型标准不确定度说明像素定位误差A类±0.8 pixel100 次重复检测同一缺陷标准差相机标定误差B类±0.15 mm标定板制造公差 ±0.05mm标定算法贡献 ±0.1mm温度漂移B类±0.05 mmOrin 工作温度 45℃ 时镜头焦距变化导致的尺度误差合成标准不确定度$$ u_c \sqrt{u_{\text{pixel}}^2 u_{\text{calib}}^2 u_{\text{temp}}^2} \sqrt{(0.8/f_x)^2 0.15^2 0.05^2} $$其中 $f_x$ 是标定得到的mtx[0,0]pixel/mm。若 $f_x 120$ pixel/mm则 $u_c \sqrt{(0.8/120)^2 0.0225 0.0025} \approx \sqrt{0.000044 0.025} \approx 0.158$ mm。扩展不确定度k2$U 2 \times u_c 0.316$ mm 0.3 mm不达标解决提高标定精度——改用 0.01mm 精度的陶瓷标定板并增加标定图数量至 50 张本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。