当前阶段只做“真实数据的统一索引层设计”,暂时不接训练器。
目标是:
if dataset_name == ... 的路径解析逻辑。当前新增了 lib/data,结构如下:
records.py
SegSampleRecordutils.py
indexers.py
builder.py
splits.py
datasets.py
loaders.py
Dataset 和 DataLoader统一样本记录包含:
dataset_nameimage_pathmask_pathsplitsample_idclass_namemeta这意味着后面不管数据来自乳腺、甲状腺还是其他超声任务,训练器看到的都将是统一格式。
适用:
BUS-UCLMTG3KOTU_2d规则:
适用:
TN3K规则:
trainval-imagetrainval-masktest-imagetest-mask适用:
BUSI规则:
_mask、_mask_1 这类后缀匹配meta.mask_count 中保留掩膜数量当前优先支持已有官方划分的数据集,并且已经实际验证过 Dataset + DataLoader 可正常读取:
支持:
train.txtval.txt说明:
train.txt -> 1000 条val.txt -> 469 条支持:
tn3k-trainval.jsontn3k-trainval-fold3.jsontn3k-trainval-fold4.json说明:
trainval 图像先进入统一索引json 中的 train / val 索引过滤test-image / test-mask 直接作为 testtrain -> 2303 条val -> 576 条image list 与 mask list支持:
tg3k-trainval.json说明:
train / valtest 为空时,不强行虚构测试集train -> 3226 条val -> 359 条BUS-UCLMTG3KTN3KOTU_2dBUSIBUS-BRABUS_UCCCAUIDDTI采用“分层成对目录”解析:
All/images 对 All/masksBenign/images 对 Benign/masksMalignant/images 对 Malignant/masks其中:
class_name 会记录 all、benign、malignantAll 当前保留为单独一组记录,不在索引层里自动去重采用标准成对目录解析:
US imagesExpert mask images目录名有空格,但对当前索引层没有影响。
当前采用“图像 + XML 标注路径”索引方式:
*.jpg*.xmlxml 文件名匹配当前这一层只完成:
xml 标注路径关联更新说明:
lib/data/ddti.pyxml 中解析自由手绘轮廓样本编号_图像序号.jpg -> xml 中 image=图像序号 的规则生成二值掩膜也就是说,DDTI 现在已经具备“可从标注动态生成掩膜”的能力,并且已经并入通用读取型 Dataset。
补充说明:
DDTI 当前没有发现现成的官方 train.txt / val.txtxml -> polygon 解析polygon -> 二值 mask 动态生成DataLoader 批读取验证480对于当前 data 目录中没有现成官方 train.txt / val.txt 的数据集,已经补充了统一的项目级划分机制。
BUSIBUS-BRABUS_UCCCAUIDDTI默认会在对应数据集根目录下生成:
splits/project/train.txtsplits/project/val.txt默认策略:
val_ratio = 0.2seed = 42class_name,默认按类别分层抽样BUSI
train = 624val = 156BUS-BRA
train = 1500val = 375BUS_UC
train = 649val = 162All 子集生成与读取,避免与 Benign / Malignant 重复CCAUI
train = 880val = 220DDTI
train = 384val = 96先生成:
python tmp/generate_project_split.py --dataset BUSI --root data/BUSI
python tmp/generate_project_split.py --dataset BUS-BRA --root data/BUS-BRA
python tmp/generate_project_split.py --dataset BUS_UC --root data/BUS_UC
python tmp/generate_project_split.py --dataset CCAUI --root data/CCAUI
python tmp/generate_project_split.py --dataset DDTI --root data/DDTI
再读取:
python tmp/inspect_dataloader.py --dataset BUSI --root data/BUSI --split train
python tmp/inspect_dataloader.py --dataset BUS-BRA --root data/BUS-BRA --split val
python tmp/inspect_dataloader.py --dataset BUS_UC --root data/BUS_UC --split train
python tmp/inspect_dataloader.py --dataset CCAUI --root data/CCAUI --split train
python tmp/inspect_dataloader.py --dataset DDTI --root data/DDTI --split val
在已有 train 基底上,当前已经支持继续生成:
labeled.txtunlabeled.txt并支持多种标注比例,例如:
0.050.10.2生成结果默认写入:
数据集根目录/
splits/
project/
train.txt
val.txt
semi_supervised/
train/
seed_42/
ratio_0p05/
labeled.txt
unlabeled.txt
ratio_0p1/
labeled.txt
unlabeled.txt
ratio_0p2/
labeled.txt
unlabeled.txt
基于 train = 624:
0.05 -> labeled = 31, unlabeled = 5930.1 -> labeled = 63, unlabeled = 5610.2 -> labeled = 125, unlabeled = 499基于 train = 649:
0.05 -> labeled = 32, unlabeled = 6170.1 -> labeled = 65, unlabeled = 5840.2 -> labeled = 130, unlabeled = 519基于 train = 384:
0.05 -> labeled = 19, unlabeled = 3650.1 -> labeled = 38, unlabeled = 3460.2 -> labeled = 77, unlabeled = 307python tmp/generate_project_split.py --dataset BUSI --root data/BUSI --labeled-ratios 0.05,0.1,0.2
python tmp/generate_project_split.py --dataset BUS_UC --root data/BUS_UC --labeled-ratios 0.05,0.1,0.2
python tmp/generate_project_split.py --dataset DDTI --root data/DDTI --labeled-ratios 0.05,0.1,0.2
python tmp/inspect_dataloader.py --dataset BUSI --root data/BUSI --split labeled --labeled-ratio 0.1
python tmp/inspect_dataloader.py --dataset BUS_UC --root data/BUS_UC --split unlabeled --labeled-ratio 0.2
python tmp/inspect_dataloader.py --dataset DDTI --root data/DDTI --split labeled --labeled-ratio 0.05
labeled / unlabeled 当前默认都从 train 基底继续切分class_name,默认继续按类别分层抽样BUS_UC 仍然只基于 All 子集进行半监督划分,避免重复样本因为当前最重要的是把“数据集结构差异”收敛掉。
如果现在直接在训练器里接,会导致:
增加了:
tmp/inspect_dataset_index.pytmp/generate_project_split.py可用来快速检查索引结果,例如:
python tmp/inspect_dataset_index.py --dataset BUS-UCLM --root data/BUS-UCLM
python tmp/inspect_dataset_index.py --dataset TN3K --root data/TN3K
python tmp/inspect_dataset_index.py --dataset TG3K --root data/TG3K
python tmp/inspect_dataset_index.py --dataset BUSI --root data/BUSI
python tmp/inspect_dataset_index.py --dataset BUS_UC --root data/BUS_UC
python tmp/inspect_dataset_index.py --dataset CCAUI --root data/CCAUI
python tmp/inspect_dataset_index.py --dataset DDTI --root data/DDTI
python tmp/inspect_ddti_mask.py --image data/DDTI/106_3.jpg --xml data/DDTI/106.xml --save tmp/ddti_106_3_mask.png
python tmp/inspect_dataloader.py --dataset OTU_2d --root data/OTU_2d --split train
python tmp/inspect_dataloader.py --dataset OTU_2d --root data/OTU_2d --split val
python tmp/inspect_dataloader.py --dataset TN3K --root data/TN3K --split train
python tmp/inspect_dataloader.py --dataset TN3K --root data/TN3K --split val
python tmp/inspect_dataloader.py --dataset TG3K --root data/TG3K --split train
python tmp/inspect_dataloader.py --dataset TG3K --root data/TG3K --split val
python tmp/inspect_dataloader.py --dataset DDTI --root data/DDTI
python tmp/generate_project_split.py --dataset BUSI --root data/BUSI
python tmp/generate_project_split.py --dataset BUS-BRA --root data/BUS-BRA
python tmp/generate_project_split.py --dataset BUS_UC --root data/BUS_UC
python tmp/generate_project_split.py --dataset CCAUI --root data/CCAUI
python tmp/generate_project_split.py --dataset DDTI --root data/DDTI
python tmp/generate_project_split.py --dataset BUSI --root data/BUSI --labeled-ratios 0.05,0.1,0.2
python tmp/inspect_dataloader.py --dataset BUSI --root data/BUSI --split labeled --labeled-ratio 0.1
在数据加载器分层已经确定后,下一步再做:
dataset_name / split / split_file / image_size / batch_collate_strategySegSampleRecord 和读取型 Dataset 接入训练器labeled_ratio / semi_seed / semi_base_splitDDTI 生成后的掩膜缓存到磁盘还是运行时动态生成