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に置きました。