Guest User

options.py

a guest
Sep 16th, 2025
24
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 28.73 KB | None | 0 0
  1. import os
  2. import platform
  3.  
  4. # Import CodeProject.AI SDK
  5. from codeproject_ai_sdk import ModuleOptions
  6.  
  7. class Settings:
  8.     def __init__(self, model_name: str, model_name_pattern: str, std_model_name: str,
  9.                  tpu_model_name: str, labels_name: str):
  10.         self.model_name         = model_name
  11.         self.model_name_pattern = model_name_pattern
  12.         self.cpu_model_name     = std_model_name
  13.         self.tpu_model_name     = tpu_model_name
  14.         self.labels_name        = labels_name
  15.  
  16.         self.MODEL_SEGMENTS = {
  17.             'tf2_ssd_mobilenet_v1_fpn_640x640_coco17_ptq': {
  18.                  #  104.2 ms per inference
  19.                  2: ['all_segments_tf2_ssd_mobilenet_v1_fpn_640x640_coco17_ptq_segment_0_of_2_edgetpu.tflite', 'all_segments_tf2_ssd_mobilenet_v1_fpn_640x640_coco17_ptq_segment_1_of_2_edgetpu.tflite'],
  20.                  #   67.5 ms per inference
  21.                  3: ['all_segments_tf2_ssd_mobilenet_v1_fpn_640x640_coco17_ptq_segment_0_of_3_edgetpu.tflite', 'all_segments_tf2_ssd_mobilenet_v1_fpn_640x640_coco17_ptq_segment_1_of_3_edgetpu.tflite', 'all_segments_tf2_ssd_mobilenet_v1_fpn_640x640_coco17_ptq_segment_2_of_3_edgetpu.tflite'],
  22.                  #   49.1 ms per inference
  23.                  4: ['all_segments_tf2_ssd_mobilenet_v1_fpn_640x640_coco17_ptq_segment_0_of_2_edgetpu.tflite', 'all_segments_tf2_ssd_mobilenet_v1_fpn_640x640_coco17_ptq_segment_1_of_2_edgetpu.tflite'],
  24.                  #   43.5 ms per inference
  25.                  5: ['all_segments_tf2_ssd_mobilenet_v1_fpn_640x640_coco17_ptq_segment_0_of_3_edgetpu.tflite', 'all_segments_tf2_ssd_mobilenet_v1_fpn_640x640_coco17_ptq_segment_1_of_3_edgetpu.tflite', 'all_segments_tf2_ssd_mobilenet_v1_fpn_640x640_coco17_ptq_segment_2_of_3_edgetpu.tflite'],
  26.                  #   37.0 ms per inference
  27.                  6: ['all_segments_tf2_ssd_mobilenet_v1_fpn_640x640_coco17_ptq_segment_0_of_3_edgetpu.tflite', 'all_segments_tf2_ssd_mobilenet_v1_fpn_640x640_coco17_ptq_segment_1_of_3_edgetpu.tflite', 'all_segments_tf2_ssd_mobilenet_v1_fpn_640x640_coco17_ptq_segment_2_of_3_edgetpu.tflite'],
  28.                  #   31.1 ms per inference
  29.                  7: ['all_segments_tf2_ssd_mobilenet_v1_fpn_640x640_coco17_ptq_segment_0_of_2_edgetpu.tflite', 'all_segments_tf2_ssd_mobilenet_v1_fpn_640x640_coco17_ptq_segment_1_of_2_edgetpu.tflite'],
  30.                  #   27.1 ms per inference
  31.                  8: ['all_segments_tf2_ssd_mobilenet_v1_fpn_640x640_coco17_ptq_segment_0_of_3_edgetpu.tflite', 'all_segments_tf2_ssd_mobilenet_v1_fpn_640x640_coco17_ptq_segment_1_of_3_edgetpu.tflite', 'all_segments_tf2_ssd_mobilenet_v1_fpn_640x640_coco17_ptq_segment_2_of_3_edgetpu.tflite'],
  32.              },
  33.              'efficientdet_lite2_448_ptq': {
  34.                  #   32.1 ms per inference
  35.                  2: ['all_segments_efficientdet_lite2_448_ptq_segment_0_of_2_edgetpu.tflite', 'all_segments_efficientdet_lite2_448_ptq_segment_1_of_2_edgetpu.tflite'],
  36.                  #   19.5 ms per inference
  37.                  3: ['166x_first_seg_efficientdet_lite2_448_ptq_segment_0_of_2_edgetpu.tflite', '166x_first_seg_efficientdet_lite2_448_ptq_segment_1_of_2_edgetpu.tflite'],
  38.                  #   16.5 ms per inference
  39.                  4: ['15x_first_seg_efficientdet_lite2_448_ptq_segment_0_of_3_edgetpu.tflite', '15x_first_seg_efficientdet_lite2_448_ptq_segment_1_of_3_edgetpu.tflite', '15x_first_seg_efficientdet_lite2_448_ptq_segment_2_of_3_edgetpu.tflite'],
  40.                  #   13.6 ms per inference
  41.                  5: ['15x_first_seg_efficientdet_lite2_448_ptq_segment_0_of_2_edgetpu.tflite', '15x_first_seg_efficientdet_lite2_448_ptq_segment_1_of_2_edgetpu.tflite'],
  42.                  #   11.5 ms per inference
  43.                  7: ['166x_first_seg_efficientdet_lite2_448_ptq_segment_0_of_2_edgetpu.tflite', '166x_first_seg_efficientdet_lite2_448_ptq_segment_1_of_2_edgetpu.tflite'],
  44.                  #   11.3 ms per inference
  45.                  8: ['15x_first_seg_efficientdet_lite2_448_ptq_segment_0_of_2_edgetpu.tflite', '15x_first_seg_efficientdet_lite2_448_ptq_segment_1_of_2_edgetpu.tflite'],
  46.              },
  47.              'efficientdet_lite3_512_ptq': {
  48.                  #   20.9 ms per inference
  49.                  4: ['15x_last_seg_efficientdet_lite3_512_ptq_segment_0_of_2_edgetpu.tflite', '15x_last_seg_efficientdet_lite3_512_ptq_segment_1_of_2_edgetpu.tflite'],
  50.              },
  51.              'efficientdet_lite3x_640_ptq': {
  52.                  #   95.0 ms per inference
  53.                  2: ['all_segments_efficientdet_lite3x_640_ptq_segment_0_of_2_edgetpu.tflite', 'all_segments_efficientdet_lite3x_640_ptq_segment_1_of_2_edgetpu.tflite'],
  54.                  #   70.6 ms per inference
  55.                  3: ['all_segments_efficientdet_lite3x_640_ptq_segment_0_of_3_edgetpu.tflite', 'all_segments_efficientdet_lite3x_640_ptq_segment_1_of_3_edgetpu.tflite', 'all_segments_efficientdet_lite3x_640_ptq_segment_2_of_3_edgetpu.tflite'],
  56.                  #   47.9 ms per inference
  57.                  4: ['2x_first_seg_efficientdet_lite3x_640_ptq_segment_0_of_3_edgetpu.tflite', '2x_first_seg_efficientdet_lite3x_640_ptq_segment_1_of_3_edgetpu.tflite', '2x_first_seg_efficientdet_lite3x_640_ptq_segment_2_of_3_edgetpu.tflite'],
  58.                  #   38.7 ms per inference
  59.                  5: ['15x_first_seg_efficientdet_lite3x_640_ptq_segment_0_of_2_edgetpu.tflite', '15x_first_seg_efficientdet_lite3x_640_ptq_segment_1_of_2_edgetpu.tflite'],
  60.                  #   35.1 ms per inference
  61.                  6: ['all_segments_efficientdet_lite3x_640_ptq_segment_0_of_2_edgetpu.tflite', 'all_segments_efficientdet_lite3x_640_ptq_segment_1_of_2_edgetpu.tflite'],
  62.                  #   30.6 ms per inference
  63.                  7: ['all_segments_efficientdet_lite3x_640_ptq_segment_0_of_2_edgetpu.tflite', 'all_segments_efficientdet_lite3x_640_ptq_segment_1_of_2_edgetpu.tflite'],
  64.                  #   27.3 ms per inference
  65.                  8: ['all_segments_efficientdet_lite3x_640_ptq_segment_0_of_2_edgetpu.tflite', 'all_segments_efficientdet_lite3x_640_ptq_segment_1_of_2_edgetpu.tflite'],
  66.              },
  67.              'yolov5m-int8': {
  68.                  #   56.3 ms per inference
  69.                  2: ['all_segments_yolov5m-int8_segment_0_of_2_edgetpu.tflite', 'all_segments_yolov5m-int8_segment_1_of_2_edgetpu.tflite'],
  70.                  #   32.2 ms per inference
  71.                  3: ['15x_first_seg_yolov5m-int8_segment_0_of_2_edgetpu.tflite', '15x_first_seg_yolov5m-int8_segment_1_of_2_edgetpu.tflite'],
  72.                  #   25.9 ms per inference
  73.                  4: ['2x_last_seg_yolov5m-int8_segment_0_of_4_edgetpu.tflite', '2x_last_seg_yolov5m-int8_segment_1_of_4_edgetpu.tflite', '2x_last_seg_yolov5m-int8_segment_2_of_4_edgetpu.tflite', '2x_last_seg_yolov5m-int8_segment_3_of_4_edgetpu.tflite'],
  74.                  #   21.2 ms per inference
  75.                  5: ['all_segments_yolov5m-int8_segment_0_of_2_edgetpu.tflite', 'all_segments_yolov5m-int8_segment_1_of_2_edgetpu.tflite'],
  76.                  #   18.8 ms per inference
  77.                  6: ['15x_last_seg_yolov5m-int8_segment_0_of_3_edgetpu.tflite', '15x_last_seg_yolov5m-int8_segment_1_of_3_edgetpu.tflite', '15x_last_seg_yolov5m-int8_segment_2_of_3_edgetpu.tflite'],
  78.                  #   14.7 ms per inference
  79.                  7: ['all_segments_yolov5m-int8_segment_0_of_4_edgetpu.tflite', 'all_segments_yolov5m-int8_segment_1_of_4_edgetpu.tflite', 'all_segments_yolov5m-int8_segment_2_of_4_edgetpu.tflite', 'all_segments_yolov5m-int8_segment_3_of_4_edgetpu.tflite'],
  80.                  #   14.6 ms per inference
  81.                  8: ['all_segments_yolov5m-int8_segment_0_of_3_edgetpu.tflite', 'all_segments_yolov5m-int8_segment_1_of_3_edgetpu.tflite', 'all_segments_yolov5m-int8_segment_2_of_3_edgetpu.tflite'],
  82.              },
  83.              'yolov5l-int8': {
  84.                  #   61.1 ms per inference
  85.                  3: ['all_segments_yolov5l-int8_segment_0_of_3_edgetpu.tflite', 'all_segments_yolov5l-int8_segment_1_of_3_edgetpu.tflite', 'all_segments_yolov5l-int8_segment_2_of_3_edgetpu.tflite'],
  86.                  #   48.0 ms per inference
  87.                  4: ['all_segments_yolov5l-int8_segment_0_of_4_edgetpu.tflite', 'all_segments_yolov5l-int8_segment_1_of_4_edgetpu.tflite', 'all_segments_yolov5l-int8_segment_2_of_4_edgetpu.tflite', 'all_segments_yolov5l-int8_segment_3_of_4_edgetpu.tflite'],
  88.                  #   39.0 ms per inference
  89.                  5: ['all_segments_yolov5l-int8_segment_0_of_5_edgetpu.tflite', 'all_segments_yolov5l-int8_segment_1_of_5_edgetpu.tflite', 'all_segments_yolov5l-int8_segment_2_of_5_edgetpu.tflite', 'all_segments_yolov5l-int8_segment_3_of_5_edgetpu.tflite', 'all_segments_yolov5l-int8_segment_4_of_5_edgetpu.tflite'],
  90.                  #   31.5 ms per inference
  91.                  6: ['all_segments_yolov5l-int8_segment_0_of_3_edgetpu.tflite', 'all_segments_yolov5l-int8_segment_1_of_3_edgetpu.tflite', 'all_segments_yolov5l-int8_segment_2_of_3_edgetpu.tflite'],
  92.                  #   26.7 ms per inference
  93.                  7: ['dumb_yolov5l-int8_segment_0_of_6_edgetpu.tflite', 'dumb_yolov5l-int8_segment_1_of_6_edgetpu.tflite', 'dumb_yolov5l-int8_segment_2_of_6_edgetpu.tflite', 'dumb_yolov5l-int8_segment_3_of_6_edgetpu.tflite', 'dumb_yolov5l-int8_segment_4_of_6_edgetpu.tflite', 'dumb_yolov5l-int8_segment_5_of_6_edgetpu.tflite'],
  94.                  #   24.4 ms per inference
  95.                  8: ['all_segments_yolov5l-int8_segment_0_of_4_edgetpu.tflite', 'all_segments_yolov5l-int8_segment_1_of_4_edgetpu.tflite', 'all_segments_yolov5l-int8_segment_2_of_4_edgetpu.tflite', 'all_segments_yolov5l-int8_segment_3_of_4_edgetpu.tflite'],
  96.              },
  97.              'yolov8s_416_640px': {
  98.                  #   25.6 ms per inference
  99.                  3: ['166x_first_seg_yolov8s_416_640px_segment_0_of_2_edgetpu.tflite', '166x_first_seg_yolov8s_416_640px_segment_1_of_2_edgetpu.tflite'],
  100.              },
  101.              'yolov8m_416_640px': {
  102.                  #  114.4 ms per inference
  103.                  2: ['all_segments_yolov8m_416_640px_segment_0_of_2_edgetpu.tflite', 'all_segments_yolov8m_416_640px_segment_1_of_2_edgetpu.tflite'],
  104.                  #   71.9 ms per inference
  105.                  3: ['all_segments_yolov8m_416_640px_segment_0_of_3_edgetpu.tflite', 'all_segments_yolov8m_416_640px_segment_1_of_3_edgetpu.tflite', 'all_segments_yolov8m_416_640px_segment_2_of_3_edgetpu.tflite'],
  106.                  #   53.0 ms per inference
  107.                  4: ['2x_first_seg_yolov8m_416_640px_segment_0_of_3_edgetpu.tflite', '2x_first_seg_yolov8m_416_640px_segment_1_of_3_edgetpu.tflite', '2x_first_seg_yolov8m_416_640px_segment_2_of_3_edgetpu.tflite'],
  108.                  #   43.5 ms per inference
  109.                  5: ['166x_first_seg_yolov8m_416_640px_segment_0_of_4_edgetpu.tflite', '166x_first_seg_yolov8m_416_640px_segment_1_of_4_edgetpu.tflite', '166x_first_seg_yolov8m_416_640px_segment_2_of_4_edgetpu.tflite', '166x_first_seg_yolov8m_416_640px_segment_3_of_4_edgetpu.tflite'],
  110.                  #   31.8 ms per inference
  111.                  6: ['2x_first_seg_yolov8m_416_640px_segment_0_of_5_edgetpu.tflite', '2x_first_seg_yolov8m_416_640px_segment_1_of_5_edgetpu.tflite', '2x_first_seg_yolov8m_416_640px_segment_2_of_5_edgetpu.tflite', '2x_first_seg_yolov8m_416_640px_segment_3_of_5_edgetpu.tflite', '2x_first_seg_yolov8m_416_640px_segment_4_of_5_edgetpu.tflite'],
  112.                  #   29.5 ms per inference
  113.                  7: ['all_segments_yolov8m_416_640px_segment_0_of_4_edgetpu.tflite', 'all_segments_yolov8m_416_640px_segment_1_of_4_edgetpu.tflite', 'all_segments_yolov8m_416_640px_segment_2_of_4_edgetpu.tflite', 'all_segments_yolov8m_416_640px_segment_3_of_4_edgetpu.tflite'],
  114.                  #   26.0 ms per inference
  115.                  8: ['all_segments_yolov8m_416_640px_segment_0_of_3_edgetpu.tflite', 'all_segments_yolov8m_416_640px_segment_1_of_3_edgetpu.tflite', 'all_segments_yolov8m_416_640px_segment_2_of_3_edgetpu.tflite'],
  116.              },
  117.              'yolov8l_416_640px': {
  118.                  #  169.6 ms per inference
  119.                  2: ['all_segments_yolov8l_416_640px_segment_0_of_2_edgetpu.tflite', 'all_segments_yolov8l_416_640px_segment_1_of_2_edgetpu.tflite'],
  120.                  #  115.8 ms per inference
  121.                  3: ['15x_first_seg_yolov8l_416_640px_segment_0_of_2_edgetpu.tflite', '15x_first_seg_yolov8l_416_640px_segment_1_of_2_edgetpu.tflite'],
  122.                  #   89.7 ms per inference
  123.                  4: ['all_segments_yolov8l_416_640px_segment_0_of_2_edgetpu.tflite', 'all_segments_yolov8l_416_640px_segment_1_of_2_edgetpu.tflite'],
  124.                  #   77.7 ms per inference
  125.                  5: ['4x_first_seg_yolov8l_416_640px_segment_0_of_2_edgetpu.tflite', '4x_first_seg_yolov8l_416_640px_segment_1_of_2_edgetpu.tflite'],
  126.                  #   64.2 ms per inference
  127.                  6: ['15x_first_seg_yolov8l_416_640px_segment_0_of_2_edgetpu.tflite', '15x_first_seg_yolov8l_416_640px_segment_1_of_2_edgetpu.tflite'],
  128.                  #   57.3 ms per inference
  129.                  7: ['3x_first_seg_yolov8l_416_640px_segment_0_of_3_edgetpu.tflite', '3x_first_seg_yolov8l_416_640px_segment_1_of_3_edgetpu.tflite', '3x_first_seg_yolov8l_416_640px_segment_2_of_3_edgetpu.tflite'],
  130.                  #   52.2 ms per inference
  131.                  8: ['166x_first_seg_yolov8l_416_640px_segment_0_of_3_edgetpu.tflite', '166x_first_seg_yolov8l_416_640px_segment_1_of_3_edgetpu.tflite', '166x_first_seg_yolov8l_416_640px_segment_2_of_3_edgetpu.tflite'],
  132.              },
  133.              'ipcam-general-v8': {
  134.                  #   53.4 ms per inference
  135.                  2: ['2x_last_seg_ipcam-general-v8_segment_0_of_2_edgetpu.tflite', '2x_last_seg_ipcam-general-v8_segment_1_of_2_edgetpu.tflite'],
  136.                  #   24.3 ms per inference
  137.                  3: ['all_segments_ipcam-general-v8_segment_0_of_2_edgetpu.tflite', 'all_segments_ipcam-general-v8_segment_1_of_2_edgetpu.tflite'],
  138.                  #   19.9 ms per inference
  139.                  4: ['15x_first_seg_ipcam-general-v8_segment_0_of_3_edgetpu.tflite', '15x_first_seg_ipcam-general-v8_segment_1_of_3_edgetpu.tflite', '15x_first_seg_ipcam-general-v8_segment_2_of_3_edgetpu.tflite'],
  140.                  #   15.6 ms per inference
  141.                  5: ['15x_last_seg_ipcam-general-v8_segment_0_of_3_edgetpu.tflite', '15x_last_seg_ipcam-general-v8_segment_1_of_3_edgetpu.tflite', '15x_last_seg_ipcam-general-v8_segment_2_of_3_edgetpu.tflite'],
  142.                  #   15.2 ms per inference
  143.                  6: ['15x_last_seg_ipcam-general-v8_segment_0_of_3_edgetpu.tflite', '15x_last_seg_ipcam-general-v8_segment_1_of_3_edgetpu.tflite', '15x_last_seg_ipcam-general-v8_segment_2_of_3_edgetpu.tflite'],
  144.                  #   12.3 ms per inference
  145.                  7: ['15x_first_seg_ipcam-general-v8_segment_0_of_3_edgetpu.tflite', '15x_first_seg_ipcam-general-v8_segment_1_of_3_edgetpu.tflite', '15x_first_seg_ipcam-general-v8_segment_2_of_3_edgetpu.tflite'],
  146.                  #   10.9 ms per inference
  147.                  8: ['2x_last_seg_ipcam-general-v8_segment_0_of_3_edgetpu.tflite', '2x_last_seg_ipcam-general-v8_segment_1_of_3_edgetpu.tflite', '2x_last_seg_ipcam-general-v8_segment_2_of_3_edgetpu.tflite'],
  148.              },
  149.         }        
  150.  
  151.         self.tpu_segments_lists = {}
  152.         if model_name_pattern in self.MODEL_SEGMENTS:
  153.             self.tpu_segments_lists = self.MODEL_SEGMENTS[model_name_pattern]
  154.  
  155.  
  156. class Options:
  157.  
  158.     def __init__(self):
  159.  
  160.         # ----------------------------------------------------------------------
  161.         # Setup constants
  162.  
  163.         # Models at:
  164.         # https://coral.ai/models/object-detection/
  165.         # https://github.com/MikeLud/CodeProject.AI-Custom-IPcam-Models/
  166.         # https://github.com/ultralytics/ultralytics
  167.         #
  168.         # YOLOv8 benchmarked with 3 CPU cores and 6 PCIe TPUs
  169.         self.MODEL_SETTINGS = {
  170.             "yolov8": {
  171.                 # 59.88 ms throughput / 855.40 ms inference
  172.                 "large":  Settings('YOLOv8', 'yolov8l_416_640px',
  173.                                    'yolov8l_416_640px.tflite',                                 # 46Mb CPU
  174.                                    'yolov8l_416_640px_edgetpu.tflite',                         # 48Mb TPU
  175.                                    'coco_labels.txt'),
  176.                 # 53.72 ms throughput / 762.86 ms inference
  177.                 "medium": Settings('YOLOv8', 'yolov8m_416_640px', \
  178.                                    'yolov8m_416_640px.tflite',                                      # 21Mb CPU
  179.                                    'yolov8m_416_640px_edgetpu.tflite',                              # 22Mb TPU
  180.                                    'coco_labels.txt'),
  181.                 # 21.52 ms throughput / 291.35 ms inference
  182.                 "small":  Settings('YOLOv8', 'yolov8s_416_640px',
  183.                                    'yolov8s_416_640px.tflite',                                      # 11Mb CPU
  184.                                    'yolov8s_416_640px_edgetpu.tflite',                              # 12Mb TPU
  185.                                    'coco_labels.txt'),
  186.                 # 10.35 ms throughput / 123.35 ms inference
  187.                 "tiny":   Settings('YOLOv8', 'yolov8n_416_640px',
  188.                                    'yolov8n_416_640px.tflite',                                      # 4Mb CPU
  189.                                    'yolov8n_416_640px_edgetpu.tflite',                              # 3Mb TPU
  190.                                    'coco_labels.txt')
  191.             },
  192.             "yolov5": {
  193.                 "large":  Settings('YOLOv5', 'yolov5l-int8',
  194.                                    'yolov5l-int8.tflite',                                      # 46Mb CPU
  195.                                    'yolov5l-int8_edgetpu.tflite',                              # 48Mb TPU
  196.                                    'coco_labels.txt'),
  197.                 "medium": Settings('YOLOv5', 'yolov5m-int8',
  198.                                    'yolov5m-int8.tflite',                                      # 21Mb CPU
  199.                                    'yolov5m-int8_edgetpu.tflite',                              # 22Mb TPU
  200.                                    'coco_labels.txt'),
  201.                 "small":  Settings('YOLOv5', 'yolov5s-int8',
  202.                                    'yolov5s-int8.tflite',                                      # 7Mb CPU
  203.                                    'yolov5s-int8_edgetpu.tflite',                              # 8Mb TPU
  204.                                    'coco_labels.txt'),
  205.                 "tiny":   Settings('YOLOv5', 'yolov5n-int8',
  206.                                    'yolov5n-int8.tflite',                                      # 2Mb CPU
  207.                                    'yolov5n-int8_edgetpu.tflite',                              # 2Mb TPU
  208.                                    'coco_labels.txt')
  209.             },
  210.             "efficientdet-lite": {
  211.                 # Large: EfficientDet-Lite3x 90 objects COCO    640x640x3   2   197.0 ms    43.9% mAP
  212.                 "large":  Settings('EfficientDet-Lite', 'efficientdet_lite3x_640_ptq', \
  213.                                    'efficientdet_lite3x_640_ptq.tflite',                       # 14Mb CPU
  214.                                    'efficientdet_lite3x_640_ptq_edgetpu.tflite',               # 20Mb TPU
  215.                                    'coco_labels.txt'),
  216.                 # Medium: EfficientDet-Lite3 90 objects 512x512x3   2   107.6 ms    39.4% mAP
  217.                 "medium": Settings('EfficientDet-Lite', 'efficientdet_lite3_512_ptq', \
  218.                                    'efficientdet_lite3_512_ptq.tflite',                        # CPU
  219.                                    'efficientdet_lite3_512_ptq_edgetpu.tflite',                # TPU
  220.                                    'coco_labels.txt'),
  221.                 # Small: EfficientDet-Lite2 90 objects COCO 448x448x3   2   104.6 ms    36.0% mAP
  222.                 "small":  Settings('EfficientDet-Lite', 'efficientdet_lite2_448_ptq', \
  223.                                    'efficientdet_lite2_448_ptq.tflite',                        # 10Mb CPU
  224.                                    'efficientdet_lite2_448_ptq_edgetpu.tflite',                # TPU
  225.                                    'coco_labels.txt'),
  226.                 # Tiny: EfficientDet-Lite1 90 objects COCO  384x384x3   2   56.3 ms     34.3% mAP
  227.                 "tiny":   Settings('EfficientDet-Lite', 'efficientdet_lite1_384_ptq', \
  228.                                    'efficientdet_lite1_384_ptq.tflite',                        # 7Mb CPU
  229.                                    'efficientdet_lite1_384_ptq_edgetpu.tflite',                # TPU
  230.                                    'coco_labels.txt')
  231.             },
  232.             "mobilenet ssd": {
  233.                 # Large: SSD/FPN MobileNet V1 90 objects, COCO 640x640x3    TF-lite v2    229.4 ms    31.1% mAP
  234.                 "large":  Settings('MobileNet SSD', 'tf2_ssd_mobilenet_v1_fpn_640x640_coco17_ptq', \
  235.                                    'tf2_ssd_mobilenet_v1_fpn_640x640_coco17_ptq.tflite',       # CPU
  236.                                    'tf2_ssd_mobilenet_v1_fpn_640x640_coco17_ptq_edgetpu.tflite', # TPU
  237.                                    'coco_labels.txt'),
  238.                 # Medium: SSDLite MobileDet   90 objects, COCO 320x320x3    TF-lite v1    9.1 ms    32.9% mAP
  239.                 "medium": Settings('MobileNet SSD', 'ssdlite_mobiledet_coco_', \
  240.                                    'ssdlite_mobiledet_coco_qat_postprocess.tflite',            # 5Mb CPU
  241.                                    'ssdlite_mobiledet_coco_qat_postprocess_edgetpu.tflite',    # TPU
  242.                                    'coco_labels.txt'),
  243.                 # Small: SSD MobileNet V2 90 objects, COCO 300x300x3    TF-lite v2    7.6 ms    22.4% mAP
  244.                 "small":  Settings('MobileNet SSD', 'tf2_ssd_mobilenet_v2', \
  245.                                    'tf2_ssd_mobilenet_v2_coco17_ptq.tflite',                   # 6.7Mb CPU
  246.                                    'tf2_ssd_mobilenet_v2_coco17_ptq_edgetpu.tflite',           # TPU
  247.                                    'coco_labels.txt'),
  248.  
  249.                 # Tiny: MobileNet V2 90 objects, COCO 300x300x3    TF-lite v2 Quant
  250.                 "tiny":   Settings('MobileNet SSD', 'ssd_mobilenet_v2_coco_', \
  251.                                    'ssd_mobilenet_v2_coco_quant_postprocess.tflite',           # 6.6Mb CPU
  252.                                    'ssd_mobilenet_v2_coco_quant_postprocess_edgetpu.tflite',   # TPU
  253.                                    'coco_labels.txt')
  254.             }
  255.         }
  256.  
  257.  
  258.         self.ENABLE_MULTI_TPU                   = True
  259.         if platform.system() == 'Darwin':
  260.             self.ENABLE_MULTI_TPU = False
  261.  
  262.         self.MIN_CONFIDENCE                     = 0.5
  263.         self.INTERPRETER_LIFESPAN_SECONDS       = 3600.0
  264.         self.WATCHDOG_IDLE_SECS                 = 5.0       # To be added to non-multi code
  265.         self.MAX_IDLE_SECS_BEFORE_RECYCLE       = 60.0      # To be added to non-multi code
  266.         self.WARN_TEMPERATURE_THRESHOLD_CELSIUS = 80        # PCIe && Linux only
  267.  
  268.         self.MAX_PIPELINE_QUEUE_LEN             = 1000      # Multi-only
  269.         self.TILE_OVERLAP                       = 15        # Multi-only.
  270.         self.DOWNSAMPLE_BY                      = 6.0       # Multi-only. Smaller number results in more tiles generated
  271.         self.IOU_THRESHOLD                      = 0.1       # Multi-only
  272.  
  273.         # ----------------------------------------------------------------------
  274.         # Setup values
  275.  
  276.         self._show_env_variables = True
  277.  
  278.         self.module_path    = ModuleOptions.module_path
  279.         self.models_dir     = os.path.normpath(ModuleOptions.getEnvVariable("MODELS_DIR", f"{self.module_path}/assets"))
  280.         self.model_name     = os.path.normpath(ModuleOptions.getEnvVariable("CPAI_CORAL_MODEL_NAME", "MobileNet SSD"))
  281.         self.model_size     = ModuleOptions.getEnvVariable("MODEL_SIZE", "Small")   # small, medium, large
  282.  
  283.         # custom_models_dir = os.path.normpath(ModuleOptions.getEnvVariable("CUSTOM_MODELS_DIR", f"{module_path}/custom-models"))       # This was the original commented line which just uncommenting produced an error
  284.         # custom_models_dir = os.path.normpath(ModuleOptions.getEnvVariable("CUSTOM_MODELS_DIR", f"{self.module_path}/custom-models"))   # This was my first edit, thinking that we need to set the custom_models_dir attribute of the current object instead of just a variable
  285.         self.custom_models_dir = os.path.normpath(ModuleOptions.getEnvVariable("CUSTOM_MODELS_DIR", "C:/Program Files/CodeProject/AI/modules/ObjectDetectionCoral/custom-models"))     # I made a few other attempts, this ended up working or at least looks like it works from within BlueIris
  286.        
  287.  
  288.         self.use_multi_tpu  = ModuleOptions.getEnvVariable("CPAI_CORAL_MULTI_TPU", str(self.ENABLE_MULTI_TPU)).lower() == "true"
  289.         self.min_confidence = float(ModuleOptions.getEnvVariable("MIN_CONFIDENCE", self.MIN_CONFIDENCE))
  290.  
  291.         self.sleep_time     = 0.01
  292.  
  293.         # For multi-TPU tiling. Smaller number results in more tiles generated
  294.         self.downsample_by  = float(ModuleOptions.getEnvVariable("CPAI_CORAL_DOWNSAMPLE_BY", self.DOWNSAMPLE_BY))
  295.         self.tile_overlap   = int(ModuleOptions.getEnvVariable("CPAI_CORAL_TILE_OVERLAP",    self.TILE_OVERLAP))
  296.         self.iou_threshold  = float(ModuleOptions.getEnvVariable("CPAI_CORAL_IOU_THRESHOLD", self.IOU_THRESHOLD))
  297.  
  298.         # Maybe - perhaps! - we need shorter var names
  299.         self.watchdog_idle_secs           = float(ModuleOptions.getEnvVariable("CPAI_CORAL_WATCHDOG_IDLE_SECS",           self.WATCHDOG_IDLE_SECS))
  300.         self.interpreter_lifespan_secs    = float(ModuleOptions.getEnvVariable("CPAI_CORAL_INTERPRETER_LIFESPAN_SECONDS", self.INTERPRETER_LIFESPAN_SECONDS))
  301.         self.max_idle_secs_before_recycle = float(ModuleOptions.getEnvVariable("CPAI_CORAL_MAX_IDLE_SECS_BEFORE_RECYCLE", self.MAX_IDLE_SECS_BEFORE_RECYCLE))
  302.         self.max_pipeline_queue_length    = int(ModuleOptions.getEnvVariable("CPAI_CORAL_MAX_PIPELINE_QUEUE_LEN",         self.MAX_PIPELINE_QUEUE_LEN))
  303.         self.warn_temperature_thresh_C    = int(ModuleOptions.getEnvVariable("CPAI_CORAL_WARN_TEMPERATURE_THRESHOLD_CELSIUS", self.WARN_TEMPERATURE_THRESHOLD_CELSIUS))
  304.  
  305.         self.set_model(self.model_name)
  306.  
  307.  
  308.         # ----------------------------------------------------------------------
  309.         # dump the important variables
  310.  
  311.         if self._show_env_variables:
  312.             print(f"Debug: MODULE_PATH:           {self.module_path}")
  313.             print(f"Debug: MODELS_DIR:            {self.models_dir}")
  314.             print(f"Debug: CPAI_CORAL_MODEL_NAME: {self.model_name}")
  315.             print(f"Debug: MODEL_SIZE:            {self.model_size}")
  316.             print(f"Debug: CPU_MODEL_NAME:        {self.cpu_model_name}")
  317.             print(f"Debug: TPU_MODEL_NAME:        {self.tpu_model_name}")
  318.  
  319.  
  320.     def set_model(self, model_name):
  321.        
  322.         # Normalise input
  323.         self.model_name = model_name.lower()
  324.         if self.model_name not in [ "mobilenet ssd", "efficientdet-lite", "yolov5", "yolov8"]: # 'yolov5' - no sense including v5 anymore
  325.             self.model_name = "mobilenet ssd"
  326.  
  327.         self.model_size = self.model_size.lower()
  328.  
  329.         """
  330.        With models MobileNet SSD, EfficientDet-Lite, and YOLOv5/v8, we have
  331.        three classes of model. The first is basically designed to work in concert
  332.        with the Edge TPU and are compatible with the Dev Board Micro. They are
  333.        very fast and don't require additional CPU resources. The YOLOv5/v8 models
  334.        should be directly comparable with other CPAI modules running YOLOv5/v8.
  335.        They should be high-quality, but are not designed with the Edge TPU in
  336.        mind and rely more heavily on the CPU. The EfficientDet-Lite models are
  337.        in between: not as modern as YOLOv5/v8, but less reliant on the CPU.
  338.        
  339.        Each class of model is broken into four sizes depending on the
  340.        intensity of the workload.
  341.        """
  342.         model_valid = self.model_size in [ "tiny", "small", "medium", "large" ]
  343.         if not model_valid:
  344.             self.model_size = "small"
  345.  
  346.         # Get settings
  347.         # Note: self.model_name and self.model_size are lowercase to ensure dict lookup works
  348.         settings                = self.MODEL_SETTINGS[self.model_name][self.model_size]
  349.         self.cpu_model_name     = settings.cpu_model_name
  350.         self.tpu_model_name     = settings.tpu_model_name
  351.         self.labels_name        = settings.labels_name
  352.  
  353.         # pre-chew
  354.         self.model_cpu_file     = os.path.normpath(os.path.join(self.models_dir, self.cpu_model_name))
  355.         self.model_tpu_file     = os.path.normpath(os.path.join(self.models_dir, self.tpu_model_name))
  356.         self.label_file         = os.path.normpath(os.path.join(self.models_dir, self.labels_name))
  357.  
  358.         self.tpu_segments_lists = {}
  359.         for tpu_cnt, name_list in settings.tpu_segments_lists.items():
  360.             self.tpu_segments_lists[tpu_cnt] = \
  361.                 [os.path.normpath(os.path.join(self.models_dir, name)) for name in name_list]
  362.  
Advertisement
Add Comment
Please, Sign In to add comment