From 5368b58f133b207d0fb2436f96a2da2de84f61b8 Mon Sep 17 00:00:00 2001 From: Janusch Patas Date: Mon, 6 Jan 2025 10:37:35 +0100 Subject: [PATCH 1/2] change workflow --- .github/CODEOWNERS | 2 + ...lidate-and-build.yml => generate-html.yml} | 28 ++----------- .github/workflows/validate-pr.yml | 41 +++++++++++++++++++ 3 files changed, 47 insertions(+), 24 deletions(-) create mode 100644 .github/CODEOWNERS rename .github/workflows/{validate-and-build.yml => generate-html.yml} (50%) create mode 100644 .github/workflows/validate-pr.yml diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..57b52d7 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,2 @@ +# Require review for all changes +* @MrNeRF diff --git a/.github/workflows/validate-and-build.yml b/.github/workflows/generate-html.yml similarity index 50% rename from .github/workflows/validate-and-build.yml rename to .github/workflows/generate-html.yml index 7490add..063b557 100644 --- a/.github/workflows/validate-and-build.yml +++ b/.github/workflows/generate-html.yml @@ -1,22 +1,19 @@ -name: Validate YAML and Generate HTML +name: Generate HTML on Main on: - pull_request: + push: branches: [ main ] paths: - 'awesome_3dgs_papers.yaml' jobs: - validate-and-build: + build: runs-on: ubuntu-latest permissions: contents: write - pull-requests: write steps: - uses: actions/checkout@v3 - with: - fetch-depth: 0 # Fetch all history for PR comparison - name: Set up Python uses: actions/setup-python@v4 @@ -28,30 +25,13 @@ jobs: python -m pip install --upgrade pip pip install -r requirements.txt - - name: Validate Changed YAML entries - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - PR_NUMBER: ${{ github.event.pull_request.number }} - REPO: ${{ github.repository }} - run: | - python src/validate_yaml.py - - name: Generate HTML run: | python src/generate.py awesome_3dgs_papers.yaml index.html - name: Commit and push if changed - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | git config --local user.email "41898282+github-actions[bot]@users.noreply.github.com" git config --local user.name "github-actions[bot]" - git fetch origin - git checkout ${{ github.head_ref }} git add index.html - if git diff --staged --quiet; then - echo "No changes to commit" - else - git commit -m "Update index.html" - git push origin ${{ github.head_ref }} - fi + git diff --staged --quiet || (git commit -m "Update index.html" && git push) diff --git a/.github/workflows/validate-pr.yml b/.github/workflows/validate-pr.yml new file mode 100644 index 0000000..a3556c3 --- /dev/null +++ b/.github/workflows/validate-pr.yml @@ -0,0 +1,41 @@ +name: Validate PR Changes + +on: + pull_request: + branches: [ main ] + paths: + - 'awesome_3dgs_papers.yaml' + +jobs: + validate: + runs-on: ubuntu-latest + permissions: + pull-requests: read + contents: read + + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.10' + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -r requirements.txt + + - name: Validate Changed YAML entries + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PR_NUMBER: ${{ github.event.pull_request.number }} + REPO: ${{ github.repository }} + run: | + python src/validate_yaml.py + + - name: Generate HTML (validation only) + run: | + python src/generate.py awesome_3dgs_papers.yaml index.html From f1a8c413ee1318af24a29faa488d935377c5511b Mon Sep 17 00:00:00 2001 From: Janusch Patas Date: Mon, 6 Jan 2025 10:55:55 +0100 Subject: [PATCH 2/2] fixes --- assets/thumbnails/fan2024large.jpg | Bin 0 -> 28041 bytes awesome_3dgs_papers.yaml | 45 +++++++++++++++ {scripts => src}/fix_date.py | 0 src/yaml_editor.py | 87 ++++++++++++++++++++++++----- 4 files changed, 118 insertions(+), 14 deletions(-) create mode 100644 assets/thumbnails/fan2024large.jpg rename {scripts => src}/fix_date.py (100%) diff --git a/assets/thumbnails/fan2024large.jpg b/assets/thumbnails/fan2024large.jpg new file mode 100644 index 0000000000000000000000000000000000000000..95ae8daf847ff3cb3d24008101d1427027b8d5a0 GIT binary patch literal 28041 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 YDG_B)xTk+Jqy8gv|NqOykN+(HFLD*i=>Px# literal 0 HcmV?d00001 diff --git a/awesome_3dgs_papers.yaml b/awesome_3dgs_papers.yaml index 2bd2ce3..f3cf2a3 100644 --- a/awesome_3dgs_papers.yaml +++ b/awesome_3dgs_papers.yaml @@ -1191,6 +1191,51 @@ - Robotics thumbnail: assets/thumbnails/zubair2024neural.jpg publication_date: '2024-10-26T16:26:41+00:00' +- id: fan2024large + title: 'Large Spatial Model: End-to-end Unposed Images to Semantic 3D' + authors: Zhiwen Fan, Jian Zhang, Wenyan Cong, Peihao Wang, Renjie Li, Kairun Wen, + Shijie Zhou, Achuta Kadambi, Zhangyang Wang, Danfei Xu, Boris Ivanovic, Marco + Pavone, Yue Wang + year: '2024' + abstract: 'Reconstructing and understanding 3D structures from a limited number + of images is a well-established problem in computer vision. Traditional methods + usually break this task into multiple subtasks, each requiring complex transformations + between different data representations. For instance, dense reconstruction through + Structure-from-Motion (SfM) involves converting images into key points, optimizing + camera parameters, and estimating structures. Afterward, accurate sparse reconstructions + are required for further dense modeling, which is subsequently fed into task-specific + neural networks. This multi-step process results in considerable processing time + and increased engineering complexity. In this work, we present the Large Spatial + Model (LSM), which processes unposed RGB images directly into semantic radiance + fields. LSM simultaneously estimates geometry, appearance, and semantics in a + single feed-forward operation, and it can generate versatile label maps by interacting + with language at novel viewpoints. Leveraging a Transformer-based architecture, + LSM integrates global geometry through pixel-aligned point maps. To enhance spatial + attribute regression, we incorporate local context aggregation with multi-scale + fusion, improving the accuracy of fine local details. To tackle the scarcity of + labeled 3D semantic data and enable natural language-driven scene manipulation, + we incorporate a pre-trained 2D language-based segmentation model into a 3D-consistent + semantic feature field. An efficient decoder then parameterizes a set of semantic + anisotropic Gaussians, facilitating supervised end-to-end learning. Extensive + experiments across various tasks show that LSM unifies multiple 3D vision tasks + directly from unposed images, achieving real-time semantic 3D reconstruction for + the first time. + + ' + project_page: https://largespatialmodel.github.io/ + paper: https://arxiv.org/pdf/2410.18956.pdf + code: https://github.com/NVlabs/LSM + video: https://largespatialmodel.github.io/static/videos/LSM_demo1.mp4 + tags: + - Code + - Feed-Forward + - Poses + - Project + - Segmentation + - Video + thumbnail: assets/thumbnails/fan2024large.jpg + publication_date: '2024-10-24T17:54:42+00:00' + date_source: arxiv - id: lee2024fully title: Fully Explicit Dynamic Gaussian Splatting authors: Junoh Lee, Changyeon Won, HyunJun Jung, Inhwan Bae, Hae-Gon Jeon diff --git a/scripts/fix_date.py b/src/fix_date.py similarity index 100% rename from scripts/fix_date.py rename to src/fix_date.py diff --git a/src/yaml_editor.py b/src/yaml_editor.py index 8f23260..a2fb1da 100644 --- a/src/yaml_editor.py +++ b/src/yaml_editor.py @@ -1,4 +1,5 @@ import sys +from src.fix_date import YAMLUpdater import yaml import webbrowser from PyQt6.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, @@ -16,6 +17,7 @@ class YAMLEditor(QMainWindow): def __init__(self): super().__init__() + self.yaml_updater = YAMLUpdater() self.setWindowTitle("3D Gaussian Splatting Paper Editor") self.setMinimumSize(1200, 800) @@ -249,7 +251,7 @@ def setup_ui(self): main_layout.addLayout(content_layout) def auto_save(self): - """Automatically save changes""" + """Automatically save changes with date updating""" entry = self.data[self.current_index] # Update basic fields @@ -273,11 +275,26 @@ def auto_save(self): # Update tags entry['tags'] = sorted([tag for tag, btn in self.tag_buttons.items() if btn.isChecked()]) + # Process date information if needed + if 'publication_date' not in entry: + updated_entry, success = self.yaml_updater.process_paper(entry) + if success: + entry.update(updated_entry) + try: + # Sort data before saving + self.data.sort(key=self.yaml_updater.safe_sort_key, reverse=True) + + # Find the new index of the current entry after sorting + current_entry_id = entry['id'] + self.current_index = next(i for i, e in enumerate(self.data) if e['id'] == current_entry_id) + with open("awesome_3dgs_papers.yaml", 'w', encoding='utf-8') as file: yaml.dump(self.data, file, sort_keys=False, allow_unicode=True) + self.show_save_feedback(True) self.original_entry_state = self.get_entry_state(entry) + self.entry_counter.setText(f"Entry {self.current_index + 1} of {len(self.data)}") return True except Exception as e: self.show_save_feedback(False) @@ -463,19 +480,27 @@ def add_arxiv_button(self): self.arxiv_button = QPushButton("Add from arXiv") self.arxiv_button.clicked.connect(self.show_arxiv_dialog) self.nav_layout.addWidget(self.arxiv_button) - + def refresh_ui(self): - """Force a complete UI refresh""" - print("Starting refresh_ui") # Debug print - old_len = len(self.data) # Store old length + """Force a complete UI refresh with correct positioning""" + print("Starting refresh_ui") + old_index = self.current_index + old_id = self.data[old_index]['id'] if self.data else None + self.load_yaml() - new_len = len(self.data) # New length - print(f"Data length before: {old_len}, after: {new_len}") # Debug print + + # Find the index of the entry with the same ID + if old_id: + try: + self.current_index = next(i for i, entry in enumerate(self.data) if entry['id'] == old_id) + except StopIteration: + self.current_index = 0 + self.show_current_entry() self.clear_search_results() self.entry_counter.setText(f"Entry {self.current_index + 1} of {len(self.data)}") - QApplication.processEvents() # Force Qt to process pending events - print("Finished refresh_ui") # Debug print + QApplication.processEvents() + print(f"Finished refresh_ui at index {self.current_index}") def show_arxiv_dialog(self): print("Opening arXiv dialog") @@ -483,11 +508,45 @@ def show_arxiv_dialog(self): result = dialog.exec() print(f"Dialog result: {result}") if result == 1: - print("Dialog accepted, about to refresh") - self.refresh_ui() # First refresh to get new data - self.current_index = len(self.data) - 1 # Then set to last entry - self.show_current_entry() # Show the new entry - print(f"Refresh complete, showing entry {self.current_index + 1} of {len(self.data)}") + print("Dialog accepted, getting newly added entry") + + # Read the current YAML file + with open("awesome_3dgs_papers.yaml", 'r', encoding='utf-8') as file: + current_data = yaml.safe_load(file) + + # Get the newest entry and its ID before any modifications + new_entry = current_data[-1] + new_entry_id = new_entry['id'] + print(f"New entry ID: {new_entry_id}") + + # Update date information + updated_entry, success = self.yaml_updater.process_paper(new_entry) + if success: + current_data[-1] = updated_entry + + # Sort the data + current_data.sort(key=self.yaml_updater.safe_sort_key, reverse=True) + + # Save the updated and sorted data + with open("awesome_3dgs_papers.yaml", 'w', encoding='utf-8') as file: + yaml.dump(current_data, file, sort_keys=False, allow_unicode=True) + + # Reload the data + self.load_yaml() + + # Find the index of the new entry in the sorted data + try: + self.current_index = next(i for i, e in enumerate(self.data) if e['id'] == new_entry_id) + print(f"Found new entry at index {self.current_index}") + except StopIteration: + print(f"Warning: Could not find entry with ID {new_entry_id}") + self.current_index = 0 + + # Show the entry + self.show_current_entry() + self.clear_search_results() + self.entry_counter.setText(f"Entry {self.current_index + 1} of {len(self.data)}") + print(f"Now showing entry {self.current_index + 1} of {len(self.data)}") def main(): app = QApplication(sys.argv)