缺陷检测:使用PatchCore训练自己的数据集

news/2024/7/21 7:25:56 标签: 图像处理, opencv, python

文章目录

  • 前期准备
    • 两种方法
  • 演示
  • 运行结果

代码详解见缺陷检测–PatchCore的代码解读

前期准备

必须包含有训练图片(无缺陷图片)、测试图片(缺陷图片)和ground_truth,并且ground_truth必须与对应图片的名称相同。
本文我用到的是Magnetic-Tile-Defect数据集

两种方法

第一种(简单):将数据集路径规则改成项目中mvtec的样式
第二种(复杂):编写一个自己的Dataset,参考src\datasets\mvtec.pyMVTecDataset,注意__getitem__返回的必须是一个字典类型,可以阅读PatchCore作者的回答

演示

本人此次使用的是第一种方法。
编写一个脚本,重新规划数据集的路径规则,但是我稍微写复杂了一点,使用了类来操作。

python">import os
import glob
import shutil
from abc import ABC, abstractmethod


class AddNewClass(ABC):
    @abstractmethod
    def copy_to_mvtec(self, image_list, save_path):
        pass


class MagneticTile(AddNewClass):
    def __init__(self, path, classname):
        self.path = path
        self.classname = classname
        # 'mvtec'表示mvtec数据库的根路径, classname表示这个数据的名称
        self.train_folder = os.path.join('mvtec', classname, r'train/good')
        self.test_folder = os.path.join('mvtec', classname, 'test')
        self.gt_folder = os.path.join('mvtec', classname, 'ground_truth')
        self.image_dict = self.get_image_dict()

    def get_image_dict(self) -> dict:
        train_image = []
        test_image = []
        ground_truth = []

        jpg_files = glob.glob(os.path.join(self.path, '*\\Imgs\\*.jpg'))
        for file in jpg_files:
            path_list = file.split('\\')
            # train_image.append(file)
            if path_list[1] == 'MT_Free':
                train_image.append(file)
            else:
                test_image.append(file)

        png_files = glob.glob(os.path.join(self.path, '*\\Imgs\\*.png'))
        for file in png_files:
            ground_truth.append(file)

        image_dict = {'train': train_image, 'test': test_image, 'gt': ground_truth}
        return image_dict

    def copy_to_mvtec(self):
        main_folder_path = os.path.join('mvtec', self.classname)
        os.makedirs(main_folder_path, exist_ok=True)

        # 复制训练文件
        train_folder_path = os.path.join(main_folder_path, 'train', 'good')
        os.makedirs(train_folder_path, exist_ok=True)
        for file_path in self.image_dict['train']:
            path_list = file_path.split('\\')
            target_path = os.path.join(train_folder_path, path_list[-1])
            shutil.copy(file_path, target_path) # 复制粘贴

        # 复制测试文件
        for file_path in self.image_dict['test']:
            path_list = file_path.split('\\')
            test_folder_path = os.path.join(main_folder_path, 'test', path_list[1][3:])
            os.makedirs(test_folder_path, exist_ok=True)
            target_path = os.path.join(test_folder_path, path_list[-1])
            shutil.copy(file_path, target_path)

        # 复制ground_truth
        for file_path in self.image_dict['gt']:
            path_list = file_path.split('\\')
            gt_folder_path = os.path.join(main_folder_path, 'ground_truth', path_list[1][3:])
            os.makedirs(gt_folder_path, exist_ok=True)
            target_path = os.path.join(gt_folder_path, path_list[-1])
            shutil.copy(file_path, target_path)


if __name__ == "__main__":
    mt = MagneticTile(r'Magnetic-Tile-Defect', 'magnetic_tile')
    mt.copy_to_mvtec()
    # print(mt.image_dict)

当然,还需要在src\datasets\mvtec.py_CLASSNAMES中添加一个类——magnetic_tile

运行结果

运行时,参数部分直接输入 -d magnetic_tile
同上一篇结果一样,我的输出为原始图片大小,但是不知道是不是因为图片不是正方形的,导致训练结果不好。。。
在这里插入图片描述
在这里插入图片描述


http://www.niftyadmin.cn/n/5409903.html

相关文章

Java面试篇【MyCat】常见面试题(2024最新)

Mycat 1.Mycat 分库分表中间件,将存放在一个数据库的数据存放在不同的多个数据库中。来分散负载。 scheme 逻辑库,对应mysql的数据库,一个逻辑库定义了包含的所有table.是数据库集群对外的统一访问接口。table 逻辑表,和物理数…

hack the box之Perfection

端口扫描 服务扫描 漏洞扫描 访问web看到的 便扫描边看一下网站 这个是个成绩计计算器 抓个包看一下 明文传输,写个反弹shell(php)试一下 直接出发错误 直接加密吧 链接成功 第一个flag 由于没有sudo -l我们find一下文件 没有什么值得关注的…

通俗理解TP、FP、TN、FN

通俗理解TP、FP、TN、FN 虽然学了很多遍,但还是经常弄混这几个概念。实在是太绕了,真真假假,假假真真。归根到底,其实是没有正确理解两个标志位的含义。 基本概念 首先要明白两个标志位分别表示什么含义?第一位表示分…

MyBatis 学习(六)之动态 SQL

目录 1 动态 SQL 介绍 2 if 标签 3 where 标签 4 set 标签 5 trim 标签 6 choose、when、otherwise 标签 7 foreach 标签 8 bind 标签 1 动态 SQL 介绍 动态 SQL 是 MyBatis 强大特性之一,极大的简化我们拼装 SQL 的操作。MyBatis 的动态 SQL 是基于 OGNL 的…

Java继承与多态:深入理解继承、组合和多态的精髓!

Java继承与多态:深入理解继承、组合和多态的精髓! 引言 欢迎来到这篇关于Java继承与多态的博客!在Java编程中,继承与多态是两个非常重要的概念,它们为我们构建灵活而高效的代码提供了强大的支持。本文将深入探讨Java继…

运用qsort函数进行快排并使用C语言模拟qsort

qsort 函数的使用 首先qsort函数是使用快速排序算法来进行排序的,下面我们打开官网来查看qsort是如何使用的。 这里有四个参数,首先base 是至待排序的数组的首元素的地址,num 是值这个数组的元素个数,size 是指每个元素的大小&am…

electorn实现调用windows系统软键盘

在渲染进程的输入框触发的事件中进行ipcRender.send操作 methods: {showDialog() { ipcRenderer.send(open-osk)}}, 在主进程中代码如下 //打开软键盘 ipcMain.on(open-osk, (event, arg) > {exec(osk.exe);//调取windows系统软盘}); 更改软键盘的大小 1、新建一个…

16:00面试,16:06就出来了,问的问题过于变态了。。。

从小厂出来,没想到在另一家公司又寄了。 到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到2月一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40%…