読者です 読者をやめる 読者になる 読者になる

Stimulator

機械学習とか好きな技術話とかエンジニア的な話とかを書く

Djangoで送信された画像データをPyhon上で処理するWebサービスを作る

- はじめに -

自分のWebサービスは基本PythonDjangoフレームを利用している。

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周りを追加しておく。

Apacheだったらそれらでディレクトリの権限をちゃんと設定しておく必要あり。


- おわりに -

こんなのが出来る

vaaaaaanquish.hatenadiary.jp