Pytorch深度學習之實現病蟲害圖像分類

一、pytorch框架

1.1、概念

PyTorch是一個開源的Python機器學習庫,基於Torch,用於自然語言處理等應用程序。

2017年1月,由Facebook人工智能研究院(FAIR)基於Torch推出瞭PyTorch。它是一個基於Python的可續計算包,提供兩個高級功能:

1、具有強大的GPU加速的張量計算(如NumPy)。

2、包含自動求導系統的深度神經網絡。

1.2、機器學習與深度學習的區別

兩者之間區別很多,在本篇博客中隻簡單描述一部分。以圖片的形式展現。

前者為機器學習的過程。

後者為深度學習的過程。

1.3、在python中導入pytorch成功截圖

二、數據集

本次實驗使用的是coco數據集中的植物病蟲害數據集。分為訓練文件Traindata和測試文件TestData.,

TrainData有9種分類,每一種分類有100張圖片。

TestData有9中分類,每一種分類有10張圖片。

在我下一篇博客中將數據集開源。

下面是我的數據集截圖:

三、代碼復現

3.1、導入第三方庫

import torch
from torch.utils.data import Dataset, DataLoader
import numpy as np
import matplotlib
import os
import cv2
from PIL import Image
import torchvision.transforms as transforms
import torch.optim as optim
from torch.autograd import Variable
import torch.nn as nn
import torch.nn.functional as F
from Test.CNN import Net
import json
from Test.train_data import Mydataset,pad_image

3.2、CNN代碼

# 構建神經網絡
class Net(nn.Module):#定義網絡模塊
    def __init__(self):
        super(Net, self).__init__()
        # 卷積,該圖片有3層,6個特征,長寬均為5*5的像素點,每隔1步跳一下
        self.conv1 = nn.Conv2d(3, 6, 5)
        #//(conv1): Conv2d(3, 6, kernel_size=(5, 5), stride=(1, 1))
        self.pool = nn.MaxPool2d(2, 2)#最大池化
        #//(pool): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
        self.conv2 = nn.Conv2d(6, 16, 5)#卷積
        #//(conv2): Conv2d(6, 16, kernel_size=(5, 5), stride=(1, 1))
        self.fc1 = nn.Linear(16*77*77, 120)#全連接層,圖片的維度為16,
        #(fc1): Linear(in_features=94864, out_features=120, bias=True)
        self.fc2 = nn.Linear(120, 84)#全連接層,輸入120個特征輸出84個特征
        self.fc3 = nn.Linear(84, 7)#全連接層,輸入84個特征輸出7個特征
 
   def forward(self, x):
        print("x.shape1: ", x.shape)
        x = self.pool(F.relu(self.conv1(x)))
        print("x.shape2: ", x.shape)
        x = self.pool(F.relu(self.conv2(x)))
        print("x.shape3: ", x.shape)
        x = x.view(-1, 16*77*77)
        print("x.shape4: ", x.shape)
        x = F.relu(self.fc1(x))
        print("x.shape5: ", x.shape)
        x = F.relu(self.fc2(x))
        print("x.shape6: ", x.shape)
        x = self.fc3(x)
        print("x.shape7: ", x.shape)
        return x


3.3、測試代碼

img_path = "TestData/test_data/1/Apple2 (1).jpg" #使用相對路徑
image = Image.open(img_path).convert('RGB')
image_pad = pad_image(image, (320, 320))
input = transform(image_pad).to(device).unsqueeze(0)
output = F.softmax(net(input), 1)
_, predicted = torch.max(output, 1)
score = float(output[0][predicted]*100)
print(class_map[predicted], " ", str(score)+" %")
plt.imshow(image_pad) # 顯示圖片

四、訓練結果

4.1、LOSS損失函數

4.2、 ACC

4.3、單張圖片識別準確率

四、小結

這次搭建的網絡是基於深度學習框架Lenet,並自己做瞭一些修改完成。最終的訓練的結果LOSS接近0,ACC接近100%。但是一般的識別率不會達到這麼高,該模型可能會過擬合。可采取剪枝等操作減小過擬合。

到此這篇關於Pytorch深度學習之實現病蟲害圖像分類的文章就介紹到這瞭,更多相關Pytorch圖像分類內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: