Python创建CRNN训练用的LMDB数据库文件

在创建 LMDB dataset 的时候,其中有一行是这个

env = lmdb.open(outputPath, map_size=21474836480)


想问一下map_size的设置是自己随意定吗?不用管数据集的多少?因为数据量比较大的时候,训练数据和测试数据数量差很大,但是生成的.mdb文件都是一样大的,达到了设置的20G

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答由chatgpt基于相关博客总结生成:

    lmdb是一个高性能的内存数据库,它使用内存映射技术将数据存储在磁盘上。map_size参数用于设置数据库的最大存储容量。默认情况下,它的大小是1GB。在设置map_size时,确保其大于或等于数据集的总大小。如果设置的过小,可能会导致存储空间不足的错误。

    要创建CRNN训练所使用的LMDB数据库文件,你可以按照以下步骤进行操作:

    1. 安装lmdb库:在终端窗口中运行以下命令安装lmdb库:
    $ pip install lmdb
    
    1. 导入必要的库:在Python脚本中导入lmdb和其他需要的库。
    import lmdb
    from PIL import Image
    import numpy as np
    import os
    
    1. 定义函数以将图像和标签转换成适合存储在LMDB中的格式。
    def transform_image(image_path):
        """
        将图像转换为适合存储在LMDB中的格式。
        """
        image = Image.open(image_path)
        image = image.convert('L')  # 将彩色图像转换为灰度图像
        image = image.resize((image_width, image_height), Image.ANTIALIAS)  # 调整图像大小
        image_array = np.array(image)  # 将图像转换为NumPy数组
        return image_array
    
    def transform_label(label):
        """
        将标签转换为适合存储在LMDB中的格式。
        """
        label_array = np.array(label, dtype=np.uint8)  # 将标签转换为NumPy数组
        return label_array
    
    1. 创建训练和测试数据集的LMDB数据库文件。
    def create_lmdb_dataset(dataset_path, output_path, map_size):
        """
        创建LMDB数据集。
        """
        env = lmdb.open(output_path, map_size=map_size)
    
        txn = env.begin(write=True)  # 开始写环境事务
    
        # 遍历数据集文件夹
        for root, dirs, files in os.walk(dataset_path):
            for file_name in files:
                if file_name.endswith('.jpg'):  # 假设图像文件的扩展名为.jpg
                    image_path = os.path.join(root, file_name)  # 图像文件的完整路径
                    label = file_name.split('.')[0]  # 文件名作为标签,假设没有文件名冲突
                    image_array = transform_image(image_path)  # 转换图像
                    label_array = transform_label(label)  # 转换标签
    
                    # 将图像和标签存储到LMDB中
                    txn.put(f'{os.path.basename(image_path)}'.encode(), image_array.tobytes())
                    txn.put(f'{os.path.basename(image_path)}_label'.encode(), label_array.tobytes())
    
        txn.commit()  # 提交事务
        env.close()  # 关闭环境
    
    # 设置输入和输出路径
    dataset_path = 'path/to/dataset'  # 数据集的路径
    output_path = 'path/to/output'  # LMDB数据库文件的输出路径
    map_size = 21474836480  # 设置存储空间大小,20GB
    
    # 创建数据集的LMDB数据库文件
    create_lmdb_dataset(dataset_path, output_path, map_size)
    

    以上代码是一个示例,它假设你的数据集包含一系列的图像文件(假设为.jpg格式),并将图像文件名转换为标签。你可以根据你的数据集的实际情况进行修改。

    注意:以上代码仅提供了一个基本的LMDB数据库文件创建过程示例,实际情况可能需要根据你的具体需求进行适当的修改和调整。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

你把文件发给我检查一下