summaryrefslogtreecommitdiff
path: root/scripts
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 /scripts
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>
Diffstat (limited to 'scripts')
-rwxr-xr-xscripts/train_cnn_v2_full.sh424
1 files changed, 0 insertions, 424 deletions
diff --git a/scripts/train_cnn_v2_full.sh b/scripts/train_cnn_v2_full.sh
deleted file mode 100755
index 078ea28..0000000
--- a/scripts/train_cnn_v2_full.sh
+++ /dev/null
@@ -1,424 +0,0 @@
-#!/bin/bash
-# Complete CNN v2 Training Pipeline
-# Train → Export → Build → Validate
-# Usage: ./train_cnn_v2_full.sh [OPTIONS]
-#
-# MODES:
-# (none) Run complete pipeline: train → export → build → validate
-# --validate Validate only (skip training, use existing weights)
-# --validate CHECKPOINT Validate with specific checkpoint file
-# --export-only CHECKPOINT Export weights only (skip training, build, validation)
-#
-# TRAINING PARAMETERS:
-# --epochs N Training epochs (default: 200)
-# --batch-size N Batch size (default: 16)
-# --lr FLOAT Learning rate (default: 1e-3)
-# --checkpoint-every N Checkpoint interval (default: 50)
-# --kernel-sizes K Comma-separated kernel sizes (default: 3,3,3)
-# --num-layers N Number of layers (default: 3)
-# --mip-level N Mip level for p0-p3 features: 0-3 (default: 0)
-# --grayscale-loss Compute loss on grayscale instead of RGBA
-#
-# PATCH PARAMETERS:
-# --patch-size N Patch size (default: 8)
-# --patches-per-image N Patches per image (default: 256)
-# --detector TYPE Detector: harris|fast|shi-tomasi|gradient (default: harris)
-# --full-image Use full-image training (disables patch mode)
-# --image-size N Image size for full-image mode (default: 256)
-#
-# DIRECTORIES:
-# --input DIR Input directory (default: training/input)
-# --target DIR Target directory (default: training/target_1)
-# --checkpoint-dir DIR Checkpoint directory (default: checkpoints)
-# --validation-dir DIR Validation directory (default: validation_results)
-#
-# OUTPUT:
-# --output-weights PATH Output binary weights file (default: workspaces/main/weights/cnn_v2_weights.bin)
-#
-# OTHER:
-# --help Show this help message
-#
-# Examples:
-# ./train_cnn_v2_full.sh
-# ./train_cnn_v2_full.sh --epochs 500 --batch-size 32
-# ./train_cnn_v2_full.sh --validate
-# ./train_cnn_v2_full.sh --validate checkpoints/checkpoint_epoch_50.pth
-# ./train_cnn_v2_full.sh --export-only checkpoints/checkpoint_epoch_100.pth
-# ./train_cnn_v2_full.sh --mip-level 1 --kernel-sizes 3,5,3
-
-set -e
-
-PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
-cd "$PROJECT_ROOT"
-
-# Helper functions
-export_weights() {
- python3 training/export_cnn_v2_weights.py "$1" --output-weights "$2" --quiet
-}
-
-find_latest_checkpoint() {
- ls -t "$CHECKPOINT_DIR"/checkpoint_epoch_*.pth 2>/dev/null | head -1
-}
-
-build_target() {
- cmake --build build -j4 --target "$1" > /dev/null 2>&1
-}
-
-# Default configuration
-INPUT_DIR="training/input"
-TARGET_DIR="training/target_1"
-CHECKPOINT_DIR="checkpoints"
-VALIDATION_DIR="validation_results"
-EPOCHS=200
-CHECKPOINT_EVERY=50
-BATCH_SIZE=16
-LEARNING_RATE=1e-3
-PATCH_SIZE=8
-PATCHES_PER_IMAGE=256
-DETECTOR="harris"
-KERNEL_SIZES="3,3,3"
-NUM_LAYERS=3
-MIP_LEVEL=0
-GRAYSCALE_LOSS=false
-FULL_IMAGE_MODE=false
-IMAGE_SIZE=256
-OUTPUT_WEIGHTS="workspaces/main/weights/cnn_v2_weights.bin"
-
-# Parse arguments
-VALIDATE_ONLY=false
-VALIDATE_CHECKPOINT=""
-EXPORT_ONLY=false
-EXPORT_CHECKPOINT=""
-
-if [ "$1" = "--help" ] || [ "$1" = "-h" ]; then
- head -47 "$0" | grep "^#" | grep -v "^#!/" | sed 's/^# *//'
- exit 0
-fi
-
-# Parse all arguments
-while [[ $# -gt 0 ]]; do
- case "$1" in
- --export-only)
- EXPORT_ONLY=true
- if [ -z "$2" ]; then
- echo "Error: --export-only requires a checkpoint file argument"
- exit 1
- fi
- EXPORT_CHECKPOINT="$2"
- shift 2
- ;;
- --validate)
- VALIDATE_ONLY=true
- if [ -n "$2" ] && [[ ! "$2" =~ ^-- ]]; then
- VALIDATE_CHECKPOINT="$2"
- shift 2
- else
- shift
- fi
- ;;
- --epochs)
- if [ -z "$2" ]; then
- echo "Error: --epochs requires a number argument"
- exit 1
- fi
- EPOCHS="$2"
- shift 2
- ;;
- --batch-size)
- if [ -z "$2" ]; then
- echo "Error: --batch-size requires a number argument"
- exit 1
- fi
- BATCH_SIZE="$2"
- shift 2
- ;;
- --checkpoint-every)
- if [ -z "$2" ]; then
- echo "Error: --checkpoint-every requires a number argument"
- exit 1
- fi
- CHECKPOINT_EVERY="$2"
- shift 2
- ;;
- --kernel-sizes)
- if [ -z "$2" ]; then
- echo "Error: --kernel-sizes requires a comma-separated list"
- exit 1
- fi
- KERNEL_SIZES="$2"
- shift 2
- ;;
- --num-layers)
- if [ -z "$2" ]; then
- echo "Error: --num-layers requires a number argument"
- exit 1
- fi
- NUM_LAYERS="$2"
- shift 2
- ;;
- --mip-level)
- if [ -z "$2" ]; then
- echo "Error: --mip-level requires a level argument (0-3)"
- exit 1
- fi
- MIP_LEVEL="$2"
- shift 2
- ;;
- --grayscale-loss)
- GRAYSCALE_LOSS=true
- shift
- ;;
- --lr)
- if [ -z "$2" ]; then
- echo "Error: --lr requires a float argument"
- exit 1
- fi
- LEARNING_RATE="$2"
- shift 2
- ;;
- --patch-size)
- if [ -z "$2" ]; then
- echo "Error: --patch-size requires a number argument"
- exit 1
- fi
- PATCH_SIZE="$2"
- shift 2
- ;;
- --patches-per-image)
- if [ -z "$2" ]; then
- echo "Error: --patches-per-image requires a number argument"
- exit 1
- fi
- PATCHES_PER_IMAGE="$2"
- shift 2
- ;;
- --detector)
- if [ -z "$2" ]; then
- echo "Error: --detector requires a type argument"
- exit 1
- fi
- DETECTOR="$2"
- shift 2
- ;;
- --full-image)
- FULL_IMAGE_MODE=true
- shift
- ;;
- --image-size)
- if [ -z "$2" ]; then
- echo "Error: --image-size requires a number argument"
- exit 1
- fi
- IMAGE_SIZE="$2"
- shift 2
- ;;
- --input)
- if [ -z "$2" ]; then
- echo "Error: --input requires a directory argument"
- exit 1
- fi
- INPUT_DIR="$2"
- shift 2
- ;;
- --target)
- if [ -z "$2" ]; then
- echo "Error: --target requires a directory argument"
- exit 1
- fi
- TARGET_DIR="$2"
- shift 2
- ;;
- --checkpoint-dir)
- if [ -z "$2" ]; then
- echo "Error: --checkpoint-dir requires a directory argument"
- exit 1
- fi
- CHECKPOINT_DIR="$2"
- shift 2
- ;;
- --validation-dir)
- if [ -z "$2" ]; then
- echo "Error: --validation-dir requires a directory argument"
- exit 1
- fi
- VALIDATION_DIR="$2"
- shift 2
- ;;
- --output-weights)
- if [ -z "$2" ]; then
- echo "Error: --output-weights requires a file path argument"
- exit 1
- fi
- OUTPUT_WEIGHTS="$2"
- shift 2
- ;;
- *)
- echo "Unknown option: $1"
- exit 1
- ;;
- esac
-done
-
-# Build training arguments
-if [ "$FULL_IMAGE_MODE" = true ]; then
- TRAINING_MODE_ARGS="--full-image --image-size $IMAGE_SIZE"
-else
- TRAINING_MODE_ARGS="--patch-size $PATCH_SIZE --patches-per-image $PATCHES_PER_IMAGE --detector $DETECTOR"
-fi
-
-# Handle export-only mode
-if [ "$EXPORT_ONLY" = true ]; then
- echo "=== CNN v2 Export Weights Only ==="
- echo "Checkpoint: $EXPORT_CHECKPOINT"
- echo ""
-
- if [ ! -f "$EXPORT_CHECKPOINT" ]; then
- echo "Error: Checkpoint file not found: $EXPORT_CHECKPOINT"
- exit 1
- fi
-
- export_weights "$EXPORT_CHECKPOINT" "$OUTPUT_WEIGHTS" || {
- echo "Error: Export failed"
- exit 1
- }
-
- echo ""
- echo "=== Export Complete ==="
- echo "Output: $OUTPUT_WEIGHTS"
- exit 0
-fi
-
-if [ "$VALIDATE_ONLY" = true ]; then
- echo "=== CNN v2 Validation Only ==="
- echo "Skipping training, using existing weights"
- echo ""
-else
- echo "=== CNN v2 Complete Training Pipeline ==="
- echo "Input: $INPUT_DIR"
- echo "Target: $TARGET_DIR"
- echo "Epochs: $EPOCHS"
- echo "Checkpoint interval: $CHECKPOINT_EVERY"
- echo "Mip level: $MIP_LEVEL (p0-p3 features)"
- echo ""
-fi
-
-if [ "$VALIDATE_ONLY" = false ]; then
- # Step 1: Train model
- echo "[1/4] Training CNN v2 model..."
-
-python3 training/train_cnn_v2.py \
- --input "$INPUT_DIR" \
- --target "$TARGET_DIR" \
- $TRAINING_MODE_ARGS \
- --kernel-sizes "$KERNEL_SIZES" \
- --num-layers "$NUM_LAYERS" \
- --mip-level "$MIP_LEVEL" \
- --epochs "$EPOCHS" \
- --batch-size "$BATCH_SIZE" \
- --lr "$LEARNING_RATE" \
- --checkpoint-dir "$CHECKPOINT_DIR" \
- --checkpoint-every "$CHECKPOINT_EVERY" \
- $([ "$GRAYSCALE_LOSS" = true ] && echo "--grayscale-loss")
-
-if [ $? -ne 0 ]; then
- echo "Error: Training failed"
- exit 1
-fi
-
-echo ""
-echo "Training complete!"
-echo ""
-
-# Step 2: Export final checkpoint to shaders
-FINAL_CHECKPOINT="$CHECKPOINT_DIR/checkpoint_epoch_${EPOCHS}.pth"
-
-if [ ! -f "$FINAL_CHECKPOINT" ]; then
- echo "Warning: Final checkpoint not found, using latest available..."
- FINAL_CHECKPOINT=$(find_latest_checkpoint)
-fi
-
-if [ -z "$FINAL_CHECKPOINT" ] || [ ! -f "$FINAL_CHECKPOINT" ]; then
- echo "Error: No checkpoint found in $CHECKPOINT_DIR"
- exit 1
-fi
-
-echo "[2/4] Exporting final checkpoint to binary weights..."
-echo "Checkpoint: $FINAL_CHECKPOINT"
-export_weights "$FINAL_CHECKPOINT" "$OUTPUT_WEIGHTS" || {
- echo "Error: Shader export failed"
- exit 1
-}
-
-echo ""
-fi # End of training/export section
-
-# Determine which checkpoint to use
-if [ "$VALIDATE_ONLY" = true ]; then
- FINAL_CHECKPOINT="${VALIDATE_CHECKPOINT:-$(find_latest_checkpoint)}"
- echo "Using checkpoint: $FINAL_CHECKPOINT"
- echo ""
-fi
-
-# Step 3: Rebuild with new shaders
-if [ "$VALIDATE_ONLY" = false ]; then
- echo "[3/4] Rebuilding demo with new shaders..."
- build_target demo64k || {
- echo "Error: Build failed"
- exit 1
- }
- echo " → Build complete"
- echo ""
-fi
-
-# Step 4: Visual assessment - process final checkpoint only
-if [ "$VALIDATE_ONLY" = true ]; then
- echo "Validation on all input images (using existing weights)..."
-else
- echo "[4/4] Visual assessment on all input images..."
-fi
-
-mkdir -p "$VALIDATION_DIR"
-echo " Using checkpoint: $FINAL_CHECKPOINT"
-
-# Export weights for validation mode (already exported in step 2 for training mode)
-if [ "$VALIDATE_ONLY" = true ]; then
- export_weights "$FINAL_CHECKPOINT" "$OUTPUT_WEIGHTS" > /dev/null 2>&1
-fi
-
-# Build cnn_test
-build_target cnn_test
-
-# Process all input images
-echo -n " Processing images: "
-for input_image in "$INPUT_DIR"/*.png; do
- basename=$(basename "$input_image" .png)
- echo -n "$basename "
- build/cnn_test "$input_image" "$VALIDATION_DIR/${basename}_output.png" --weights "$OUTPUT_WEIGHTS" > /dev/null 2>&1
-done
-echo "✓"
-
-# Build demo only if not in validate mode
-[ "$VALIDATE_ONLY" = false ] && build_target demo64k
-
-echo ""
-if [ "$VALIDATE_ONLY" = true ]; then
- echo "=== Validation Complete ==="
-else
- echo "=== Training Pipeline Complete ==="
-fi
-echo ""
-echo "Results:"
-if [ "$VALIDATE_ONLY" = false ]; then
- echo " - Checkpoints: $CHECKPOINT_DIR"
- echo " - Final weights: $OUTPUT_WEIGHTS"
-fi
-echo " - Validation outputs: $VALIDATION_DIR"
-echo ""
-echo "Opening results directory..."
-open "$VALIDATION_DIR" 2>/dev/null || xdg-open "$VALIDATION_DIR" 2>/dev/null || true
-
-if [ "$VALIDATE_ONLY" = false ]; then
- echo ""
- echo "Run demo to see final result:"
- echo " ./build/demo64k"
-fi