2020년 7월 3일 금요일

OpenPose 빌드 및 사용하기

오픈포즈는 카메라 이미지로만 다음 그림과 같이 사람의 뼈대를 추출하는 딥러닝 모델이다.

소스코드는 다음과 같이 다운로드 할 수 있다. 멀티 플랫폼을 지원하므로 윈도우에서도 실행할 수 있다. 단, 데이터 학습을 위해서는 Caffe 를 사용하므로 미리 설치하고 빌드해야 한다.
./build/examples/openpose/openpose.bin --video clockwork.avi --write_video output/result.avi

이와 관련해, 다음 링크를 참고해 설치 및 실행해 본다.
모델파일은 다음 링크를 참고해 다운로드한다. 

Reference


CUDA, cuDNN 설치 및 버전 확인

CUDA와 CUDnn은 운영체제 및 버전에 맞게 엔비디아 사이트에서 다운로드 받고 설치해야 한다.
만약, 아나콘다로 설치하려면 다음 명령을 입력한다.
conda install cudatoolkit
conda install cudnn

설치 후 cudnn.h 파일 중 아래 부분을 수정한다.
#include "driver_types.h"   >   #include <driver_types.h>

아래와 같이 쉘 파일을 편집해 경로를 추가한다.
gedit ~/.bashrc
export PATH="/home/ktw/anaconda3/bin:$PATH"
export PATH="/usr/local/cuda-10.0/bin:$PATH"
export PATH="/usr/local/cuda-10.0/lib64:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda-10.0/lib64:$LD_LIBRARY_PATH"
export LIBRARY_PATH="/usr/local/cuda-10.0/lib64:$LIBRARY_PATH"

환경변수를 체크한다.
printenv

제대로 설치되었는 지 버전 등 체크한다.
검색 설
cd /usr/local/cuda-xx.x/lib64
ls
cat /usr/local/cuda/version.txt
nvcc  --version
cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2

예제를 아래 폴더에서 home 폴더로 복사한다.
/usr/src/cudnn_sample_v7

cudnn 폴더 아래 mnist 예제 폴더안에서 다음 같이 메이크한다.
make

빌드된 결과를 실행하면 다음 결과를 얻을 수 있다.

레퍼런스

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 기반 객체 세그먼테이션 방법 소개

이 글은 페이스북에서 개발한 오픈소스 Detectron2 기반 객체 세그먼테이션 프레임워크를 간략히 소개하고, 빌드 및 사용방법을 나눔한다.
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 에서도 실행 속도가 그리 빠르지 않아 아쉬움이 있다.

레퍼런스

2020년 5월 15일 금요일

딥러닝 YOLACT 기반 객체 세그먼테이션 방법 소개 및 사용방법

이 글은 YOLACT 기반 객체 세그먼테이션 방법을 간단히 소개한다.

머리말
YOLACT(You Only Look At CoefficienTs)은 캘리포니아 대학교 (University of California)의 연구그룹이 2019년도 발표한 실시간 객체 세그먼테이션 기술이다. 다음은 이를 이용한 객체 세그먼테이션 결과이다.
YOLACT
YOLACT 예측 테스트

세그먼테이션을 위해서는 다음 그림과 같이 주어진 이미지 특정 객체영역 내 픽셀의 클래스를 출력으로 학습해야 한다. 이 결과 이미지의 구분된 영역을 개별 객체들로 인식할 수 있다.

YOLACT++는 널리 알려진 물체 인식 기술인 YOLO에서 영감을 얻었으며, 실시간으로 빠르게 물체를 감지한다. DeepLab과 같이 객체 탐지와 달리 시맨틱 또는 인스턴스 세그먼테이션을 위한 대부분의 방법은 속도에 따른 성능에 중점을 두고 있다.

YOLACT가 인스턴스 세그먼테이션 문제를 해결하기 위해, 병렬로 실행되는 두 개의 작업 (프로토타입 마스크 딕셔너리 생성, 인스턴스 선형조합세트 예측)을 구분해 학습을 수행한다. 이를 통해 계산 시간을 크게 줄일 수 있다. YOLACT 모델은 ResNet50 모델에서 33.5 fps, 34.1 mAP로 높은 정확도와 예측 속도를 지원한다. 
주요 객체 세그먼테이션 딥러닝 모델 성능(AP=Average Precision. FPS=Frame Per Second. NMS=Non-Maximum Suppression)

YOLACT 사용 방법
YOLACT 사용을 위해서는 미리 다음과 같은 개발환경이 구축되어 있어야 한다. 개발환경 구축은 많은 시행착오가 필요하다. 딥러닝 개발환경 구축과 관련해 이전 글 #1, #2, #3, #4을 참고 바란다.
  • 우분투 18.04 버전 이상
  • NVIDIA GPU 드라이버 및 CUDA 10 버전 이상
  • 아나콘다 개발 환경
  • PyTorch 
YOLACT 소스를 다운받고 빌드해야 한다. 다음 명령을 입력한다.
conda env create -f environment.yml

만약 기존 아나콘다 환경을 보관하고 싶을 경우, 다음과 같이 환경을 복사해 이름을 변경해 놓는다.
conda create --name new_name --clone old_name
conda remove --name old_name --all

학습 데이터셋은 다음과 같이 다운받을 수 있다.
sh data/scripts/COCO.sh
sh data/scripts/COCO_test.sh

DCN(Deformable Convolutional Networks)을 사용하려면 다음을 실행한다.
cd external/DCNv2
python setup.py build develop

YOLACT 사용을 위해 딥러닝 훈련된 모델을 다운로드 받는다.
Image SizeBackboneFPSmAPWeights
550Resnet50-FPN42.528.2yolact_resnet50_54_800000.pthMirror
550Darknet53-FPN40.028.7yolact_darknet53_54_800000.pthMirror
550Resnet101-FPN33.529.8yolact_base_54_800000.pthMirror
700Resnet101-FPN23.631.2yolact_im700_54_800000.pthMirror
다음 명령을 통해 데이터셋을 학습한다. batch_size 하나당 1.5GB GPU 메모리가 필요하고, 이 크기가 클수록 빠른 속도로 훈련이 가능하다. nvidia-smi 명령을 통해 GPU 메모리 크기를 확인하고 이 숫자를 정하자. 세그먼테이션 데이터 훈련을 위해서는 최소 4GB 이상 GPU 카드가 필요하다. 이 이하는 학습 속도나 품질에 문제가 있다. 
python train.py --config=yolact_base_config --resume=weights/yolact_base_54_800000.pth --start_iter=-1 --batch_size=7

참고로, 세그면테이션 데이터 훈련 시간은 기존 객체 인식 훈련에 비해 매우 오래 걸린다. 164,000개의 이미지를 가지고 있는 COCO의 세그먼테이션 데이터의 경우, 전이학습을 사용하지 않으면, 일주일이상이 걸릴 수 있다. 이 경우에는 딥러닝 데이터 모델 훈련에 대략 이틀이 걸렸다.
nvidia-smi 확인
훈련 진행 및 완료
세그먼테이션 데이터 훈련 결과

다음 명령을 실행해 훈련된 모델의 성능 평가를 해본다.
python eval.py --trained_model=weights/yolact_base_54_800000.pth


이제 아래와 같이 평가 테스트를 실행해 보자.
python eval.py --trained_model=weights/yolact_base_54_800000.pth --output_coco_json
python run_coco_eval.py
python eval.py --trained_model=weights/yolact_base_54_800000.pth --output_coco_json --dataset=coco2017_testdev_dataset
python eval.py --trained_model=weights/yolact_base_54_800000.pth --score_threshold=0.15 --top_k=15 --image=my_image.png

세그먼테이션 실행 결과
다음 명령으로 이미지에서 객체 세그먼테이션을 해본다.
python eval.py --trained_model=weights/yolact_base_54_800000.pth --score_threshold=0.15 --top_k=15 --image=input_image.png:output_image.png

특정 폴더 내 이미지를 세그먼테이션하려면 아래 명령을 입력한다.
python eval.py --trained_model=weights/yolact_base_54_800000.pth --score_threshold=0.15 --top_k=15 --images=path/to/input/folder:path/to/output/folder

다음은 이미지 세그먼테이션 결과이다.

다음 명령으로 비디오 내 객체 세그먼테이션을 처리해 본다.
python eval.py --trained_model=weights/yolact_base_54_800000.pth --score_threshold=0.15 --top_k=15 --video_multiframe=4 --video=my_video.mp4

다음과 같이 비디오 이미지도 객체 세그먼테이션이 잘 실행된다. 다만, 일부 객체들이 사람이나 보트같은 것으로 구분되는 문제가 있다. 이는 전이학습을 통해 해결할 수 있어 보인다.

웹캡은 다음 명령으로 처리할 수 있다.
python eval.py --trained_model=weights/yolact_base_54_800000.pth --score_threshold=0.15 --top_k=15 --video_multiframe=4 --video=0

웹캡에서 처리된 객체 세그먼테이션 결과는 다음 명령으로 영상 저장이 가능하다.
python eval.py --trained_model=weights/yolact_base_54_800000.pth --score_threshold=0.15 --top_k=15 --video_multiframe=4 --video=input_video.mp4:output_video.mp4

다음은 건설 객체가 얼마나 잘 인식되는 지 확인해본 YOLACT 실행 영상이다. 
YOLACT 기반 객체 세그먼테이션 처리 영상

건설 객체의 세그먼트를 학습하지 않은 상태이므로, 오탐되는 경우가 발생한다. 앞서 언급했듯이 학습 데이터를 확보해 진행하면, 해당 이슈는 해결할 수 있다. 하지만, 세그먼테이션을 위해 학습 데이터를 확보하고 라벨링하는 것이 쉽지 않은 문제가 있다. 라벨링 방법은 다음 링크를 참고한다.
마무리
지금까지 YOLACT 모델을 이용한 객체 세그먼테이션 방법을 소개하고, 이를 이용해 이미지, 비디오 등에서 객체를 세그먼테이션해 보았다. 세그먼테이션은 다른 딥러닝 모델에 비해 많은 정보를 담고 있어 유용하다. 

다만, 세그먼테이션은 클래스 분류, 객체 탐지에 비해 많은 계산 비용과 학습 노력이 필요하다. 학습을 위해서는 고사양의 GPU가 장착된 컴퓨터가 필요하며, 데이터셋 구축도 많은 노력이 필요하다. 실행 속도도 상대적으로 느리므로, 특정 영역경계를 정확히 찾아내야 하는 문제가 아니라면, 단순히 분류하거나 객체 탐지할 때 굳이 사용할 필요는 없을 것이다. 

Reference