반응형


Jetson 개발 보드에는 작은 5백만 화소 MIPI CSI-2 카메라가 탑재되어 있다. 이 카메라는 최대 2592x1944까지 지원하는 HD급 영상을 받아올 수 있다.

이 카메라를 통해 영상을 입력받는 방법을 알아보자.

특히 nvidia toolkit에 포함된 nsight 를 활용하여 로컬 머신에서 개발한 다음 jetson tx2보드(이하 타겟)에 전송하여 실행하는 방식을 사용하기로 한다.


이를 위해서는 로컬 머신과 타겟에 동일한 버전의 CUDA와 opencv가 설치되어 있어야 한다. 

여기서는 CUDA 8.0, opencv 3.3.1 버전을 기준으로 하였다.

Opencv를 설치하는 자세한 방법은 http://kyubot.tistory.com/93 을 참조하면 된다.

tx2에 opencv를 설치하는 방법은 인터넷에 자세히 나와있으므로 검색을 통해 설치한다.


로컬 머신에 프로젝트 생성하기


먼저 로컬 머신에서 nsight 를 실행하여 이름이 "simpleCapture"인 간단한 C++ 프로젝트를 생성한다.


 자동으로 CUDA Toolkit 8.0이 선택되어 있다.

Finish를 누르면 된다.

왼편 패널에서 새로 생성된 프로젝트에 마우스 커서를 올리고 우측 버튼을 누른다음 New --> Source Folder 를 선택하고 

Folder Name에 src라는 이름을 넣는다.


방금 생성된 폴더에서 다시 마우스 오른쪽 버튼을 눌러 New --> Source File 을 선택하고

Source file 이름에 main.cpp 라고 넣는다.



이렇게 하면 기본적으로 CUDA 관련 내용이 추가된 코드가 생성된다.

이제 이 코드를 모두 삭제하고 새로 작성한다.

과감하게 지우자...


이제 빈 파일에 다음 소스코드를 추가한다.

전체 코드를 텍스트로 올릴 수 있지만 간단한 코드이므로 코드가 어떻게 구성되었는지 알아보기 위해서 한자한자 입력해보는것을 권한다. 각 코드의 세부사항은 다음에 이어진다.



OPENCV 관련 라이브러리 추가하기


이대로 빌드하면 역시 빌드되지 않는데 그것은 아직 opencv 관련 헤더와 라이브러리가 적절하게 설정되지 않았기 때문이다.

어떤 헤더와 라이브러리가 설치되었는지 확인하기 위해 터미널을 열고 다음과 같이 입력해보자.


$ pkg-config --libs opencv

$ pkg-config --cflags opencv



이제 이 항목들을 각각 프로젝트의 include와 library항목에 넣어보자.


Include path에 /usr/local/include/opencv 항목과 /usr/local/include 를 추가하였다.


-l 항목에는 필요한 라이브러리를 추가하고 경로 설정 -L 에는 /usr/local/lib 를 추가한다.



이제 망치 모양의 빌드 버튼을 눌러 빌드가 정상적으로 진행되는지 확인한다.


make all 

Building target: simpleCapture

Invoking: NVCC Linker

/usr/local/cuda-8.0/bin/nvcc --cudart static -L/usr/local/lib --relocatable-device-code=false -link -o  "simpleCapture"  ./src/main.o   -lopencv_core -lopencv_video -lopencv_videoio -lopencv_flann -lopencv_imgcodecs -lopencv_imgproc -lopencv_highgui

nvcc warning : The 'compute_20', 'sm_20', and 'sm_21' architectures are deprecated, and may be removed in a future release (Use -Wno-deprecated-gpu-targets to suppress warning).

Finished building target: simpleCapture



이제 실행 버튼을 누루면 아래와 같이 카메라가 실행되는 것을 확인할 수 있다.


타겟 TX2 보드에서 실행하기


이제 TX2개발보드에서도 동일하게 실행이 되도록 해보자.

이렇게 하기 위해서는 Remote 개발 환경을 추가해야한다. 현재 TX2 타겟과 로컬 머신은 아래와 같이 구성되어 있다.


이제 nsight 의 프로젝트에서 마우스 오른쪽 클릭하여 Property --> Build -> Target Systems에서 Manage를 눌러 타겟을 추가한다.

타겟의 ip와 username 여기서는 nvidia 를 입력한다.


 Project Path는 타겟에 만들어질 프로젝트 위치를 의미한다. 

Toolkit에 Manage를 눌러 cuda-8.0을 검색하여 추가한다. 

CPU 아키텍쳐는 AArch64 로 설정한다.


이제 빌드 환경을 방금 추가한 Remote 의  Debug로 설정한다.

여기서 다시 망치 버튼을 눌러 빌드를 하면 타겟의 보드에서 빌드가 수행된다.

이제 원격 환경에서 실행을 하기 위해 실행 환경을 아래와 같이 추가한다.


메뉴에서 Run --> Run As --> Remote C/C++ Application을 눌러 실행 환경을 추가한다.

    



타겟의 카메라 정보 설정하기


이렇게추가 되면 타겟에서 프로그램을 실행할 수 있다.

하지만 다음과 같은 에러가 뜨면서 실행이 되지 않을 것이다.


nvidia@tegra-ubuntu:~$ /bin/sh -c "cd \"/home/nvidia/workspace_remote/simpleCapture/Debug\";export LD_LIBRARY_PATH=\"/usr/local/cuda-8.0/lib64\":\${LD_LIBRARY_PATH};\"/home/nvidia/workspace_remote/simpleCapture/Debug/simpleCapture\"";exit

VIDEOIO ERROR: V4L2: Pixel format of incoming image is unsupported by OpenCV

OpenCV Error: Unspecified error (GStreamer: unable to start pipeline

) in cvCaptureFromCAM_GStreamer, file /home/nvidia/opencv/modules/videoio/src/cap_gstreamer.cpp, line 881

VIDEOIO(cvCreateCapture_GStreamer(CV_CAP_GSTREAMER_V4L2, reinterpret_cast<char *>(index))): raised OpenCV exception:



빨간색으로 하이라이트된 부분이 원인이다. 이것은 TX2에 장착된 카메라가 지원하는 형식이 달라서 발생하는 것으로 TX2보드에 장착된 CSI 카메라를 사용하기 위해서는

정확한 입력 타입을 설정해주어야 한다.

다시 소스코드로 돌아가서 main 함수의 상단 VideoCapture 오브젝트 선언부분을 다음과 같이 변경한다.

먼저 string 변수를 하나 만들고 여기에 카메라 영상 입력에 관한 정보를 넣는다.

그리고 캡춰 스트림에 이 변수를 입력하면 끝.

int main()
{
	const string gst = "nvcamerasrc ! video/x-raw(memory:NVMM), width=(int)1180, height=(int)720, format=(string)I420, framerate=(fraction)24/1 ! nvvidconv flip-method=6 ! video/x-raw, format=(string)I420 ! videoconvert ! video/x-raw, format=(string)BGR ! appsink";
	VideoCapture stream1(gst);   //0 is the id of video device.0 if you have only one camera.


이제 다시 실행버튼을 누르면 정상적으로 실행이 진행되는 것을 볼 수 있다.


nvidia@tegra-ubuntu:~$ /bin/sh -c "cd \"/home/nvidia/workspace_remote/simpleCapture/Debug\";export LD_LIBRARY_PATH=\"/usr/local/cuda-8.0/lib64\":\${LD_LIBRARY_PATH};\"/home/nvidia/workspace_remote/simpleCapture/Debug/simpleCapture\"";exit


Available Sensor modes :

2592 x 1944 FR=30.000000 CF=0x1109208a10 SensorModeType=4 CSIPixelBitDepth=10 DynPixelBitDepth=10

2592 x 1458 FR=30.000000 CF=0x1109208a10 SensorModeType=4 CSIPixelBitDepth=10 DynPixelBitDepth=10

1280 x 720 FR=120.000000 CF=0x1109208a10 SensorModeType=4 CSIPixelBitDepth=10 DynPixelBitDepth=10


NvCameraSrc: Trying To Set Default Camera Resolution. Selected sensorModeIndex = 1 WxH = 2592x1458 FrameRate = 30.000000 ...



(simpleCapture:2855): Gtk-WARNING **: cannot open display:

logout


실제로는 영상 장치를 원격으로 불러올 수 없기 때문에 원격에서 창을 열지 못한다. 

따라서 타겟에 직접 키보드와 모니터를 연결하고 실행파일이 있는 장소 (여기서는 ~/workspace_remote/simpleCapture/Debug )로 이동하여

$ ./simpleCapture 를 입력하여 실행한다. 

카메라 영상이 화면에 표시된다. 영상이 뒤집어진것에 주의


실행 결과를 보면 영상이 180 뒤집어진 상태로 보여지는 것을 확인할 수 있는데 이것은 cv::flip 함수를 통해 간단히 뒤집을 수 있다.

윈도우에 카메라 영상을 뿌려주는 imshow 와 스트림에서 읽어서 cameraFrame에 넣는 stream1.read(cameraFame) 사이에 cv:flip 으로 cameraFrame을 뒤집는 코드를 추가한다. 첫번째 인자는 출력, 두번째는 입력 프레임이고 세번째 인자는 뒤집는 축을 의미한다.

위아래만 뒤집으면 좌/우가 반대로 나오므로 다시 세로축으로 뒤집어야 된다. 

		Mat cameraFrame;
		stream1.read(cameraFrame);
		cv::flip(cameraFrame, cameraFrame, -1);			//Flip image about y axis(-1)
		cv::flip(cameraFrame, cameraFrame, 1);		//Flip image about x axis(-1)
		imshow("cam", cameraFrame); 


이제 Jetson Tx2 보드로부터 카메라 영상을 받아 여러가지 처리를 할 수 있게 된다.


2018/1/17에 최초 발행됨.


반응형
반응형

아래는 한성에서 나온 고성능 게이밍 노트북인 Bossmonster E54 에 우분투를 설치하고 인공지능 딥러닝을 위한 Caffe 패키지를 설치하는 과정을 정리한 것이다.

컴퓨터의 자세한 사양은 http://prod.danawa.com/info/?pcode=2841137 에 자세히 나와있다.

간략히 정리하면 다음과 같다.

CPU: i7-4720HQ 2.6GHz(3.6GHz)

Memory: 16GiB 

GPU: nvidia 지포스 GTX970M with 4GiB memory


운영체제 설치

우분투 16.04 64bit 버전을 다운로드하여 설치한다. 자세한 설치 방법은 다루지 않는다.


그래픽 카드 드라이버 설치


인공지능 딥러닝에 사용하는 빠른 연산능렬을 활용하기 위해서는 CUDA를 사용할 수있도록 하는 최신 드라이버를 설치해야 한다.

엔비디아 홈페이지에서 다운로드 받을 수도 있지만 조종 최신 버전이 아니거나 다른 프로그램과 호환이 안되거나 하는 문제가 있으므로 ppa로 설치하는게 추천된다.

먼저 우분투에 ppa 패키지 repository를 추가한다.


$ sudo add-apt-repository ppa:graphics-drivers/ppa

그리고 업데이트


$ sudo apt update
$ sudo apt-get update
$ sudo apt-get upgrade

이제 제어판 혹은 System Setings에서 Software & Updates를 선택한다.

 Additional Drivers 항목에서 다음을 선택한다.



CUDA 설치하기


nvidia 다운로드 페이지로 이동한다음 https://developer.nvidia.com/cuda-80-ga2-download-archive

Linux Ubuntu 16.04 x86_64 .deb 버전을 다운로드 한다. 회원 가입이 필요하다.

터미널을 열고 Download 폴더로 이동한 다음 다음을 수행한다.


$ sudo dpkg -i cuda-repo-ubuntu1604-8-0-local-ga2_8.0.61-1_amd64.deb 

apt 업데이트 후 CUDA를 설치한다.


$ sudo apt-get update
$ sudo apt-get install cuda

CUDA 설치 패스를 적용한다.


$ export PATH=/usr/local/cuda-8.0/bin${PATH:+:${PATH}}

설치가 잘 되고 작동하는지 확인하기 위해 설치 폴더 안에 있는 샘플 프로그램 폴더로 이동하여 빌드를 수행해본다.

여기는 유저 영역이 아닌 시스템 영역이므로 sudo를 사용한다.


$ cd /usr/local/cuda/samples/5_Simulations/fluidsGL
$ sudo make

빌드가 정상적으로 이루어지면 녹색으로 된 실행 파일이 생성된다.


$ ./fluidsGL

새 창이 뜨고 동작하면 정상적으로 설치된 것이다.



OPENCV설치하기


영상인식을 위한 이미지 처리를 하기 위해 opencv 가 필요하다. 여기서는 3.3.1 버전을 설치한다.

opencv 를 설치하기 위해 필요한 패키지들을 설치한다.


$ sudo apt-get install build-essential cmake git pkg-config libjpeg8-dev \
libjasper-dev libpng12-dev libgtk2.0-dev \
libavcodec-dev libavformat-dev libswscale-dev libv4l-dev gfortran
$ sudo apt-get install libtiff5-dev 

최적화를 수행하기 위한 BLAS 패키지를 설치한다.


sudo apt-get install libatlas-base-dev

opencv 와 caffe 를 사용하기 위해서는 python2.7-dev패키지가 필요하다.


$ sudo apt-get install python2.7-dev

파이썬에서 수치연산등을 수행하는 패키지인 numpy를 설치하기 위해 pip를 설치한다.


$ wget https://bootstrap.pypa.io/get-pip.py
$ sudo python get-pip.py

이제 pip 명령어를 사용하여 numpy 를 설치할 수 있다.


$ pip install numpy

opencv 설치하기

home 디렉토리로 이동하여 opencv 와 contrib 를 다운로드 받고 3.3.1 버전으로 체크아웃 한다.


$ cd ~
$ git clone https://github.com/Itseez/opencv.git
$ cd opencv
$ git checkout 3.3.1
$ cd ~
$ git clone https://github.com/Itseez/opencv_contrib.git
$ cd opencv_contrib
$ git checkout 3.3.1


opencv build 하기

opencv 안에 build 폴더를 만들고 cmake로 Makefile을 생성한다음 빌드한다.


$ cd ~/opencv
$ mkdir build
$ cd build
$ cmake -D CMAKE_BUILD_TYPE=RELEASE \
	-D CMAKE_INSTALL_PREFIX=/usr/local \
	-D INSTALL_C_EXAMPLES=ON \
	-D INSTALL_PYTHON_EXAMPLES=ON \
        -D BUILD_NEW_PYTHON_SUPPORT=ON \
        -D WITH_OPENGL=ON \
        -D WITH_V4L=ON \
        -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \
	-D BUILD_EXAMPLES=ON ..
  
$ make
$ sudo make install
$ sudo ldconfig

CuDNN 설치하기


이제 CuDNN을 설치한다. Cudnn GPU가속 기능을 활용하여 Deep 신경망을 만들기 위한 primitives를 제공하는 패키지다.

다시 nvidia의 다운로드 페이지  https://developer.nvidia.com/rdp/cudnn-download 로 이동하여
앞서 설치한 CUDA 8.0을 위한 다음 항목을 다운로드 한다.



cuDNN v7.0.5 Runtime Library for Ubuntu16.04 (Deb)
cuDNN v7.0.5 Developer Library for Ubuntu16.04 (Deb)

Runtime을 먼저 설치하고 나서 Developer패키지를 설치해야 한다.


$ sudo dpkg -i libcudnn7_7.0.4.31-1+cuda8.0_amd64.deb
$ sudo dpkg -i libcudnn7-dev_7.0.4.31-1+cuda8.0_amd64.deb


설치 메뉴얼(cuDNN Install Guide)에 적혀있는 대로 정상적으로 설치되었는지 확인하기 위해 다음을 수행해본다.


샘플 코드를 HOME 폴더로 복사하고 


$ cp -r /usr/src/cudnn_samples_v7/ ~/


복사한 폴더로 이동 후 빌드한다.


$ cd cudnn_samples_v7/mnistCUDNN/

$ make clean && make


그런데 이때 문제가 발생하는 경우가 있다.


/usr/local/cuda/include/cuda_runtime_api.h:1628:101: error: use of enum ‘cudaDeviceP2PAttr’ without previous declaration

이런 경우에는 /usr/include/cudnn.h 파일을 root권한으로 편집기로 열고 다음과 같이 변경한다.


#include "driver_types.h" <-- 부분을 아래와 같이 변경

#include <driver_types.h>


이렇게 저장한 다음 다시 빌드를 시도하면 정상적으로 완료되는 것을 확인할 수 있다.


$ ./mnistCUDNN cudnnGetVersion() : 7005 , CUDNN_VERSION from cudnn.h : 7005 (7.0.5) Host compiler version : GCC 5.4.0 There are 1 CUDA capable devices on your machine : device 0 : sms 12 Capabilities 5.2, SmClock 1126.5 Mhz, MemSize (Mb) 4040, MemClock 2505.0 Mhz, Ecc=0, boardGroupID=0 Using device 0 ... Result of classification: 1 3 5 Test passed!

 추가 내용

Tensorflow를 설치하게 되면 이 CUDNN의 라이브러리 파일의 위치를 알아야 한다. 보통 /usr/local/cuda-8.0/lib64/ 이라는 곳에 존재하는데 
debian 패키지로 설치하는 경우 설치 위치가 조금 이상하다. 

엉뚱하게도 아래와 같은 곳에 lib 파일이 있는것을 확인할 수 있다. 나중에 cudnn 위치 지정에 햇갈리지 않도록 하자.


/usr/lib/x86_64-linux-gnu/libcudnn.so.7.0.5



Caffe 설치하기


몇가지 패키지들을 추가로 설치한다.


$ sudo pip install scikit-image protobuf lmdb pandas

git 명령어로 caffe를 다운로드한 다음 Makefile.config 를 복사한다.


$ git clone https://github.com/BVLC/caffe
$ cd caffe
$ cp Makefile.config.example Makefile.config

복사한 Makefile.config 파일을 편집기로 열어 다음과 같이 수정한다. 원본 파일은 첨부파일 참조


# cuDNN acceleration switch (uncomment to build with cuDNN).
USE_CUDNN := 1

# Uncomment if you're using OpenCV 3
OPENCV_VERSION := 3

# We need to be able to find Python.h and numpy/arrayobject.h.
PYTHON_INCLUDE := /usr/include/python2.7 \
        /usr/local/lib/python2.7/dist-packages/numpy/core/include

# Uncomment to support layers written in Python (will link against    Python libs)
WITH_PYTHON_LAYER := 1

# Whatever else you find you need goes here.
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu/hdf5/serial/

이제 빌드를 수행한다. 각각 따로 수행하는것이 좋다.


$ make all & make test && make runtest && make pycaffe


파이썬에서 caffe 모듈을 불러와서 정상적으로 실행되는지 확인한다.


$ python
>>> import caffe

아무 에러가 없으면 정상적으로 설치가 된 것이다.


전체 명령어는 별도의 첨부파일을 참조하면 된다.



2018/1/30, CUDNN 설치부분 추가됨

반응형
반응형

When I first tried to connect xbox 360 wireless controller on jetson tx2 with l4t 28.1 , there is no /dev/input/js folder created.

lsusb shows

Bus 001 Device 014: ID 045e:0719 Microsoft Corp. Xbox 360 Wireless Adapter

but no response from the controller. So have to follow below script.


Open the terminal and run this command:

sudo apt-get install jstest-gtk joystick xboxdrv

You also need to ensure that xpad is not getting loaded:

echo "blacklist xpad" | sudo tee -a /etc/modprobe.d/blacklist.conf
sudo rmmod xpad  # unload module if already loaded

Then run the xboxdrv:

sudo xboxdrv --silent 

now run jstest-gtk should show connected joystick


2017/12/29일 추가됨


위 스크립트는 부팅할때마다 해주어야 하는 문제가 있다. 

Jetson TX2에서 부팅할때 자동으로 xboxdrv를 실행하려면 /etc/rc.local 파일을 편집기로 열어 다음과 같이 작성한다.

In order to run xboxdrv every time jetson boot up, 

Create a file: /etc/rc.local

File contents:

#!/bin/sh -e
xboxdrv --silent
exit 0

작성이 끝나면 저장하고 해당 파일이 실행될 수 있도록 퍼미션을 변경한다.

Save the file and make it executable with this command:

sudo chmod +x /etc/rc.local

이렇게 하면 exit 0 이전까지 부분은 sudo 로 실행한것과 동일하게 실행될 것이다.

반응형

+ Recent posts