carrat 2023-07-27 15:32 采纳率: 57.1%
浏览 7
已结题

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

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

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


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

  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-07-27 19:14
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:
    • 以下回答由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数据库文件创建过程示例,实际情况可能需要根据你的具体需求进行适当的修改和调整。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月28日
  • 已采纳回答 7月28日
  • 创建了问题 7月27日

悬赏问题

  • ¥15 yolov5目标检测并显示目标出现的时间或视频帧
  • ¥15 电视版的优酷可以设置电影连续播放吗?
  • ¥50 复现论文;matlab代码编写
  • ¥30 echarts 3d地图怎么实现一进来页面散点数据和卡片一起轮播
  • ¥15 数字图像的降噪滤波增强
  • ¥15 心碎了,为啥我的神经网络训练的时候第二个批次反向传播会报错呀,第一个批次都没有问题
  • ¥15 MSR2680-XS路由器频繁卡顿问题
  • ¥15 VB6可以成功读取的文件,用C#读不了
  • ¥15 如何使用micpyhon解析Modbus RTU返回指定站号的湿度值,并确保正确?
  • ¥15 C++ 句柄后台鼠标拖动如何实现