尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
天池布匹疵点检测实战:从数据清洗到模型融合的完整方案
简介面向工业视觉与竞赛学习场景天池2019广东工业智造创新大赛布匹疵点检测季军解决方案完整开源包含全部算法源码与项目说明。源码包共221个文件以Python脚本为主193个py辅以C与CUDA自定义算子8个cpp、7个cu以及Shell部署脚本、Pyx扩展、说明文档和示例图片压缩包整体24.21MB轻量便于下载与二次开发。内容覆盖数据预处理、模型训练、推理验证等环节特别针对可变形卷积、RoIAlign、NMS等核心操作提供CUDA实现适合想深入学习目标检测落地细节的读者。项目结构清晰源码可直接运行也方便计算机、数学、电子信息等专业学生用于课程设计、期末大作业或毕业设计参考。目前已有195人学习是一份兼具工程价值与比赛思路的工业视觉参考资料。1. 天池2019广东工业智造大赛布匹疵点检测从“识别”到“定位”的分水岭2019年天池广东工业智造创新大赛把布匹疵点检测摆到AI参赛者面前时很多人以为这是又一个目标检测题真正跑起来才发现布面纹理本身就是最难的背景。经纬线重复、光照不均、疵点与正常纹理可能只差几个像素赛题还要求同时给出类别和检测框。季军方案能站住靠的不是罕见模型而是数据清洗、模型选型、训练策略和结果融合的整套组合。下面按同名赛题常见的解题路径讲清楚源码里通常写了什么、参数为什么这么设、解压zip之后第一步该做什么。这里不会逐行解读某个未知项目而是把做这个赛题最主流、最可靠的一套流程拆开从数据准备一直讲到最后分数验证。2. 天池布匹疵点检测算法选型数据形态决定用检测还是分割2.1 赛题数据格式与标注对应的模型输出布匹疵点检测在2019年的赛制里以目标检测框为主部分阶段要求像素级掩膜。比赛数据通常把图片放在train目录把框或掩膜标注放在一份annotations.csv或官方json里。无论规则怎么写第一步永远是统一标注格式。我一般会把所有标注转成COCO的json这样后续换网络、跑评测、做可视化都省事也能直接接进MMDetection、Detectron2这类成熟框架。import json import os import cv2 def build_coco(img_dir, ann_txt, out_json, cat_map): images, annotations, categories [], [], [] with open(ann_txt, r) as f: lines f.readlines() img_id_map {} for img_idx, img_name in enumerate(os.listdir(img_dir)): img_path os.path.join(img_dir, img_name) h, w cv2.imread(img_path).shape[:2] img_id_map[img_name] img_idx images.append({id: img_idx, file_name: img_name, width: w, height: h}) ann_id 0 for line in lines: parts line.strip().split( ) img_name, cls, cx, cy, bw, bh parts[0], parts[1], float(parts[2]), float(parts[3]), float(parts[4]), float(parts[5]) img cv2.imread(os.path.join(img_dir, img_name)) h, w img.shape[:2] xmin (cx - bw / 2) * w ymin (cy - bh / 2) * h bbox_w, bbox_h bw * w, bh * h annotations.append({ id: ann_id, image_id: img_id_map[img_name], category_id: int(cls) 1, bbox: [xmin, ymin, bbox_w, bbox_h], area: bbox_w * bbox_h, iscrowd: 0 }) ann_id 1 categories [{id: i, name: n} for i, n in cat_map.items()] json.dump({images: images, annotations: annotations, categories: categories}, open(out_json, w))这段代码的假设是每行标注为图片名 类别 归一化中心x 归一化中心y 归一化宽 高这是YOLO系标注常见的写法。转成COCO后bbox必须是绝对坐标的[x, y, width, height]而不是中心点加宽高很多排错问题都出在这个坐标换算上。area字段在评测时会参与mAP计算如果漏填或填0评测结果会明显偏低。转换完成之后用cv2.imread读取每张图只是示例实际项目里建议先缓存图片尺寸列表否则每次循环都要读一遍图数据量大了会很慢。如果标注文件量级达到几万条还需要把annotations按图片id索引化避免评测时反复遍历。2.2 布匹疵点适合的检测网络Cascade R-CNN还是单阶段布匹疵点不是常规的物体检测。疵点往往尺寸小、长宽比极端、纹理周期性强所以模型选择要从三个角度考虑模型小目标能力细长目标训练速度布匹场景定位YOLOv5中中快可做初筛或融合Faster R-CNN中高中中基线Cascade R-CNN高高慢主模型推荐Mask R-CNN高中慢复赛像素级可选我一般用Cascade R-CNN配ResNet-50/101做主力再用单阶段模型做第二路最后在预测阶段做框融合。Cascade R-CNN的优势在于通过多个级联检测头逐级修正框的IoU阈值对“疵点和背景界限模糊”这类问题比Faster R-CNN稳定。代价是推理时间增加但比赛通常不卡单帧速度。选完模型还要调整anchor。布匹上的线头、断纱往往是瘦长形默认的ratios[0.5, 1.0, 2.0]不够。我会加入0.1和5.0anchor_generatordict( typeAnchorGenerator, strides[8, 16, 32, 64, 128], ratios[0.1, 0.3, 0.5, 1.0, 2.0, 5.0, 8.0])strides是特征金字塔在不同层上的下采样倍数小目标需要保留较大的特征图所以第一个stride可以从8而不是4起步显存占用会高一些。ratios里的0.1是为了覆盖长度是宽度十倍的连续纺线缺陷这种目标在常规检测任务里不常见却是布匹赛题的主要得分点。2.3 训练参数和验证频率怎么配比赛源码里通常不会只用默认参数训练。布匹图像大、瑕疵小训练时的learning rate、batch size、warmup和scale对最终精度影响很大。常见做法是先用单卡跑几轮确认loss能下降再启动完整训练。pip install torch1.9.0cu111 torchvision0.10.0cu111 -f https://download.pytorch.org/whl/torch_stable.html pip install mmcv-full1.4.8 pip install mmdet2.25.0 python tools/train.py /workspace/fabric/cascade_rcnn_r50_fpn.py --work-dir work_dirs/fabric_cascade这里需要关注三个参数lr0.01适合8卡同步训练单卡时改成0.0025否则初始梯度太大warmup_iters500能让前几百步稳定img_scale不要一开始就用超大分辨率先用(1333, 800)跑通再加到(1600, 1200)。训练时会打印bbox mAP而不是总loss这是检测工程和普通分类工程不一样的地方。把每个验证轮次的mAP记到日志里后期选最高分对应的权重做集成而不是用最后一个epoch。3. 布匹疵点检测的数据增强把纹理背景变成模型的噪声而不是陷阱3.1 统计类别频率和面积分布决定不均衡策略直接跑数据前先统计每个类别的目标数量以及目标面积能避免后面反复试错。布匹疵点数据集最典型的问题是正常织物占据大量图像区域而瑕疵往往只占几个百分点。import json from collections import Counter with open(annotations.json) as f: anns json.load(f) cat_counter Counter() area_bins {} for ann in anns[annotations]: cat_id ann[category_id] cat_counter[cat_id] 1 area_bins.setdefault(cat_id, []).append(ann[area]) for cat_id, count in cat_counter.items(): avg_area sum(area_bins[cat_id]) / max(len(area_bins[cat_id]), 1) print(fclass {cat_id}: {count} targets, avg area {avg_area:.1f})如果某个类别的目标数量只有另一个的十分之一可以调高它的采样权重或损失权重。常见做法是让每个batch都强制包含该类别的一个实例否则模型会把这类稀疏目标当作背景。另外面积很小且形状细长的目标在特征图下采样后可能只剩几个像素损失会非常小。应对手段有多尺度训练、使用更低的anchor stride以及下面要说的裁剪策略。3.2 用albumentations做布匹专属的裁剪和色彩增强布匹图像通常很大不可能整图送进GPU于是需要切块。切块不能按普通目标检测那样随机crop 512x512因为很多疵点长宽比极大或者横跨切块边界切着切着目标就没了。我使用albumentations的RandomCrop时会把min_visibility设成0.3~0.5让被切掉太多的瑕疵直接丢弃避免模型学到残缺目标。裁剪窗口大小一般取1024或上下文信息较多的1280。import albumentations as A train_transform A.Compose([ A.RandomCrop(1024, 1024), A.Rotate(limit15, border_mode0), A.HorizontalFlip(p0.5), A.VerticalFlip(p0.2), A.RandomBrightnessContrast(brightness_limit0.15, contrast_limit0.15, p0.3), A.CLAHE(clip_limit2.0, tile_grid_size(8, 8), p0.3), ], bbox_paramsA.BboxParams(formatcoco, min_visibility0.3, label_fields[labels]))Rotate(limit15)是刻意限制。布匹的经纬线本身有稳定方向旋转过大不仅破坏纹理语义也没有必要。CLAHE对浅色布上的低对比污渍很有帮助它能把局部对比度拉伸出来但要警惕在纹理平滑区域产生伪噪声。实测中概率调到0.3效果稳定且不干扰后续的阈值选择。3.3 针对稀疏瑕疵的Cutout、MixUp和类平衡采样除了几何和颜色增强赛题里还常用区域擦除和样本混合。Cutout能模拟疵点被遮挡或与背景轻微重叠的情况MixUp做起来直接但要注意对bbox的处理。增强方式适合场景对布匹疵点的风险Cutout抗遮挡降低误检可能擦掉真瑕疵需要低概率MixUp增加样本多样性布匹纹理融合后出现假瑕疵Mosaic增加小目标数量切块后目标尺寸差异大类别重采样类别不平衡容易过拟合少数类自定义Cutout的简化版本如下import numpy as np def cutout_bbox(image, boxes, labels, n_holes8, length20, p0.2): if np.random.random() p: return image, boxes, labels h, w image.shape[:2] new_img image.copy() for _ in range(n_holes): y np.random.randint(0, h - length) x np.random.randint(0, w - length) new_img[y:ylength, x:xlength] 0 return new_img, boxes, labels这个函数随机在图上挖黑块实现简单。实际训练中可以只对背景区域计算擦除位置避免正面命中瑕疵。类别平衡采样可以在DataLoader的Sampler里实现按类别权重计算单张图的采样概率当模型在验证集上对稀疏类别的召回偏低时把对应权重调高一点同时调低正常布匹负样本的权重。3.4 用Focal Loss或OHEM处理难易样本布匹表面大部分是正常纹理简单样本占多数模型很容易被“背景多、目标少”带偏。如果换成单阶段检测建议开启focal loss多阶段检测则可以用OHEM或者直接提高RPN的正样本比例。以MMDetection的配置为例cls_lossdict( typeFocalLoss, use_sigmoidTrue, gamma2.0, alpha0.25 )gamma2.0让难样本的梯度贡献变大alpha0.25用来平衡正负样本比例。对布匹疵点这种前景占比极低的任务把alpha调到0.3或0.35有时候效果更好但需要每轮观察验证集精确率调过头会让模型输出一堆假阳性。4. 季军方案提分点多模型集成、TTA与Soft-NMS4.1 多模型集成要选互补的模型而不是堆一大堆同结构权重天池这类工业检测赛季军方案很少靠单个模型做到高分。原因是布匹疵点在图像上很细碎不同模型对纹理的敏感性差异很大。Cascade R-CNN能召回一些长条缺陷单阶段模型能快速抓住大面积污渍两者在输出上互补。集成时用框层面的融合比分数平均更好。常见的几种框融合方式简单NMS重叠框保留最高分容易丢弃不同模型对同一瑕疵的互补预测。Soft-NMS按IoU做指数衰减降权保留邻近框。WBF对多个模型输出按置信度排序后加权融合框坐标适用于大瑕疵和稳定模型。下面是一个Soft-NMS实现适合处理多个模型的合并输出import numpy as np def soft_nms_boxes(boxes, scores, sigma0.5, score_thresh0.05): x1, y1, x2, y2 boxes[:, 0], boxes[:, 1], boxes[:, 2], boxes[:, 3] areas (x2 - x1) * (y2 - y1) order scores.argsort()[::-1] keep [] while order.size 0: i order[0] keep.append(i) if order.size 1: break xx1 np.maximum(x1[i], x1[order[1:]]) yy1 np.maximum(y1[i], y1[order[1:]]) xx2 np.minimum(x2[i], x2[order[1:]]) yy2 np.minimum(y2[i], y2[order[1:]]) w np.maximum(0.0, xx2 - xx1) h np.maximum(0.0, yy2 - yy1) inter w * h iou inter / (areas[i] areas[order[1:]] - inter) decay np.exp(-(iou * iou) / sigma) scores[order[1:]] * decay order order[1:][scores[order[1:]] score_thresh] return keep这里的sigma默认0.5如果布匹上密集疵点较多比如一簇断丝sigma可以调到0.8让衰减更温和保留更多相邻预测框。注意score_thresh设太低会导致大量低质量框残留在最终结果里推理时要结合各类别阈值一起使用。4.2 TTA大幅面图像的滑窗预测和坐标映射布匹原图通常有几千像素宽推理时要么切成多块分别预测要么将整图缩放后预测。缩放带来的问题是长条缺陷有可能被缩小到难以识别切块多了会切断瑕疵。通常我同时做多尺度和翻转的TTA。def tta_predict(model, image, scales(0.8, 1.0, 1.2)): h, w image.shape[:2] all_boxes, all_scores, all_labels [], [], [] for scale in scales: new_w, new_h int(w * scale), int(h * scale) img_resized cv2.resize(image, (new_w, new_h)) for flip in (False, True): img_input img_resized[:, ::-1] if flip else img_resized boxes, scores, labels model(img_input) if flip: boxes[:, [0, 2]] new_w - boxes[:, [2, 0]] boxes[:, [0, 2]] / scale boxes[:, [1, 3]] / scale all_boxes.append(boxes) all_scores.append(scores) all_labels.append(labels) return np.vstack(all_boxes), np.concatenate(all_scores), np.concatenate(all_labels)坐标映射的关键在于flip之后要把x轴方向调回来scale之后要把框坐标同时除以缩放比。很多复现跑分不高就是遗忘在缩放后把width, height也除以scale导致框位置偏到左上角。4.3 不同类别需要不同的置信度阈值工业检测的最终评价指标通常用mAP但mAP对低置信度预测也有容忍度。要把模型落地到产线经常需要固定一个阈值。季军方案里的项目说明往往会有类似这样一张参数表疵点类别默认置信度调整后的置信度理由污渍0.300.35背景纹理响应强容易误报破洞0.300.25目标对比度低置信度偏低线头/断纱0.300.30召回和精确率平衡调整阈值时不要只看整体mAP而是分别看每个类别的召回率。用验证集做网格搜索比如按0.05步长扫描各类别阈值选F1最佳的组合。把阈值写进推理配置后整体分数可能没有明显变化但产线实用的误检率会明显下降。5. 布匹疵点检测项目源码包解压zip之后先改这三个地方5.1 先看项目说明里的路径和环境依赖拿到一个天池比赛的算法源码zip常见做法是先不要急着跑训练而是一层层解开目录看清约定。unzip fabric_defect_3rd.zip -d /workspace/fabric cd /workspace/fabric find . -maxdepth 2 -type d cat README.md 2/dev/null | head -60项目说明文件里通常会声明数据目录、配置路径和启动命令。如果没有任何说明文件就按源码里的os.path.join(data, ...)找到数据集路径。竞赛源码包为了压缩体积往往不会带权重文件pretrained字段需要在训练前指定一个可下载的预训练模型。5.2 COCO json的area字段必须修从标注转出的COCO json经常有area为0或不等于w * h的情况。这会直接影响评测脚本使用的cocoapi统计进而导致mAP低于预期。import json with open(annotations.json) as f: data json.load(f) for ann in data[annotations]: x, y, w, h ann[bbox] ann[area] w * h with open(annotations_fixed.json, w) as f: json.dump(data, f)修完之后再跑一遍评测。如果分数有明显上升说明之前的mAP偏低不是模型问题而是标注数据不干净。5.3 用验证脚本确认检测结果边界验证阶段最好直接用与官方一致的评测脚本而不是自己看几张图。一个可用的快速验证流程是把预测结果存成results.json然后跑官方评估python tools/test.py configs/fabric_cascade.py work_dirs/latest.pth \ --format-only --options jsonfile_prefixresults python tools/eval_at_results.py results.bbox.json annotations_fixed.json如果最终mAP与源码里的记录一致说明环境和模型已经对齐如果差得较远优先检查图像缩放、翻转TTA的坐标映射和NMS阈值。就这样一层层往回查就能把季军方案真正迁移到自己的数据上。本文还有配套的精品资源点击获取
RELATED

相关推荐

OpenClaw安全危机与防护实战指南

OpenClaw安全危机与防护实战指南

1. OpenClaw安全危机全景扫描OpenClaw作为新一代环境型AI助手,其"持续运行主动交互"的特性正在重塑人机协作模式。与需要用户主动唤醒的传统AI不同,OpenClaw更像一个24小时在线的数字同事——它能自主阅读你的会议记录、分析项目进度、甚至主动…

📅 2026/9/14 23:43:47
Spring与MyBatis整合实战与配置详解

Spring与MyBatis整合实战与配置详解

1. 项目概述 Spring与MyBatis整合是Java企业级开发中最常见的框架组合方案之一。作为两个最主流的开源框架,Spring的IoC容器和事务管理能力与MyBatis灵活的SQL映射特性形成了完美互补。这种组合既能享受Spring生态的便利,又能保留MyBatis对SQL的精细控制…

📅 2026/9/14 23:43:47
Windows 隐藏登录界面用户教程

Windows 隐藏登录界面用户教程

Windows 隐藏登录界面用户教程 目标 在 Windows 中创建一个新用户,使其: ✅ 能够正常使用(远程桌面、共享文件夹、运行任务计划、以其他用户身份运行程序等) ❌ 不在登录界面显示(登录页面的用户列表中看不到该用户&am…

📅 2026/9/14 23:43:47
MORE NEWS

更多资讯

📰

数字政府政务中心智慧大厅管理系统设计方案:案以“管理+服务”为理念、“软件+硬件+数据+运维+宣传”一体化智慧化建设方案

该方案是一套面向数字政府政务大厅的“软件硬件数据运维宣传”一体化智慧化建设方案,核心目标是依托互联网、云计算、人工智能、大数据等技术,打造现代化智慧政务大厅,提升群众办事体验和政务管理效率。 该方案以“管理服务”为理念&#xf…

📰

AIGC、RAG、Agent、Function Call、MCP 到底啥关系?这次用 TaoToken 让 Codex 走通一遍示例

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

微信小程序端人脸识别图书馆座位预约签到系统设计

简介:基于人脸识别的图书馆座位预约系统微信小程序端,是一份面向小程序开发者与高校学生的完整项目源码资源。系统结合微信小程序轻量化界面与人脸识别验证,实现座位实时查看、在线预约、入馆自动核验与取消释放等核心流程,适合用…

📰

JuiceFS 目录用量统计(Dir Stats)实战指南:启用、查看与修复

JuiceFS 目录用量统计(Dir Stats)实战指南:启用、查看与修复 【免费下载链接】juicefs JuiceFS is a distributed POSIX file system built on top of Redis and S3. 项目地址: https://gitcode.com/GitHub_Trending/ju/juicefs Juice…

📰

基于YOLOv8的无人机农田重金属污染监测系统构建实战

简介:面向计算机视觉与目标检测方向的毕业设计场景,这份基于YOLOv8的农田土壤重金属污染区域无人机监测系统提供了完整可运行的工程方案。项目包含训练代码、推理脚本、可视化界面及配套数据集,可一键启动无人机航拍影像的污染区域识别&#…

📰

深度学习驱动的舌苔识别检测系统设计与实现

简介:一套基于深度学习的舌苔识别检测鉴定系统完整项目,适合计算机视觉方向毕业设计、课程实践或工程入门。资料内含可运行Python源码、带GUI交互界面、已训练模型权重、论文报告与运行截图,覆盖从数据预处理、模型训练到界面部署的主要流程&…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬