为含k-hot标签的图像数据集创建LMDB遇解析问题求助
我之前处理多标签图像数据集生成LMDB时,也碰到过完全一样的问题——单标签场景下流程顺畅,换成k-hot向量就报文件找不到,核心原因就是脚本对每行内容的分割逻辑没适配多标签的格式,给你几个具体的排查和修复方向:
修正文本行的分割逻辑
单标签场景下,脚本可能直接用split()按空格分割整行,取第一个元素当路径、第二个当标签。但k-hot向量本身包含多个空格,这种分割方式会把向量拆成多个元素,导致脚本误把向量的部分数字当成路径的一部分,自然找不到文件。
解决办法是按第一个空格分割路径和标签部分:# 替换原来的split()写法 import os with open("your_label_file.txt", "r") as f: for line in f: line = line.strip() if not line: continue # 只分割一次,把路径和后面的标签内容分开 path, label_str = line.split(maxsplit=1) # 再把标签字符串转成k-hot向量 k_hot_label = list(map(int, label_str.split())) # 可添加验证:检查路径是否存在 if not os.path.exists(path): print(f"警告:文件不存在 {path}") # 后续写入LMDB的逻辑...如果你的图像路径本身包含空格,那上面的方法还是会出错,这时候建议给路径加双引号(比如
"./my image.jpg" 1 0 1),然后用shlex.split()来解析,它能正确识别带引号的路径:import shlex with open("your_label_file.txt", "r") as f: for line in f: parts = shlex.split(line.strip()) path = parts[0] k_hot_label = list(map(int, parts[1:]))验证解析结果的正确性
在脚本里加几行打印语句,输出解析后的path和k_hot_label,确认路径是真实存在的文件路径,标签是完整的k-hot向量。比如:print(f"解析路径: {path}") print(f"解析标签: {k_hot_label}") print(f"路径是否存在: {os.path.exists(path)}")这一步能快速定位是解析逻辑错了,还是真的有文件缺失。
适配LMDB的标签写入逻辑
单标签时你可能只是把单个数字转成整数存储,但多标签需要把k-hot向量转成适合LMDB存储的格式(比如字节流)。比如用numpy数组转成bytes:import numpy as np # 把向量转成int8类型的numpy数组,节省存储空间 label_array = np.array(k_hot_label, dtype=np.int8) # 转成字节流写入LMDB label_bytes = label_array.tobytes()同时要确保后续读取LMDB时,能把字节流正确转回k-hot向量,格式要对应上。
用最小化案例测试
先创建一个只有2-3行的测试文本文件,比如:./test_img1.jpg 1 0 1 ./test_img2.jpg 0 1 0用修改后的脚本运行这个小案例,看看能不能成功生成LMDB,并且读取出来验证内容是否正确。如果小案例没问题,再逐步扩展到整个数据集,这样更容易定位潜在的格式问题。
内容的提问来源于stack exchange,提问作者Somayyeh

