# Typical Marine Ecological Environment Feature Dataset Standard This project uses a manifest-driven dataset layout for marine ecological environment feature recognition. It is designed to keep different patch sizes, satellites, sensors, spatial resolutions, and fusion states instead of forcing everything into one fixed tile format. ## Scope Target feature families: - `green_tide`: Enteromorpha / green tide / seaweed. - `red_tide`: red tide / harmful algal bloom. - `golden_tide`: Sargassum / golden tide. - `aquaculture`: aquaculture area, rafts, cages, ponds, or related facilities. - `water`: valid water background. - `land`: land or non-water hard negative. - `invalid`: black border, no-data, saturated, missing, or otherwise unusable pixels. - `cloud_shadow`: cloud, haze, cloud shadow, or bright atmospheric interference. - `other`: valid but not assigned to the categories above. No external coastline, land-mask vector, or GIS mask is assumed to exist. Land, invalid area, and water/background handling must be represented by dataset labels, hard-negative samples, or image-derived validity rules. ## Canonical Directory Layout ```text data_marine_features/ manifests/ assets_raw.jsonl samples.jsonl splits/ train.txt val.txt test.txt images/ . # optional symlink or copied tile masks/ . # optional symlink or copied mask previews/ .png reports/ asset_inventory.csv ``` The canonical source of truth is `manifests/samples.jsonl`. Files may remain in their original locations; `images/` and `masks/` are optional conveniences. ## `samples.jsonl` Schema Each line is one image sample or tile. ```json { "sample_id": "gf6_20250604_green_tide_000001", "element": "green_tide", "task_type": "semantic_segmentation", "image_path": "D:/.../image.tif", "mask_path": "D:/.../mask.tif", "annotation_path": null, "annotation_format": "mask", "label_encoding": {"0": "background", "1": "green_tide"}, "satellite": "GF6", "sensor": "PMS", "resolution_m": 2.0, "patch_size": 256, "bands": ["blue", "green", "red", "nir"], "band_count": 4, "dtype": "uint16", "fusion": { "state": "fused_product", "method": "unknown_vendor_product", "sources": [ {"role": "MSS", "path": null, "resolution_m": 8.0}, {"role": "PAN", "path": null, "resolution_m": 2.0} ], "target_resolution_m": 2.0, "native_multispectral_resolution_m": 8.0, "persisted": true, "reproducible": false, "spectral_preservation": "unknown", "notes": "Fused image supplied as a finished raster; source PAN/MSS not guaranteed." }, "acquired_at": "2025-06-04", "source_project": "EntGreenTide", "source_dataset": "GF6_PMS_E121.1_N33.6_20250604_L1A1420584616", "split": "train", "quality_flags": ["valid_image"], "notes": "" } ``` Required fields: - `sample_id` - `element` - `task_type` - `image_path` - `satellite` - `sensor` - `patch_size` - `band_count` - `fusion` - `source_project` Recommended fields: - `mask_path` - `annotation_path` - `annotation_format` - `resolution_m` - `bands` - `dtype` - `acquired_at` - `split` - `quality_flags` ## Multi-Scale Policy Patch sizes such as 128, 256, 512, and full-scene windows are all valid. They are not merged destructively. Training code should sample them with metadata-aware transforms: - Keep `patch_size` in the manifest. - Resize only inside the training transform when the model requires it. - Preserve the original spatial resolution in `resolution_m`. - For full-scene inference, use sliding windows whose size is a runtime parameter. ## Multi-Sensor And Fusion Policy Different satellites and sensors are expected: - GF1, GF2, GF6, and other optical satellites can coexist. - Fused PMS/MUX products and raw PAN+MSS products can coexist. - If PAN+MSS are available, keep both paths in `fusion.sources`. - Do not assume band order from the filename alone; record `bands` when known. Fusion must be represented explicitly. A boolean such as `is_fused=true` is not enough because it loses the source products, method, target resolution, and reproducibility. Recommended `fusion` object for an already fused raster: ```json { "state": "fused_product", "method": "unknown_vendor_product", "sources": [ {"role": "MSS", "path": "D:/.../MSS2.tiff", "resolution_m": 8.0}, {"role": "PAN", "path": null, "resolution_m": 2.0} ], "target_resolution_m": 2.0, "native_multispectral_resolution_m": 8.0, "persisted": true, "reproducible": false, "spectral_preservation": "unknown", "notes": "Fused image supplied as a finished raster; original PAN is unavailable." } ``` Recommended `fusion` object for streaming PAN+MSS fusion: ```json { "state": "runtime_fusion", "method": "additive_component_substitution", "sources": [ {"role": "MSS", "path": "D:/.../MSS2.tiff", "resolution_m": 8.0}, {"role": "PAN", "path": "D:/.../PAN2.tiff", "resolution_m": 2.0} ], "target_resolution_m": 2.0, "native_multispectral_resolution_m": 8.0, "persisted": false, "reproducible": true, "tile_aligned": true, "notes": "Fusion is performed per inference tile and is not written as a full-scene raster." } ``` Allowed `fusion.state` values: - `none`: native product, no fusion. - `fused_product`: fused raster exists on disk. - `runtime_fusion`: fusion happens during training/inference. - `unknown`: insufficient information; do not pretend it is native. ## Label Policy The final model should not be binary seaweed/background. It should learn ecological elements and scene context. A recommended unified semantic target is: | Class ID | Name | | --- | --- | | 0 | other/background | | 1 | invalid | | 2 | water | | 3 | land | | 4 | cloud_shadow | | 5 | green_tide | | 6 | red_tide | | 7 | golden_tide | | 8 | aquaculture | When legacy binary masks are imported, they should be represented as task-specific labels plus metadata. Do not silently treat unlabeled pixels as true negatives for all other ecological elements. ## Quality Gate Policy Discovered samples are not automatically training samples. A sample may enter `accepted_samples.jsonl` only after an explicit adapter verifies: - the data source is relevant to marine or coastal remote sensing; - image and label assets are reliably paired; - label semantics map to a registry element card; - label format is parsed successfully, such as mask, polygon, GeoJSON, SHP, or RLE; - box-only labels are rejected from SAMPoly-style polygon training because they cannot supervise true vertices or boundaries; - unusable images, empty labels, unknown elements, and ambiguous licenses are rejected or kept for manual review; - quality flags record why the sample was accepted. Unknown or unpaired samples must not be treated as negative samples. ## Inventory Rules The inventory scanner should: - Preserve original file paths. - Infer element type from directory names and known project folders. - Infer satellite/sensor/acquisition date from filenames when possible. - Infer fusion state from filenames such as `fuse`, `PAN`, and `MSS`, but mark uncertain products as `unknown` instead of guessing method details. - Pair image and mask files by stem when masks exist. - Record unpaired full-scene images as inference assets. - Flag ambiguous data instead of guessing labels.