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中如何写控制台进度条的整理
Mar 07 Python
基于python的图片修复程序(实现水印去除)
Jun 04 Python
python 实现求解字符串集的最长公共前缀方法
Jul 20 Python
Linux下Pycharm、Anaconda环境配置及使用踩坑
Dec 19 Python
PyCharm中代码字体大小调整方法
Jul 29 Python
python实现智能语音天气预报
Dec 02 Python
Python MySQL 日期时间格式化作为参数的操作
Mar 02 Python
利用python在excel中画图的实现方法
Mar 17 Python
如何表示python中的相对路径
Jul 08 Python
详解Selenium-webdriver绕开反爬虫机制的4种方法
Oct 28 Python
pandas实现导出数据的四种方式
Dec 13 Python
深入解析NumPy中的Broadcasting广播机制
May 30 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与XML联手进行网站编程代码实例
2008/07/10 PHP
通过实例解析PHP数据类型转换方法
2020/07/11 PHP
javascript SocialHistory 检查访问者是否访问过某站点
2008/08/02 Javascript
window.dialogArguments 使用说明
2011/04/11 Javascript
禁止你的左键复制实用技巧
2013/01/04 Javascript
js判断选择的时间是否大于今天的代码
2013/08/20 Javascript
深入理解JavaScript系列(49):Function模式(上篇)
2015/03/04 Javascript
跟我学习javascript的闭包
2015/11/16 Javascript
浏览器兼容性问题大汇总
2015/12/17 Javascript
Vue学习笔记之表单输入控件绑定
2017/09/05 Javascript
cocos creator Touch事件应用(触控选择多个子节点的实例)
2017/09/10 Javascript
javascript自定义事件功能与用法实例分析
2017/11/08 Javascript
在vue-cli中组件通信的方法
2017/12/16 Javascript
vue组件库的在线主题编辑器的实现思路
2020/04/03 Javascript
Vue父组件监听子组件生命周期
2020/09/03 Javascript
[01:02:05]LGD vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
[32:07]完美世界DOTA2联赛PWL S3 LBZS vs Rebirth 第一场 12.16
2020/12/17 DOTA
详解Python中的文件操作
2016/08/28 Python
Python编程实现二分法和牛顿迭代法求平方根代码
2017/12/04 Python
Python爬虫实现简单的爬取有道翻译功能示例
2018/07/13 Python
Python实现爬取亚马逊数据并打印出Excel文件操作示例
2019/05/16 Python
Django model update的多种用法介绍
2020/03/28 Python
Win10+GPU版Pytorch1.1安装的安装步骤
2019/09/27 Python
Python对接支付宝支付自实现功能
2019/10/10 Python
Python 批量读取文件中指定字符的实现
2020/03/06 Python
python如何使用代码运行助手
2020/07/03 Python
聊聊python中的循环遍历
2020/09/07 Python
python 多线程中join()的作用
2020/10/29 Python
CSS3制作皮卡丘动画壁纸的示例
2020/11/02 HTML / CSS
估算杭州有多少软件工程师
2015/08/11 面试题
GWT的应用有哪两种部署模式
2012/12/21 面试题
公司租车协议书
2015/01/29 职场文书
小学开学典礼新闻稿
2015/07/17 职场文书
师德师风培训感言
2015/08/03 职场文书
幼儿园大班教育随笔
2015/08/14 职场文书
教师教育心得体会
2016/01/19 职场文书