| # Typical Marine Ecological Environment Feature Recognition |
|
|
| This project is being refactored from a single green-tide detector into a |
| registry-driven framework for typical marine ecological environment feature |
| recognition. |
|
|
| The goal is not a closed multiclass model. Each element, satellite, sensor, |
| resolution, and fused-product policy can be expressed as a small Markdown |
| capability card, then composed into a task profile for training or inference. |
| This keeps the system extensible for green tide, red tide, golden tide, |
| aquaculture, ships, oil spill, sea ice, and future targets. |
|
|
| ## Core Constraint |
|
|
| Do not assume coastline vectors, land-mask vectors, or external GIS masks are |
| available. Land, black borders, no-data areas, water background, cloud, and other |
| hard negatives must be handled by labels, validity/context heads, hard-negative |
| samples, or image-derived validity rules. |
|
|
| ## Markdown Capability Registry |
|
|
| Cards live under [docs/registry](docs/registry): |
|
|
| - `elements/`: target feature or object cards. |
| - `satellites/`: satellite/platform cards. |
| - `sensors/`: sensor, product, and fusion cards. |
| - `resolutions/`: spatial-resolution policy cards. |
|
|
| Example for an already fused GF6 product: |
|
|
| ```powershell |
| python scripts/compose_task_profile.py ` |
| --element green_tide ` |
| --satellite GF6 ` |
| --sensor PMS ` |
| --fusion FUSED_OPTICAL ` |
| --resolution 2m ` |
| --output configs/profiles/gf6_green_tide_fused_2m.json |
| ``` |
|
|
| Example for GF2/GF1-style PAN+MSS imagery where fusion should happen tile by |
| tile during inference: |
|
|
| ```powershell |
| python scripts/compose_task_profile.py ` |
| --element green_tide ` |
| --satellite GF2 ` |
| --sensor PMS ` |
| --fusion STREAM_FUSION ` |
| --resolution 2m ` |
| --output configs/profiles/gf2_green_tide_stream_fusion_2m.json |
| ``` |
|
|
| ## Fused Image Expression |
|
|
| Fused imagery is represented as a derived observation, not as a plain |
| multispectral raster and not as `is_fused=true`. |
|
|
| Every sample that uses a fused raster or runtime fusion should keep a `fusion` |
| object in the manifest: |
|
|
| - `state`: `none`, `fused_product`, `runtime_fusion`, or `unknown`. |
| - `method`: vendor method, implemented method, or `unknown_vendor_product`. |
| - `sources`: PAN/MSS/source product roles, paths, and native resolutions. |
| - `target_resolution_m`: output grid resolution. |
| - `native_multispectral_resolution_m`: original multispectral resolution. |
| - `persisted`: whether the fused raster exists on disk. |
| - `reproducible`: whether source data and method can reproduce it. |
| - `spectral_preservation`: known or estimated spectral preservation risk. |
|
|
| This is important because a GF6 fused image, a GF2 tile-wise fusion stream, and a |
| native multispectral image should not be treated as identical observations. |
|
|
| ## Dataset Standard |
|
|
| The normalized dataset is manifest-driven and may retain different patch sizes, |
| satellites, sensors, resolutions, and fusion states. |
|
|
| See [docs/dataset_standard.md](docs/dataset_standard.md). |
|
|
| For the SAMPoly-style polygon head, the dataset gate is stricter: only real |
| mask or polygon annotations enter the main polygon training set. Bbox-only |
| labels are rejected because rectangles cannot supervise true boundaries, |
| vertices, or polygon ordering. The polygon-ready layout is: |
|
|
| ```text |
| images/{train,val,test} |
| masks/{train,val,test} |
| manifests/accepted_polygon_samples.jsonl |
| manifests/rejected_polygon_samples.jsonl |
| dataset_card.json |
| ``` |
|
|
| ## Key Scripts |
|
|
| - `scripts/build_marine_feature_dataset.py`: scan local or server-side data roots |
| and write normalized manifests. |
| - `scripts/search_hf_marine_datasets.py`: search Hugging Face datasets and write |
| normalized `hf://` manifest references without downloading full repositories. |
| - `scripts/prepare_polygon_dataset.py`: build the strict mask/polygon dataset |
| for SAMPoly-style training and reject bbox-only samples. |
| - `scripts/compose_task_profile.py`: compose Markdown capability cards into a |
| JSON task profile. |
| - `scripts/infer_whole_scene.py`: sliding-window whole-scene inference with |
| overlap weighting and optional PAN+MSS runtime fusion. |
| - `scripts/postprocess_mask.py`: temporary cleanup utility for obvious invalid |
| areas; it is not a substitute for the final context/validity model heads. |
|
|
| ## Model Direction |
|
|
| The target architecture is a unified, explainable, multi-task model: |
|
|
| - shared DINOv3-style visual encoder; |
| - clear FPN/PAN multi-scale neck; |
| - validity head for invalid/no-data areas; |
| - scene-context head for water, land, cloud/shadow, and other; |
| - element-specific semantic, instance, detection, polygon, or change heads |
| selected by Markdown task profiles. |
|
|
| Current legacy green-tide weights can still be loaded for candidate generation, |
| but final products should come from the registry-driven multi-task framework. |
|
|
| No bbox-only accepted dataset is retained. New training samples should be |
| imported only when they provide mask or polygon annotations suitable for the |
| SAMPoly-style head. |
|
|