VGG16をfine tuningしたmodelを簡単にapply(predict)するsystemが NotePC程度で動くことを証明したく、 PythonのBaseHTTPServerで1日でちゃちゃっと作りました。
といっても「PythonのBaseHTTPServer」なんて触るの初めてです。
bradmontgomery/dummy-web-server.pyを参考にしました。
なるほど、classを定義して、BaseHTTPRequestHandler
を引数にして、
do_GET
やdo_POST
を書くわけですね。
routingは自分でやれと。面倒なのでmethodで分けました。
このsystem自体をone fileで済ませたかったので、
GET
でindex.html
を返したいと思い、
そのためにはhere documentを書きたいな、
と思ったので、
Pythonのヒアドキュメントを参考に、
あぁ、普通に'''
(single quote 3つ)でいいのね、とわかりました。
single quoteでも中で変数展開されるんですね。へー。
PythonでJSONを受けて処理をするを参考に、
POST
時のparameter(=request body)の受け取り方を。
HTTP Request HeaderのContent-Length
をint
として記憶し、
self.rfile.read()
でそのbyte分読んで、
decode()
でstringにすると。
parameterizedされるわけではなく、bodyがまるっと読まれるので、
parameterで分けるのは自分でやれということですね。
あと、base64として来た文字列をdecodeしてImage
化するには、
先頭のimage/jpeg;base64,
を除去し(replace()
)て純粋にBase64文字列だけにし、
base64.b64decode(content)
したものをio.BytesIO()
し、
それをImage.open()
すると。
predict()
したものは2次元配列になっているので、
0番目のargmax()
したものが答えの添字、なのですね。
ともあれ、このpython predict server script 1つと keras model fileの2 filesだけでサクッと動くものを、 githubに置きました。