目录连接
(1) 数据处理
(2) 搭建和自定义网络
(3) 使用训练好的模型测试自己图片
(4) 视频数据的处理
(5) PyTorch源码修改之增加ConvLSTM层
(6) 梯度反向传递(BackPropogate)的理解
(7) 模型的训练和测试、保存和加载
(8) pyTorch-To-Caffe
(总) PyTorch遇到令人迷人的BUG

PyTorch的学习和使用(四)

最近在跑一个视频处理的代码,其用tensorFlow实现的,现在转换为使用PyTorch处理,主要实现如下:

  • 对原始视频的读取,得到连续的K帧存储
  • 对每帧图片数据的处理(翻转,归一化)
  • 对数据的mini-batch处理

和之前博客 PyTorch(一)——数据处理,中所说的一样,需要:
1)定义数据读取的方法。
2)针对数据的格式,改写transforms中数据处理的方法。
3)由于torch.utils.data.DataLoader()是对单张图片进行批次处理,对于连续多帧图片不好处理(也许可以使用图片的通道存储视频的帧数),因此在读取数据是进行mini-batch批次处理。

实现的主要想法为:首先把所有的视频数据的文件名称读入,使用shuffle打乱后进行mini-batch分组,然后根据分组的名称读取每组的视频,最后把读取批次的视频进行处理。

视频的读取

定义一个文件完成视频的读取、批次处理,并且调用定义的transforms方法对图片进行处理,返回处理为PyTorch使用的数据块。

使用imageio和opencv完成视频的读取
其代码主要为下:

def load_kth_data(f_name, data_path, image_size, L):""":param f_name: video name:param data_path: data path:param image_size: image size:param L: extract L frame of video:return: sequence frame of K+T len"""tokens = f_name.split()vid_path = os.path.join(data_path, tokens[0] + "_uncomp.avi")vid = imageio.get_reader(vid_path, "ffmpeg")  # load videolow = int(tokens[1])  # start of video# make sure the len of video is than Lhigh = np.min([int(tokens[2]), vid.get_length()]) - L + 1# the len of video is equal Lif (low == high):stidx = 0else:# the len of video is less-than L, print video path and the error for next lineif (low >= high): print(vid_path)# the len of video greater than L, and the start is random of low-highstidx = np.random.randint(low=low, high=high)# extract video of L lenseq = np.zeros((image_size, image_size, L, 1), dtype="float32")for t in xrange(L):img = cv2.cvtColor(cv2.resize(vid.get_data(stidx + t), (image_size, image_size)),cv2.COLOR_RGB2GRAY)seq[:, :, t] = img[:, :, None]return seq

(这注释写的估计我自己都不认识_!)
输入文件名、文件路径、没帧图片大小和帧长度(L),返回L帧图片的数组。

使用shuffle和视频文件名完成视频的批次处理
根据视频数据的数量,对其索引进行shuffle,然后根据索引对应的文件,完成视频数据的读取,其主要代码如下:

def get_minibatches_idx(n, minibatch_size, shuffle=False):""":param n: len of data:param minibatch_size: minibatch size of data:param shuffle: shuffle the data:return: len of minibatches and minibatches"""idx_list = np.arange(n, dtype="int32")# shuffleif shuffle:random.shuffle(idx_list)# segmentminibatches = []minibatch_start = 0for i in range(n // minibatch_size):minibatches.append(idx_list[minibatch_start:minibatch_start + minibatch_size])minibatch_start += minibatch_size# processing the last batchif (minibatch_start != n):minibatches.append(idx_list[minibatch_start:])return zip(range(len(minibatches)), minibatches)

输入视频数量的大小、mini-batch的尺寸和是否重新排列(shuffle),返回视频每个batch的序号和索引。

迭代器中实现视频数据读取和处理

PyTorch通过迭代器返回每次需要处理的批次,放入网络中进行训练。因此在数据处理的迭代返回方法中完成:

  • 根据mini-batch索引对视频数据读取
  • 调用transforms中的方法实现数据的处理(归一化、tensor转化等)

主要代码如下:

def __getitem__(self, index):# read video data of mini-batch with parallel methodLs = np.repeat(np.array([self.T + self.K]), self.batch_size, axis=0) # video length of past and featurepaths = np.repeat(self.root, self.batch_size, axis=0)files = np.array(self.trainFiles)[self.mini_batches[index][1]]shapes = np.repeat(np.array([self.image_size]), self.batch_size, axis=0)with joblib.Parallel(n_jobs=self.batch_size) as parallel:output = parallel(joblib.delayed(load_kth_data)(f, p, img_size, l)for f, p, img_size, l in zip(files,paths,shapes,Ls))# save batch dataseq_batch = np.zeros((self.batch_size, self.image_size, self.image_size,self.K + self.T, 1), dtype="float32")for i in xrange(self.batch_size):seq_batch[i] = output[i]# doing this so that it is consistent with all other datasets# to return a PIL Imageif self.transform is not None:seq_batch = self.transform(seq_batch)return seq_batch

其中使用了joblib.Parallel 多线程处理,具有较快的速度。

数据处理transforms中方法的实现

主要实现了:

  • tensor的转换
  • Normalize归一化处理
  • RandomHorizontalFlip水平翻转

实现较为简单,代码如下:

class ToTensor(object):"""Converts numpy.ndarray (N x H x W x C x 1) in the range[0, 255] to a torch.FloatTensor of shape (N x H x W x C x 1)."""def __call__(self, pic):# handle numpy arrayimg = torch.from_numpy(pic)# backard compabilityreturn imgclass Normalize(object):"""will normalize each channel of the torch.*Tensor, i.e.channel = channel/127.5 - 1"""def __call__(self, tensor):# TODO: make efficientfor t in tensor:t.div_(127.5).sub_(1)return tensorclass RandomHorizontalFlip(object):"""Randomly horizontally flips the given numpy.ndarray(N x H x W x C x 1) with a probability of 0.5"""def __call__(self, img):for n in xrange(img.shape[0]):if random.random() < 0.5:img[n] = img[n,:,::-1]return img

输出结果

最后对处理后的视频图片可视化,得到如下结果:


20181129更新
最近有些小伙伴问到处理视频的源码,现更新如下:
视频数据处理源码参考

PyTorch(四)——视频数据的处理相关推荐

  1. android 音视频流采集,Android 音视频开发(四):使用 Camera API 采集视频数据(示例代码)...

    本文主要将的是:使用 Camera API 采集视频数据并保存到文件,分别使用 SurfaceView.TextureView 来预览 Camera 数据,取到 NV21 的数据回调. 注: 需要权限 ...

  2. android 与后台实时视频,Android实时监控项目第四篇:后台线程发送预览帧视频数据...

    还记得上篇提到的setPreviewCallback(Camera.PreviewCallback cb)函数吗?我们在开始预览帧视频之前,调用的它,这里要注意其内部的Camera.PreviewCa ...

  3. 轻量高效!清华智能计算实验室开源基于PyTorch的视频 (图片) 去模糊框架SimDeblur

    作者丨科技猛兽 编辑丨极市平台 清华大学自动化系智能计算实验室团队开源基于 PyTorch 的视频 (图片) 去模糊框架 SimDeblur. 基于 PyTorch 的视频 (图片) 去模糊框架 Si ...

  4. 1小时学会:最简单的iOS直播推流(三)使用系统接口捕获音视频数据

    最简单的iOS 推流代码,视频捕获,软编码(faac,x264),硬编码(aac,h264),美颜,flv编码,rtmp协议,陆续更新代码解析,你想学的知识这里都有,愿意懂直播技术的同学快来看!! 源 ...

  5. 英特尔:80%的边缘数据都是视频数据!新成立物联网视频事业部,总部base中国...

    明敏 发自 凹非寺 量子位 报道 | 公众号 QbitAI 没想到,为了让你逛商店更爽,英特尔竟然也出手了. 现在,通过普通的摄像头+一套门店客流系统,商家就能知道一天的客流量.顾客平均停留时间.行动 ...

  6. WebRTC视频数据流程分析

    本文来自<WebRTC Native开发实战>书籍作者许建林在LiveVideoStack线上分享中的内容,详细分析总结 WebRTC 的视频数据流程,并对大型项目如何快速上手:分析方法, ...

  7. 引导修复 不是活动的_河南省视频数据修复中心

    河南省视频数据修复中心 lk6afds 河南省视频数据修复中心 文件预览我找到了我要恢复文件,可是,这个文件能能正确恢复呢.没有用的文件不可以删掉吗.我们先来看看盘文件夹都是什么吧.(以下仅限于~系统 ...

  8. 多路视频数据实时采集系统设计与实现

    多路视频数据实时采集系统设计与实现 常永亮   王霖萱  常馨蓉 摘要 面对越来越多的实时视频采集.播放的应用,如何能更加方便的操控视频采集,保证流畅的播放效果,成为近几年实时媒体流的一个重要研究方向 ...

  9. 语音、图像和视频数据的格式

     今天,计算机多媒体技术的应用越来越广泛.多媒体技术的核心就是使用计算机综合处理声.文.图.像等多媒体信息.数据压缩是指在不丢失有用信息的前提下,缩减数据量以减少存储空间,提高其传输.存储和处理效 ...

最新文章

  1. 虚拟机复制后修改eth1为eth0
  2. matlab对图像信号进行频谱分析及滤波,数字信号处理课程设计---应用 Matlab对信号进行频谱分析及滤波...
  3. Rabbitmq 极简实现
  4. linux命令查看几位,Linux每周几个命令(一)--查找篇
  5. 机器学习之神经网络模型-上(Neural Networks: Representation)
  6. 10行代码理解Java锁消除
  7. java隔几秒发数据_java – 如何将数据推送到jsp而不是每2秒请求一次?
  8. Python里面如何拷贝一个对象?
  9. python模块-logging的智商上限
  10. windows查看器无法打开图片_Win7自带图片查看器异常
  11. 记一份电网信息化建设企业信息分析平台规划
  12. cocos2d-x学习笔记10:动作3:补间动作
  13. 数学建模的13种常用的方法
  14. Python实现图形学DDA算法
  15. Android netd和Framework以及netd和kernel之间的通信
  16. 技术岗的职业规划_技术型员工职业生涯规划
  17. Nginx 405 not allowed
  18. python输入姓名输出欢迎你某某同学_Python交互环境下打印和输入函数的实例内容...
  19. 千人基因组计划基因分型数据下载
  20. 微信小程序云开发实战:网上商城(二)

热门文章

  1. Android自定义view 滑动开关 支持左右滑动 适用于listview
  2. Google Pay India(UPI) 印度
  3. 【洛谷3043】跳楼机(最短路)
  4. c语言函数定义时涉及的基本要素是什么,C语言基础:函数的定义与调用
  5. 第一代商用计算机是由,计算机基础辅导资料
  6. 如何利用手机访问电脑本地的localhost?
  7. idea中用git管理文件之后文件颜色的含义
  8. BD新标签页-最值得安装的浏览器插件
  9. 测试进阶篇之测试用例设计-百度云盘
  10. verilog赋多位值_verilog中的default应该赋什么样的值