公司动态
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.https://github.com/openvinotoolkit/anomalib我下载的版本是anomalib-1.1.0操作系统是win11代码的结构为新版本的anomalib没有单独的train.py文件了后面需要自己新建train.py文件或者用命令行进行训练。一、安装1、需要通过conda新建一个python3.10的虚拟环境conda create -n anomalib_env python3.102、激活环境conda activate anomalib_env3、通过下载源码进行安装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(datamoduledatamodule, modelmodel)开始训练即可。刚开始训练的时候会下载MVTec数据集可能会下载不下来可以在报错信息里面复制下载链接自行下载下载好了之后放在对应的文件夹中。我在训练的过程中报错如下参考解决RuntimeError: An attempt has been made to start a new process before...办法 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/553407062修改train.pydatamodule MVTec() # 修改为 datamodule MVTec(num_workers0)然后就可以训练了。补充一下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_workers0, categoryhazelnut, # 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(datamoduledatamodule, modelmodel)三、推理predictions engine.predict( datamoduledatamodule, modelmodel, ckpt_pathmodel.ckpt, #修改成自己训练生成的model.ckpt文件路径 )训练的时候会生成一个results文件夹model.ckpt文件就在results文件夹里面。推理的代码可以直接放在train.py文件的最下面即engine.train(datamoduledatamodule, modelmodel)后面。四、数据集的划分官方教程Custom Data — Anomalib 2022 documentationhttps://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( namehazelnut_toy, rootdatasets/hazelnut_toy, normal_dirgood, abnormal_dircolour, taskclassification, num_workers0, image_size[256,256], val_split_ratio0.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(taskclassification) engine.train(datamoduledatamodule, modelmodel)推理的代码为predictions engine.predict( datamoduledatamodule, modelmodel, ckpt_pathmodel.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( namemvtec, root../datasets/bottle, normal_dir./train/good, abnormal_dir[./test/broken_large, ./test/broken_small, ./test/contamination], tasktask, train_batch_size4, eval_batch_size4, num_workers0, 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_ratio0.5, seed None, ) # Setup the datamodule datamodule.setup() model Patchcore() engine Engine( tasktask, default_root_dir./result_1114 ) engine.train(datamoduledatamodule, modelmodel)五、onnx模型导出新建export.py文件内容如下from anomalib.models import Patchcore from anomalib.engine import Engine model Patchcore() engine Engine(taskclassification) onnx_model engine.export( model model, export_typeonnx, export_rootNone, input_size[256, 256], transformNone, compression_typeNone, datamodule None, metric None, ov_args None, ckpt_pathmodel.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, typePath, default./results\weights\onnx\model.onnx, requiredFalse, helpPath to model weights) parser.add_argument(--metadata, typePath, default./results\weights\onnx\metadata.json, requiredFalse, helpPath to a JSON file containing the metadata.) parser.add_argument(--input, typePath, defaultr./datasets\img_test, requiredFalse, helpPath to an image to infer.) parser.add_argument(--output, typePath, defaultr./datasets\img_test_out, requiredFalse, helpPath to save the output image.)然后就可以直接右击运行py文件即可推理的结果会存放到设置的output参数的文件夹中。