cluster4npu/example_postprocess_options.py
Mason d90d9d6783 feat: Add default postprocess options with fire detection and bounding box support
- Implement PostProcessorOptions system with built-in postprocessing types (fire detection, YOLO v3/v5, classification, raw output)
- Add fire detection as default option maintaining backward compatibility
- Support YOLO v3/v5 object detection with bounding box visualization in live view windows
- Integrate text output with confidence scores and visual indicators for all postprocess types
- Update exact nodes postprocess_node.py to configure postprocessing through UI properties
- Add comprehensive example demonstrating all available postprocessing options and usage patterns
- Enhance WebcamInferenceRunner with dynamic visualization based on result types

Technical improvements:
- Created PostProcessType enum and PostProcessorOptions configuration class
- Built-in postprocessing eliminates external dependencies on Kneron Default examples
- Added BoundingBox, ObjectDetectionResult, and ClassificationResult data structures
- Enhanced live view with color-coded confidence bars and object detection overlays
- Integrated postprocessing options into MultiDongle constructor and exact nodes system

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-18 16:42:26 +08:00

141 lines
4.7 KiB
Python

#!/usr/bin/env python3
"""
Example demonstrating the new default postprocess options in the app.
This script shows how to use the different postprocessing types:
- Fire detection (classification)
- YOLO v3/v5 (object detection with bounding boxes)
- General classification
- Raw output
The postprocessing options are built-in to the app and provide text output
and bounding box visualization in live view windows.
"""
import sys
import os
# Add the project root to Python path
sys.path.insert(0, os.path.dirname(__file__))
from core.functions.Multidongle import (
MultiDongle,
PostProcessorOptions,
PostProcessType,
WebcamInferenceRunner
)
def demo_fire_detection():
"""Demo fire detection postprocessing (default)"""
print("=== Fire Detection Demo ===")
# Configure for fire detection
options = PostProcessorOptions(
postprocess_type=PostProcessType.FIRE_DETECTION,
threshold=0.5,
class_names=["No Fire", "Fire"]
)
print(f"Postprocess type: {options.postprocess_type.value}")
print(f"Threshold: {options.threshold}")
print(f"Class names: {options.class_names}")
return options
def demo_yolo_object_detection():
"""Demo YOLO object detection with bounding boxes"""
print("=== YOLO Object Detection Demo ===")
# Configure for YOLO v5 object detection
options = PostProcessorOptions(
postprocess_type=PostProcessType.YOLO_V5,
threshold=0.3,
class_names=["person", "bicycle", "car", "motorbike", "aeroplane", "bus", "train", "truck"],
nms_threshold=0.5,
max_detections_per_class=50
)
print(f"Postprocess type: {options.postprocess_type.value}")
print(f"Detection threshold: {options.threshold}")
print(f"NMS threshold: {options.nms_threshold}")
print(f"Class names: {options.class_names[:5]}...") # Show first 5
return options
def demo_general_classification():
"""Demo general classification"""
print("=== General Classification Demo ===")
# Configure for general classification
options = PostProcessorOptions(
postprocess_type=PostProcessType.CLASSIFICATION,
threshold=0.6,
class_names=["cat", "dog", "bird", "fish", "horse"]
)
print(f"Postprocess type: {options.postprocess_type.value}")
print(f"Threshold: {options.threshold}")
print(f"Class names: {options.class_names}")
return options
def main():
"""Main demo function"""
print("Default Postprocess Options Demo")
print("=" * 40)
# Demo different postprocessing options
fire_options = demo_fire_detection()
print()
yolo_options = demo_yolo_object_detection()
print()
classification_options = demo_general_classification()
print()
# Example of how to initialize MultiDongle with options
print("=== MultiDongle Integration Example ===")
# NOTE: Update these paths according to your setup
PORT_IDS = [28, 32] # Update with your device port IDs
SCPU_FW = 'fw_scpu.bin' # Update with your firmware path
NCPU_FW = 'fw_ncpu.bin' # Update with your firmware path
MODEL_PATH = 'your_model.nef' # Update with your model path
try:
# Example 1: Fire detection (default)
print("Initializing with fire detection...")
multidongle_fire = MultiDongle(
port_id=PORT_IDS,
scpu_fw_path=SCPU_FW,
ncpu_fw_path=NCPU_FW,
model_path=MODEL_PATH,
upload_fw=False, # Set to True if you need firmware upload
postprocess_options=fire_options
)
print(f"✓ Fire detection configured: {multidongle_fire.postprocess_options.postprocess_type.value}")
# Example 2: Change postprocessing options dynamically
print("Changing to YOLO detection...")
multidongle_fire.set_postprocess_options(yolo_options)
print(f"✓ YOLO detection configured: {multidongle_fire.postprocess_options.postprocess_type.value}")
# Example 3: Get available types
available_types = multidongle_fire.get_available_postprocess_types()
print(f"Available postprocess types: {[t.value for t in available_types]}")
except Exception as e:
print(f"Note: MultiDongle initialization skipped (no hardware): {e}")
print("\n=== Usage Notes ===")
print("1. Fire detection option is set as default")
print("2. Text output shows classification results with probabilities")
print("3. Bounding box output visualizes detected objects in live view")
print("4. All postprocessing is built-in to the app (no external dependencies)")
print("5. Exact nodes can configure postprocessing through UI properties")
if __name__ == "__main__":
main()