MXNet中对classification任务提供了把训练图像数据转换成一个大的二进制文件的方法,但是,对于其它任务例如语义分割等,并没有提供类似的功能。这里,介绍一下如何使用LMDB的Python接口把语义分割训练数据的图像和标签转换成LMDB的文件。首先,这里简要介绍一下问什么要把图像文件转换成大的二进制文件。

为什么要转换

为什么要把很多图像文件转换成一个大文件?

简单来说,是因为读写小文件的速度太慢。那么, 不禁要问,图像数据也是二进制文件,单个大的二进制文件例如LMDB文件也是二进制文件,为什么单个图像读写速度就慢了呢?这里分两种情况解释。

机械硬盘的情况:机械硬盘的每次读写启动时间比较场,例如磁头的寻道时间占比很高,因此,如果单个小文件读写,尤其是随机读写单个小文件的时候,这个寻道时间占比就会很高,最后导致大量读写小文件的时候时间会很浪费;

NFS的情况:在NFS的场景下,系统的一次读写首先要进行上百次的网络通讯,并且这个通讯次数和文件的大小无关。因此,如果是读写小文件,这个网络通讯时间占据了整个读写时间的大部分。

固态硬盘的情况下应该也会有一些类似的开销,目前没有研究过。

LMDB 的使用方法

LMDB 是一个key value 内存映射的数据库。内存映射的意思就是说,LMDB在使用的时候,会把磁盘上的数据映射到内存中,因此,只顺序读写的情况下,相当于直接在内存中操作数据,因此速度很快。另外,在网络训练场景中存储的LMDB数据是一个二进制文件,因此,也克服了上一部分说的小文件读写的问题。

LMDB 写数据

这里展示一下如何把图像数据存储到LMDB中,基本上分为3个步骤:

创建LMDB文件

创建对应的database

向对应的database中写数据

注意,LMDB中的数据不会保存图像的shape信息,为了在读取数据的过程中正确地恢复出图像,需要知道图像的shape 信息。如果图像的shape全部是相同的,那么可以不用存储该信息,如果不同,也可以把该信息存储在LMDB中。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31def img2lmdb():

# 创建数据库文件

env = lmdb.open(cfg.dataset, max_dbs=4, map_size=int(1e12))

# 创建对应的数据库

train_data = env.open_db("train_data")

train_label = env.open_db("train_label")

val_data = env.open_db("val_data")

val_label = env.open_db("val_label")

train_image_list, train_label_list = get_image_label_list(train=True)

val_image_list, val_label_list = get_image_label_list(train=False)

# 把图像数据写入到LMDB中

with env.begin(write=True) as txn:

for idx, path in enumerate(train_image_list):

logging.debug("{} {}".format(idx, path))

data = read_fixed_image(path)

txn.put(str(idx), data, db=train_data)

for idx, path in enumerate(train_label_list):

logging.debug("{} {}".format(idx, path))

data = read_fixed_label(path)

txn.put(str(idx), data, db=train_label)

for idx, path in enumerate(val_image_list):

logging.debug("{} {}".format(idx, path))

data = read_fixed_image(path)

txn.put(str(idx), data, db=val_data)

for idx, path in enumerate(val_label_list):

logging.debug("{} {}".format(idx, path))

data = read_fixed_label(path)

txn.put(str(idx), data, db=val_label)

LMDB读数据

例子如下,不解释了~

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33class DataIter(gluon.data.Dataset):

def __init__(self, train=True):

env = lmdb.open(cfg.dataset, max_dbs=4, map_size=int(1e12), readonly=True)

self.train_data = env.open_db("train_data")

self.train_label = env.open_db("train_label")

self.val_data = env.open_db("val_data")

self.val_label = env.open_db("val_label")

self.txn = env.begin()

self._length = self.txn.stat(db=self.train_data)["entries"] if train else self.txn.stat(db=self.val_data)["entries"]

self.train = train

def __getitem__(self, idx):

idx = str(idx)

if self.train:

image = self.txn.get(idx, db=self.train_data)

image = np.frombuffer(image, 'uint8')

image = np.reshape(image, [4] + list(cfg.raw_size))

label = self.txn.get(idx, db=self.train_label)

label = np.frombuffer(label, 'uint8')

label = np.reshape(label, list(cfg.raw_size))

return nd.array(image), nd.array(label / 255.0)

else:

image = self.txn.get(idx, db=self.val_data)

image = np.frombuffer(image, 'uint8')

image = np.reshape(image, [4] + list(cfg.raw_size))

label = self.txn.get(idx, db=self.val_label)

label = np.frombuffer(label, 'uint8')

label = np.reshape(label, list(cfg.raw_size))

return nd.array(image), nd.array(label / 255.0)

def __len__(self):

return self._length

python读取lmdb文件_LMDB 的 Python 接口使用方法相关推荐

  1. python读取txt文件并求和,Python读取txt文件数据的方法(用于接口自动化参数化数据)...

    小试牛刀: 1.需要python如何读取文件 2.需要python操作list 3.需要使用split()对字符串进行分割 代码运行截图 : 代码(copy) #encoding=utf-8 #1.r ...

  2. python读取大文件-强悍的Python读取大文件的解决方案

    Python 环境下文件的读取问题,请参见拙文 Python基础之文件读取的讲解 这是一道著名的 Python 面试题,考察的问题是,Python 读取大文件和一般规模的文件时的区别,也即哪些接口不适 ...

  3. python读取超大文件-强悍的Python读取大文件的解决方案

    Python 环境下文件的读取问题,请参见拙文 Python基础之文件读取的讲解 这是一道著名的 Python 面试题,考察的问题是,Python 读取大文件和一般规模的文件时的区别,也即哪些接口不适 ...

  4. python读取xls文件_从python中的xls读取unicode

    我正在尝试使用 Python读取.xls文件.该文件包含多个非ascii字符(即äöü).我已经尝试过使用openpyxls和xlrd(我对xlrd寄予厚望,因为它无论如何都会读取unicode中的所 ...

  5. python读取txt文件为dataframe,python批量读取txt文件为DataFrame

    我们有时候会批量处理同一个文件夹下的文件,并且希望读取到一个文件里面便于我们计算操作.比方我有下图一系列的txt文件,我该如何把它们写入一个txt文件中并且读取为DataFrame格式呢? 首先我们要 ...

  6. python读取grib文件_Windows下Python读取GRIB数据

    之前写了一篇<基于Python的GRIB数据可视化>的文章,好多博友在评论里问我Windows系统下如何读取GRIB数据,在这里我做一下说明. 一.在Windows下Python为什么无法 ...

  7. 怎么用python读取大文件_使用Python读取大文件的方法

    背景准备试一试:f =开放(\u201C\/道路\/ \/文件\u201D,\u201Cr\u201D)打印()最后:如果f:()调用读()将读取所有文件的内容,如果文件有10 g,记忆会破灭,所以, ...

  8. python读取csv文件_Hello,Python!小鲸教你Python之文件读取

    关于类的课程我们已经结束啦,现在,我们开启关于Python的一段新旅程吧!大家要跟上小鲸的小红旗,带好小红帽,不要走错路了哦! 文件读取数据 我们在工作或者学习中,会接触到很多存储大量数据的文本文件: ...

  9. python读取txt文件写入失败-Python write 函数写文件失败

    工作中涉及到了内容抓取的需求,用 Python 根据Url抓取对应的Html页面,并存储到本地文件,然后程序内继续将本地文件的路径作为参数,调用Node进行杂质过滤和内容提取.但怪的是在Python执 ...

  10. python读取sav文件_在Python中读取SPSS(.sav)文件时,获取“title already used as a name or title”错误...

    我正在读一个SPSS文件(.sav).我下面的代码可以读取.sav文件.但是,我遇到了一个非常奇怪的错误.当我试图读取另一个.sav文件时,它会给出以下错误Traceback (most recent ...

最新文章

  1. 【转载】Session服务器配置指南与使用经验
  2. VCL 中的 Windows API 函数(6): BeginDeferWindowPos
  3. My Site Cleanup Job
  4. 在php storm中怎么搭建环境,PhpStorm搭建git环境
  5. 学习响应式BootStrap来写融职教育网站,Bootsrtap第十一天Dplayer播放器
  6. 10个你可能没用过的linux命令
  7. OpenInfra Days China 2020大会议程已上线!
  8. hooks组件封装 react_名符其实的react下一代状态管理器hox
  9. visio 图标_visio有效提升工作效率
  10. 万能模拟器eve-ng介绍
  11. Windows如何注册Com组件
  12. Java金融计算机计算irr_手把手教你使用金融计算器
  13. android 文件隐藏文件,安卓手机里的文件怎么隐藏?安卓手机隐藏文件夹的方法
  14. 测试开发工程师面试题目
  15. 电脑安全模式没有修复计算机,电脑没有安全模式怎么办
  16. BBUCTF消失的MD5题解
  17. 计算机用户名和密码在哪个文件夹,登陆邮箱、论坛等的帐号和密码存放在电脑中的哪个文件夹中?...
  18. Homebrew快速安装教程
  19. python编程midi键盘按键_python 偷懒技巧——使用 keyboard 录制键盘事件
  20. 找到一个在线网站截图的网站

热门文章

  1. 基于Springboot+vue的办公OA系统#毕业设计
  2. 雨林木风SP3YN9.9 装机版09年09月更新(终结版)
  3. 普通计算机用的是什么屏幕,笔记本屏幕的色域 72%NTSC和100%sRGB有什么区别
  4. 37--8位级联加法器,并行加法器
  5. 明晰监管范围保护信息安全
  6. ARKit玩起来 - AR卡通秀-史小川-专题视频课程
  7. 用acdsee制作html,ACDSee 制作网络像册
  8. 四川大学转专业到计算机学院面试,2016年本科生转专业工作面试通知
  9. 机器学习---黑箱原理
  10. 对比修改过的两个BOM表