缺陷检测之Anomalib

news2024/11/17 2:36:41

缺陷检测的现状

工业缺陷数据有一个比较显著的特征:样本不平衡。绝大部分采集得到的工业数据都是没有缺陷的,这样一来,正样本的数据在模型训练中根本没有起到作用,负样本又太少,很难训练得到有效的模型。使用有监督学习的方法还有一个问题:负样本的出现是十分偶然的,可能在数据集中根本没有出现某一类型的负样本,如此训练得到的模型很有可能翻车,所以只能另寻他法。

Anomalib介绍

Anomalib属于无监督学习,无监督算法只使用正样本进行训练,网络经过大量的正样本学习,在遇到负样本时,就会知道负样本和正样本“长得不一样”,然后输出和原图尺寸相同的一张概率分布图,来表示某处是异常区域的概率大小。

附属项目连接

GitHub - openvinotoolkit/anomalib: An anomaly detection library comprising state-of-the-art algorithms and features such as experiment management, hyper-parameter optimization, and edge inference.

模型训练方法

通过查看anomalib train -h

可以看到一些训练的指令,这里我常用的是:

 anomalib train --config .\config.yaml

下面附上我的config.yaml

# anomalib==1.1.0
seed_everything: true
trainer:
  accelerator: auto
  strategy: auto
  devices: 1
  num_nodes: 1
  precision: null
  logger: null
  callbacks: null
  fast_dev_run: false
  max_epochs: null
  min_epochs: null
  max_steps: -1
  min_steps: null
  max_time: null
  limit_train_batches: null
  limit_val_batches: null
  limit_test_batches: null
  limit_predict_batches: null
  overfit_batches: 0.0
  val_check_interval: null
  check_val_every_n_epoch: 1
  num_sanity_val_steps: null
  log_every_n_steps: null
  enable_checkpointing: null
  enable_progress_bar: null
  enable_model_summary: null
  accumulate_grad_batches: 1
  gradient_clip_val: null
  gradient_clip_algorithm: null
  deterministic: null
  benchmark: null
  inference_mode: true
  use_distributed_sampler: true
  profiler: null
  detect_anomaly: false
  barebones: false
  plugins: null
  sync_batchnorm: false
  reload_dataloaders_every_n_epochs: 0
normalization:
  normalization_method: MIN_MAX
task: SEGMENTATION
metrics:
  image:
  - F1Score
  - AUROC
  pixel: null
  threshold:
    class_path: anomalib.metrics.F1AdaptiveThreshold
    init_args:
      default_value: 0.5
      thresholds: null
      ignore_index: null
      validate_args: true
      compute_on_cpu: false
      dist_sync_on_step: false
      sync_on_compute: true
      compute_with_cache: true
logging:
  log_graph: false
default_root_dir: anomalib\train
ckpt_path: null
data:
  class_path: anomalib.data.Folder
  init_args:
    name: A-1/crops/hxjzq
    normal_dir: D:\python\anomalib-1.1.0\data\normal1
    root: crop_new/cxjzq
    abnormal_dir: null
    normal_test_dir: null
    mask_dir: null
    normal_split_ratio: 0.2
    extensions: null
    train_batch_size: 16
    eval_batch_size: 16
    num_workers: 4
    image_size: null
    transform: null
    train_transform: null
    eval_transform: null
    test_split_mode: synthetic
    test_split_ratio: 0.2
    val_split_mode: same_as_test
    val_split_ratio: 0.5
    seed: null
model:
  class_path: anomalib.models.Patchcore
  init_args:
    backbone: wide_resnet50_2
    layers:
    - layer2
    - layer3
    pre_trained: true
    coreset_sampling_ratio: 0.1
    num_neighbors: 9

训练完成后会得到一个模型

模型转为onnx方法

(官方给的是--export_model onn 这里我们改成 --export_type onnx)

anomalib export --model Patchcore --export_type onnx --ckpt_path D:\python\anomalib-1.1.0\anomalib\train\Patchcore\A-1\crops\hxjzq\v0\weights\lightning\model.ckpt

--model的出处:(根据自己的配置文件进行修改)

运行:

调用onnx方法

# infer onnx model
import onnxruntime as ort
import cv2
import numpy as np

def infer_onnx(onnx_path, img_path,img_name):
    ort_session = ort.InferenceSession(onnx_path)
    image = cv2.imread(img_path)
    image_blod = cv2.dnn.blobFromImage(image, scalefactor=1 / 255.0, size=(640,640), swapRB=True, )
    model_inputs = ort_session.get_inputs()
    output = ort_session.run(None, {model_inputs[0].name: image_blod})
    # print('output',output)
    # np.savetxt('res.csv', output[0].squeeze(), delimiter=',', fmt='%f')
    # print(output[0])
    
    # 计算放缩比例
    print('image_shape',image.shape)
    ratio_x = image.shape[1] / 224
    ratio_y = image.shape[0] / 224

    img_res = output[0].squeeze()
    img_res = img_res.astype(np.uint8)
    cv2.imwrite('img_res.jpg',img_res)
    
    # thresh 返回的二值化图像
    _, thresh = cv2.threshold(img_res, 45, 255, cv2.THRESH_BINARY) # 255白色
    cv2.imwrite('thresh.jpg',thresh)  # 异常图片显示(白色区域)

    # print('thresh',thresh) 
    # contours  轮廓列表 
    contours, _ = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)  # 只检测白色
    if output[1] > 50:
        for cnt in contours:
            x, y, w, h = cv2.boundingRect(cnt) # 获取矩形左上角坐标和宽高
            cv2.rectangle(image, (int(x*ratio_x), int(y*ratio_y)), (int((x + w)*ratio_x), int((y + h)*ratio_y)), (0, 0, 255), 2)

        cv2.imwrite(f'{img_name}', image)
    # print(f'{img_name}:', output[1])


if __name__ == '__main__':
    onnx_path = r"E:\0806\export\Patchcore\A-2\xjslh\weights\onnx\model.onnx"
    img_path = r"E:\0806\crop\A-2\crops\xjslh"
    import os
    from tqdm import tqdm
    img_list = os.listdir(img_path)
    for i in tqdm(img_list):
        img_path_ = os.path.join(img_path, i)
        infer_onnx(onnx_path, img_path_,i)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2066659.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

六西格玛与5S管理体系并行落地,实现生产事件精益管理

在现代制造业中,六西格玛管理和5S管理体系是提升生产效率和质量控制的重要工具。六西格玛以其严格的数据分析方法帮助企业减少过程中的变异和缺陷,而5S管理则通过优化工作环境和流程,确保生产线的整洁、有序和高效。如何将这两大管理体系成功…

wpf livechart 绘制笛卡尔曲线

先上图&#xff1a; 代码部分&#xff1a; <GroupBox Header"各生产线生产量趋势"><Grid><Grid.RowDefinitions><RowDefinition Height"45"/><RowDefinition Height"auto"/><RowDefinition/></Grid.RowD…

第R1周: RNN-心脏病预测

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、什么是RNN RNN&#xff08;Recurrent Neural Network&#xff09;是一种特殊的神经网络&#xff0c;它能够处理序列数据&#xff0c;如时间序列、文本序列…

MedGraphRAG:医学版 GraphRAG

MedGraphRAG&#xff1a;医学版 GraphRAG 提出我的解法思路 MedGraphRAG 大纲解法大纲 解法拆解U-retrieve 双向检索 分析性关联图创意视角MedGraphRAG 对比 传统知识图谱大模型现在医疗知识图谱的问题MedGraphRAG的三层层级图结构&#xff0c;能不能让普通的医疗知识图谱&…

线程——函数式创建线程threading模块,继承式创建线程,Lock对象解决多线程不安全问题,线程模型中的生产者消费者模式

调度程序内的多任务使用多进程&#xff0c;调度一个进程内的多任务使用多线程 函数式创建线程的方式threading模块 在Python中&#xff0c;创建线程主要依赖于threading模块。 使用threading模块中的Thread类&#xff0c;你可以很容易地基于函数模式创建线程。基本步骤包括&…

Linux | 文件描述符fd详解及重定向技术的应用

多谢梅花&#xff0c;伴我微吟。 - 《高阳台除夜》(韩疁) 2024.8.23 目录 1、文件描述符fd 文件操作符概念(简单带过) 重点&#xff1a;如何理解文件操作符使得系统实现了设备无关性&#xff1f;&#xff08;使得操作系统无需关心具体的硬件细节&#xff09; 示例代码:标准输入…

SAP BW:QUERY数据结果写入ADSO

作者 idan lian 如需转载备注出处 如果对你有帮助&#xff0c;请点赞收藏~~~ 需求背景 客户基于QUERY进行报表展示&#xff0c;现需迁移到永洪报表平台&#xff0c;query中的变量参数&#xff0c;公式等无法直接生成视图&#xff0c;query相对复杂&#xff0c;不想直接在视图…

流动会场:便捷、经济与声学效果的理想融合—轻空间

在现代活动策划中&#xff0c;选择合适的场地至关重要。流动会场作为一种新型移动空间&#xff0c;不仅具备便捷性和高性价比&#xff0c;还以其优异的声学效果&#xff0c;成为各类会议、展览、演出等活动的理想选择。 便捷安装&#xff0c;快速搭建 流动会场的模块化设计使其…

P-One如何测试一个场景集包含多个接口

P-One是泽众软件自主研发的一站式性能测试平台&#xff0c;集管理、设计、压测、监控以及分析于一体的全方位性能测试解决方案&#xff0c;适用于各种非功能测试场景&#xff1a;压力测试、负载测试、稳定性测试、可靠性测试、容量测试等。 在实际业务场景中&#xff0c;如电商…

springsecurity 在web中如何获取用户信息(后端/前端)

一、SecurityContextHolder 是什么 是一个安全的上下文对象&#xff0c;用于获取经过身份验证的用户。 二、SecurityContextHolder 是何时被创建的 当我们经过表单UsernamePasswordAuthenticationFilter 过滤器后&#xff0c;会回调父类的AbstractAuthenticationProcessingFilt…

华为自研仓颉编程语言测试版上线,计划持续到10月21号

现如今&#xff0c;编程语言作为构建软件世界的基石&#xff0c;其重要性不言而喻。 而华为&#xff0c;作为全球领先的信息与通信技术&#xff08;ICT&#xff09;解决方案提供商&#xff0c;其在技术创新上的每一步都备受瞩目。最近&#xff0c;华为再次成为焦点&#xff0c…

OpenCompass 评测 InternLM-1.8B 实践

1. 环境安装 conda create -n opencompass python3.10 conda activate opencompass conda install pytorch2.1.2 torchvision0.16.2 torchaudio2.1.2 pytorch-cuda12.1 -c pytorch -c nvidia -y# 注意&#xff1a;一定要先 cd /root cd /root git clone -b 0.2.4 https://gith…

系统编程-lvgl

带界面的MP3播放器 -- lvgl 目录 带界面的MP3播放器 -- lvgl 一、什么是lvgl&#xff1f; 二、简单使用lvgl 在工程中编写代码 实现带界面的mp3播放器 main.c events_init.c events_init.h 补充1&#xff1a;glob函数 补充2&#xff1a;atexit函数 一、什么是lvgl&a…

GPT-4、Claude 3 Opus 和 Gemini 1.0 Ultra 挑战控制工程的新领域

介绍 论文地址&#xff1a;https://arxiv.org/abs/2404.03647 近年来&#xff0c;GPT-4、Claude 3 Opus 和 Gemini 1.0 Ultra 等大规模语言模型&#xff08;LLM&#xff09;迅速发展&#xff0c;展示了它们解决复杂问题的能力。LLM 的这些发展在多个领域都有潜在的应用前景。…

Postman接口测试 —— 设置全局变量、参数传递、断言

在能熟练使用postman运行接口请求后&#xff0c;会遇到一些问题。例如&#xff1a; 我们的web网站一共有几十个接口&#xff0c;测试的时候如果要切换环境&#xff0c;这个时候要每个接口都要修改url的根路径&#xff0c;一个一个的改也太麻烦了&#xff1b; 还有时候我们经常…

八、SPA单页面实现SEO优化之预渲染prerender-spa-plugin

文章目录 一、前言二、prerender-spa-plugin预渲染方式实现SEO插件介绍实现步骤 一、前言 关于SPA和SEO优化、SSR服务器渲染的介绍可以参考这里&#xff1a; 六、什么是SEO优化&#xff08;搜索引擎优化&#xff09;&#xff1f;SPA单页面应用如何实现SEO优化&#xff1f; 通…

C/C++语言基础--字符串(包括字符串与字符数组、字符串与指针、字符串处理函数等),代码均可运行

本专栏目的 更新C/C的基础语法&#xff0c;包括C的一些新特性 前言 无论什么语言&#xff0c;字符串都是最重要、最基础的数据类型&#xff0c;他对二进制有很好的对应关系在C语言中没有提供专门的处理字符串的类型&#xff0c;但是我们可以通过字符数组、开辟内存地址来处理…

Content-Encoding: br

爬虫的时候遇到了 Content-Encoding: br &#xff0c; 这可能会导致返回的数据有乱码&#xff0c;无法解析&#xff0c;也无法解码&#xff0c; 浏览器显示编码 按照这么写&#xff0c;还是乱码 查了很久&#xff0c;需要在请求头 Accept-Encoding 将这个改为gzip&#xff0c…

Swift 6.0 如何更优雅的抛出和处理特定类型的错误

概述 从 Swift 语言诞生那天儿起&#xff0c;它就不厌其烦一遍又一遍地向秃头码农们诉说着自己的类型安全和高雅品味。 不过遗憾的是&#xff0c;作为 Swift 语言中错误处理这最为重要的一环却时常让小伙伴们不得要领、满腹狐疑。 在本篇博文中&#xff0c;您将学到如下内容&…

企业数字化转型会面临哪些挑战,如何解决?

当前&#xff0c;数字技术发展迅速&#xff0c;已迈入 AI 人工智能时代。企业若不进行数字化转型&#xff0c;可能会被用户抛弃、被竞争对手超越。那么&#xff0c;传统企业在转型过程中会遇到哪些挑战呢&#xff1f; 一、企业数字化转型面临的挑战 1、缺乏明确的战略规划和转…