Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

20170823【GWゼミ #2】AWS Lambda上でOpenCVを使った画像処理

406 views

Published on

グローバルウォーカーズ株式会社が主催する勉強会「GWゼミ」第2回の発表資料です。AWS Lambda上でOpenCVを動作させる手順を解説。

Published in: Engineering
  • Be the first to comment

20170823【GWゼミ #2】AWS Lambda上でOpenCVを使った画像処理

  1. 1. 【GWゼミ #2】コンピュータビジョン+機械学習+AWS 勉強会 2/3 AWS LambdaでOpenCV © 2017 Global Walkers,Inc. 2017/08/23 0
  2. 2. 1© 2017 Global Walkers,Inc. AWS連携カメラアプリの構成例
  3. 3. 2© 2017 Global Walkers,Inc. 今回は 今回はこの部分。 LambdaでOpenCVを動かしてみました。
  4. 4. 3 コンピュータビジョン・機械学習の活用 システム構成例1 スマートフォン ・領収書エリアの特定 ・文字領域の推定 ・文字の読み取り © 2017 Global Walkers,Inc. 学習用画像データ (事前に収集) 事前に学習 領収書認識
  5. 5. 4 画像をクラウドサーバに送信 クラウドサーバー ・ユーザ管理 ・画像データの蓄積 ・領収書エリアの特定 ・文字領域の学習、推定 ・文字の学習、読み取り スマートフォン ・サーバ連携 © 2017 Global Walkers,Inc. 学習用画像データ 学習 データの蓄積 コンピュータビジョン・機械学習の活用 システム構成例2 サーバ連携領収書認識
  6. 6. 5© 2017 Global Walkers,Inc. 今回はLambdaを使ってみる Lambdaとは ・サーバーレスでプログラムをAWSクラウド上で実行してくれる ・対応言語: NodeJS, Java, Python, C# ・AWSクラウドのアクションをトリガーにしてプログラムを実行可能 ・S3へのファイルのアップロード時 ・DynamoDBのテーブル更新時 など ・AWS API gatewayを使って簡単にLambda関数を公開できる
  7. 7. 6© 2017 Global Walkers,Inc. 今回はLambdaを使ってみる Lambdaとは ・メリット EC2が不要 使用頻度が低い場合、費用が安い ・デメリット 処理時間の上限が300秒 メモリに上限がある(最大で1536MB) 一時ディスク容量に上限がある(最大512MB) Lambda関数デプロイパッケージのサイズに上限がある(圧縮後50MB) → これが結構厳しい。OpenCVだけで・・・
  8. 8. 7© 2017 Global Walkers,Inc. まずは準備 LambdaでOpenCV等のライブラリを使用するためには、それらを一つにまとめた zipを作成する必要がある。 まずは、Docker上でamazon linuxを動かす (http://qiita.com/mkisono/items/b2add04203f7b4a6da67を参考に) FROM amazonlinux:latestRUN yum update -yRUN yum install python27-devel python27-pip gcc gcc-c++ cmake git zip -yRUN yum install libjpeg-devel zlib-devel -yRUN pip install --upgrade pipRUN pip install virtualenv numpyENV HOME /home/lambda-pyRUN mkdir $HOMEWORKDIR $HOMERUN git clone https://github.com/opencv/opencv.gitWORKDIR $HOME/opencvWORKDIR $HOME/opencv/buildRUN cmake -D CMAKE_BUILD_TYPE=RELEASE -D BUILD_SHARED_LIBS=NO -D BUILD_opencv_python2=ON -D BUILD_opencv_calib3d=OFF -D BUILD_opencv_objdetect=OFF -D BUILD_opencv_ml=OFF -D BUILD_opencv_features2d=OFF -D BUILD_opencv_stitching=OFF -D BUILD_opencv_videostab=OFF -D BUILD_opencv_flann=OFF -D BUILD_opencv_superres=OFF -D BUILD_opencv_shape=OFF -D BUILD_opencv_ts=OFF -D BUILD_opencv_video=OFF -D BUILD_opencv_videoio=OFF -D CMAKE_INSTALL_PREFIX=/usr/local ..RUN make installWORKDIR $HOMERUN virtualenv $HOME/venv
  9. 9. 問題発生 OpenCVのsoファイルが90MBくらいある!!! Lambdaの上限を超えてしまっている。とりあえずいろいろとOFFにしてみる。 → 下記で、再度コンパイル! cmake -D CMAKE_BUILD_TYPE=MinSizeRel -D BUILD_SHARED_LIBS=NO -D BUILD_opencv_python2=ON -D BUILD_CUDA_STUBS=OFF -D BUILD_DOCS=OFF -D BUILD_EXAMPLES=OFF -D BUILD_JASPER=OFF -D BUILD_JPEG=ON -D BUILD_OPENEXR=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_PNG=OFF -D BUILD_TBB=OFF -D BUILD_TESTS=OFF -D BUILD_TIFF=OFF -D BUILD_WITH_DEBUG_INFO=OFF -D BUILD_ZLIB=OFF -D BUILD_WEBP=OFF -D BUILD_opencv_apps=OFF -D BUILD_opencv_calib3d=OFF -D BUILD_opencv_core=ON -D BUILD_opencv_cudaarithm=OFF -D BUILD_opencv_cudabgsegm=OFF -D BUILD_opencv_cudacodec=OFF -D BUILD_opencv_cudafeatures2d=OFF -D BUILD_opencv_cudafilters=OFF -D BUILD_opencv_cudaimgproc=OFF -D BUILD_opencv_cudalegacy=OFF -D BUILD_opencv_cudaobjdetect=OFF -D BUILD_opencv_cudaoptflow=OFF -D BUILD_opencv_cudastereo=OFF -D BUILD_opencv_cudawarping=OFF -D BUILD_opencv_cudev=OFF -D BUILD_opencv_features2d=ON -D BUILD_opencv_flann=OFF -D BUILD_opencv_hal=OFF -D BUILD_opencv_highgui=ON -D BUILD_opencv_imgcodecs=ON -D BUILD_opencv_imgproc=ON -D BUILD_opencv_java=OFF -D BUILD_opencv_ml=ON -D BUILD_opencv_objdetect=ON -D BUILD_opencv_photo=OFF -D BUILD_opencv_python3=OFF -D BUILD_opencv_shape=OFF -D BUILD_opencv_stitching=OFF -D BUILD_opencv_superres=OFF -D BUILD_opencv_ts=OFF -D BUILD_opencv_video=OFF -D BUILD_opencv_videoio=OFF -D BUILD_opencv_videostab=OFF -D BUILD_opencv_viz=OFF -D BUILD_opencv_world=OFF -D WITH_1394=OFF -D WITH_CUBLAS=OFF -D WITH_CUDA=OFF -D WITH_CUFFT=OFF -D WITH_EIGEN=OFF -D WITH_FFMPEG=OFF -D WITH_GDAL=OFF -D WITH_GPHOTO2=OFF -D WITH_GIGEAPI=OFF -D WITH_GSTREAMER=OFF -D WITH_GTK=OFF -D WITH_INTELPERC=OFF -D WITH_IPP=OFF -D WITH_IPP_A=OFF -D WITH_JASPER=OFF -D WITH_JPEG=ON -D WITH_LIBV4L=OFF -D WITH_OPENCL=OFF -D WITH_OPENCLAMDBLAS=OFF -D WITH_OPENCLAMDFFT=OFF -D WITH_OPENCL_SVM=OFF -D WITH_OPENEXR=OFF -D WITH_OPENGL=OFF -D WITH_OPENMP=OFF -D WITH_OPENNI=OFF -D WITH_PNG=OFF -D WITH_PTHREADS_PF=OFF -D WITH_PVAPI=OFF -D WITH_QT=OFF -D WITH_TBB=OFF -D WITH_TIFF=OFF -D WITH_UNICAP=OFF -D WITH_V4L=OFF -D WITH_VTK=OFF -D WITH_WEBP=OFF -D WITH_XIMEA=OFF -D WITH_XINE=OFF -D CMAKE_INSTALL_PREFIX=/usr/local .. 8© 2017 Global Walkers,Inc.
  10. 10. 9© 2017 Global Walkers,Inc. デプロイパッケージを作成 bash-4.2# source $HOME/venv/bin/activate (venv) bash-4.2# pip install Pillow numpy (venv) bash-4.2# cp /usr/local/lib/python2.7/dist-packages/cv2.so ~/venv/lib/python2.7/site-packages/ (venv) bash-4.2# cd ~/venv/lib/python2.7/site-packages (venv) bash-4.2# zip -r9 ~/lambda_function.zip * 無事に50MB以内に収まりました J
  11. 11. 10© 2017 Global Walkers,Inc. ソースコード: lamda_func.py import cv2 import boto3 import os import sys s3_client = boto3.client('s3') def resize_image(image_path, resized_path): img=cv2.imread(image_path) orgHeight, orgWidth = img.shape[:2] size = (orgHeight/2, orgWidth/2) img_s=cv2.resize(img, size) cv2.imwrite(resized_path, img_s) def handler(event, context): for record in event['Records']: bucket = record['s3']['bucket']['name'] key = record['s3']['object']['key'] download_path = '/tmp/'+key upload_path = '/tmp/resized-{}'.format(key) s3_client.download_file(bucket, key, download_path) resize_image(download_path, upload_path) s3_client.upload_file(upload_path, bucket, 'resized-'+key)
  12. 12. 11© 2017 Global Walkers,Inc. Lambdaの設定 lambda_func.py import cv2 import boto3 import os import sys s3_client = boto3.client('s3') def resize_image(image_path, resized_path): img=cv2.imread(image_path) orgHeight, orgWidth = img.shape[:2] size = (orgHeight/2, orgWidth/2) img_s=cv2.resize(img, size) cv2.imwrite(resized_path, img_s) def handler(event, context): for record in event['Records']: bucket = record['s3']['bucket']['name'] key = record['s3']['object']['key'] download_path = '/tmp/'+key upload_path = '/tmp/resized-{}'.format(key) s3_client.download_file(bucket, key, download_path) resize_image(download_path, upload_path) s3_client.upload_file(upload_path, bucket, 'resized-'+key) ロールにS3のアクセス権限を付与しておきましょう!
  13. 13. 12© 2017 Global Walkers,Inc. Lambdaの設定 128MBでも今回は動くはずですが、とりあえず192MBに設定
  14. 14. 13© 2017 Global Walkers,Inc. デプロイ AWS CLIからもできるが、今回はAWSコンソールから
  15. 15. 14© 2017 Global Walkers,Inc. いよいよテスト
  16. 16. 15© 2017 Global Walkers,Inc. いよいよテスト S3 Putを選択 画像ファイル名、ARNを設定
  17. 17. 16© 2017 Global Walkers,Inc. いよいよテスト テスト結果画面 問題なく動きました!
  18. 18. 17© 2017 Global Walkers,Inc. いよいよテスト S3上にファイルサイズが約1/4の縮小画像を生成、保存できました。
  19. 19. © 2017 Global Walkers,Inc. 最後に GWゼミ #3: 2017年9月6日(水) 機械学習の基礎の続き 機械学習を用いた画像認識処理をAWS上で実行するために GWゼミのグループにもご参加ください。 https://gwz.connpass.com 今後も勉強会を開催していきます 全てではないですが、発表資料を公開した際にグループ宛にメッセージを送信予定 18
  20. 20. © 2017 Global Walkers,Inc. 最後に コンテンツ × テクノロジーに共感し、 一緒に作り上げていく仲間募集中!!! (正社員、契約社員、請負い、インターンなど相談可) 19

×