Problem Statement
AWS ๊ณต์ ๋ฌธ์์์ ์ค์น๋ฒ์ด ์์ง๋ง ์ฌ์๋
๊ธฐ์ค์ ๋ด์ฉ์ด๊ณ , CUDA 9.0์ผ๋ก pre-compiled๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๊ธฐ ๋๋ฌธ์, CUDA 10.0์ด ๊ธฐ๋ณธ์ผ๋ก ์ค์น๋ Jetson Nano์์ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์์.
๋คํํ(?) MXNet ๊ณต์ ํํ์ด์ง์ NVIDIA ํฌ๋ผ์์ 1.4.1 ๊ธฐ์ค์ ์ค์น ๋ฐฉ๋ฒ์ ์ ์ํ๊ณ ์์ง๋ง, ํ ์์ ์์๋ OpenCV ์์กด์ฑ ์ด์๋ก pre-compiled ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋์ ์ง์ ํจํค์ง๋ฅผ ๋น๋ํด์ผ ํจ.
References
MXNet
OpenCV
(Optional) ์ฝ์ง๊ธฐ
์๋ ์ ์ ๋ฐฉ๋ฒ๋ค์ ํฌ๋ผ์์ ์ ์๋ ๋ฐฉ๋ฒ๋ค๋ก ์ฝ์ง๊ธฐ๋ฅผ ๊ธฐ๋กํด ๋ . ๊ณง๋ฐ๋ก Installing OpenCV ๋ก ๋์ด๊ฐ๋ ๋ฌด๋ฐฉํจ.
์ ์ ๋ฐฉ๋ฒ 1: mxnet-jetson
ํจํค์ง ์ค์น
์คํ ๊ฒฐ๊ณผ: mxnet 1.2.1 ๊ธฐ์ค์ด๋ฏ๋ก ์ฌ์ ํ ๋์ผํ ๋ฌธ์ ๋ฐ์
Copy pip install mxnet-jetson
์ ์ ๋ฐฉ๋ฒ 2. MXNet 1.4.1 prebuilt-package ์ค์น
python2 ๊ธฐ์ค
Copy sudo apt-get install -y git build-essential libatlas-base-dev libopencv-dev graphviz python-pipsudo
pip install mxnet-1.4.0-cp27-cp27mu-linux_aarch64.whl
python3 ๊ธฐ์ค
Copy sudo apt-get install -y git build-essential libatlas-base-dev libopencv-dev graphviz python3-pipsudo
pip install mxnet-1.4.0-cp36-cp36m-linux_aarch64.whl
์คํ ๊ฒฐ๊ณผ: libopencv_imgcodecs.so.3.3
๊ด๋ จ ์๋ฌ ๋ฐ์. (python2/3 ๋์ผ)
์ด๋ pre-compiled ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ OpenCV 3.3์ ์ธ์คํจํ๋ค๊ณ ๊ฐ์ ํ๊ณ OpenCV ์์กด์ฑ์ ํฌํจ์์ผ ๋ฐ์ํ๋ ๋ฌธ์ ๋ก, ๊ฒฐ๊ตญ OpenCV 3.3์ ๋ฐ๋ก ์ธ์คํจํด์ผ ํจ.
Copy >>> import mxnet
Pdb) continue
Traceback (most recent call last):
File โ / usr / lib / python3 . 6 / pdb . pyโ , line 1667 , in main
pdb . _runscript (mainpyfile)
File โ / usr / lib / python3 . 6 / pdb . pyโ , line 1548 , in _runscript
self . run (statement)
File โ / usr / lib / python3 . 6 / bdb . pyโ , line 434 , in run
exec (cmd, globals , locals )
File โ < string > โ , line 1 , in < module >
File โ / home / lycaass / mximport . pyโ , line 1 , in < module >
import mxnet
File โ / usr / local / lib / python3 . 6 / dist - packages / mxnet /* init * . pyโ , line 24 , in < module >
from . context import Context , current_context , cpu , gpu , cpu_pinned
File โ / usr / local / lib / python3 . 6 / dist - packages / mxnet / context . pyโ , line 24 , in < module >
from . base import classproperty , with_metaclass , _MXClassPropertyMetaClass
File โ / usr / local / lib / python3 . 6 / dist - packages / mxnet / base . pyโ , line 213 , in < module >
_LIB = _load_lib ()
File โ / usr / local / lib / python3 . 6 / dist - packages / mxnet / base . pyโ , line 204 , in _load_lib
lib = ctypes . CDLL (lib_path[ 0 ], ctypes.RTLD_LOCAL)
File โ / usr / lib / python3 . 6 / ctypes /* init * . pyโ , line 348 , in * init *
self . _handle = _dlopen (self._name, mode)
OSError : libopencv_imgcodecs . so . 3 . 3 : cannot open shared object file : No such file or directory
์ ์ ๋ฐฉ๋ฒ 3: MXNet 1.6.0 prebuilt-package ์ค์น
์คํ ๊ฒฐ๊ณผ: ๋ฐฉ๋ฒ 2์ ๋์ผํ ๋ฌธ์ ๋ฐ์
๊ฒฐ๊ตญ OpenCV 3.3์ ์ค์นํ๊ฑฐ๋, MXNet์ ์ฌ์ปดํ์ผํด์ผ ํจ.
sudo-apt ilbopencv-dev python-opencv
๋ก ์ค์นํ๋ฉด ๋ฒ์ ์ถฉ๋ ๋ฐ์! (libopencv-dev: 4.1.1, python-opencv: 3.2.0
)
Installing OpenCV
์๋ ์ค์น ๋ฐฉ๋ฒ๋ค์ pip, numpy, scipy, cmake๊ฐ ์ด๋ฏธ ์ค์น๋์๋ค๊ณ ๊ฐ์ ํจ. ํนํ scipy ์ปดํ์ผ์ด ์๊ฐ๋ณด๋ค ์ค๋ ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์, ๋ณ๋๋ก ๋ถ๋ฆฌํ๋ ๊ฒ์ ์ถ์ฒ
MXNet ์ปดํ์ผ ์ OpenCV๋ฅผ ์ ์ธํ๊ณ ์ปดํ์ผ ๊ฐ๋ฅํ๋, ์ด๋ ๊ฒ ํ๋ฉด ํฅํ inference ๋๋ฒ๊น
์ ๋ํญ์ ๊ฒช๊ธฐ์ ํ๊บผ๋ฒ์ ์ค์นํ๋ ๊ฒ์ ์ถ์ฒ
1) pkg-config์ผ๋ก ํ์ฌ ์ค์น๋ OpenCV ํ์ธ
Jetson Nano์ jetpack 4.3์์ OpenCV 3.3.1์ด ๋ํดํธ๋ก ๊น๋ ค ์๋ค๊ณ ํ๋๋ฐ, ๋ณธ์ธ์ Jetson Nano์์๋ ์ธ์์ด ๋์ง ์์.
Copy pkg-config opencv --modversion
2) ์์คํฌ๋ฆฝํธ ๋ค์ด๋ก๋
OPENCV_GENERATE_PKGCONFIG๋ฅผ ํ์ฑํํ๋ ๊ฒ์ ๊ถ์ฅํ๋ฉฐ, ์ด๋ ์์คํฌ๋ฆฝํธ์ ๋ชจ๋ ๋ฐ์ํด ๋์์.
Copy #!/bin/bash
#
# Copyright (c) 2018, NVIDIA CORPORATION. All rights reserved.
#
# NVIDIA Corporation and its licensors retain all intellectual property
# and proprietary rights in and to this software, related documentation
# and any modifications thereto. Any use, reproduction, disclosure or
# distribution of this software and related documentation without an express
# license agreement from NVIDIA Corporation is strictly prohibited.
#
# Modified by Daekeun Kim
# [Mofidifations]
# - Activated OPENCV_GENERATE_PKGCONFIG
# - Removed the script; sudo apt-get install -y python2.7-dev python3.6-dev python-dev python-numpy python3-numpy
# (Assume we have installed python and numpy)
# - Removed the script due to version conflicting; sudo apt-get install -y python-opencv python3-opencv
# (The latest version of python-opencv is 3.2.0, not 3.3.x or 4.x)
if [ "$#" -ne 1 ]; then
echo "Usage: $0 <Install Folder>"
exit
fi
folder = "$1"
user = "nvidia"
passwd = "nvidia"
echo "** Remove OpenCV3.3 first"
sudo sudo apt-get purge *libopencv*
echo "** Install requirement"
sudo apt-get update
sudo apt-get install -y build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install -y libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
sudo apt-get install -y libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
sudo apt-get install -y libv4l-dev v4l-utils qv4l2 v4l2ucp
sudo apt-get install -y curl
sudo apt-get update
echo "** Download opencv-4.1.1"
cd $folder
curl -L https://github.com/opencv/opencv/archive/4.1.1.zip -o opencv-4.1.1.zip
curl -L https://github.com/opencv/opencv_contrib/archive/4.1.1.zip -o opencv_contrib-4.1.1.zip
unzip opencv-4.1.1.zip
unzip opencv_contrib-4.1.1.zip
cd opencv-4.1.1/
echo "** Building..."
mkdir release
cd release/
cmake -D WITH_CUDA=ON -D CUDA_ARCH_BIN="5.3" -D CUDA_ARCH_PTX="" -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.1.1/modules -D WITH_GSTREAMER=ON -D WITH_LIBV4L=ON -D BUILD_opencv_python2=ON -D BUILD_opencv_python3=ON -D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_EXAMPLES=OFF -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D OPENCV_GENERATE_PKGCONFIG=ON ..
make -j3
sudo make install
echo "** Install opencv-4.1.1 successfully"
echo "** Bye :)"
opencv4.sh
3) ์์คํฌ๋ฆฝํธ ์คํ
์ฝ 4์๊ฐ ์์๋จ. ์ค์น ํ์๋ ์ฌ๋ถํ
์ ์ํํด์ผ import๊ฐ ์ ์ ๋์ (์: import cv2)
Copy mkdir opencv411
chmod 755 opencv4.sh
sudo ./opencv4.sh opencv411
4) pkg-config ์ค์
์ต์ OpenCV๋ OPENCV_GENERATE_PKGCONFIG
์ต์
์ ํ์ฑํํด๋ pkg-config๋ฅผ ์ธ์ํ์ง ๋ชปํ๋ ๋ฌธ์ ๋ฐ์. ์ด๋ฅผ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐ ๊ฐ๋ฅ.
Copy cd /usr/local/lib/pkgconfig
cp opencv4.pc opencv.pc
pkg-config opencv --modversion
> 4.1.1
5) (Optional) ํ
์คํธ
Copy cd opencv411/opencv-4.1.1/samples/python
python opt_flow.py
6) (Optional) ์น์บ ํ
์คํธ
์น์บ ์ด ์ ์์ ์ผ๋ก ์ธ์๋๋์ง ํ์ธ
https://github.com/JetsonHacksNano/CSI-Camera ์ ์ฝ๋๋ฅผ git clone ํ ํ
์คํธ
Copy git clone https://github.com/JetsonHacksNano/CSI-Camera.git
cd CSI-Camera
gst-launch-1.0 nvarguscamerasrc sensor_id= 0 ! nvoverlaysink
์ผ์ชฝ ์ปค๋ฅํฐ์ ์น์บ ์ฐ๊ฒฐ ์ sensor_id = 0
์ด๊ณ , ์ค๋ฅธ์ชฝ ์ปค๋ฅํฐ์ ์ฐ๊ฒฐ ์ sensor_id = 1
OpenCV Haar-cascade Face Detector ํ
์คํธ; ์๋ ์ฝ๋๋ฅผ ๋ณต๋ถํ์ฌ face-detector.py
๋ก ์ ์ฅ ํ python face-detector.py
๋ก ์คํ
Copy import cv2
import numpy as np
HAAR_CASCADE_XML_FILE_FACE = "/usr/share/opencv4/haarcascades/haarcascade_frontalface_default.xml"
GSTREAMER_PIPELINE = 'nvarguscamerasrc ! video/x-raw(memory:NVMM), width=3280, height=2464, format=(string)NV12, framerate=21/1 ! nvvidconv flip-method=0 ! video/x-raw, width=960, height=616, format=(string)BGRx ! videoconvert ! video/x-raw, format=(string)BGR ! appsink'
def faceDetect ():
# Obtain face detection Haar cascade XML files from OpenCV
face_cascade = cv2 . CascadeClassifier (HAAR_CASCADE_XML_FILE_FACE)
# Video Capturing class from OpenCV
video_capture = cv2 . VideoCapture (GSTREAMER_PIPELINE, cv2.CAP_GSTREAMER)
if video_capture . isOpened ():
cv2 . namedWindow ( "Face Detection Window" , cv2.WINDOW_AUTOSIZE)
while True :
return_key , image = video_capture . read ()
if not return_key :
break
grayscale_image = cv2 . cvtColor (image, cv2.COLOR_BGR2GRAY)
detected_faces = face_cascade . detectMultiScale (grayscale_image, 1.3 , 5 )
# Create rectangle around the face in the image canvas
for (x_pos , y_pos , width , height) in detected_faces :
cv2 . rectangle (image, (x_pos, y_pos), (x_pos + width, y_pos + height), ( 0 , 0 , 0 ), 2 )
cv2 . imshow ( "Face Detection Window" , image)
key = cv2 . waitKey ( 30 ) & 0x ff
# Stop the program on the ESC key
if key == 27 :
break
video_capture . release ()
cv2 . destroyAllWindows ()
else :
print ( "Cannot open Camera" )
if __name__ == "__main__" :
faceDetect ()
Installing MXNet
MXNet ์ปดํ์ผ์ ์ต์ 5์๊ฐ ์ด์ ์์๋๋ฏ๋ก nohup์ผ๋ก ๋ฐฑ๊ทธ๋ผ์ด๋ ์์
์ ๊ฑธ์ด๋๊ณ ์ํํ๋ ๊ฒ์ ์ถ์ฒ
2020๋
7์ ๊ธฐ์ค์ผ๋ก 1.6.0์ด ์ต์ ๋ฒ์ ์ด์ง๋ง, ํธํ์ฑ ์ธก๋ฉด์์ ์ข์ง ์๊ณ (๋จ, GluonNLP๋ฅผ ์ฌ์ฉํ๋ค๋ฉด 1.6.0 ๊ถ์ฅ) SageMaker๋ ํ์ฌ 1.4.1์ ์ฌ์ฉํ๋ฏ๋ก 1.4.1 ์ค์น ๊ถ์ฅ (1.5.1๋ ๋ฌด๋ฐฉํ๋ฉฐ, ์ต๊ทผ ํฌ๋ผ๊ธ์์๋ 1.5.1์ ๋ ๊ถ์ฅํจ). ์ฐธ๊ณ ๋ก, MXNet์ ํ์ํธํ์ฑ ๋ฐ ์์ํธํ์ฑ์ด ์๊ธฐ์ ๋์ผํ ๋ฒ์ ์ผ๋ก ๋ง์ถฐ์ผ ํจ.
1.6.0 : Precompiled ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ธฐ์ค์ผ๋ก๋ CUDA 10.2์ด๋ฉฐ, ์ปดํจํฐ ๋น์ ์์๋ ๋ช ๊ฐ์ง ๋ฌธ์ ๋ค ๋ฐ์ํ๊ธฐ์ ์ถ์ฒํ์ง ์์. ๋จ, ์์ฐ์ด์ฒ๋ฆฌ ํ์ต์ ์ํด GluonNLP ์ค์น ์์๋ 1.6.0๋ง ์ฌ์ฉํด์ผ ํจ
1.4.1~1.5.1: ์ถ์ฒ ๋ฒ์ & CUDA 10.0
1.2.1: Outdated & CUDA 9.0
1) swap ์์ฑ (Jetson Nano์ ๊ธฐ๋ณธ ๋ด์ฅ๋ 4๊ธฐ๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ก๋ ๋ถ์กฑํ๋ฏ๋ก)
Copy fallocate -l 8G swapfile
sudo chmod 600 swapfile
sudo mkswap swapfile
sudo swapon swapfile
2) ์์กด์ฑ ํจํค์ง ์ค์น
Copy sudo apt-get update
sudo apt-get install -y git build-essential libatlas-base-dev graphviz
sudo pip install --upgrade setuptools
sudo pip install numpy== 1.15.2
sudo pip install graphviz jupyter
3) Build MXNet (์ฝ 5-6์๊ฐ ์์๋จ)
make -j3
์ต์
์ผ๋ก ์คํ ์ ๊ฐํ์ ์ผ๋ก ๋ค์ด๋ ์ ์์ผ๋ฏ๋ก, ๋ง์ฝ ์ค๊ฐ์ ๋ค์ด๋๋ฉด make -j2
๋ก ๋ณ๊ฒฝ
Copy git clone https://github.com/apache/incubator-mxnet.git --branch v1.4.x --recursive
cd incubator-mxnet/
Copy cp make/config.mk .
sed -i 's/USE_CUDA = 0/USE_CUDA = 1/' config.mk
sed -i 's/USE_CUDA_PATH = NONE/USE_CUDA_PATH = \/usr\/local\/cuda/' config.mk
sed -i 's/USE_CUDNN = 0/USE_CUDNN = 1/' config.mk
sed -i '/USE_CUDNN/a CUDA_ARCH := -gencode arch=compute_53,code=sm_53' config.mk
4) Install MXNet
Copy cd python
sudo python setup.py install
cd ..
export MXNET_HOME = $( pwd )
echo "export PYTHONPATH=$MXNET_HOME/python:$PYTHONPATH" >> ~/.bashrc
source ~/.bashrc
5) libopencv-dev
์ค์น
OpenCV๋ฅผ ์ธ์คํจํด๋ ์ผ๋ถ ์์กด์ฑ ํ์ผ๋ค์ MXNet์์ ์ฐพ์ง ๋ชปํ๋ฏ๋ก libopencv-dev
์ค์น๋ก ํด๊ฒฐ ๊ฐ๋ฅ. ์ฐธ๊ณ ๋ก libopencv-dev ๋ฒ์ ์ 4.1.1๋ก ๋ฒ์ ์ถฉ๋ ๋ฌธ์ ์์.
Copy sudo apt-get install libopencv-dev
6) (Optional) ํ
์คํธ
Copy >>> import mxnet as mx
>>> a = mx . nd . ones (( 2 , 3 ), mx. cpu ())
>>> print (a * 2 )
[[ 2 . 2 . 2 . ]
[ 2 . 2 . 2 . ]
< NDArray 2x3 @ cpu ( 0 ) >
>>> import mxnet as mx
>>> a = mx . nd . ones (( 2 , 3 ), mx. gpu ()) # ์ฒ์ ์คํ ์ ์ฝ 30์ด ์ ๋ ๋๋ ์ด๋จ
>>> print (a * 2 )
[[ 2 . 2 . 2 . ]
[ 2 . 2 . 2 . ]
< NDArray 2x3 @ gpu ( 0 ) >