一 写在前面
未经允许,不得转载,谢谢~

之前写了一篇没有使用任何深度学习框架来处理视频数据集的文章:视频数据集UCF101的处理与加载(未使用深度学习框架)

上面的处理方法简单粗暴,但仍有很多可以优化的空间,这两天又学习了一下PyTorch对于数据集加载的支持:PyTorch入门学习(七):数据加载与处理

之前说过要用PyTorch的方法重新实现一遍对于UCF101的处理,所以在这里做个记录。这篇文章里仅仅记录具体的实现方法,至于为什么这么做还是看前面转载的PyTorch入门学习(七):数据加载与处理哦~~

二 具体目标

按照trainlist(testllist)中的列表去确定要用哪些数据集。
对于每一个视频随机取连续的16帧
每一帧都减去RGB平均值
对于每帧先将大小修改到(182,242)
然后对修改过大小的帧随机截取(160,160)
每次返回视频表示: x[batch_size,16,3,160,160], 标签值: y[batch_size]

三 基本实现思路
鉴于我们现在要处理的数据集既不是PyTorch直接提供的,又不符合最通用的ImageFolder存储格式,我们就乖乖一步步地实现。

跟例程中最大的区别在于我们组要处理的视频,而不是单张图像,那么就把这一步工作放到__getitem__里面去完成。
剩下的变换功能放到transform里面去完成。

具体的步骤如下所示:

首先,定义数据集的类UCF101,这个类要继承dataset这个抽象类,并实现__init__ , __len__以及__getitem__这几个函数

init:完成infolist的读入及处理还有其他的初始化工作。

len:返回数据集大小

getitem:返回单个视频随机连续16帧的读取和返回
其他函数用于支持以上的功能。

然后,实现用于特定图像预处理的功能,并封装成类。

减去RGB的平均值
大小调整成(182,242)
随机截取成(160,160)
转换成Tensor
将它们进行组合成(transform)

transform作为上面UCF101类的参数传入,并得到实例化UCF101得到my_UCF101对象。
最后,将my_UCF101作为torch.utils.data.DataLoader类的形参,并根据需求设置自己是否需要打乱顺序,批大小…

四 完整代码
原理的部分不懂的话还是建议回去看看这篇哇:PyTorch入门学习(七):数据加载与处理
这里就不再赘述,直接上代码了。
from future import print_function, division
import os
import torch
import pandas as pd
from skimage import io, transform
import numpy as np
import random
import torch
import matplotlib.pyplot as plt
from torch.utils.data import Dataset, DataLoader
from torchvision import transforms, utils

Ignore warnings

import warnings
warnings.filterwarnings(“ignore”)
plt.ion() # interactive mode

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):
“”"Rescale the image in a sample to a given size.

Args:output_size (tuple or int): Desired output size. If tuple, output ismatched to output_size. If int, smaller of image edges is matchedto output_size keeping aspect ratio the same.
"""def __init__(self, output_size=(182,242)):assert isinstance(output_size, (int, tuple))self.output_size = output_sizedef __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):if h > w:new_h, new_w = self.output_size * h / w, self.output_sizeelse:new_h, new_w = self.output_size, self.output_size * w / helse:new_h, new_w = self.output_sizenew_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,:,:,:]=imgreturn {'video_x': new_video_x, 'video_label': video_label}

class RandomCrop(object):
“”"Crop randomly the image in a sample.

Args:output_size (tuple or int): Desired output size. If int, square cropis made.
"""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) == 2self.output_size = output_sizedef __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_sizetop = 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,:,:,:]=imagereturn {'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 Wvideo_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)}

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 appliedon a sample."""self.landmarks_frame = pd.read_csv(info_list,delimiter=' ', header=None)self.root_dir = root_dirself.transform = transformdef __len__(self):return len(self.landmarks_frame)# get (16,240,320,3)
def __getitem__(self, idx):video_path = os.path.join(self.root_dir,self.landmarks_frame.iloc[idx, 0])video_label=self.landmarks_frame.iloc[idx,1]video_x=self.get_single_video_x(video_path)sample = {'video_x':video_x, 'video_label':video_label}if self.transform:sample = self.transform(sample)return sampledef get_single_video_x(self,video_path):slash_rows=video_path.split('.')dir_name=slash_rows[0]video_jpgs_path=os.path.join(self.root_dir,dir_name)# get the random 16 framedata=pd.read_csv(os.path.join(video_jpgs_path,'n_frames'),delimiter=' ',header=None)frame_count=data[0][0]video_x=np.zeros((16,240,320,3))image_start=random.randint(1,frame_count-17)image_id=image_startfor i in range(16):s="%05d" % image_idimage_name='image_'+s+'.jpg'image_path=os.path.join(video_jpgs_path,image_name)tmp_image = io.imread(image_path)video_x[i,:,:,:]=tmp_imageimage_id+=1return video_x

if name==‘main’:
#usage
root_list=’/home/hl/Desktop/lovelyqian/CV_Learning/UCF101_jpg/’
info_list=’/home/hl/Desktop/lovelyqian/CV_Learning/UCF101_TrainTestlist/trainlist01.txt’
myUCF101=UCF101(info_list,root_list,transform=transforms.Compose([ClipSubstractMean(),Rescale(),RandomCrop(),ToTensor()]))

dataloader=DataLoader(myUCF101,batch_size=8,shuffle=True,num_workers=8)
for i_batch,sample_batched in enumerate(dataloader):print (i_batch,sample_batched['video_x'].size(),sample_batched['video_label'].size())

整个代码不管是在逻辑清晰度还是代码行数上都比之前的改进了很多,所以还是要多多学习大佬的框架,当然能自己实现一遍也是被有韵味的啦。

作者:与阳光共进早餐
链接:https://www.jianshu.com/p/4ebf2a82017b
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

视频数据集UCF101的处理与加载(用PyTorch实现)相关推荐

  1. 使用html5看视频黑屏,HTML 5动态加载的视频导致iPad上的黑屏

    我通过更改代码中的video标签src动态加载视频.当我在ipad上试用我的代码时(不知道它是否可以在模拟器中运行),第一个视频播放正常,但下一个只能给我一个黑屏.我已经尝试先播放第二个视频(检查编码 ...

  2. OBS视频数据输出流程(模块加载,编码,推流)详细说明

    声明:本文章内容仅代表个人观点,不能保证完全的正确性,仅供参考! 先上个自己画的图,结合流程图和文字解释,理解起来会更快些 1.视频输出初始化程序运行时,初始化OBS,视频相关的初始化是再mainWi ...

  3. Leo仿【DOTA视频站】项目实践【三】---- 获取DOTA2视频已经XListView实现上拉加载更多、下拉刷新

    在前一篇文章<优酷SDK学习>中使用优酷API根据视频种类进行搜索,可是优酷设置的视频种类中只有游戏,没有我想要搜索的DOTA2视频.于是为了弄懂怎么去搜索DOTA2视频,专门在优酷网页上 ...

  4. 从零开始构建基于textcnn的文本分类模型(上),word2vec向量训练,预训练词向量模型加载,pytorch Dataset、collete_fn、Dataloader转换数据集并行加载

    伴随着bert.transformer模型的提出,文本预训练模型应用于各项NLP任务.文本分类任务是最基础的NLP任务,本文回顾最先采用CNN用于文本分类之一的textcnn模型,意在巩固分词.词向量 ...

  5. pytorch之mnist数据集存放位置以及本地加载

    train_dataset = torchvision.datasets.MNIST(root='./data',train=True,transform=transforms.ToTensor(), ...

  6. 训练数据集时为何要先加载预训练模型作为初始化,这样做有何好处?

    参考文章:https://www.zhihu.com/question/343545559/answer/808793092

  7. 视频数据集 | 视频动作识别video recognition常用数据集整理

    一 写在前面 未经允许,不得转载,谢谢~~~ 这篇文章主要整理一下视频动作识别领域常用的数据集~~~ 大概但不严格按照时间顺序排列. 二 视频分类数据集 HMDB51 来源:HMDB: a large ...

  8. OFRecord 数据集加载

    OFRecord 数据集加载 在数据输入一文中知道了使用 DataLoader 及相关算子加载数据,往往效率更高,并且学习了如何使用 DataLoader 及相关算子. 在 OFrecord 数据格式 ...

  9. 深度学习数据集定义与加载

    深度学习数据集定义与加载 深度学习模型在训练时需要大量的数据来完成模型调优,这个过程均是数字的计算,无法直接使用原始图片和文本等来完成计算.因此与需要对原始的各种数据文件进行处理,转换成深度学习模型可 ...

  10. android webView加载网络视频

    之前,我写过webView加载本地网页的博客,今天,就写写webView加载网络视频的内容. 一.加载网页 1.WebView用来显示网页,使用必须时刻注意我们需要添加网络权限 <uses-pe ...

最新文章

  1. 获取本地 qt_好消息,可以使用 VS 进行 Qt 的跨平台开发啦!
  2. Mac OS使用技巧之三:发射无线网络信号的方法
  3. loadrunner controller:实时查看VUser的运行情况
  4. OpenStack 之vmware机器迁移到openstack集群
  5. 使用ladash判断集合中是否有
  6. 在相册查看保存的图片
  7. php搭建后台 xampp_你还在用wordpress?|搭建独一无二个人网络日志发布平台
  8. 《剑指offer》面试题46、47、49
  9. mysql自带的全文索引_MySql全文索引详解
  10. Android Protect-0.luyten+jadx+simplify简单介绍
  11. xynu 2917: 整数凑和问题(搜索)
  12. 老徐和阿珍的故事:Runnable和Callable有什么不同?
  13. uiautomatorviewer Error obtaining UI hierarchy
  14. 小心肝队-冲刺日志(第五天)
  15. 如何建设运维告警体系,保障SLA的5个9
  16. 软件企业认定的条件是什么
  17. 哔咔服务器无响应,哔咔哔咔漫画进不去怎么办 无法进入解决办法
  18. 三维点云到人体重建(七)
  19. C语言_学习笔记_(一)程序设计与C语言
  20. matlab 给矩阵加一行或加一列

热门文章

  1. python题库选择题刷题训练_python题库刷题训练开源到了Github
  2. matlab系统辨识尝试之详细过程1,系统辨识工具箱教程
  3. vscode下载之前版本插件
  4. 打通Linux脉络系列:进程、线程和调度-宋宝华-专题视频课程
  5. JavaScript笔记-前端AES加密
  6. 怎样设置rotacast插件_Revit插件|提取地形图上地形小插件(感觉一般,可以试试)...
  7. 初学python100例-案例10 python兔子生兔子 多种不同解法 青少年python编程 少儿编程案例讲解
  8. 微信小程序订阅消息 微信公众号模板消息
  9. 三星固态硬盘装linux,三星T5 SSD制作ubuntu18.04随身携带即插即用与win10共享文件真爽~(简单粗暴安装大法一步到位)...
  10. 推荐几个微信小程序开源项目