nerfstudio 数据集去重:10 分钟用图像指纹清掉重复图像
【免费下载链接】nerfstudioA collaboration friendly studio for NeRFs项目地址: https://gitcode.com/GitHub_Trending/ne/nerfstudio
打开images目录,800 帧里至少 200 张几乎一模一样。做 nerfstudio 数据集去重前,先把重复图像检测、数据集清洗这一步在 NeRF 数据预处理里跑通,训练才不会被冗余帧拖慢。
三分钟跑通:装环境、指目录、出报告
这节只解决一件事:让你最快看到第一份查重结果,先别管为什么。
- 装环境。
git clone https://gitcode.com/GitHub_Trending/ne/nerfstudio拉下仓库(去重要用它自带的处理工具),再pip install -e .。其实很简单,前提是 Python 3.8+ 和 ffmpeg 已经就位。 - 指向数据目录。把原始图丢进
data/your_dataset,一整轮手机连拍或 Polycam 导出的都行,下面这张就是典型的输入——一整圈扫下来的室内原始帧:
- 执行去重。把"实战演示"里的两段代码存成
dedup_report.py,跑python dedup_report.py。 - 看到输出。终端会打出一行
共 X 张唯一 / Y 张重复,Y 就是眼下能直接删掉的冗余帧数。
把 Y 跑出来再说后面。真正该删的帧、以及为什么可信,下面两节各管一段。
为什么哈希能查重:把每张图当指纹卡片
这节一句话讲清原理,不堆术语:把每张图当成一张指纹卡片,读它的字节流算出一个固定长度的摘要(哈希),内容哪怕只动 1 个像素,摘要就完全不同;两张字节完全一样的图,摘要必然一样。手机相册的查重 App 干的就是这件事——先把所有照片生成指纹,再两两比对,全等的标红,你点一下就删。说白了,去重 = 列卡片 + 记指纹 + 挑重复,三步里没有一步需要碰模型或耗 GPU。
落到 nerfstudio 上,nerfstudio/process_data/process_data_utils.py里的list_images负责"列卡片":它按后缀(jpg、jpeg、png、tif、tiff 加 cr2)把目录里的图全部扫出来排序,递归时连子目录一起进。剩下两步——逐张算 SHA-1、记进一个字典、出现过第二次就算重复——是纯 Python,1000 帧混进 150 张重复,几秒钟就能全量比对完,结果稳定可复现。
实战演示
这节给可直接跑的代码,分两步:先出报告,再落盘。
如何批量比对图像哈希
这段在做什么:列出全部图像、逐张算 SHA-1、统计唯一张数和重复张数,并打印前 10 组重复文件名。
import hashlib from pathlib import Path from nerfstudio.process_data.process_data_utils import list_images sha1 = lambda p: hashlib.sha1(open(p, "rb").read()).hexdigest() seen, dupes = {}, [] for p in list_images(Path("data/your_dataset")): h = sha1(p) if h in seen: dupes.append((p.name, seen[h])) else: seen[h] = p.name print(len(seen), "唯一 /", len(dupes), "重复")跑完你手里有两个东西:seen(每张图的首次出现路径)和dupes(被再次出现、需要删掉的文件名清单)。把data/your_dataset换成你自己的目录即可,其余不用动。
如何导出干净帧(复用 copy_images_list)
这段在做什么:接着第一段(同一会话里),把不在重复名单里的图复制成一套从frame_00001起连续编号的干净数据集,num_downscales=0表示不缩放、按原图落盘。
from pathlib import Path from nerfstudio.process_data.process_data_utils import list_images, copy_images_list dup_names = {n for (n, f) in dupes} keep = [p for p in list_images(Path("data/your_dataset")) if p.name not in dup_names] copy_images_list(keep, Path("data/your_dataset_clean"), num_downscales=0) print("干净数据集已写出", len(keep), "张")复用copy_images_list而不是自己写拷贝,是因为它会把图重命名成 nerfstudio 期望的frame_%05d形式,顺带处理 raw 转码,落盘后目录能直接接ns-process-data跑位姿。去重放在 COLMAP 之前做,等于让位姿解算只在有效帧上花算力,而不是在 20% 的重复帧上白跑。
避坑清单:RAW 帧、缩放帧、隐藏文件三处翻车点
这节列真实会翻车的点,照查能省半天。
- RAW 帧(.cr2)哈希不一致。raw 文件和它转出来的 jpg 字节完全不同,直接哈希会各算一次、互相认不出。
copy_images_list会用 rawpy 把 .cr2 转成 .jpg 再落盘,所以坚持"先转码、后哈希",同一张 raw 才不会和它的分身重名。 - 缩放后再比对会误杀。
num_downscales一大,低分辨率把相邻帧的细微差异抹平,本来不同的 20 帧可能被判成重复。比对一定用原分辨率,落盘时再决定要不要生成缩放版。 - 路径含隐藏文件被 glob 跳过。
list_images的匹配串是[!.]*,点开头的文件(macOS 的._IMG_0001.JPG资源叉、.DS_Store)会被直接略过。清单张数对不上原始文件数时,先查这里。 - 横竖混排。同一目录里竖拍横拍混着放,
copy_images_list的批量 ffmpeg 默认按同尺寸走,混排时自动切到逐帧慢速路径。去重报告要按实际张数对时间,别按"批量"估算。
收尾
- 先跑查重报告
- 删掉重复帧
- 用干净目录训练
数据从哪来、怎么转 nerfstudio 格式,见 自定义数据集文档。
【免费下载链接】nerfstudioA collaboration friendly studio for NeRFs项目地址: https://gitcode.com/GitHub_Trending/ne/nerfstudio
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考