Mingze commited on
Commit
4fbb159
·
verified ·
1 Parent(s): e00e6a7

Redesign with high-resolution urban cases

Browse files
README.md CHANGED
@@ -50,17 +50,18 @@ Every run creates visual and machine-readable outputs:
50
  - Independent Gradio API endpoints at `/classify`, `/segment`, `/detect`, and `/analyze`.
51
  - A reusable Codex skill and command-line Space client.
52
 
53
- ## Guided case studies
54
 
55
- The interface includes three one-click NASA Earth Observatory cases. Each case loads the reference image and shows the acquisition context, recommended analytical question, and source attribution.
56
 
57
- | Case | Sensor / date | Suggested use |
58
  |---|---|---|
59
- | [Indus River irrigated agriculture](https://earthobservatory.nasa.gov/images/52076/seasonal-changes-along-the-indus-river) | Landsat 5 TM / 2009-09-10 | Compare crop and river scene alternatives with cropland/water pixel shares |
60
- | [Lluta River desert agriculture](https://earthobservatory.nasa.gov/images/82296/lluta-river-chile) | EO-1 ALI / 2012-07-19 | Inspect ambiguity where narrow irrigated valleys cross dominant bare land |
61
- | [Zambezi wet-season floodplain](https://earthobservatory.nasa.gov/images/80835/wet-season-transforms-the-zambezi-river) | EO-1 ALI / 2013-03-31 | Evaluate water, vegetation, and bare-land composition |
 
62
 
63
- These are method-exploration examples, not ground-truth demonstrations. The imagery remains credited to NASA Earth Observatory and the source instrument teams.
64
 
65
  ## How it works
66
 
 
50
  - Independent Gradio API endpoints at `/classify`, `/segment`, `/detect`, and `/analyze`.
51
  - A reusable Codex skill and command-line Space client.
52
 
53
+ ## Urban sample scenes
54
 
55
+ The interface includes four visible, one-click urban chips from the [UC Merced Land Use dataset](https://huggingface.co/datasets/blanchon/UC_Merced). Each is a 256×256 RGB aerial image at approximately 0.3 m spatial resolution, derived from USGS National Map Urban Area Imagery.
56
 
57
+ | Case | Urban features | Suggested use |
58
  |---|---|---|
59
+ | Dense residential | roofs, streets, impervious surfaces | Review residential LULC confidence and building/pavement segmentation |
60
+ | Urban intersection | road markings, pavement, small vehicles | Test road segmentation and the limits of small-object detection |
61
+ | Marina / harbor | water, docks, tightly spaced boats | Compare water cover with ship/harbor predictions |
62
+ | Parking lot | pavement and tightly packed vehicles | Probe pavement share and vehicle detection sensitivity |
63
 
64
+ These images are method-exploration examples, not ground-truth demonstrations. Their sub-meter aerial scale differs substantially from the EuroSAT classifier's Sentinel-2 training domain, so classification results should be interpreted as domain-shifted hypotheses.
65
 
66
  ## How it works
67
 
app.py CHANGED
@@ -66,26 +66,33 @@ OPEN_EARTH_MAP_LABELS = {
66
  8: "building",
67
  }
68
  CASE_STUDIES = {
69
- "indus": {
70
- "title": "Indus River · irrigated agriculture",
71
- "image": "https://eoimages.gsfc.nasa.gov/images/imagerecords/52000/52076/indus_tm5_20090910_lrg.jpg",
72
- "source": "https://earthobservatory.nasa.gov/images/52076/seasonal-changes-along-the-indus-river",
73
- "sensor": "Landsat 5 TM · natural color · 2009-09-10",
74
- "focus": "Compare scene-level crop/river alternatives with pixel-level cropland and water shares.",
75
  },
76
- "lluta": {
77
- "title": "Lluta River · desert agriculture",
78
- "image": "https://eoimages.gsfc.nasa.gov/images/imagerecords/82000/82296/Lluta_ali_2012201_lrg.jpg",
79
- "source": "https://earthobservatory.nasa.gov/images/82296/lluta-river-chile",
80
- "sensor": "EO-1 ALI · natural color · 2012-07-19",
81
- "focus": "Inspect classification ambiguity where narrow irrigated valleys cross dominant bare land.",
82
  },
83
- "zambezi": {
84
- "title": "Zambezi River · wet-season floodplain",
85
- "image": "https://eoimages.gsfc.nasa.gov/images/imagerecords/80000/80835/zambezi_ali_2013090_lrg.jpg",
86
- "source": "https://earthobservatory.nasa.gov/images/80835/wet-season-transforms-the-zambezi-river",
87
- "sensor": "EO-1 ALI · 2013-03-31",
88
- "focus": "Evaluate water, vegetation, and bare-land composition across a seasonal floodplain.",
 
 
 
 
 
 
 
89
  },
90
  }
91
 
@@ -139,8 +146,8 @@ def load_case_study(case_key: str):
139
  f"### {case['title']}\n"
140
  f"**Acquisition:** {case['sensor']} \n"
141
  f"**Suggested analysis:** {case['focus']} \n"
142
- f"[Open NASA Earth Observatory source]({case['source']}) · "
143
- "Reference imagery is provided for method exploration; model outputs are not ground truth."
144
  )
145
  return case["image"], note
146
 
@@ -374,14 +381,16 @@ def analyze_satellite_image(
374
 
375
 
376
  CSS = """
377
- .gradio-container {max-width: 1440px !important; background: #f6f8fb;}
378
- .hero {padding: 2rem; border-radius: 22px; color: white; background: linear-gradient(125deg,#071c33,#0a4b5c 56%,#198f75); box-shadow: 0 18px 44px rgba(7,28,51,.18); margin-bottom: 1rem;}
379
- .hero h1 {font-size: 2.35rem; margin: 0 0 .35rem; letter-spacing: -.03em;}
380
- .hero p {max-width: 850px; margin: .35rem 0; color: #d8f3ee;}
381
- .hero a {color: #fff; font-weight: 650;}
382
- .pipeline {display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin:14px 0 20px;}
383
- .pipeline div,.assessment-card,.metric-card {background:white;border:1px solid #dce6ed;border-radius:16px;padding:16px;box-shadow:0 6px 18px rgba(20,50,70,.06);}
384
- .pipeline b {display:block;color:#0c5262;margin-bottom:5px}.pipeline span,.micro-note {color:#667985;font-size:.87rem;}
 
 
385
  .summary-grid {display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin:12px 0;}
386
  .metric-card span,.eyebrow {display:block;color:#66808c;font-size:.72rem;font-weight:750;letter-spacing:.1em;text-transform:uppercase;}
387
  .metric-card strong {display:block;font-size:1.45rem;margin:6px 0;color:#113544;}.metric-card small {color:#60747e;}
@@ -389,41 +398,60 @@ CSS = """
389
  .prob-row {display:grid;grid-template-columns:155px 1fr 62px;gap:10px;align-items:center;margin:8px 0;font-size:.86rem;}
390
  .prob-row b {text-align:right}.prob-track {height:9px;background:#e5edf1;border-radius:20px;overflow:hidden}.prob-track i {display:block;height:100%;background:linear-gradient(90deg,#169c7d,#36b7c5);border-radius:20px;}
391
  .section-note {padding:12px 14px;border-left:4px solid #15947a;background:#eef9f6;border-radius:8px;color:#315c62;}
392
- .case-panel {padding:16px 18px;border:1px solid #dce6ed;border-radius:16px;background:#fff;margin:8px 0 14px}.case-panel h3{margin:0 0 4px;color:#123c49}.case-panel p{margin:0;color:#647984}
393
- @media(max-width:850px){.pipeline,.summary-grid{grid-template-columns:1fr}.prob-row{grid-template-columns:115px 1fr 56px}}
 
 
 
 
394
  """
395
 
396
 
397
  with gr.Blocks(title="Satellite Vision Toolkit Pro", css=CSS, theme=gr.themes.Soft()) as demo:
398
  gr.HTML("""
399
- <div class="hero">
400
- <div class="eyebrow" style="color:#8ee5d2">REMOTE SENSING DECISION SUPPORT</div>
401
- <h1>🛰️ Satellite Vision Toolkit Pro</h1>
402
- <p>A multi-level workbench for scene-level land-use/land-cover classification, pixel-level cover mapping, and overhead object detection.</p>
403
- <p><a href="https://github.com/LabMingzeChen/SatelliteVisionToolkit">GitHub</a> · <a href="https://huggingface.co/mrm8488/convnext-tiny-finetuned-eurosat">LULC model</a> · <a href="https://huggingface.co/mfaytin/mask2former-satellite">Segmentation model</a> · <a href="https://huggingface.co/bluelabel/satellite-equipment-detection-yolov8n-vhr10">Detection model</a></p>
404
- </div>
405
- <div class="pipeline">
406
  <div><b>01 · Scene classification</b><span>EuroSAT probability profile across 10 LULC scene types.</span></div>
407
  <div><b>02 · Semantic segmentation</b><span>Per-pixel OpenEarthMap land-cover composition and masks.</span></div>
408
  <div><b>03 · Object detection</b><span>Bounding boxes and inventory-style summaries for 10 VHR object types.</span></div>
409
  </div>
410
  """)
411
- gr.HTML("<div class='case-panel'><h3>Guided case studies</h3><p>Load a documented NASA scene, review the analytical question, then run the complete assessment or an individual model.</p></div>")
412
  with gr.Row():
413
- indus_case = gr.Button("🌾 Indus agriculture")
414
- lluta_case = gr.Button("🏜️ Lluta desert valley")
415
- zambezi_case = gr.Button("🌊 Zambezi floodplain")
416
- case_note = gr.Markdown("Select a case study to load its image and methodological prompt.")
 
 
 
 
 
 
 
 
 
 
 
 
 
417
  with gr.Row(equal_height=True):
418
- image_input = gr.Image(type="pil", label="Satellite / aerial RGB image", height=430)
419
- with gr.Column():
420
- gr.Markdown("### Analysis controls\nTune reproducible thresholds, then run the complete assessment or an individual method.")
421
- top_k = gr.Slider(3, 10, value=5, step=1, label="LULC alternatives (top-k)")
422
- opacity = gr.Slider(0.1, 0.9, value=0.55, step=0.05, label="Segmentation overlay opacity")
423
- min_share = gr.Slider(0.0, 5.0, value=0.1, step=0.1, label="Minimum reported cover share (%)")
424
- confidence = gr.Slider(0.05, 0.9, value=0.25, step=0.05, label="Detection confidence threshold")
425
- iou = gr.Slider(0.1, 0.9, value=0.45, step=0.05, label="Detection NMS IoU threshold")
426
  analyze_button = gr.Button("Run complete professional assessment", variant="primary", size="lg")
 
 
 
 
 
 
 
427
 
428
  with gr.Tabs():
429
  with gr.Tab("Executive overview"):
@@ -496,16 +524,20 @@ with gr.Blocks(title="Satellite Vision Toolkit Pro", css=CSS, theme=gr.themes.So
496
  **Interpretation guardrails:** EuroSAT is a European Sentinel-2 scene dataset; classification may shift on other sensors, regions, resolutions, or crops. Pixel shares are not automatically physical ground-area shares. Pixel-coordinate GeoJSON is not georeferenced. Models can miss small or obscured objects. Do not use outputs alone for legal, surveillance, emergency, navigation, or safety-critical decisions.
497
  """)
498
 
499
- indus_case.click(
500
- lambda: load_case_study("indus"),
 
 
 
 
501
  outputs=[image_input, case_note],
502
  )
503
- lluta_case.click(
504
- lambda: load_case_study("lluta"),
505
  outputs=[image_input, case_note],
506
  )
507
- zambezi_case.click(
508
- lambda: load_case_study("zambezi"),
509
  outputs=[image_input, case_note],
510
  )
511
 
 
66
  8: "building",
67
  }
68
  CASE_STUDIES = {
69
+ "residential": {
70
+ "title": "Dense residential block",
71
+ "image": "assets/cases/dense_residential.jpg",
72
+ "source": "https://huggingface.co/datasets/blanchon/UC_Merced",
73
+ "sensor": "USGS Urban Area Imagery · RGB · 0.3 m · 256×256 px",
74
+ "focus": "Inspect buildings, impervious surfaces, street texture, and residential scene confidence.",
75
  },
76
+ "intersection": {
77
+ "title": "Urban intersection",
78
+ "image": "assets/cases/urban_intersection.jpg",
79
+ "source": "https://huggingface.co/datasets/blanchon/UC_Merced",
80
+ "sensor": "USGS Urban Area Imagery · RGB · 0.3 m · 256×256 px",
81
+ "focus": "Test road/pavement segmentation and small-vehicle sensitivity at a city junction.",
82
  },
83
+ "harbor": {
84
+ "title": "Urban marina / harbor",
85
+ "image": "assets/cases/harbor_marina.jpg",
86
+ "source": "https://huggingface.co/datasets/blanchon/UC_Merced",
87
+ "sensor": "USGS Urban Area Imagery · RGB · 0.3 m · 256×256 px",
88
+ "focus": "Compare water segmentation with supported ship/harbor object predictions.",
89
+ },
90
+ "parking": {
91
+ "title": "Urban parking lot",
92
+ "image": "assets/cases/parking_lot.jpg",
93
+ "source": "https://huggingface.co/datasets/blanchon/UC_Merced",
94
+ "sensor": "USGS Urban Area Imagery · RGB · 0.3 m · 256×256 px",
95
+ "focus": "Probe pavement coverage and the detector's limits for tightly packed small vehicles.",
96
  },
97
  }
98
 
 
146
  f"### {case['title']}\n"
147
  f"**Acquisition:** {case['sensor']} \n"
148
  f"**Suggested analysis:** {case['focus']} \n"
149
+ f"[Open UC Merced / USGS source]({case['source']}) · "
150
+ "High-resolution aerial imagery is intentionally outside EuroSAT's Sentinel-2 scale; review domain shift and do not treat the dataset label as model ground truth."
151
  )
152
  return case["image"], note
153
 
 
381
 
382
 
383
  CSS = """
384
+ .gradio-container {max-width: 1380px !important; background: #f4f7f9; color:#172b35;}
385
+ .hero {padding: 1.55rem 1.8rem; border-radius: 20px; color:#fff !important; background: linear-gradient(118deg,#071d31 0%,#0c4656 58%,#13806b 100%); box-shadow:0 14px 36px rgba(7,29,49,.22); margin: .35rem 0 .8rem;}
386
+ .hero-grid {display:grid;grid-template-columns:minmax(0,1fr) auto;gap:24px;align-items:center;}
387
+ .hero h1,#hero-title {font-size:2.25rem;line-height:1.08;margin:.3rem 0 .5rem;letter-spacing:-.035em;color:#fff !important;text-shadow:0 1px 1px rgba(0,0,0,.12);}
388
+ .hero p {max-width:800px;margin:.35rem 0;color:#e5f7f5 !important;font-size:.98rem;line-height:1.5;}
389
+ .hero .eyebrow {color:#8ff0dc !important;}.hero-links{display:flex;flex-wrap:wrap;gap:8px;margin-top:12px}.hero-links a{color:#fff!important;text-decoration:none;border:1px solid rgba(255,255,255,.35);background:rgba(255,255,255,.09);padding:5px 10px;border-radius:999px;font-size:.8rem;font-weight:700}.hero-links a:hover{background:rgba(255,255,255,.18)}
390
+ .hero-stats{display:grid;grid-template-columns:repeat(2,88px);gap:8px}.hero-stats div{border:1px solid rgba(255,255,255,.2);background:rgba(255,255,255,.08);border-radius:13px;padding:11px;text-align:center}.hero-stats strong{display:block;color:#fff;font-size:1.3rem}.hero-stats span{color:#cce9e5;font-size:.7rem}
391
+ .method-strip {display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin:0 0 1rem;}
392
+ .method-strip div,.assessment-card,.metric-card {background:white;border:1px solid #d9e4e9;border-radius:13px;padding:12px 14px;box-shadow:0 4px 14px rgba(20,50,70,.045);}
393
+ .method-strip b {display:block;color:#0b5363;margin-bottom:3px;font-size:.86rem}.method-strip span,.micro-note {color:#617681;font-size:.78rem;}
394
  .summary-grid {display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin:12px 0;}
395
  .metric-card span,.eyebrow {display:block;color:#66808c;font-size:.72rem;font-weight:750;letter-spacing:.1em;text-transform:uppercase;}
396
  .metric-card strong {display:block;font-size:1.45rem;margin:6px 0;color:#113544;}.metric-card small {color:#60747e;}
 
398
  .prob-row {display:grid;grid-template-columns:155px 1fr 62px;gap:10px;align-items:center;margin:8px 0;font-size:.86rem;}
399
  .prob-row b {text-align:right}.prob-track {height:9px;background:#e5edf1;border-radius:20px;overflow:hidden}.prob-track i {display:block;height:100%;background:linear-gradient(90deg,#169c7d,#36b7c5);border-radius:20px;}
400
  .section-note {padding:12px 14px;border-left:4px solid #15947a;background:#eef9f6;border-radius:8px;color:#315c62;}
401
+ .case-heading{display:flex;justify-content:space-between;align-items:end;margin:.35rem 2px .5rem}.case-heading h2{margin:0;color:#123746;font-size:1.2rem}.case-heading p{margin:0;color:#647984;font-size:.82rem}
402
+ .case-card {background:#fff;border:1px solid #d7e2e8!important;border-radius:15px!important;padding:8px!important;box-shadow:0 6px 16px rgba(20,50,70,.06);min-width:0}.case-card:hover{border-color:#62a99a!important;box-shadow:0 9px 22px rgba(20,80,70,.1)}
403
+ .case-thumb {border-radius:10px!important;overflow:hidden;background:#e7eef1}.case-thumb img{object-fit:cover!important;image-rendering:auto!important}.case-card h3{margin:2px 2px 0!important;color:#143643;font-size:.92rem!important}.case-card p{margin:0 2px 3px!important;color:#667b85;font-size:.73rem!important;line-height:1.35}.case-card button{min-height:34px!important;font-size:.78rem!important}
404
+ .case-note{background:#eaf7f3;border:1px solid #b9ded3;border-radius:11px;padding:1px 12px;margin:.4rem 0 .75rem}.case-note h3{font-size:.95rem;margin:.6rem 0 .2rem}.case-note p{font-size:.8rem}
405
+ .workspace-title h3{margin-bottom:.25rem!important}.controls-card{background:#fff;border:1px solid #dae5ea;border-radius:15px;padding:14px!important}
406
+ @media(max-width:850px){.hero-grid{grid-template-columns:1fr}.hero-stats{display:none}.method-strip,.summary-grid{grid-template-columns:1fr}.prob-row{grid-template-columns:115px 1fr 56px}.case-heading{display:block}}
407
  """
408
 
409
 
410
  with gr.Blocks(title="Satellite Vision Toolkit Pro", css=CSS, theme=gr.themes.Soft()) as demo:
411
  gr.HTML("""
412
+ <div class="hero"><div class="hero-grid"><div>
413
+ <div class="eyebrow">URBAN REMOTE SENSING WORKBENCH</div>
414
+ <h1 id="hero-title">Satellite Vision Toolkit</h1>
415
+ <p>Clear, multi-level interpretation of local urban overhead imagery—from whole-scene LULC context to pixel cover and individual objects.</p>
416
+ <div class="hero-links"><a href="https://github.com/LabMingzeChen/SatelliteVisionToolkit">GitHub</a><a href="https://huggingface.co/mrm8488/convnext-tiny-finetuned-eurosat">LULC model</a><a href="https://huggingface.co/mfaytin/mask2former-satellite">Segmentation</a><a href="https://huggingface.co/bluelabel/satellite-equipment-detection-yolov8n-vhr10">Detection</a></div>
417
+ </div><div class="hero-stats"><div><strong>3</strong><span>MODEL LEVELS</span></div><div><strong>4</strong><span>URBAN CASES</span></div><div><strong>10</strong><span>LULC CLASSES</span></div><div><strong>10</strong><span>OBJECT TYPES</span></div></div></div></div>
418
+ <div class="method-strip">
419
  <div><b>01 · Scene classification</b><span>EuroSAT probability profile across 10 LULC scene types.</span></div>
420
  <div><b>02 · Semantic segmentation</b><span>Per-pixel OpenEarthMap land-cover composition and masks.</span></div>
421
  <div><b>03 · Object detection</b><span>Bounding boxes and inventory-style summaries for 10 VHR object types.</span></div>
422
  </div>
423
  """)
424
+ gr.HTML("<div class='case-heading'><h2>Urban sample scenes</h2><p>High-resolution 256×256 USGS aerial chips · click any card to load</p></div>")
425
  with gr.Row():
426
+ with gr.Column(elem_classes="case-card"):
427
+ gr.Image("assets/cases/dense_residential.jpg", show_label=False, height=132, interactive=False, elem_classes="case-thumb")
428
+ gr.Markdown("### Dense residential\nBuildings · streets · impervious cover")
429
+ residential_case = gr.Button("Load residential scene")
430
+ with gr.Column(elem_classes="case-card"):
431
+ gr.Image("assets/cases/urban_intersection.jpg", show_label=False, height=132, interactive=False, elem_classes="case-thumb")
432
+ gr.Markdown("### Urban intersection\nRoads · vehicles · pavement")
433
+ intersection_case = gr.Button("Load intersection scene")
434
+ with gr.Column(elem_classes="case-card"):
435
+ gr.Image("assets/cases/harbor_marina.jpg", show_label=False, height=132, interactive=False, elem_classes="case-thumb")
436
+ gr.Markdown("### Marina / harbor\nWater · boats · harbor context")
437
+ harbor_case = gr.Button("Load harbor scene")
438
+ with gr.Column(elem_classes="case-card"):
439
+ gr.Image("assets/cases/parking_lot.jpg", show_label=False, height=132, interactive=False, elem_classes="case-thumb")
440
+ gr.Markdown("### Parking lot\nPavement · dense small vehicles")
441
+ parking_case = gr.Button("Load parking scene")
442
+ case_note = gr.Markdown("Select an urban case to load its acquisition details and analysis prompt.", elem_classes="case-note")
443
  with gr.Row(equal_height=True):
444
+ image_input = gr.Image(type="pil", label="Analysis image", height=380)
445
+ with gr.Column(elem_classes="controls-card"):
446
+ gr.Markdown("### Run analysis\nUpload your own image or start with an urban case. Default settings suit most previews.", elem_classes="workspace-title")
 
 
 
 
 
447
  analyze_button = gr.Button("Run complete professional assessment", variant="primary", size="lg")
448
+ with gr.Accordion("Advanced thresholds", open=False):
449
+ top_k = gr.Slider(3, 10, value=5, step=1, label="LULC alternatives (top-k)")
450
+ opacity = gr.Slider(0.1, 0.9, value=0.55, step=0.05, label="Segmentation overlay opacity")
451
+ min_share = gr.Slider(0.0, 5.0, value=0.1, step=0.1, label="Minimum reported cover share (%)")
452
+ confidence = gr.Slider(0.05, 0.9, value=0.25, step=0.05, label="Detection confidence threshold")
453
+ iou = gr.Slider(0.1, 0.9, value=0.45, step=0.05, label="Detection NMS IoU threshold")
454
+ gr.Markdown("**Best for:** local RGB satellite/aerial chips where buildings, roads, water, or supported objects are visible. Results are model estimates, not surveyed GIS data.")
455
 
456
  with gr.Tabs():
457
  with gr.Tab("Executive overview"):
 
524
  **Interpretation guardrails:** EuroSAT is a European Sentinel-2 scene dataset; classification may shift on other sensors, regions, resolutions, or crops. Pixel shares are not automatically physical ground-area shares. Pixel-coordinate GeoJSON is not georeferenced. Models can miss small or obscured objects. Do not use outputs alone for legal, surveillance, emergency, navigation, or safety-critical decisions.
525
  """)
526
 
527
+ residential_case.click(
528
+ lambda: load_case_study("residential"),
529
+ outputs=[image_input, case_note],
530
+ )
531
+ intersection_case.click(
532
+ lambda: load_case_study("intersection"),
533
  outputs=[image_input, case_note],
534
  )
535
+ harbor_case.click(
536
+ lambda: load_case_study("harbor"),
537
  outputs=[image_input, case_note],
538
  )
539
+ parking_case.click(
540
+ lambda: load_case_study("parking"),
541
  outputs=[image_input, case_note],
542
  )
543
 
assets/cases/dense_residential.jpg ADDED
assets/cases/harbor_marina.jpg ADDED
assets/cases/parking_lot.jpg ADDED
assets/cases/urban_intersection.jpg ADDED
tests/test_app_contract.py CHANGED
@@ -18,7 +18,8 @@ def test_app_exposes_all_api_endpoints_and_models():
18
  assert "mfaytin/mask2former-satellite" in constants
19
  assert "bluelabel/satellite-equipment-detection-yolov8n-vhr10" in constants
20
  assert "cropland" in constants
21
- assert "indus" in constants
22
- assert "lluta" in constants
23
- assert "zambezi" in constants
24
- assert "Guided case studies" in source
 
 
18
  assert "mfaytin/mask2former-satellite" in constants
19
  assert "bluelabel/satellite-equipment-detection-yolov8n-vhr10" in constants
20
  assert "cropland" in constants
21
+ assert "residential" in constants
22
+ assert "intersection" in constants
23
+ assert "harbor" in constants
24
+ assert "parking" in constants
25
+ assert "Urban sample scenes" in source