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
43 changes: 43 additions & 0 deletions .github/workflows/static.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# Simple workflow for deploying static content to GitHub Pages
name: Deploy static content to Pages

on:
# Runs on pushes targeting the default branch
push:
branches: ["main"]

# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:

# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
permissions:
contents: read
pages: write
id-token: write

# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
concurrency:
group: "pages"
cancel-in-progress: false

jobs:
# Single deploy job since we're just deploying
deploy:
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Pages
uses: actions/configure-pages@v5
- name: Upload artifact
uses: actions/upload-pages-artifact@v3
with:
# Upload entire repository
path: '.'
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
38 changes: 24 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,22 @@

Official implementation for
<br>
[EOGS++: Earth Observation Gaussian Splatting with Internal Camera Refinement and Direct Panchromatic Rendering ](http://arxiv.org/abs/2306.08045)
[EOGS++: Earth Observation Gaussian Splatting with Internal Camera Refinement and Direct Panchromatic Rendering ](https://arxiv.org/abs/2511.16542)

[![arXiv](https://img.shields.io/badge/arxiv-2306.08045-b31b1b.svg)](https://arxiv.org/pdf/2511.16542)
[![Project page](https://img.shields.io/badge/Project_page-8A2BE2)](https://gardiens.github.io/eogs2)

[🌍 Project webpage](https://mezzelfo.github.io/EOGS/)

[🌍 Project webpage](https://gardiens.github.io/EOGS2/)
```
@article{bournez2025eogsearthobservationgaussian,
title={EOGS++: Earth Observation Gaussian Splatting with Internal Camera Refinement and Direct Panchromatic Rendering},
author={Bournez, Pierrick and Savant Aira, Luca and Ehret, Thibaud and Facciolo, Gabriele},
journal={arXiv preprint arXiv:2511.16542},
year={2025},
url={https://arxiv.org/abs/2511.16542}
}
```


## 📌 Description
Expand Down Expand Up @@ -66,7 +77,7 @@ bash install.sh

Download the dataset from the **GitHub Release page**:

➡️ https://github.com/mezzelfo/EOGS/releases/download/dataset_v01/data.zip
➡️ https://github.com/gardiens/EOGS2/releases/download/data/data.zip

Extract it into the `data` folder :

Expand Down Expand Up @@ -154,24 +165,23 @@ python src/gaussiansplatting/full_eval_pan.py experiments=eogsplus mode=onlyMSI

## 💳 Credits

- This project was built using the [original EOGS repo ](https://github.com/mezzelfo/EOGS/tree/master).
- The documentation was heavily inspired by the [SuperPoint Transformers repo](https://github.com/drprojects/superpoint_transformer)
- This project was built using the [original EOGS github ](https://github.com/mezzelfo/EOGS/tree/master).
- The documentation was heavily inspired by the [SuperPoint Transformers github](https://github.com/drprojects/superpoint_transformer)


<br>

## Citing our work

If your work uses all or part of the present code, please include the following a citation:

```
@article{cella2025resqdrone,
title={ResQDrone: Autonomous Indoor Quadcopter for Multi-Layered Mapping in Crisis and Disaster Management Scenarios},
author={Cella, Marco and Biber, J{\"u}rgen and Bournez, Pierrick and Salzinger, Jules and Widhalm, Verena and Vultaggio, Francesco and d’Apolito, Francesco and Bruckm{\"u}ller, Felix and Sulzbachner, Christoph and Fanta-Jende, Phillipp},
journal={The International Archives of the Photogrammetry, Remote Sensing and Spatial Information Sciences},
volume={48},
pages={47--54},
@article{bournez2025eogsearthobservationgaussian,
title={EOGS++: Earth Observation Gaussian Splatting with Internal Camera Refinement and Direct Panchromatic Rendering},
author={Bournez, Pierrick and Savant Aira, Luca and Ehret, Thibaud and Facciolo, Gabriele},
journal={arXiv preprint arXiv:2511.16542},
year={2025},
publisher={Copernicus GmbH}}
url={https://arxiv.org/abs/2511.16542}
}
```
You can find our [paper on arxiv 📄](http://arxiv.org/abs/2306.08045).

You can find our [paper on arxiv 📄](https://arxiv.org/abs/2511.16542).
File renamed without changes.
2 changes: 2 additions & 0 deletions docs/_config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
title: EOGS++ website
description: official website for the EOGS++ paper
37 changes: 18 additions & 19 deletions website/index.html → docs/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -138,16 +138,17 @@ <h1 class="title is-1 publication-title"> EOGS++: Earth Observation Gaussian Spl
<div class="is-size-5 publication-authors">

<span class="author-block"><sup>1</sup>Universite Paris-Saclay, CNRS, ENS Paris-Saclay, Centre Borelli, 91190, Gif-sur-Yvette, France</span>
<span class="author-block"><sup>2</sup>AMIAD, Pôle Recherche, France</span>

<span class="author-block"><sup>3</sup> Politecnico di Torino, Corso Duca degli Abruzzi, 24, 10129 Torino TO, Italia </span>

<span class="author-block"><sup>2</sup> Politecnico di Torino, Corso Duca degli Abruzzi, 24, 10129 Torino TO, Italia </span>
<span class="author-block"><sup>3</sup>AMIAD, Pôle Recherche, France</span>
</div>

<div class="column has-text-centered">
<div class="publication-links">
<!-- PDF Link. -->
<span class="link-block">
<a href="https://gitlab-student.centralesupelec.fr/test-groupe/EOGS"
<a href="https://arxiv.org/abs/2511.16542"
class="external-link button is-normal is-rounded is-dark">
<span class="icon">
<i class="fas fa-file-pdf"></i>
Expand All @@ -156,7 +157,7 @@ <h1 class="title is-1 publication-title"> EOGS++: Earth Observation Gaussian Spl
</a>
</span>
<span class="link-block">
<a href="https://gitlab-student.centralesupelec.fr/test-groupe/EOGS"
<a href="https://arxiv.org/abs/2511.16542"
class="external-link button is-normal is-rounded is-dark">
<span class="icon">
<i class="ai ai-arxiv"></i>
Expand All @@ -166,23 +167,22 @@ <h1 class="title is-1 publication-title"> EOGS++: Earth Observation Gaussian Spl
</span>

<span class="link-block">
<a href="https://gitlab-student.centralesupelec.fr/test-groupe/EOGS"
<a href="https://github.com/gardiens/EOGS2"
class="external-link button is-normal is-rounded is-dark">
<span class="icon">
<i class="fab fa-github"></i>
</span>
<span>Code</span>
</a>
</span>
<!-- Dataset Link.
<span class="link-block">
<a href="https://github.com/google/nerfies/releases/tag/0.1"
<a href="https://github.com/gardiens/EOGS2/releases/tag/data"
class="external-link button is-normal is-rounded is-dark">
<span class="icon">
<i class="far fa-images"></i>
</span>
<span>Data</span>
</a> -->
</a>
</div>

</div>
Expand Down Expand Up @@ -422,11 +422,11 @@ <h2 class="title is-3 has-text-centered"> Related links</h2>
<p>
<a href="https://mezzelfo.github.io/EOGS/">EOGS</a> introduces a Gaussian Splatting framework tailored to satellite data, providing efficient reconstruction pipelines for large-scale scenes.
</p>
<p>
These resources offer valuable complementary perspectives and highlight the rapidly evolving landscape of neural reconstruction methods for Earth observation.
<!-- <p>
You can find the [dev repo here](https://gitlab-student.centralesupelec.fr/test-groupe/EOGS)


</p>
</p> -->

</div>
</div>
Expand All @@ -441,15 +441,14 @@ <h2 class="title is-3 has-text-centered"> Related links</h2>
<section class="section" id="BibTeX">
<div class="container is-max-desktop content">
<h2 class="title">BibTeX</h2>
<pre><code>@article{cella2025resqdrone,
title={ResQDrone: Autonomous Indoor Quadcopter for Multi-Layered Mapping in Crisis and Disaster Management Scenarios},
author={Cella, Marco and Biber, J{\"u}rgen and Bournez, Pierrick and Salzinger, Jules and Widhalm, Verena and Vultaggio, Francesco and d’Apolito, Francesco and Bruckm{\"u}ller, Felix and Sulzbachner, Christoph and Fanta-Jende, Phillipp},
journal={The International Archives of the Photogrammetry, Remote Sensing and Spatial Information Sciences},
volume={48},
pages={47--54},
<pre><code>@article{bournez2025eogsearthobservationgaussian,
title={EOGS++: Earth Observation Gaussian Splatting with Internal Camera Refinement and Direct Panchromatic Rendering},
author={Bournez, Pierrick and Savant Aira, Luca and Ehret, Thibaud and Facciolo, Gabriele},
journal={arXiv preprint arXiv:2511.16542},
year={2025},
publisher={Copernicus GmbH}
}</code></pre>
url={https://arxiv.org/abs/2511.16542}
}
</code></pre>
</div>
</section>

Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
171 changes: 171 additions & 0 deletions src/gaussiansplatting/convert.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,171 @@
#
# Copyright (C) 2023, Inria
# GRAPHDECO research group, https://team.inria.fr/graphdeco
# All rights reserved.
#
# This software is free for non-commercial, research and evaluation use
# under the terms of the LICENSE.md file.
#
# For inquiries contact [email protected]
#

import os
import logging
from argparse import ArgumentParser
import shutil

# This Python script is based on the shell converter script provided in the MipNerF 360 repository.
parser = ArgumentParser("Colmap converter")
parser.add_argument("--no_gpu", action="store_true")
parser.add_argument("--skip_matching", action="store_true")
parser.add_argument("--source_path", "-s", required=True, type=str)
parser.add_argument("--camera", default="OPENCV", type=str)
parser.add_argument("--colmap_executable", default="", type=str)
parser.add_argument("--resize", action="store_true")
parser.add_argument("--magick_executable", default="", type=str)
args = parser.parse_args()
colmap_command = (
'"{}"'.format(args.colmap_executable)
if len(args.colmap_executable) > 0
else "colmap"
)
magick_command = (
'"{}"'.format(args.magick_executable)
if len(args.magick_executable) > 0
else "magick"
)
use_gpu = 1 if not args.no_gpu else 0

if not args.skip_matching:
os.makedirs(args.source_path + "/distorted/sparse", exist_ok=True)

## Feature extraction
feat_extracton_cmd = (
colmap_command + " feature_extractor "
"--database_path "
+ args.source_path
+ "/distorted/database.db \
--image_path "
+ args.source_path
+ "/input \
--ImageReader.single_camera 1 \
--ImageReader.camera_model "
+ args.camera
+ " \
--SiftExtraction.use_gpu "
+ str(use_gpu)
)
exit_code = os.system(feat_extracton_cmd)
if exit_code != 0:
logging.error(f"Feature extraction failed with code {exit_code}. Exiting.")
exit(exit_code)

## Feature matching
feat_matching_cmd = (
colmap_command
+ " exhaustive_matcher \
--database_path "
+ args.source_path
+ "/distorted/database.db \
--SiftMatching.use_gpu "
+ str(use_gpu)
)
exit_code = os.system(feat_matching_cmd)
if exit_code != 0:
logging.error(f"Feature matching failed with code {exit_code}. Exiting.")
exit(exit_code)

### Bundle adjustment
# The default Mapper tolerance is unnecessarily large,
# decreasing it speeds up bundle adjustment steps.
mapper_cmd = (
colmap_command
+ " mapper \
--database_path "
+ args.source_path
+ "/distorted/database.db \
--image_path "
+ args.source_path
+ "/input \
--output_path "
+ args.source_path
+ "/distorted/sparse \
--Mapper.ba_global_function_tolerance=0.000001"
)
exit_code = os.system(mapper_cmd)
if exit_code != 0:
logging.error(f"Mapper failed with code {exit_code}. Exiting.")
exit(exit_code)

### Image undistortion
## We need to undistort our images into ideal pinhole intrinsics.
img_undist_cmd = (
colmap_command
+ " image_undistorter \
--image_path "
+ args.source_path
+ "/input \
--input_path "
+ args.source_path
+ "/distorted/sparse/0 \
--output_path "
+ args.source_path
+ "\
--output_type COLMAP"
)
exit_code = os.system(img_undist_cmd)
if exit_code != 0:
logging.error(f"Mapper failed with code {exit_code}. Exiting.")
exit(exit_code)

files = os.listdir(args.source_path + "/sparse")
os.makedirs(args.source_path + "/sparse/0", exist_ok=True)
# Copy each file from the source directory to the destination directory
for file in files:
if file == "0":
continue
source_file = os.path.join(args.source_path, "sparse", file)
destination_file = os.path.join(args.source_path, "sparse", "0", file)
shutil.move(source_file, destination_file)

if args.resize:
print("Copying and resizing...")

# Resize images.
os.makedirs(args.source_path + "/images_2", exist_ok=True)
os.makedirs(args.source_path + "/images_4", exist_ok=True)
os.makedirs(args.source_path + "/images_8", exist_ok=True)
# Get the list of files in the source directory
files = os.listdir(args.source_path + "/images")
# Copy each file from the source directory to the destination directory
for file in files:
source_file = os.path.join(args.source_path, "images", file)

destination_file = os.path.join(args.source_path, "images_2", file)
shutil.copy2(source_file, destination_file)
exit_code = os.system(
magick_command + " mogrify -resize 50% " + destination_file
)
if exit_code != 0:
logging.error(f"50% resize failed with code {exit_code}. Exiting.")
exit(exit_code)

destination_file = os.path.join(args.source_path, "images_4", file)
shutil.copy2(source_file, destination_file)
exit_code = os.system(
magick_command + " mogrify -resize 25% " + destination_file
)
if exit_code != 0:
logging.error(f"25% resize failed with code {exit_code}. Exiting.")
exit(exit_code)

destination_file = os.path.join(args.source_path, "images_8", file)
shutil.copy2(source_file, destination_file)
exit_code = os.system(
magick_command + " mogrify -resize 12.5% " + destination_file
)
if exit_code != 0:
logging.error(f"12.5% resize failed with code {exit_code}. Exiting.")
exit(exit_code)

print("Done.")
Loading
Loading