pytorch调用caffe的lmdb
时间:2019-11-21
本文章向大家介绍pytorch调用caffe的lmdb,主要包括pytorch调用caffe的lmdb使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一. 处理好训练集和验证集后,通过caffe的convert_imageset生成lmdb:
1 /usr/softwares/caffe/build/tools/convert_imageset --resize_width=224 --resize_height=224 --gray=true --shuffle=true --encoded=true /usr/data_path/ /usr/data/data_lt.txt /usr/lmdb
(1) /usr/softwares/caffe/build/tools/convert_imageset:caffe中convert_imagese脚本的路径;
(2) --resize_width, --resize_height: 网络输入图像的宽和高;
(3) --gray: 是否灰度化,如果没设这个参数,则默认lmdb中像素值为三通道;
(4) --shuffle: 是否随机打乱输入图像列表的顺序;
(5) --encoded: 是否对像素做编码;
(6) /usr/data_path/: 存放图像的主目录路径;
(7) /usr/data/data_lt.txt: 图像的列表,存放的是图像的相对路径和label;
(8) /usr/lmdb: 生成的lmdb的绝对路径。
二. 提取lmdb中的key,生成key列表:
1 fl = open(saveKey_path, "w") 2 lmdb_env = lmdb.open(lmdb_path) 3 lmdb_txn = lmdb_env.begin() 4 lmdb_cursor = lmdb_txn.cursor() 5 for key, value in lmdb_cursor: 6 fl.write("%s\n" %(key)) 7 count += 1 8 fl.close()
根据caffe中读取lmdb的方式读取lmdb中每个元素的key值,详见代码get_lmdbKey.py。
三. 根据上述key值列表读取batch(详见文件readLmdb.py):
(1) 得到所有图像的索引,并shuffle;
1 self.indices_total = np.arange(self.dataset_size) 2 np.random.seed(321) 3 np.random.shuffle(self.indices_total)
(2) 定义图像batch和label batch,从lmdb中取数据放入这两个batch中:
//定义image batch和label batch blob(N C H W),其中label_batch后的dtype是为了方便将其转化为pytorch接受的tensor形式的变量
1 image_batch = np.zeros((self.batch_size, 1, 224, 224), dtype=np.float32) 2 label_batch = np.zeros((self.batch_size), dtype=getattr(np, 'long'))
//按照batch值依次从shuffle后的key list中读取图像 3 for i in range(self.batch_size): 4 ind = self.indices_total[self.data_idx] 5 self.data_idx += 1
//若变量data_idx取到了list的最后一个值,则重新shuffle key list 6 if self.data_idx == self.dataset_size: 7 self.data_idx = 0 8 np.random.shuffle(self.indices_total)
//注意以下代码可能python2和python3的有差异,此处代码基于python3 9 temp = (self.key_lt[ind]).encode() 10 value = self.txn.get(temp) 11 datum = caffe_pb2.Datum() 12 datum.ParseFromString(value)
//读取label,并放入label batch中 13 label = float(datum.label)
//读取图像数据,对其预处理后放入image batch中 14 encoded = datum.encoded 15 if encoded: 16 stream = BytesIO(datum.data) 17 img = np.uint8(Image.open(stream)) 18 img = img[...,::-1] 19 else: 20 data = caffe.io.datum_to_array(datum) 21 img = np.transpose(data, (1, 2, 0)) 22 img_tmp = img.copy() 23 img_tmp = np.float64(img_tmp) 24 img_tmp -= 127.5 25 img_tmp *= 0.0078125 26 img_tmp = img_tmp[np.newaxis, :] 27 image_batch[i, :] = img_tmp 28 label_batch[i] = label
(3) 在训练程序中,送入网络满足pytorch的数据形式:
1 train_inputs, train_label = batchClass.GetBatch() 2 pytorch_inputs = (torch.tensor(train_inputs)).cuda() 3 pytorch_labels = (torch.tensor(train_label)).cuda()
将自己定义的blob通过torch.tensor转化为pytorch网络接受的数据形式。
原文地址:https://www.cnblogs.com/liangx-img/p/11905374.html
- ADO.NET 2.0 中的新增 DataSet 功能
- WinRar 4.20 – 文件扩展名欺骗(0Day)
- 黑掉ATM取款机?只需一条短信
- DNS迭代穷举脚本
- 走进计算机取证分析的神秘世界
- SYNPROXY:最廉价的抗DoS攻击方案
- 如何使用AndroidStudio将开源项目library发布到jcenter
- Android Studio 使用Gradle多渠道打包
- 某些浏览器中因cookie设置HttpOnly标志引起的安全问题
- 偷懒新姿势,打造属于RecyclerView的万能适配器Adapter和ViewHolder
- 科普哈希长度扩展攻击(Hash Length Extension Attacks)
- 分析 WordPress 3.8.2 修復的cookie偽造漏洞
- 技术宅打造全能美剧播放器
- 判断是否支持Heartbeat的NSE脚本
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 一天一大 leet(二进制求和)难度:简单 DAY-23
- xmake v2.3.7 发布, 新增 tinyc 和 emscripten 工具链支持
- 一天一大 leet(最接近的三数之和)难度:中等 DAY-24
- Django渲染模板
- 一天一大 leet(移除重复节点)难度:简单 DAY-26
- Spring Boot 项目瘦身指南,瘦到不可思议!
- BigData--Hadoop数据压缩
- 面试官问我什么是JMM
- django+nginx+gunicorn部署配置
- JVM的YGC,这次被它搞惨了!
- ubuntu修复linux和windows双系统下挂载ntfs硬盘出错问题
- 一天一大 leet(长度最小的子数组)难度:中等 DAY-28
- Qt音视频开发24-ffmpeg音视频同步
- django使用django-crontab实现定时任务
- 一天一大 leet