Ubuntu に OpenCV をインストールして Python で画像から顔をクロップするまで

以前に Tensorflow のセットアップをして、付属するサンプルを試すところまでして終わっていましたが、 実際に何か試してみないとということで、よくある顔判別をやるためにデータを用意する仕組みを作ろうとしてます。 Python 3 と OpenCV 3 を使って画像から顔検出してそれを正方形でクロップして同一サイズにするというスクリプトを作ります。 セットアップ ほぼ下記のサイトの通りやったところうまくいきました。 www.pyimagesearch.com 以前にcudaのライブラリを VirtualBox 上の仮想環境にに入れていたせいでコンパイルエラーになりましたが、 それも下記のオプションを指定して進められました。 codeyarns.com スクリプト Python はほとんど書いたことないのですが、色々と調べてなんとかそれらしいものができました。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 import cv2 import sys import os class FaceCropper(object): CASCADE_PATH = "data/haarcascades/haarcascade_frontalface_default.xml" def __init__(self): self.face_cascade = cv2.CascadeClassifier(self.CASCADE_PATH) def generate(self, image_path, show_result): img = cv2.imread(image_path) if (img is None): print("Can't open image file") return 0 #img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = self.face_cascade.detectMultiScale(img, 1.1, 3, minSize=(100, 100)) if (faces is None): print('Failed to detect face') return 0 if (show_result): for (x, y, w, h) in faces: cv2.rectangle(img, (x,y), (x+w, y+h), (255,0,0), 2) cv2.imshow('img', img) cv2.waitKey(0) cv2.destroyAllWindows() facecnt = len(faces) print("Detected faces: %d" % facecnt) i = 0 #height, width = img.shape[:2] for (x, y, w, h) in faces: r = max(w, h) / 2 centerx = x + w / 2 centery = y + h / 2 nx = int(centerx - r) ny = int(centery - r) nr = int(r * 2) faceimg = img[ny:ny+nr, nx:nx+nr] lastimg = cv2.resize(faceimg, (32, 32)) i += 1 cv2.imwrite("image%d.jpg" % i, lastimg) if __name__ == '__main__': args = sys.argv argc = len(args) if (argc != 2): print('Usage: %s [image file]' % args[0]) quit() detecter = FaceCropper() detecter.generate(args[1], True) CASCADE_PATH は OpenCV に付属している顔検出の XML 定義のファイルパスを指定します。 顔検出は face_cascade.detectMultiScale の部分で最低の検出サイズを 100x100 として、scaleFactor=1.1, minNeighbors=3 を色々試行して良さそうな値としました。 また下記のサイトを参考にさせてもらいました。 物体検出(detectMultiScale)をパラメータを変えて試してみる(minNeighbors編) | Workpiles ...

2016年12月27日 · Toshimitsu Takahashi

モバイルサイト用のヘッダ出力を Python で書いてみた

モバイルサイトを3キャリアでほぼ共通化して作りたい - http://d.hatena.ne.jp/tilfin/20080530/1212376626 上記のエントリで DoCoMo, au, SoftBank 用のモバイルサイトを XHTML で作成する場合のそれぞれの書き方を調べた。 その書き方に従って HTTP ヘッダと XHTML 宣言部分を出力する CGI サンプルを Python で書いてみた。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 #!/usr/bin/env python \# -*- coding: utf-8 -*- import os import codecs class UserAgent: def \_\_init\_\_(self, ua): if ua.startswith("DoCoMo"): self.kind = 1 elif ua.startswith("KDDI"): self.kind = 2 elif ua.startswith("SoftBank") or ua.startswith("Vodafone") or ua.startswith("MOT"): self.kind = 3 else: self.kind = 0 def is_mobile(self): return self.kind > 0 def is_docomo(self): return self.kind == 1 def is_au(self): return self.kind == 2 def is_softbank(self): return self.kind == 3 def get\_content\_type(self): if self.kind > 0: return "Content-Type:application/xhtml+xml; charset=Shift_JIS" else: return "Content-Type:text/html; charset=UTF-8" def get_declare(self): if self.kind == 1: return """<?xml version="1.0" encoding="Shift_JIS"?> <!DOCTYPE html PUBLIC "-//i-mode group (ja)//DTD XHTML i-XHTML(Locale/Ver.=ja/1.0) 1.0//EN" "i-xhtml\_4ja\_10.dtd">""" elif self.kind == 2: return """<?xml version="1.0" encoding="Shift_JIS"?> <!DOCTYPE html PUBLIC "-//OPENWAVE//DTD XHTML 1.0//EN" "http://www.openwave.com/DTD/xhtml-basic.dtd">""" elif self.kind == 3: return """<?xml version="1.0" encoding="Shift_JIS"?> <!DOCTYPE html PUBLIC "-//J-PHONE//DTD XHTML Basic 1.0 Plus//EN" "xhtml-basic10-plus.dtd">""" else: return """<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">""" agent = UserAgent(os.environ.get("HTTP\_USER\_AGENT", "N/A")) print agent.get\_content\_type() + "\\r\\n\\r\\n" \+ agent.get_declare() print '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">' print "<body>" file = "content.html" if agent.is_mobile(): f = codecs.open(file, "r", "utf-8") s = f.read() print s.encode('cp932') f.close() else: f = open(file, "r") print f.read() f.close() print "</body></html>" クラス UserAgent のコンストラクタには、クライアントのユーザーエージェント値を渡す。文字エンコーディングは、モバイルでは Shift_JIS 、通常は UTF-8 とした。 サンプルの最後のところで body 内のコンテンツを別ファイルから読み込んで書き出している。Shift_JIS へのエンコーディングを shift_jis と指定したところエラーになり、cp932 としたら成功した(この件については後で調べてみることにする)。 get_content_type() で Content-Type 部分が取れる。ケータイ以外のときが、Content-Type:text/html; となっているのは IE では MIME Type 判別がうまくいかないためか、ファイルのダウンロードしよう(保存するかどうかのダイアログが阿上がった)とするのでこうした。get_declare() ではそれぞれのキャリアに対応した XHTML 宣言部を返す。

2008年6月26日 · Toshimitsu Takahashi

Python 2.5 と Google App Engine を試してみる

先日、ある方から著者である柴田さんのサイン入りの「みんなのPython」をいただいた。 みんなのPython せっかく Python をやるなら Google App Engine だろうと思い、登録しようとしたら案の定 Waiting List 入り、早くサインアップだけしておくべきだった。 とりあえず SDK を落としてインストールしようとしたら Python 2.5 が必須とのこと。自分が普段使っている CentOS 5 に入ってるのは Python 2.4 なので、別途インストールしなければならない。 というわけでまずは環境構築からスタートのようです。 ちょっと脱線 Google Gear があって Google App Engine と来たので、なんかデータストアの部分をカプセルかして提供してくれるとかいう物とかあるのかと思ったんですが、そういうことはないようです。 なんか Google Gear で本来のサーバーサイド処理も JavaScript でみたいな実装ができて、それでオンラインもオフラインもどっちも意識せずに開発できるようなことにはならないのだろうか。 ECMAScript というか ActionScript 3 を見てると Java と変わらない厳格な書き方もできるし、Flex の実装してるともうサーバーサイドもこの言語で書ければいいのにと思う。 Python 2.5 と Google App Engine をセットアップ Download Python から Python 2.5.2 compressed source tarball のリンク URLを wget してコンパイルする。とりあえずオプションは特に付けなかった。 $ wget http://www.python.org/ftp/python/2.5.2/Python-2.5.2.tar.bz2 $ bunzip2 -c Python-2.5.2.tar.bz2 | tar xvf - $ cd Python-2.5.2 $ ./configure --prefix=/usr/local/Python-2.5.2 $ make $ sudo make install さらに Google App Engine を落として展開する。Downloads - Google App Engine — Google Developers から Linux/Other Platforms - 1.0.1 - 4/14/08 を入れる。 ...

2008年5月4日 · Toshimitsu Takahashi