エンジニアリングとお金の話

都内で働くエンジニアの日記です。

【技術】おとなの楽天というサイトを作った

【SPONSORED LINK】

今年はアプリ開発に力を入れた事もあり、全然WEB系の開発を行って来なかった。たまにはWEBで何か作ってみるかと思い以下のサイトを作成した。

おとなの楽天

サイトの内容としては、楽天より女性下着モデルの画像のみを収集し、WEBへの公開を行うと言うちょいエロなサービスとなっている。処理の流れとしては以下の通りである。

楽天WEBサービスを使用して『女性下着』で検索
②人物が写っている物のみ抜粋しDBに格納
③DBの内容を基にサイトを構築

最初は①の内容だけでWEBサイトを構築して見たが、女性下着で検索を行っただけではブラジャー画像やパンツ画像だけと言った本来目的としていない画像(女性モデルが写っていない)が大半を占めてしまう事が判明した。検索ワードを色々工夫して女性モデル画像だけの抽出を試みたが、どう頑張っても限界を感じたので、画像認識処理にてモデルが写っているか判断して振り分けを行う事とした。

画像認識処理は今までやった事がなかったので、最初はReKognitionと言うWEBサービスを使用して構築しようと検討してみた。

orbe.us | ReKognition - Welcome to Rekognition.com
ReKognitionは顔認識はもちろんの事、性別や年齢なども取得が行える凄いサービスである。ただ、無料で使用出来るのは月5000枚までとの事なので、毎日のデータ振り分けに使用するにはちょっと厳しいかなと言う事で今回は使用を見送る事とした。色々なWEBサービスを調査したが、どれも大量の画像を裁くのには向いていない感じだったので、WEBサービスの使用を諦めてopencvにて処理を行う事とした。

opencvを使用するのは初めてだった為、まずはインストールを行った。開発端末であるmacへのインストールについてはHomebrewでサクッと行えたが、公開環境であるlinuxにインストールする際は、ソースからコンパイルしてインストールを行う必要があった為、結構面倒くさかった。

opencvの使用については非常に簡単で、最初から付属されている分類器を使用して顔の判定を行った。作成したソースは以下の通りである。

import cv2
import urllib
import numpy
from StringIO import StringIO

#引数として、イメージ画像のURLを渡す
def faceChecker(self,imageUrl):
    try:
        #openvcの分類器を設定
        cascade_path="/usr/local/opencv/share/OpenCV/haarcascades/haarcascade_frontalface_alt_tree.xml"

        #イメージ画像のURLからStringIOにてイメージファイルを作成する
        imageIO=StringIO(urllib.urlopen(imageUrl).read())
        
        #イメージファイルをnumpyの配列に変換
        imageArray=numpy.asarray(bytearray(imageIO.read()),dtype=numpy.uint8)

        #グレースケール変換
        imageGray=cv2.imdecode(imageArray,0)
        
        #分類器の特徴量を取得
        cascade=cv2.CascadeClassifier(cascade_path)

      #顔認識実行
        facerect=cascade.detectMultiScale(imageGray,scaleFactor=1.1,minNeighbors=1,minSize=(1,1))
     except:
        print imageUrl
        facerect=[]
     
     #顔認識が成功した際は、TRUEを返す
     return True if len(facerect) > 0 else False

内容としては、楽天WEBサービスから取得したイメージ画像URLを基にStringIOにてメモリ上にファイルを作成し、opencvにて顔認識を行うものとなっている。なお、StringIOにて作成したメモリファイルはそのままではopencvで読み込む事が出来ないので、numpyの配列に変換を行う必要がある。

画像判定の精度については、ほぼ正確に判別を行う事が出来ており、当初の思惑どおりモデル画像のみを抽出する事が出来た。ただ、たまに下着のみの画像が判定されるケースが合った為、分類器のチューニングについても今後勉強していこうと思う。opencvについては色々な機能がある為、使いこなす事が出来れば開発の幅が色々と広がると思った。来年はopnecvをバリバリ使いこなせる事を目標にしたい。

取得した画像については、DBに格納しWEBへの公開を行うようにした。なお、フレームワークdjangoを使用し、テンプレートにはtwitter boot strapを使用している。久しぶりにdjangoを使用して気づいたのだが、version1.7にてDBのマイグレーションが行える様になっていた。他にも色々と機能拡張が行われている様なので、おいおい勉強していきたい。

アプリとWEBサービスが作成出来る様になったので、次はお互いを組み合わせて何か作成出来ればいいなと思っている。最近色々と開発出来る事が広がってきた事もあり、今まで絶対無理だと思っていた物が作れる様になりつつある。来年も何か面白い物を作成していきたい。