Come on和我一起做基于深度学习的缺陷检测一(数据准备)

本博介绍深度学习织物疵点检测数据集构建流程,涵盖数据标注、图像增强及XML文件同步处理,旨在解决缺陷检测数据不足问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


这里有几句话要说:

  1. 这个项目会持续更新,由于要忙于毕业答辩和论文修改,更新时间不定;
  2. 由于本人研三,今年毕业要去工作,可能会出现拖更的现象;
  3. 我把以前Python-OpenCV的相关博客删除了,因为这个OPENCV更新太快,发现有的已经没啥作用了,以后的博客尽量用矩阵运算的形式来编写代码。

数据集的制作

这里数据集用的是我博客的数据集==>织物疵点数据集,选择这个数据集是因为以下两点原因:

  1. 很多人都问我能不能进行深度学习的训练,我想试试能不能;
  2. 网上现有的数据集关于缺陷检测的数据量都很少,我在下载了一部分开源的数据集,哪天我整理好,把链接发出来。

数据标注

首先要明白,缺陷检测是根据检测要求进行标注的,大致分为以下几种情况:

  1. 检测是否有缺陷,就像我们熟悉的猫狗识别,实际上是个二分类问题;
  2. 检测是否有缺陷,并分类,就像是手写数字识别,你要知道缺陷是啥就OK;
  3. 检测是否有缺陷,分类并定位。这就像是YoLo系列和FasterRcnn一样,你不光要知道是啥,还要告诉我它在哪。

这里呢,我准备一步到位,直接实现检测是否有缺陷,分类并定位。
数据集要实现分类定位,首先要做的就是数据的标注,这里的标注工具我用的是,精灵标注助手,下载戳 精灵标注助手,至于为啥不用LabelImg,就是个人喜好了。
由于我的数据集是包含粗条纹和方格布的,为了给增加电脑的信心,这里就不用这两个类型的了,把纯色的和复合色的布匹通过截图软件进行图像截取,这里我截取的是512x512大小,其中,对每张含有疵点的图像进行不同位置的截取,每张图像截取两张。费尽九牛二虎之力终于截完了所有的图像,一共得到了2728张图像。其中每类疵点包含的数据数量如下:

疵点类别 数目 命名
断纱 308 DuanSha
带纱 425 DaiSha
脱纱 668 TuoSha
破洞 112 PoDong
污渍 422 WuZi
棉球 184 MianQiu
正常 609 Normal

可以看出数据类别出现了不平衡的问题,不过这现在对我来说不重要。先是根据命名把截图改个名字,代码直接放上,(这个代码好像是在网上copy的,好久之前的就忘记了)

import os

class BatchRename():
    '''
    批量重命名文件夹中的图片文件
    '''
    def __init__(self):
        self.path = 'E:/Learn/dataset/Making_dataset/Normal'  # 表示需要命名处理的文件夹

    def rename(self):
        filelist = os.listdir(self.path)  # 获取文件路径
        total_num = len(filelist)  # 获取文件长度(个数)
        i = 1  # 表示文件的命名是从1开始的
        for item in filelist:
            if item.endswith('.png'):  # 初始的图片的格式为jpg格式的(或者源文件是png格式及其
                # 他格式,后面的转换格式就可以调整为自己需要的格式即可)
                src = os.path.join(os.path.abspath(self.path), item)
                dst = os.path.join(os.path.abspath(self.path), 'Normal_0' + str(i) + '.jpg')  # 处理后的格式也为jpg格式的,当然这里可以改成png格式
                # dst = os.path.join(os.path.abspath(self.path), '0000' + format(str(i), '0>3s') + '.jpg')    这种情况下的命名格式为0000000.jpg形式,可以自主定义想要的格式
                try:
                    os.rename(src, dst)
                    print('converting %s to %s ...' % (src, dst))
                    i = i + 1
                except:
                    continue
        print('total %d to rename & converted %d jpgs' % (total_num, i))

if __name__ == '__main__':
    demo = BatchRename()
    demo.rename()

这里我把它定义为 image_rename.py 文件
接下来使用精灵标注助手进行标注了,再次费尽九牛二虎之力后,完成了数据的标注。
在这里插入图片描述
这里我导出两种格式,方便后续使用,分别是 .xml.json格式。整完就是这样了。
在这里插入图片描述

数据增强(图像和xml文件同时增强)

图像数据增强的方式有很多比如图像的翻转、缩放、旋转、直方图均衡化等等,由于疵点检测不适合用颜色变换来增强图像,同时为确保增强后的图像大小依然为512x512大小的图像,所以我这里使用图像的翻转、旋转来增加数据量。这里我简单的写了个代码,我叫它image_increase.py

import numpy as np
import cv2
import math


# 图像缩放
def image_resize(image,model_type,xita_x,xita_y):
    '''
    :param image:
    :param model_type: 0:固定尺寸裁剪; model_type: 1:系数缩放;
    :param xita_x:
    :param xita_y:
    :return:
    '''
    if model_type == 0:
        image_resize_1 = cv2.resize(image, (xita_x, xita_y))
    elif model_type == 1:
        image_resize_1 = cv2.resize(image,(0,0),fx=xita_x,fy=xita_y,interpolation=cv2.INTER_NEAREST)
    else:
        print('param error')
        image_resize_1 = image
    return image_resize_1


def img_rotate(image, angle):

    h, w, channels = image.shape
    # 图像长h=600,宽w=554
    anglePi = angle * math.pi / 180.0
    cosA = math.cos(anglePi)
    sinA = math.sin(anglePi)
    tanA = math.tan(anglePi)
    img_r = np.zeros((h,w, channels), dtype=np.uint8)
    center_array = np.array([[1,0,0],
                             [0,-1,0],
                             [-0.5*w,0.5*h,1]
                             ])
    i_center_array= np.array([[1,0,0],
                             [0,-1,0],
                             [0.5*w,0.5*h,1]
                             ])
    rotate_array = np.array([[cosA,-sinA,0],
                             [sinA,cosA,0],
                             [0,0,1]
                             ])
    rotate = np.dot(center_array, rotate_array)
    i_rotate = np.dot(rotate, i_center_array)

    for i in range(0, w):
        for j in range(0, h):
            # x = int(cosA*i-sinA*j-0.5*w*cosA+0.5*h*sinA+0.5*w)
            # y = int(sinA*i+cosA*j-0.5*w*sinA-0.5*h*cosA+0.5*h)
            new = np.dot(np.array([i,j,1]),i_rotate)

            x = int(new[0])
            y = int(new[1])

            
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值