2020년 6월 24일 수요일

딥러닝 기반 객체 추적 방법

이 글은 딥러닝 기반 객체 추적 기술에 대한 내용을 간략히 정리한다.
객체 추적은 다음 그림과 같이 탐지된 객체의 ID를 붙이고, 이동하는 경우 이를 따라가는 기술로 동일한 특징을 이용해 객체를 추적한다.

딥러닝 기반 객체 추적

관련 레퍼런스는 다음과 같다.

2020년 6월 11일 목요일

고성능 인공지능 임베디드보드 NVIDIA AGX Xavier 소개, 설치 및 예제 실행

이 글은 NVIDIA AGX Xavier 소개, 설치 및 예제 실행 방법을 소개한다.
NVIDIA AI

NVIDIA AGX Xavier 소개
NVIDIA AGX Xavier는 고성능 딥러닝용 개발 보드로 512 Core GPU, 11 TFLOPS, 8-core ARM CPU, 16GB LPDDR, 32GB eMMC를 장착한 엠베디드 보드이다. 이로 인해 세그먼테이션, 포인트 클라우드 데이터셋같이 큰 GPU 메모리와 많은 계산량이 필요한 사례에 유용하다(ㅎ본인이 AGX를 세팅한 이유다). 관련 자세한 내용은 다음 링크를 참고한다.
AGX 이상부터는 Isaac SDK 도 사용할 수 있어, AI기반 분석, 시뮬레이션 등 고성능이 필요한 어플리케이션도 개발할 수 있다.

NVIDIA Jetpack 소개
2019년 기점으로 NVIDIA 보드에 JETPACK 설치 방법은 다음과 영상과 같이 SDK manager를 통하게 되었다. 참고로, 제트팩은 엔비디아 보드 위에서 구동되는 딥러닝, 머신러닝, 비전 라이브러리 및 예제가 포함된 개발 플랫폼이다. 

현재 버전인 제트팩 4.3은 다음 기능을 라이브러리 및 소스코드로 제공한다.
DeepStream 아키텍처(참고 - DeepStream Getting Started)
DeepStream 4.0 demo

Jetpack 설치 준비물
그냥 AGX 자비에를 전원, 모니터 연결해 켜 보면, 우분투가 미리 설치되어 있는 것을 확인할 수 있다. 하지만, 이 우분투는 NVIDIA AGX 용 드라이버, 라이브러리 등이 전혀 설치되어 있지 않아 사용할 수 없는 것이다. 다음 방법을 통해 제트팩과 NVIDIA 보드용 리눅스를 설치해야 제대로 개발보드를 사용할 수 있다.

설치를 위해 다음을 준비한다.
  • 우분투 18.04가 설치된 별도 노트북이나 컴퓨터
  • 모니터 및 HDMI 케이블
  • 무선 키보드 및 마우스
  • Intel 8265NGW WiFi 어답터(조립 참고 영상) 및 WiFi 동글
  • NVIDIA AGX Xavier
이와 관련해 다음 영상을 참고해, 설치 작업을 준비한다.

노트북에 Jetpack을 다운로드 받아야 하므로, 다음과 같이 df 명령으로 root, home에 충분히 넉넉한 공간이 있는 지 확인한다. 최소 20Gb는 있어야 설치를 제대로 할 수 있다.

Jetpack 설치 방법
노트북 우분투에서 AGX Xavier용 SDK manager를 다운로드 받고 실행한다.

메니저 프로그램 실행되면 다음과 같이 NVIDIA 가입 후 로그인, 암호를 입력한다.

옵션을 선택한다. ADDITIONAL SDK 도 모두 선택한다.

이후, 다음과 같이 I accept... 선택하고, CONTINUE 버튼을 누르면, 자동으로 각 SDK 도구가 다운로드 될 것이다.

다운로드에는 네트워크 상태에 따라 몇 시간 이상이 소요된다.

다운로드가 다 되면, 자동 설치가 진행된다. 이 때 다음과 같이 설치 옵션 선택 화면이 표시된다. 이때 Automatic에서 Manual로 수정한다.

이제 다음 단계를 진행한다.
  1. NVIDIA AGX Xavier는 별도 부팅하고, 이미 설치되어 있는 우분투 설정을 완료한다. 
  2. JetPack설치를 위해 파워 종료한다. 
  3. 엔비디아 자비에의 전원 반대쪽 USB 3.0포트와 노트북을 연결한다.  
  4. 다음 그림에서 Force Recovery 버튼을 먼저 누르고, Power 버튼을 누른후 동시에 땐다. 그럼, AGX Xavier가 설치 가능 상태로 변경된다.  

이 상태에서 노트북 우분투에서 보이는 다음 그림의 Flash버튼을 클릭한다. 그럼, 자비에 보드에 테그라용 우분투, 드라이버 등이 USB SSH를 통해 설치된다. 설치 후, 자비에 보드는 재부팅되고, 우분투 설정이 진행된다. 자비에 보드 우분투에 ID, PWD 입력 후 설정을 완료한다. 이후에는 노트북의 우분투 젯슨 설치 화면의 지시를 따라서 ID, PWD를 입력하고 install 을 실행하면 된다.  

그럼, 다음과 같이 한두시간 후에 설치될 것이다. 

모두 설치되었다면, 몇몇 데모 소스코드를 빌드해 본다. 
$ /usr/share/visionworks/sources/install-samples.sh ~/ 
$ cd ~/VisionWorks-1.6-Samples/ 
$ make -j4
AGX demo build

빌드 후  bin 폴더 아래 실행파일을 각각 입력해 보자. 
$ ~/VisionWorks-1.6-Samples/bin/aarch64/linux/release$ ls nvx_demo_feature_tracker 

다음과 같이 실행될 것이다. 성공한 것에 축하한다.
DNN demo
YOLO demo (blog)

Deepstream sample 을 실행해 보자. 우선, 다음과 같이 데모 프로그램을 빌드한다.
$ cd /opt/nvidia/deepstream/deepstream/sources/apps/sample_apps/deepstream-test1
make
$ deepstream-test1-app /opt/nvidia/deepstream/deepstream-5.0/samples/streams/sample_720p.h264

그럼 다음과 같은 객체 탐지 수행결과를 확인할 수 있다.
기존 촬영 영상을 h.264 포맷으로 변환하고, 테스트해보자. 다음과 같이 객체 탐지가 잘 되는 것을 확인할 수 있다.

이제 세그먼테이션을 수행해보자.
$ sudo nvpmodel -m 0
$ sudo jetson_clocks
$ cd ~/deepstream-5.0
$ cd sources/apps/sample_apps/deepstream-segmentation-test
$ make
$ ./deepstream-segmentation-app dstest_segmentation_config_semantic.txt ../../../../samples/streams/sample_720p.mjpeg ../../../../samples/streams/sample_720p.mjpeg
$ ./deepstream-segmentation-app dstest_segmentation_config_industrial.txt ../../../../samples/streams/sample_720p.mjpeg ../../../../samples/streams/sample_720p.mjpeg
$ ./deepstream-segmentation-app dstest_segmentation_config_industrial.txt ../../../../samples/streams/sample_industrial.jpg

다음과 같이 차량 및 사람이 세그먼테이션된 결과가 출력될 것이다.

엔비디아 개발 보드를 설정하는 작업은 반나절에서 하루 정도 소요된다. 몇몇 시행착오가 있으나 구글링을 통해 해결할 수 있는 수준이다. 인내심을 가지고 단계적으로 따라하면 큰 문제 없이 데모 화면을 볼 수 있을 것이다.

기타, SSD 메모리를 추가로 장착하고 싶다면, 다음 영상을 참고하길 바란다.

튜토리얼 및 워크샵 예제는 다음 링크를 참고한다.
Deep Stream demo

활용 사례
이 정도급의 GPU 성능과 메모리라면, 거의 대부분의 학습 데이터셋을 학습, 사용할 수 있다. 아래는 이와 관련된 사례이다.

레퍼런스

2020년 6월 7일 일요일

페이스북 딥러닝 객체 인식 프레임웍 Detectron2 기반 객체 세그먼테이션 방법 소개

이 글은 페이스북에서 개발한 오픈소스 Detectron 2 기반 객체 세그먼테이션 프레임워크를 간략히 소개하고, 빌드 및 사용방법을 나눔한다.
Detectron2기반 실시간 객체 세그먼테이션

소개
객체 감지 및 분할은 자율주행차량에서 컨텐츠 이해에 이르는 다양한 목적에 사용된다. PyTorch에서 구현된 객체 인식 프레임웍인 Detectron2는 다양한 세그먼테이션을 지원한다. Detectron2는 페이스북에서 개발한 DensePose, Mask R-CNN 등을 제공하고 있다. 이를 통해, 스마트 카메라 등의 기능을 쉽게 개발할 수 있다. 이를 이용해, 손쉽게 다양한 사물들을 탐지하고 세그먼테이션하여, 객체의 유형, 크기, 위치 등을 자동으로 얻을 수 있다.

다음 영상은 이에 대한 소개이다.

이 프레임웍은 모델 설정 파일 및 모델을 config, model zoo 폴더에 별도 관리하고 있어, 다양한 모델을 재활용할 수 있다. tools 폴더에는 train_net.py 가 있어, 이를 통해 데이터학습을 지원한다. 

디텍트론은 다양한 세그먼트 마스크를 지원하여 유용성이 높다. 다만, 세그먼테이션 모델로 속도가 그리 빠르지는 않다.

설치 및 빌드 방법
이 글에서 실행된 디텍트론2는 우분투 18.04, 엔비디아 드라이버 440.82,  CUDA 10.0, cuDNN 7.6 환경에서 설치되었다. CUDA, cuDNN 설치는 다음 링크를 참고한다.
Detectron2는 오픈소스로 다음 링크에서 관련 내용을 다운로드할 수 있다.
설치는 다음과 같다(에러 발생할 경우, 레퍼런스 참고).
git clone https://github.com/facebookresearch/detectron2.git
python -m pip install -e detectron2

데모 실행
설치 후 데모를 실행해 보자. 미리 이미지와 동영상 파일을 준비해 놓는다. weight model 은 model zoo에서 다운로드 받는다.
cd demo/
python demo.py --config-file ../configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml --input image1.jpg --opts MODEL.WEIGHTS model_final_b275ba.pkl

동영상도 세그먼테이션해 보자.
python demo.py --config-file ../configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml --video-input ~/project/data/2.mp4 --opts MODEL.WEIGHTS model_final_b275ba.pkl 

이제는 Fast R-CNN 모델을 실행해 본다.
python demo.py --config-file ../configs/COCO-Detection/faster_rcnn_R_101_FPN_3x.yaml --input ./1.jpg --opts MODEL.WEIGHTS model_final_b275ba.pkl 

Keypoint 를 추출하려면 다음 모델을 실행하면 된다.
python demo.py --config-file ../configs/COCO-Keypoints/keypoint_rcnn_R_50_FPN_3x.yaml --video-input ~/project/data/2.mp4 --opts MODEL.WEIGHTS model_final_b275ba.pkl

이런 방식으로 다양한 모델을 간단히 실행해 볼 수 있다.

이외 Colab이나 AWS에서 실행 가능하다.

마무리
디텍트론은 페이스북 연구소에서 개발한 다양한 딥러닝 모델을 손쉽게 사용할 수 있다. 아울러, 모델을 교체해 테스트하는 방법이 레고블럭 사용하는 것처럼 편리하다. 다만, 실제 사용을 해보면, 2080 Ti 에서도 실행 속도가 그리 빠르지 않아 아쉬움이 있다.

레퍼런스