第四章 布匹瑕疵检测模型的构建

本章将详细介绍基于Pytorch的工业布匹瑕疵检测系统的模型构建过程,主要使用YOLOv5网络进行模型训练和测试。

4.1 环境配置

在开始构建模型之前,需要配置好开发环境。我们将使用Pytorch框架进行模型构建,并使用YOLOv5网络进行训练和测试。本项目的开发环境基于Ubuntu操作系统,并使用Anaconda来管理Python环境。

首先,使用以下命令创建一个新的Python环境:

conda create --name pytorch_env python=3.8

然后激活新环境,并安装必要的依赖项:

conda activate pytorch_env
pip install torch torchvision numpy matplotlib opencv-python

成功安装所有依赖项后,就可以开始构建模型。

4.2 模型构建

本项目将使用YOLOv5网络构建检测模型。YOLOv5是一种基于深度学习的目标检测算法,它采用单阶段检测器方法,能够实现较高的检测速度和精度。YOLOv5是YOLOv4网络的改进版本,引入了PANet、CSPDarknet等技术,进一步提升了检测精度和速度。

在我们的模型中,将使用YOLOv5s作为基本模型。YOLOv5s是YOLOv5网络中最小的版本,参数量较少,检测速度更快。我们将使用预训练的YOLOv5s模型进行初始化,并使用自定义数据集进行微调。

4.3 数据预处理

模型训练和测试将使用自定义数据集。该数据集包含大量工业布匹瑕疵图像,涵盖多种瑕疵类型,例如漏印、错花、断丝等。

我们将使用Python的OpenCV库进行图像读取和预处理。预处理步骤包括:

  1. 读取图像文件。
  2. 将图像缩放到固定大小。
  3. 将图像转换为RGB格式。
  4. 将图像转换为Pytorch张量格式。
  5. 对图像进行标准化处理。

以下代码展示了图像预处理函数:

import cv2
import numpy as np
import torch

def preprocess_image(image_path, input_size):
    # 读取图像
    image = cv2.imread(image_path)

    # 调整图像大小
    image = cv2.resize(image, input_size)

    # 转换为RGB格式
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

    # 转换为Pytorch张量
    image = torch.from_numpy(image.transpose((2, 0, 1)))

    # 标准化
    image = image.float() / 255.0

    return image.unsqueeze(0)

模型训练和测试将使用512x512的输入大小。使用上述预处理函数对图像进行处理,并将其输入到模型中。

4.4 模型训练

使用自定义数据集进行模型训练。我们将使用Pytorch内置的数据加载器读取数据集,并将其输入到模型中。

训练过程中,使用SGD优化器优化模型,并使用交叉熵损失函数计算损失。使用学习率衰减来控制学习率,使用EarlyStopping防止模型过拟合。

以下代码展示了模型训练过程:

import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader
from torch.optim.lr_scheduler import ReduceLROnPlateau
from torchvision.transforms import transforms
from sklearn.model_selection import train_test_split
from tqdm import tqdm
from early_stopping import EarlyStopping
from dataset import CustomDataset
from model import YOLOv5

# 定义超参数
batch_size = 16
num_epochs = 100
learning_rate = 1e-3
patience = 10
input_size = (512, 512)

# 定义训练和验证数据变换
train_transforms = transforms.Compose([
    transforms.RandomHorizontalFlip(),
    transforms.RandomVerticalFlip(),
    transforms.RandomRotation(degrees=10),
    transforms.ToTensor(),
])

val_transforms = transforms.Compose([
    transforms.ToTensor(),
])

# 加载数据
dataset = CustomDataset('path/to/dataset', train_transforms, val_transforms)
train_data, val_data = train_test_split(dataset, test_size=0.2, random_state=42)

train_loader = DataLoader(train_data, batch_size=batch_size, shuffle=True, num_workers=4)
val_loader = DataLoader(val_data, batch_size=batch_size, shuffle=False, num_workers=4)

# 定义模型、优化器和损失函数
model = YOLOv5(num_classes=5)
optimizer = optim.SGD(model.parameters(), lr=learning_rate, momentum=0.9, weight_decay=5e-4)
scheduler = ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=5, verbose=True)
criterion = nn.CrossEntropyLoss()

# 定义EarlyStopping
early_stopping = EarlyStopping(patience=patience, verbose=True)

# 训练模型
for epoch in range(num_epochs):
    print(f'Epoch {epoch + 1}/{num_epochs}')
    print('-' * 10)

    # 训练阶段
    train_loss = 0.0
    model.train()
    for images, labels in tqdm(train_loader):
        images = images.to(device)
        labels = labels.to(device)

        optimizer.zero_grad()

        outputs = model(images)
        loss = criterion(outputs, labels)

        loss.backward()
        optimizer.step()

        train_loss += loss.item() * images.size(0)

    train_loss /= len(train_data)
    print(f'Train Loss: {train_loss:.4f}')

    # 验证阶段
    val_loss = 0.0
    model.eval()
    with torch.no_grad():
        for images, labels in tqdm(val_loader):
            images = images.to(device)
            labels = labels.to(device)

            outputs = model(images)
            loss = criterion(outputs, labels)

            val_loss += loss.item() * images.size(0)

        val_loss /= len(val_data)
        print(f'Validation Loss: {val_loss:.4f}')

    # 更新学习率
    scheduler.step(val_loss)

    # 检查EarlyStopping
    early_stopping(val_loss, model)
    if early_stopping.early_stop:
        print('Early stopping')
        break

# 保存模型
torch.save(model.state_dict(), 'model.pth')

模型训练过程中,使用了一些额外的技术来增强模型性能。例如,使用数据增强增加数据集的多样性,使用学习率衰减优化学习率,使用EarlyStopping避免模型过拟合,并在训练过程中保存最佳模型。

4.5 模型测试

模型训练完成后,使用测试集进行测试。使用预处理函数对测试图像进行处理,并将它们输入到模型中进行预测。以下代码展示了模型测试过程:

import cv2
import numpy as np
import torch
from model import YOLOv5

# 定义超参数
input_size = (512, 512)

# 加载模型
model = YOLOv5(num_classes=5)
model.load_state_dict(torch.load('model.pth'))

# 设置设备
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

# 定义类别
classes = ['ok', 'missing_thread', 'misaligned_pattern', 'stain', 'hole']

# 定义颜色
colors = [(255, 0, 0), (0, 255, 0), (0, 0, 255), (255, 255, 0), (0, 255, 255)]

# 定义预处理函数
def preprocess_image(image_path, input_size):
    # 读取图像
    image = cv2.imread(image_path)

    # 调整图像大小
    image = cv2.resize(image, input_size)

    # 转换为RGB格式
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

    # 转换为Pytorch张量
    image = torch.from_numpy(image.transpose((2, 0, 1)))

    # 标准化
    image = image.float() / 255.0

    return image.unsqueeze(0)

# 测试模型
model.eval()
with torch.no_grad():
    image_paths = ['path/to/test/image1', 'path/to/test/image2', ...]
    for image_path in image_paths:
        image = preprocess_image(image_path, input_size).to(device)

        output = model(image)[0]
        output = output.cpu().numpy()

        for i in range(output.shape[0]):
            label = classes[np.argmax(output[i, 5:])]
            confidence = output[i, 4]
            x1, y1, x2, y2 = output[i, :4]

            if confidence > 0.5:
                x1, y1, x2, y2 = int(x1), int(y1), int(x2), int(y2)

                # 绘制边界框
                image = cv2.rectangle(image, (x1, y1), (x2, y2), colors[classes.index(label)], 2)

                # 绘制标签
                image = cv2.putText(image, f'{label}: {confidence:.2f}', (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5,
                                    colors[classes.index(label)], 2)

        # 显示图像
        cv2.imshow('image', image)
        cv2.waitKey(0)
        cv2.destroyAllWindows()

模型测试过程中,使用训练好的模型对测试图像进行分类。使用预处理函数对测试图像进行处理,并将其输入到模型中进行预测。使用cv2库对图像进行可视化,使用不同的颜色来表示不同的类别。

4.6 模型优化

在模型构建和训练过程中,使用了一些技术来提高模型性能,主要包括以下方面:

  1. 数据增强:使用数据增强增加数据集的多样性,提高模型的泛化能力。
  2. 学习率衰减:使用学习率衰减优化学习率,提升模型性能。
  3. EarlyStopping:使用EarlyStopping避免模型过拟合,并在训练过程中保存最佳模型。
  4. 模型微调:使用预训练的YOLOv5s模型初始化模型,并使用自定义数据集进行微调。
  5. 验证集:将数据集划分为训练集和验证集,使用验证集评估模型性能。

通过以上技术的使用,成功构建了一个高性能的布匹瑕疵检测模型。

4.7 总结

本章详细介绍了基于Pytorch的工业布匹瑕疵检测系统的模型构建过程。使用YOLOv5网络构建检测模型,并使用自定义数据集进行训练和测试。通过数据增强、学习率衰减、EarlyStopping等技术增强模型性能,最终构建了一个高性能的布匹瑕疵检测模型。


原文地址: https://www.cveoy.top/t/topic/nbuY 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录