python生成lmdb格式的文件实例


Posted in Python onNovember 08, 2018

在crnn训练的时候需要用到lmdb格式的数据集,下面是python生成lmdb个是数据集的代码,注意一定要在linux系统下,否则会读入图像的时候出问题,可能遇到的问题都在代码里面注释了,看代码即可。

#-*- coding:utf-8 -*-
 
import os
import lmdb#先pip install这个模块哦
import cv2
import glob
import numpy as np
 
 
def checkImageIsValid(imageBin):
 if imageBin is None:
  return False
 imageBuf = np.fromstring(imageBin, dtype=np.uint8)
 img = cv2.imdecode(imageBuf, cv2.IMREAD_GRAYSCALE)
 if img is None:
  return False
 imgH, imgW = img.shape[0], img.shape[1]
 if imgH * imgW == 0:
  return False
 return True
 
def writeCache(env, cache):
 with env.begin(write=True) as txn:
  for k, v in cache.iteritems():
   txn.put(k, v)
 
def createDataset(outputPath, imagePathList, labelList, lexiconList=None, checkValid=True):
 """
 Create LMDB dataset for CRNN training.
# ARGS:
  outputPath : LMDB output path
  imagePathList : list of image path
  labelList  : list of corresponding groundtruth texts
  lexiconList : (optional) list of lexicon lists
  checkValid : if true, check the validity of every image
 """
 # print (len(imagePathList) , len(labelList))
 assert(len(imagePathList) == len(labelList))
 nSamples = len(imagePathList)
 print '...................'
 env = lmdb.open(outputPath, map_size=8589934592)#1099511627776)所需要的磁盘空间的最小值,之前是1T,我改成了8g,否则会报磁盘空间不足,这个数字是字节
 
 cache = {}
 cnt = 1
 for i in xrange(nSamples):
  imagePath = imagePathList[i]
  label = labelList[i]
  if not os.path.exists(imagePath):
   print('%s does not exist' % imagePath)
   continue
  with open(imagePath, 'r') as f:
   imageBin = f.read()
  if checkValid:
   if not checkImageIsValid(imageBin):
    print('%s is not a valid image' % imagePath)#注意一定要在linux下,否则f.read就不可用了,就会输出这个信息
    continue
 
  imageKey = 'image-%09d' % cnt
  labelKey = 'label-%09d' % cnt
  cache[imageKey] = imageBin
  cache[labelKey] = label
  if lexiconList:
   lexiconKey = 'lexicon-%09d' % cnt
   cache[lexiconKey] = ' '.join(lexiconList[i])
  if cnt % 1000 == 0:
   writeCache(env, cache)
   cache = {}
   print('Written %d / %d' % (cnt, nSamples))
  cnt += 1
 nSamples = cnt - 1
 cache['num-samples'] = str(nSamples)
 writeCache(env, cache)
 print('Created dataset with %d samples' % nSamples)
 
 
def read_text(path):
 
 with open(path) as f:
  text = f.read()
 text = text.strip()
 
 return text
 
 
if __name__ == '__main__':
 # lmdb 输出目录
 outputPath = 'D:/ruanjianxiazai/tuxiangyangben/fengehou/train'#训练集和验证集要跑两遍这个程序,分两次生成
 
 path = "D:/ruanjianxiazai/tuxiangyangben/fengehou/chenguang/*.jpg"#将txt与jpg的都放在同一个文件里面
 imagePathList = glob.glob(path)
 print '------------',len(imagePathList),'------------'
 imgLabelLists = []
 for p in imagePathList:
  try:
   imgLabelLists.append((p, read_text(p.replace('.jpg', '.txt'))))
  except:
   continue
   
 # imgLabelList = [ (p, read_text(p.replace('.jpg', '.txt'))) for p in imagePathList]
 # sort by labelList
 imgLabelList = sorted(imgLabelLists, key = lambda x:len(x[1]))
 imgPaths = [ p[0] for p in imgLabelList]
 txtLists = [ p[1] for p in imgLabelList]
 
 createDataset(outputPath, imgPaths, txtLists, lexiconList=None, checkValid=True)

以上这篇python生成lmdb格式的文件实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python使用lxml模块和Requests模块抓取HTML页面的教程
May 16 Python
Python打包可执行文件的方法详解
Sep 19 Python
python 队列详解及实例代码
Oct 18 Python
python编写弹球游戏的实现代码
Mar 12 Python
Python键盘输入转换为列表的实例
Jun 23 Python
python进行两个表格对比的方法
Jun 27 Python
让你Python到很爽的加速递归函数的装饰器
May 26 Python
python的debug实用工具 pdb详解
Jul 12 Python
详解Python3 pandas.merge用法
Sep 05 Python
python模拟斗地主发牌
Apr 22 Python
python和js交互调用的方法
Jun 23 Python
python脚本使用阿里云slb对恶意攻击进行封堵的实现
Feb 04 Python
python实现嵌套列表平铺的两种方法
Nov 08 #Python
python用列表生成式写嵌套循环的方法
Nov 08 #Python
在Python中实现shuffle给列表洗牌
Nov 08 #Python
python实现RabbitMQ的消息队列的示例代码
Nov 08 #Python
对Python 3.5拼接列表的新语法详解
Nov 08 #Python
Python使用random.shuffle()打乱列表顺序的方法
Nov 08 #Python
python RabbitMQ 使用详细介绍(小结)
Nov 08 #Python
You might like
php 正则表达式小结
2009/08/31 PHP
队列在编程中的实际应用(php)
2010/09/04 PHP
Smarty模板引擎缓存机制详解
2016/05/23 PHP
thinkPHP5.0框架自动加载机制分析
2017/03/18 PHP
php读取本地json文件的实例
2018/03/07 PHP
不能再简单的无闪刷新验证码原理很简单
2007/11/05 Javascript
通过jQuery源码学习javascript(二)
2012/12/27 Javascript
js获取页面传来参数的方法
2014/09/06 Javascript
jquery插件bootstrapValidator数据验证详解
2016/11/09 Javascript
JS ES6中setTimeout函数的执行上下文示例
2017/04/27 Javascript
JavaScript闭包_动力节点Java学院整理
2017/06/27 Javascript
微信小程序列表中item左滑删除功能
2018/11/07 Javascript
《javascript设计模式》学习笔记一:Javascript面向对象程序设计对象成员的定义分析
2020/04/07 Javascript
three.js着色器材质的内置变量示例详解
2020/08/16 Javascript
详解python中sort排序使用
2019/03/23 Python
Python可迭代对象操作示例
2019/05/07 Python
Pyqt5 实现跳转界面并关闭当前界面的方法
2019/06/19 Python
使用TensorFlow-Slim进行图像分类的实现
2019/12/31 Python
Python爬虫爬取百度搜索内容代码实例
2020/06/05 Python
python实现图片,视频人脸识别(opencv版)
2020/11/18 Python
使用Html5、CSS实现文字阴影效果
2018/01/17 HTML / CSS
Python中pass语句的作用是什么
2016/06/01 面试题
介绍一下Ruby的特点
2013/01/20 面试题
体育教育专业毕业生自荐信
2013/11/15 职场文书
电话销售经理岗位职责
2013/12/07 职场文书
护理实习自我鉴定
2013/12/14 职场文书
致400米运动员广播稿
2014/02/07 职场文书
爱心捐书活动总结
2014/07/05 职场文书
正风肃纪查摆剖析材料
2014/10/10 职场文书
社会实践活动总结
2015/02/05 职场文书
2015年入党积极分子评语
2015/03/26 职场文书
2015年党支部书记工作总结
2015/05/21 职场文书
大学生志愿者心得体会
2016/01/15 职场文书
导游词之嵊泗列岛
2019/10/30 职场文书
经典《舰娘》游改全新动画预告 预定11月开播
2022/04/01 日漫
Django框架模板用法详解
2022/06/10 Python