--- tags: - seismic - first-break-picking - segmentation - pytorch library_name: pytorch --- # First-Break Picking HF Release This directory is a compact release package for first-break-picking model weights. It keeps only the best checkpoint and the exact training config for each run. ## Contents - 60 `best.pt` checkpoint files. - 60 `config.yaml` files. - No intermediate `epoch_*.pt` checkpoints. - Current package size: about 4.1 GB. Two experiment groups are included: | Directory | Meaning | Runs | | --- | --- | ---: | | `first_break_picking/` | Models trained on all available first-break SEG-Y pairs together | 12 | | `first_break_picking_single_dataset_grouped/by_dataset/` | Models trained separately on each individual SEG-Y pair | 48 | ## Directory Layout ```text first_break_picking_hf_release/ README.md first_break_picking/ first_break_pick__geomseg_seed/ config.yaml checkpoints/ best.pt first_break_picking_single_dataset_grouped/ by_dataset/ / / seed/ config.yaml checkpoints/ best.pt ``` The multi-dataset runs use: ```text models: unet, res_unet, atten_unet, dncnn_seg seeds: 42, 43, 44 ``` The single-dataset runs use: ```text datasets: brunswick_valid, dongbei, halfmile_valid, lalor_valid models: unet, res_unet, atten_unet, dncnn_seg seeds: 42, 43, 44 ``` ## Task Definition The benchmark treats first-break picking as binary step-mask segmentation. - Input: single-channel SEG-Y amplitude patches. - Label: binary step mask, with 0 before the first break and 1 from the first-break sample onward. - Prediction: single-channel logits with the same spatial shape as the mask. - Pick extraction: the first time index where `sigmoid(logit) >= 0.5`. ## Dataset Configuration All configs point to: ```text data.root: /home/dataset-local/dataset/first_break_picking/segy_with_masks data.data_dir: data data.label_dir: label ``` The available SEG-Y input files are: ```text Brunswick_valid.sgy Dongbei.segy Halfmile_valid.sgy Lalor_valid.sgy ``` For multi-dataset runs, `data.files: null`, so all SEG-Y pairs under `data/` are used. For single-dataset runs, `data.files` contains exactly one input SEG-Y filename. Common data parameters: | Parameter | Value | | --- | --- | | `label_threshold` | `0.5` | | `prediction_threshold` | `0.5` | | `validate_labels` | `true` | | `label_check_traces` | `2048` | | `max_patches_per_split` | `null` | | `split.train` | `0.8` | | `split.val` | `0.1` | | `split.test` | `0.1` | | `split.shuffle_ffids` | `true` | Gather segmentation parameters: | Parameter | Value | | --- | --- | | `gather_segment.enabled` | `true` | | `gather_segment.line_id_header` | `INLINE_3D` | | `gather_segment.infer_line_from_geometry` | `true` | | `gather_segment.distance_floor` | `1000.0` | | `gather_segment.median_multiplier` | `5.0` | Patch and loader parameters: | Parameter | Multi-dataset | Single-dataset | | --- | ---: | ---: | | `patch.trace` | `128` | `128` | | `patch.time` | `512` | `512` | | `patch.trace_stride` | `64` | `64` | | `patch.time_stride` | `256` | `256` | | `loader.batch_size` | `64` | `64` | | `loader.num_workers` | `4` | `1` | | `loader.pin_memory` | `true` | `true` | ## Preprocessing | Parameter | Value | | --- | --- | | `normalize_mode` | `max_abs` | | `normalize_scope` | `gather` | | `clip_percentile` | `99.5` | | `normalize_eps` | `1.0e-6` | Only input amplitudes are normalized. Labels remain binary segmentation targets; invalid or padded areas are ignored by the loss and metrics in the training code. ## Models | Model | Parameters | | --- | --- | | `unet` | `in_channels=1`, `out_channels=1`, `base_channels=32`, `depth=4` | | `res_unet` | `in_channels=1`, `out_channels=1`, `base_channels=32`, `depth=4` | | `atten_unet` | `in_channels=1`, `out_channels=1`, `base_channels=32`, `depth=4` | | `dncnn_seg` | `in_channels=1`, `out_channels=1`, `depth=17`, `base_channels=64`, `kernel_size=3` | ## Training Parameters | Parameter | Value | | --- | --- | | `train.epochs` | `20` | | `train.grad_clip` | `1.0` | | `train.log_interval` | `20` | | `train.eval_interval` | `1` | | `train.ckpt_interval` | `1` | | `train.vis_interval` | `1` | | `train.resume` | `null` | | `optimizer` | `adamw` | | `optimizer.lr` | `1.0e-4` | | `optimizer.weight_decay` | `1.0e-5` | | `scheduler` | `cosine` | | `scheduler.min_lr` | `1.0e-6` | Loss: ```text type: bce_dice bce_weight: 0.5 dice_weight: 0.5 smooth: 1.0 pos_weight: null ``` Metrics: ```text dice iou f1 HitRate1px HitRate3px HitRate5px HitRate7px HitRate9px MeanAbsoluteError RootMeanSquaredError MeanBiasError GatherCoverage ``` All metric thresholds are `0.5`. ## Loading A Checkpoint Use the matching `config.yaml` next to each `best.pt` to reconstruct the model and preprocessing settings. ```python import torch checkpoint_path = "first_break_picking/first_break_pick_unet_geomseg_seed42/checkpoints/best.pt" checkpoint = torch.load(checkpoint_path, map_location="cpu") print(checkpoint.keys()) ``` The `experiment.output_dir` values inside `config.yaml` are the original training output paths. They are preserved for reproducibility and do not need to match this release directory. ## Notes For Hugging Face Upload This folder is intended to be uploaded as a model-weight release package. The raw SEG-Y dataset should be uploaded separately because it is much larger and has a different structure: ```text segy_with_masks/ data/ label/ ``` For this release package, upload the entire `first_break_picking_hf_release/` directory so each `best.pt` remains next to its exact `config.yaml`. --- # 初至拾取 Hugging Face 发布包 该目录是初至拾取模型权重的精简发布包。每一次实验只保留最优模型 checkpoint 和对应的完整训练配置。 ## 内容概览 - 60 个 `best.pt` checkpoint 文件。 - 60 个 `config.yaml` 配置文件。 - 不包含中间训练轮次的 `epoch_*.pt` checkpoint。 - 当前发布包大小约 4.1 GB。 包含两类实验: | 目录 | 含义 | 运行数量 | | --- | --- | ---: | | `first_break_picking/` | 使用全部初至拾取 SEG-Y 数据联合训练的模型 | 12 | | `first_break_picking_single_dataset_grouped/by_dataset/` | 在单个 SEG-Y 数据集上分别训练的模型 | 48 | ## 目录结构 ```text first_break_picking_hf_release/ README.md first_break_picking/ first_break_pick__geomseg_seed/ config.yaml checkpoints/ best.pt first_break_picking_single_dataset_grouped/ by_dataset/ / / seed/ config.yaml checkpoints/ best.pt ``` 联合训练实验包含: ```text 模型: unet, res_unet, atten_unet, dncnn_seg 随机种子: 42, 43, 44 ``` 单数据集训练实验包含: ```text 数据集: brunswick_valid, dongbei, halfmile_valid, lalor_valid 模型: unet, res_unet, atten_unet, dncnn_seg 随机种子: 42, 43, 44 ``` ## 任务定义 该 benchmark 将初至拾取建模为二值 step-mask 分割任务。 - 输入:单通道 SEG-Y 振幅 patch。 - 标签:二值 step mask,初至之前为 0,从初至采样点开始为 1。 - 预测:与标签空间尺寸相同的单通道 logits。 - 拾取点提取:取 `sigmoid(logit) >= 0.5` 的第一个时间采样点作为初至位置。 ## 数据配置 所有配置文件都指向: ```text data.root: /home/dataset-local/dataset/first_break_picking/segy_with_masks data.data_dir: data data.label_dir: label ``` 可用的 SEG-Y 输入文件为: ```text Brunswick_valid.sgy Dongbei.segy Halfmile_valid.sgy Lalor_valid.sgy ``` 联合训练实验中,`data.files: null`,表示使用 `data/` 下所有 SEG-Y 数据对。单数据集实验中,`data.files` 只包含一个输入 SEG-Y 文件名。 通用数据参数: | 参数 | 取值 | | --- | --- | | `label_threshold` | `0.5` | | `prediction_threshold` | `0.5` | | `validate_labels` | `true` | | `label_check_traces` | `2048` | | `max_patches_per_split` | `null` | | `split.train` | `0.8` | | `split.val` | `0.1` | | `split.test` | `0.1` | | `split.shuffle_ffids` | `true` | 炮集与接收线切分参数: | 参数 | 取值 | | --- | --- | | `gather_segment.enabled` | `true` | | `gather_segment.line_id_header` | `INLINE_3D` | | `gather_segment.infer_line_from_geometry` | `true` | | `gather_segment.distance_floor` | `1000.0` | | `gather_segment.median_multiplier` | `5.0` | patch 与 DataLoader 参数: | 参数 | 联合训练 | 单数据集训练 | | --- | ---: | ---: | | `patch.trace` | `128` | `128` | | `patch.time` | `512` | `512` | | `patch.trace_stride` | `64` | `64` | | `patch.time_stride` | `256` | `256` | | `loader.batch_size` | `64` | `64` | | `loader.num_workers` | `4` | `1` | | `loader.pin_memory` | `true` | `true` | ## 预处理 | 参数 | 取值 | | --- | --- | | `normalize_mode` | `max_abs` | | `normalize_scope` | `gather` | | `clip_percentile` | `99.5` | | `normalize_eps` | `1.0e-6` | 只对输入振幅做归一化。标签保持二值分割目标;无效区域或 padding 区域在训练代码中会被 loss 和 metrics 忽略。 ## 模型 | 模型 | 参数 | | --- | --- | | `unet` | `in_channels=1`, `out_channels=1`, `base_channels=32`, `depth=4` | | `res_unet` | `in_channels=1`, `out_channels=1`, `base_channels=32`, `depth=4` | | `atten_unet` | `in_channels=1`, `out_channels=1`, `base_channels=32`, `depth=4` | | `dncnn_seg` | `in_channels=1`, `out_channels=1`, `depth=17`, `base_channels=64`, `kernel_size=3` | ## 训练参数 | 参数 | 取值 | | --- | --- | | `train.epochs` | `20` | | `train.grad_clip` | `1.0` | | `train.log_interval` | `20` | | `train.eval_interval` | `1` | | `train.ckpt_interval` | `1` | | `train.vis_interval` | `1` | | `train.resume` | `null` | | `optimizer` | `adamw` | | `optimizer.lr` | `1.0e-4` | | `optimizer.weight_decay` | `1.0e-5` | | `scheduler` | `cosine` | | `scheduler.min_lr` | `1.0e-6` | 损失函数: ```text type: bce_dice bce_weight: 0.5 dice_weight: 0.5 smooth: 1.0 pos_weight: null ``` 评价指标: ```text dice iou f1 HitRate1px HitRate3px HitRate5px HitRate7px HitRate9px MeanAbsoluteError RootMeanSquaredError MeanBiasError GatherCoverage ``` 所有指标阈值均为 `0.5`。 ## 加载 Checkpoint 使用每个 `best.pt` 旁边对应的 `config.yaml` 来重建模型和预处理设置。 ```python import torch checkpoint_path = "first_break_picking/first_break_pick_unet_geomseg_seed42/checkpoints/best.pt" checkpoint = torch.load(checkpoint_path, map_location="cpu") print(checkpoint.keys()) ``` `config.yaml` 中的 `experiment.output_dir` 是原始训练时的输出路径。这里保留这些路径是为了可复现性,不要求它们与当前发布目录一致。 ## Hugging Face 上传说明 该目录适合作为模型权重发布包上传。原始 SEG-Y 数据集体积更大,结构也不同,建议单独上传: ```text segy_with_masks/ data/ label/ ``` 上传当前权重发布包时,应上传整个 `first_break_picking_hf_release/` 目录,以保证每个 `best.pt` 都和对应的 `config.yaml` 保持在一起。