深度学习训练前标准的LMDB文件(data.mdb和lock.mdb)制作(附代码)

目录

  • 一、LMDB文件
  • 二、准备训练集
  • 三、安装basicsr包
  • 四、LMDB文件制作
    • 4.1 参数修改
    • 4.2 其它格式图片修改
    • 4.3 代码
    • 4.4 转换结果
      • 4.4.1 data.mdb文件
      • 4.4.2 lock.mdb文件
      • 4.4.3 meta_info.txt文件
  • 五、总结

一、LMDB文件

在训练的时候使用LMDB 存储形式可以加快IO 和CPU 解压缩的速度(测试的时候数据较少, 一般就没有太必要使用LMDB)。其具体的加速要 根据机器的配置来,以下几个因素会影响:

  1. 有的机器设置了定时清理缓存,而LMDB 依赖于缓存。因此若一直缓存不进去,则需要检查一下。一般free -h 命令下, LMDB 占用的缓存会记录在buff/cache 条目下面。

  2. 机器的内存是否足够大,能够把整个LMDB 数据都放进去。如果不是,则它由于需要不断更换缓存,会影响速度。

  3. 若是第一次缓存LMDB 数据集,可能会影响训练速度。可以在训练前,进入LMDB 数据集
    目录,把数据先缓存进去:cat data.mdb > /dev/null

二、准备训练集

训练集的种类及格式是多样的,这里主要以.png格式的图片进行讲解。如下:

在这里插入图片描述

三、安装basicsr包

进入终端后输入下面命令安装basicsr包:

pip install basicsr -i https://pypi.mirrors.ustc.edu.cn/simple/

四、LMDB文件制作

4.1 参数修改

在这里插入图片描述

4.2 其它格式图片修改

下面是数据集中,图片后缀为其它格式时,怎么修改代码,这里以.bmp格式图片为例:

在这里插入图片描述
在这里插入图片描述

4.3 代码

转换的详细代码见下:

import cv2
from basicsr.utils import scandir
import lmdb
import sys
from multiprocessing import Pool
from os import path as osp
from tqdm import tqdmdef create_lmdb_for_div2k():folder_path = 'Images/LMDB/Visible_Images'lmdb_path = 'Images/LMDB/Visible_Images.lmdb'img_path_list, keys = prepare_keys_div2k(folder_path)make_lmdb_from_imgs_lmdb(folder_path, lmdb_path, img_path_list, keys)def prepare_keys_div2k(folder_path):print('Reading image path list ...')img_path_list = sorted(list(scandir(folder_path, suffix='png', recursive=False)))   # 获取文件夹下所有后缀为 png 的文件路径,但不进行递归搜索keys = [img_path.split('.png')[0] for img_path in sorted(img_path_list)]        # 从图像路径中分离出键,去掉 '.png' 后缀并排序return img_path_list, keysdef prepare_keys_div2k_bmp(folder_path):print('Reading image path list ...')img_path_list = sorted(list(scandir(folder_path, suffix='bmp', recursive=False)))keys = [img_path.split('.bmp')[0] for img_path in sorted(img_path_list)]return img_path_list, keysdef read_img_worker(path, key, compress_level):img = cv2.imread(path, cv2.IMREAD_UNCHANGED)if img.ndim == 2:h, w = img.shapec = 1else:h, w, c = img.shape_, img_byte = cv2.imencode('.png', img, [cv2.IMWRITE_PNG_COMPRESSION, compress_level])return (key, img_byte, (h, w, c))def make_lmdb_from_imgs_lmdb(data_path,lmdb_path,img_path_list,keys,batch=5000,compress_level=1,multiprocessing_read=False,n_thread=40,map_size=None):assert len(img_path_list) == len(keys), ('img_path_list and keys should have the same length, 'f'but got {len(img_path_list)} and {len(keys)}')print(f'Create lmdb for {data_path}, save to {lmdb_path}...')print(f'Totoal images: {len(img_path_list)}')if not lmdb_path.endswith('.lmdb'):raise ValueError("lmdb_path must end with '.lmdb'.")if osp.exists(lmdb_path):print(f'Folder {lmdb_path} already exists. Exit.')sys.exit(1)if multiprocessing_read:# read all the images to memory (multiprocessing)dataset = {}  # use dict to keep the order for multiprocessingshapes = {}print(f'Read images with multiprocessing, #thread: {n_thread} ...')pbar = tqdm(total=len(img_path_list), unit='image')def callback(arg):"""get the image data and update pbar."""key, dataset[key], shapes[key] = argpbar.update(1)pbar.set_description(f'Read {key}')pool = Pool(n_thread)for path, key in zip(img_path_list, keys):pool.apply_async(read_img_worker, args=(osp.join(data_path, path), key, compress_level), callback=callback)pool.close()pool.join()pbar.close()print(f'Finish reading {len(img_path_list)} images.')# create lmdb environmentif map_size is None:# obtain data size for one imageimg = cv2.imread(osp.join(data_path, img_path_list[0]), cv2.IMREAD_UNCHANGED)_, img_byte = cv2.imencode('.png', img, [cv2.IMWRITE_PNG_COMPRESSION, compress_level])data_size_per_img = img_byte.nbytesprint('Data size per image is: ', data_size_per_img)data_size = data_size_per_img * len(img_path_list)map_size = data_size * 10env = lmdb.open(lmdb_path, map_size=map_size)# write data to lmdbpbar = tqdm(total=len(img_path_list), unit='chunk')txn = env.begin(write=True)txt_file = open(osp.join(lmdb_path, 'meta_info.txt'), 'w')for idx, (path, key) in enumerate(zip(img_path_list, keys)):pbar.update(1)pbar.set_description(f'Write {key}')key_byte = key.encode('ascii')if multiprocessing_read:img_byte = dataset[key]h, w, c = shapes[key]else:_, img_byte, img_shape = read_img_worker(osp.join(data_path, path), key, compress_level)h, w, c = img_shapetxn.put(key_byte, img_byte)# write meta informationtxt_file.write(f'{key}.png ({h},{w},{c}) {compress_level}\n')if idx % batch == 0:txn.commit()txn = env.begin(write=True)pbar.close()txn.commit()env.close()txt_file.close()print('\nFinish writing lmdb.')if __name__ == '__main__':create_lmdb_for_div2k()

4.4 转换结果

运行上面脚本,输出如下:

在这里插入图片描述
最终的LMDB文件在代码中设置的路径下:

在这里插入图片描述
生成的各个文件解析加下。

4.4.1 data.mdb文件

存储数据库中的所有实际数据,包括键值对、元数据等。

是一个二进制文件,可以直接使用内存映射的方式进行读写,访问速度非常快。

文件大小取决于数据库中存储的数据量。

4.4.2 lock.mdb文件

一个用于控制数据库访问的锁文件。

确保同一时间只有一个进程可以对数据库进行读写操作,防止数据损坏。

文件大小很小,通常只有几百字节。

4.4.3 meta_info.txt文件

采用txt 来记录,是为了可读性,文件中内容如下:

在这里插入图片描述
上面每一行记录了一张图片,有三个字段,分别表示:

  1. 图像名称(带后缀): 0001.png

  2. 图像大小:(1404,2040,3) 表示是1404 × 2040 × 3的图像

  3. 其他参数(BasicSR 里面使用了cv2 压缩png 程度): 因为在复原任务中,通常使用png 来存储, 所以这个1 表示png 的压缩程度, 也就是CV_IMWRITE_PNG_COMPRESSION 为1。CV_IMWRITE_PNG_COMPRESSION可以取值为[0, 9] 的整数,更大的值表示更强的压缩,即更小的储存空间和更长的压缩时间。

五、总结

以上就是深度学习训练前标准的LMDB文件(data.mdb和lock.mdb)制作过程,希望能帮我你,有问题欢迎留言。

感谢您阅读到最后!关注公众号「视觉研坊」,获取干货教程、实战案例、技术解答、行业资讯!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/761063.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

点餐小程序开发:如何通过抽奖与消费者互动

随着科技的发展,越来越多的商家开始使用点餐小程序来提升自己的服务质量和效率。然而,仅仅提供点餐服务并不能满足消费者的需求,他们还需要一种方式来增加与商家的互动,提高消费体验。抽奖活动就是一种非常有效的互动方式&#xf…

FreeRTOS 消息队列

1. 队列简介 1.1 队列的概念 队列是任务到任务、任务到中断、中断到任务数据交流的一种机制(消息传递) 类似全局变量?假设有一个全局变量a 0,现有两个任务都在写这个变量 a: 大家想象一下如果任务 1 运行一次&#…

[NOIP1998 提高组] 拼数

[NOIP1998 提高组] 拼数 题目描述 设有 n n n 个正整数 a 1 … a n a_1 \dots a_n a1​…an​,将它们联接成一排,相邻数字首尾相接,组成一个最大的整数。 输入格式 第一行有一个整数,表示数字个数 n n n。 第二行有 n n …

一些刷题需要用的大数据

无符号版本和有符号版本的区别就是有符号类型需要使用一个bit来表示数字的正负。 如果需声明无符号类型的话就需要在类型前加上unsigned。 整型的每一种都分为:无符号(unsigned)和有符号(signed)两种类型(f…

Day76:WEB攻防-Fuzz模糊测试篇JS算法口令隐藏参数盲Payload未知文件目录

目录 Fuzz技术-用户口令-常规&模块&JS插件 无验证码密码明文 无验证码密码弱加密(MD5) 无验证码密码复杂加密(通过js文件进行加密) Fuzz技术-目录文件-目录探针&文件探针 Fuzz技术-未知参数名-文件参数&隐藏参数 Fuzz技术-构造参数值-漏洞攻击恶意Paylo…

分布式之Skywalking

Skywalking skywalking是一个apm系统,包含监控,追踪,并拥有故障诊断能力的 分布式系统 一、Skywalking介绍 1.什么是SkyWalking Skywalking是由国内开源爱好者吴晟开源并提交到Apache孵化器的产品,它同时吸收了Zipkin /Pinpoint …

Anaconda安装 (windowsLinux)

文章目录 Anaconda简介设置国内源pip || conda 一、Anaconda (Windows系统)1.1 下载及安装1.2 虚拟环境创建1.3 在Pycharm中配置conda的环境 二、Anaconda(Linux系统) Anaconda简介 conda是一个开源的包、环境管理器,可…

2024年【T电梯修理】模拟考试及T电梯修理模拟考试题库

题库来源:安全生产模拟考试一点通公众号小程序 T电梯修理模拟考试是安全生产模拟考试一点通生成的,T电梯修理证模拟考试题库是根据T电梯修理最新版教材汇编出T电梯修理仿真模拟考试。2024年【T电梯修理】模拟考试及T电梯修理模拟考试题库 1、【多选题】…

Huggingface 笔记:大模型(Gemma2B,Gemma 7B)部署+基本使用

1 部署 1.1 申请权限 在huggingface的gemma界面,点击“term”以申请gemma访问权限 https://huggingface.co/google/gemma-7b 然后接受条款 1.2 添加hugging对应的token 如果直接用gemma提供的代码,会出现如下问题: from transformers i…

怎样修改grafana的Loading picture和加载的文本

登录装了grafana的linux机器 command “sudo vi /usr/share/grafana/public/views/index.html”,编辑配置文件。 找到.preloader__logo更改background-image. 这里可以是个url也可以是个路径。 如果想要更改加载的文字.可以更改 的内容 改完:wq保存以后退出&…

鸿蒙一次开发,多端部署(八)典型布局场景

虽然不同应用的页面千变万化,但对其进行拆分和分析,页面中的很多布局场景是相似的。本小节将介绍如何借助自适应布局、响应式布局以及常见的容器类组件,实现应用中的典型布局场景。 说明: 在本文 媒体查询 小节中已经介绍了如何通…

【JS】替换文本为emjio表情

最终效果展示 T1 T2 T3 T4 需求 把评论你好帅啊啊啊[开心][开心],[开心] 替换为图片 思路 正则match提取[开心]到一个数组数组去重创建img标签img标签转文本. 。例:(el.outerHTML),将el元素转文本字符串replaceAll…

js【详解】深拷贝

什么是深拷贝? 对于引用类型的数据,才有深浅拷贝的说法 浅拷贝 :执行拷贝的变量只复制被拷贝变量内存的引用数据的地址。 被拷贝变量内地址指向的数据发生变化时,执行拷贝的变量也会同步改变 深拷贝: 在堆内存中开…

如何在edge上安装拓展weTab

1.点解管理拓展 2.点击获取拓展 3.搜索框输入"wetab"并搜索 4.点击获取按钮 5.点击之后跳出弹窗,点击"添加拓展" 6.回到拓展页面,找到wetab拓展,点击右侧启动拓展 7.打开新的界面,wetab已经启动 8.自定义界面 1. 右键图标可以进行删除操作 2.左下角有个设…

Kubernetes集群搭建 kubernetes集群安装

Kubeadm kubeadm 是 Kubernetes 社区提供的集群构建工具,它能够以最佳实践的方式部署一个最小化的可用 Kubernetes 集群。 但是 kubeadm 在设计上并未安装网络解决方案,所以需要用户自行安装第三方符合 CNI 的网络解决方案,如 flanal&#…

【Python + Django】启动简单的文本页面

前言: 为了应付(bushi)毕业论文,总要自己亲手搞一个像模像样的项目出来吧 ~ ~ 希望自己能在新的连载中学到项目搭建的知识,这也算是为自己的测试经历增添光彩吧!!! 希望、希望大家…

你的电脑打不开摄像头问题

我一直以为我电脑上的摄像头老是打不开是因为硬件不匹配的问题。知道我发现了我的拯救者Y7000的机身盘边的“摄像头开关”按钮。。。 我去,你的摄像头开关按钮怎么设置在机身旁边啊。。。。 —————————————————————— 2024年3月21日更新记录&a…

UE5.3 StateTree使用实践

近期浏览UE的CitySample(黑客帝国Demo),发现有不少逻辑用到了StateTree学习一下,StateTree是多层状态机实现,以组件的形式直接挂载在蓝图中运行。 与平时常见的一些FSM库不同,StateTree并不会返回给外界当…

【Git】第二课:git安装和配置

安装 我们伟大祖国有句古话叫巧妇难为无米之炊,还有句话叫工欲善其事必先利其器。所以,在正式的学习之前,我们需要先把git这把利器安装好。 Windows系统 下载安装包 打开Git - Downloading Package页面,根据系统类型32位还是6…

基于C/C++的easyx图形库教程

文章目录: 一:前言 二:窗口(宽高 背景颜色 窗口标题 弹出对话框) 三:图形绘制(点 线 矩形 圆 椭圆) 四:文字(颜色 大小 背景 位置 打印 文字居中) 五&a…