狠狠撸

狠狠撸Share a Scribd company logo
Deep Learning
API By Keras
and Flask
On June 1, 2018 at Shibuya
supported by CoLab
WATANABE Naoki
自己紹介
2
渡邊直樹
2017- スタートアップ創業など
2016-2017 IBMで研究開発
2010-2016 東大でCERNの素粒子実験開発
● スキューバのライセンスホルダー
● シドニーマラソン2017完走
● 富士下山90分
● 40以上の国を訪問
● 400+冊の読書 (2017)
● 自然語学の勉強が趣味
Colabではtinder自動操作についてのLT経験あり。
3
目次
1. API
1. APIが何かを知る
2. Flaskで画像アップローダーを作る
2. Deep Learning
1. Deep Learningが何かを知る
2. VGGで画像認識を行う
3. Deep Learningを使ったAPIを作る
4
pipインストールを前提とするもの
● Flask
● Tensorflow
● Keras
● PIllow
*Python 3.6.1
5
スライド中のソースコードは全てgistにあります
https://gist.github.com/asterisk37n/e139272963f1bd
659fcd532a35c59978
短縮アドレスからアクセスすると便利です:
https://goo.gl/davdv1
6
1.APIを理解して
Flaskで実装するWhat is API and How to make it?
APIはサーバーとクライアントをつなぐもの
8
APIの具体例1/2: Twitter
9
10
APIの具体例2/2: 郵便番号
Flaskでminimalなwebサービスを作る
11
わずか7行のapp.pyを書きpython app.pyで実行
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__ == '__main__':
app.run()
12
URL
html
contents
start
server
Go to http://localhost:5000, and see
13
エンドポイントを追加する
14
15
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'Index Page'
@app.route('/hello')
def hello():
return 'Hello, World'
@app.route('/users/<username>')
def show_user_profile(username):
# show the user profile for that user
return 'User %s' % username
if __name__ == '__main__':
app.run()
16
17
18
REST APIぽくする
19
20
from flask import Flask, jsonify
app = Flask(__name__)
@app.route('/users')
@app.route('/users/<int:id>')
def users(id=None):
print(id)
users = [
{'id': 1, 'name': 'Alice'},
{'id': 2, 'name': 'Bob'},
{'id': 3, 'name': 'Charlie'}]
if id is None:
return jsonify(users)
elif isinstance(id, int) and 1 <= id <= 3:
return jsonify({'id': id, 'name': users[id-1]['name']})
else:
return jsonify({})
if __name__ == '__main__':
app.run()
21
22
23
画像をPOSTする
(ただし、responseはファイル名)
24
25
26
27
28
2. Deep learningの
概念を理解する。
Kerasを使う。
How deep learning works and how to use it
ディープラーニングとは何かを知る
30
31
人間の脳を数学で模倣したらどうなるだろうか
32
Deep learningとは脳を模倣したモデル
33
大量のデータによる学習で重みを調整
(Back propagation)
34
画像では、畳み込み層で特徴を抽出する
35
36
全結合層
37
ニューロンの発火(値が大きいと次に伝播)は
activatorで模倣
38
画像の例。入力画像のピクセル一つ一つが入力。
39
ディープラーニングには学習が必要
1. データの用意
2. ネットワークの学習
3. ネットワークの精度を確認
40
● GoogLeNet
● Xception
● ResNet50
● InceptionV3
● VGG16
● VGG19
など。
ただし、学習済みのネットワークが公開されている
41
Kerasでは一部の学習済みモデルが簡単に利用可能
from keras.applications.xception import Xception
from keras.applications.vgg16 import VGG16
from keras.applications.vgg19 import VGG19
from keras.applications.resnet50 import ResNet50
from keras.applications.inception_v3 import InceptionV3
model = VGG16(weights='imagenet', include_top=True)
42
VGG16
● ImageNet Large Scale Visual Recognition Challengeが初出 (2014)
● 13層の畳み込み層
● 3層のフル結合層
● 1000種類の画像を認識
● 知られたモデルの基礎にVGG16が使われている(写真: keras document)。
43
KerasでVGG16を使い画像を認識させる
44
.
├─ vgg_sample.py
└─ cat.jpg
フォルダ構成
45
まず、VGGモデルの概要を表示(vgg_sample.py)
from keras.applications.vgg16 import VGG16
model = VGG16(weights='imagenet', include_top=True)
print(model.summary())
46
47
画像を認識 (vgg_sample.py)
from keras.applications.vgg16 import VGG16, preprocess_input, decode_predictions
from keras.preprocessing import image
import numpy as np
img_path = 'cat.jpg'
model = VGG16(weights='imagenet', include_top=True)
img = image.load_img(img_path, target_size=(224, 224))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)
pred = model.predict(x)
label = decode_predictions(pred)
print(label) 48
Result (正解!)
● Tiger cat (42%)
● Egyptian cat (36%)
● Tabby (12%)
● Lynx (2%)
出力結果は、(imagenetID, ラベル, 確率)のリスト。
49
3. ディープ
ラーニングの
APIを構築する
Response
{
"success":true,
"predictions":[
{
"label":"animal",
"probability":0.7
},
{
"label":"human",
"probability":0.2
},
{
"label":"fish",
"probability":0.1
}
]
}
これから作るVGG API RequestとResponseの定義
Request
{"file":"binary image data"}
51
import os
from flask import Flask, request, redirect, url_for, jsonify, Response
from werkzeug.utils import secure_filename
from keras.applications.vgg16 import VGG16, preprocess_input, decode_predictions
from keras.preprocessing import image
import numpy as np
from PIL import Image
import io
モジュールのimportとモデルの読み込みを構築。
52
appの宣言とモデルの読み込みを構築。
53
app = Flask(__name__)
model = None
def load_model():
global model
model = VGG16(weights='imagenet', include_top=True)
画像を認識する
@app.route('/', methods=['GET', 'POST'])
def upload_file():
response = {'success': False}
if request.method == 'POST':
if request.files.get('file'):
img_requested = request.files['file'].read()
img = Image.open(io.BytesIO(img_requested))
if img.mode != 'RGB':
img = img.convert('RGB')
img = img.resize((224, 224))
img = image.img_to_array(img)
img = np.expand_dims(img, axis=0)
inputs = preprocess_input(img)
preds = model.predict(inputs)
results = decode_predictions(preds) 54
VGGの出力結果をjsonの形に整形する
response['predictions'] = []
for (imagenetID, label, prob) in results[0]:
row = {'label': label, 'probability': float(prob)}
response['predictions'].append(row)
response['success'] = True
return jsonify(response)
55
オプションで、画像のアップロード画面
return '''
<!doctype html>
<title>Upload new File</title>
<h1>Upload new File</h1>
<form method=post enctype=multipart/form-data>
<p><input type=file name=file>
<input type=submit value=Upload>
</form>
'''
56
モデルを読み込み、アプリケーションを実行
(load_modelだけでmodelを読み込むようにしている)
if __name__ == '__main__':
load_model()
# About threaded=False: https://github.com/keras-
team/keras/issues/2397#issuecomment-377914683
# avoid model.predict runs before model initiated
app.run(threaded=False)
57
できあがったAPIにcURLを使ってPOSTリクエスト
58
ブラウザでも確認 (FireFox)
59
他の画像で確認
(ウェルシュ?コーギ
ー?ペンブローク)
60
61
参考文献
Flask Quickstart
http://flask.pocoo.org/docs/1.0/quickstart/
Building a simple Keras + deep learning REST API
https://blog.keras.io/building-a-simple-keras-deep-learning-rest-api.html
Imagenet 1000 classes and labels
https://gist.github.com/aaronpolhamus/964a4411c0906315deb9f4a3723aac57
62
That’s all, folks. Thank you.
63

More Related Content

Lecuture on Deep Learning API

Editor's Notes

  • #4: かんたんな経歴
  • #9: http://sahilsk.github.io/articles/so-youre-writing-api-client/