X2에서 실행이 성공한 것 때문에 우분투 환경에서 실행이 안되는 것이 오히려 더 찝찝해졌다. 우분투 환경에서 실행했을 때는 코드가 문제이거나 OpenCV 버전이 문제일 것으로 생각했었다. 하지만 TX2에서 정상 출력하는 것으로 보아 코드 문제는 아닐 것으로 판단했다. 따라서 OpenCV 버전 문제일 것으로 생각했다. 알고리즘을 재현하는 과정에서 OpenCV 3.4.2 에러가 자주 발생했기 때문이다. 더군다나 출력이 되어도 버튼과 글자가 제대로 인식되지 않고 깨지는 상태로 출력되었기 때문에 OpenCV 문제일 것으로 생각했다.
# 에러 발생
If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function 'cvShowImage'
이러한 이유로 버전 충돌
문제일 것이라는 전체 하에, 디버깅을 진행하였다. 우선 혹시 모르니 재부팅하여 실행해보았으나 마찬가지의 오류가 발생하여 초기화를 진행하기로 하였다. 내가 버전을 확인하여 수정할 수 있을 정도의 실력이었다면 굳이 초기화를 하지 않았겠지만, 실력이 부족하기 때문에 그냥 우분투를 밀어버리고 우분투 16.04
를 재설치하였다. 사실 버전을 확인하여 수정하는 시간보다 우분투를 재설치하는 시간이 덜 걸릴 것으로 판단하였다. ocr-rcnn-v2를 재현하기 위해 최근에 TX2 JetPack 재설치만 5번, Ubuntu 재설치만 6번은 족히 넘게 하였다. 이러한 이유로 나는 나를 믿고 그냥 우분투를 재설치하였다.
우분투를 재설치한 후 anaconda3를 설치해주었다. 이전에는 python 2.7에 억지로 끼워맞추기 위해서 anaconda2를 설치해주었는데 TX2에서 python3 버전도 잘 돌아가는 것을 확인하여, 최신버전을 그냥 설치해주었다(python 3.x 버전에서 python 2.x 버전이 어느정도 잘 돌아간다고 한다). 또한, 아래의 명령어를 입력하여 tensorflow-gpu 설치해 필요한 것들을 설치해주었다.
conda create -n tf-gpu python=3.6
conda activate tf-gpu
conda install -c anaconda cudatoolkit=10.0
ocr-rcnn-v2에서는 Tensorflow==1.12
버전으로 실행하였으나 TX2에서 실행해본 바로는, Tensorflow==1.15
버전도 잘 돌아가는 것을 확인하였다. 이러한 이유로 해당 버전을 설치해주었다.
conda install -c anaconda tensorflow-gpu==1.15
💡 참고사항
우분투에 직접 Cuda Toolkit이나 cuDNN을 설치해주지 않아도 된다. 아나콘다를 설치하여 가상환경을 만들어준 후, 만들어준 가상환경 위에서 Cuda Toolkit을 설치해주면 된다. cuDNN의 경우, Tensorflow를 설치하면 알아서 버전에 맞게 설치된다. 다만 주의할 것은, 설치하려는 Tensorflow 버전에 맞는 Cuda Toolkit을 설치해주어야 한다.
Tensorflow-gpu 설치를 완료하였으면 필요한 패키지들을 설치해준다.
conda activate tf-gpu
conda install pillow
conda install imageio
conda install matplotlib
기억이 나지 않아 위의 3개의 패키지만 적었는데, 이외에 추가로 필요한 패키지가 있을 수 있으니 당황하지 않고 설치해주면 된다.
⚠️ 주의!
lxml 패키지도 설치해야하는지는 확실하지 않다. 깃허브에서는 설치하라고 나와있으나 설치를 안해줬던 것 같다. 해당 패키지는 먼저 설치하지 말고 추후에 에러가 발생하면 설치해주도록 하자. 크게 영향은 없을 것으로 생각하지만..
# font 패키지 설치 => tab 누르고 => ok 누르기
sudo apt install ttf-mscorefonts-installer
sudo apt install libjpeg-dev libpng12-dev libfreetype6-dev libxml2-dev libxslt1-dev
TX2에서는 여기까지만 설치해주면 실행이 됐던 것으로 기억한다. 그래서 혹시 몰라 실행해보았다.
cd ~/Desktop
git clone -b perception https://github.com/zhudelong/ocr-rcnn-v2.git
cd ~/Desktop/ocr-rcnn-v2
python3 inference-visual.py
이전에 보았던 OpenCV 에러를 또 보게 되었다. 멘탈 바사삭...
그래도 혹시 몰라 이전에 해보았던 방법들을 시도해보았다.
# 이전에 보았던 OpenCV 에러
dules/highgui/src/window.cpp:632: error: (-2:Unspecified error) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Carbon support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function 'cvShowImage'
아래의 링크를 참고하여 디버깅을 시도해보았다.
sudo apt-get -y install libgtk2.0-dev
sudo apt-get -y install pkg-config
conda remove opencv
conda install --channel menpo opencv
pip install opencv-contrib-python
이전과 마찬가지로 변하는 것은 없었다. 다시 한 번 멘탈 바사삭...
그럼에도 이번에는 뭔가 될 것 같은 느낌이 들었다. TX2에서 원인을 파악했기 때문에 자신있었다. 이번에는 구글에 조금 다르게 검색을 해보았다.
If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function 'cvShowImage'
위와 같이 검색하여 아래 링크에서 해결책을 찾았다.
conda remove opencv
conda install -c menpo opencv
pip install --upgrade pip
pip install opencv-contrib-python
cd ~/Desktop/ocr-rcnn-v2
python3 inference-visual.py
결과적으로 제대로된 출력 이미지를 얻을 수 있었다!! 부서져버린 나의 멘탈조각들이 다시 제자리로 돌아오는 순간이었다. 해결된 명령어를 확인해보니 pip와 OpenCV 문제이지 않았나 생각한다. TX2에서 Python 2.7 버전을 설치한 후에 ocr-rcnn-v2 깃허브에서 아래의 명령어로 패키지를 설치하였었다.
pip install six mock h5py enum34 scipy numpy --user
이 과정에서 에러가 발생하였었는데 이에 대한 해결책으로 pip의 버전을 업그레이드 혹은 pip3 명령어를 사용했었던 것을 기억한다(물론 최종적으로 이러한 방법은 나중에 또 에러를 발생시켰지만).
어찌됐든 pip install --upgrade pip
명령어를 입력한 후 OpenCV가 정상 설치된 것으로 보아, 추측컨대 Python 3.6 버전(anaconda3와 anaconda2의 차이)과 pip 그리고 OpenCV의 버전이 문제였던 것으로 생각해보았다. 이것이 확실한 이유일지는 모르겠지만 추후에 이러한 문제가 발생한다면, 다른 버전을 설치해보는 것을 고려해보는 것이 좋은 해결책이 될 수도 있겠다는 생각을 하였다.
알고리즘을 구현한 사람이 특정 버전에서 실험을 하였다고 하여도, 이후에 시간이 지나 이전 버전이 에러가 발생할 수 있기 때문이다. 오히려 이 후에 나온 버전이 기존의 문제를 개선시켰을 수도 있기 때문에, 버전 간의 너무 큰 차이가 아니라면 상위 버전으로 재현해보는 것도 좋지 않을까 생각한다.
💡 참고사항
아마 ocr-rcnn-v2 깃허브에서 직접 클론하여 실행시켜보면 encoding error
발생할 것이다. 이럴 경우에 아래처럼 rb
인자를 추가해주면 된다.
img_np = np.asarray(PIL.Image.open(tf.gfile.GFile(img_path, 'rb')))
nvidia 그래픽 드라이버가 설치되어있다면 제거를 하고 실행시켜주면 된다. 아마 그래픽 드라이버와 충돌하는 것 같은데 명확한 답이 못내렸다.