記一次pytorch訓(xùn)練模型及搭建(pytorch圖片數(shù)據(jù)載入,模型訓(xùn)練)

有一天在做關(guān)于物體特征點定位的工作和泌,有一天突發(fā)奇想村缸,想要通過pytorch建一個模型進(jìn)行特征點定位。努力敲了半天代碼武氓,終于實現(xiàn)了梯皿,可惜由于自己采的數(shù)據(jù)集過小(或者是其他原因县恕,歡迎大神賜教)东羹,導(dǎo)致定位結(jié)果誤差很大≈抑颍總的來說還算成功属提。
我采集的數(shù)據(jù)集,我在杯子上點了個黑點,然后手工標(biāo)定得到j(luò)son文件冤议,想要通過模型定位黑點坐標(biāo)斟薇,奈何。恕酸。不太理想:

在這里插入圖片描述

先潑代碼:

在這里插入圖片描述

首先是對應(yīng)標(biāo)簽及樣本的數(shù)據(jù)集以便載入:

#作者:Rayne
#作用:對應(yīng)json文件中的坐標(biāo)及文件夾中圖片路徑堪滨,以便Dataset模塊載入
import os
import json

def get_img_path(img_path):
    file_path=[]
    for file in os.listdir(img_path):
        file_path.append(os.path.join(img_path+'/', file))
    return file_path

def get_label(label_path):# ./label.json
    labels={}
    with open(label_path,'r',encoding='UTF-8') as f:
        js=json.load(f)
    for i in js:
        x,y,name=i['Data']['svgArr'][0]['data'][0]['x'],i['Data']['svgArr'][0]['data'][0]['y'],i['imageName']
        labels[name]=[x,y]

    return labels

def get_all(img_path,label_path):
    file_path=get_img_path(img_path)
    labels=get_label(label_path)
    label=[]
    for file in file_path:
        label.append(labels[file.split('/')[2]])
    return file_path,label

其次是載入文件夾中的數(shù)據(jù):ImageLoader.py:

#作者:Rayne
#作用:載入圖片文件及標(biāo)簽,標(biāo)簽是[1,2]的list蕊温,對應(yīng)特征點x袱箱,y

import torch.utils.data as data
import torch
from PIL import Image
import numpy as np


def default_loader(path):
    return Image.open(path).convert('RGB')


###############################################
class myImageFloder(data.Dataset):

    def __init__(self, img, label, loader=default_loader):
        self.img = img
        self.label = label
        self.loader = loader

    def __getitem__(self, index):
        img = self.img[index]
        label = self.label[index]

        # 數(shù)據(jù)打開
        img_open = self.loader(img)
        data = np.ascontiguousarray(img_open, dtype=np.float32) / 256

        label = np.array([label[0]/540.0,label[1]/384.0],dtype=np.float32)

        data = torch.from_numpy(data).view(3, 540, 384).cuda()
        label = torch.from_numpy(label).cuda()

        return data, label

    def __len__(self):
        return len(self.img)

然后是模型搭建,后來我用了遷移學(xué)習(xí):

#作者:Rayne
#作用:博主花費(fèi)20分鐘搭建的模型
import torch
import torchvision
import torchvision.transforms as transforms
import torch.nn as nn
import torch.nn.functional as F

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(3, 6, 3)
        self.conv2 = nn.Conv2d(6, 12, 3)
        self.pool=nn.MaxPool2d(2,2)
        self.conv3 = nn.Conv2d(12, 24, 3)
        self.conv4 = nn.Conv2d(24, 48, 3)
        self.conv5 = nn.Conv2d(48, 96, 3)
        self.conv6 = nn.Conv2d(96, 192, 3)
        self.fc1 = nn.Linear(192*24, 48)
        self.fc2 = nn.Linear(48, 12)
        self.fc3 = nn.Linear(12, 2)


    def forward(self, x):
        x = self.pool(F.relu(self.conv1(x)))
        x = self.pool(F.relu(self.conv2(x)))
        x = self.pool(F.relu(self.conv3(x)))
        x = self.pool(F.relu(self.conv4(x)))
        x = self.pool(F.relu(self.conv5(x)))
        x = self.pool(F.relu(self.conv6(x)))
        x=torch.flatten(x)
        x = x.view(-1, 192*24)
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = torch.sigmoid(self.fc3(x))
        return x

然后是訓(xùn)練函數(shù)啦:

#作者:Rayne
#作用:載入圖片及標(biāo)簽义矛,定義訓(xùn)練函數(shù)发笔,打印訓(xùn)練結(jié)果。
import model
import torch
import torch.nn as nn
from data import dir_xy, ImageLoader
import torch.optim as optim

train_hist=[]
test_hist=[]
def train(net=None, criterion=None, optimizer=None, TrainImgLoader=None, TestImgLoader=None, epochs=20):
    running_loss = 0.0
    test_loss = 0.0
    for epoch in range(epochs):  # loop over the dataset multiple times
        for i, data in enumerate(TrainImgLoader):
            inputs, labels = data
            # zero the parameter gradients
            optimizer.zero_grad()
            # forward + backward + optimize
            outputs = net(inputs)  # 輸出為[-1症革,2]
            loss = criterion(outputs, labels)

            loss.backward()
            optimizer.step()
            # print statistics
            running_loss += loss.item()
            if i % 10 ==9:
                print('第{}圈train Loss: {}'.format(epoch, running_loss / 10))
                train_hist.append(running_loss / 10)
                running_loss = 0.0

        with torch.no_grad():
            for i, data in enumerate(TestImgLoader):
                images, labels = data
                outputs = net(images)
                loss = criterion(outputs, labels)
                test_loss += loss.item()
                if i % 10 ==9:
                    print('第{}圈test Loss: {}'.format(epoch, test_loss / 10))
                    test_hist.append(test_loss)
                    test_loss = 0.0
    plter(epochs=epochs, train_loss=train_hist, test_loss=test_hist)
    print('Finished Training')

def plter(train_loss,test_loss,epochs):
    import matplotlib.pyplot as plt
    x = range(0, epochs)

    fig, ax = plt.subplots()
    ax.plot(range(len(train_loss)), train_loss, label='train')
    ax.plot(range(len(test_loss)), test_loss, label='test')
    ax.set_xlabel(xlabel='epoch')
    ax.set_ylabel(ylabel='MSE')
    ax.set_title('Epochs VS MSE')
    ax.legend()
    plt.show()

最后是主函數(shù):

#作者:Rayne
#作用:定義優(yōu)化器筐咧,模型,損失函數(shù)等并進(jìn)行訓(xùn)練
import model
import torch
import torch.nn as nn
from data import dir_xy, ImageLoader
import torch.optim as optim
import train_test
import torchvision


def train():
    torch.set_default_tensor_type(torch.FloatTensor)
    # net = model.Net().cuda()

    net = torchvision.models.resnet18(pretrained=True)
    num_ftrs = net.fc.in_features
    net.fc = nn.Linear(num_ftrs, 2)
    net=net.cuda()

    criterion = nn.MSELoss()
    optimizer = optim.Adam(net.parameters(), lr=0.00001)

    dir, xy = dir_xy.get_all(img_path='data/train', label_path='data/label/train.json')
    loader = ImageLoader.myImageFloder(dir, xy)
    TrainImgLoader = torch.utils.data.DataLoader(loader,batch_size=10,shuffle = True)

    dir, xy = dir_xy.get_all(img_path='data/test', label_path='data/label/test.json')
    loader2 = ImageLoader.myImageFloder(dir, xy)
    TestImgLoader = torch.utils.data.DataLoader(loader2)

    train_test.train(net=net.cuda(), criterion=criterion, optimizer=optimizer, TrainImgLoader=TrainImgLoader,
                     TestImgLoader=TestImgLoader)


train()

結(jié)果:

在這里插入圖片描述

下降到后面噪矛,尤其是10個循環(huán)后不太明顯量蕊,我相信擁有更多的數(shù)據(jù)后會得到更好的結(jié)果。希望可以幫到你~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末艇挨,一起剝皮案震驚了整個濱河市残炮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌缩滨,老刑警劉巖势就,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異脉漏,居然都是意外死亡苞冯,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進(jìn)店門侧巨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來舅锄,“玉大人,你說我怎么就攤上這事司忱』史蓿” “怎么了?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵坦仍,是天一觀的道長鳍烁。 經(jīng)常有香客問我,道長繁扎,這世上最難降的妖魔是什么幔荒? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上铺峭,老公的妹妹穿的比我還像新娘墓怀。我一直安慰自己汽纠,他們只是感情好卫键,可當(dāng)我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著虱朵,像睡著了一般莉炉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上碴犬,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天絮宁,我揣著相機(jī)與錄音,去河邊找鬼服协。 笑死绍昂,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的偿荷。 我是一名探鬼主播窘游,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼跳纳!你這毒婦竟也來了忍饰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤寺庄,失蹤者是張志新(化名)和其女友劉穎艾蓝,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斗塘,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡赢织,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了馍盟。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片于置。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖朽合,靈堂內(nèi)的尸體忽然破棺而出俱两,到底是詐尸還是另有隱情,我是刑警寧澤曹步,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布宪彩,位于F島的核電站,受9級特大地震影響讲婚,放射性物質(zhì)發(fā)生泄漏尿孔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望活合。 院中可真熱鬧雏婶,春花似錦、人聲如沸白指。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽告嘲。三九已至错维,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間橄唬,已是汗流浹背赋焕。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留仰楚,地道東北人隆判。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像僧界,于是被迫代替她去往敵國和親侨嘀。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,947評論 2 355

推薦閱讀更多精彩內(nèi)容