工业布匹瑕疵检测系统设计与实现:基于YOLOv5网络的深度学习模型构建
第四章 布匹瑕疵检测模型的构建
本章将详细介绍基于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库进行图像读取和预处理。预处理步骤包括:
- 读取图像文件。
- 将图像缩放到固定大小。
- 将图像转换为RGB格式。
- 将图像转换为Pytorch张量格式。
- 对图像进行标准化处理。
以下代码展示了图像预处理函数:
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 模型优化
在模型构建和训练过程中,使用了一些技术来提高模型性能,主要包括以下方面:
- 数据增强:使用数据增强增加数据集的多样性,提高模型的泛化能力。
- 学习率衰减:使用学习率衰减优化学习率,提升模型性能。
- EarlyStopping:使用EarlyStopping避免模型过拟合,并在训练过程中保存最佳模型。
- 模型微调:使用预训练的YOLOv5s模型初始化模型,并使用自定义数据集进行微调。
- 验证集:将数据集划分为训练集和验证集,使用验证集评估模型性能。
通过以上技术的使用,成功构建了一个高性能的布匹瑕疵检测模型。
4.7 总结
本章详细介绍了基于Pytorch的工业布匹瑕疵检测系统的模型构建过程。使用YOLOv5网络构建检测模型,并使用自定义数据集进行训练和测试。通过数据增强、学习率衰减、EarlyStopping等技术增强模型性能,最终构建了一个高性能的布匹瑕疵检测模型。
原文地址: https://www.cveoy.top/t/topic/nbuY 著作权归作者所有。请勿转载和采集!