깊이 지각을 위한 맞춤형 임베디드 스테레오 시스템 구축 방법

깊이 지각 시스템을 개발하기 위한 다양한 3D 센서 옵션이 있으며, 여기에는 카메라, 라이다 및 비행 시간 센서를 가진 스테레오 비전이 포함됩니다. 각 옵션에는 장단점이 있습니다. 스테레오 시스템은 일반적으로 비용이 저렴하고 실외용으로 충분히 견고하며, 고해상도 컬러 포인트 클라우드를 제공할 수 있습니다.

현재 시중에는 다양한 기성 스테레오 시스템이 있습니다. 정확도, 기준점, 시야각 및 해상도와 같은 요인에 따라 시스템 엔지니어가 특정 응용 요구 사항을 해결하기 위해 맞춤형 시스템을 구축해야 하는 경우가 있습니다.

이번 글에서는 먼저 스테레오 비전 시스템의 주요 부분을 설명한 다음 기성 하드웨어 구성 요소와 오픈 소스 소프트웨어를 사용하여 맞춤형 스테레오 카메라를 만드는 방법에 대한 지침을 제공합니다. 이 설정은 임베디드에 중점을 두기 때문에 호스트 컴퓨터 없이도 실시간으로 모든 장면의 깊이 맵을 계산합니다. 별도의 글에서는 공간 제약이 적을 때 호스트 컴퓨터와 함께 사용할 맞춤형 스테레오 시스템을 구축하는 방법에 대해 설명합니다.

이러한 온보드 처리 시스템의 혜택을 크게 누릴 수 있는 또 하나의 애플리케이션은 바로 사물 감지입니다. 딥러닝이 발전하면서 사물 감지 기능을 애플리케이션에 추가하는 것이 비교적 쉬워지긴 했지만, 전용 GPU 리소스가 필요하다는 점 때문에 많은 사용자가 사물 감지 애플리케이션을 엄두도 내지 못하고 있습니다. 이 논문에서는 값비싼 호스트 GPU를 이용할 필요 없이 스테레오 비전 애플리케이션에 딥러닝을 합칠 수 있는 방법을 알아보겠습니다. 이 논문의 샘플 코드와 여러 섹션은 스테레오 비전과 딥러닝으로 나뉘어 있습니다. 따라서 귀하의 애플리케이션에 딥러닝이 필요하지 않다면 딥러닝 섹션을 건너뛰셔도 됩니다.

스테레오 비전 개요

스테레오 비전은 두 관점에서 장면의 정보를 비교하여 디지털 이미지에서 3D 정보를 추출하는 것입니다. 두 이미지 평면에서 객체의 상대적 위치는 카메라에서 객체의 깊이에 대한 정보를 제공합니다.

스테레오 비전 시스템의 개요는 그림 1에 나와 있으며 다음과 같은 주요 단계로 구성됩니다.

  1. 교정: 카메라 교정은 내부외부 모두를 나타냅니다. 내부 교정은 영상 중심, 초점 길이 및 왜곡 매개변수를 결정하는 반면, 외부 교정은 카메라의 3D 위치를 결정합니다. 이는 특히 깊이와 같이 장면에 대한 메트릭 정보가 필요할 때 많은 컴퓨터 비전 애플리케이션에서 중요한 단계입니다. 교정 단계는 아래 섹션 5에서 자세히 설명합니다.
  2. 보정: 스테레오 보정은 카메라 중심 사이의 선에 평행한 공통 평면에 이미지 평면을 재투사하는 프로세스를 의미합니다. 보정 후, 해당 지점은 동일한 행에 놓이며 비용과 매칭의 모호성을 크게 줄입니다. 이 단계는 자체 시스템을 구축하기 위해 제공된 코드로 수행됩니다.
  3. 스테레오 정합: 좌우 이미지 사이의 픽셀을 일치시키는 프로세스를 의미하며, 이는 시차 영상을 생성합니다. SGM(Semi-Global Matching) 알고리즘은 자체 시스템을 구축하기 위해 제공된 코드에 사용됩니다.
  4. 삼각측량법: 삼각측량법이란 두 개의 이미지 상에 투영된 3D 공간 내의 지점을 결정하는 프로세스를 지칭합니다. 시차 영상은 3D 포인트 클라우드로 변환됩니다.

stereo_pipeline.jpg

그림 1: 스테레오 비전 시스템 개요

딥러닝 개요

딥러닝은 머신러닝의 하위 분야로, 뇌의 구조와 기능을 본뜬 알고리즘을 처리합니다. 딥러닝은 인간의 뇌가 가진 학습 능력을 모방하려 노력합니다. 딥러닝 알고리즘은 사물 인식, 분류, 분할 등 복잡한 작업을 효율적으로 수행할 수 있습니다. 다른 여러 기술 중에서도 딥러닝은 기계가 입력된 이미지에 담긴 사람 및 사물을 인식할 수 있게 합니다. 우리가 특히 관심 있게 보고 있는 애플리케이션은 사물 감지입니다. 본인만의 딥러닝 알고리즘을 훈련시키려면 라벨이 표시된 다량의 훈련 데이터가 필요한데, 이미 훈련된 오픈 소스 모델을 사용하면 누구든 이러한 애플리케이션을 더욱 쉽게 개발할 수 있습니다.

딥러닝에는 고성능 GPU 또한 필요한데, 이때 TX2용 Quartet 솔루션이 더 큰 용량의 GPU에 있는 모든 기능과 함께 제공되면서 폼 팩터 및 전력 소비량이 훨씬 적은 양으로 줄어듭니다. 게다가 TX2로 딥러닝 모델을 가동하는 것은 차량의 장점을 더욱 늘려 주었으며, 사람을 감지해야 하는 이동식 로봇이 사람을 피해 비키게 해 주는 완벽한 후보 기술이기도 합니다.

설계 예제

스테레오 시스템 설계 예제를 살펴보겠습니다. 다음은 빠르게 움직이는 물체가 있는 동적 환경에서 모바일 로봇 애플리케이션에 대한 요구 사항입니다. 관심 장면의 크기는 2m이고, 카메라에서 장면까지의 거리는 3m이며, 원하는 정확도는 3m에서 1cm입니다.

스테레오 정확도에 대한 자세한 내용은 이 글을 참조하십시오. 깊이 오차는 다음과 같습니다. ΔZ=Z²/Bf * Δd이며 다음 요인에 따라 달라집니다.

  • Z는 범위
  • B는 기준점
  • f는 카메라 시야각 및 이미지 해상도와 관련된 픽셀 단위의 초점 거리

이러한 요건을 충족할 수 있는 다양한 설계 옵션이 있습니다. 위의 장면 크기와 거리 요건에 따라 특정 센서에 대한 렌즈의 초점 거리를 결정할 수 있습니다. 기준점과 함께 위의 공식을 사용하여 3m에서 예상 깊이 오차를 계산하여 정확도 요건을 충족하는지 확인할 수 있습니다.

그림 2에는 기준점이 더 긴 저해상도 카메라 또는 기준점이 더 짧은 고해상도 카메라를 사용하는 두 가지 옵션이 나와 있습니다. 첫 번째 옵션은 더 큰 카메라이지만 계산 필요성이 더 낮고 두 번째 옵션은 더 작은 카메라이지만 계산 필요성이 더 높습니다. 이 응용 분야의 경우 작은 크기가 모바일 로봇에 더 바람직하므로 두 번째 옵션을 선택했으며, 강력한 GPU 온보드 기능을 갖춘 TX2용 Quartet 임베디드 솔루션을 사용하여 처리 요구를 다룰 수 있습니다.

design_options.jpg

그림 2: 예제 응용 분야를 위한 스테레오 시스템 설계 옵션

하드웨어 요구 사항

이 예제에서는 IMX273 Sony Pregius 글로벌 셔터 센서를 사용하여 Blackfly S 보드 레벨 1.6 MP 카메라 2대를 12cm 기준점의 3D 인쇄 바에 장착합니다. 두 카메라 모두 유사한 6mm S-마운트 렌즈를 가지고 있습니다. 카메라는 FPC 케이블 2개를 사용하여 TX2 맞춤형 캐리어 보드용 Quartet 임베디드 솔루션에 연결됩니다. 왼쪽 및 오른쪽 카메라를 동기화하여 동시에 이미지를 캡처하도록 두 카메라를 연결하는 동기화 케이블이 제작됩니다. 그림 3은 맞춤형 임베디드 스테레오 시스템의 정면도와 후면도를 보여줍니다.

Stereo.jpg

그림 3: 맞춤형 임베디드 스테레오 시스템의 정면도와 배면도

다음 표에는 모든 하드웨어 구성품이 나열되어 있습니다.

부품

설명

수량

링크

ACC-01-6005

TX2 모듈 8GB가 장착된 Quartet 캐리어

1

https://www.flir.com/products/quartet-embedded-solution-for-tx2/

BFS-U3-16S2C-BD2

1.6MP, 226FPS, Sony IMX273, 컬러

2

https://www.flir.com/products/blackfly-s-board-level

ACC-01-5009

BFS 색상 보드 레벨 카메라용 S-마운트 및 IR 필터

2

https://www.flir.com/products/s_mount-front

BW3M60B-1000

6mm S-마운트 렌즈

 

http://www.boowon.co.kr/site/down.asp?fileName=BW3M60B-1000.pdf

ACC-01-2401

Blackfly S 보드 레벨용 15cm FPC 케이블

2

https://www.flir.com/products/15-cm-fpc-cable-for-board-level-blackfly-s/

XHG302

NVIDIA® Jetson™ TX2/TX2 4GB/TX2i Active Heat Sink

1

https://connecttech.com/product/nvidia-jetson-tx2-tx1-active-heat-sink/

 

동기화 케이블(자체 제작)

1

https://www.flir.com/support-center/iis/machine-vision/application-note/configuring-synchronized-capture-with-multiple-cameras/

 

장착 바(자체 제작)

1

 

두 렌즈 모두 응용 작업에 필요한 거리 범위에 카메라 초점을 맞추도록 조정해야 합니다. 초점을 유지하기 위해 각 렌즈의 나사(그림 4에서 빨간색 원으로 표시)를 조입니다.

side view.jpg

그림 4: 렌즈 나사를 보여주는 스테레오 시스템의 측면도

소프트웨어 요구 사항

a. Spinnaker

Teledyne FLIR Spinnaker SDK는 TX2용 Quartet 임베디드 솔루션에 사전 설치되어 제공됩니다. 카메라와 통신하려면 Spinnaker가 필요합니다.

b. OpenCV 4.5.2(CUDA 지원 포함)

SGM, 즉 당사가 사용하는 스테레오 정합 알고리즘에는 OpenCV 버전 4.5.1 이상이 필요합니다. 이 글의 코드가 포함된 zip 파일을 다운로드하고 StereoDepth 폴더로 압축을 풉니다. OpenCV를 설치하는 스크립트는 OpenCVInstaller.sh입니다. 터미널에 다음 명령을 입력합니다.

    cd ~/StereoDepth
    chmod +x OpenCVInstaller.sh
    ./OpenCVInstaller.sh

설치 프로그램이 관리자 비밀 번호를 입력하도록 요청합니다. 설치 프로그램이 OpenCV 4.5.2 설치를 시작합니다. OpenCV를 다운로드하고 구축하는 데 몇 시간이 소요될 수 있습니다.

  1. c. Jetson-inference(딥러닝이 필요한 경우)

Jetson-inference는 NVIDIA의 오픈 소스 라이브러리로, TX2와 같은 Jetson 기기의 GPU로 가속화된 딥러닝에 사용할 수 있습니다. 이 라이브러리는 TensorRT SDK를 사용하여 NVIDIA GPU의 고성능 추론을 더욱 원활하게 수행합니다. Jetson-inference는 이미 훈련되었으며 즉시 사용 가능한 여러 가지 딥러닝 모델, 그리고 TensorRT를 사용하여 이 모델들을 배치할 수 있는 코드를 사용자에게 제공합니다. Jetson-inference를 설치하려면 다음 명령어를 단말기에 입력하십시오.

  • cd ~/StereoDepth
  • chmod +x InferenceInstaller.sh
  • ./InferenceInstaller.sh

교정

스테레오 이미지를 가져오고 교정하는 코드는 “교정” 폴더에서 찾을 수 있습니다. SpinView GUI를 사용하여 왼쪽 및 오른쪽 카메라의 일련 번호를 식별합니다. 설정의 경우, 오른쪽 카메라가 마스터이고 왼쪽 카메라가 슬레이브입니다. 마스터 및 슬레이브 카메라 일련 번호를 파일 grabStereoImages.cpp 라인 60 및 61에 복사합니다. 터미널에서 다음 명령을 사용하여 실행 파일을 빌드합니다.

    cd ~/StereoDepth/Calibration
    mkdir build
    mkdir -p images/{left, right}
    cd build
    cmake ..
    make

링크에서 바둑판 패턴을 인쇄하여 평평한 표면에 부착하고 교정 대상으로 사용합니다. 교정 중 최상의 결과를 얻으려면 그림 5와 같이 SpinView에서 자동 노출을 꺼짐으로 설정하고 노출을 조정하여 바둑판 패턴이 선명하고 흰색 사각형이 과도하게 노출되지 않도록 합니다. 교정 이미지를 수집한 후 SpinView에서 게인 및 노출을 자동으로 설정할 수 있습니다.

Spinview settings.png

그림 5: SpinView GUI 설정

이미지 수집을 시작하려면 다음을 입력합니다.

    ./grabStereoImages

코드는 대략 초당 1프레임의 이미지 수집을 시작해야 합니다. 왼쪽 이미지는 이미지/왼쪽 폴더에 저장되고 오른쪽 이미지는 이미지/오른쪽 폴더에 저장됩니다. 대상을 이동시켜 이미지의 모든 모서리에 나타나도록 합니다. 대상을 회전하고 가까이에서 이미지를 촬영하거나 멀리서 이미지를 촬영할 수 있습니다. 기본적으로 프로그램은 100개의 이미지 쌍을 캡처하지만 명령줄 인수를 사용하여 변경할 수 있습니다.

    ./grabStereoImages 20

이러면 20쌍의 영상만 수집합니다. 이렇게 하면 이전에 폴더에 기록된 이미지를 덮어씁니다. 일부 샘플 교정 이미지는 그림 6에 나와 있습니다.

Calibration.jpg

그림 6: 샘플 교정 이미지

이미지를 수집한 후 다음을 입력하여 교정 Python 코드를 실행합니다.

    cd ~/StereoDepth/Calibration
    python cameraCalibration.py

이렇게 하면 스테레오 시스템의 내외부 매개변수를 포함하는 “intrinsics.yml” 및 “extrinsics.yml”라는 2개의 파일이 생성됩니다. 코드는 기본적으로 30mm 바둑판 정사각형 크기를 가정하지만 필요한 경우 편집할 수 있습니다. 교정이 끝나면 교정이 얼마나 잘 진행되고 있는지를 나타내는 RMS 오류가 표시됩니다. 양호한 교정을 위한 일반적인 RMS 오차는 0.5픽셀 미만이어야 합니다.

실시간 깊이 맵

실시간으로 시차를 계산하는 코드는 “Depth” 폴더에 있습니다. 카메라의 일련 번호를 파일 live_disparity.cpp 라인 230 및 231에 복사합니다. 터미널에서 다음 명령을 사용하여 실행 파일을 빌드합니다.

    cd ~/StereoDepth/Depth
    mkdir build
    cd build
    cmake ..
    make

교정 단계에서 얻은 “intrinsics.yml” 및 “extrinsics.yml” 파일을 이 폴더에 복사합니다. 실시간 깊이 맵 데모를 실행하려면 다음을 입력합니다.

    ./live_disparity

왼쪽 카메라 이미지(보정되지 않은 Raw 이미지)와 깊이 맵(최종 출력)이 표시됩니다. 일부 예제 출력은 그림 7에 나와 있습니다. 카메라와의 거리는 깊이 맵 오른쪽에 있는 범례에 따라 색상으로 구분됩니다. 깊이 맵의 검은색 영역은 해당 영역에서 시차 데이터를 찾을 수 없음을 의미합니다. NVIDIA Jetson TX2 GPU 덕분에 해상도 1440 × 1080에서 초당 최대 5프레임, 해상도 720 × 540에서 초당 최대 13프레임을 실행할 수 있습니다.

특정 지점에서 깊이를 보려면 깊이 맵에서 해당 점을 클릭하면 그림 7의 마지막 예제에 표시된 대로 깊이가 표시됩니다.

left and depth map.jpg

그림 7: 왼쪽 카메라 이미지와 해당 깊이 맵을 샘플링합니다. 하단 깊이 맵에는 특정 지점의 깊이도 표시됩니다.

사람 감지

우리는 이미지 프레임에 담긴 사람을 감지하기 위해 Jetson-inference가 제공하는 DetectNet을 사용합니다. DetectNet은 사물 감지용 딥러닝 모델 아키텍처를 선택할 수 있는 여러 옵션과 함께 제공됩니다. 우리는 속도와 정확도를 모두 최적화하기 위해 MobileNetV2 중추가 포함된 SSD(Single Shot Detection, 단일 포착 감지) 아키텍처를 사용합니다. 처음으로 데모를 실행하는 경우 TensorRT가 직렬 엔진을 생성하여 추론 속도를 더욱 최적화하는데, 이 작업이 완료되기까지는 몇 분이 소요될 수 있습니다. 이 엔진은 추후 가동할 수 있도록 파일에 자동으로 저장됩니다. 사용되는 아키텍처는 매우 효율적이며 감지 모듈을 가동하는 데 ~50fps가 소요될 것으로 예상됩니다. 사람 감지 기능과 실시간 스테레오 깊이 기능을 같이 이용할 수 있는 코드는 “DepthAndDetection” 폴더에 담겨 있습니다. 카메라의 일련 번호를 복사하여 live_disparity.cpp 행 271 및 272로 보관하십시오. 단말기에서 다음 명령어를 사용하여 실행 가능한 빌드를 구축하십시오.

  • cd ~/StereoDepth/DepthAndDetection
    mkdir
    buildcd
    buildcmake ..
    make

교정 단계에서 얻은 “intrinsics.yml” 파일과 “extrinsics.yml” 파일을 이 폴더로 복사하십시오. 실시간 깊이 맵 데모를 실행하려면 다음 명령어를 입력하십시오.

  • ./live_disparity

왼쪽이 보정된 색상 이미지 및 깊이 맵을 보여주는 두 개의 창이 나타납니다. 깊이 맵은 깊이 맵이 더욱 잘 시각화될 수 있도록 색상으로 구분되어 있습니다. 이 두 개의 창은 프레임에 담긴 사람의 주변에 바운딩 박스를 표시하고 카메라에서 사람까지의 평균 거리를 표시합니다. 스테레오 처리 및 딥러닝 추론을 모두 갖춘 상태에서 데모는 1440 × 1080 해상도에서 약 ~4fps로 실행되며, 720 × 540 해상도에서는 최대 11.5fps로 실행됩니다.

imageyobnm.png

그림 8: 샘플 왼쪽 카메라 이미지 및 그에 해당하는 깊이 맵. 모든 이미지는 이미지 내에서 감지된 사람, 그리고 해당 사람과 카메라 간의 거리를 표시합니다.

사람 감지 알고리즘은 대상이 가려지는 등 까다로운 환경에서도 여러 사람을 감지할 수 있습니다. 아래 사진과 같이 코드가 감지된 모든 사람까지의 거리를 계산합니다.

imagehlju.png

그림 9: 왼쪽 이미지 및 깊이 맵에는 이미지 내에서 감지된 여러 사람, 그리고 카메라부터 각 사람까지의 거리가 표시되어 있습니다.

요약

스테레오 비전을 사용하여 깊이 지각을 개발하는 것은 실외에서 잘 작동하고 고해상도 깊이 맵을 제공할 수 있으며 저비용으로 기성 구성품을 활용할 수 있다는 장점이 있습니다. 요구 사항에 따라 시중에는 다양한 기성 스테레오 시스템이 있습니다. 맞춤형 임베디드 스테레오 시스템을 개발해야 하는 경우, 이는 여기에 제공된 지침을 따르면 비교적 간단한 작업입니다.

Related Articles