Jetson TX2에서 OCR-RCNN-V2 실행시키기

Jarvis_Geun·2022년 3월 3일
0

1. 배경

대학 졸업작품의 일환으로 다른 학생들과 함께 프로젝트를 진행하게 되었다. 공과대학 특정 건물의 엘리베이터 버튼을 인식하는 것이 그 중 일부이다. 인간이 주어진 정보와 경험을 바탕으로 무언가를 학습하듯이, 인공지능 또한 그렇다.

엘리베이터 버튼 사진을 바탕으로, 다른 사진이 엘리베이터 버튼인지 아닌지를 구별할 수 있게 만드는 것이 1차 목표이다. 이러한 까닭에, 프로젝트를 진행하게 위해서는 가장 먼저 라벨링이 되어있는 데이터셋 확보가 우선이었다. 처음에는 건물의 엘리베이터 사진을 여러장 촬영 후, labelImg를 사용하여 annotation을 직접 해보려고 하였다. 하지만 현실적으로 생각해보면, 주어진 시간이 얼마 없었고 지루하고 힘든 작업이 될 것으로 생각하였습니다. 속된 말로, 노가다가 될 것이 불보듯 뻔하였다(라벨링 작업을 하는 모든 분들께 존경을 표합니다...). 그렇기 때문에 자연스럽게 엘리베이터 버튼 데이터셋이 있는지 구글링을 하게 되었다.

결과적으로 ocr-rcnn이라는 주제의 논문과 github code를 찾게 되었다. 해당 github에는 수천장의 엘리베이터 버튼 데이터셋과 관련 논문이 업로드 되어있다. 이를 바탕으로 github 코드를, Ubuntu와 TX2 환경에서 실행해보기로 하였다.

결과부터 말하자면 2022년 03월 03일을 기준으로, 우분투 환경에서 실행시키는 것은 실패하였다. 파이썬, 텐서플로우 그리고 OpenCV 간의 버전 충돌?로 인한 에러로 생각된다(추후에 시간이 될 때 해당 문제를 해결하여 올릴 예정입니다).

TX2 환경에서는, 1~2주 간의 끝이 보이지 않는 디버깅 끝에 에러를 바로잡고 원하던 출력 결과를 얻을 수 있었다. 본격적으로 이러한 과정을 설명하기에 앞서, 이 글을 읽는 누군가 다음과 같은 사항을 인지해주셨으면 합니다.

저는 해당 프로젝트를 시작하기 전까지 윈도우만 사용해왔고, 우분투 환경에서 프로그램을 실행해본 적이 없습니다. 그렇기 때문에 보는 사람에 따라, 초보 수준의 글이 될 수 있다는 점을 이해해주셨으면 합니다(변명입니다).

사실 이전에 Jetson nano는 사용해보았습니다. 그럼에도 저는 정말 부족한 수준이기 때문에 이 점 이해해주셨으면 합니다(두번째 변명).

사실상 혼자서 우분투와 젯슨 보드를 다루어보는 것은 이번이 처음입니다. 그렇다보니 아무래도 부족한 점이 많았을 뿐 아니라, 디버깅 또한 오래 걸릴 수 밖에 없었습니다. 그러니 이해주셨으면 합니다(마지막 변명).

이제, 위의 터무니 없는 변명들을 뒤로 하고 본격적으로 실행과정을 설명해보려 한다.


2. JetPack 설치하기

TX2의 환경을 설정하기까지, 정말 많은 시행착오를 겪었다. 정확히 말하면 깃허브 코드를 실행하기 위한 환경을 만들어주는 것은 기다림과 인내의 연속이었다.
그런 시행착오 과정은 다른 글에서 기록해두려 한다. 이 글에서는 오직 성공과정만을 기록한다.


2.1 TX2 전원 공급 및 실행

TX2는 젯슨 나노와 다른 전원 어댑터를 사용한다. 젯슨 나노 2GB와 4GB가 다른 전압과 전류로 공급을 받듯이, TX2 역시 마찬가지이다. 각 기기마다 필요로 하는 전원 규격이 정해져있기 때문에 검색해서 알아봐야 한다.

Input: 100-240V~, 50/60Hz, 1.3A Output: 19V --- 4.74A, 90W max

엔비디아 포럼에서 확인한 바로는, TX2는 19V, 4.74A의 전원을 필요로 한다. TX2의 전원 어댑터가 없어 추가로 구매해주었다. 구매 링크는 아래에 첨부한다.

USB 허브의 경우는 반드시 필요한 것은 아니지만, 구글링을 해보면 대부분 구매하는 것을 추천한다고 한다. USB 포트가 단 한개 밖에 없기 때문이다.

구매한 전원 어댑터를 사용하여 TX2를 실행시켜주었다. 전원이 켜진 후 기다리면 우분투가 설치되어 있는 것을 확인할 수 있다. 젯슨 나노는 별도로 TF 카드를 구워주어야 했었는데(flash), TX2는 구워주지 않아도 알아서 우분투를 설치해주는 것 같다.

하지만 TX2의 성능을 온전히 사용하려면 젯슨 나노처럼 JetPack을 설치하는 과정이 필수적이다.


2.2 TX2에 JetPack 설치

ocr-rcnn-v2 github에서 필요로 하는 버전은 아래와 같다.

  • JetPack 4.2
  • Tensorflow == 1.12.0
  • Python == 2.7

TX2의 경우, JetPack을 설치하기 위해서는 호스트 PC에 엔비디아에서 제공하는 SDK Manager라는 프로그램을 설치해주어야 한다. SDK Manager는 호스트 PC가 우분투 16.04 혹은 우분투 18.04 버전인 경우에만 설치가 가능하다고 한다.

노트북(Zenbook Duo UX481FL)에 듀얼부팅을 하여 우분투 18.04를 설치해주었다. 내 노트북의 경우, 듀얼 모니터가 있는 조금 특이한 노트북이어서 그런지 몰라도 듀얼부팅 하는 과정에서 우분투 설치가 되지 않았다. 이에 대한 정보는 젠북 듀오 듀얼부팅을 참고한다.

호스트 PC에 우분투 16.04 혹은 18.04를 설치하였다면 이제 JetPack 4.2를 설치해야한다. 하지만 JetPack 4.2 버전을 설치하려고 시도해보았는데 설치가 불가능하였다. 엔비디아 측에서 서버를 내린건지 정확한 이유는 모르겠지만 아래 사진처럼 클릭조차 할 수 없게 되어있다.

꽤 오랫동안 JetPack 4.2 버전을 설치해보려 시도해보았지만 결국에는 포기하고 최신버전인 JetPack 4.6 버전을 설치하였다(JetPack 설치만 5번 이상은 한 것 같네요). 아래의 링크를 참고하여 설치하면 된다. 설치하는 과정에서 약간의 차이(ex. Recovery mode 진입 등)가 있을 수 있지만 전체적인 과정은 링크와 같다는 것을 기억하도록 한다.

JetPack 4.6 설치를 완료했다면 이제 Tensorflow와 다른 패키지들을 설치해야 한다.


3. TX2에 Tensorflow 설치하기

이 부분에서 정말 많은 시행착오를 겪었다. 처음에는 ocr-rcnn-v2 Github에서 제공하는 과정대로 텐서플로우를 설치하려고 하였다. 하지만 몇 개의 패키지 버전이 맞지 않는 에러가 지속적으로 발생하여, 터미널창에 pip 명령어를 사용하여 설치하는 방법은 포기하였다. 대신에 Nvidia에서 제공하는 Tensorflow를 설치하였다. Nvidia에서 제공하는 Tensorflow의 경우, Jetson 계열 보드에 최적화되어 있을 뿐 아니라 원한다면 가상환경을 만들 수도 있어 설치 및 제거에 용이하다는 장점이 있다. 또한 지금까지의 내 경험 상, pip 명령어를 통해 직접 설치하는 방법보다는 가상환경을 만들어 설치하는 것이 여러 측면에서 우위를 가진다고 볼 수 있다.

가상환경을 만들어 설치하면 텐서플로우에 맞는 여러 패키지들이 자동으로 설치될 뿐 아니라, 버전 에러가 발생하면 간단하게 지워버리고 다른 버전을 설치할 수 있다. 이 덕분에 설치시간이 단축된다는 장점도 있다.

TX2에 텐서플로우를 설치하는 과정은 아래를 참고한다.

위의 링크를 바탕으로 설치과정을 정리해보았다.


  1. JetPack을 설치한다. 나의 경우, 이미 설치하였기 때문에 넘어간다.

  2. 텐서플로우 설치에 필요한 system package를 설치한다.

$ sudo apt-get update
$ sudo apt-get install libhdf5-serial-dev hdf5-tools libhdf5-dev zlib1g-dev zip libjpeg8-dev liblapack-dev libblas-dev gfortran
  1. pip3를 업그레이드 한다.
$ sudo apt-get install python3-pip
$ sudo pip3 install -U pip testresources setuptools==49.6.0 
  1. Python package dependencies를 설치한다.
$ sudo pip3 install -U --no-deps numpy==1.19.4 future==0.18.2 mock==3.0.5 keras_preprocessing==1.1.2 keras_applications==1.0.8 gast==0.4.0 protobuf pybind11 cython pkgconfig
$ sudo env H5PY_SETUP_REQUIRES=0 pip3 install -U h5py==3.1.0
  1. pip3 명령어를 사용하여 텐서플로우를 설치한다. 아래 명령어의 경우 최신버전인 JetPack 4.6에 호환되는 텐서플로우를 설치하는 명령어이다.
$ sudo pip3 install --pre --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v46 'tensorflow<2'

위의 과정을 완료하였다면 Tensorflow 설치를 완료한 것이다. Tensorflow가 설치되었는지 확인하기 위해 아래의 명령어를 입력한다.

print(tensorflow.__version__)
# 출력결과
1.15.5

Nvidia에서 제공하는 Tensorflow 1.x 버전 중 최신버전인, 1.15.5 버전이 정상 설치된 것을 확인할 수 있다.

이제 실행만 하면 끝이다. 참고로 Jetson 보드에 Tensorflow의 여러 버전을 설치하고 싶다면 링크를 참고한다. 앞서 말한 가상환경을 이용한 설치방법이다.


4. OCR-RCNN-V2 실행하기

실행결과는 아래와 같다. OCR-RCNN-V2 Github에서 요구하는대로 model을 다운받아 위치를 변경해주었다. 수정한 Github 코드는 내 Github를 참고하면 된다.


5. 느낀점

JetPack 상위버전을 설치하면 아마 하위 Tensorflow 버전도 설치가 가능할 것으로 추측했었는데, 얼추 맞는듯 하다. 원래는 JetPack 4.6 버전에 맞는 Tensorflow 버전은 2.5 ~ 2.7인데, Tensorflow 설치하는 과정에서 의도적으로 tensorflow<2 인자를 입력해주었다. 그러면 자동으로 1.x 버전 중 가장 상위 버전인 1.15.5 버전이 설치된다. 링크 참고

사실 ocr-rcnn-v2 깃허브에서 요구하는 사항은 Tensorflow 1.12.0 버전이지만 1.12.0 과 1.15.5 버전은 큰 차이가 없을 것으로 생각되어 그냥 설치했다.

파이썬 버전도 마찬가지이다. 원래는 2.7 버전이 권장사항이지만 파이썬 2.x 버전을 설치하려면 pip install 문제가 발생하여 어쩔 수 없이 Python 3 버전을 설치하였다. pip install 이 아닌 pip3 install 을 사용하여 설치하니 문제가 발생하지 않았다.

Jetpack 4.6을 다시 flash 한 후에 바로 wheel 파일을 사용하여 설치해보려다가 그냥 명령어를 입력하여 설치하였다. wheel 파일은 어차피 Tensorflow 1.12.0 버전으로 설정되어있어 충돌이 발생할 것으로 생각되어 그냥 시도를 하지않았다. 따라서 명령어 한 문장씩 입력해가며 필요한 패키지와 파일을 설치하였다. 명령어는 아래와 같다.

sudo nvpmodel -m 0
sudo apt-get install openjdk-8-jdk
sudo apt-get install libhdf5-dev libblas-dev gfortran
sudo apt-get install libfreetype6-dev libpng-dev pkg-config
pip install six mock h5py enum34 scipy numpy --user

위에서 마지막 명령어 pip install 부분을 입력한 뒤 이전과 동일한 h5py error 설치 문제가 발생하였다. 실행이 성공적으로 된 후, 지금와서 돌이켜보면 확실히 버전문제였던 것 같다. pip와 pip3, Tensorflow 1.12.0 설치 중 발생하는 에러 등 종합적으로 생각해보았을 때, 논문의 저자와 지금의 내가 실행시키려는 환경은 많이 달랐다. 2022년에 살고있는 현재의 나는, 파이썬 3.x 버전과 텐서플로우 2.x 버전을 보고있지만, 과거의 논문 저자는 파이썬 2.7 버전과 텐서플로우 1.x 버전이 최신 버전이었을 것이다. 과거에는 발생하지 않던 문제들이, 시간이 지나 버전이 업그레이드 되면서 문제를 발생시킨듯 하다.

리눅스를 정말 잘 다룰줄 아는 사람은 이러한 문제를 해결할 수 있겠지만 나의 경우는 그렇지 않다. 사실상 리눅스를 제대로 다뤄보기 시작한 것은 이번이 처음이다(사실 겉핥기 수준이지만). 그렇기에 나는 지금으로써 내가 할 수 있는 최선이 방법이 무엇인지 생각해보았다. 설치된 패키지와 파일을 하나하나 대조해가며 버전에 맞추거나 발생한 에러를 보고 코드를 뜯어고치는 것은 지금의 나는 역부족이었다. 결국 가장 친숙한 아나콘다를 떠올렸다. 아나콘다는 동일한 컴퓨터에 가상환경이라는 것을 만들어 필요하거나 필요없을 때 언제든지 추가 및 제거할 수 있는, 신이 내린 선물이었다. 추가 및 제거하는 과정에서 다른 환경에 영향을 주지않는다는 것이 가장 큰 장점이다.

결국 나는 구글에서 Jetson TX2에서 아나콘다를 설치할 수 있는지를 찾아보게 되었고 실망스럽게도 불가능하였다(링크 참고). 하지만 이 과정에서 뜻밖의 정보를 접하게 되었다. ocr-rcnn-v2 깃허브에서처럼 Tensorflow를 설치하는 방법도 있지만, Nvidia에서 제공하는 Tensorflow on Jetson Platform 의 방법도 있었다(링크 참고). 이전부터 계속 문제를 일으켰던 부분이 Tensorflow를 설치하는 과정이었는데 여기서 문득 이런 생각을 하게 되었다.

꼭 ocr-rcnn-v2 깃허브의 설치과정을 따라가야만 하는걸까?

이전에도 설명했듯이 과거의 논문저자와 지금의 나는 서로 다른 시간에서 실험을 한다. 그렇기에 실험환경에는 차이가 발생할 수 밖에 없으며 에러가 발생한다면 다른 길로 가는 것도 나쁘지 않을 것으로 판단했다. 이러한 생각을 한 후 곧장 Nvidia에서 제공하는 방법으로 설치하였다. 그 결과 설치를 성공하였으며 연구실 pc에서 발생하던 문제들은 단 하나도 발생하지 않고 결과가 아주 잘 출력되는 것을 확인할 수 있었다.

그리고 Tensorflow on Jetson Platform 을 따라가면서 새로 알게된 사실이 있다. Jetson board에서도 아나콘다처럼 가상환경을 만들 수 있다는 것이었다. 3.1. Installing Multiple Tensorflow Versions 에 가면 이러한 방법이 자세히 나와있다. 사실 이 방법 말고도 리눅스 환경에서 가상환경을 만드는 방법이 있는 것 같은데, 나에게 가장 쉬운 방법은 Nvidia에서 제공하는 과정이었다. 이외의 방법은 링크 1, 링크 2를 따라해보는 것도 좋을 것 같다. 다만, 직접 해보지는 않아서 결과는 보장할 수 없다...

profile
Although. 그럼에도 불구하고.

0개의 댓글