NuralRecon项目中的generate_gt.py运行错误

博主在处理Scannet数据集时遇到问题,发现下载的预处理文件与源代码不匹配导致打标签出错。解决方案是修改工具文件simple_loader.py,将ID处理方式调整为匹配处理过的文件格式。代码示例给出了初始化函数的修正,以便正确加载数据集的帧信息,包括相机姿态、深度图和RGB图像。

在网上看的这个项目不错,谁知道是个大坑,自己在第一步打标签就出现问题,一直以为自己环境问题,然而经过查找,

发现是下载的经过处理的文件scannet_frames_25k和源代码不匹配,

这个打标签的函数是按照原始文件从0到1开始读取的文件,所以他的id是从0到1,并不是我想象中的从文件读取文件名,所以当我们使用经过处理的文件时,它会提示找不到文件等等错误,所以当我们这种下载处理过的数据的时候,我们需要去项目的tools文件中找到simple_loader.py文件进行修改,只需要做一些简单修改,就在这里

   def __init__(self, n_imgs, scene, data_path, max_depth, id_list=[]):
        """
        Args:
        """
        self.n_imgs = n_imgs
        self.scene = scene
        self.data_path = data_path
        self.max_depth = max_depth
        # if id_list is None:
           #self.id_list = [i for i in range(n_imgs)]
        for i in range(n_imgs):
            id_list += [str(i).rjust(4, '0') + '00']
        # else:
        self.id_list = id_list

防止有人看不懂,下面是我完整的代码,

今天刚刚做到这一步,感兴趣的可以点个关注,后续更新

def __init__(self, n_imgs, scene, data_path, max_depth, id_list=[]):
    """
    Args:
    """
    self.n_imgs = n_imgs
    self.scene = scene
    self.data_path = data_path
    self.max_depth = max_depth
    # if id_list is None:
       #self.id_list = [i for i in range(n_imgs)]
    for i in range(n_imgs):
        id_list += [str(i).rjust(4, '0') + '00']
    # else:
    self.id_list = id_list

def __len__(self):
    return self.n_imgs

def __getitem__(self, id):
    """
    Returns:
        dict of meta data and images for a single frame
    """
    id =self.id_list[id]
    cam_pose = np.loadtxt(os.path.join(self.data_path, self.scene, "pose", str(id) + ".txt"))#, delimiter=' '

    # Read depth image and camera pose
    depth_im = cv2.imread(os.path.join(self.data_path, self.scene, "depth", str(id) + ".png"), -1).astype(
        np.float32)
    depth_im /= 1000.  # depth is saved in 16-bit PNG in millimeters
    depth_im[depth_im > self.max_depth] = 0

    # Read RGB image
    color_image = cv2.cvtColor(cv2.imread(os.path.join(self.data_path, self.scene, "color", str(id) + ".jpg")),
                               cv2.COLOR_BGR2RGB)
    color_image = cv2.resize(color_image, (depth_im.shape[1], depth_im.shape[0]), interpolation=cv2.INTER_AREA)

    return cam_pose, depth_im, color_image
# 普通文本型 你遇到的错误: ``` NameError: name 'cat' is not defined ``` 是因为你**把 Shell 命令当成了 Python 代码来运行**了! --- ### ❌ 错误原因 你在终端中执行的是: ```bash python generate_labels.py ``` 但这个文件 `generate_labels.py` 的内容却是这样开头的: ```python cat &gt; generate_labels.py << 'EOL' import os from pathlib import Path ... EOL ``` 这根本不是 Python 代码,而是 **Linux shell 脚本命令**。Python 解释器尝试执行 `cat`,但 `cat` 不是 Python 内置函数,所以报错: &gt; `NameError: name 'cat' is not defined` --- ### ✅ 正确做法:先用 `cat` 创建文件(不要用 `python` 运行它) 你需要做的是:**在终端里直接输入以下完整流程,一行一行执行**。 --- ### ✅ 步骤 1:进入目录 ```bash cd /home/renyilin/111/UA-DETRAC1 ``` --- ### ✅ 步骤 2:使用 `cat` 创建 `generate_labels.py` 文件 请**逐行复制粘贴下面的内容到终端并回车执行**: ```bash cat &gt; generate_labels.py << 'EOF' import os from pathlib import Path # ========================================== # 配置路径 # ========================================== ROOT_DIR = Path("/home/renyilin/111/UA-DETRAC1") GT_FILE = ROOT_DIR / "train_gt.txt" OUTPUT_DIR = ROOT_DIR / "DETRAC-train-data" IMG_WIDTH = 960 IMG_HEIGHT = 540 # ========================================== # 检查输入文件 # ========================================== if not GT_FILE.exists(): print(f"❌ 错误:{GT_FILE} 不存在!") exit(1) print(f"📌 正在读取标注文件:{GT_FILE}") print(f"📁 输出标签目录:{OUTPUT_DIR}") # 确保输出目录存在 OUTPUT_DIR.mkdir(parents=True, exist_ok=True) # 统计变量 processed_lines = 0 written_files = set() with open(GT_FILE, 'r') as f: lines = f.readlines() print(f"📊 总共 {len(lines)} 行数据,开始处理...") for line_num, line in enumerate(lines, 1): try: # 清理并分割 line = line.strip() if not line or line.startswith('#'): continue # 替换反斜杠为正斜杠(兼容Windows路径) line = line.replace("\\", "/") # 解析格式:MVI_39861/img00176.jpg,x,y,w,h 或 MVI_39861/img00176.jpg,class,x,y,w,h parts = line.split(',') if len(parts) < 5: print(f"⚠️ 第 {line_num} 行字段不足,跳过: {line}") continue img_path_str = parts[0].strip() if "/" not in img_path_str: print(f"⚠️ 第 {line_num} 行路径无效,跳过: {img_path_str}") continue video_name = img_path_str.split("/")[0] img_file_name = img_path_str.split("/")[1] img_stem = Path(img_file_name).stem # 如 img00176 # 处理不同格式:判断 class_id 是否存在 offset = 1 if len(parts) == 6 else 0 # 如果有 class 字段则偏移 +1 x = float(parts[1 + offset]) y = float(parts[2 + offset]) w = float(parts[3 + offset]) h = float(parts[4 + offset]) cls_id = 0 # UA-DETRAC 默认为 car # 转换为中心坐标 + 归一化(YOLO 格式) xc = (x + w / 2) / IMG_WIDTH yc = (y + h / 2) / IMG_HEIGHT wn = w / IMG_WIDTH hn = h / IMG_HEIGHT # 构造输出文件名:MVI_39861_img00176.txt output_filename = f"{video_name}_{img_stem}.txt" output_file = OUTPUT_DIR / output_filename # 追加写入(允许多个目标在同一帧) with open(output_file, 'a') as of: of.write(f"{cls_id} {xc:.6f} {yc:.6f} {wn:.6f} {hn:.6f}\n") written_files.add(output_filename) processed_lines += 1 # 打印前10个生成的文件作为验证 if processed_lines <= 10: print(f"📄 [{processed_lines}] 写入: {output_file} -&gt; {cls_id} {xc:.6f} {yc:.6f} {wn:.6f} {hn:.6f}") except Exception as e: print(f"❌ 第 {line_num} 行处理失败: {line[:50]}... | 错误: {e}") continue print("\n🎉 标签生成完成!") print(f"✅ 成功处理 {processed_lines} 条标注") print(f"💾 生成 {len(written_files)} 个独立标签文件") print(f"📂 输出目录: {OUTPUT_DIR}") print(f"🔍 示例文件列表:") print(f" ls {OUTPUT_DIR}/MVI_*_img*.txt | head -5") EOF ``` &gt; 🔔 注意: &gt; - 输入第一行后按回车; &gt; - 粘贴中间所有 Python 代码; &gt; - 最后单独输入一行 `EOF` 并回车; &gt; - 就完成了文件创建。 --- ### ✅ 步骤 3:现在才能运行它! ```bash python generate_labels.py ``` 这时你应该会看到正常输出,比如: ``` 📌 正在读取标注文件:/home/renyilin/111/UA-DETRAC1/train_gt.txt 📊 总共 123456 行数据,开始处理... 📄 [1] 写入: /home/renyilin/111/UA-DETRAC1/DETRAC-train-data/MVI_39861_img00176.txt -&gt; 0 0.623438 0.450000 0.125000 0.166667 ... 🎉 标签生成完成! ✅ 成功处理 123456 条标注 💾 生成 1010 个独立标签文件 ``` --- ### ✅ 步骤 4:验证是否生成 `.txt` 文件 ```bash ls /home/renyilin/111/UA-DETRAC1/DETRAC-train-data/MVI_*_img*.txt | head -5 ``` 你应该看到类似输出: ``` /home/renyilin/111/UA-DETRAC1/DETRAC-train-data/MVI_39861_img00176.txt /home/renyilin/111/UA-DETRAC1/DETRAC-train-data/MVI_39861_img00177.txt ... ``` --- ### ✅ 总结 | 操作 | 是否正确 | |------|----------| | 用 `cat &gt; file.py << 'EOF'` 写文件 | ✅ 正确方式 | | 把 `cat` 命令保存进 `.py` 文件再用 `python` 运行 | ❌ 完全错误 | | 创建完后再用 `python generate_labels.py` 执行 | ✅ 正确 | 你现在只需按上述步骤重新创建文件,就能成功生成标签并继续后续训练流程。 &gt; 💡 提示:下次可使用 `nano generate_labels.py` 或 VS Code 编辑文件,避免此类问题。
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值