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.icon-default.png?t=O83Ahttps://github.com/openvinotoolkit/anomalib

我下载的版本是:anomalib-1.1.0

操作系统是:win11

代码的结构为:新版本的anomalib没有单独的train.py文件了,后面需要自己新建train.py文件,或者用命令行进行训练。

一、安装

1、需要通过conda新建一个python=3.10的虚拟环境:

conda create -n anomalib_env python=3.10

2、激活环境:

conda activate anomalib_env

3、通过下载源码进行安装:

git clone https://github.com/openvinotoolkit/anomalib.git
cd anomalib
pip install -e .

4、安装anomalib需要的相关库

anomalib install -h
anomalib install
anomalib install -v
anomalib install --option core
anomalib install --option openvino

后面三个的命令我没有截图,依次安装即可。

二、训练

我是使用pycharm进行训练的。使用pycharm打开源码,新建train.py文件。train.py内容如下(来自官网):

# Import the required modules
from anomalib.data import MVTec
from anomalib.models import Patchcore
from anomalib.engine import Engine

# Initialize the datamodule, model and engine
datamodule = MVTec()
model = Patchcore()
engine = Engine()

# Train the model
engine.train(datamodule=datamodule, model=model)

开始训练即可。刚开始训练的时候,会下载MVTec数据集,可能会下载不下来,可以在报错信息里面复制下载链接,自行下载,下载好了之后,放在对应的文件夹中。

我在训练的过程中,报错如下:

参考:解决RuntimeError: An attempt has been made to start a new process before...办法 - 知乎 (zhihu.com)icon-default.png?t=O83Ahttps://zhuanlan.zhihu.com/p/553407062

 修改train.py:

datamodule = MVTec()
# 修改为:
datamodule = MVTec(num_workers=0)

然后就可以训练了。

补充一下,mvtec数据集训练时,更多的参数设置:

# Import the required modules
from anomalib.data import MVTec
from anomalib.models import Patchcore
from anomalib.engine import Engine
from anomalib import TaskType
from anomalib.utils.normalization import NormalizationMethod
from anomalib.data.utils import (
    TestSplitMode,
    ValSplitMode,
)

# Initialize the datamodule, model and engine
datamodule = MVTec(
    num_workers=0,
    category='hazelnut', # mvtec数据集里面的类别
    root = "./datasets/MVTec", # 数据集存放的位置
    train_batch_size = 16,
    eval_batch_size = 16,
    task = TaskType.CLASSIFICATION, # 任务的类型:CLASSIFICATION(分类),DETECTION(检测),SEGMENTATION(分割)
    image_size = None,
    transform = None,
    train_transform = None,
    eval_transform = None,
    test_split_mode = TestSplitMode.FROM_DIR,
    test_split_ratio = 0.2,
    val_split_mode = ValSplitMode.SAME_AS_TEST,
    val_split_ratio = 0.5,
    seed = None
)

model = Patchcore()
engine = Engine(
    default_root_dir = './result_mvtec2', # 结果保存的路径
    task = TaskType.CLASSIFICATION, # 任务的类型:CLASSIFICATION(分类),DETECTION(检测),SEGMENTATION(分割)
    callbacks = None,
    normalization = NormalizationMethod.MIN_MAX,
    threshold = "F1AdaptiveThreshold",
    image_metrics = None,
    pixel_metrics = None,
    logger = None,
)

# Train the model
engine.train(datamodule=datamodule, model=model)

三、推理

predictions = engine.predict(
    datamodule=datamodule,
    model=model,
    ckpt_path="model.ckpt", #修改成自己训练生成的model.ckpt文件路径 
)

训练的时候,会生成一个results文件夹,model.ckpt文件就在results文件夹里面。推理的代码可以直接放在train.py文件的最下面,即engine.train(datamodule=datamodule, model=model)后面。

 四、数据集的划分

官方教程:

Custom Data — Anomalib 2022 documentationicon-default.png?t=O83Ahttps://anomalib.readthedocs.io/en/latest/markdown/guides/how_to/data/custom_data.html通过官网给的链接,下载hazelnut_toy数据集放在datasets文件夹里面:

 可以重新建一个train_toy.py

内容如下:

from anomalib.models import Patchcore
from anomalib.engine import Engine
from anomalib.data import Folder

# Create the datamodule
datamodule = Folder(
    name="hazelnut_toy",
    root="datasets/hazelnut_toy",
    normal_dir="good",
    abnormal_dir="colour",
    task="classification",
    num_workers=0,
    image_size=[256,256],
    val_split_ratio=0.5,
)

# Setup the datamodule
datamodule.setup()

i, train_data = next(enumerate(datamodule.train_dataloader()))
print(train_data.keys())

i, val_data = next(enumerate(datamodule.val_dataloader()))
print(val_data.keys())

i, test_data = next(enumerate(datamodule.test_dataloader()))
print(test_data.keys())

model = Patchcore()
engine = Engine(task="classification")
engine.train(datamodule=datamodule, model=model)

推理的代码为:

predictions = engine.predict(
    datamodule=datamodule,
    model=model,
    ckpt_path="model.ckpt",  # 存放model.ckpt文件的路径,需要对应修改
)

结果如下:

补充一下使用Folder构建数据集并训练时,更多的参数设置:

from anomalib.models import Patchcore
from anomalib.engine import Engine
from anomalib.data import Folder

from anomalib.data.utils import (
    TestSplitMode,
    ValSplitMode,
)

import torchvision.transforms.v2 as v2

data_transform = v2.Compose([
    v2.Resize((256,256)),
    v2.RandomHorizontalFlip(),
    v2.ColorJitter(brightness=(0.1,1)),
])

# task = "classification" or "detection" or "segmentation"
task = "classification"

# Create the datamodule
datamodule = Folder(
    name="mvtec",
    root="../datasets/bottle",
    normal_dir="./train/good",
    abnormal_dir=["./test/broken_large", "./test/broken_small", "./test/contamination"],
    task=task,
    train_batch_size=4,
    eval_batch_size=4,
    num_workers=0,
    image_size=[256,256],
    normal_test_dir='./test/good',
    mask_dir = None,
    normal_split_ratio = 0.2,
    extensions = None,
    transform = data_transform,
    train_transform = None,
    eval_transform = None,
    test_split_mode = TestSplitMode.FROM_DIR,
    test_split_ratio = 0.2,
    val_split_mode = ValSplitMode.FROM_TEST,
    val_split_ratio=0.5,
    seed = None,
)

# Setup the datamodule
datamodule.setup()

model = Patchcore()

engine = Engine(
    task=task,
    default_root_dir='./result_1114'
)
engine.train(datamodule=datamodule, model=model)

五、onnx模型导出

新建export.py文件,内容如下:

from anomalib.models import Patchcore
from anomalib.engine import Engine


model = Patchcore()
engine = Engine(task="classification")
onnx_model = engine.export(
    model= model,
    export_type='onnx',
    export_root=None,
    input_size=[256, 256],
    transform=None,
    compression_type=None,
    datamodule = None,
    metric = None,
    ov_args = None,
    ckpt_path='model.ckpt', # 存放model.ckpt文件的路径,需要对应修改
    )
print(onnx_model)

可以导出onnx模型,具体细节可以研究一下engine.py文件里面的export部分,有比较详细的说明。

六、onnx使用

在主文件夹里面,有一个tool的文件夹,里面有一个inference文件夹。

可以使用里面的openvino_inference.py进行onnx模型推理,有两种使用方式,一种是使用命令行进行推理,一种是直接右击运行py文件进行推理。

使用命令行进行推理:

python tools/inference/openvino_inference.py --weights ./results\weights\onnx\model.onnx --metadata ./results\weights\onnx\metadata.json  --input ./datasets\img_test  --output ./datasets\img_test_out --show 

注意,weights参数是onnx模型的路径,metadata是和onnx在一个文件夹里面(export时自动生成的),input是要推理的图像文件夹或者一张图片,output是推理结果存放的位置,show参数是在推理完成之后,将推理的图像展示出来,也可以不添加这个参数。

直接右击.py的话,就是修改get_parser()里面参数,记得要把required参数都设置成False,不然会报下面的错误(这里是因为我把weights的required值设置为True):

可以将参数按照下面进行修改,这里我只列出了几个必要的参数,其他的当然也可以修改:

    parser.add_argument("--weights", type=Path, default='./results\weights\onnx\model.onnx', required=False, help="Path to model weights")
    parser.add_argument("--metadata", type=Path, default='./results\weights\onnx\metadata.json', required=False, help="Path to a JSON file containing the metadata.")
    parser.add_argument("--input", type=Path, default=r'./datasets\img_test', required=False, help="Path to an image to infer.")
    parser.add_argument("--output", type=Path, default=r'./datasets\img_test_out', required=False, help="Path to save the output image.")

然后就可以直接右击运行py文件即可,推理的结果会存放到设置的output参数的文件夹中。

### 解决 `anomalib` 安装时因缺少 `torch` 模块导致的 `ModuleNotFoundError` 当遇到 `ModuleNotFoundError: No module named 'torch'` 错误时,表明 Python 环境未能找到 PyTorch 库。这通常是因为未安装该库或环境配置不正确。 #### 验证当前环境中是否存在 PyTorch 建议先验证现有环境中是否已安装 PyTorch: ```bash pip list | grep torch ``` 如果列表中不存在 `torch` 或版本不符合需求,则需重新安装合适版本的 PyTorch。 #### 安装兼容版本的 PyTorch 为了确保与 `anomalib` 兼容,推荐通过官方渠道获取并安装最新稳定版 PyTorch: ```bash conda install pytorch torchvision torchaudio cudatoolkit=11.3 -c pytorch ``` 对于非 Conda 用户,可以使用 pip 进行安装: ```bash pip install torch torchvision torchaudio ``` 注意选择适合操作系统的 CUDA 版本[^1]。 #### 创建独立虚拟环境 为了避免与其他项目冲突,强烈建议创建一个新的虚拟环境来管理依赖关系: ```bash python -m venv anomalib_env source anomalib_env/bin/activate # Linux/MacOS .\anomalib_env\Scripts\activate # Windows ``` 激活新环境后再尝试安装所需的包。 #### 更新 `pip` 和其他工具链 有时旧版本的构建工具可能导致安装失败,因此更新这些工具也是必要的: ```bash pip install --upgrade pip setuptools wheel ``` #### 尝试再次安装 `anomalib` 完成上述准备工作后,应该能够顺利安装 `anomalib` 及其依赖项而不触发 `ModuleNotFoundError` 错误: ```bash pip install anomalib ``` 若仍然出现问题,请确认所有前置条件均已满足,并检查是否有特定于操作系统或其他因素引起的特殊问题[^2]。
评论 47
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值