From b0a8a6c93b4cf72d4e587c3c3a1bfd99ef0957e1 Mon Sep 17 00:00:00 2001 From: jkbmrz Date: Thu, 14 Nov 2024 16:17:14 +0100 Subject: [PATCH 01/11] feat: adjust ParsingNeuralNetwork.build() to updates in DAI --- depthai_nodes/parsing_neural_network.py | 45 ++++++++++--------------- 1 file changed, 17 insertions(+), 28 deletions(-) diff --git a/depthai_nodes/parsing_neural_network.py b/depthai_nodes/parsing_neural_network.py index 1b414d38..147889fc 100644 --- a/depthai_nodes/parsing_neural_network.py +++ b/depthai_nodes/parsing_neural_network.py @@ -39,22 +39,10 @@ def __init__(self, *args, **kwargs) -> None: self._nn = self._pipeline.create(dai.node.NeuralNetwork) self._parsers: Dict[int, BaseParser] = {} - @overload - def build( - self, input: dai.Node.Output, nn_source: dai.NNModelDescription, fps: int - ) -> "ParsingNeuralNetwork": - ... - - @overload - def build( - self, input: dai.Node.Output, nn_source: dai.NNArchive, fps: int - ) -> "ParsingNeuralNetwork": - ... - def build( self, input: dai.Node.Output, - nn_source: Union[dai.NNModelDescription, dai.NNArchive], + slug: str, fps: int = None, ) -> "ParsingNeuralNetwork": """Builds the underlying NeuralNetwork node and creates parser nodes for each @@ -63,9 +51,8 @@ def build( @param input: Node's input. It is a linking point to which the NeuralNetwork is linked. It accepts the output of a Camera node. @type input: Node.Input - @param nn_source: NNModelDescription object containing the HubAI model - descriptors, or NNArchive object of the model. - @type nn_source: Union[dai.NNModelDescription, dai.NNArchive] + @param slug: HubAI model slug. + @type slug: str @param fps: FPS limit for the model runtime. @type fps: int @return: Returns the ParsingNeuralNetwork object. @@ -74,21 +61,23 @@ def build( object. """ - if isinstance(nn_source, dai.NNModelDescription): - if not nn_source.platform: - nn_source.platform = ( - self.getParentPipeline().getDefaultDevice().getPlatformAsString() - ) - self._nn_archive = dai.NNArchive(dai.getModelFromZoo(nn_source)) - elif isinstance(nn_source, dai.NNArchive): - self._nn_archive = nn_source - else: - raise ValueError( - "nn_source must be either a NNModelDescription or NNArchive" + if isinstance(slug, str): + if ":" not in slug: + raise ValueError("Slug must be in the format :.") + model_slug, model_version_slug = slug.split(":") + model_description = dai.NNModelDescription( + modelSlug=model_slug, + modelVersionSlug=model_version_slug, ) + model_description.platform = ( + self.getParentPipeline().getDefaultDevice().getPlatformAsString() + ) + self._nn_archive = dai.NNArchive(dai.getModelFromZoo(model_description)) + else: + raise ValueError("Slug must be a string.") kwargs = {"fps": fps} if fps else {} - self._nn.build(input, nn_source, **kwargs) + self._nn.build(input, self._nn_archive, **kwargs) self._updateParsers(self._nn_archive) return self From 90b441b54db6df85a733737f15a529bad569688f Mon Sep 17 00:00:00 2001 From: jkbmrz Date: Thu, 14 Nov 2024 16:25:22 +0100 Subject: [PATCH 02/11] fix: pre-commit --- depthai_nodes/parsing_neural_network.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/depthai_nodes/parsing_neural_network.py b/depthai_nodes/parsing_neural_network.py index 147889fc..5822b343 100644 --- a/depthai_nodes/parsing_neural_network.py +++ b/depthai_nodes/parsing_neural_network.py @@ -1,5 +1,5 @@ from pathlib import Path -from typing import Dict, Union, overload +from typing import Dict, Union import depthai as dai @@ -63,7 +63,9 @@ def build( if isinstance(slug, str): if ":" not in slug: - raise ValueError("Slug must be in the format :.") + raise ValueError( + "Slug must be in the format :." + ) model_slug, model_version_slug = slug.split(":") model_description = dai.NNModelDescription( modelSlug=model_slug, From 5ff83ddf96cf68da4e4615f33aa2e6504bdb81ab Mon Sep 17 00:00:00 2001 From: jkbmrz Date: Fri, 15 Nov 2024 10:10:49 +0100 Subject: [PATCH 03/11] fix: slug splitting if instance hash is present --- depthai_nodes/parsing_neural_network.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/depthai_nodes/parsing_neural_network.py b/depthai_nodes/parsing_neural_network.py index 5822b343..fb35c417 100644 --- a/depthai_nodes/parsing_neural_network.py +++ b/depthai_nodes/parsing_neural_network.py @@ -62,14 +62,20 @@ def build( """ if isinstance(slug, str): - if ":" not in slug: + slug_split = slug.split(":") + if len(slug_split) == 2: + model_slug, model_version_slug = slug_split + elif len(slug_split) == 3: + model_slug, model_version_slug, model_instance_hash = slug_split + else: raise ValueError( - "Slug must be in the format :." + "Slug must be in the format : or ::." ) - model_slug, model_version_slug = slug.split(":") + model_description = dai.NNModelDescription( modelSlug=model_slug, modelVersionSlug=model_version_slug, + modelInstanceHash=model_instance_hash, ) model_description.platform = ( self.getParentPipeline().getDefaultDevice().getPlatformAsString() From 58fddb83811903c91b78480f846d29f5eeeb7ed0 Mon Sep 17 00:00:00 2001 From: jkbmrz Date: Fri, 15 Nov 2024 10:17:00 +0100 Subject: [PATCH 04/11] fix: remove slug splitting --- depthai_nodes/parsing_neural_network.py | 32 ++++++++----------------- 1 file changed, 10 insertions(+), 22 deletions(-) diff --git a/depthai_nodes/parsing_neural_network.py b/depthai_nodes/parsing_neural_network.py index fb35c417..50a9de9d 100644 --- a/depthai_nodes/parsing_neural_network.py +++ b/depthai_nodes/parsing_neural_network.py @@ -51,7 +51,7 @@ def build( @param input: Node's input. It is a linking point to which the NeuralNetwork is linked. It accepts the output of a Camera node. @type input: Node.Input - @param slug: HubAI model slug. + @param slug: HubAI model slug (e.g. : or ::) @type slug: str @param fps: FPS limit for the model runtime. @type fps: int @@ -61,29 +61,17 @@ def build( object. """ - if isinstance(slug, str): - slug_split = slug.split(":") - if len(slug_split) == 2: - model_slug, model_version_slug = slug_split - elif len(slug_split) == 3: - model_slug, model_version_slug, model_instance_hash = slug_split - else: - raise ValueError( - "Slug must be in the format : or ::." - ) - - model_description = dai.NNModelDescription( - modelSlug=model_slug, - modelVersionSlug=model_version_slug, - modelInstanceHash=model_instance_hash, - ) - model_description.platform = ( - self.getParentPipeline().getDefaultDevice().getPlatformAsString() - ) - self._nn_archive = dai.NNArchive(dai.getModelFromZoo(model_description)) - else: + if not isinstance(slug, str): raise ValueError("Slug must be a string.") + model_description = dai.NNModelDescription( + model=slug, + ) + model_description.platform = ( + self.getParentPipeline().getDefaultDevice().getPlatformAsString() + ) + self._nn_archive = dai.NNArchive(dai.getModelFromZoo(model_description)) + kwargs = {"fps": fps} if fps else {} self._nn.build(input, self._nn_archive, **kwargs) From 55cdf6a33d0dcfc8913844900d2a72cb25212609 Mon Sep 17 00:00:00 2001 From: jkbmrz Date: Fri, 15 Nov 2024 10:52:02 +0100 Subject: [PATCH 05/11] feat: adjust examples --- examples/main.py | 55 ++++++++++++++----------------------- examples/utils/arguments.py | 32 +-------------------- examples/utils/model.py | 11 ++------ 3 files changed, 24 insertions(+), 74 deletions(-) diff --git a/examples/main.py b/examples/main.py index 76dde265..245b21e6 100644 --- a/examples/main.py +++ b/examples/main.py @@ -1,23 +1,21 @@ import depthai as dai -from utils.arguments import initialize_argparser, parse_fps_limit, parse_model_slug -from utils.model import get_input_shape, get_model_from_hub, get_parser +from utils.arguments import initialize_argparser +from utils.model import get_input_shape, get_nn_archive_from_hub, get_parser from utils.xfeat import xfeat_mono, xfeat_stereo from visualization.visualize import visualize -from depthai_nodes.parser_generator import ParserGenerator +from depthai_nodes import ParsingNeuralNetwork # Initialize the argument parser arg_parser, args = initialize_argparser() # Parse the model slug -model_slug, model_version_slug = parse_model_slug(args) -fps_limit = parse_fps_limit(args) - -# Get the model from the HubAI -nn_archive = get_model_from_hub(model_slug, model_version_slug) +slug = args.slug +fps_limit = args.fps_limit # Get the parser -parser_class, parser_name = get_parser(nn_archive) +nn_archive = get_nn_archive_from_hub(slug) +_, parser_name = get_parser(nn_archive) input_shape = get_input_shape(nn_archive) if parser_name == "XFeatMonoParser": @@ -31,20 +29,20 @@ with dai.Pipeline() as pipeline: cam = pipeline.create(dai.node.Camera).build() + image_type = dai.ImgFrame.Type.BGR888p + if "gray" in slug: + image_type = dai.ImgFrame.Type.GRAY8 + # YOLO and MobileNet-SSD have native parsers in DAI - no need to create a separate parser if parser_name == "YOLO" or parser_name == "SSD": - network = pipeline.create(dai.node.DetectionNetwork).build( + nn = pipeline.create(dai.node.DetectionNetwork).build( cam.requestOutput( - input_shape, type=dai.ImgFrame.Type.BGR888p, fps=fps_limit + input_shape, type=image_type, fps=fps_limit ), nn_archive, ) - parser_queue = network.out.createOutputQueue() + parser_queue = nn.out.createOutputQueue() else: - image_type = dai.ImgFrame.Type.BGR888p - if "gray" in model_version_slug: - image_type = dai.ImgFrame.Type.GRAY8 - if input_shape[0] < 128 or input_shape[1] < 128: print( "Input shape is too small so we are requesting a larger image and resizing it." @@ -58,31 +56,18 @@ cam.requestOutput(large_input_shape, type=image_type, fps=fps_limit).link( manip.inputImage ) - network = pipeline.create(dai.node.NeuralNetwork).build( - manip.out, nn_archive + nn = pipeline.create(ParsingNeuralNetwork).build( + manip.out, slug ) else: - network = pipeline.create(dai.node.NeuralNetwork).build( + nn = pipeline.create(ParsingNeuralNetwork).build( cam.requestOutput(input_shape, type=image_type, fps=fps_limit), - nn_archive, + slug, ) - parsers = pipeline.create(ParserGenerator).build(nn_archive) - - if len(parsers) == 0: - raise ValueError("No parsers were generated.") - - if len(parsers) > 1: - raise ValueError("Only models with one parser are supported.") - - parser = parsers[0] - - # Linking - network.out.link(parser.input) - - parser_queue = parser.out.createOutputQueue() + parser_queue = nn.out.createOutputQueue() - camera_queue = network.passthrough.createOutputQueue() + camera_queue = nn.passthrough.createOutputQueue() pipeline.start() diff --git a/examples/utils/arguments.py b/examples/utils/arguments.py index 444300ec..2fd5cc83 100644 --- a/examples/utils/arguments.py +++ b/examples/utils/arguments.py @@ -12,7 +12,7 @@ def initialize_argparser(): parser.add_argument( "-s", - "--model_slug", + "--slug", help="slug of the model in HubAI.", required=True, type=str, @@ -30,33 +30,3 @@ def initialize_argparser(): args = parser.parse_args() return parser, args - - -def parse_model_slug(args: argparse.Namespace) -> Tuple[str, str]: - """Parse the model slug from the arguments. - - Returns the model slug and model version slug. - """ - model_slug = args.model_slug - - # parse the model slug - if ":" not in model_slug: - raise NameError( - "Please provide the model slug in the format of 'model_slug:model_version_slug'" - ) - - model_slug_parts = model_slug.split(":") - model_slug = model_slug_parts[0] - model_version_slug = model_slug_parts[1] - - return model_slug, model_version_slug - - -def parse_fps_limit(args: argparse.Namespace) -> int: - """Parse the FPS limit from the arguments. - - Returns the FPS limit. - """ - fps_limit = args.fps_limit - - return fps_limit diff --git a/examples/utils/model.py b/examples/utils/model.py index a3c05612..00ab3957 100644 --- a/examples/utils/model.py +++ b/examples/utils/model.py @@ -5,18 +5,13 @@ from depthai_nodes.ml.parsers import * -def get_model_from_hub(model_slug: str, model_version_slug: str) -> dai.NNArchive: +def get_nn_archive_from_hub(slug: str) -> dai.NNArchive: """Get the model from the HubAI and return the NN archive.""" - print( - f"Downloading model {model_slug} with version {model_version_slug} from HubAI..." - ) - modelDescription = dai.NNModelDescription( - modelSlug=model_slug, modelVersionSlug=model_version_slug, platform="RVC2" - ) + print(f"Downloading model {slug} from HubAI...") + modelDescription = dai.NNModelDescription(model=slug, platform="RVC2") archivePath = dai.getModelFromZoo(modelDescription) print("Download successful!") nn_archive = dai.NNArchive(archivePath) - return nn_archive From 0d297b0852538b388cf701c55b5d6dc53b26296b Mon Sep 17 00:00:00 2001 From: jkbmrz Date: Fri, 15 Nov 2024 10:59:54 +0100 Subject: [PATCH 06/11] fix: rename slug to model --- depthai_nodes/parsing_neural_network.py | 12 ++++++------ examples/README.md | 6 +++--- examples/main.py | 12 ++++++------ examples/utils/arguments.py | 6 +++--- examples/utils/model.py | 8 ++++---- 5 files changed, 22 insertions(+), 22 deletions(-) diff --git a/depthai_nodes/parsing_neural_network.py b/depthai_nodes/parsing_neural_network.py index 50a9de9d..167956cc 100644 --- a/depthai_nodes/parsing_neural_network.py +++ b/depthai_nodes/parsing_neural_network.py @@ -42,7 +42,7 @@ def __init__(self, *args, **kwargs) -> None: def build( self, input: dai.Node.Output, - slug: str, + model: str, fps: int = None, ) -> "ParsingNeuralNetwork": """Builds the underlying NeuralNetwork node and creates parser nodes for each @@ -51,8 +51,8 @@ def build( @param input: Node's input. It is a linking point to which the NeuralNetwork is linked. It accepts the output of a Camera node. @type input: Node.Input - @param slug: HubAI model slug (e.g. : or ::) - @type slug: str + @param model: HubAI model slug (e.g. : or ::) + @type model: str @param fps: FPS limit for the model runtime. @type fps: int @return: Returns the ParsingNeuralNetwork object. @@ -61,11 +61,11 @@ def build( object. """ - if not isinstance(slug, str): - raise ValueError("Slug must be a string.") + if not isinstance(model, str): + raise ValueError("Model slug must be a string.") model_description = dai.NNModelDescription( - model=slug, + model=model, ) model_description.platform = ( self.getParentPipeline().getDefaultDevice().getPlatformAsString() diff --git a/examples/README.md b/examples/README.md index 506669ac..ccf9bbe9 100644 --- a/examples/README.md +++ b/examples/README.md @@ -13,13 +13,13 @@ Prepare the model slug and run: ``` cd examples -python main.py -s +python main.py -m ``` For example: ``` -python main.py -s yolov6-nano:coco-416x416 +python main.py -m yolov6-nano:coco-416x416 ``` Note that for running the examples you need RVC2 device connected. @@ -29,7 +29,7 @@ If using OAK-D Lite, make sure to also set the FPS limit under 28.5. For example: ``` -python main.py -s yolov6-nano:coco-416x416 -fps 28 +python main.py -m yolov6-nano:coco-416x416 -fps 28 ``` Some models have small input sizes and requesting small image size from `Camera` is problematic so we request 4x bigger frame and resize it back down. During visualization image frame is resized back so some image quality is lost - only for visualization. diff --git a/examples/main.py b/examples/main.py index 245b21e6..52194035 100644 --- a/examples/main.py +++ b/examples/main.py @@ -9,12 +9,12 @@ # Initialize the argument parser arg_parser, args = initialize_argparser() -# Parse the model slug -slug = args.slug +# Parse the arguments +model = args.model fps_limit = args.fps_limit # Get the parser -nn_archive = get_nn_archive_from_hub(slug) +nn_archive = get_nn_archive_from_hub(model) _, parser_name = get_parser(nn_archive) input_shape = get_input_shape(nn_archive) @@ -30,7 +30,7 @@ cam = pipeline.create(dai.node.Camera).build() image_type = dai.ImgFrame.Type.BGR888p - if "gray" in slug: + if "gray" in model: image_type = dai.ImgFrame.Type.GRAY8 # YOLO and MobileNet-SSD have native parsers in DAI - no need to create a separate parser @@ -57,12 +57,12 @@ manip.inputImage ) nn = pipeline.create(ParsingNeuralNetwork).build( - manip.out, slug + manip.out, model ) else: nn = pipeline.create(ParsingNeuralNetwork).build( cam.requestOutput(input_shape, type=image_type, fps=fps_limit), - slug, + model, ) parser_queue = nn.out.createOutputQueue() diff --git a/examples/utils/arguments.py b/examples/utils/arguments.py index 2fd5cc83..8f0875d9 100644 --- a/examples/utils/arguments.py +++ b/examples/utils/arguments.py @@ -11,9 +11,9 @@ def initialize_argparser(): Currently, only RVC2 devices are supported. If using OAK-D Lite, please set the FPS limit to 28." parser.add_argument( - "-s", - "--slug", - help="slug of the model in HubAI.", + "-m", + "--model", + help="HubAI model slug.", required=True, type=str, ) diff --git a/examples/utils/model.py b/examples/utils/model.py index 00ab3957..1cb5a5bf 100644 --- a/examples/utils/model.py +++ b/examples/utils/model.py @@ -5,10 +5,10 @@ from depthai_nodes.ml.parsers import * -def get_nn_archive_from_hub(slug: str) -> dai.NNArchive: - """Get the model from the HubAI and return the NN archive.""" - print(f"Downloading model {slug} from HubAI...") - modelDescription = dai.NNModelDescription(model=slug, platform="RVC2") +def get_nn_archive_from_hub(model: str) -> dai.NNArchive: + """Get NN archive from the HubAI based on model slug.""" + print(f"Downloading model {model} from HubAI...") + modelDescription = dai.NNModelDescription(model=model, platform="RVC2") archivePath = dai.getModelFromZoo(modelDescription) print("Download successful!") nn_archive = dai.NNArchive(archivePath) From fc15fb3f52fabff2a3b1b8fd59cfa5fe45803102 Mon Sep 17 00:00:00 2001 From: jkbmrz Date: Fri, 15 Nov 2024 11:00:27 +0100 Subject: [PATCH 07/11] fix: pre-commit --- examples/main.py | 8 ++------ examples/utils/arguments.py | 1 - 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/examples/main.py b/examples/main.py index 52194035..1d33f2ba 100644 --- a/examples/main.py +++ b/examples/main.py @@ -36,9 +36,7 @@ # YOLO and MobileNet-SSD have native parsers in DAI - no need to create a separate parser if parser_name == "YOLO" or parser_name == "SSD": nn = pipeline.create(dai.node.DetectionNetwork).build( - cam.requestOutput( - input_shape, type=image_type, fps=fps_limit - ), + cam.requestOutput(input_shape, type=image_type, fps=fps_limit), nn_archive, ) parser_queue = nn.out.createOutputQueue() @@ -56,9 +54,7 @@ cam.requestOutput(large_input_shape, type=image_type, fps=fps_limit).link( manip.inputImage ) - nn = pipeline.create(ParsingNeuralNetwork).build( - manip.out, model - ) + nn = pipeline.create(ParsingNeuralNetwork).build(manip.out, model) else: nn = pipeline.create(ParsingNeuralNetwork).build( cam.requestOutput(input_shape, type=image_type, fps=fps_limit), diff --git a/examples/utils/arguments.py b/examples/utils/arguments.py index 8f0875d9..5e16351b 100644 --- a/examples/utils/arguments.py +++ b/examples/utils/arguments.py @@ -1,5 +1,4 @@ import argparse -from typing import Tuple def initialize_argparser(): From 5d2208faf8a891d59bea2a82b39db51352f2b69f Mon Sep 17 00:00:00 2001 From: jkbmrz Date: Fri, 15 Nov 2024 16:24:02 +0100 Subject: [PATCH 08/11] fix: add previous options to build ParsingNeuralNetwork from NNArchive or ModelDescription --- depthai_nodes/parsing_neural_network.py | 48 +++++++++++++++++-------- 1 file changed, 34 insertions(+), 14 deletions(-) diff --git a/depthai_nodes/parsing_neural_network.py b/depthai_nodes/parsing_neural_network.py index 167956cc..a81922f5 100644 --- a/depthai_nodes/parsing_neural_network.py +++ b/depthai_nodes/parsing_neural_network.py @@ -1,5 +1,5 @@ from pathlib import Path -from typing import Dict, Union +from typing import Dict, Union, overload import depthai as dai @@ -39,10 +39,25 @@ def __init__(self, *args, **kwargs) -> None: self._nn = self._pipeline.create(dai.node.NeuralNetwork) self._parsers: Dict[int, BaseParser] = {} + @overload + def build( + self, input: dai.Node.Output, nn_source: dai.NNModelDescription, fps: int + ) -> "ParsingNeuralNetwork": ... + + @overload + def build( + self, input: dai.Node.Output, nn_source: dai.NNArchive, fps: int + ) -> "ParsingNeuralNetwork": ... + + @overload + def build( + self, input: dai.Node.Output, nn_source: str, fps: int + ) -> "ParsingNeuralNetwork": ... + def build( self, input: dai.Node.Output, - model: str, + nn_source: Union[dai.NNModelDescription, dai.NNArchive, str], fps: int = None, ) -> "ParsingNeuralNetwork": """Builds the underlying NeuralNetwork node and creates parser nodes for each @@ -51,8 +66,9 @@ def build( @param input: Node's input. It is a linking point to which the NeuralNetwork is linked. It accepts the output of a Camera node. @type input: Node.Input - @param model: HubAI model slug (e.g. : or ::) - @type model: str + + @param nn_source: NNModelDescription object containing the HubAI model descriptors, NNArchive object of the model, or HubAI model slug in form of : or ::. + @type nn_source: Union[dai.NNModelDescription, dai.NNArchive, str] @param fps: FPS limit for the model runtime. @type fps: int @return: Returns the ParsingNeuralNetwork object. @@ -61,16 +77,20 @@ def build( object. """ - if not isinstance(model, str): - raise ValueError("Model slug must be a string.") - - model_description = dai.NNModelDescription( - model=model, - ) - model_description.platform = ( - self.getParentPipeline().getDefaultDevice().getPlatformAsString() - ) - self._nn_archive = dai.NNArchive(dai.getModelFromZoo(model_description)) + platform = self.getParentPipeline().getDefaultDevice().getPlatformAsString() + + if isinstance(nn_source, str): + nn_source = dai.NNModelDescription(nn_source) + if isinstance(nn_source, (dai.NNModelDescription, str)): + if not nn_source.platform: + nn_source.platform = platform + self._nn_archive = dai.NNArchive(dai.getModelFromZoo(nn_source)) + elif isinstance(nn_source, dai.NNArchive): + self._nn_archive = nn_source + else: + raise ValueError( + "nn_source must be either a NNModelDescription, NNArchive, or a string representing HubAI model slug." + ) kwargs = {"fps": fps} if fps else {} self._nn.build(input, self._nn_archive, **kwargs) From da07e5069e1ea74698940a9059f678d09c786bd7 Mon Sep 17 00:00:00 2001 From: jkbmrz Date: Fri, 15 Nov 2024 16:24:30 +0100 Subject: [PATCH 09/11] fix: pre-commit --- depthai_nodes/parsing_neural_network.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/depthai_nodes/parsing_neural_network.py b/depthai_nodes/parsing_neural_network.py index a81922f5..db757b74 100644 --- a/depthai_nodes/parsing_neural_network.py +++ b/depthai_nodes/parsing_neural_network.py @@ -42,17 +42,20 @@ def __init__(self, *args, **kwargs) -> None: @overload def build( self, input: dai.Node.Output, nn_source: dai.NNModelDescription, fps: int - ) -> "ParsingNeuralNetwork": ... + ) -> "ParsingNeuralNetwork": + ... @overload def build( self, input: dai.Node.Output, nn_source: dai.NNArchive, fps: int - ) -> "ParsingNeuralNetwork": ... + ) -> "ParsingNeuralNetwork": + ... @overload def build( self, input: dai.Node.Output, nn_source: str, fps: int - ) -> "ParsingNeuralNetwork": ... + ) -> "ParsingNeuralNetwork": + ... def build( self, From 5b42372b48fc5a03a5e77d1ebb93158f9a1653a5 Mon Sep 17 00:00:00 2001 From: jkbmrz Date: Wed, 20 Nov 2024 10:00:54 +0100 Subject: [PATCH 10/11] feat: remove usage of DetectionNetwork for YOLO and SSD examples --- examples/main.py | 49 +++++++++++++++++++++--------------------------- 1 file changed, 21 insertions(+), 28 deletions(-) diff --git a/examples/main.py b/examples/main.py index 1d33f2ba..ad5fce8a 100644 --- a/examples/main.py +++ b/examples/main.py @@ -29,39 +29,32 @@ with dai.Pipeline() as pipeline: cam = pipeline.create(dai.node.Camera).build() - image_type = dai.ImgFrame.Type.BGR888p if "gray" in model: image_type = dai.ImgFrame.Type.GRAY8 + else: + image_type = dai.ImgFrame.Type.BGR888p - # YOLO and MobileNet-SSD have native parsers in DAI - no need to create a separate parser - if parser_name == "YOLO" or parser_name == "SSD": - nn = pipeline.create(dai.node.DetectionNetwork).build( - cam.requestOutput(input_shape, type=image_type, fps=fps_limit), - nn_archive, + if input_shape[0] < 128 or input_shape[1] < 128: + print( + "Input shape is too small so we are requesting a larger image and resizing it." + ) + print( + "During visualization we resize small image back to large, so image quality is lower." + ) + manip = pipeline.create(dai.node.ImageManip) + manip.initialConfig.setResize(input_shape) + large_input_shape = (input_shape[0] * 4, input_shape[1] * 4) + cam.requestOutput(large_input_shape, type=image_type, fps=fps_limit).link( + manip.inputImage ) - parser_queue = nn.out.createOutputQueue() + nn = pipeline.create(ParsingNeuralNetwork).build(manip.out, model) else: - if input_shape[0] < 128 or input_shape[1] < 128: - print( - "Input shape is too small so we are requesting a larger image and resizing it." - ) - print( - "During visualization we resize small image back to large, so image quality is lower." - ) - manip = pipeline.create(dai.node.ImageManip) - manip.initialConfig.setResize(input_shape) - large_input_shape = (input_shape[0] * 4, input_shape[1] * 4) - cam.requestOutput(large_input_shape, type=image_type, fps=fps_limit).link( - manip.inputImage - ) - nn = pipeline.create(ParsingNeuralNetwork).build(manip.out, model) - else: - nn = pipeline.create(ParsingNeuralNetwork).build( - cam.requestOutput(input_shape, type=image_type, fps=fps_limit), - model, - ) - - parser_queue = nn.out.createOutputQueue() + nn = pipeline.create(ParsingNeuralNetwork).build( + cam.requestOutput(input_shape, type=image_type, fps=fps_limit), + model, + ) + + parser_queue = nn.out.createOutputQueue() camera_queue = nn.passthrough.createOutputQueue() From c9bee4f4ea178bbb21753aa0a9042f340262ea8f Mon Sep 17 00:00:00 2001 From: jkbmrz Date: Wed, 20 Nov 2024 10:02:41 +0100 Subject: [PATCH 11/11] fix: pre-commit --- examples/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/main.py b/examples/main.py index ad5fce8a..b72272de 100644 --- a/examples/main.py +++ b/examples/main.py @@ -53,7 +53,7 @@ cam.requestOutput(input_shape, type=image_type, fps=fps_limit), model, ) - + parser_queue = nn.out.createOutputQueue() camera_queue = nn.passthrough.createOutputQueue()