python3 制作CRNN lmdb格式的数据集

写入的代码

#-*- 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)
    imageBuf = np.frombuffer(imageBin, dtype=np.uint8)
    # 从网络读取图像数据并转换成图片格式
    # 读入灰度图片,可用0作为实参替代
    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.items():
            txn.put(str(k).encode(), str(v).encode())
 
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=1099511627776)#1099511627776)所需要的磁盘空间的最小值,之前是1T,我改成了8g,否则会报磁盘空间不足,这个数字是字节
    
    cache = {}
    cnt = 1
    for i in range(nSamples):
        imagePath = imagePathList[i]
        label = labelList[i]
        if not os.path.exists(imagePath):
            print('%s does not exist' % imagePath)
            continue
        with open(imagePath, 'rb') 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__':

    mode = 'train'
    # mode = 'test'
    # lmdb 输出目录
    outputPath = f'/media/disk3/yrq/ocr/DB/datasets/wm_lmdb/{mode}'#训练集和验证集要跑两遍这个程序,分两次生成
 
    path = f"/media/disk3/yrq/ocr/DB/datasets/water_meter/{mode}_images/*.jpg"
    imagePathList = sorted(glob.glob(path))
    path_label = f"/media/disk3/yrq/ocr/DB/datasets/water_meter/{mode}_gts/*.txt"
    imagelabelList = sorted(glob.glob(path_label))
    print ('------------',len(imagePathList),'------------')
    imgLabelLists = []
    for p,label in zip(imagePathList,imagelabelList):
        try:
           imgLabelLists.append((p, read_text(label)))
        except:
            continue
            
    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)
 

读取的代码

# -*- coding: utf-8 -*-
import numpy as np
import lmdb
import cv2

with lmdb.open("/media/disk3/yrq/ocr/DB/datasets/wm_lmdb/train") as env:
    txn = env.begin()
    for key, value in txn.cursor():
        print (key,value)
        imageBuf = np.frombuffer(value, dtype=np.uint8)
        img = cv2.imdecode(imageBuf, cv2.IMREAD_GRAYSCALE)
        if img is not None:
            cv2.imshow('image', img)
            cv2.waitKey()
        else:
            print ('This is a label: {}'.format(value))
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
下面是一份示例代码,可以用于制作并运行CRNN所需的LMDB数据集。 ```python import os import random import numpy as np import cv2 import lmdb import six # 设置随机数种子 random.seed(123456) # 读取数据集列表 def read_dataset_list(dataset_dir): dataset_list = [] with open(os.path.join(dataset_dir, "dataset.txt"), "r") as f: for line in f: items = line.strip().split(" ") image_path = os.path.join(dataset_dir, items[0]) label = items[1] dataset_list.append((image_path, label)) return dataset_list # 生成随机序列 def get_random_seq(num): seq = [i for i in range(num)] random.shuffle(seq) return seq # 生成 LMDB 数据集 def build_lmdb_dataset(dataset_dir, lmdb_dir): # 读取数据集列表 dataset_list = read_dataset_list(dataset_dir) # 打乱数据集顺序 seq = get_random_seq(len(dataset_list)) dataset_list = [dataset_list[i] for i in seq] # 创建 LMDB 数据库 env = lmdb.open(lmdb_dir, map_size=int(1e12)) with env.begin(write=True) as txn: for i, (image_path, label) in enumerate(dataset_list): # 加载图像 image = cv2.imread(image_path) # 转换为灰度图像 image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 转换为 Numpy 数组 image = np.array(image) # 转换为字节流 image = image.tobytes() label = six.ensure_str(label).encode("utf-8") # 生成键值对 key = "{:08d}".format(i).encode("ascii") value = (image, label) # 写入 LMDB 数据库 txn.put(key, six.moves.cPickle.dumps(value)) if i % 1000 == 0: print("Write %d / %d" % (i, len(dataset_list))) print("Finish writing lmdb.") ``` 这段代码可以实现从给定的数据集目录中读取图像和标签,然后将它们转换为LMDB格式并写入到指定的LMDB目录中。要使用此代码,请在Python环境中安装OpenCV和LMDB库,并按照自己的需求修改代码中的数据集目录和LMDB目录。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑瞳丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值