快速使用OpenVINO的 Anomalib实现训练和推理

news2024/11/16 15:34:55

快速使用OpenVINO的 Anomalib实现训练和推理

  • 代码
  • 运行的结果截图

代码


import os
from pathlib import Path
from anomalib.data import MVTec
from anomalib import TaskType
from anomalib.deploy import ExportType, OpenVINOInferencer
from anomalib.engine import Engine
from anomalib.models import Padim, Patchcore,Stfpm
from matplotlib import pyplot as plt
from anomalib.data.utils import read_image
import time



def  train_and_export_model ( object_type, model, transform= None ): 
    """
    训练并导出MVTec数据集上的模型为OpenVINO格式。
    
    Args:
        object_type (str): MVTec数据集的类别,如'bottle'、'cap'等。
        model (torch.nn.Module): 待训练的深度学习模型。
        transform (Callable, optional): 数据预处理函数,默认为None。
    
    Returns:
        str: 导出模型保存的根目录路径。
    
    """

    
    datamodule = MVTec()
    datamodule.category=object_type
    engine = Engine(task=TASK) 
    engine.fit(model=model, datamodule=datamodule) 

    ## 将模型导出为 OpenVINO 格式以进行快速推理
    engine.export( 
        model=model, 
        export_type=ExportType.OPENVINO, 
    ) 
    print(f"Model save to {engine.trainer.default_root_dir}).") 
    return  engine.trainer.default_root_dir




if __name__ == '__main__':

    # Initialize the datamodule, model and engine
    OBJECT = "transistor"  ## 要训练的对象
    TASK = TaskType.SEGMENTATION ## 模型的任务类型

    # model = Padim()
    # model =Patchcore()
    # model=Stfpm()
    
    # train_and_export_model(OBJECT, model)

    output_path=Path("results/Padim/MVTec/transistor/latest")
    openvino_model_path = output_path / "weights" / "openvino" / "model.bin"
    metadata_path = output_path / "weights" / "openvino" / "metadata.json"
    print(openvino_model_path.exists(), metadata_path.exists())

    inferencer = OpenVINOInferencer(
        path=openvino_model_path,  # Path to the OpenVINO IR model.
        metadata=metadata_path,  # Path to the metadata file.
        device="AUTO",  # We would like to run it on an Intel CPU.
    )

    # 定义文件夹路径
    folder_path = "./datasets/MVTec/transistor/test/bent_lead/"

    # 获取文件夹中所有的.png文件
    png_files = [f for f in os.listdir(folder_path) if f.endswith('.png')]

    for file_name in png_files:
         
        image = read_image(path=folder_path +'/'+ file_name)

        # 记录开始时间
        start_time = time.time()
        predictions = inferencer.predict(image=image)
        # 记录结束时间
        end_time = time.time()

        # 计算耗时
        elapsed_time = end_time - start_time
        print(f"Prediction took {elapsed_time:.4f} seconds.")
        print(predictions.pred_score, predictions.pred_label)
        # 创建一个新的图形窗口
        fig, axs = plt.subplots(1, 3, figsize=(18, 8))  # 创建一个1行3列的子图网格

        # 原始图像
        axs[0].imshow(image)
        axs[0].set_title('Original Image')
        axs[0].axis('off')  # 关闭坐标轴

        # 热图
        axs[1].imshow(predictions.heat_map, cmap='hot', interpolation='nearest')
        axs[1].set_title('Heat Map')
        axs[1].axis('off')  # 关闭坐标轴

        # 预测掩模
        axs[2].imshow(predictions.pred_mask, cmap='gray', interpolation='nearest')
        axs[2].set_title('Predicted Mask')
        axs[2].axis('off')  # 关闭坐标轴


        # 添加文本信息到图形的上方中间位置
        fig_text_x = 0.1  # x坐标在图形宽度的中心位置
        fig_text_y = 0.95  # y坐标稍微靠近图形的顶部,避免与子图重叠
        fig.text(fig_text_x, fig_text_y,
                f'Prediction Time: {elapsed_time:.4f} s\n'
                f'Predicted Class: {predictions.pred_label}\n'
                # f'Score: {predictions.pred_score:.4f}\n'
                f'Threshold: {predictions.pred_score:.4f}' if hasattr(predictions, 'pred_score') else '',
                ha='left', va='center', fontsize=12,
                bbox=dict(boxstyle="round", fc="w", ec="0.5", alpha=0.5))  

        # 显示整个图形
        plt.tight_layout()  # 调整子图间的间距
        plt.show()
    print("Done")

    

运行的结果截图

运行结果

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

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

相关文章

【第19章】Vue实战篇之主页面

文章目录 前言一、代码1. 主界面代码2. App.vue 二、展示总结 前言 登录完成之后&#xff0c;应该自动跳转到主页面&#xff0c;接下来我们搭建主界面。 一、代码 1. 主界面代码 <script setup> import {Management,Promotion,UserFilled,User,Crop,EditPen,SwitchBut…

IPV6配置一

1、接口配置 IPV6 的单播地址&#xff1b; 1)link-local (1)rl(config)#interface fastEthernet 0/0 rl(config-if)#ipv6 enable (2)手工或自动配置一个IPV6的AGUA&#xff0c;均会生成一个 link-local地址&#xff1b;但无论配置多少个AGUA地址&#xff0c;也只能生产一个link…

AIDL入门学习一

2.1.1、创建 .aidl 文件 // IImoocAidl.aidl package com.test.server; // Declare any non-default types here with import statements interface IImoocAidl { // 计算两个数的和 int add(int num1,int num2); } 然后make project&#xff0c;会生成IImoocAidl.java…

机器学习_SVM支持向量机

引入&#xff1a;在面对线性可分时&#xff0c;即用一条直线就可以区分数据的时候&#xff0c;需要将直线放在距离数据点距离最大化的位置&#xff0c;这个过程需要寻找最大间隔&#xff0c;即为最优化问题。当数据点不能用一根直线区分——线性不可分&#xff0c;就需要用核函…

网页发起 http 请求的全过程详解图

原文地址&#xff1a;https://dev.to/gallau/lifecycle-of-a-url-request-2gan

JDK中线程池(juc编程)

2.3 JDK中线程池 2.3.1 Executors JDK对线程池也进行了相关的实现&#xff0c;在真实企业开发中我们也很少去自定义线程池&#xff0c;而是使用JDK中自带的线程池。 我们可以使用Executors中所提供的静态方法来创建线程池。 获取线程池的方法&#xff1a; //通过不同的方法…

进阶必看,3种灵活操作PyTorch张量的高级方法

大家好&#xff0c;在PyTorch中进行高级张量操作时&#xff0c;开发者经常面临这样的问题&#xff0c;如何根据一个索引张量从另一个张量中选取元素。 例如有一个包含数千个特征的大规模数据集&#xff0c;需要根据特定的索引模式快速提取信息。本文将介绍三种索引选择方法来解…

java基础概念-数据类型-笔记-标识符-键盘录入

数据类型 分为两种&#xff1a;基本数据类型&#xff0c;引用数据类型 基本数据类型&#xff1a; 注意如果定义long类型变量&#xff0c;需要加L做后缀 long n9999999999L float f10.1F FL大小写都可以 练习 实例&#xff1a; 输出个人信息&#xff1a; public class text…

Danikor智能拧紧轴控制器过压维修知识

【丹尼克尔拧紧轴控制器故障代码维修】 【丹尼克尔Danikor控制器维修具体细节】 丹尼克尔拧紧轴控制器作为一种高精度的电动拧紧工具&#xff0c;广泛应用于各种工业生产线。然而&#xff0c;在使用过程中&#xff0c;由于各种原因&#xff0c;可能会出现Danikor扭矩扳手控制…

Graph RAG 的力量:智能搜索的未来

随着世界越来越依赖数据&#xff0c;对准确、高效的搜索技术的需求从未如此高涨。传统搜索引擎虽然功能强大&#xff0c;但往往难以满足用户复杂而细微的需求&#xff0c;尤其是在处理长尾查询或专业领域时。Graph RAG&#xff08;检索增强生成&#xff09;正是在这种情况下应运…

MBR60200PT-ASEMI逆变箱专用MBR60200PT

编辑&#xff1a;ll MBR60200PT-ASEMI逆变箱专用MBR60200PT 型号&#xff1a;MBR60200PT 品牌&#xff1a;ASEMI 封装&#xff1a;TO-247 最大平均正向电流&#xff08;IF&#xff09;&#xff1a;60A 最大循环峰值反向电压&#xff08;VRRM&#xff09;&#xff1a;200V…

Vue - 第3天

文章目录 一、Vue生命周期二、Vue生命周期钩子三、工程化开发和脚手架1. 开发Vue的两种方式2. 脚手架Vue CLI基本介绍&#xff1a;好处&#xff1a;使用步骤&#xff1a; 四、项目目录介绍和运行流程1. 项目目录介绍2. 运行流程 五、组件化开发六、根组件 App.vue1. 根组件介绍…

汉化版PSAI全面测评,探索国产AI绘画软件的创新力量

引言 随着AI技术的飞速发展&#xff0c;图像处理和绘画领域迎来了新的变革。作为一名AIGC测评博主&#xff0c;今天我们测评的是一款国产AI绘画软件——StartAI&#xff0c;一句话总结&#xff1a;它不仅在技术上毫不逊色于国际大牌&#xff0c;更在用户体验和本地化服务上做到…

GLib库对核心应用的支持

代码&#xff1a; /** main.c** Created on: 2024-6-19* Author: root*/#include <glib.h> // 包含GLib函数库 static GMutex *mutex NULL; static gboolean t1_end FALSE; // 用于结束线程1的标志 static gboolean t2_end FALSE; // 用于结束线程…

Anti-human IL-10 mAb (12G8), biotin:Mabtech热销品

Anti-human IL-10 mAb (12G8), biotin该单克隆抗体能够在ELISpot、FluoroSpot和ELISA等免疫分析方法中特异性检测人白介素10&#xff08;IL-10&#xff09;。可以将该单克隆抗体12G8作为检测抗体与单克隆抗体9D7&#xff08;ca#3430-3&#xff09;作为捕获抗体配对用于ELISpot、…

js语法---理解反射Reflect对象和代理Proxy对象

Reflect 基本要点 反射&#xff1a;reflect是一个内置的全局对象&#xff0c;它的作用就是提供了一些对象实例的拦截方法&#xff0c;它的用法和Math对象相似&#xff0c;都只有静态方法和属性&#xff0c;同时reflect也没有构造器&#xff0c;无法通过new运算符构建实例对象&…

vue自建h5应用,接入企业微信JDK(WECOM-JSSDK),实现跳转添加好友功能

一、项目场景&#xff1a; 1、使用vue开发了一套h5页面的项目 2、这个h5链接是在企业微信里某个地方打开的 3、打开页面的时候有一个好友列表&#xff0c;点击好友列表某一条复制手机号跳转到企业微信添加好友页面 二、实现的效果图 博客只允许上传gif图&#xff0c;所以我只…

SQL注入-下篇

HTTP注入 一、Referer注入 概述 当你访问一个网站的时候&#xff0c;你的浏览器需要告诉服务器你是从哪个地方访问服务器的。如直接在浏览器器的URL栏输入网址访问网站是没有referer的&#xff0c;需要在一个打开的网站中&#xff0c;点击链接跳转到另一个页面。 Less-19 判…