Compare commits

..

4 Commits

6 changed files with 650 additions and 651 deletions

View File

@ -35,6 +35,8 @@ RUN poetry build
################# #################
FROM base FROM base
COPY camera_tunning /camera_tuning
RUN mkdir /models RUN mkdir /models
COPY --from=model-builder /models/mobile_object_localizer_192x192_openvino_2021.4_6shave.blob /models/mobile_object_localizer_192x192_openvino_2021.4_6shave.blob COPY --from=model-builder /models/mobile_object_localizer_192x192_openvino_2021.4_6shave.blob /models/mobile_object_localizer_192x192_openvino_2021.4_6shave.blob

View File

@ -12,6 +12,10 @@ import paho.mqtt.client as mqtt
from camera import oak_pipeline as cam from camera import oak_pipeline as cam
CAMERA_EXPOSITION_DEFAULT = "default"
CAMERA_EXPOSITION_8300US = "8300us"
CAMERA_EXPOSITION_500US = "500us"
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
_DEFAULT_CLIENT_ID = "robocar-depthai" _DEFAULT_CLIENT_ID = "robocar-depthai"
@ -49,6 +53,10 @@ def _parse_args_cli() -> argparse.Namespace:
help="set rate at which camera should produce frames", help="set rate at which camera should produce frames",
type=int, type=int,
default=30) default=30)
parser.add_argument("--camera-tuning-exposition", type=str,
default=CAMERA_EXPOSITION_DEFAULT,
help="override camera exposition configuration",
choices=[CAMERA_EXPOSITION_DEFAULT, CAMERA_EXPOSITION_500US, CAMERA_EXPOSITION_8300US])
parser.add_argument("-H", "--image-height", help="image height", parser.add_argument("-H", "--image-height", help="image height",
type=int, type=int,
default=_get_env_int_value("IMAGE_HEIGHT", 120)) default=_get_env_int_value("IMAGE_HEIGHT", 120))
@ -98,6 +106,12 @@ def execute_from_command_line() -> None:
objects_threshold=args.objects_threshold) objects_threshold=args.objects_threshold)
pipeline = dai.Pipeline() pipeline = dai.Pipeline()
if args.camera_tuning_exposition == CAMERA_EXPOSITION_500US:
pipeline.setCameraTuningBlobPath('/camera_tuning/tuning_exp_limit_500us.bin')
elif args.camera_tuning_exposition == CAMERA_EXPOSITION_8300US:
pipeline.setCameraTuningBlobPath('/camera_tuning/tuning_exp_limit_8300us.bin')
pipeline_controller = cam.PipelineController(pipeline=pipeline, pipeline_controller = cam.PipelineController(pipeline=pipeline,
frame_processor=frame_processor, frame_processor=frame_processor,
object_processor=object_processor, object_processor=object_processor,

View File

@ -5,6 +5,7 @@ import abc
import datetime import datetime
import logging import logging
import pathlib import pathlib
import time
import typing import typing
from dataclasses import dataclass from dataclasses import dataclass
@ -22,6 +23,9 @@ _NN_PATH = "/models/mobile_object_localizer_192x192_openvino_2021.4_6shave.blob"
_NN_WIDTH = 192 _NN_WIDTH = 192
_NN_HEIGHT = 192 _NN_HEIGHT = 192
_PREVIEW_WIDTH = 640
_PREVIEW_HEIGHT = 480
class ObjectProcessor: class ObjectProcessor:
""" """
@ -203,13 +207,15 @@ class CameraSource(Source):
# Properties # Properties
self._cam_rgb.setBoardSocket(dai.CameraBoardSocket.RGB) self._cam_rgb.setBoardSocket(dai.CameraBoardSocket.RGB)
self._cam_rgb.setPreviewSize(width=img_width, height=img_height) self._cam_rgb.setPreviewSize(width=_PREVIEW_WIDTH, height=_PREVIEW_HEIGHT)
self._cam_rgb.setInterleaved(False) self._cam_rgb.setInterleaved(False)
self._cam_rgb.setColorOrder(dai.ColorCameraProperties.ColorOrder.RGB) self._cam_rgb.setColorOrder(dai.ColorCameraProperties.ColorOrder.RGB)
self._cam_rgb.setFps(fps) self._cam_rgb.setFps(fps)
self._resize_manip = self._configure_manip(pipeline=pipeline, img_width=img_width, img_height=img_height)
# link camera preview to output # link camera preview to output
self._cam_rgb.preview.link(self._xout_rgb.input) self._cam_rgb.preview.link(self._resize_manip.inputImage)
self._resize_manip.out.link(self._xout_rgb.input)
def link(self, input_node: dai.Node.Input) -> None: def link(self, input_node: dai.Node.Input) -> None:
self._cam_rgb.preview.link(input_node) self._cam_rgb.preview.link(input_node)
@ -217,6 +223,15 @@ class CameraSource(Source):
def get_stream_name(self) -> str: def get_stream_name(self) -> str:
return self._xout_rgb.getStreamName() return self._xout_rgb.getStreamName()
@staticmethod
def _configure_manip(pipeline: dai.Pipeline, img_width: int, img_height: int) -> dai.node.ImageManip:
# Resize image
manip = pipeline.createImageManip()
manip.initialConfig.setResize(img_width, img_height)
manip.initialConfig.setFrameType(dai.ImgFrame.Type.RGB888p)
manip.initialConfig.setKeepAspectRatio(False)
return manip
@dataclass @dataclass
class MqttConfig: class MqttConfig:
@ -330,6 +345,10 @@ class PipelineController:
q_nn = dev.getOutputQueue(name=self._object_node.get_stream_name(), maxSize=queue_size, # type: ignore q_nn = dev.getOutputQueue(name=self._object_node.get_stream_name(), maxSize=queue_size, # type: ignore
blocking=False) blocking=False)
start_time = time.time()
counter = 0
fps = 0
display_time = time.time()
self._stop = False self._stop = False
while True: while True:
if self._stop: if self._stop:
@ -341,6 +360,16 @@ class PipelineController:
except Exception as ex: except Exception as ex:
logger.exception("unexpected error: %s", str(ex)) logger.exception("unexpected error: %s", str(ex))
counter += 1
if (time.time() - start_time) > 1:
fps = counter / (time.time() - start_time)
counter = 0
start_time = time.time()
if (time.time() - display_time) >= 10:
display_time = time.time()
logger.info("fps: %s", fps)
def _loop_on_camera_events(self, q_nn: dai.DataOutputQueue, q_rgb: dai.DataOutputQueue) -> None: def _loop_on_camera_events(self, q_nn: dai.DataOutputQueue, q_rgb: dai.DataOutputQueue) -> None:
logger.debug("wait for new frame") logger.debug("wait for new frame")
@ -361,6 +390,7 @@ class PipelineController:
self._object_processor.process(in_nn, frame_ref) self._object_processor.process(in_nn, frame_ref)
logger.debug("objects processed") logger.debug("objects processed")
def stop(self) -> None: def stop(self) -> None:
""" """
Stop event loop, if loop is not running, do nothing Stop event loop, if loop is not running, do nothing

Binary file not shown.

Binary file not shown.

1251
poetry.lock generated

File diff suppressed because it is too large Load Diff