Settings UI tweaks (#22722)
Some checks are pending
CI / AMD64 Build (push) Waiting to run
CI / ARM Build (push) Waiting to run
CI / Jetson Jetpack 6 (push) Waiting to run
CI / AMD64 Extra Build (push) Blocked by required conditions
CI / ARM Extra Build (push) Blocked by required conditions
CI / Synaptics Build (push) Blocked by required conditions
CI / Assemble and push default build (push) Blocked by required conditions

* set edgetpu for multi-instance

* improve error messages when mixing/matching detectors

* allow custom add button text via uiSchema

* clarify language in docs for configuring detectors via the UI
This commit is contained in:
Josh Hawkins 2026-04-01 10:23:42 -05:00 committed by GitHub
parent f1983b25ca
commit adc8c2a6e8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 118 additions and 46 deletions

View File

@ -91,7 +91,7 @@ See [common Edge TPU troubleshooting steps](/troubleshooting/edgetpu) if the Edg
<ConfigTabs> <ConfigTabs>
<TabItem value="ui"> <TabItem value="ui">
Navigate to <NavPath path="Settings > System > Detector hardware" /> and select the **EdgeTPU** detector type with device set to `usb`. Navigate to <NavPath path="Settings > System > Detector hardware" /> and select **EdgeTPU** from the detector type dropdown and click **Add**, then set device to `usb`.
</TabItem> </TabItem>
<TabItem value="yaml"> <TabItem value="yaml">
@ -111,7 +111,7 @@ detectors:
<ConfigTabs> <ConfigTabs>
<TabItem value="ui"> <TabItem value="ui">
Navigate to <NavPath path="Settings > System > Detector hardware" /> and add multiple Edge TPU detectors, specifying `usb:0` and `usb:1` as the device for each. Navigate to <NavPath path="Settings > System > Detector hardware" /> and select **EdgeTPU** from the detector type dropdown and click **Add** to add multiple detectors, specifying `usb:0` and `usb:1` as the device for each.
</TabItem> </TabItem>
<TabItem value="yaml"> <TabItem value="yaml">
@ -136,7 +136,7 @@ _warning: may have [compatibility issues](https://github.com/blakeblackshear/fri
<ConfigTabs> <ConfigTabs>
<TabItem value="ui"> <TabItem value="ui">
Navigate to <NavPath path="Settings > System > Detector hardware" /> and select the **EdgeTPU** detector type with the device field left empty. Navigate to <NavPath path="Settings > System > Detector hardware" /> and select **EdgeTPU** from the detector type dropdown and click **Add**, then leave the device field empty.
</TabItem> </TabItem>
<TabItem value="yaml"> <TabItem value="yaml">
@ -156,7 +156,7 @@ detectors:
<ConfigTabs> <ConfigTabs>
<TabItem value="ui"> <TabItem value="ui">
Navigate to <NavPath path="Settings > System > Detector hardware" /> and select the **EdgeTPU** detector type with device set to `pci`. Navigate to <NavPath path="Settings > System > Detector hardware" /> and select **EdgeTPU** from the detector type dropdown and click **Add**, then set device to `pci`.
</TabItem> </TabItem>
<TabItem value="yaml"> <TabItem value="yaml">
@ -176,7 +176,7 @@ detectors:
<ConfigTabs> <ConfigTabs>
<TabItem value="ui"> <TabItem value="ui">
Navigate to <NavPath path="Settings > System > Detector hardware" /> and add multiple Edge TPU detectors, specifying `pci:0` and `pci:1` as the device for each. Navigate to <NavPath path="Settings > System > Detector hardware" /> and select **EdgeTPU** from the detector type dropdown and click **Add** to add multiple detectors, specifying `pci:0` and `pci:1` as the device for each.
</TabItem> </TabItem>
<TabItem value="yaml"> <TabItem value="yaml">
@ -199,7 +199,7 @@ detectors:
<ConfigTabs> <ConfigTabs>
<TabItem value="ui"> <TabItem value="ui">
Navigate to <NavPath path="Settings > System > Detector hardware" /> and add multiple Edge TPU detectors with different device types (e.g., `usb` and `pci`). Navigate to <NavPath path="Settings > System > Detector hardware" /> and select **EdgeTPU** from the detector type dropdown and click **Add** to add multiple detectors with different device types (e.g., `usb` and `pci`).
</TabItem> </TabItem>
<TabItem value="yaml"> <TabItem value="yaml">
@ -246,7 +246,7 @@ After placing the downloaded files for the tflite model and labels in your confi
<ConfigTabs> <ConfigTabs>
<TabItem value="ui"> <TabItem value="ui">
Navigate to <NavPath path="Settings > System > Detector hardware" /> and select the **EdgeTPU** detector type with device set to `usb`. Then navigate to <NavPath path="Settings > System > Detection model" /> and configure the model settings: Navigate to <NavPath path="Settings > System > Detector hardware" /> and select **EdgeTPU** from the detector type dropdown and click **Add**, then set device to `usb`. Then navigate to <NavPath path="Settings > System > Detection model" /> and configure the model settings:
| Field | Value | | Field | Value |
| ---------------------------------------- | ----------------------------------------------------------------- | | ---------------------------------------- | ----------------------------------------------------------------- |
@ -303,7 +303,7 @@ Use this configuration for YOLO-based models. When no custom model path or URL i
<ConfigTabs> <ConfigTabs>
<TabItem value="ui"> <TabItem value="ui">
Navigate to <NavPath path="Settings > System > Detector hardware" /> and select the **Hailo-8/Hailo-8L** detector type with device set to `PCIe`. Then navigate to <NavPath path="Settings > System > Detection model" /> and configure the model settings: Navigate to <NavPath path="Settings > System > Detector hardware" /> and select **Hailo-8/Hailo-8L** from the detector type dropdown and click **Add**, then set device to `PCIe`. Then navigate to <NavPath path="Settings > System > Detection model" /> and configure the model settings:
| Field | Value | | Field | Value |
| ---------------------------------------- | ----------------------- | | ---------------------------------------- | ----------------------- |
@ -359,7 +359,7 @@ For SSD-based models, provide either a model path or URL to your compiled SSD mo
<ConfigTabs> <ConfigTabs>
<TabItem value="ui"> <TabItem value="ui">
Navigate to <NavPath path="Settings > System > Detector hardware" /> and select the **Hailo-8/Hailo-8L** detector type with device set to `PCIe`. Then navigate to <NavPath path="Settings > System > Detection model" /> and configure the model settings: Navigate to <NavPath path="Settings > System > Detector hardware" /> and select **Hailo-8/Hailo-8L** from the detector type dropdown and click **Add**, then set device to `PCIe`. Then navigate to <NavPath path="Settings > System > Detection model" /> and configure the model settings:
| Field | Value | | Field | Value |
| --------------------------------------- | ------ | | --------------------------------------- | ------ |
@ -404,7 +404,7 @@ The Hailo detector supports all YOLO models compiled for Hailo hardware that inc
<ConfigTabs> <ConfigTabs>
<TabItem value="ui"> <TabItem value="ui">
Navigate to <NavPath path="Settings > System > Detector hardware" /> and select the **Hailo-8/Hailo-8L** detector type with device set to `PCIe`. Then navigate to <NavPath path="Settings > System > Detection model" /> and configure the model settings to match your custom model dimensions and format. Navigate to <NavPath path="Settings > System > Detector hardware" /> and select **Hailo-8/Hailo-8L** from the detector type dropdown and click **Add**, then set device to `PCIe`. Then navigate to <NavPath path="Settings > System > Detection model" /> and configure the model settings to match your custom model dimensions and format.
</TabItem> </TabItem>
<TabItem value="yaml"> <TabItem value="yaml">
@ -459,7 +459,7 @@ When using many cameras one detector may not be enough to keep up. Multiple dete
<ConfigTabs> <ConfigTabs>
<TabItem value="ui"> <TabItem value="ui">
Navigate to <NavPath path="Settings > System > Detector hardware" /> and add multiple **OpenVINO** detectors, each targeting `GPU` or `NPU`. Navigate to <NavPath path="Settings > System > Detector hardware" /> and select **OpenVINO** from the detector type dropdown and click **Add** to add multiple detectors, each targeting `GPU` or `NPU`.
</TabItem> </TabItem>
<TabItem value="yaml"> <TabItem value="yaml">
@ -502,7 +502,7 @@ Use the model configuration shown below when using the OpenVINO detector with th
<ConfigTabs> <ConfigTabs>
<TabItem value="ui"> <TabItem value="ui">
Navigate to <NavPath path="Settings > System > Detector hardware" /> and select the **OpenVINO** detector type with device set to `GPU` (or `NPU`). Then navigate to <NavPath path="Settings > System > Detection model" /> and configure: Navigate to <NavPath path="Settings > System > Detector hardware" /> and select **OpenVINO** from the detector type dropdown and click **Add**, then set device to `GPU` (or `NPU`). Then navigate to <NavPath path="Settings > System > Detection model" /> and configure:
| Field | Value | | Field | Value |
| ---------------------------------------- | ------------------------------------------ | | ---------------------------------------- | ------------------------------------------ |
@ -552,7 +552,7 @@ After placing the downloaded onnx model in your config folder, use the following
<ConfigTabs> <ConfigTabs>
<TabItem value="ui"> <TabItem value="ui">
Navigate to <NavPath path="Settings > System > Detector hardware" /> and select the **OpenVINO** detector type with device set to `GPU`. Then navigate to <NavPath path="Settings > System > Detection model" /> and configure: Navigate to <NavPath path="Settings > System > Detector hardware" /> and select **OpenVINO** from the detector type dropdown and click **Add**, then set device to `GPU`. Then navigate to <NavPath path="Settings > System > Detection model" /> and configure:
| Field | Value | | Field | Value |
| ---------------------------------------- | ------------------------------------------------- | | ---------------------------------------- | ------------------------------------------------- |
@ -614,7 +614,7 @@ After placing the downloaded onnx model in your config folder, use the following
<ConfigTabs> <ConfigTabs>
<TabItem value="ui"> <TabItem value="ui">
Navigate to <NavPath path="Settings > System > Detector hardware" /> and select the **OpenVINO** detector type with device set to `GPU` (or `NPU`). Then navigate to <NavPath path="Settings > System > Detection model" /> and configure: Navigate to <NavPath path="Settings > System > Detector hardware" /> and select **OpenVINO** from the detector type dropdown and click **Add**, then set device to `GPU` (or `NPU`). Then navigate to <NavPath path="Settings > System > Detection model" /> and configure:
| Field | Value | | Field | Value |
| ---------------------------------------- | -------------------------------------------------------- | | ---------------------------------------- | -------------------------------------------------------- |
@ -670,7 +670,7 @@ After placing the downloaded onnx model in your `config/model_cache` folder, use
<ConfigTabs> <ConfigTabs>
<TabItem value="ui"> <TabItem value="ui">
Navigate to <NavPath path="Settings > System > Detector hardware" /> and select the **OpenVINO** detector type with device set to `GPU`. Then navigate to <NavPath path="Settings > System > Detection model" /> and configure: Navigate to <NavPath path="Settings > System > Detector hardware" /> and select **OpenVINO** from the detector type dropdown and click **Add**, then set device to `GPU`. Then navigate to <NavPath path="Settings > System > Detection model" /> and configure:
| Field | Value | | Field | Value |
| --------------------------------------- | --------------------------------- | | --------------------------------------- | --------------------------------- |
@ -722,7 +722,7 @@ After placing the downloaded onnx model in your config/model_cache folder, use t
<ConfigTabs> <ConfigTabs>
<TabItem value="ui"> <TabItem value="ui">
Navigate to <NavPath path="Settings > System > Detector hardware" /> and select the **OpenVINO** detector type with device set to `CPU`. Then navigate to <NavPath path="Settings > System > Detection model" /> and configure: Navigate to <NavPath path="Settings > System > Detector hardware" /> and select **OpenVINO** from the detector type dropdown and click **Add**, then set device to `CPU`. Then navigate to <NavPath path="Settings > System > Detection model" /> and configure:
| Field | Value | | Field | Value |
| ---------------------------------------- | ---------------------------------- | | ---------------------------------------- | ---------------------------------- |
@ -776,7 +776,7 @@ Using the detector config below will connect to the client:
<ConfigTabs> <ConfigTabs>
<TabItem value="ui"> <TabItem value="ui">
Navigate to <NavPath path="Settings > System > Detector hardware" /> and select the **ZMQ IPC** detector type with the endpoint set to `tcp://host.docker.internal:5555`. Navigate to <NavPath path="Settings > System > Detector hardware" /> and select **ZMQ IPC** from the detector type dropdown and click **Add**, then set the endpoint to `tcp://host.docker.internal:5555`.
</TabItem> </TabItem>
<TabItem value="yaml"> <TabItem value="yaml">
@ -810,7 +810,7 @@ When Frigate is started with the following config it will connect to the detecto
<ConfigTabs> <ConfigTabs>
<TabItem value="ui"> <TabItem value="ui">
Navigate to <NavPath path="Settings > System > Detector hardware" /> and select the **ZMQ IPC** detector type with the endpoint set to `tcp://host.docker.internal:5555`. Then navigate to <NavPath path="Settings > System > Detection model" /> and configure: Navigate to <NavPath path="Settings > System > Detector hardware" /> and select **ZMQ IPC** from the detector type dropdown and click **Add**, then set the endpoint to `tcp://host.docker.internal:5555`. Then navigate to <NavPath path="Settings > System > Detection model" /> and configure:
| Field | Value | | Field | Value |
| ---------------------------------------- | -------------------------------------------------------- | | ---------------------------------------- | -------------------------------------------------------- |
@ -971,7 +971,7 @@ When using many cameras one detector may not be enough to keep up. Multiple dete
<ConfigTabs> <ConfigTabs>
<TabItem value="ui"> <TabItem value="ui">
Navigate to <NavPath path="Settings > System > Detector hardware" /> and add multiple **ONNX** detectors. Navigate to <NavPath path="Settings > System > Detector hardware" /> and select **ONNX** from the detector type dropdown and click **Add** to add multiple detectors.
</TabItem> </TabItem>
<TabItem value="yaml"> <TabItem value="yaml">
@ -1019,7 +1019,7 @@ After placing the downloaded onnx model in your config folder, use the following
<ConfigTabs> <ConfigTabs>
<TabItem value="ui"> <TabItem value="ui">
Navigate to <NavPath path="Settings > System > Detector hardware" /> and select the **ONNX** detector type. Then navigate to <NavPath path="Settings > System > Detection model" /> and configure: Navigate to <NavPath path="Settings > System > Detector hardware" /> and select **ONNX** from the detector type dropdown and click **Add**. Then navigate to <NavPath path="Settings > System > Detection model" /> and configure:
| Field | Value | | Field | Value |
| ---------------------------------------- | ------------------------------------------------- | | ---------------------------------------- | ------------------------------------------------- |
@ -1078,7 +1078,7 @@ After placing the downloaded onnx model in your config folder, use the following
<ConfigTabs> <ConfigTabs>
<TabItem value="ui"> <TabItem value="ui">
Navigate to <NavPath path="Settings > System > Detector hardware" /> and select the **ONNX** detector type. Then navigate to <NavPath path="Settings > System > Detection model" /> and configure: Navigate to <NavPath path="Settings > System > Detector hardware" /> and select **ONNX** from the detector type dropdown and click **Add**. Then navigate to <NavPath path="Settings > System > Detection model" /> and configure:
| Field | Value | | Field | Value |
| ---------------------------------------- | -------------------------------------------------------- | | ---------------------------------------- | -------------------------------------------------------- |
@ -1127,7 +1127,7 @@ After placing the downloaded onnx model in your config folder, use the following
<ConfigTabs> <ConfigTabs>
<TabItem value="ui"> <TabItem value="ui">
Navigate to <NavPath path="Settings > System > Detector hardware" /> and select the **ONNX** detector type. Then navigate to <NavPath path="Settings > System > Detection model" /> and configure: Navigate to <NavPath path="Settings > System > Detector hardware" /> and select **ONNX** from the detector type dropdown and click **Add**. Then navigate to <NavPath path="Settings > System > Detection model" /> and configure:
| Field | Value | | Field | Value |
| ---------------------------------------- | -------------------------------------------------------- | | ---------------------------------------- | -------------------------------------------------------- |
@ -1176,7 +1176,7 @@ After placing the downloaded onnx model in your `config/model_cache` folder, use
<ConfigTabs> <ConfigTabs>
<TabItem value="ui"> <TabItem value="ui">
Navigate to <NavPath path="Settings > System > Detector hardware" /> and select the **ONNX** detector type. Then navigate to <NavPath path="Settings > System > Detection model" /> and configure: Navigate to <NavPath path="Settings > System > Detector hardware" /> and select **ONNX** from the detector type dropdown and click **Add**. Then navigate to <NavPath path="Settings > System > Detection model" /> and configure:
| Field | Value | | Field | Value |
| --------------------------------------- | --------------------------------- | | --------------------------------------- | --------------------------------- |
@ -1221,7 +1221,7 @@ After placing the downloaded onnx model in your `config/model_cache` folder, use
<ConfigTabs> <ConfigTabs>
<TabItem value="ui"> <TabItem value="ui">
Navigate to <NavPath path="Settings > System > Detector hardware" /> and select the **ONNX** detector type. Then navigate to <NavPath path="Settings > System > Detection model" /> and configure: Navigate to <NavPath path="Settings > System > Detector hardware" /> and select **ONNX** from the detector type dropdown and click **Add**. Then navigate to <NavPath path="Settings > System > Detection model" /> and configure:
| Field | Value | | Field | Value |
| ---------------------------------------- | ------------------------------------------- | | ---------------------------------------- | ------------------------------------------- |
@ -1275,7 +1275,7 @@ A TensorFlow Lite model is provided in the container at `/cpu_model.tflite` and
<ConfigTabs> <ConfigTabs>
<TabItem value="ui"> <TabItem value="ui">
Navigate to <NavPath path="Settings > System > Detector hardware" /> and select the **CPU** detector type. Configure the number of threads and add additional CPU detectors as needed (one per camera is recommended). Navigate to <NavPath path="Settings > System > Detector hardware" /> and select **CPU** from the detector type dropdown and click **Add**. Configure the number of threads and click **Add** again to add additional CPU detectors as needed (one per camera is recommended).
</TabItem> </TabItem>
<TabItem value="yaml"> <TabItem value="yaml">
@ -1311,7 +1311,7 @@ To integrate CodeProject.AI into Frigate, configure the detector as follows:
<ConfigTabs> <ConfigTabs>
<TabItem value="ui"> <TabItem value="ui">
Navigate to <NavPath path="Settings > System > Detector hardware" /> and select the **DeepStack** detector type. Set the API URL to point to your CodeProject.AI server (e.g., `http://<your_codeproject_ai_server_ip>:<port>/v1/vision/detection`). Navigate to <NavPath path="Settings > System > Detector hardware" /> and select **DeepStack** from the detector type dropdown and click **Add**. Set the API URL to point to your CodeProject.AI server (e.g., `http://<your_codeproject_ai_server_ip>:<port>/v1/vision/detection`).
</TabItem> </TabItem>
<TabItem value="yaml"> <TabItem value="yaml">
@ -1350,7 +1350,7 @@ To configure the MemryX detector, use the following example configuration:
<ConfigTabs> <ConfigTabs>
<TabItem value="ui"> <TabItem value="ui">
Navigate to <NavPath path="Settings > System > Detector hardware" /> and select the **MemryX** detector type with device set to `PCIe:0`. Navigate to <NavPath path="Settings > System > Detector hardware" /> and select **MemryX** from the detector type dropdown and click **Add**, then set device to `PCIe:0`.
</TabItem> </TabItem>
<TabItem value="yaml"> <TabItem value="yaml">
@ -1370,7 +1370,7 @@ detectors:
<ConfigTabs> <ConfigTabs>
<TabItem value="ui"> <TabItem value="ui">
Navigate to <NavPath path="Settings > System > Detector hardware" /> and add multiple **MemryX** detectors, specifying `PCIe:0`, `PCIe:1`, `PCIe:2`, etc. as the device for each. Navigate to <NavPath path="Settings > System > Detector hardware" /> and select **MemryX** from the detector type dropdown and click **Add** to add multiple detectors, specifying `PCIe:0`, `PCIe:1`, `PCIe:2`, etc. as the device for each.
</TabItem> </TabItem>
<TabItem value="yaml"> <TabItem value="yaml">
@ -1414,7 +1414,7 @@ Below is the recommended configuration for using the **YOLO-NAS** (small) model
<ConfigTabs> <ConfigTabs>
<TabItem value="ui"> <TabItem value="ui">
Navigate to <NavPath path="Settings > System > Detector hardware" /> and select the **MemryX** detector type with device set to `PCIe:0`. Then navigate to <NavPath path="Settings > System > Detection model" /> and configure: Navigate to <NavPath path="Settings > System > Detector hardware" /> and select **MemryX** from the detector type dropdown and click **Add**, then set device to `PCIe:0`. Then navigate to <NavPath path="Settings > System > Detection model" /> and configure:
| Field | Value | | Field | Value |
| ---------------------------------------- | ------------------------------------------------- | | ---------------------------------------- | ------------------------------------------------- |
@ -1462,7 +1462,7 @@ Below is the recommended configuration for using the **YOLOv9** (small) model wi
<ConfigTabs> <ConfigTabs>
<TabItem value="ui"> <TabItem value="ui">
Navigate to <NavPath path="Settings > System > Detector hardware" /> and select the **MemryX** detector type with device set to `PCIe:0`. Then navigate to <NavPath path="Settings > System > Detection model" /> and configure: Navigate to <NavPath path="Settings > System > Detector hardware" /> and select **MemryX** from the detector type dropdown and click **Add**, then set device to `PCIe:0`. Then navigate to <NavPath path="Settings > System > Detection model" /> and configure:
| Field | Value | | Field | Value |
| ---------------------------------------- | ------------------------------------------------- | | ---------------------------------------- | ------------------------------------------------- |
@ -1509,7 +1509,7 @@ Below is the recommended configuration for using the **YOLOX** (small) model wit
<ConfigTabs> <ConfigTabs>
<TabItem value="ui"> <TabItem value="ui">
Navigate to <NavPath path="Settings > System > Detector hardware" /> and select the **MemryX** detector type with device set to `PCIe:0`. Then navigate to <NavPath path="Settings > System > Detection model" /> and configure: Navigate to <NavPath path="Settings > System > Detector hardware" /> and select **MemryX** from the detector type dropdown and click **Add**, then set device to `PCIe:0`. Then navigate to <NavPath path="Settings > System > Detection model" /> and configure:
| Field | Value | | Field | Value |
| ---------------------------------------- | ----------------------- | | ---------------------------------------- | ----------------------- |
@ -1556,7 +1556,7 @@ Below is the recommended configuration for using the **SSDLite MobileNet v2** mo
<ConfigTabs> <ConfigTabs>
<TabItem value="ui"> <TabItem value="ui">
Navigate to <NavPath path="Settings > System > Detector hardware" /> and select the **MemryX** detector type with device set to `PCIe:0`. Then navigate to <NavPath path="Settings > System > Detection model" /> and configure: Navigate to <NavPath path="Settings > System > Detector hardware" /> and select **MemryX** from the detector type dropdown and click **Add**, then set device to `PCIe:0`. Then navigate to <NavPath path="Settings > System > Detection model" /> and configure:
| Field | Value | | Field | Value |
| ---------------------------------------- | ----------------------- | | ---------------------------------------- | ----------------------- |
@ -1695,7 +1695,7 @@ Use the config below to work with generated TRT models:
<ConfigTabs> <ConfigTabs>
<TabItem value="ui"> <TabItem value="ui">
Navigate to <NavPath path="Settings > System > Detector hardware" /> and select the **TensorRT** detector type with the device set to `0` (the default GPU index). Then navigate to <NavPath path="Settings > System > Detection model" /> and configure: Navigate to <NavPath path="Settings > System > Detector hardware" /> and select **TensorRT** from the detector type dropdown and click **Add**, then set the device to `0` (the default GPU index). Then navigate to <NavPath path="Settings > System > Detection model" /> and configure:
| Field | Value | | Field | Value |
| ---------------------------------------- | ------------------------------------------------------------ | | ---------------------------------------- | ------------------------------------------------------------ |
@ -1752,14 +1752,14 @@ Use the model configuration shown below when using the synaptics detector with t
<ConfigTabs> <ConfigTabs>
<TabItem value="ui"> <TabItem value="ui">
Navigate to <NavPath path="Settings > System > Detector hardware" /> and select the **Synaptics** detector type. Then navigate to <NavPath path="Settings > System > Detection model" /> and configure: Navigate to <NavPath path="Settings > System > Detector hardware" /> and select **Synaptics** from the detector type dropdown and click **Add**. Then navigate to <NavPath path="Settings > System > Detection model" /> and configure:
| Field | Value | | Field | Value |
| ---------------------------------------- | ---------------------------- | | ---------------------------------------- | ---------------------------- |
| **Custom object detector model path** | `/synaptics/mobilenet.synap` | | **Custom object detector model path** | `/synaptics/mobilenet.synap` |
| **Object detection model input width** | `224` | | **Object detection model input width** | `224` |
| **Object detection model input height** | `224` | | **Object detection model input height** | `224` |
| **Tensor format** | `nhwc` | | **Model Input Tensor Shape** | `nhwc` |
| **Label map for custom object detector** | `/labelmap/coco-80.txt` | | **Label map for custom object detector** | `/labelmap/coco-80.txt` |
</TabItem> </TabItem>
@ -1774,7 +1774,7 @@ model: # required
path: /synaptics/mobilenet.synap # required path: /synaptics/mobilenet.synap # required
width: 224 # required width: 224 # required
height: 224 # required height: 224 # required
tensor_format: nhwc # default value (optional. If you change the model, it is required) input_tensor: nhwc # default value (optional. If you change the model, it is required)
labelmap_path: /labelmap/coco-80.txt # required labelmap_path: /labelmap/coco-80.txt # required
``` ```
@ -1800,7 +1800,7 @@ When using many cameras one detector may not be enough to keep up. Multiple dete
<ConfigTabs> <ConfigTabs>
<TabItem value="ui"> <TabItem value="ui">
Navigate to <NavPath path="Settings > System > Detector hardware" /> and add multiple **RKNN** detectors, each with `num_cores` set to `0` for automatic selection. Navigate to <NavPath path="Settings > System > Detector hardware" /> and select **RKNN** from the detector type dropdown and click **Add** to add multiple detectors, each with `num_cores` set to `0` for automatic selection.
</TabItem> </TabItem>
<TabItem value="yaml"> <TabItem value="yaml">
@ -1842,7 +1842,7 @@ This `config.yml` shows all relevant options to configure the detector and expla
<ConfigTabs> <ConfigTabs>
<TabItem value="ui"> <TabItem value="ui">
Navigate to <NavPath path="Settings > System > Detector hardware" /> and select the **RKNN** detector type. Set `num_cores` to `0` for automatic selection (increase for better performance on multicore NPUs, e.g., set to `3` on rk3588). Navigate to <NavPath path="Settings > System > Detector hardware" /> and select **RKNN** from the detector type dropdown and click **Add**. Set `num_cores` to `0` for automatic selection (increase for better performance on multicore NPUs, e.g., set to `3` on rk3588).
</TabItem> </TabItem>
<TabItem value="yaml"> <TabItem value="yaml">
@ -2059,7 +2059,7 @@ Once completed, configure the detector as follows:
<ConfigTabs> <ConfigTabs>
<TabItem value="ui"> <TabItem value="ui">
Navigate to <NavPath path="Settings > System > Detector hardware" /> and select the **DeGirum** detector type. Set the location to your AI server (e.g., service name, container name, or `host:port`), the zoo to `degirum/public`, and provide your authentication token if needed. Navigate to <NavPath path="Settings > System > Detector hardware" /> and select **DeGirum** from the detector type dropdown and click **Add**. Set the location to your AI server (e.g., service name, container name, or `host:port`), the zoo to `degirum/public`, and provide your authentication token if needed.
</TabItem> </TabItem>
<TabItem value="yaml"> <TabItem value="yaml">
@ -2102,7 +2102,7 @@ It is also possible to eliminate the need for an AI server and run the hardware
<ConfigTabs> <ConfigTabs>
<TabItem value="ui"> <TabItem value="ui">
Navigate to <NavPath path="Settings > System > Detector hardware" /> and select the **DeGirum** detector type. Set the location to `@local`, the zoo to `degirum/public`, and provide your authentication token. Navigate to <NavPath path="Settings > System > Detector hardware" /> and select **DeGirum** from the detector type dropdown and click **Add**. Set the location to `@local`, the zoo to `degirum/public`, and provide your authentication token.
</TabItem> </TabItem>
<TabItem value="yaml"> <TabItem value="yaml">
@ -2139,7 +2139,7 @@ If you do not possess whatever hardware you want to run, there's also the option
<ConfigTabs> <ConfigTabs>
<TabItem value="ui"> <TabItem value="ui">
Navigate to <NavPath path="Settings > System > Detector hardware" /> and select the **DeGirum** detector type. Set the location to `@cloud`, the zoo to `degirum/public`, and provide your authentication token. Navigate to <NavPath path="Settings > System > Detector hardware" /> and select **DeGirum** from the detector type dropdown and click **Add**. Set the location to `@cloud`, the zoo to `degirum/public`, and provide your authentication token.
</TabItem> </TabItem>
<TabItem value="yaml"> <TabItem value="yaml">
@ -2189,7 +2189,7 @@ Use the model configuration shown below when using the axengine detector with th
<ConfigTabs> <ConfigTabs>
<TabItem value="ui"> <TabItem value="ui">
Navigate to <NavPath path="Settings > System > Detector hardware" /> and select the **AXEngine NPU** detector type. Then navigate to <NavPath path="Settings > System > Detection model" /> and configure: Navigate to <NavPath path="Settings > System > Detector hardware" /> and select **AXEngine NPU** from the detector type dropdown and click **Add**. Then navigate to <NavPath path="Settings > System > Detection model" /> and configure:
| Field | Value | | Field | Value |
| ---------------------------------------- | ----------------------- | | ---------------------------------------- | ----------------------- |

View File

@ -1409,7 +1409,8 @@
"keyDuplicate": "Detector name already exists.", "keyDuplicate": "Detector name already exists.",
"noSchema": "No detector schemas are available.", "noSchema": "No detector schemas are available.",
"none": "No detector instances configured.", "none": "No detector instances configured.",
"add": "Add detector" "add": "Add detector",
"addCustomKey": "Add custom key"
}, },
"record": { "record": {
"title": "Recording Settings" "title": "Recording Settings"
@ -1637,6 +1638,10 @@
}, },
"snapshots": { "snapshots": {
"detectDisabled": "Object detection is disabled. Snapshots are generated from tracked objects and will not be created." "detectDisabled": "Object detection is disabled. Snapshots are generated from tracked objects and will not be created."
},
"detectors": {
"mixedTypes": "All detectors must use the same type. Remove existing detectors to use a different type.",
"mixedTypesSuggestion": "All detectors must use the same type. Remove existing detectors or select {{type}}."
} }
} }
} }

View File

@ -16,7 +16,7 @@ const detectors: SectionConfigOverrides = {
uiSchema: { uiSchema: {
"ui:field": "DetectorHardwareField", "ui:field": "DetectorHardwareField",
"ui:options": { "ui:options": {
multiInstanceTypes: ["cpu", "onnx", "openvino"], multiInstanceTypes: ["cpu", "onnx", "openvino", "edgetpu"],
typeOrder: ["onnx", "openvino", "edgetpu"], typeOrder: ["onnx", "openvino", "edgetpu"],
hiddenByType: {}, hiddenByType: {},
hiddenFields: detectorHiddenFields, hiddenFields: detectorHiddenFields,

View File

@ -60,7 +60,9 @@ export function AddPropertyButton({
className="gap-2" className="gap-2"
> >
<LuPlus className="h-4 w-4" /> <LuPlus className="h-4 w-4" />
{t("button.add", { ns: "common", defaultValue: "Add" })} {typeof uiSchema?.["ui:options"]?.addButtonText === "string"
? uiSchema["ui:options"].addButtonText
: t("button.add", { ns: "common", defaultValue: "Add" })}
</Button> </Button>
); );
} }

View File

@ -374,6 +374,18 @@ export function DetectorHardwareField(props: FieldProps) {
[detectors], [detectors],
); );
const getExistingType = useCallback(
(excludeKey?: string): string | undefined => {
for (const [key, value] of Object.entries(detectors)) {
if (excludeKey && key === excludeKey) continue;
const type = getInstanceType(value);
if (type) return type;
}
return undefined;
},
[detectors],
);
const handleAdd = useCallback(() => { const handleAdd = useCallback(() => {
if (!addType) { if (!addType) {
setAddError( setAddError(
@ -400,6 +412,28 @@ export function DetectorHardwareField(props: FieldProps) {
return; return;
} }
const existingType = getExistingType();
if (existingType && existingType !== addType) {
const canAddExisting =
multiInstanceSet.has(existingType) ||
!resolveDuplicateType(existingType);
setAddError(
canAddExisting
? t("configMessages.detectors.mixedTypesSuggestion", {
ns: "views/settings",
defaultValue:
"All detectors must use the same type. Remove existing detectors or select {{type}}.",
type: getTypeLabel(existingType),
})
: t("configMessages.detectors.mixedTypes", {
ns: "views/settings",
defaultValue:
"All detectors must use the same type. Remove existing detectors to use a different type.",
}),
);
return;
}
const baseKey = addType; const baseKey = addType;
let nextKey = baseKey; let nextKey = baseKey;
let index = 2; let index = 2;
@ -427,8 +461,10 @@ export function DetectorHardwareField(props: FieldProps) {
configNamespace, configNamespace,
detectors, detectors,
getDetectorDefaults, getDetectorDefaults,
getExistingType,
getTypeLabel, getTypeLabel,
isSingleInstanceType, isSingleInstanceType,
multiInstanceSet,
resolveDuplicateType, resolveDuplicateType,
updateDetectors, updateDetectors,
]); ]);
@ -523,6 +559,29 @@ export function DetectorHardwareField(props: FieldProps) {
return; return;
} }
const existingType = getExistingType(key);
if (existingType && existingType !== nextType) {
const canAddExisting =
multiInstanceSet.has(existingType) ||
!resolveDuplicateType(existingType, key);
setTypeErrors((prev) => ({
...prev,
[key]: canAddExisting
? t("configMessages.detectors.mixedTypesSuggestion", {
ns: "views/settings",
defaultValue:
"All detectors must use the same type. Remove existing detectors or select {{type}}.",
type: getTypeLabel(existingType),
})
: t("configMessages.detectors.mixedTypes", {
ns: "views/settings",
defaultValue:
"All detectors must use the same type. Remove existing detectors to use a different type.",
}),
}));
return;
}
setTypeErrors((prev) => { setTypeErrors((prev) => {
const { [key]: _, ...rest } = prev; const { [key]: _, ...rest } = prev;
return rest; return rest;
@ -538,8 +597,10 @@ export function DetectorHardwareField(props: FieldProps) {
[ [
detectors, detectors,
getDetectorDefaults, getDetectorDefaults,
getExistingType,
getTypeLabel, getTypeLabel,
isSingleInstanceType, isSingleInstanceType,
multiInstanceSet,
resolveDuplicateType, resolveDuplicateType,
t, t,
updateDetectors, updateDetectors,
@ -556,6 +617,10 @@ export function DetectorHardwareField(props: FieldProps) {
const nestedOverrides = { const nestedOverrides = {
"ui:options": { "ui:options": {
disableNestedCard: true, disableNestedCard: true,
addButtonText: t("configForm.detectors.addCustomKey", {
ns: "views/settings",
defaultValue: "Add custom key",
}),
}, },
} as UiSchema; } as UiSchema;
@ -567,7 +632,7 @@ export function DetectorHardwareField(props: FieldProps) {
); );
return mergeUiSchema(withTypeHiddenAndOptions, nestedOverrides); return mergeUiSchema(withTypeHiddenAndOptions, nestedOverrides);
}, },
[globalHiddenFields, hiddenByType, uiSchema?.additionalProperties], [globalHiddenFields, hiddenByType, t, uiSchema?.additionalProperties],
); );
const renderInstanceForm = useCallback( const renderInstanceForm = useCallback(