DepthAI 시작하기

이 가이드에서는 여러분들이DepthAI 장치(예: OAK-1 또는 OAK-D)를 가지고 있고 또 이 장치로 할 수 있는 것들과 가능한 것 들을 탐색하려고 한다고 가정하겠습니다.

  • 먼저 DepthAI 기능을 미리 볼 수 있는 DepthAI 데모 스크립트를 실행합니다.
  • 다음으로 데모 스크립트에서 사용 가능한 몇 가지 옵션을 살펴보고 사용법/ 변경에따른 결과를 보여드리겠습니다.
  • 마지막으로 여러분들의 컴퓨터 비전 및 인공지능 관련 지식을 더욱 확장하고 프로젝트의 시작점으로 사용할 수 있는 오픈 소스 사용 사례 구현, 코드 예제 및 튜토리얼을 확인할 수 있는 유용한 링크를 공유합니다.

그럼 장치 설정부터 시작하겠습니다.

DepthAI 장치 연결

DepthAI 패키지를 개봉하면 USB-C 케이블(OAK-D를 주문한 경우 전원 장치 포함)과 함께 장치를 받게 됩니다.

장치가 USB 포트에 직접 또는 전원이 공급되는 USB 허브를 통해 호스트(PC, Raspberry Pi 또는 다른 지원 장치 가능) 에 연결하세요.

Ubuntu에서 작업을 하시고 계시는 경우에는 다음을 실행하여 새 USB 장치가 감지되었는지 확인할 수 있습니다.

$ lsusb | grep MyriadX
Bus 003 Device 002: ID 03e7:2485 Intel Movidius MyriadX

노트

Ubuntu 이외의 다른 OS를 실행 중이거나 문제가 발생했다고 생각되는 경우 여기에서 자세한 OS별 설치 가이드와 함께 문제나 질문이 있는 경우 실시간으로 채팅할 수 있는 discord 지원 채널이 있습니다. 그리고 리얼리에듀테크 블러그 포스테에서도 각 OS별 설치 가이드를 지원합니다.

윈도우 설치 가이드

Windows 설치 프로그램 사용

모든 설정 절차가 필요 없는 실행 .exe  파일 을 윈도우 PC에 설치해 OAK 시리즈의 동작을 확인하신 싶은신 분은 여기 에서 다운로드하실 수 있습니다. 이 경우 다음의 설정 섹션을 건너뛸 수 있습니다.

다운로드를 완료하고 설치 후 실행하면 필요한 모든 구성 요소와 패키지 요구 사항이 설치됩니다. 완료되면 데모 스크립트가 자동으로 실행됩니다.

설정

이 섹션에서는 명령줄을 사용하여 데모 스크립트를 수동으로 설치하는 방법을 설명합니다.

데모 스크립트 다운로드

데모 스크립트를 다운로드하려면 git을 사용하거나 zip 파일을 직접 다운로드할 수 있습니다.

zip 파일에서

먼저 여기에서 저장소 패키지를 다운로드한 다음 선호하는 디렉토리에 아카이브의 압축을 풉니다. 다음으로 이 디렉토리에서 터미널 세션을 엽니다.

git 에서 소스 다운로드

먼저 터미널 세션을 열고 데모 스크립트를 다운로드하려는 기본 설정 디렉토리로 이동합니다. 그런 다음 다음 코드를 실행하여 데모 스크립트를 다운로드합니다.

$ git clone https://github.com/luxonis/depthai.git

리포지토리를 다운로드한 후 다음을 실행하여 다운로드한 리포지토리에 들어가야 합니다.

$ cd depthai
python virtualenv 생성 (선택 사항)

virtualenv를 만들고 사용하려면 virtualenvs에 대한 공식 python 가이드를 따르거나 “Ubuntu 20.04에서 Python 3 가상 환경을 만드는 방법“과 같은 웹상의 OS별 가이드를 따라 준비할 수 있습니다.

이렇게 하면 정리된 환경을 사용하고 있고 Python3 가 기본 인터프리터인로 설치됩니다. 이렇게 개발 환경을 준비 함으로써 혹시나 있을 수 있는 개발 과정에서의 잠재적인 문제를 방지하는 데 도움이 됩니다.

저는 일반적으로 다음을 실행하여 virtualenvs 를 만들고 사용하고 있습니다.

$ python3 -m venv myvenv
$ source myvenv/bin/activate
$ pip install -U pip

그리고 위의 virtualenvs  를 만들기 전에 아래 패키지 설치가 필요할 수 도 있습니다.

$ apt-get install python3-pip python3-venv
설치 요구 사항

데모 소스 코드가 다운로드되고 터미널 세션이 설정되면 다음으로 수행해야 할 작업은 이 스크립트에 필요한 모든 추가 패키지를 설치하는 것입니다 (depthai Python API 포함).

이러한 패키지를 설치하려면 install_requirements.py 스크립트를 실행하세요.

$ python3 install_requirements.py

경고

Linux 시스템을 사용하는 경우 대부분의 경우 스크립트가 장치에 올바르게 액세스할 수 있도록 새 udev 규칙을 추가해야 합니다. 다음을 실행하여 새 규칙을 추가하고 적용할 수 있습니다.

$ echo 'SUBSYSTEM=="usb", ATTRS{idVendor}=="03e7", MODE="0666"' | sudo tee /etc/udev/rules.d/80-movidius.rules
$ sudo udevadm control --reload-rules && sudo udevadm trigger

 데모 스크립트를 실행시켜 동작을 함께 확인해 보도록하겠습니다.

데모 스크립트 실행

모든 것이 설정되었으므로 이제 다음을 실행하여 데모 스크립트를 사용할 준비가 되었습니다.

$ python3 depthai_demo.py
기본 실행

데모를 처음 실행하면 스크립트는 기본 mobilenet-ssd 모델을 컴파일 및 다운로드하고 DepthAI 장치를 구성합니다.  그런 다음 장치의 RGB 카메라에서 스케일된 미리보기를 포함하는 기본 color 미리보기를 표시합니다.

미리보기 변경

장치에서 다른 미리 보기를 보려면 GUI의 왼쪽 상단 섹션에 표시되는 미리 보기 전환기를 사용할 수 있습니다.

DepthAI 기능 미리보기

기능설명제한 사항
color컬러 카메라 미리보기 표시
nnInput오른쪽 모노 카메라 미리보기 표시실행 중인 AI 모델이 없으면 비활성화됨
left왼쪽 모노 카메라 미리보기 표시OAK-D 필요
right오른쪽 모노 카메라 미리보기 표시OAK-D 필요
depth
depthRaw 미리보기 및 JET 색상에서 계산된 디스패리티 맵 표시. Depth 시각화에 가장 적합
OAK-D 필요
depthRawraw depth 맵 표시. Depth기반 계산에 가장 적합OAK-D 필요
disparity장치에서 생성된 디스패리티 맵 표시OAK-D 필요
disparityColor
장치 및 JET에서 생성된 디스패리티 맵 색상 표시. depth 미리보기와 동일해야 하지만 장치에서 생성.
OAK-D 필요
rectifiedLeftRectified 왼쪽 카메라 프레임OAK-D 필요
rectifiedRightRectified 오른쪽 카메라 프레임OAK-D 필요
기본 모델

데모가 실행되는 동안 감지 결과를 볼 수 있고 또 여러분이 카메라 앞에 서 있으면 꽤 높은 확률로 감지된 자신을 확인하실 수 있습니다.

기본적으로 사용되는 모델은  PASCAL 2007 VOC 클래스에서 학습된 MobileNetv2 SSD 객체 감지기입니다.

  • 사람: 사람
  • 동물: 새, 고양이, 소, 개, 말, 양
  • 차량: 비행기, 자전거, 보트, 버스, 자동차, 오토바이, 기차
  • 실내: 병, 의자, 식탁, 화분, 소파, TV/모니터

따라서 병이나 사과와 같은 다른 물체들도 감지해 보세요.

아니면 고양이는 어떤가요?

다른 모델 사용

다른 모델들도 쉽게 직접 해보고 평가 할 수 있습니다. 예를 들어 face-detection-retail-0004 모델과 데모 스크립트를 실행하려면  CNN Model 콤보 상자를 클릭하고 해당하는 모델을 선택합니다.

아래와 같이 사람의 얼굴을 감지할 수 있습니다.

콤보 상자를 사용하여 DepthAI에서 실행 중인 모델을 변경할 수 있습니다.  그리고 콘솔 명려어로 아래와 같이 동작 모델을  선택하는 것도 가능합니다.

$ python3 depthai_demo.py -cnn face-detection-retail-0004

아래에는 데모 스크립트만 다운로드하여도 쉽게 사용할 수 있는 모델 목록입니다.

사용 가능한 모델

이름

목적

FPS

링크

deeplabv3p_person

사람 세그멘테이션

22.1

face-detection-adas-0001

얼굴 감지

13.4

face-detection-retail-0004

얼굴 감지

30.0

mobilenet-ssd

객체 감지 (20 classes)

30.0

pedestrian-detection-adas-0002

사람 감지

13.1

person-detection-retail-0013

사람 감지

10.7

person-vehicle-bike-detection-crossroad-1016

사람, 자동차, 자전거 감지

6.2

yolo-v3

객체 감지 (80 classes)

1.9

tiny-yolo-v3

객체 감지 (80 classes)

29.9

vehicle-detection-adas-0002

차량 감지

14.0

vehicle-license-plate-detection-barrier-0106

자동자 번호판 감지

30.0

사용예

openpose2

포즈 추정 (openpose)

6.5

human-pose-estimation-0001

포즈 추정 (intel)

7.3

  • deeplabv3p_person – 사람이 감지된 이미지의 일부를 강조 표시할 수 있습니다.
$ python3 depthai_demo.py -cnn deeplabv3p_person
  • face-detection-adas-0001 – 이미지에서 얼굴을 감지할 수 있습니다. (slower)
$ python3 depthai_demo.py -cnn face-detection-adas-0001
  • face-detection-retail-0004 – 이미지에서 얼굴을 감지할 수 있습니다. (faster)
$ python3 depthai_demo.py -cnn face-detection-retail-0004
  • mobilenet-ssd – 20개의 서로 다른 클래스를 감지하는 객체 감지기입니다. (default)
$ python3 depthai_demo.py -cnn mobilenet-ssd
  • pedestrian-detection-adas-0002 – 이미지에서 사람을 감지할 수 있습니다.  (slower)
$ python3 depthai_demo.py -cnn pedestrian-detection-adas-0002
  • person-detection-retail-0013 – 이미지에서 사람을 감지할 수 있습니다. (faster)
$ python3 depthai_demo.py -cnn person-detection-retail-0013
  • person-vehicle-bike-detection-crossroad-1016 – 이미지에서 사람, 자전거 및 차량을 감지할 수 있습니다.
$ python3 depthai_demo.py -cnn person-vehicle-bike-detection-crossroad-1016
  • yolo-v3 – 80개의 서로 다른 클래스를 감지하는 객체 감지기입니다. (slower)
$ python3 depthai_demo.py -cnn yolo-v3
  • tiny-yolo-v3 – 80개의 서로 다른 클래스를 감지하는 객체 감지기입니다. (faster)
$ python3 depthai_demo.py -cnn tiny-yolo-v3
  • vehicle-detection-adas-0002 – 이미지에서 차량을 감지할 수 있습니다.
$ python3 depthai_demo.py -cnn vehicle-detection-adas-0002
  • vehicle-license-plate-detection-barrier-0106 – 이미지에서 차량과 번호판을 모두 감지할 수 있습니다(현재 중국 번호판만 해당).
$ python3 depthai_demo.py -cnn vehicle-license-plate-detection-barrier-0106
  • openpose2 – 인간 포즈 추정 모델입니다.
$ python3 depthai_demo.py -cnn openpose2
  • human-pose-estimation-0001 –  Open Model Zoo 인간 포즈 추정 모델입니다.
$ python3 depthai_demo.py -cnn human-pose-estimation-0001

모델을 다운로드하고 컴파일하는 데 사용하는 모든 데이터는 여기에서 찾을 수 있습니다.

데모 사용

이 섹션에서는 데모 스크립트에서 사용할 수 있는 구성 옵션을 살펴보고 여러분들께서 직접 다양한 구성을 시도해 볼 수 있도록 도와 드리겠습니다.

AI 속성
스위치:
  • Enabled: AI를 켜거나 끕니다. 이 기능을 끄면 Neual Network실행되는 것을 방지하고 메모리도 절약할 수 있습니다. AI 처리보다 Depth/인코딩에 더 집중하는 프로젝트에 유용합니다.
기본 속성:
  • CNN 모델: DepthAI에서 실행할 모델을 선택합니다. 다른 모델 사용에서 대해서도 자세히 알아보세요.

  • SHAVEs: Neual Network를 컴파일하는 데 사용되는 SHAVE 코어 수를 결정합니다.  값이 높을수록 더 빠른 네트워크를 실행할 수 있지만 동시에 활성화할 수 있는 기능에 제한이 있습니다.

  • Model source: 모델 입력으로 사용할 카메라 미리보기를 지정하여 추론을 수행하기 위해 Neual Network로 보낼 프레임을 지정합니다.

  • Full FOV: 활성화하면 nn 입력 크기에 맞게 카메라 이미지가 축소됩니다. 비활성화된 경우 크기를 조정하기 전에 NN 종횡비 (aspect ratio)에 맞게 이미지를 자릅니다.

고급:
  • OpenVINO version: MyriadX blob을 컴파일하고 파이프라인을 실행하는 데 사용할 OpenVINIO 버전을 지정합니다. 대부분의 경우 최신 버전을 사용하는 것이 좋습니다.
  • Label to count: 데모에서 볼 수 있는 특정 레이블의 수를 표시할 수 있습니다(예: 기본 모델로 미리보기에서 고양이의 수를 계산하려면 cat 을 카운트 레이블로 선택하고 스크립트 재 시작합니다.)
  • Spatial bounding box: 활성화되면 감지 영역의 어느 부분이 Depth 추정에 사용되었는지를 보여주는 Depth 미리보기에 경계 상자를 그립니다.
  • SBB Scale Factor: 감지 경계 상자와 비교하여 Spatial 경계 상자의 크기를 결정합니다.
Depth 속성
스위치:
  • Enabled:  Depth를 켜거나 끕니다. 이 기능을 끄면 스테레오 노드가 생성되는 것을 방지할 수 있으며 메모리도 일부 절약됩니다. Depth보다는 AI 처리/인코딩에 더 집중하는 프로젝트에 유용합니다.
  • Use Disparity: 비활 성화인 경우(기본값), 데모 스크립트는 Depth맵을 기반으로 호스트의 디스패리티 맵을 계산합니다. 활성화된 경우 동일한 처리가 장치에서 수행되어 일부 메모리를 소비하지만 호스트 리소스 사용을 제한합니다.
기본 속성:
  • Median Filtering: Depth 맵에 적용되는 노이즈 제거 메디안 필터의 유형을 지정합니다.
  • Subpixel: 서브 픽셀 모드를 활성화하여 Depth 정밀도를 향상 시키고 특히 장거리 측정에 유용합니다.
  • Left Right Check: left-right check 을 활성화하여 객체 경계의 폐색으로 인해 잘못 계산된 디스패리티(disparity) 픽셀을 제거하는 데 사용합니다.
  • Extended Disparity: 확장된 디스패리티 모드를 활성화해 주어진 기준선에 대해 더 가까운 최소 거리를 허용 합니다.
  • Depth Range: 장치에서 계산한 최소 및 최대 거리를 지정합니다.
  • LRC Threshold: 픽셀을 무효화하는 디스패리티(disparity) 픽셀 간의 최대 차이를 지정합니다.(임계값이 높을수록 더 많은 포인트를 통과합니다.)
카메라 속성:
기본 속성:
  • FPS: 카메라가 프레임을 캡처하는 속도를 지정합니다.
  • Resolution: 카메라 센서 해상도 및 이에 따라 캡처된 프레임 크기를 지정합니다.
고급:
  • ISO: 카메라의 집광 능력을 제어합니다.
  • Exposure: 카메라의 노출 시간을 제어합니다.
  • Saturation: 프레임의 색상 강도를 제어합니다.
  • Contrast: 프레임에서 다른 톤의 시각적 비율을 제어합니다.
  • Brightness: 프레임에서 색상이 얼마나 어둡거나 밝은지를 제어합니다.
  • Sharpness: 프레임의 세부 정보 선명도를 제어합니다.
기타:
레코딩:
  • Switches: 지정된 카메라의 레코딩을 활성화합니다.
  • FPS inputs: 녹화 FPS를 지정(기본값 30) 합니다.
  • Destination: 비디오가 저장될 디렉토리 경로를 지정합니다.
보고:
  • Switches: 지정된 기능의 로깅 활성화합니다.
  • Destination: 보고서(로그) 파일이 저장될 파일 경로를 지정합니다.

사용자(커스텀) 모델 사용

경고

커스텀 모델을 사용하려면 로컬로 다운로드된 버전의 depthai 리포지토리가 필요합니다. 설치 프로그램을 사용하여 스크립트를 다운로드하고 실행한 경우 커스텀 모델을 추가해도 작동하지 않습니다. 리포지토리를 다운로드하고 설정하는 방법에 대한 설명이 있는 설정 섹션 으로 이동하셔서 자세히 확인하세요.

Model zoo 에서 다운로드했거나 스스로 학습 시킨(또는 둘 다) 커스텀 모델을 실행하려고 한다고 가정해 보겠습니다. 모델을 DepthAI에서 실행할 수 있도록 준비하려면 MyriadX 칩을 처리 장치로 사용할 수 있는 모델의 최적화된 버전인 MyriadX blob 형식으로 컴파일해야 합니다.

데모 스크립트에서 커스텀 Blob을 실행할 수 있는 몇 가지 방법을 지원합니다. 이에 대해서는 아래 해당 셋션에서 이어 다룹니다. 예를 들어 custom_model(원하는 이름으로 변경 가능)이라는 커스텀 얼굴 감지 네트워크를 추가하고 데모 스크립트로 실행해 보겠습니다.

MyriadX blob 컴파일

MyriadX blob 파일을 만들려면 Neural Network 가 컴파일에 사용될 OpenVINO IR 형식(.xml 및 .bin 파일 구성)이어야 합니다. 본 게시물에서는 모델에 어떻게 얻는지에 대한 방법에 중점을 두지 는 않습니다. 그러나 이러한 모든 내용을  공식 OpenVINO 변환 가이드 에서 확인하실 수 있습니다.

custom_model.xml custom_model.bin 을 변환하기 위해 blobconverter cli 을 사용합니다. 이러한 변환 작업을 도와 주기 위해 변환 도구인  Online MyriadX blob 변환기 가 준비 되어 있습니다.  이 툴을 사용하시는 경우 모든 종속성이 서버에 이미 설치되어 있으므로 자신의 로컬 컴퓨터에 OpenVINO 설치가 필요하지 않습니다. 모델이 TensorFlow 또는 Caffe 형식인 경우의 변환을 위해 여러분 누구나 이 툴을 계속 사용할 수 있습니다.  다만 모델에 따라 다른 입력 플래그를 사용해야 하고 때로는 커스텀 모델 최적화 파라미터를 제공해야 한다는 점에 유의하세요. (더 보기)

먼저 PyPi 에서 blobconverter를 설치합니다.

$ python3 -m pip install -U blobconverter

이제 blobconverter가 설치되면 다음 명령을 사용하여 IR 파일을 컴파일할 수 있습니다.

$ python3 -m blobconverter --openvino-xml /path/to/custom_model.xml --openvino-bin /path/to/custom_model.bin

이 명령을 실행하면 blobconverter가 BlobConverter API에 요청해 제공된 파일에 대한 모델 컴파일을 수행합니다. 컴파일 후 API는 .blob 파일을 생성하고 요청과 함께 전송된 모든 소스 파일을 삭제합니다.

컴파일이 성공적으로 완료되면 blobconverter는 다운로드한 blob 파일의 경로를 반환합니다. 이 blob은 depthai 레파지토리에서 사용되어 지므로 필요하므로 해당 디렉토리로 이동시킵니다.

$ mkdir <depthai_repo>/resources/nn/custom_model
$ mv <path_to_blob> <depthai_repo>/resources/nn/custom_model

설정

이제 준비된 Blob을 실행하려면 데모 스크립트에 대한 몇 가지 추가 설정을 제공해야 합니다. 데모 스크립트는 파이프라인을 설정하고 결과 구문 분석하는 방법에 대한 세부 정보를 위해  custom_model.json 을 참고합니다.

여러분이 사용려는 모델이 MobileNetSSD 또는 Yolo를 기반으로 하는 경우 detection 출력 형식을 사용할 수 있습니다. 다른 유형의 네트워크 모델인 경우 raw (기본) 출력 형식을 사용하고 NN 결과를 디코딩하고 표시하기 위해 커스텀 핸들러 파일을 제공하고 있습니다.

그리고 설정 예제를 사용하여 커스텀 설정 파일을 만들 수 있습니다. 커스텀 가능한 설정 파일은 resources/nn/custom_model 디렉토리 내의 custom_model.json 파일을 기반으로 본인의 어플리케이션에 맞게 수정하시면 됩니다.

  • MobileNetSSD(이 설정을 사용합니다.)
{
    "nn_config":
    {
        "output_format" : "detection",
        "NN_family" : "mobilenet",
        "confidence_threshold" : 0.5,
        "input_size": "300x300"
    },
    "mappings":
    {
        "labels":
        [
            "unknown",
            "face"
        ]
    }
}
  • Yolo

{
    "nn_config":
    {
        "output_format" : "detection",
        "NN_family" : "YOLO",
        "input_size": "416x416",
        "NN_specific_metadata" :
        {
            "classes" : 80,
            "coordinates" : 4,
            "anchors" : [10,14, 23,27, 37,58, 81,82, 135,169, 344,319],
            "anchor_masks" :
            {
                "side26" : [1,2,3],
                "side13" : [3,4,5]
            },
            "iou_threshold" : 0.5,
            "confidence_threshold" : 0.5
        }
    },
    "mappings":
    {
        "labels":
        [
              "unknown",
              "face"
        ]
    }
}
  • Raw (handler.py 파일 생성 방법에 대한 자세한 내용은 커스텀 핸들러  섹션을 참조하세요.)
{
    "nn_config": {
        "output_format" : "raw",
        "input_size": "300x300"
    },
    "handler": "handler.py"
}

데모 스크립트 실행

파일이 필요한 위치에 준비되면 이제 커스텀 모델로 데모를 실행할 수 있습니다.

이제 해당 모델에 대한  출력과 NN 결과가 표시되어야 합니다.(또는 raw가 선택되었거나, 핸들러 파일이 없는 경우 콘솔에 출력됩니다.)

이제 여러분들은 OAK 시리즈의 기본 모델 동작을 확인하셨습니다.  추가로 아래의 고급 섹션을 확인하거나 다음 단계 를 참고하여 더 많은 프로젝트 및 깊이 있는 학습을 진행하실 수 있습니다.

커스텀 핸들러

커스텀 핸들러는 데모 스크립트가 NN 결과를 구문 분석하기 위해 로드하고 실행할 파일입니다. handler  설정 값으로 이 파일을 작성하고 기본 설정 파일의 경로를 지정합니다. 또한 스크립트가 결과 자체를 처리하는 것을 방지하기 때문에 raw 출력 형식이 필요합니다.

handler.py 파일에는 decode(nn_manager, packet)draw(nn_manager, data, frames) 의 두 가지 메서드가 포함되어야 합니다.

def decode(nn_manager, packet):
  pass

def draw(nn_manager, data, frames):
  pass

첫 번째 메서드 decode 는 NN 패킷이 파이프라인(packet 매개변수로 저장됨)에서 도착할 때마다 호출되며 스크립트에서 사용한 모든 nn 관련 정보(예: 입력 크기 등)가 포함된 nn_manager 개체를 제공합니다. 이 함수의 목적은 NN blob에서 수신된 패킷을 나중에 표시할 수 있는 의미 있는 결과로 디코딩하는 것입니다.

두 번째 항목인 draw는 NN 결과 (decode 에서 반환됨), nn_manager 객체 및  [(<frame_name>, <frame>), (<frame_name>, <frame>), ...]항목이 있는 프레임 배열과 함께 호출됩니다 . 이 배열에는 -s/–show 매개변수로 지정된 프레임이 포함됩니다. 이 기능의 목표는 디코딩된 결과를 수신된 프레임에 그리는 것입니다.

아래에서 MobilenetSSD 기반 결과를 디코딩하고 표시하는 예제 handle.py 파일을 찾을 수 있습니다.

import cv2
import numpy as np
from depthai_helpers.utils import frame_norm


def decode(nn_manager, packet):
    bboxes = np.array(packet.getFirstLayerFp16())
    bboxes = bboxes.reshape((bboxes.size // 7, 7))
    bboxes = bboxes[bboxes[:, 2] > 0.5]
    labels = bboxes[:, 1].astype(int)
    confidences = bboxes[:, 2]
    bboxes = bboxes[:, 3:7]
    return {
        "labels": labels,
        "confidences": confidences,
        "bboxes": bboxes
    }


decoded = ["unknown", "face"]


def draw(nn_manager, data, frames):
    for name, frame in frames:
        if name == nn_manager.source:
            for label, conf, raw_bbox in zip(*data.values()):
                bbox = frame_norm(frame, raw_bbox)
                cv2.rectangle(frame, (bbox[0], bbox[1]), (bbox[2], bbox[3]), (255, 0, 0), 2)
                cv2.putText(frame, decoded[label], (bbox[0] + 10, bbox[1] + 20), cv2.FONT_HERSHEY_TRIPLEX, 0.5, 255)
                cv2.putText(frame, f"{int(conf * 100)}%", (bbox[0] + 10, bbox[1] + 40), cv2.FONT_HERSHEY_TRIPLEX, 0.5, 255)

커스텀 얼굴 감지 모델에서 이 코드를 사용하여 다음 출력했습니다.

데모 스크립트 deeplabv3p_person 에서 위에서 설명한 커스텀 핸들러 메커니즘을 사용해 디코딩 합니다.

ON-Demand 컴파일

IR 형식의 파일은 사이즈가 클 수 있고 또 Blob을 다운로드하고 IR 형식을 서버에 업로드하기 때문에 BlobConverter 서버가 내부적으로 사용하는 OpenVINO와 유사한 model.yml 파일로 구조를 통합했습니다. OpenVINO Model Zoo 사용 가능한 모델의 데모 스크립트에서  이 파일이 어떻게 구현되는지 확인할 수 있습니다.

이 파일은 컴파일에 필요한 파일을 다운로드하는 데 사용되는 OpenVINO 모델 다운로더 에서 사용됩니다. 데모 스크립트에서는 이 파일을 사용하여 소스 코드와 함께 업로드하는 대신 NN 소스 파일에 URL을 제공합니다. 또한 On-demand 컴파일을 통해 다른 수의 MyriadX SHAVE 코어를 요청하면서 동일한 구성을 사용할 수 있기 때문에 유용합니다.

model.yml 파일을 사용하여 blob을 다운로드하려면 다음을 실행합니다.

$ python3 -m blobconverter --raw-config /path/to/model.yml --raw-name custom_model

또한 resources/nn/ 디렉토리 안에 model.yml 파일을 남겨둘 수도 있습니다. 이렇게 하면 데모 스크립트가 변환을 수행하고 수신된 blob을 실행합니다.

$ python3 depthai_demo.py -cnn <name>

데모 코드 커스터마이징

콜백 파일

데모에 몇 가지 커스텀 기능을 직접 추가하거나 특정 변수가 어떻게 생겼는지 확인하기위해 콜백 파일을 사용할 수 있습니다. 이 파일에는 데모가 실행되는 동안 특정 이벤트가 발생하면 호출할 메서드가 포함되어 있습니다.

리포지토리에서 사용할 수 있는 콜백 파일의 예는 다음과 같습니다.

def shouldRun():
  pass  # Called to determine if the demo should be running


def onNewFrame(frame, source):
  pass  # Called when a new frame is available


def onShowFrame(frame, source):
    pass  # Called when a frame is about to be displayed


def onNn(nn_packet):
    pass  # Called when a new NN packet is available


def onReport(report):
    pass  # Called when a new report is available


def onSetup(*args, **kwargs):
    pass  # Called when the demo script is setting up


def onTeardown(*args, **kwargs):
    pass  # Called when the demo script is finishing


def onIter(*args, **kwargs):
    pass  # Called on each demo script iteration (internal loop)

이 방법을 사용하면 데모 스크립트 앞 부분에 사용자 기능을 추가할 수 있습니다. 이 사용자 기능들에는 단지 출력하거나, NN에서의 데이터를 계산하거나, 프레임 표시를 변경하거나, 심지어는 외부 목적지에 데이터를 보내기 위해 커스텀 데이터베이스와 API 연결을 만들 수 있습니다.

기본적으로 데모 스크립트는 레파지토리의 callbacks.py 파일을 사용하지만 이 경로 cam 은 -cb <path> / –callback <path>  플래그를 사용하여 변경됩니다.

데모를 클래스로 가져오기

필요한 경우 데모 스크립트를 일반 클래스처럼 가져올 수도 있습니다. 이렇게 하면 데모가 시작되고 실행되는 시점를 여러분이 제어할 수 있습니다. Python 코드에서 데모를 실행하는 간단한 방법 예제는 다음과 같습니다.

from depthai_demo import Demo
from depthai_helpers.arg_manager import parseArgs
from depthai_helpers.config_manager import ConfigManager

args = parseArgs()
conf = ConfigManager(args)
demo = Demo(onNewFrame=<fn>, onShowFrame=<fn>, onNn=<fn>, onReport=<fn>, onSetup=<fn>, onTeardown=<fn>, onIter=<fn>) # all params are optional
demo.run_all(conf)

위의 코드를 정상적으로 작동 시키려면 작업 디렉토리를 포함 시켜야합니다. 이를 위해  PYTHONPATH 환경 변수에 depthai 레파지토리 경로가 포함 되어 있어야 합니다. 또는 리포지토리의 depthai_demo.py 파일과 같은 디렉토리에 스크립트를 배치할 수 있습니다.

다음 단계

위 섹션에서 기본 DepthAI 기능을 미리 보는 방법을 배웠습니다. 이 시점부터 DepthAI 세계를 더 탐험할 수 있습니다.

  • 영감을 찾고 계십니까?

DepthAI의 특정 문제를 해결하기 위해 바로 사용할 수 있는 응용 프로그램에 대한 예제 사용 사례를 확인하세요.

  • 코딩을 시작하시겠습니까?

API에 대한 단계별 소개는 API 섹션의 hello world tutorial을 확인하세요.

  • 커스템 모델을 학습시켜 DepthAI에 배포하기를 원하세요?

Colab 노트북을 바로 사용하려면 맞춤형 학습 페이지를 방문하세요.

Leave a Comment

Your email address will not be published.