ハロー!プロジェクト超大好き日記。

ハロー!プロジェクトが超大好きなので、応援したいと思っています。ぉぱょ。

#パリピ化 が流行っていると俺の中で話題になったのでMicrosoft Cognitive ServicesのFaceAPIで何か出来ないか考えてみた結果。

twitter上でハロ関係者が次々#パリピ化されているのを見ていて、ははーん顔認識で目のところに「(仮)」のサングラス画像を被せたら全部#パリピ化できるんじゃね?てか時代作っちゃうんじゃね?という軽い気持ちで土曜のAM7:00からPCに向かいました。

APIは顔認識でググって最初に出てきたMicrosoft Cognitive ServicesのFaceAPIを利用することにします。

まず、Microsoft Cognitive ServicesでFaceAPIの利用が出来るようにします。

https://www.microsoft.com/cognitive-services/

(参考にさせていただいたサイト)
ouranos.sakura.ne.jp

次に、サンプルコードを動かしてみます。

Pythonで試そうと思いしたが、pipが未導入だったため、いったん旧環境を全部削除して最新版の3.5.1をインストールし直しました。(最新のだと標準でセットアップできるので)。

また64bit環境で動かすため、必要となるNumpyとかMatplotlibなどはこちらのサイトを参考にセットアップしました。
www.amelt.net

結局OpenCVもCMakeをうまく扱えなかったので、同様にwhlからセットアップ。
Jupyter(IPython Notebook)は"pip install jupyter"で。
とりあえずこれで環境構築が完了。

あとはJupyterを立ち上げて公式のサンプルコードを動かします。
サンプルコードはこちらから。
https://github.com/Microsoft/ProjectOxford-ClientSDK/tree/master/Face/Python

少し修正が必要でしたが、普通に動きました。

  • 3.x系にあわせてprint文の括弧とitems()あたりを修正。
  • _keyにはsubscriptionsで取得してきたキー(とりあえずKey1)に置き換え。

サンプルコードを#パリピ化します!

サングラス画像…というかレンズ?画像を適当に準備します。こんなのf:id:atodesimerareru:20160409153232j:plain(20x20pixel)
下記サンプルでは"paripi.jpg"

目の位置などはこの辺りを参考に。
https://msdn.microsoft.com/en-us/library/mt605326.aspx

んで、出来上がったのがこちら。
※arr = np.asarray~以降を以下に書き換えました。

arr = np.asarray( bytearray( requests.get(urlImage).content ), dtype=np.uint8 )
img_dst = cv2.cvtColor( cv2.imdecode(arr,-1), cv2.COLOR_BGR2RGB)

img_paripi = cv2.imread("./paripi.jpg", 1)
size_paripi = tuple(np.array([img_paripi.shape[1], img_paripi.shape[0]]))

for currFace in result:
    faceLandmarks = currFace['faceLandmarks']

    left_lens_outer_x = int(faceLandmarks['eyeLeftOuter']['x'])
    left_lens_outer_y = int(faceLandmarks['eyeLeftTop']['y'])
    right_lens_inner_x = int(faceLandmarks['eyeRightInner']['x'])
    right_lens_inner_y = int(faceLandmarks['eyeRightBottom']['y'])

    img_dst[left_lens_outer_y:left_lens_outer_y+size_paripi[0], left_lens_outer_x:left_lens_outer_x+size_paripi[1]] = img_paripi
    img_dst[right_lens_inner_y:right_lens_inner_y+size_paripi[0], right_lens_inner_x:right_lens_inner_x+size_paripi[1]] = img_paripi

ig, ax = plt.subplots(figsize=(15, 20))
ax.imshow(img_dst)

[実行結果]
f:id:atodesimerareru:20160409152040p:plain

はいはい雑コラですね!!解散!!!!11