MXNet 시작하기 (6) – Raspberry Pi에서 실시간 객체 분석 하기

5편에서는 이미지의 객체 검출을 위해 유명한 세 가지 학습 모델을 사용하여, 간단한 MXNet 소스 코드를 사용하여 몇 가지 이미지를 테스트해보았습니다.

우리가 배운 것 중 하나는 각 모델이 서로 다른 메모리 요구 사항이 있다는 것입니다. 가장 메모리를 적게 먹는 것은 Inception v3으로 “43MB”만 사용입니다. 정말 이게 잘 될까? 예를 들어, “라스베리파이(Raspberry Pi)” 같은 작은 디바이스에서 실행할 수 있을까라는 질문을 해볼 수 있을 텐데요. 이번 글에서 함께 알아 보시죠!

공식 가이드가 있지만, 몇 가지 단계가 빠진 것을 발견해서 아래 내용을 따라가면 최신 Raspbian을 실행하는 Raspberry Pi 3에서 제대로 작동합니다.

$ uname -a
 Linux raspberrypi 4.4.50-v7+ #970 SMP Mon Feb 20 19:18:29 GMT 2017 armv7l GNU/Linux

맨 먼저 필요한 라이브러리를 추가합니다.

$ sudo apt-get update
$ sudo apt-get -y install git cmake build-essential g++-4.8 c++-4.8 liblapack* libblas* libopencv* python-opencv libssl-dev screen

그런 다음 MXNet 저장소를 복제하고, 최신 버전을 가져옵니다. 마지막 단계를 놓치지 마세요.

$ git clone https://github.com/dmlc/mxnet.git --recursive
$ cd mxnet
# List tags: v0.9.3a is the latest at the time of writing
$ git tag -l
$ git checkout tags/v0.9.3a

MXNet은 Amazon S3에서 데이터를 로드하고 저장할 수 있으므로 나중에 이 기능을 사용하면 편리 할 것입니다. MXNet은 또한 HDFS를 지원하지만 Hadoop을 로컬에 설치해야 하므로 좀 힘들겠죠?

make를 실행할 수 있지만 Pi의 제한된 처리 능력을 감안할 때, 빌드는 약간 시간이 걸릴 것입니다. SSH 세션이 만료되면 문제가 있을 수 있으니 Screen을 사용하면 좋습니다.

약간 속도를 높이기 위해 2 코어(4개 중)에서 병렬 실행을 실행할 수 있습니다. 더 많은 코어를 사용하면, 응답을 안할 수가 있으니 꼭 2개만 사용하시기 바랍니다.

$ export USE_S3=1
$ screen make -j2

이것은 약 1 시간 정도 걸립니다. 마지막 단계는 라이브러리와 Python 바인딩을 설치하는 것입니다.

$ cd python
 $ sudo python setup.py install
 $ python
 Python 2.7.9 (default, Sep 17 2016, 20:26:04)
 [GCC 4.9.2] on linux2
 Type "help", "copyright", "credits" or "license" for more information.
 >>> import mxnet as mx
 >>> mx.__version__
 '0.9.3a'

모델 로딩하기
일단 모델 파일을 Pi에 복사 한 후에는 실제 파일을 로드 할 수 있어야합니다. 5편에서 쓴 똑같은 코드를 재사용할 수 있습니다. Pi는 약 580MB의 여유 메모리가 있는 CLI 모드를 지원합니다. 모든 데이터는 32GB SD 카드에 저장됩니다. 이제 VGG16를 로딩해봅시다.

>>> vgg16,categories = init("vgg16")
 terminate called after throwing an instance of 'std::bad_alloc'
 what(): std::bad_alloc

앗! VGG16이 너무 커서 메모리에 맞지 않네요. ResNet-152를 사용해 봅시다.

>>> resnet152,categories = init("resnet-152")
 Loaded in 11056.10 milliseconds

>> print predict("kreator.jpg",resnet152,categories,5)
 Predicted in 7.98 milliseconds
 [(0.87835813, 'n04296562 stage'), (0.045634001, 'n03759954 microphone, mike'), (0.035906471, 'n03272010 electric guitar'), (0.021166906, 'n04286575 spotlight, spot'), (0.0054096784, 'n02676566 acoustic guitar')]

ResNet-152는 약 10 초 만에 성공적으로 로딩되고, 10 밀리초 이내에 예측이 가능합니다. 이제 Inception v3으로 넘어 가 보죠.

>>> inceptionv3,categories = init("Inception-BN")
 Loaded in 2137.62 milliseconds

>> print predict("kreator.jpg",resnet152,categories,5)
 Predicted in 2.35 milliseconds
 [(0.4685601, 'n04296562 stage'), (0.40474886, 'n03272010 electric guitar'), (0.073685646, 'n04456115 torch'), (0.011639798, 'n03250847 drumstick'), (0.011014056, 'n02676566 acoustic guitar')]

Pi와 같은 제한된 장치에서는 모델 차이가 훨씬 더 분명하게 보입니다! Inception v3은 훨씬 빠른 속도로 로딩하고, 몇 밀리 초 안에 예측이 가능합니다. 모델이 로딩 될 경우에도 실제 응용 프로그램을 실행하는 충분한 RAM이 PI에 남아있어야 한다는 점은 확인하기 바랍니다.

Pi 카메라를 사용하여 이미지 캡처하기
Raspberry Pi에 추가 할 수 있는 제일 좋은 디바이스는 카메라 모듈입니다. 진짜 간단합니다.

>>> inceptionv3,categories = init("Inception-BN")

>>> import picamera
>>> camera = picamera.PiCamera()
>>> filename = '/home/pi/cap.jpg'

>>> print predict(filename, inceptionv3, categories, 5)

아래는 간단한 예입니다.

Predicted in 12.90 milliseconds
 [(0.95071173, 'n04074963 remote control, remote'), (0.013508897, 'n04372370 switch, electric switch, electrical switch'), (0.013224524, 'n03602883 joystick'), (0.00399205, 'n04009552 projector'), (0.0036674738, 'n03777754 modem')]

잘 동작하죠?  이제 Amazon AI 서비스를 추가 해보면 어떨까요.  얼마 전에 만든 Python 스크립트 (문서, 코드)를 사용하여 Amazon Rekognition을 통해 같은 사진을 실행해 볼 수 있습니다.

$ ./rekognitionDetect.py jsimon-public cap.jpg copy
 Label Remote Control, confidence: 94.7508468628

인식된 레이블을  음성으로 전달해 본다면 어떨까요? Amazon Polly를 추가하는 것도 쉽습니다.

Amazon Rekognition 및 Amazon Polly는 AWS가 제공하는 딥러닝(Deep Learning) 기술을 기반으로 만들어진 완전 관리(Fully-managed) 서비스입니다.  개발자라면 누구나 쉽게 사용 가능하며 학습 모델이나 인프라에 대해 걱정할 필요가 없고, 단지 API를 호출만 하면 됩니다. 다양한 이미지 인식 기능과 많은 언어의 음성 합성 기능을 제공합니다.

MXnet 기반의 Inception v3 모델을 사용하여 실시간 개체 감지를 수행하고, Amazon Polly에서 본 내용을 설명하는 Raspberry Pi의 비디오를 한번 살펴 보세요!

지금까지 MXNet에 대한 API와 이를 사용한 이미지 인식을 위해 많은 것을 살펴 보았습니다.  이미지내 객체 감지를 위해 합성곱 신경망(Convolutional Neural Networks)에 초점을 맞추었지만, MXNet에는 훨씬 더 많은 학습 모델이 있고, 추가로 새로운 시리즈를 통해 배울 수 있을 것입니다.

연재 순서

이 시리즈는 AWS 테크 에반젤리스트인 Julien Simon이 연재한 MXNet 관련 글 모음의 번역 편집본으로 최근 각광 받고 있는 Deep Learning 라이브러리인 Apache MXnet  을 개괄적으로 설명하려고 합니다.

여러분의 생각