KNEO Academy v2.0

這個應用程式是一個基於 Python、PyQt5、OpenCV 以及 Kneron SDKkp開發的 AI 應用 APP使用者可以透過鏡頭、麥克風或上傳的方式經由 Kneron NPU 裝置進行實時運算。

目錄

安裝設定

  • Install python 3.12 and kneron plus
# This shell script only install Kneron plus
cd ./external/kneron_plus_{version}/package/{platform}/
pip install KneronPLUS-{version}-py3-none-any.whl

# if the above command doesn't work
pip install --force-reinstall KneronPLUS-{version}-py3-none-any.whl
  • PyQT5 and other packages
pip install PyQt5 opencv-python pyinstaller pyarmor
  • test APP in local
python main.py

專案架構

project/
├── main.py                     # Application entry point
├── src/
│   ├── config.py               # Global configuration and constants
│   ├── controllers/
│   │   ├── device_controller.py    # Device connection management
│   │   ├── inference_controller.py # AI inference control
│   │   └── media_controller.py     # Camera and media operations
│   ├── models/
│   │   ├── inference_worker.py     # Standard inference worker thread
│   │   ├── custom_inference_worker.py # Custom model inference worker
│   │   └── video_thread.py         # Video capture thread
│   ├── views/
│   │   ├── mainWindows.py          # Main application window
│   │   ├── selection_screen.py     # App selection screen
│   │   ├── login_screen.py         # Login screen
│   │   ├── utilities_screen.py     # Device utilities screen
│   │   └── components/
│   │       ├── canvas_area.py      # Video display canvas
│   │       ├── custom_model_block.py # Custom model upload UI
│   │       ├── device_list.py      # Device list component
│   │       ├── device_popup.py     # Device connection popup
│   │       ├── media_panel.py      # Media control buttons
│   │       └── toolbox.py          # AI toolbox component
│   ├── services/
│   │   ├── device_service.py       # Device scanning service
│   │   ├── file_service.py         # File upload service
│   │   └── script_service.py       # Script execution service
│   └── utils/
│       ├── config_utils.py         # Configuration utilities
│       └── image_utils.py          # Image conversion utilities
├── uxui/                       # UI assets (icons, images)
└── tests/
    ├── unit/
    └── integration/

Data Directories (in %LOCALAPPDATA%/Kneron_Academy/)

upload/                         # Uploaded photos, videos, or audio files
utils/
    ├── config.json             # Global plugin configuration
    └── {mode}/
        └── {model}/
            ├── script.py       # Inference script
            ├── config.json     # Model configuration
            └── *.nef           # Model file(s)
firmware/
    └── {device}/
        ├── fw_scpu.bin
        ├── fw_ncpu.bin
        └── VERSION

功能概述

  • Video 模式:啟動相機持續捕捉影像,並將每一幀以 NumPy 陣列格式傳入推論模組進行即時推論。
  • Image 模式:使用者上傳圖片後,讀取圖片並將其以 NumPy 陣列格式放入推論佇列,僅進行一次推論。
  • Custom Model:使用者可上傳自己的 .nef 模型和 firmware 檔案進行推論。

輸入資料格式

相機影像

  • 捕捉方式:使用 OpenCV 從相機捕捉影像。
  • 轉換流程
    1. 影像先以 QImage 格式傳回。
    2. 透過 qimage_to_numpy(qimage) 函式轉換為 NumPy 陣列。
  • 格式NumPy 陣列,形狀為 (height, width, 3),通道順序為 RGB888。

上傳圖片

  • 讀取方式:使用 OpenCV 的 cv2.imread() 讀取上傳的圖片。
  • 格式:產生的圖片也是一個 NumPy 陣列(通常是 BGR 格式),後續推論模組可進一步進行預處理轉換。

參數傳遞與設定

input_params 的組成

主應用程式會組合一個 input_params 字典,並將該字典傳遞給推論模組。此字典中可能包含以下鍵值:

  • usb_port_id:選取的 dongle 的 USB port ID。
  • fw_folder:全域 Firmware 資料夾路徑FW_DIR
  • scpu_pathncpu_path:根據選取的 dongle 型號,組合出的 firmware 檔案路徑。
  • file_path上傳圖片的完整路徑image/voice 模式下使用)。
  • model:從工具配置中讀取的模型檔案名稱,經由路徑組合後形成完整的模型路徑。

範例

{
    "usb_port_id": 32,
    "scpu_path": "C:\\...\\firmware\\KL520\\fw_scpu.bin",
    "ncpu_path": "C:\\...\\firmware\\KL520\\fw_ncpu.bin",
    "fw_folder": "C:\\...\\firmware",
    "file_path": "C:\\...\\uploads\\fire5.jpeg",
    "model": "src\\utils\\models\\fire_detection_520.nef"
}

APP 打包

目前是使用 Pyinstaller 來進行打包的動作 可以根據以下的指令進行打包

下方的add-data需要根據你要包入的資料設定最後一個則是需要把 kp 包進 exe 檔中,需要去 conda 的 env 資料夾中找對應的 kp\lib 資料夾

pyinstaller --onefile --windowed main.py --additional-hooks-dir=hooks --add-data "uxui;uxui" --add-data "src;src" --add-data "C:\Users\mason\miniconda3\envs\resnet\Lib\site-packages\kp\lib;kp\lib"

APP資料加密

目前預計使用 pyarmor 進行加密

Script & Model 的設定

整個 utils folder 會分成兩層: global config 和 model config

model config 範例如下

{
  "display_name": "人臉偵測 (ResNet-18)",
  "description": "使用ResNet-18架構的高精度人臉偵測模型可即時標記影像中的人臉位置",
  "model_file": "face_detection.nef",
  "input_info": {
    "type": "video",
    "supported_formats": ["mp4", "avi", "webm"]
  },
  "input_parameters": {
    "threshold": 0.75,
    "max_faces": 10,
    "tracking": true
  },
  "compatible_devices": ["KL520", "KL720"]
}

global config 範例如下

{
  "plugins": [
    {
      "mode": "face_recognition",
      "display_name": "人臉辨識",
      "models": [
        {
          "name": "face_detection",
          "display_name": "人臉偵測 (ResNet-18)",
          "description": "基於ResNet-18的高精度人臉偵測",
          "compatible_devices": ["KL520", "KL720"]
        },
        {
          "name": "age_gender",
          "display_name": "年齡性別辨識 (VGG-Face)",
          "description": "使用VGG-Face架構辨識人臉年齡與性別",
          "compatible_devices": ["KL520", "KL720"]
        }
      ]
    },
    {
      "mode": "object_detection",
      "display_name": "物體偵測",
      "models": [
        {
          "name": "yolo_v5",
          "display_name": "物體偵測 (YOLOv5)",
          "description": "使用YOLOv5進行實時物體偵測與分類",
          "compatible_devices": ["KL720"]
        },
        {
          "name": "rcnn",
          "display_name": "精確物體識別 (Faster R-CNN)",
          "description": "以Faster R-CNN為基礎的高精度物體識別",
          "compatible_devices": ["KL720"]
        }
      ]
    }
  ]
}

Bounding Boxes 格式

{
  "num_boxes": 2,
  "bounding boxes": [[x1, y1, x2, y2], [x3, y3, x4, y4]],
  "results": ["label1", "label2"]
}
Description
No description provided
Readme 142 MiB
Languages
Python 100%