首页 / 资讯中心 / 文章详情

工业质检全流程评估指南:基于 QualityInspector 的过杀与漏检指标实战

工业质检全流程评估指南:基于 QualityInspector 的过杀与漏检指标实战 ★ FEATURED ARTICLE
人工智能计算机视觉预训练【免费下载链接】PaddleSegEasy-to-use image segmentation library with awesome pre-trained model zoo, supporting wide-range of practical tasks in Semantic Segmentation, Interactive Segmentation, Panoptic Segmentation, Image Matting, 3D Segmentation, etc.项目地址https://gitcode.com/gh_mirrors/pa/PaddleSeg点击查看免费下载模型的检测 AP、分割 mIoU 等标准指标无法直观回答这套质检方案在产线上到底好不好用的问题——真正决定工业质检能否落地的是过杀率把良品判成缺陷的比例与漏检率把缺陷品放过、流入下道的比例。本文基于 QualityInspector 子仓库的端到端评估工具eval.md 所对应的完整实现系统讲解工业质检全流程的过杀/漏检指标评估方法、badcase 可视化分析以及在不重新跑检测/分割模型的前提下调整后处理参数、重新评测的完整工作流。读完后你将掌握如何用一条命令评估整个质检流水线、如何读懂三大指标表格、如何定位过杀与漏检的坏例以及如何通过调整置信度/边长/面积后处理算子实现指标的迭代优化。一、为什么质检落地需要过杀/漏检而不是 AP/mIoU在常规目标检测与分割任务中研究者习惯用检测 AP、分割 mIoU 来横向对比模型精度。但在工业质检场景中客户关心的是两件事过杀Overkill一批本应判定为 OK正常的零件被流水线判成了 NG缺陷导致合格品被误报废直接造成生产成本上升漏检Escape一批本应判定为 NG 的缺陷零件被流水线判成了 OK导致缺陷品流出产线引发下游质量事故。AP/mIoU 无法等价反映这两个工程指标。为此QualityInspector 在 tools/end2end/eval.py 中实现了工业质检行业常用的评估方法覆盖三类指标过杀指标、图像级别漏检指标、实例缺陷级别漏检指标。同时为了支撑指标优化闭环评估工具还提供 badcase 自动分析与可视化并支持后处理 NG/OK 判断参数的调整与重新评测——整个过程无需重新调用检测/分割模型做推理评测成本极低。评估工具的输入是两份 JSON一份是带有 GT 框的 COCO 格式标注文件即真值另一份是通过 全流程预测 得到的预测结果文件。评估工具将二者对齐后逐图统计过杀与漏检。二、评估命令与参数说明2.1 基本用法在 QualityInspector 子仓库根目录下对dataset/MT_dataset/val.json中的每一张图像执行评估--pred_path指向通过全流程预测得到的预测结果 JSON 文件python3 tools/end2end/eval.py --input_path ./dataset/MT_dataset/val.json --pred_path ./output_det/output.json --config ./configs/end2end/e2e_det.yml --rules_eval --image_root ./其中--input_pathCOCO 格式、带 GT 框的标注 JSON 文件真值--pred_path全流程预测 阶段由tools/end2end/predict.py输出的预测结果 JSON--config全流程配置文件如 e2e_det.yml--rules_eval是否在评估前用当前配置重新执行后处理判断调整过参数后必须开启否则沿用预测阶段保存的isNG结果。2.2 参数详解参数名含义默认值--input_path带有 GT 框的 COCO 格式 json 文件必填--pred_path通过全流程预测得到的预测 json 文件必填--config全流程预测配置文件None--image_root图像保存的根目录--rules_eval是否重新进行后处理判断False--instance_level是否评测实例级别漏检指标True--iou_theshold预测与 gt 框大于该阈值视作召回0.1--save_badcase是否保存 badcase 可视化True--output_dirbadcase 保存路径./output/badcase/对照 eval.py 的参数解析部分 可以看出源码中的实际定义--instance_level与--save_badcase均为actionstore_false类型即默认开启、显式传入即关闭例如想跳过实例级评估就加--instance_level想跳过 badcase 保存就加--save_badcase。--iou_theshold在源码中的拼写即为theshold是仓库沿用至今的命名默认0.1表示预测框与 GT 框的 IoU 超过该值才视为召回。--rules_eval为store_true类型默认关闭。需要说明--output_dir的默认值在源码中为./output/badcase/而早期文档版本写作--badcase与--output_path实际使用请以源码 argparse 定义的参数名为准。三、三大核心指标解读评估执行后会依次输出三张指标表格分别对应过杀、图像级漏检与实例级漏检。3.1 过杀指标OverkillEval INFO: OK Evaluation Result: --------------------------------------------------------- | OK | ALL | Blowhole | Break | Crack | Fray | Uneven | --------------------------------------------------------- | Total | 318 | 318 | 318 | 318 | 318 | 318 | | OK | 267 | 316 | 306 | 318 | 318 | 281 | | NG | 51 | 2 | 12 | 0 | 0 | 37 | | Overkill | 16.04% | 0.63% | 3.77% | 0.00% | 0.00% | 11.64% | ---------------------------------------------------------TotalOK 图像GT 无缺陷标注总数即该表中 OK 与 NG 两行的纵向和NG 行被流水线误判为缺陷的 OK 图像数量Overkill NG / Total每一个类别下的 NG 数是指包含该类别的 NG 预测 box 或 mask 的图像数量——注意统计单位是图像即一张图上只要有任意一个该类别且被判为 NG 的预测实例就计入一次。从源码看这一逻辑实现在 eval_ok 函数 中遍历所有 GT 无标注的图像gt_ok_ids若预测结果preds_info[isNG]为真则统计该图上所有pred[isNG] 1的预测实例所属类别按类别去重后计入过杀。示例中 16.04% 的总体过杀率主要由 Uneven 类别贡献11.64%这正是后续后处理参数调整要解决的问题。3.2 图像级别漏检指标Image-Level EscapeEval INFO: Result of Image-Level NG NG Evaluation: -------------------------------------- | Image Level | Total | NG | OK | Escape | -------------------------------------- | Lucky Result | 132 | 118 | 14 | 10.61% | --------------------------------------TotalNG 图像GT 有缺陷标注总数NG图像存在任意一个预测为 NG 的 box/mask 的数量——该指标不关注预测位置或类别是否正确只要蒙对了缺陷即可因此又称Lucky Recall幸运召回OK图像没有任何 NG 预测 box/maskEscape OK / Total即整张缺陷图完全没被识别出来的比例。对应源码中的 eval_ng 函数 前半部分对每张 NG 图像若preds_info[isNG]为假即整张图没有任何被判定为缺陷的预测则计入ok_image_in_ng_num该图即为图像级漏检 badcase。3.3 实例级别漏检指标Instance-Level EscapeEval INFO: Result of Instance-Level NG Evaluation: ----------------------------------------------------------- | NG | ALL | Blowhole | Break | Crack | Fray | Uneven | ----------------------------------------------------------- | Total | 151 | 39 | 41 | 24 | 13 | 34 | | NG | 127 | 36 | 31 | 20 | 12 | 28 | | OK | 24 | 3 | 10 | 4 | 1 | 6 | | Escape | 15.89% | 7.69% | 24.39% | 16.67% | 7.69% | 17.65% | -----------------------------------------------------------TotalNG 的缺陷实例总数GT 缺陷 box/mask 个数NG预测正确的实例缺陷 box/mask 数量——通过与 GT 计算 IoU 判断该 NG 预测是否落在正确位置OK该缺陷实例没有任何可匹配IoU 大于--iou_theshold的 NG 预测 box/maskEscape OK / Total即单个缺陷实例被漏检的比例。实例级匹配的底层实现位于 bbox_utils.py 的 iou_one_to_multiple将单个 GT 框与一批预测框逐一计算 IoU[xmin, ymin, w, h]格式含 1 像素修正的并交比计算取最大值与iou_theshold比较。具体匹配逻辑见 eval_ng 的实例级分支先收集该图上所有isNG 1的预测框再对每个 GT 缺陷实例求最大 IoU若低于阈值则计入漏检。示例中 Break 类别的实例级漏检高达 24.39%说明该类缺陷检出了图却没框准位置需要在模型或后处理层面针对性优化。三类指标的统计入口统一在 evaluation 函数先按 GT 是否有标注把图像划分为 OK 集与 NG 集再分别调用eval_ok与eval_ng。四、badcase 可视化输出评估结束后badcase 默认保存在./output/badcase/路径对应--output_dir目录结构如下output | |--overkill # 过杀文件夹 | |--Break # 预测出的过杀类别 | | |--exp1_xxx.jpg # 可视化的过杀图像 | | |--exp1_xxx.png | | ... | |--Uneven # 预测出的过杀类别 | | |--exp1_xxx.jpg | | |--exp1_xxx.png | ... |--escape # 漏检文件夹 | |--image_level # 图像级别漏检图像没有任何预测结果 | | |--exp1_xxx.jpg | | |--exp1_xxx.png | | ... | |--instance_level # 实例级别漏检图像上某个/多个缺陷漏检 | | |--Break # 漏检的真实缺陷类别 | | | |--exp1_xxx.jpg | | | |--exp1_xxx.png | | | ... | | |--Uneven # 漏检的真实缺陷类别 | | | |--exp1_xxx.jpg | | | |--exp1_xxx.png | | | ... | | ...目录按类型 → 缺陷类别两级组织overkill/类别/下是某 OK 图像被误判为某类缺陷的截图escape/image_level/下是整张缺陷图没有任何预测的截图会叠加绘制 GT 框escape/instance_level/类别/下则是某个具体缺陷实例漏检的截图只绘制漏检的 GT 框。可视化的实现位于 show_badcase 函数过杀图调用show_result叠加预测框与类别/置信度信息图像级与实例级漏检图调用draw_bboxes绘制对应 GT 框。通过人工翻阅这些坏例可以快速判断过杀是置信度阈值过低导致的小噪声误报还是模型本身在难例上的误判漏检是缺陷过于微小、对比度低还是类别不平衡导致某类缺陷学习不足。五、后处理参数调整不重跑模型即可优化指标5.1 后处理算子及其原理零件缺陷的判定标准往往与缺陷位置、大小、长度等信息相关。为了过滤不满足 NG 条件的检出、降低过杀QualityInspector 在 qinspector/ops/postprocess.py 中实现了多个可配置后处理算子目前包括算子判定依据判定逻辑JudgeDetByScores置信度预测score低于阈值则判为 OK 框非缺陷JudgeByLengthWidth边长预测框长或宽小于阈值则判为 OK 框非缺陷JudgeByArea面积分割像素数area字段或框面积w*h小于阈值则判为 OK三个算子均支持全局标量阈值与按类别字典阈值两种写法全局写法score_threshold: 0.1所有类别共用同一阈值按类别写法score_threshold: # 不同类别的置信度阈值 1: 0.01 # 类别 1 置信度小于 0.01 的框判为 OK 框非缺陷 2: 0.4 # 类别 2 置信度小于 0.4 的框判为 OK 框非缺陷从实现细节看JudgeDetByScores算子会遍历每张图的每个预测实例若阈值是 dict则只对显式列出的category_id生效未列出的类别保持isNG 1若score threshold则置isNG 1否则置isNG 0。JudgeByLengthWidth 比较的是bbox的宽bbox[2]与高bbox[3]只要有一个维度达标即保留为 NGJudgeByArea 优先使用分割结果中的area字段无分割结果时退化为用框面积w * h近似。所有算子按配置文件中的顺序在 PostProcess 中被依次串联调用__call__逐个 rule 执行前面的算子先更新isNG后面的算子会继续基于pred.get(isNG, 1)做二次过滤——因此算子顺序会影响最终结果例如先按置信度过滤、再按面积过滤与反过来的效果可能不同。5.2 调整流程与实战示例标准迭代流程为执行一次全流程评估阅读三类指标与 badcase 可视化在配置文件如 e2e_det.yml中调整后处理参数重新执行评估命令时务必同时携带--config与--rules_eval此时 main 函数 会用ConfigParser重新解析配置并构建PostProcess后处理模块对预测结果重新执行后处理判断再基于新结果统计指标对比新旧指标确认过杀下降的同时漏检是否在可接受范围。沿用文档示例初次评估发现Uneven 类别过杀高达 11.64%于是调高配置中JudgeDetByScores的score_threshold例如将第 5 类 Uneven 的阈值调高再重新执行评测命令得到Eval INFO: OK Evaluation Result: -------------------------------------------------------- | OK | ALL | Blowhole | Break | Crack | Fray | Uneven | -------------------------------------------------------- | Total | 318 | 318 | 318 | 318 | 318 | 318 | | OK | 298 | 316 | 306 | 318 | 318 | 312 | | NG | 20 | 2 | 12 | 0 | 0 | 6 | | Overkill | 6.29% | 0.63% | 3.77% | 0.00% | 0.00% | 1.89% | --------------------------------------------------------Uneven 类别的过杀从 11.64% 降至 1.89%整体过杀从 16.04% 降至 6.29%。当然阈值调高通常意味着更多低置信度预测被过滤可能存在一定程度的漏失上升——用户需要根据实际项目对漏检或过杀的既定目标权衡取舍例如优先保漏检则放宽阈值优先控成本则收紧阈值。5.3 完整后处理配置示例参考仓库中三种全流程配置后处理模块的完整写法如下节选自 e2e_det_RoI_seg.ymlPipeLine: - Detection: config_path: ./configs/det/hrnet/faster_rcnn_hrnetv2p_w18_3x_defect.yml model_path: ./output/faster_rcnn_hrnetv2p_w18_3x_defect/model_final.pdparams score_threshold: 0.01 - CropSegmentation: pad_scale: 0.5 config_path: ./configs/seg/ocrnet/ocrnet_hrnetw18_RoI_defect_256x256_40k.yml model_path: ./output/seg_roi/best_model/model.pdparams aug_pred: True - PostProcess: # to reduce overkill - JudgeDetByScores: score_threshold: 1: 0.1 # {class_id: threshold} 5: 0.2 - JudgeByLengthWidth: len_thresh: 0 # smaller than it is OK sample - JudgeByArea: area_thresh: 1: 10检测后处理e2e_det.ymlDetection → PostProcess分割后处理e2e_seg.ymlBaseSegmentation → PostProcessJudgeByArea直接使用分割像素数检测RoI分割后处理e2e_det_RoI_seg.ymlDetection → CropSegmentation → PostProcess先粗检再精分割输出包含polygon与area字段使JudgeByArea可基于真实分割面积判定。后处理参数解析、阈值字典格式等更多细节可参考 全流程配置解读预测结果 JSON 字段isNG、category_id、bbox、score等的生成方式可参考 全流程预测。六、NG/OK 判断逻辑评估依赖预测结果中逐实例的isNG与逐图像的isNG字段其判定逻辑贯穿全流程实例级后处理算子对每个预测实例box/mask判断其是否满足 NG 条件满足置isNG 1不满足置isNG 0图像级一张图像只要存在任意一个isNG 1的预测实例该图即为 NG 图否则为 OK 图。这一聚合逻辑在评估侧的 post_process_image_info 函数 中实现any(pred[isNG] 1 for pred in preds)在--rules_eval开启、重新执行后处理之后会被重新计算GT 侧真值判断图像是 NG/OK 的逻辑依据输入 json——是否有标注框有标注框即视为 NG 图像无标注框即视为 OK 图像。详见 evaluation 函数 中按getAnnIds是否为空划分gt_ok_ids与gt_ng_ids的逻辑。理解这一逻辑后即可明白过杀与漏检的统计完全建立在这套预测 isNG 聚合 → 与 GT 有无标注对齐的框架上任何后处理参数的改动都只影响预测侧isNG的重计算因此无需重新推理模型即可完成指标迭代。七、小结QualityInspector 的全流程评估工具为工业质检落地提供了一套贴近产线语义的指标体系和迭代闭环指标完备过杀Overkill、图像级漏检Lucky Recall / Escape、实例级漏检Escape三张表分别回答误报废多少整图漏掉多少单个缺陷漏掉多少三个层面的问题坏例可查badcase 按过杀 / 图像级漏检 / 实例级漏检 × 缺陷类别自动归档可视化直接支撑人工分析与模型迭代优化低成本借助JudgeDetByScores、JudgeByLengthWidth、JudgeByArea三类后处理算子与--rules_eval重评机制可在不重新推理模型的前提下快速压低过杀、平衡漏检将指标收敛到项目既定的工程目标。核心代码入口评估脚本 tools/end2end/eval.py、后处理算子 qinspector/ops/postprocess.py、IoU 匹配工具 qinspector/utils/bbox_utils.py配套配置文件位于 configs/end2end/可直接按需调整后投入实际质检项目使用。赞分享人工智能计算机视觉预训练【免费下载链接】PaddleSegEasy-to-use image segmentation library with awesome pre-trained model zoo, supporting wide-range of practical tasks in Semantic Segmentation, Interactive Segmentation, Panoptic Segmentation, Image Matting, 3D Segmentation, etc.项目地址https://gitcode.com/gh_mirrors/pa/PaddleSeg点击查看免费下载相关推荐基于 PaddleSeg 生态的工业质检全流程解决方案 QualityInspector从数据标注到过杀/漏检评估调优基于 PaddleSeg 生态的工业质检全流程解决方案 QualityInspector从数据标注到过杀/漏检评估调优 导读 本文围绕 PaddleSeg人工智能计算机视觉预训练PaddleSeg QualityInspector 工业质检实战检测与分割任务的训练与验证全流程指南PaddleSeg QualityInspector 工业质检实战检测与分割任务的训练与验证全流程指南 导读 本文围绕 QualityInspector ht人工智能计算机视觉预训练Adobe激活工具终极指南5分钟掌握Adobe-GenP完整使用教程Adobe激活工具终极指南5分钟掌握Adobe GenP完整使用教程 如果你正在寻找一款高效、安全的Adobe激活工具那么Adobe GenP绝对是你的理想人工智能计算机视觉预训练上一篇如何快速掌握Python算法algorithms_in_ipython_notebooks完整使用指南下一篇为什么你的Stable Diffusion模型训练效果差可能是标签标注问题创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?
咨询建站