- はじめに -
自分のWebサービスは基本PythonのDjangoフレームを利用している。
Djangoでフォームから画像を投稿してもらって、それを受け取り、画像処理や機械学習で色々やって画像として返す、といったサービスを作りたい時のメモ。
実際に「ドイツのトリおるか」なる特定の鳥を赤枠で囲むクソサービスを運営しているので、そちらも参考に。
- Django周りのコード -
view.py辺りにいつもこんな感じで書いている。
# //-- Django周りのimport -- from PIL import Image import sys sys.path.append("/usr/local/lib/python2.7/site-packages") import numpy import dlib import cv2 @csrf_protect def main(request): # POSTを受けた時 if request.method == 'POST': try: # 画像化して処理 img_moto =Image.open(request.FILES['image']) img=numpy.asarray(numpy.array(img_moto)) dets = original_detector_run(img) except Exception: # エラー(画像じゃない等) f = forms.TestForm(request.GET or None) return render_to_response('index.html', context_instance=RequestContext(request, {'form1': f, "text":"エラーだよ"})) # 画像を編集 img = img_dets_ediy(img, dets) # Responseとして画像を返す response = HttpResponse(mimetype="image/png") img_moto.save(response, "PNG") return response # 普段の動作 else: f = forms.TestForm(request.GET or None) return render_to_response('index.html', context_instance=RequestContext(request, {'form1': f}))
requestを受け取ったら、FILES['image']の中に画像情報が入っていてPILのImageベースで利用できる。
あとはいつもの変換作業でよしなに。
OpenCVとPIL(python Image library)のデータ変換 - tataboxの備忘録
- ありがちなやつ -
PYTHON_PATHだけでなく、`django-admin.py`にパスを書く必要がある。
やっておくとsys.path.appendは不要になる(場合がある)。
Django の django-admin.py でパスを通しても command not found の時 - Qiita
画像処理だと、OpenCVを使いたい場合があるが、Pythonのバインディングはcv2.soファイルで行っているので、そこへのPATHも通す必要がある。(大体site-package内にあるはずだが自分は諸事情でなかったので)
また、wsgiのPATHの設定が居る場合もある。
wsgi.py(もしくはvirtualenv内のwsgiファイル)にWSGIPythonPathとしてsite-package周りを追加しておく。