Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 47 additions & 0 deletions .github/workflows/showcase.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
name: Showcase checks

on:
push:
branches: [main]
pull_request:

permissions:
contents: read

jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Verify showcase contents and links
shell: bash
run: |
python3 - <<'PYCODE'
import json, re, subprocess
from pathlib import Path
allowed = {"README.md", ".gitignore", ".github/workflows/showcase.yml", "docs/SUBMISSION.md", "docs/RESULTS.md", "docs/DEMO.md", "docs/results.json", "assets/prototype.jpg"}
tracked = set(subprocess.check_output(["git", "ls-files"], text=True).splitlines())
assert tracked == allowed, f"Unexpected or missing files: {tracked ^ allowed}. Implementation files are not permitted."
for name in tracked:
assert Path(name).stat().st_size < 2_000_000, f"File too large: {name}"
for name in sorted(tracked):
if not name.endswith(".md"):
continue
for target in re.findall(r"!?\[[^\]]*\]\(([^)]+)\)", Path(name).read_text()):
if target.startswith("https://") or target.startswith("#"):
continue
assert (Path(name).parent / target.split("#")[0]).exists(), f"Broken link in {name}: {target}"
d = json.loads(Path("docs/results.json").read_text())
result_doc = Path("docs/RESULTS.md").read_text()
for record in d["matched_2023_24"].values():
if isinstance(record, dict):
assert record["simultaneously_supported_depths"] <= record["point_wins"] <= record["shared_depths"]
for key in ("oceanvision_rmse_c", "reference_rmse_c"):
assert f'{record[key]:.4f}' in result_doc
assert not d["claims"]["universal_sota"] and not d["claims"]["future_all_depth_guarantee"]
assert d["claims"]["original_2026_confirmation"] == "withdrawn"
for url in d["links"].values():
assert url in Path("docs/SUBMISSION.md").read_text(), f"Missing submission link: {url}"
assert Path("assets/prototype.jpg").read_bytes().startswith(b"\xff\xd8\xff")
print("PASS: showcase-only allowlist, documentation links, result labels and preview image")
PYCODE
18 changes: 18 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Only curated showcase files belong in this repository.
/*
!/README.md
!/.gitignore
!/docs/
!/assets/
!/.github/
/docs/*
!/docs/SUBMISSION.md
!/docs/RESULTS.md
!/docs/DEMO.md
!/docs/results.json
/assets/*
!/assets/prototype.jpg
/.github/*
!/.github/workflows/
/.github/workflows/*
!/.github/workflows/showcase.yml
42 changes: 41 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,42 @@
# OceanVision
OceanVision: daily North Indian Ocean subsurface temperature from satellite surface fields. SIH 2026 · Team ZenTechs · PS 26066.

**See beneath the ocean surface.**

OceanVision reconstructs daily subsurface temperature across the North Indian Ocean from surface satellite observations. Built by **Team ZenTechs** for Smart India Hackathon 2026, **PS SIH26066**, Ministry of Earth Sciences / INCOIS. Team ID: **130957**.

[Explore the prototype](https://oceanembed-prototype.vercel.app/) · [Watch the pitch](https://youtu.be/BSgT3coOmeM) · [Submission brief](docs/SUBMISSION.md)

![OceanVision prototype, North Indian Ocean temperature map](assets/prototype.jpg)

## The result

On the repaired 2023–24 delayed-mode Argo benchmark, OceanVision achieves **0.6778°C** mean-depth RMSE versus INCOIS **0.8554°C**.

| What improved | Measured result |
|---|---|
| Mean-depth RMSE | **20.8% lower** than INCOIS |
| Shared depth point wins | **14 / 14** |
| Depths with simultaneous uncertainty support | **10 / 14** |
| Evaluation sample | **96 floats · 69,183 support-verified rows** |

A point win is a lower measured RMSE, not a guarantee at every depth on future data. [Full results and validation scope](docs/RESULTS.md).

## What you can explore

- Daily temperature maps on a 0.25° grid across **5–30°N, 45–105°E**.
- Point profiles at **15 depths, from 0 to 1000 m**.
- A 3D water column and the learned ocean representation.
- Validation results and the recorded pitch.

The current prototype archive spans **1993-01-01 to 2025-12-31**. These are reconstructions of archived observations, not future forecasts. [Use the prototype](docs/DEMO.md).

## Submission resources

| Resource | Link |
|---|---|
| Live prototype | [oceanembed-prototype.vercel.app](https://oceanembed-prototype.vercel.app/) |
| Pitch video | [Team ZenTechs pitch](https://youtu.be/BSgT3coOmeM) |
| Submission brief | [docs/SUBMISSION.md](docs/SUBMISSION.md) |
| Validation summary | [docs/RESULTS.md](docs/RESULTS.md) |

This repository contains the project showcase and submission material. The implementation, training recipes, model artifacts, datasets and full application source are kept separately. For project enquiries, contact [the repository owner](https://github.com/devanshranjan10).
Binary file added assets/prototype.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
12 changes: 12 additions & 0 deletions docs/DEMO.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# Explore OceanVision

Open [the live prototype](https://oceanembed-prototype.vercel.app/). You do not need to install the private model or download ocean datasets.

1. Choose a date within the available archive.
2. Select a depth to inspect its temperature map.
3. Select an ocean point to view the complete temperature profile and 3D water column.
4. Open Validation to inspect benchmark scores and their uncertainty labels.

The first reconstruction for a date can take longer than later requests. The interface reports loading and model availability. Archive reconstruction does not imply a forecast for dates beyond the available data.

For a guided presentation, [watch the pitch](https://youtu.be/BSgT3coOmeM).
43 changes: 43 additions & 0 deletions docs/RESULTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# Validation results

All temperature errors below are in degrees Celsius. Mean-depth RMSE is the arithmetic mean of the per-depth RMSEs, rather than a pooled error across all rows.

## Repaired matched evaluation

**2023–24 delayed-mode Argo · 96 floats · 69,183 support-verified rows**

| Comparator | OceanVision | Reference | Point wins | Simultaneously supported depths |
|---|---:|---:|---:|---:|
| INCOIS | **0.6778** | **0.8554** | **14/14** | **10/14** |
| GLORYS12, physically aligned | 0.6885 | 0.7009 | 8/14 | 3/14 |

Each comparator uses its own eligible matched observations, so the two OceanVision values are not interchangeable. INCOIS starts at 5 m; its 14-depth comparison does not validate the 0 m output.

The INCOIS mean-depth RMSE reduction is **20.8%**. Four of the 14 point wins do not have simultaneous uncertainty support. The inspected development benchmark is not an untouched future evaluation.

## Independent Argo validation

| Separate development lineage | Score |
|---|---:|
| Independent Argo monitor | **0.7271** |
| GLORYS validation, different target | **0.6262** |

This lineage uses GLORYS-only training, model selection and early stopping. Argo is a monitoring dataset in this audit. The deployed model is a separate lineage that uses earlier Argo observations for calibration and selection. Both use surface inputs at inference.

The two numbers in this table answer different validation questions. They cannot be used to claim a paired win against GLORYS12.

## Historical evaluation

| Window and protocol | OceanVision | GLORYS12 | Point wins |
|---|---:|---:|---:|
| Jul–Dec 2025 delayed-mode, earlier protocol | 0.5547 | 0.5927 | 12/15 |

This result predates the final observation-pipeline repairs. It is retained as historical evidence and does not independently confirm the final repaired model.

The frozen-representation evaluation reports **R² 0.4749**, versus **0.4272** for equal-width PCA. This is a representation metric, separate from temperature RMSE.

## Interpretation

The repaired INCOIS comparison supports lower measured RMSE at all 14 shared depths, with simultaneous support at 10. The GLORYS12 result has an aggregate advantage but does not establish an all-depth win. The original 2026 confirmation claim was withdrawn after an observation and artifact audit. No replacement untouched future test is claimed.

Published numerical records are summarized in [results.json](results.json). The values were carried forward from the audited project release; this repository creation is not a new scoring run. The live [validation page](https://oceanembed-prototype.vercel.app/#/validation) provides the public result tables.
36 changes: 36 additions & 0 deletions docs/SUBMISSION.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# OceanVision submission brief

**Team ZenTechs · Team ID 130957 · SIH 2026 · PS SIH26066 · Ministry of Earth Sciences / INCOIS**

| Resource | Link |
|---|---|
| Prototype | https://oceanembed-prototype.vercel.app/ |
| Pitch video | https://youtu.be/BSgT3coOmeM |
| Project showcase | https://github.com/devanshranjan10/OceanVision |
| Validation results | https://oceanembed-prototype.vercel.app/#/validation |

## Problem

Surface satellite observations cover the ocean much more densely than subsurface measurements. OceanVision uses surface observations to reconstruct the temperature column, giving users a daily spatial view of subsurface conditions.

## Delivered prototype

| Item | Delivered |
|---|---|
| Region | North Indian Ocean, 5–30°N and 45–105°E |
| Grid | Daily, 0.25°, 101 × 241 cells |
| Output depths | 0, 5, 10, 20, 30, 50, 75, 100, 125, 150, 200, 300, 500, 700, 1000 m |
| User outputs | Temperature maps, point profiles, a 3D column and an ocean representation |
| Available archive | 1993-01-01 through 2025-12-31 |

## Validated performance

On the repaired 2023–24 delayed-mode Argo benchmark, OceanVision scores **0.6778°C** mean-depth RMSE versus **INCOIS 0.8554°C**. The difference is **20.8%**, with lower point-estimate RMSE at **14/14 shared depths** and simultaneous uncertainty support at **10/14**. The benchmark has **96 floats and 69,183 support-verified rows**.

The physically aligned GLORYS12 comparison uses a separate matched sample: **OceanVision 0.6885°C versus GLORYS12 0.7009°C**, with 8/14 point wins and 3/14 simultaneously supported depths.

The independent Argo monitor for the separate GLORYS-only development lineage scores **0.7271°C**. That lineage's GLORYS validation score, **0.6262°C**, uses a different target and is not a paired comparator result.

[RESULTS.md](RESULTS.md) records historical scores and the validation boundaries. The deployed model uses earlier Argo observations for calibration and selection, while using surface inputs at inference. The 2023–24 benchmark was inspected during development. These results do not establish universal regional SOTA or future all-depth superiority.

This submission showcase does not distribute implementation details, reproducible training recipes, checkpoints or datasets.
54 changes: 54 additions & 0 deletions docs/results.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
{
"project": "OceanVision",
"team": "ZenTechs",
"team_id": 130957,
"problem_statement": "SIH26066",
"updated": "2026-09-27",
"scope": "Published validation summary; not a fresh scoring run or implementation specification",
"links": {
"prototype": "https://oceanembed-prototype.vercel.app/",
"pitch": "https://youtu.be/BSgT3coOmeM",
"repository": "https://github.com/devanshranjan10/OceanVision"
},
"matched_2023_24": {
"mode": "delayed",
"floats": 96,
"support_verified_rows": 69183,
"incois": {
"oceanvision_rmse_c": 0.6778,
"reference_rmse_c": 0.8554,
"point_wins": 14,
"shared_depths": 14,
"simultaneously_supported_depths": 10
},
"glorys12": {
"oceanvision_rmse_c": 0.6885,
"reference_rmse_c": 0.7009,
"point_wins": 8,
"shared_depths": 14,
"simultaneously_supported_depths": 3
}
},
"independent_argo": {
"rmse_c": 0.7271,
"lineage": "separate GLORYS-only development model",
"glorys_validation_rmse_c": 0.6262,
"comparison": "different targets; not paired"
},
"historical_2025": {
"oceanvision_rmse_c": 0.5547,
"glorys12_rmse_c": 0.5927,
"point_wins": 12,
"depths": 15,
"status": "Earlier protocol, before final pipeline repairs"
},
"representation": {
"r2": 0.4749,
"pca_r2": 0.4272
},
"claims": {
"universal_sota": false,
"future_all_depth_guarantee": false,
"original_2026_confirmation": "withdrawn"
}
}
Loading