Compare commits

...

3 Commits

Author SHA1 Message Date
GaryHuang-ASUS
170738bd5b [Update] Add synaptics ci workflow 2025-09-26 12:38:36 +08:00
GaryHuang-ASUS
7a575a90bf [Update] Update synaptics detector coding format 2025-09-26 12:15:50 +08:00
GaryHuang-ASUS
f2df550a2a [Update] Update detector script coding format 2025-09-26 12:01:00 +08:00
2 changed files with 44 additions and 18 deletions

View File

@ -173,6 +173,31 @@ jobs:
set: | set: |
rk.tags=${{ steps.setup.outputs.image-name }}-rk rk.tags=${{ steps.setup.outputs.image-name }}-rk
*.cache-from=type=gha *.cache-from=type=gha
synaptics_build:
runs-on: ubuntu-22.04-arm
name: Synaptics Build
needs:
- arm64_build
steps:
- name: Check out code
uses: actions/checkout@v5
with:
persist-credentials: false
- name: Set up QEMU and Buildx
id: setup
uses: ./.github/actions/setup
with:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push Synaptics build
uses: docker/bake-action@v6
with:
source: .
push: true
targets: synaptics
files: docker/synaptics/synaptics.hcl
set: |
synaptics.tags=${{ steps.setup.outputs.image-name }}-synaptics
*.cache-from=type=gha
# The majority of users running arm64 are rpi users, so the rpi # The majority of users running arm64 are rpi users, so the rpi
# build should be the primary arm64 image # build should be the primary arm64 image
assemble_default_build: assemble_default_build:

View File

@ -1,16 +1,19 @@
import os
import logging import logging
import os
from typing_extensions import Literal
import numpy as np import numpy as np
from synap import Network from synap import Network
from synap.types import Shape, Layout
from synap.preprocessor import Preprocessor
from synap.postprocessor import Detector from synap.postprocessor import Detector
from synap.preprocessor import Preprocessor
from synap.types import Layout, Shape
from typing_extensions import Literal
from frigate.detectors.detection_api import DetectionApi from frigate.detectors.detection_api import DetectionApi
from frigate.detectors.detector_config import BaseDetectorConfig, ModelTypeEnum, InputTensorEnum from frigate.detectors.detector_config import (
BaseDetectorConfig,
InputTensorEnum,
ModelTypeEnum,
)
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -20,6 +23,7 @@ DETECTOR_KEY = "synaptics"
class SynapDetectorConfig(BaseDetectorConfig): class SynapDetectorConfig(BaseDetectorConfig):
type: Literal[DETECTOR_KEY] type: Literal[DETECTOR_KEY]
class SynapDetector(DetectionApi): class SynapDetector(DetectionApi):
type_key = DETECTOR_KEY type_key = DETECTOR_KEY
@ -37,7 +41,7 @@ class SynapDetector(DetectionApi):
except Exception as e: except Exception as e:
logger.error(f"Failed to init Synap NPU: {e}") logger.error(f"Failed to init Synap NPU: {e}")
raise raise
self.width = detector_config.model.width self.width = detector_config.model.width
self.height = detector_config.model.height self.height = detector_config.model.height
self.model_type = detector_config.model.model_type self.model_type = detector_config.model.model_type
@ -52,28 +56,28 @@ class SynapDetector(DetectionApi):
def detect_raw(self, tensor_input: np.ndarray): def detect_raw(self, tensor_input: np.ndarray):
# It has only been testing for pre-converted mobilenet80 .tflite -> .synap model currently # It has only been testing for pre-converted mobilenet80 .tflite -> .synap model currently
layout = Layout.nhwc # default layout layout = Layout.nhwc # default layout
detections = np.zeros((20, 6), np.float32)
if self.input_tensor_layout == InputTensorEnum.nhwc: if self.input_tensor_layout == InputTensorEnum.nhwc:
layout = Layout.nhwc layout = Layout.nhwc
postprocess_data = self.preprocessor.assign(self.network.inputs, tensor_input, Shape(tensor_input.shape), layout) postprocess_data = self.preprocessor.assign(
self.network.inputs, tensor_input, Shape(tensor_input.shape), layout
)
output_tensor_obj = self.network.predict() output_tensor_obj = self.network.predict()
output = self.detector.process(output_tensor_obj, postprocess_data) output = self.detector.process(output_tensor_obj, postprocess_data)
if self.model_type == ModelTypeEnum.ssd: if self.model_type == ModelTypeEnum.ssd:
detections = np.zeros((20, 6), np.float32)
for i, item in enumerate(output.items): for i, item in enumerate(output.items):
if i == 20: if i == 20:
break break
bb = item.bounding_box bb = item.bounding_box
# Convert corner coordinates to normalized [0,1] range # Convert corner coordinates to normalized [0,1] range
x1 = bb.origin.x / self.width # Top-left X x1 = bb.origin.x / self.width # Top-left X
y1 = bb.origin.y / self.height # Top-left Y y1 = bb.origin.y / self.height # Top-left Y
x2 = (bb.origin.x + bb.size.x) / self.width # Bottom-right X x2 = (bb.origin.x + bb.size.x) / self.width # Bottom-right X
y2 = (bb.origin.y + bb.size.y) / self.height # Bottom-right Y y2 = (bb.origin.y + bb.size.y) / self.height # Bottom-right Y
detections[i] = [ detections[i] = [
item.class_index, item.class_index,
float(item.confidence), float(item.confidence),
@ -82,9 +86,6 @@ class SynapDetector(DetectionApi):
y2, y2,
x2, x2,
] ]
return detections
else: else:
print(f"Unsupported model type: {self.model_type}") logger.error(f"Unsupported model type: {self.model_type}")
return np.zeros((20, 6), np.float32) return detections