2019-09-06 pytorch實(shí)現(xiàn)視頻數(shù)據(jù)加載

小白的自我救贖
書接上回,在action recognition中,我們已經(jīng)學(xué)會了視頻數(shù)據(jù)中幀圖像的讀取,并將讀取到的幀圖像保存在文件夾frames_of_video中仆百,今天講學(xué)習(xí)如何講在這些幀圖像中,隨機(jī)讀取并加載其中的16幀圖像拆又,并保存為張量形式儒旬,然后進(jìn)行隨機(jī)裁剪等操作栏账,實(shí)現(xiàn)pytorch中幀圖像加載帖族,以便完成動作識別。
參考文檔:
http://pytorch123.com/ThirdSection/DataLoding/
http://www.reibang.com/p/4ebf2a82017b
這段代碼的總體思想就是索引到存儲幀圖像的文件夾挡爵,按照train_list挨個(gè)索引到對應(yīng)的幀圖像竖般,隨機(jī)取初始幀,然后讀取連續(xù)16幀茶鹃,存儲到4維張量中涣雕,格式為[z,c,h,w]
z:幀數(shù)=16
c:圖像深度
h:圖像高度
w:圖像寬度
代碼如下:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Mon Aug 26 21:35:32 2019

@author: xuguangying
"""

from __future__ import print_function, division
import os
import torch
import pandas as pd
from skimage import io, transform
import numpy as np
import matplotlib.pyplot as plt
from torch.utils.data import Dataset, DataLoader
from torchvision import transforms, utils
import pandas as pd
import os
import random

# Ignore warnings
import warnings
warnings.filterwarnings("ignore")
print('a')
#%%
class UCF101(Dataset):
    """UCF101 Landmarks dataset."""

    def __init__(self, info_list, root_dir, transform=None):
        """
        Args:
            info_list (string): Path to the info list file with annotations.
            root_dir (string): Directory with all the video frames.
            transform (callable, optional): Optional transform to be applied
                on a sample.
        """
        self.landmarks_frame = pd.read_csv(info_list,delimiter=' ', header=None)
        self.root_dir = root_dir
        self.transform = transform
            
    def __len__(self):
        return len(self.landmarks_frame)

    # get (16,240,320,3)
    def __getitem__(self, idx):
        aaa = self.landmarks_frame.iloc[idx, 0]
        video_label=self.landmarks_frame.iloc[idx,1]
        
        
        video_x=self.get_single_video_x(aaa)
        sample = {'video_x':video_x, 'video_label':video_label}

        if self.transform:
            sample = self.transform(sample)
        return sample


    def get_single_video_x(self,aaa):
        name, ext = os.path.splitext(aaa)
        name1 = os.path.join(name+'/')
        pic_path = os.path.join(root_list,name1)
        pic_names = os.listdir(pic_path)
        num = len(pic_names)
        image_start=random.randint(1,num-15)
        image_id=image_start       
        video_x=np.zeros((16,240,320,3))
        for i in range(16):
            s="%05d" % image_id
            image_name='image_'+s+'.jpg'
            image_path=os.path.join(pic_path,image_name)
            tmp_image = io.imread(image_path)
            video_x[i,:,:,:]=tmp_image
            image_id+=1
        return video_x
#%%
class ClipSubstractMean(object):
  def __init__(self, b=104, g=117, r=123):
    self.means = np.array((r, g, b))

  def __call__(self, sample):
    video_x,video_label=sample['video_x'],sample['video_label']
    new_video_x=video_x - self.means
    return {'video_x': new_video_x, 'video_label': video_label}
#%%
class Rescale(object):
    def __init__(self, output_size=(182,242)):
        assert isinstance(output_size, (int, tuple))#判斷一個(gè)變量是否是某個(gè)類型可以用isinstance()判斷
        self.output_size = output_size

    def __call__(self, sample):
        video_x, video_label = sample['video_x'], sample['video_label']

        h, w = video_x.shape[1],video_x[2]
        if isinstance(self.output_size, int):#判斷期望的output_size變量是否是int類型
            if h > w:
                new_h, new_w = self.output_size * h / w, self.output_size#長短邊同比例縮放,短邊變換為期望大小
            else:
                new_h, new_w = self.output_size, self.output_size * w / h
        else:
            new_h, new_w = self.output_size

        new_h, new_w = int(new_h), int(new_w)
        new_video_x=np.zeros((16,new_h,new_w,3))
        for i in range(16):
            image=video_x[i,:,:,:]
            img = transform.resize(image, (new_h, new_w))
            new_video_x[i,:,:,:]=img

        return {'video_x': new_video_x, 'video_label': video_label}
#%%
class RandomCrop(object):
    """隨機(jī)裁剪樣本中的圖像.

    Args:
       output_size(tuple或int):所需的輸出大小艰亮。 如果是int,方形裁剪是挣郭。
    """

    def __init__(self, output_size=(160,160)):
        assert isinstance(output_size, (int, tuple))
        if isinstance(output_size, int):
            self.output_size = (output_size, output_size)
        else:
            assert len(output_size) == 2
            self.output_size = output_size

    def __call__(self, sample):
        video_x, video_label = sample['video_x'], sample['video_label']

        h, w = video_x.shape[1],video_x.shape[2]
        new_h, new_w = self.output_size

        top = np.random.randint(0, h - new_h)
        left = np.random.randint(0, w - new_w)
        new_video_x=np.zeros((16,new_h,new_w,3))

        for i in range(16):
            image=video_x[i,:,:,:]
            image = image[top: top + new_h,left: left + new_w]
            new_video_x[i,:,:,:]=image
        return {'video_x': new_video_x, 'video_label': video_label}
#%%
class ToTensor(object):
    """Convert ndarrays in sample to Tensors."""

    def __call__(self, sample):
        video_x, video_label = sample['video_x'], sample['video_label']

        # swap color axis because
        # numpy image: batch_size x H x W x C
        # torch image: batch_size x C X H X W
        video_x = video_x.transpose((0, 3, 1, 2))
        video_x=np.array(video_x)
        video_label = [video_label]
        return {'video_x':torch.from_numpy(video_x),'video_label':torch.FloatTensor(video_label)}
#%%
if __name__=='__main__':
    root_list='/media/xuguangying/action recogniton/database/UTH/frames_of_video'
    info_list='/media/xuguangying/action recogniton/database/UTH/ucfTrainTestlist/trainlist01.txt'
    #myUCF101=UCF101(info_list,root_list)
    myUCF101=UCF101(info_list,root_list,transform=transforms.Compose([ClipSubstractMean(),Rescale(),RandomCrop(),ToTensor()]))
    dataloader=DataLoader(myUCF101,batch_size=8,shuffle=True,num_workers=6)
    for i_batch,sample_batched in enumerate(dataloader):
        print (i_batch,sample_batched['video_x'].size(),sample_batched['video_label'].size())#dayin meige batch de size yiji label de size
        print (i_batch,sample_batched['video_x'].size(),sample_batched['video_label']) #dayin meige batch de size yiji meige batch zhong yangben de label
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末迄埃,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子兑障,更是在濱河造成了極大的恐慌侄非,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件流译,死亡現(xiàn)場離奇詭異逞怨,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)福澡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進(jìn)店門叠赦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人革砸,你說我怎么就攤上這事除秀。” “怎么了算利?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵鳞仙,是天一觀的道長。 經(jīng)常有香客問我笔时,道長棍好,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任允耿,我火速辦了婚禮借笙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘较锡。我一直安慰自己业稼,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布蚂蕴。 她就那樣靜靜地躺著低散,像睡著了一般。 火紅的嫁衣襯著肌膚如雪骡楼。 梳的紋絲不亂的頭發(fā)上熔号,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天,我揣著相機(jī)與錄音鸟整,去河邊找鬼引镊。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的弟头。 我是一名探鬼主播吩抓,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼赴恨!你這毒婦竟也來了疹娶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤伦连,失蹤者是張志新(化名)和其女友劉穎蚓胸,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體除师,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡沛膳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了汛聚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锹安。...
    茶點(diǎn)故事閱讀 40,615評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖倚舀,靈堂內(nèi)的尸體忽然破棺而出叹哭,到底是詐尸還是另有隱情,我是刑警寧澤痕貌,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布风罩,位于F島的核電站,受9級特大地震影響舵稠,放射性物質(zhì)發(fā)生泄漏超升。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一哺徊、第九天 我趴在偏房一處隱蔽的房頂上張望室琢。 院中可真熱鬧,春花似錦落追、人聲如沸盈滴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽巢钓。三九已至,卻和暖如春疗垛,著一層夾襖步出監(jiān)牢的瞬間症汹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工继谚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留烈菌,地道東北人阵幸。 一個(gè)月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓花履,卻偏偏與公主長得像芽世,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子诡壁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評論 2 359

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