最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python?pytorch圖像識別基礎(chǔ)介紹

 更新時間:2022年02月13日 14:26:10   作者:m0_60681041  
大家好,本篇文章主要講的是python?pytorch圖像識別基礎(chǔ)介紹,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下

一、數(shù)據(jù)集爬取

現(xiàn)在的深度學習對數(shù)據(jù)集量的需求越來越大了,也有了許多現(xiàn)成的數(shù)據(jù)集可供大家查找下載,但是如果你只是想要做一下深度學習的實例以此熟練一下或者找不到好的數(shù)據(jù)集,那么你也可以嘗試自己制作數(shù)據(jù)集——自己從網(wǎng)上爬取圖片,下面是通過百度圖片爬取數(shù)據(jù)的示例。

import os
import time
import requests
import re
def imgdata_set(save_path,word,epoch):
    q=0     #停止爬取圖片條件
    a=0     #圖片名稱
    while(True):
        time.sleep(1)
        url="https://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word={}&pn={}&ct=&ic=0&lm=-1&width=0&height=0".format(word,q)
        #word=需要搜索的名字
        headers={
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36 Edg/88.0.705.56'
        }
        response=requests.get(url,headers=headers)
        # print(response.request.headers)
        html=response.text
        # print(html)
        urls=re.findall('"objURL":"(.*?)"',html)
        # print(urls)
        for url in urls:
            print(a)    #圖片的名字
            response = requests.get(url, headers=headers)
            image=response.content
            with open(os.path.join(save_path,"{}.jpg".format(a)),'wb') as f:
                f.write(image)
            a=a+1
        q=q+20
        if (q/20)>=int(epoch):
            break
if __name__=="__main__":
    save_path = input('你想保存的路徑:')
    word = input('你想要下載什么圖片?請輸入:')
    epoch = input('你想要下載幾輪圖片?請輸入(一輪為60張左右圖片):')  # 需要迭代幾次圖片
    imgdata_set(save_path, word, epoch)

通過上述的代碼可以自行選擇自己需要保存的圖片路徑、圖片種類和圖片數(shù)目。如我下面做的幾種常見的盆栽植物的圖片爬取,只需要執(zhí)行六次代碼,改變相應的盆栽植物的名稱就可以了。下面是爬取盆栽蘆薈的輸入示例,輸入完成后按Enter執(zhí)行即可,會自動爬取圖片保存到指定文件夾,

注意:圖片類型需要為中文

如圖即為爬取后的圖片。

在這里插入圖片描述

可以看到圖片中出現(xiàn)了一些無法打開的圖片,同時因為是直接爬取的網(wǎng)絡上的圖片,可能會出現(xiàn)一些相同的圖片,這些都需要進行刪除,這就需要我們進行第二步處理了。

二、數(shù)據(jù)處理

由于上面直接爬取到的圖片有一些瑕疵,這就需要對圖片進行進一步的處理了,對圖片進行去重處理
通過重復圖片去重處理,將自己需要的數(shù)據(jù)集按照種類分別保存在各自的文件夾里。同樣,由于數(shù)據(jù)集可能存在無法打開的圖片,這就需要對數(shù)據(jù)集進行下一步處理了。
首先將上面去重處理后的文件夾統(tǒng)一保存在同一個文件夾里面,如下圖所示。

在這里插入圖片描述

記住此文件夾路徑,我這里是‘C:\Users\Lenovo\Desktop\data’,將此路徑輸入到下面代碼中。

import os
from PIL import Image
root_path=r"C:\Users\Lenovo\Desktop\data"   #待處理文件夾絕對路徑(可按‘Ctrl+Shift+c'復制)
root_names=os.listdir(root_path)

for root_name in root_names:
    path=os.path.join(root_path,root_name)
    print("正在刪除文件夾:",path)
    names=os.listdir(path)
    names_path=[]
    for name in names:
        # print(name)
        img=Image.open(os.path.join(path,name))
        name_path=os.path.join(path,name)
        if img==None:           #篩選無法打開的圖片
            names_path.append(name_path)
            print('成功保存錯誤圖片路徑:{}'.format(name))
        else:
            w,h=img.size
            if w<50 or h<50:    #篩選錯誤圖片
                names_path.append(name_path)
                print('成功保存特小圖片路徑:{}'.format(name))
    print("開始刪除需刪除的圖片")
    for r in names_path:
        os.remove(r)
        print("已刪除:",r)

經(jīng)過上述處理即完成了圖片數(shù)據(jù)集的處理。最后,也可以對圖片數(shù)據(jù)集進行圖片名稱的處理,使圖片的名稱重新從零開始依次排列,方便計數(shù)(注意下面代碼中的rename將會刪除掉原文件夾中的圖片)。

import os
root_dir=r"C:\Users\Lenovo\Desktop\pzlh"    #原文件夾路徑
save_path=r"C:\Users\Lenovo\Desktop\pzlh2"  #新建文件夾路徑
img_path=os.listdir(root_dir)
a=0
for i in img_path:
    a+=1
    i= os.path.join(os.path.abspath(root_dir), i)
    new_name=os.path.join(os.path.abspath(save_path), str(a) + '_pzlh.jpg')    #此處可以修改圖片名稱
    os.rename(i,new_name)       #特別注意:rename會刪除原圖

最后,我們可以得到一個將完整的常見盆栽植物的數(shù)據(jù)集。如果此時數(shù)據(jù)集的圖片數(shù)量不多,我們還可以采用數(shù)據(jù)增強的方法,如旋轉(zhuǎn),加噪等步驟,都可以在網(wǎng)上找到相應的教程。最后,我們可以得到數(shù)據(jù)集如下圖所示。

在這里插入圖片描述

三、開始識別

首先,先為上面的圖片數(shù)據(jù)集生成對應的標簽文件,運行下面代碼可以自動生成對應的標簽文件。

import os
root_path=r"C:\Users\Lenovo\Desktop\data"
save_path=r"C:\Users\Lenovo\Desktop\data_label" #對應的label文件夾下也要建好相應的空子文件夾
names=os.listdir(root_path) #得到images文件夾下的子文件夾的名稱
for name in names:
    path=os.path.join(root_path,name)
    img_names=os.listdir(path)  #得到子文件夾下的圖片的名稱
    for img_name in img_names:
        save_name = img_name.split(".jpg")[0]+'.txt'    #得到相應的lable名稱
        txt_path=os.path.join(save_path,name)           #得到label的子文件夾的路徑
        with open(os.path.join(txt_path,save_name), "w") as f:  #結(jié)合子文件夾路徑和相應子文件夾下圖片的名稱生成相應的子文件夾txt文件
            f.write(name)       #將label寫入對應txt文件夾
            print(f.name)

然后,將上面已經(jīng)準備好的數(shù)據(jù)集按照7:3(其他比例也可以)分為訓練數(shù)據(jù)集和驗證數(shù)據(jù)集(圖片和標簽一定要完全對應即對應圖片和標簽應該都處于訓練集或者數(shù)據(jù)集),并如下圖所示放置。

在這里插入圖片描述

最后,數(shù)據(jù)集準備好后,即可導入到模型開始訓練,運行下列代碼

import time
from torch.utils.tensorboard import SummaryWriter
from torchvision.datasets import ImageFolder
from torchvision import transforms
from torch.utils.data import DataLoader
import torchvision.models as models
import torch.nn as nn
import torch

print("是否使用GPU訓練:{}".format(torch.cuda.is_available()))    #打印是否采用gpu訓練
if torch.cuda.is_available:
    print("GPU名稱為:{}".format(torch.cuda.get_device_name()))  #打印相應的gpu信息
#數(shù)據(jù)增強太多也可能造成訓練出不好的結(jié)果,而且耗時長,宜增強兩三倍即可。
normalize=transforms.Normalize(mean=[.5,.5,.5],std=[.5,.5,.5])  #規(guī)范化
transform=transforms.Compose([                                  #數(shù)據(jù)處理
    transforms.Resize((64,64)),
    transforms.ToTensor(),
    normalize
])
dataset_train=ImageFolder('data/train',transform=transform)     #訓練數(shù)據(jù)集
# print(dataset_tran[0])
dataset_valid=ImageFolder('data/valid',transform=transform)     #驗證或測試數(shù)據(jù)集
# print(dataset_train.classer)#返回類別
print(dataset_train.class_to_idx)                               #返回類別及其索引
# print(dataset_train.imgs)#返回圖片路徑
print(dataset_valid.class_to_idx)
train_data_size=len(dataset_train)                              #放回數(shù)據(jù)集長度
test_data_size=len(dataset_valid)
print("訓練數(shù)據(jù)集的長度為:{}".format(train_data_size))
print("測試數(shù)據(jù)集的長度為:{}".format(test_data_size))
#torch自帶的標準數(shù)據(jù)集加載函數(shù)
dataloader_train=DataLoader(dataset_train,batch_size=4,shuffle=True,num_workers=0,drop_last=True)
dataloader_test=DataLoader(dataset_valid,batch_size=4,shuffle=True,num_workers=0,drop_last=True)

#2.模型加載
model_ft=models.resnet18(pretrained=True)#使用遷移學習,加載預訓練權(quán)重
# print(model_ft)

in_features=model_ft.fc.in_features
model_ft.fc=nn.Sequential(nn.Linear(in_features,36),
                          nn.Linear(36,6))#將最后的全連接改為(36,6),使輸出為六個小數(shù),對應六種植物的置信度
#凍結(jié)卷積層函數(shù)
# for i,para in enumerate(model_ft.parameters()):
#     if i<18:
#         para.requires_grad=False

# print(model_ft)


# model_ft.half()#可改為半精度,加快訓練速度,在這里不適用

model_ft=model_ft.cuda()#將模型遷移到gpu
#3.優(yōu)化器
loss_fn=nn.CrossEntropyLoss()

loss_fn=loss_fn.cuda()  #將loss遷移到gpu
learn_rate=0.01         #設(shè)置學習率
optimizer=torch.optim.SGD(model_ft.parameters(),lr=learn_rate,momentum=0.01)#可調(diào)超參數(shù)

total_train_step=0
total_test_step=0
epoch=50                #迭代次數(shù)
writer=SummaryWriter("logs_train_yaopian")
best_acc=-1
ss_time=time.time()

for i in range(epoch):
    start_time = time.time()
    print("--------第{}輪訓練開始---------".format(i+1))
    model_ft.train()
    for data in dataloader_train:
        imgs,targets=data
        # if torch.cuda.is_available():
        # imgs.float()
        # imgs=imgs.float()#為上述改為半精度操作,在這里不適用
        imgs=imgs.cuda()
        targets=targets.cuda()
        # imgs=imgs.half()
        outputs=model_ft(imgs)
        loss=loss_fn(outputs,targets)

        optimizer.zero_grad()   #梯度歸零
        loss.backward()         #反向傳播計算梯度
        optimizer.step()        #梯度優(yōu)化

        total_train_step=total_train_step+1
        if total_train_step%100==0:#一輪時間過長可以考慮加一個
            end_time=time.time()
            print("使用GPU訓練100次的時間為:{}".format(end_time-start_time))
            print("訓練次數(shù):{},loss:{}".format(total_train_step,loss.item()))
            # writer.add_scalar("valid_loss",loss.item(),total_train_step)
    model_ft.eval()
    total_test_loss=0
    total_accuracy=0
    with torch.no_grad():       #驗證數(shù)據(jù)集時禁止反向傳播優(yōu)化權(quán)重
        for data in dataloader_test:
            imgs,targets=data
            # if torch.cuda.is_available():
            # imgs.float()
            # imgs=imgs.float()
            imgs = imgs.cuda()
            targets = targets.cuda()
            # imgs=imgs.half()
            outputs=model_ft(imgs)
            loss=loss_fn(outputs,targets)
            total_test_loss=total_test_loss+loss.item()
            accuracy=(outputs.argmax(1)==targets).sum()
            total_accuracy=total_accuracy+accuracy
        print("整體測試集上的loss:{}(越小越好,與上面的loss無關(guān)此為測試集的總loss)".format(total_test_loss))
        print("整體測試集上的正確率:{}(越大越好)".format(total_accuracy / len(dataset_valid)))

        writer.add_scalar("valid_loss",(total_accuracy/len(dataset_valid)),(i+1))#選擇性使用哪一個
        total_test_step = total_test_step + 1
        if total_accuracy > best_acc:   #保存迭代次數(shù)中最好的模型
            print("已修改模型")
            best_acc = total_accuracy
            torch.save(model_ft, "best_model_yaopian.pth")
ee_time=time.time()
zong_time=ee_time-ss_time
print("訓練總共用時:{}h:{}m:{}s".format(int(zong_time//3600),int((zong_time%3600)//60),int(zong_time%60))) #打印訓練總耗時
writer.close()

上述采用的遷移學習直接使用resnet18的模型進行訓練,只對全連接的輸出進行修改,是一種十分方便且實用的方法,同樣,你也可以自己編寫模型,然后使用自己的模型進行訓練,但是這種方法顯然需要訓練更長的時間才能達到擬合。如圖所示,只需要修改矩形框內(nèi)部分,將‘model_ft=models.resnet18(pretrained=True)'改為自己的模型‘model_ft=model’即可。

在這里插入圖片描述

四、模型測試

經(jīng)過上述的步驟后,我們將會得到一個‘best_model_yaopian.pth’的模型權(quán)重文件,最后運行下列代碼就可以對圖片進行識別了

import os
import torch
import torchvision
from PIL import Image
from torch import nn
i=0 #識別圖片計數(shù)
root_path="測試_data"         #待測試文件夾
names=os.listdir(root_path)
for name in names:
    print(name)
    i=i+1
    data_class=['滴水觀音','發(fā)財樹','非洲茉莉','君子蘭','盆栽蘆薈','文竹']   #按文件索引順序排列
    image_path=os.path.join(root_path,name)             
    image=Image.open(image_path)
    print(image)
    transforms=torchvision.transforms.Compose([torchvision.transforms.Resize((64,64)),
                                              torchvision.transforms.ToTensor()])
    image=transforms(image)
    print(image.shape)

    model_ft=torchvision.models.resnet18()      #需要使用訓練時的相同模型
    # print(model_ft)
    in_features=model_ft.fc.in_features
    model_ft.fc=nn.Sequential(nn.Linear(in_features,36),
                              nn.Linear(36,6))     #此處也要與訓練模型一致

    model=torch.load("best_model_yaopian.pth",map_location=torch.device("cpu")) #選擇訓練后得到的模型文件
    # print(model)
    image=torch.reshape(image,(1,3,64,64))      #修改待預測圖片尺寸,需要與訓練時一致
    model.eval()
    with torch.no_grad():
        output=model(image)
    print(output)               #輸出預測結(jié)果
    # print(int(output.argmax(1)))
    print("第{}張圖片預測為:{}".format(i,data_class[int(output.argmax(1))]))   #對結(jié)果進行處理,使直接顯示出預測的植物種類

最后,通過上述步驟我們可以得到一個簡單的盆栽植物智能識別程序,對盆栽植物進行識別,如下圖是識別結(jié)果說明。

在這里插入圖片描述

到這里,我們就實現(xiàn)了一個簡單的深度學習圖像識別示例了。

總結(jié)

到此這篇關(guān)于python pytorch圖像識別基礎(chǔ)介紹的文章就介紹到這了,更多相關(guān)python pytorch圖像識別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python tornado修改log輸出方式

    python tornado修改log輸出方式

    今天小編就為大家分享一篇python tornado修改log輸出方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • python連接mongodb密碼認證實例

    python連接mongodb密碼認證實例

    今天小編就為大家分享一篇python連接mongodb密碼認證實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • python實現(xiàn)超簡單端口轉(zhuǎn)發(fā)的方法

    python實現(xiàn)超簡單端口轉(zhuǎn)發(fā)的方法

    這篇文章主要介紹了python實現(xiàn)超簡單端口轉(zhuǎn)發(fā)的方法,實例分析了Python同構(gòu)socket實現(xiàn)端口轉(zhuǎn)發(fā)的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • Python中Selenium模擬JQuery滑動解鎖實例

    Python中Selenium模擬JQuery滑動解鎖實例

    這篇文章主要介紹了Python中Selenium模擬JQuery滑動解鎖實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • python 讀取數(shù)據(jù)庫并繪圖的實例

    python 讀取數(shù)據(jù)庫并繪圖的實例

    今天小編就為大家分享一篇python 讀取數(shù)據(jù)庫并繪圖的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • python實現(xiàn)猜單詞小游戲

    python實現(xiàn)猜單詞小游戲

    這篇文章主要為大家詳細介紹了python實現(xiàn)猜單詞小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • seek引發(fā)的python文件讀寫的問題及解決

    seek引發(fā)的python文件讀寫的問題及解決

    這篇文章主要介紹了seek引發(fā)的python文件讀寫的問題及解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-07-07
  • 解決.ui文件生成的.py文件運行不出現(xiàn)界面的方法

    解決.ui文件生成的.py文件運行不出現(xiàn)界面的方法

    今天小編就為大家分享一篇解決.ui文件生成的.py文件運行不出現(xiàn)界面的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • Python修改游戲內(nèi)存的方法

    Python修改游戲內(nèi)存的方法

    本文給大家分享一個通過Python來修改游戲內(nèi)存的方法,幫助大家更改游戲中的數(shù)據(jù),步驟很簡單,而且有視頻講解,感興趣的朋友一起看看吧
    2021-11-11
  • 使用Keras預訓練模型ResNet50進行圖像分類方式

    使用Keras預訓練模型ResNet50進行圖像分類方式

    這篇文章主要介紹了使用Keras預訓練模型ResNet50進行圖像分類方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05

最新評論

衡水市| 商洛市| 宁陕县| 长春市| 酒泉市| 九寨沟县| 安阳县| 高平市| 东至县| 唐海县| 永安市| 信丰县| 渝北区| 阳城县| 莱阳市| 岳阳县| 习水县| 石景山区| 德州市| 称多县| 拉萨市| 南郑县| 宜川县| 岚皋县| 犍为县| 万宁市| 义乌市| 常山县| 塘沽区| 息烽县| 石门县| 蛟河市| 类乌齐县| 蒙城县| 扎鲁特旗| 恩施市| 肇东市| 玛多县| 姚安县| 普宁市| 恩施市|