summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorskal <pascal.massimino@gmail.com>2026-02-15 18:44:17 +0100
committerskal <pascal.massimino@gmail.com>2026-02-15 18:44:17 +0100
commit161a59fa50bb92e3664c389fa03b95aefe349b3f (patch)
tree71548f64b2bdea958388f9063b74137659d70306
parent9c3b72c710bf1ffa7e18f7c7390a425d57487eba (diff)
refactor(cnn): isolate CNN v2 to cnn_v2/ subdirectory
Move all CNN v2 files to dedicated cnn_v2/ directory to prepare for CNN v3 development. Zero functional changes. Structure: - cnn_v2/src/ - C++ effect implementation - cnn_v2/shaders/ - WGSL shaders (6 files) - cnn_v2/weights/ - Binary weights (3 files) - cnn_v2/training/ - Python training scripts (4 files) - cnn_v2/scripts/ - Shell scripts (train_cnn_v2_full.sh) - cnn_v2/tools/ - Validation tools (HTML) - cnn_v2/docs/ - Documentation (4 markdown files) Changes: - Update CMake source list to cnn_v2/src/cnn_v2_effect.cc - Update assets.txt with relative paths to cnn_v2/ - Update includes to ../../cnn_v2/src/cnn_v2_effect.h - Add PROJECT_ROOT resolution to Python/shell scripts - Update doc references in HOWTO.md, TODO.md - Add cnn_v2/README.md Verification: 34/34 tests passing, demo runs correctly. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
-rw-r--r--TODO.md2
-rw-r--r--cmake/DemoSourceLists.cmake2
-rw-r--r--cnn_v2/README.md60
-rw-r--r--cnn_v2/docs/CNN_V2.md (renamed from doc/CNN_V2.md)0
-rw-r--r--cnn_v2/docs/CNN_V2_BINARY_FORMAT.md (renamed from doc/CNN_V2_BINARY_FORMAT.md)0
-rw-r--r--cnn_v2/docs/CNN_V2_DEBUG_TOOLS.md (renamed from doc/CNN_V2_DEBUG_TOOLS.md)0
-rw-r--r--cnn_v2/docs/CNN_V2_WEB_TOOL.md (renamed from doc/CNN_V2_WEB_TOOL.md)0
-rwxr-xr-xcnn_v2/scripts/train_cnn_v2_full.sh (renamed from scripts/train_cnn_v2_full.sh)10
-rw-r--r--cnn_v2/shaders/cnn_v2_compute.wgsl (renamed from workspaces/main/shaders/cnn_v2/cnn_v2_compute.wgsl)0
-rw-r--r--cnn_v2/shaders/cnn_v2_layer_0.wgsl (renamed from workspaces/main/shaders/cnn_v2/cnn_v2_layer_0.wgsl)0
-rw-r--r--cnn_v2/shaders/cnn_v2_layer_1.wgsl (renamed from workspaces/main/shaders/cnn_v2/cnn_v2_layer_1.wgsl)0
-rw-r--r--cnn_v2/shaders/cnn_v2_layer_2.wgsl (renamed from workspaces/main/shaders/cnn_v2/cnn_v2_layer_2.wgsl)0
-rw-r--r--cnn_v2/shaders/cnn_v2_layer_template.wgsl (renamed from workspaces/main/shaders/cnn_v2/cnn_v2_layer_template.wgsl)0
-rw-r--r--cnn_v2/shaders/cnn_v2_static.wgsl (renamed from workspaces/main/shaders/cnn_v2/cnn_v2_static.wgsl)0
-rw-r--r--cnn_v2/src/cnn_v2_effect.cc (renamed from src/effects/cnn_v2_effect.cc)2
-rw-r--r--cnn_v2/src/cnn_v2_effect.h (renamed from src/effects/cnn_v2_effect.h)0
-rw-r--r--cnn_v2/tools/cnn_v2_test/README.md (renamed from tools/cnn_v2_test/README.md)0
-rw-r--r--cnn_v2/tools/cnn_v2_test/index.html (renamed from tools/cnn_v2_test/index.html)0
-rwxr-xr-xcnn_v2/training/export_cnn_v2_shader.py (renamed from training/export_cnn_v2_shader.py)6
-rwxr-xr-xcnn_v2/training/export_cnn_v2_weights.py (renamed from training/export_cnn_v2_weights.py)8
-rwxr-xr-xcnn_v2/training/gen_identity_weights.py (renamed from training/gen_identity_weights.py)6
-rwxr-xr-xcnn_v2/training/train_cnn_v2.py (renamed from training/train_cnn_v2.py)0
-rw-r--r--doc/HOWTO.md32
-rw-r--r--src/app/test_demo.cc2
-rw-r--r--src/gpu/demo_effects.h2
-rw-r--r--workspaces/main/assets.txt6
26 files changed, 107 insertions, 31 deletions
diff --git a/TODO.md b/TODO.md
index 78e13ab..4e67b51 100644
--- a/TODO.md
+++ b/TODO.md
@@ -28,7 +28,7 @@ Self-contained workspaces for parallel demo development.
Enhanced CNN post-processing with multi-dimensional feature inputs.
-**Design:** `doc/CNN_V2.md`
+**Design:** `cnn_v2/docs/CNN_V2.md`
**Status:**
- ✅ Full implementation complete and validated
diff --git a/cmake/DemoSourceLists.cmake b/cmake/DemoSourceLists.cmake
index dac7a09..1345ed4 100644
--- a/cmake/DemoSourceLists.cmake
+++ b/cmake/DemoSourceLists.cmake
@@ -40,7 +40,7 @@ set(COMMON_GPU_EFFECTS
src/effects/chroma_aberration_effect.cc
src/effects/vignette_effect.cc
src/effects/cnn_effect.cc
- src/effects/cnn_v2_effect.cc
+ cnn_v2/src/cnn_v2_effect.cc
src/gpu/post_process_helper.cc
src/gpu/shaders.cc
src/effects/hybrid_3d_effect.cc
diff --git a/cnn_v2/README.md b/cnn_v2/README.md
new file mode 100644
index 0000000..ef0cf44
--- /dev/null
+++ b/cnn_v2/README.md
@@ -0,0 +1,60 @@
+# CNN v2: Parametric Post-Processing Neural Network
+
+**Architecture:** 3-layer compute, storage buffer (~3.2 KB)
+**Features:** 7D static (RGBD + UV + sin + bias), sigmoid activation
+
+## Quick Start
+
+```bash
+./cnn_v2/scripts/train_cnn_v2_full.sh
+```
+
+## Documentation
+
+- [CNN_V2.md](docs/CNN_V2.md) - Architecture and implementation details
+- [CNN_V2_BINARY_FORMAT.md](docs/CNN_V2_BINARY_FORMAT.md) - Weight format specification
+- [CNN_V2_WEB_TOOL.md](docs/CNN_V2_WEB_TOOL.md) - Validation tool documentation
+- [CNN_V2_DEBUG_TOOLS.md](docs/CNN_V2_DEBUG_TOOLS.md) - Debugging and analysis tools
+
+## Integration
+
+- **C++:** `cnn_v2/src/cnn_v2_effect.{h,cc}`
+- **Assets:** `workspaces/main/assets.txt` (lines 47-49)
+- **Test:** `src/tests/gpu/test_demo_effects.cc` (line 93)
+
+## Directory Structure
+
+```
+cnn_v2/
+├── README.md # This file
+├── src/
+│ ├── cnn_v2_effect.h # Effect header
+│ └── cnn_v2_effect.cc # Effect implementation
+├── shaders/ # WGSL shaders (6 files)
+├── weights/ # Binary weights (3 files)
+├── training/ # Python training scripts (4 files)
+├── scripts/ # Shell scripts (train_cnn_v2_full.sh)
+├── tools/ # Validation tools (HTML)
+└── docs/ # Documentation (4 markdown files)
+```
+
+## Training Pipeline
+
+1. **Train model:** `./cnn_v2/scripts/train_cnn_v2_full.sh`
+2. **Export weights:** Automatic (binary format, ~3.2 KB)
+3. **Validate:** HTML tool at `cnn_v2/tools/cnn_v2_test/index.html`
+
+For detailed training options: `./cnn_v2/scripts/train_cnn_v2_full.sh --help`
+
+## Key Features
+
+- **Parametric static features:** 7D input (RGBD + UV + sin encoding + bias)
+- **Storage buffer architecture:** Dynamic layer count, compact binary format
+- **Sigmoid activation:** Smooth gradients, prevents training collapse
+- **Patch-based training:** Sample-efficient, focuses on salient regions
+- **Sub-10KB target:** Achieved with 3-layer model (~3.2 KB)
+
+## Next Steps
+
+- **8-bit quantization:** 2× size reduction (~1.6 KB) via quantization-aware training (QAT)
+- **CNN v3:** U-Net architecture for enhanced quality (separate directory)
diff --git a/doc/CNN_V2.md b/cnn_v2/docs/CNN_V2.md
index b7fd6f8..b7fd6f8 100644
--- a/doc/CNN_V2.md
+++ b/cnn_v2/docs/CNN_V2.md
diff --git a/doc/CNN_V2_BINARY_FORMAT.md b/cnn_v2/docs/CNN_V2_BINARY_FORMAT.md
index 59c859d..59c859d 100644
--- a/doc/CNN_V2_BINARY_FORMAT.md
+++ b/cnn_v2/docs/CNN_V2_BINARY_FORMAT.md
diff --git a/doc/CNN_V2_DEBUG_TOOLS.md b/cnn_v2/docs/CNN_V2_DEBUG_TOOLS.md
index 8d1289a..8d1289a 100644
--- a/doc/CNN_V2_DEBUG_TOOLS.md
+++ b/cnn_v2/docs/CNN_V2_DEBUG_TOOLS.md
diff --git a/doc/CNN_V2_WEB_TOOL.md b/cnn_v2/docs/CNN_V2_WEB_TOOL.md
index b6f5b0b..b6f5b0b 100644
--- a/doc/CNN_V2_WEB_TOOL.md
+++ b/cnn_v2/docs/CNN_V2_WEB_TOOL.md
diff --git a/scripts/train_cnn_v2_full.sh b/cnn_v2/scripts/train_cnn_v2_full.sh
index 078ea28..a21c1ac 100755
--- a/scripts/train_cnn_v2_full.sh
+++ b/cnn_v2/scripts/train_cnn_v2_full.sh
@@ -53,7 +53,7 @@ cd "$PROJECT_ROOT"
# Helper functions
export_weights() {
- python3 training/export_cnn_v2_weights.py "$1" --output-weights "$2" --quiet
+ python3 "$SCRIPT_DIR/../training/export_cnn_v2_weights.py" "$1" --output-weights "$2" --quiet
}
find_latest_checkpoint() {
@@ -64,6 +64,10 @@ build_target() {
cmake --build build -j4 --target "$1" > /dev/null 2>&1
}
+# Path resolution for running from any directory
+SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
+PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
+
# Default configuration
INPUT_DIR="training/input"
TARGET_DIR="training/target_1"
@@ -82,7 +86,7 @@ MIP_LEVEL=0
GRAYSCALE_LOSS=false
FULL_IMAGE_MODE=false
IMAGE_SIZE=256
-OUTPUT_WEIGHTS="workspaces/main/weights/cnn_v2_weights.bin"
+OUTPUT_WEIGHTS="${PROJECT_ROOT}/workspaces/main/weights/cnn_v2_weights.bin"
# Parse arguments
VALIDATE_ONLY=false
@@ -306,7 +310,7 @@ if [ "$VALIDATE_ONLY" = false ]; then
# Step 1: Train model
echo "[1/4] Training CNN v2 model..."
-python3 training/train_cnn_v2.py \
+python3 "$SCRIPT_DIR/../training/train_cnn_v2.py" \
--input "$INPUT_DIR" \
--target "$TARGET_DIR" \
$TRAINING_MODE_ARGS \
diff --git a/workspaces/main/shaders/cnn_v2/cnn_v2_compute.wgsl b/cnn_v2/shaders/cnn_v2_compute.wgsl
index cdbfd74..cdbfd74 100644
--- a/workspaces/main/shaders/cnn_v2/cnn_v2_compute.wgsl
+++ b/cnn_v2/shaders/cnn_v2_compute.wgsl
diff --git a/workspaces/main/shaders/cnn_v2/cnn_v2_layer_0.wgsl b/cnn_v2/shaders/cnn_v2_layer_0.wgsl
index 8e14957..8e14957 100644
--- a/workspaces/main/shaders/cnn_v2/cnn_v2_layer_0.wgsl
+++ b/cnn_v2/shaders/cnn_v2_layer_0.wgsl
diff --git a/workspaces/main/shaders/cnn_v2/cnn_v2_layer_1.wgsl b/cnn_v2/shaders/cnn_v2_layer_1.wgsl
index f490d13..f490d13 100644
--- a/workspaces/main/shaders/cnn_v2/cnn_v2_layer_1.wgsl
+++ b/cnn_v2/shaders/cnn_v2_layer_1.wgsl
diff --git a/workspaces/main/shaders/cnn_v2/cnn_v2_layer_2.wgsl b/cnn_v2/shaders/cnn_v2_layer_2.wgsl
index 2f9836a..2f9836a 100644
--- a/workspaces/main/shaders/cnn_v2/cnn_v2_layer_2.wgsl
+++ b/cnn_v2/shaders/cnn_v2_layer_2.wgsl
diff --git a/workspaces/main/shaders/cnn_v2/cnn_v2_layer_template.wgsl b/cnn_v2/shaders/cnn_v2_layer_template.wgsl
index 1bf6819..1bf6819 100644
--- a/workspaces/main/shaders/cnn_v2/cnn_v2_layer_template.wgsl
+++ b/cnn_v2/shaders/cnn_v2_layer_template.wgsl
diff --git a/workspaces/main/shaders/cnn_v2/cnn_v2_static.wgsl b/cnn_v2/shaders/cnn_v2_static.wgsl
index 309e832..309e832 100644
--- a/workspaces/main/shaders/cnn_v2/cnn_v2_static.wgsl
+++ b/cnn_v2/shaders/cnn_v2_static.wgsl
diff --git a/src/effects/cnn_v2_effect.cc b/cnn_v2/src/cnn_v2_effect.cc
index 7127aae..60538d4 100644
--- a/src/effects/cnn_v2_effect.cc
+++ b/cnn_v2/src/cnn_v2_effect.cc
@@ -1,6 +1,6 @@
// CNN v2 Effect Implementation
-#include "effects/cnn_v2_effect.h"
+#include "cnn_v2_effect.h"
#if defined(USE_TEST_ASSETS)
#include "test_assets.h"
diff --git a/src/effects/cnn_v2_effect.h b/cnn_v2/src/cnn_v2_effect.h
index 7960b4f..7960b4f 100644
--- a/src/effects/cnn_v2_effect.h
+++ b/cnn_v2/src/cnn_v2_effect.h
diff --git a/tools/cnn_v2_test/README.md b/cnn_v2/tools/cnn_v2_test/README.md
index d41a00f..d41a00f 100644
--- a/tools/cnn_v2_test/README.md
+++ b/cnn_v2/tools/cnn_v2_test/README.md
diff --git a/tools/cnn_v2_test/index.html b/cnn_v2/tools/cnn_v2_test/index.html
index 84702d5..84702d5 100644
--- a/tools/cnn_v2_test/index.html
+++ b/cnn_v2/tools/cnn_v2_test/index.html
diff --git a/training/export_cnn_v2_shader.py b/cnn_v2/training/export_cnn_v2_shader.py
index 1c74ad0..8692a62 100755
--- a/training/export_cnn_v2_shader.py
+++ b/cnn_v2/training/export_cnn_v2_shader.py
@@ -13,6 +13,10 @@ import numpy as np
import torch
from pathlib import Path
+# Path resolution for running from any directory
+SCRIPT_DIR = Path(__file__).parent
+PROJECT_ROOT = SCRIPT_DIR.parent.parent
+
def export_layer_shader(layer_idx, weights, kernel_size, output_dir, mip_level=0, is_output_layer=False):
"""Generate WGSL compute shader for a single CNN layer.
@@ -203,7 +207,7 @@ def export_checkpoint(checkpoint_path, output_dir):
def main():
parser = argparse.ArgumentParser(description='Export CNN v2 checkpoint to WGSL shaders')
parser.add_argument('checkpoint', type=str, help='Path to checkpoint .pth file')
- parser.add_argument('--output-dir', type=str, default='workspaces/main/shaders',
+ parser.add_argument('--output-dir', type=str, default=str(PROJECT_ROOT / 'workspaces/main/shaders'),
help='Output directory for shaders')
args = parser.parse_args()
diff --git a/training/export_cnn_v2_weights.py b/cnn_v2/training/export_cnn_v2_weights.py
index f64bd8d..d66b980 100755
--- a/training/export_cnn_v2_weights.py
+++ b/cnn_v2/training/export_cnn_v2_weights.py
@@ -11,6 +11,10 @@ import torch
import struct
from pathlib import Path
+# Path resolution for running from any directory
+SCRIPT_DIR = Path(__file__).parent
+PROJECT_ROOT = SCRIPT_DIR.parent.parent
+
def export_weights_binary(checkpoint_path, output_path, quiet=False):
"""Export CNN v2 weights to binary format.
@@ -261,9 +265,9 @@ fn main(@builtin(global_invocation_id) id: vec3<u32>) {
def main():
parser = argparse.ArgumentParser(description='Export CNN v2 weights to binary format')
parser.add_argument('checkpoint', type=str, help='Path to checkpoint .pth file')
- parser.add_argument('--output-weights', type=str, default='workspaces/main/weights/cnn_v2_weights.bin',
+ parser.add_argument('--output-weights', type=str, default=str(PROJECT_ROOT / 'workspaces/main/weights/cnn_v2_weights.bin'),
help='Output binary weights file')
- parser.add_argument('--output-shader', type=str, default='workspaces/main/shaders',
+ parser.add_argument('--output-shader', type=str, default=str(PROJECT_ROOT / 'workspaces/main/shaders'),
help='Output directory for shader template')
parser.add_argument('--quiet', action='store_true',
help='Suppress detailed output')
diff --git a/training/gen_identity_weights.py b/cnn_v2/training/gen_identity_weights.py
index 7865d68..08eecc6 100755
--- a/training/gen_identity_weights.py
+++ b/cnn_v2/training/gen_identity_weights.py
@@ -21,6 +21,10 @@ import numpy as np
import struct
from pathlib import Path
+# Path resolution for running from any directory
+SCRIPT_DIR = Path(__file__).parent
+PROJECT_ROOT = SCRIPT_DIR.parent.parent
+
def generate_identity_weights(output_path, kernel_size=1, mip_level=0, mix=False, p47=False):
"""Generate identity weights: output = input (ignores static features).
@@ -149,7 +153,7 @@ def generate_identity_weights(output_path, kernel_size=1, mip_level=0, mix=False
def main():
parser = argparse.ArgumentParser(description='Generate identity CNN v2 weights')
parser.add_argument('output', type=str, nargs='?',
- default='workspaces/main/weights/cnn_v2_identity.bin',
+ default=str(PROJECT_ROOT / 'workspaces/main/weights/cnn_v2_identity.bin'),
help='Output .bin file path')
parser.add_argument('--kernel-size', type=int, default=1,
help='Kernel size (default: 1×1)')
diff --git a/training/train_cnn_v2.py b/cnn_v2/training/train_cnn_v2.py
index 9e5df2f..9e5df2f 100755
--- a/training/train_cnn_v2.py
+++ b/cnn_v2/training/train_cnn_v2.py
diff --git a/doc/HOWTO.md b/doc/HOWTO.md
index 0dc9ec7..a309b27 100644
--- a/doc/HOWTO.md
+++ b/doc/HOWTO.md
@@ -145,31 +145,31 @@ Enhanced CNN with parametric static features (7D input: RGBD + UV + sin encoding
**Complete Pipeline** (recommended):
```bash
# Train → Export → Build → Validate (default config)
-./scripts/train_cnn_v2_full.sh
+./cnn_v2/scripts/train_cnn_v2_full.sh
# Rapid debug (1 layer, 3×3, 5 epochs)
-./scripts/train_cnn_v2_full.sh --num-layers 1 --kernel-sizes 3 --epochs 5 --output-weights test.bin
+./cnn_v2/scripts/train_cnn_v2_full.sh --num-layers 1 --kernel-sizes 3 --epochs 5 --output-weights test.bin
# Custom training parameters
-./scripts/train_cnn_v2_full.sh --epochs 500 --batch-size 32 --checkpoint-every 100
+./cnn_v2/scripts/train_cnn_v2_full.sh --epochs 500 --batch-size 32 --checkpoint-every 100
# Custom architecture
-./scripts/train_cnn_v2_full.sh --kernel-sizes 3,5,3 --num-layers 3 --mip-level 1
+./cnn_v2/scripts/train_cnn_v2_full.sh --kernel-sizes 3,5,3 --num-layers 3 --mip-level 1
# Custom output path
-./scripts/train_cnn_v2_full.sh --output-weights workspaces/test/cnn_weights.bin
+./cnn_v2/scripts/train_cnn_v2_full.sh --output-weights workspaces/test/cnn_weights.bin
# Grayscale loss (compute loss on luminance instead of RGBA)
-./scripts/train_cnn_v2_full.sh --grayscale-loss
+./cnn_v2/scripts/train_cnn_v2_full.sh --grayscale-loss
# Custom directories
-./scripts/train_cnn_v2_full.sh --input training/input --target training/target_2
+./cnn_v2/scripts/train_cnn_v2_full.sh --input training/input --target training/target_2
# Full-image mode (instead of patch-based)
-./scripts/train_cnn_v2_full.sh --full-image --image-size 256
+./cnn_v2/scripts/train_cnn_v2_full.sh --full-image --image-size 256
# See all options
-./scripts/train_cnn_v2_full.sh --help
+./cnn_v2/scripts/train_cnn_v2_full.sh --help
```
**Defaults:** 200 epochs, 3×3 kernels, 8→4→4 channels, batch-size 16, patch-based (8×8, harris detector).
@@ -184,33 +184,33 @@ Enhanced CNN with parametric static features (7D input: RGBD + UV + sin encoding
**Validation Only** (skip training):
```bash
# Use latest checkpoint
-./scripts/train_cnn_v2_full.sh --validate
+./cnn_v2/scripts/train_cnn_v2_full.sh --validate
# Use specific checkpoint
-./scripts/train_cnn_v2_full.sh --validate checkpoints/checkpoint_epoch_50.pth
+./cnn_v2/scripts/train_cnn_v2_full.sh --validate checkpoints/checkpoint_epoch_50.pth
```
**Manual Training:**
```bash
# Default config
-./training/train_cnn_v2.py \
+./cnn_v2/training/train_cnn_v2.py \
--input training/input/ --target training/target_2/ \
--epochs 100 --batch-size 16 --checkpoint-every 5
# Custom architecture (per-layer kernel sizes)
-./training/train_cnn_v2.py \
+./cnn_v2/training/train_cnn_v2.py \
--input training/input/ --target training/target_2/ \
--kernel-sizes 1,3,5 \
--epochs 5000 --batch-size 16
# Mip-level for p0-p3 features (0=original, 1=half, 2=quarter, 3=eighth)
-./training/train_cnn_v2.py \
+./cnn_v2/training/train_cnn_v2.py \
--input training/input/ --target training/target_2/ \
--mip-level 1 \
--epochs 100 --batch-size 16
# Grayscale loss (compute loss on luminance Y = 0.299*R + 0.587*G + 0.114*B)
-./training/train_cnn_v2.py \
+./cnn_v2/training/train_cnn_v2.py \
--input training/input/ --target training/target_2/ \
--grayscale-loss \
--epochs 100 --batch-size 16
@@ -236,7 +236,7 @@ Use `--quiet` for streamlined output in scripts (used automatically by train_cnn
```
-**Validation:** Use HTML tool (`tools/cnn_v2_test/index.html`) for CNN v2 validation. See `doc/CNN_V2_WEB_TOOL.md`.
+**Validation:** Use HTML tool (`cnn_v2/tools/cnn_v2_test/index.html`) for CNN v2 validation. See `cnn_v2/docs/CNN_V2_WEB_TOOL.md`.
---
diff --git a/src/app/test_demo.cc b/src/app/test_demo.cc
index 5775e74..f512a5f 100644
--- a/src/app/test_demo.cc
+++ b/src/app/test_demo.cc
@@ -21,7 +21,7 @@ extern void LoadTimeline(MainSequence& main_seq, const GpuContext& ctx);
// Inline peak meter effect for debugging audio-visual sync
#include "effects/cnn_effect.h"
-#include "effects/cnn_v2_effect.h"
+#include "../../cnn_v2/src/cnn_v2_effect.h"
#include "gpu/post_process_helper.h"
#include "gpu/shader_composer.h"
diff --git a/src/gpu/demo_effects.h b/src/gpu/demo_effects.h
index d4df20b..60ca581 100644
--- a/src/gpu/demo_effects.h
+++ b/src/gpu/demo_effects.h
@@ -19,7 +19,7 @@
#include "effects/chroma_aberration_effect.h"
#include "effects/circle_mask_effect.h"
#include "effects/cnn_effect.h"
-#include "effects/cnn_v2_effect.h"
+#include "../../cnn_v2/src/cnn_v2_effect.h"
#include "effects/distort_effect.h"
#include "effects/fade_effect.h"
#include "effects/flash_cube_effect.h"
diff --git a/workspaces/main/assets.txt b/workspaces/main/assets.txt
index 972cc8b..e1cf2bc 100644
--- a/workspaces/main/assets.txt
+++ b/workspaces/main/assets.txt
@@ -44,9 +44,9 @@ SHADER_CNN_CONV5X5, NONE, shaders/cnn/cnn_conv5x5.wgsl, "CNN 5x5 Convolution"
SHADER_CNN_CONV7X7, NONE, shaders/cnn/cnn_conv7x7.wgsl, "CNN 7x7 Convolution"
SHADER_CNN_WEIGHTS, NONE, shaders/cnn/cnn_weights_generated.wgsl, "CNN Weights (Generated)"
SHADER_CNN_LAYER, NONE, shaders/cnn/cnn_layer.wgsl, "CNN Layer Shader"
-SHADER_CNN_V2_STATIC, NONE, shaders/cnn_v2/cnn_v2_static.wgsl, "CNN v2 Static Features"
-SHADER_CNN_V2_COMPUTE, NONE, shaders/cnn_v2/cnn_v2_compute.wgsl, "CNN v2 Compute (Storage Buffer)"
-WEIGHTS_CNN_V2, NONE, weights/cnn_v2_weights.bin, "CNN v2 Binary Weights"
+SHADER_CNN_V2_STATIC, NONE, ../../cnn_v2/shaders/cnn_v2_static.wgsl, "CNN v2 Static Features"
+SHADER_CNN_V2_COMPUTE, NONE, ../../cnn_v2/shaders/cnn_v2_compute.wgsl, "CNN v2 Compute (Storage Buffer)"
+WEIGHTS_CNN_V2, NONE, ../../cnn_v2/weights/cnn_v2_weights.bin, "CNN v2 Binary Weights"
SHADER_SOLARIZE, NONE, shaders/solarize.wgsl, "Solarize Shader"
SHADER_DISTORT, NONE, shaders/distort.wgsl, "Distort Shader"
SHADER_CHROMA_ABERRATION, NONE, shaders/chroma_aberration.wgsl, "Chroma Aberration Shader"