Pytorch卷积神经网络花生米分类

2024-03-28 05:59

本文主要是介绍Pytorch卷积神经网络花生米分类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

训练数据在最下方的网盘链接里,代码格式最好用ipynb的,方便一块一块的运行,当然py格式的也可以运行.

首先创建自定义数据集类ImageDataset继承自torch.utils.data的Dataset

import os
import cv2
import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import Dataset, DataLoader# 定义数据集类
class ImageDataset(Dataset):def __init__(self, folder_path):self.dataset = []self.labels = []for class_name in os.listdir(folder_path):class_folder = os.path.join(folder_path, class_name)if not os.path.isdir(class_folder):continuelabel = int(class_name.split('.')[0])for image_file in os.listdir(class_folder):image_path = os.path.join(class_folder, image_file)image = cv2.imread(image_path)image = cv2.resize(image, (64, 64))image = np.transpose(image, (2, 0, 1))self.dataset.append(image)self.labels.append(label)self.dataset = np.array(self.dataset)self.labels = np.array(self.labels)self.dataset = torch.tensor(self.dataset, dtype=torch.float32)self.labels = torch.tensor(self.labels, dtype=torch.long)def __len__(self):return len(self.dataset)def __getitem__(self, index):return self.dataset[index], self.labels[index]train_dataset = ImageDataset('shuju/train')
test_dataset = ImageDataset('shuju/test')
val_dataset = ImageDataset('shuju/validation')# 创建数据加载器
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=32, shuffle=False)
val_loader = DataLoader(val_dataset, batch_size=32, shuffle=False)

然后要创建卷积神经网络模型

class CNN(nn.Module):def __init__(self):super(CNN, self).__init__()self.conv1 = nn.Sequential(nn.Conv2d(3, 32, kernel_size=3, stride=1, padding=1),nn.ReLU(),nn.MaxPool2d(kernel_size=2, stride=2))self.conv2 = nn.Sequential(nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1),nn.ReLU(),nn.MaxPool2d(kernel_size=2, stride=2))self.conv3 = nn.Sequential(nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1),nn.ReLU(),nn.MaxPool2d(kernel_size=2, stride=2))self.conv4 = nn.Sequential(nn.Conv2d(128, 128, kernel_size=3, stride=1, padding=1),nn.ReLU(),nn.MaxPool2d(kernel_size=2, stride=2))self.fc1 = nn.Linear(128*4*4, 128)self.fc2 = nn.Linear(128, 8)def forward(self, x):x = self.conv1(x)x = self.conv2(x)x = self.conv3(x)x  =  self.conv4(x)x = x.view(-1, 128*4*4)x = self.fc1(x)x = self.fc2(x)return x
# 实例化模型并定义优化器和损失函数
model = CNN()
optimizer = optim.Adam(model.parameters(), lr=0.001)
criterion = nn.CrossEntropyLoss()

之后就开始训练模型了

def calculate_loss(model, data_loader, criterion):total_loss = 0.0model.eval()  # 将模型设置为评估模式with torch.no_grad():for images, labels in data_loader:outputs = model(images)loss = criterion(outputs, labels)total_loss += loss.item() * images.size(0)return total_loss / len(data_loader.dataset)import matplotlib.pyplot as plt
num_epochs = 10
l=3
train_losses = []
test_losses = []
for epoch in range(num_epochs):for i, (images, labels) in enumerate(train_loader):optimizer.zero_grad()outputs = model(images)loss = criterion(outputs, labels)loss.backward()optimizer.step()if (i + 1) % 50 == 0:print('Epoch [{}/{}], Batch [{}/{}], Loss: {:.4f}'.format(epoch + 1, num_epochs, i + 1, len(train_loader), loss.item()))train_loss = calculate_loss(model, train_loader, criterion)test_loss = calculate_loss(model, test_loader, criterion)train_losses.append(train_loss)test_losses.append(test_loss)if loss.item()<l:torch.save(model.state_dict(), 'model4.pth')                plt.plot(range(1, num_epochs + 1), train_losses, label='Train Loss')
plt.plot(range(1, num_epochs + 1), test_losses, label='Test Loss')
plt.xlabel('轮数')
plt.ylabel('Loss')
plt.title('Loss')
plt.legend()
plt.show()

等模型训练好之后就可以用训练好的模型来预测验证集数据的分类了,

#梯度不更新
with torch.no_grad():correct = 0total = 0flag=0for images, labels in  val_loader:outputs = model(images)_, predicted = torch.max(outputs.data, 1)total += labels.size(0)if(flag==0):print(labels)flag=1print(predicted)print((predicted == labels).sum().item())correct += (predicted == labels).sum().item()print('Accuracy of the model on the train images: {} %'.format(100 * correct / total))

也可以保存或者加载模型

torch.save(model.state_dict(), 'model.pth')
# 加载模型
model = CNN()
model.load_state_dict(torch.load('model4.pth'))
model.eval()

也可以一个一个地去测试属于哪个分类

#一个一个测试
image = cv2.imread("./shuju/test/0.bandian/20210715100920794.bmp")
image = cv2.resize(image, (64, 64))
image = np.transpose(image, (2, 0, 1))
image = torch.tensor(image, dtype=torch.float32)
image = image.unsqueeze(0)    
class_names = ['bandian', 'famei', 'faya', 'hongpi', 'qipao', 'youwu', 'zhengchang', 'baiban']# 进行预测
with torch.no_grad():outputs = model(image)_, predicted = torch.max(outputs.data, 1)class_name = class_names[predicted.item()]    print(class_name)

接下来就是用计算机视觉opencv处理一张大图片中的花生米分类了,这一步也是比较核心的.

将花生米按轮廓截取出来,然后用蓝色填充成122*220大小的图片(因为训练时候的数据就是这样的),之后进行推理并画框和文字.

import sys
import cv2
import numpy as np
class_names = ['bandian', 'famei', 'faya', 'hongpi', 'qipao', 'youwu', 'zhengchang', 'baiban']
def ShowImage(name, image):cv2.imshow(name, image)cv2.waitKey(0)  cv2.destroyAllWindows()img=cv2.imread('huasheng4.jpg')
# img=cv2.resize(img,(img.shape[1]//3, img.shape[0]//3))
img2=img.copy()
image=img.copy()hsv_image=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)lower_color = np.array([90, 50, 50])   # 目标颜色的下限
upper_color = np.array([130, 255, 255])   # 目标颜色的上限# 创建遮罩层
mask = cv2.inRange(hsv_image, lower_color, upper_color)
# 替换颜色
replacement_color = (0, 0, 0)
image[mask == 255] = replacement_color
img2[mask==255]=(255,0,0)
# 转灰度
image_gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
#二值化
_, binary_image = cv2.threshold(image_gray, 11, 255, cv2.THRESH_BINARY)
#得到轮廓
contours, hierarchy = cv2.findContours(binary_image, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE) # opencv旧版是返回三个值,新版返回两个值
# contours是一个list类型的点的集合的集合(每个点的集合代表一个轮廓)
# hierarchy 表示图像保存的层级
area_threshold=500
contours2 = []
#去除小的轮廓
for con in contours:# 计算轮廓面积area = cv2.contourArea(con)# 如果轮廓面积大于阈值,则将其添加到新的列表中if area > area_threshold:contours2.append(con)
if len(contours2) == 0:print("没有花生.")sys.exit()
print(len(contours)-len(contours2))
print(len(contours2))
target_width, target_height = 122, 220
for con in contours2:x,y,w,h = cv2.boundingRect(con)i=img2[y:y + h, x:x + w]height, width, depth = i.shapepadding_width = target_width - widthpadding_height = target_height - height# 计算填充位置left = padding_width // 2right = padding_width - lefttop = padding_height // 2bottom = padding_height - top# 进行填充,并将填充部分设置为蓝色i = cv2.copyMakeBorder(i, top, bottom, left, right, cv2.BORDER_CONSTANT, value=[255, 0, 0])i = cv2.resize(i, (64, 64))i = np.transpose(i, (2, 0, 1))i = torch.tensor(i, dtype=torch.float32)i = i.unsqueeze(0)with torch.no_grad():outputs = model(i)_, predicted = torch.max(outputs.data, 1)class_name = class_names[predicted.item()]cv2.rectangle(img, (x,y), (x+w,y+h), (0,0,255), 2)cv2.putText(img,class_name,(x,y),cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 255), 2)ShowImage('img',img)

下图就是预测出来的结果啦

链接:https://pan.baidu.com/s/1ynZjdeoq3VJ_qvnn6WnDIg?pwd=qwer 
提取码:qwer

这篇关于Pytorch卷积神经网络花生米分类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/854659

相关文章

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

PyTorch使用教程之Tensor包详解

《PyTorch使用教程之Tensor包详解》这篇文章介绍了PyTorch中的张量(Tensor)数据结构,包括张量的数据类型、初始化、常用操作、属性等,张量是PyTorch框架中的核心数据结构,支持... 目录1、张量Tensor2、数据类型3、初始化(构造张量)4、常用操作5、常用属性5.1 存储(st

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

图神经网络模型介绍(1)

我们将图神经网络分为基于谱域的模型和基于空域的模型,并按照发展顺序详解每个类别中的重要模型。 1.1基于谱域的图神经网络         谱域上的图卷积在图学习迈向深度学习的发展历程中起到了关键的作用。本节主要介绍三个具有代表性的谱域图神经网络:谱图卷积网络、切比雪夫网络和图卷积网络。 (1)谱图卷积网络 卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即F{f*g}

用Pytho解决分类问题_DBSCAN聚类算法模板

一:DBSCAN聚类算法的介绍 DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法,DBSCAN算法的核心思想是将具有足够高密度的区域划分为簇,并能够在具有噪声的空间数据库中发现任意形状的簇。 DBSCAN算法的主要特点包括: 1. 基于密度的聚类:DBSCAN算法通过识别被低密

机器学习之监督学习(三)神经网络

机器学习之监督学习(三)神经网络基础 0. 文章传送1. 深度学习 Deep Learning深度学习的关键特点深度学习VS传统机器学习 2. 生物神经网络 Biological Neural Network3. 神经网络模型基本结构模块一:TensorFlow搭建神经网络 4. 反向传播梯度下降 Back Propagation Gradient Descent模块二:激活函数 activ

PMP–一、二、三模–分类–14.敏捷–技巧–看板面板与燃尽图燃起图

文章目录 技巧一模14.敏捷--方法--看板(类似卡片)1、 [单选] 根据项目的特点,项目经理建议选择一种敏捷方法,该方法限制团队成员在任何给定时间执行的任务数。此方法还允许团队提高工作过程中问题和瓶颈的可见性。项目经理建议采用以下哪种方法? 易错14.敏捷--精益、敏捷、看板(类似卡片)--敏捷、精益和看板方法共同的重点在于交付价值、尊重人、减少浪费、透明化、适应变更以及持续改善等方面。

【python计算机视觉编程——8.图像内容分类】

python计算机视觉编程——8.图像内容分类 8.图像内容分类8.1 K邻近分类法(KNN)8.1.1 一个简单的二维示例8.1.2 用稠密SIFT作为图像特征8.1.3 图像分类:手势识别 8.2贝叶斯分类器用PCA降维 8.3 支持向量机8.3.2 再论手势识别 8.4 光学字符识别8.4.2 选取特征8.4.3 多类支持向量机8.4.4 提取单元格并识别字符8.4.5 图像校正

Nn criterions don’t compute the gradient w.r.t. targets error「pytorch」 (debug笔记)

Nn criterions don’t compute the gradient w.r.t. targets error「pytorch」 ##一、 缘由及解决方法 把这个pytorch-ddpg|github搬到jupyter notebook上运行时,出现错误Nn criterions don’t compute the gradient w.r.t. targets error。注:我用