アプリとサービスのすすめ

アプリやIT系のサービスを中心に書いていきます。たまに副業やビジネス関係の情報なども気ままにつづります

sagemakerのセグメンテーションを使って物体の長さを測るモデル構築から、運用MLops構築までの記録【機械学習、AWS】

今回取り組んだプロジェクトは、

・sagemakerの組み込みアルゴリズムのセグメンテーションを使って、物体の長さを求めるモデルの作成

・CloudFrontで作ったフロント側から画像をPOST→lambda関数→sagemaker→推論→長さ測定→結果を表示する流れのMLops構築


の2つをメインにやったので、その概要まとめた。

目次
・長さ計測ロジック
・sagemaker MLopsの構築
・学んだ技術&メモ、まとめ
・sagemaker segmentation ガイド





長さ計測ロジック

sagemakerの組み込みアルゴリズムでセグメンテーションしたあと、物体の各A~E点を求め、「横と高さ」の「縦の長さ」を求めるロジックを実装した。

機械学習モデルはセグメンテーションを使い、長さを測るのはロジックはpythonで実装。
ロジック構築には物体のA〜E点の各点を求めて計算式から長さを求めた。

下のように各点をどのように求めるか、点を引いたり線を引いたり、試行錯誤。
f:id:trafalbad:20191224004411p:plain



求めた各点から下の計算式とかで横の長さを求めた。

横の長さ計算式
AB : [real AB](横の長さ) = CD : [real CD]

f:id:trafalbad:20191224004219p:plain



縦の長さ計算式
AE : [real AE](縦の長さ) = AB : [real AB]
f:id:trafalbad:20191224004320p:plain


そのあとAEからN(定数:あらかじめ決まった値)を引いて縦の長さを求めた


sagemaker MLopsの構築

前の記事でも書いたように、
CloudFrontからデータをPOST→lambda→sagemakerで推論→長さを受け取るMLopsを構築した。

MLops全体像
f:id:trafalbad:20191224004445j:plain



MLops全体の流れ
f:id:trafalbad:20191224004504p:plain


以下はMLops構築で重要だった部分。





CloudFrontのデータを送るWebUI部分



CloudFrontのWebUIはJavaScriptで実装。その時データはajaxでPOSTした。Fetch APIでもOK。

CloudFront側から送るjavascriptajaxの部分。送るデータは画像なので、バイナリ形式の画像でPOST。

// ajaxの部分
$.ajax({
type:'POST', // 使用するHTTPメソッド (GET/ POST)
url:APIurl, // 通信先のAURL
data:JSON.stringify(jsons), // 送信するデータ
contentType: "application/json"})


cssにはpx以外にもブラウザに合わせて長さを%で変更できるhw, vwという長さの単位があったり、画像を表示する「canvasタグ」を複数使い分けるのには、結構発想が必要だったりデザイン面でも苦労が多かった。





handler.py内部の動作


lambda内での動作はいちいちエラーをCloudwatchにみにいくのは、タイムロスがデカ過ぎるので、
sagemakerのjupyter notebookで動作確認してから、試行錯誤したりとなるべく効率化。

lambdaやAPI gateway構築は、ネット上に転がってるサイト通りには行かない場面も多く、エラー解決に手間取った




lambdaに外部モジュールを読み込ませるとき


handler.pyで使うライブラリをlambdaに読み込ませる必要がある。

s3やコンソールから読み込ませると面倒なので、requirement.txtを作りデプロイ時(sls deploy)時に同時にパケージをupload

参考サイト
Serverless Frameworkのプラグインを利用した外部モジュールの管理
(サイト内のimport requirementは必要なかった)




lambda内でファイルを置ける/tmpファルダの活用




handler.pyないの内部処理で「~.jpg」が必要だったので、その時に「/tmp/~.jpg」と実装すれば、lambda内の/tmpファルダを利用できる


参考サイト
AWS Lambda Python でtmpディレクトリにファイル作成してS3にアップロード


権限とかはエラーが出るたび付与して解決。
これで sagemakerを入れたMLopsが完成した。
f:id:trafalbad:20191224004445j:plain




serverless frameworkとかクラウドを使った、実用レベルのMLops構築ははじめてでかなり学ぶことが多かった。

このMLops作成に過程は前の2記事にまとめた。

AWSでCloudFrontからlambdaとsagemakerを通り、推論結果を受け取るMLopsの構築【機械学習】 - アプリとサービスのすすめ

CloudFrontからS3にuploadしたコンテンツ(サイト)にアクセスする手順まとめ【AWS】 - アプリとサービスのすすめ




学んだ技術&メモ、まとめ

システム全体像やコードの流れの理解

大規模なプログラムを構築するときは、全体像を把握しておくことはかなり便利だった。



システム全体像把握ツール

draw.io

フローチャート

・シーケンス図

特にdraw.ioやフローチャート、シーケンス図で、システム全体の流れ、構成図そして全体像を把握しておくことで、細部までコードの動きをイメージできるので、コードが素早く書ける。

f:id:trafalbad:20191224004534j:plain






gitでのコード管理

gitを使ったコード管理も本格的にやった。とくにGit submoduleとか、いろんなgitコマンドでコード管理した。






今後学ぶべきことメモ
基本情報技術者試験の基礎内容の勉強

フローチャート、シーケンス図を使っての効率化

もっと汎用的な他人のコードを学んで、積極的に使うこと


今回はモデル構築から、それを使うMLops構築まで全体を通してやったプロジェクトでかなり大変だったけどリターンのスキルはデカく、かなり勉強になった。



sagemaker segmentation ガイド

Amazon SageMaker 開発者ガイド

組み込みセマンティックセグメンテーションアルゴリズムルール

p410

f:id:trafalbad:20200124111701p:plain

train ディレクトリと validation ディレクトリ内のすべての JPG イメージには、train_annotation ディ レクトリと validation_annotation ディレクトリ内に同じ名前の対応する PNG ラベルイメージがあ ります。この命名規則は、トレーニング中にアルゴリズムがラベルをそれに対応するイメージに関連付け るのに役立ちます。