feat(export): 改为按 clusters/ 目录导出,并重定位失效的软链
原来按 assignments.csv 导出,反映的是聚类当时的划分;而 clusters/ 目录会被人工 整理——挪动分错的图、把 cluster_03 改名成 grease。现在以整理后的目录为准。 - 扫描 clusters/ 下的子目录,目录名即类别名并原样保留(不再是数字编号) - 文件名用原图的名字,去掉 clusters/ 里的 NNNN_ 排序前缀 - 失效软链的重定位:读出链接目标,按其中的 data/ 段落到本机 --source-root 上; 再不行用文件名在源目录里兜底索引(惰性构建,用不到就不扫盘)。 从服务器拷回来的 clusters/ 软链全部指向 /home/deep/... 在本机失效,这是常态 - 解析不到的条目列出并中止,--skip-missing 可忽略 - manifest 记录类别、每张图的原始路径与被跳过的条目 在真实目录上验证:11,212 张、15 个类别,软链 100% 失效但全部重定位成功, 导出后抽查 200 张与原图逐字节一致。跨数据集的数字文件名(blue/113.bmp 与 pearlescent/113.bmp)会被重名检查拦下,--prefix-parent 可化解。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
9b31473b27
commit
f8654f447b
@@ -262,38 +262,34 @@ scatter:
|
||||
|
||||
### 按聚类结果导出数据集
|
||||
|
||||
人工核对完分组后,把结果落成一个可以直接使用的数据集目录:
|
||||
聚类产出的 `clusters/` 里是**软链**,方便人工翻看和调整——可以把图在子目录间挪动、
|
||||
删掉分错的、把 `cluster_03` 改名成 `grease`。整理完之后,以这个目录为准把**真实文件**
|
||||
复制出来,得到一个可以直接使用的数据集:
|
||||
|
||||
```bash
|
||||
uv run python scripts/export_clusters.py --work-dir runs/simclr_r18 # 先看计划加 --dry-run
|
||||
uv run python scripts/export_clusters.py --work-dir runs/simclr_r101 --prefix-parent
|
||||
# 先看计划加 --dry-run
|
||||
```
|
||||
|
||||
```
|
||||
data/film_r18_cluster_k4/ # <源目录名>_<骨架标签>_cluster_k<簇数>,自动推导
|
||||
├── 0/ # 簇 0 的图,文件名保持原样
|
||||
├── 1/
|
||||
├── 2/
|
||||
├── 3/
|
||||
└── manifest.json # 来源 run、特征配置、每张图的原始路径
|
||||
data/simclr_r101/ # 默认取 work_dir 的名字,--out 可完全指定
|
||||
├── grease/ # 子目录名沿用 clusters/ 里的(人工整理过的类别名)
|
||||
├── mosquito/
|
||||
├── normal/
|
||||
└── manifest.json # 每张图的原始路径与所属类别,便于追溯
|
||||
```
|
||||
|
||||
**复制真实文件**,不是软链,所以这个目录可以直接拷走或喂给别的工具。
|
||||
导出的是**真实文件**(不是软链),文件名用原图的名字、去掉 `clusters/` 里的 `0125_`
|
||||
排序前缀。加 `--prefix-parent` 会再拼上原父目录名(`反面纵黑点/abc.png` ->
|
||||
`反面纵黑点_abc.png`),既保住来源信息,也化解不同目录同名文件撞车。
|
||||
|
||||
默认保持原文件名。加 `--prefix-parent` 会把原父目录名拼到文件名前:
|
||||
> **从服务器拷回来的 `clusters/` 软链全都是坏的**(指向 `/home/deep/...`),不影响使用:
|
||||
> 脚本读出链接目标,按其中的 `data/` 段重新落到本机 `--source-root`(默认当前目录)上;
|
||||
> 万一还找不到,再用文件名在源目录里兜底索引一次。解析不到的条目会列出来并中止,
|
||||
> 确认要忽略就加 `--skip-missing`。
|
||||
|
||||
```bash
|
||||
uv run python scripts/export_clusters.py --work-dir runs/simclr_r18 --prefix-parent
|
||||
# back-mosquito-G0/5.14_677mmX316.10m_....png -> back-mosquito-G0_5.14_677mmX316.10m_....png
|
||||
```
|
||||
|
||||
导出后目录只剩簇号,原来的来源信息就没了——加前缀能留住它,人工核对时一眼看出
|
||||
某张图原本在哪个目录;顺带也化解不同子目录同名文件在同一个簇里撞车的情况
|
||||
(撞车时的报错也会提示可以试试这个开关)。
|
||||
目录名可用 `--tag r18ss` 换标签、`--out` 完全指定。几个保护:源文件缺失、
|
||||
同簇内出现重名(保持原名会互相覆盖)都会直接报错;目标目录非空时必须显式 `--overwrite`。
|
||||
|
||||
> 标签只反映骨架,不区分 pretrained 与 simclr——同一骨架的两种跑法会推出同名目录,
|
||||
> 需要并存时用 `--tag` 手动区分。无论目录叫什么,`manifest.json` 都记着这批图来自哪次 run。
|
||||
几个保护:同类别内重名(保持原名会互相覆盖)直接报错并提示可用 `--prefix-parent`;
|
||||
目标目录非空时必须显式 `--overwrite`。
|
||||
|
||||
### 自监督预训练(SimCLR)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user