Apitore blog

Apitoreを運営していた元起業家のブログ

Global AI Hackathonに参加しました

はじめに

世界15箇所同時開催のGlobal AI Hackathonに参加しました。世界中のアウトプットはこちらから見られます。今回私はぼっち参加しまして、世界中のオフィスに笑顔と愛を届けるべくクソコラ変顔生成サービスを作りました。 [slideshare id=77238054&doc=presentaion-170625040608]

ソースコード

GitHubで公開中。

やったこと

サービスの目的

職場に足りないもの、それは愛。 研究職の特徴なのか、職場には笑いも愛も足りません。そもそも個性にも乏しいです(例 みんなメガネ、ちょい太り気味、アニメが好き、など)。 「もっと笑いと愛に溢れる職場を作りたい」「近しい人の不細工な瞬間でコラ画像作ればウケるに違いない」 そういう思いがありました。 少し真面目な話をすると、これからラップトップやディスプレイにインカメラ(顔を撮影するWebカメラ)が標準搭載されるようになると思います。これはバイオメトリクス認証に使ったり、従業員の勤怠管理なんかに使ったり、フリーアドレスとかフリーランスとかで個人認証に使ったりと、色々と用途があります。 カメラを真面目な用途にだけ使うのではなく、一見無駄に思えることに使うことで結果的にチームワークが良くなる、という効果を狙っていますし、単純に部長に怒られたら部長の不細工な瞬間でクソコラ作って笑いたいという要望もあります。 用途としては、 仕事中にイライラしたり、集中しすぎて不細工な顔してたり、居眠りしそうだったり、そういうNegativeな瞬間をインカメラで認識してキャプチャを取り、モンタージュ写真を作ってあとで皆で共有&雑談しよう というものになります。 また将来的には、 部長が不機嫌なときを検出して話しかけるタイミングを待つように指示したり、ついでにそれでモンタージュ写真作って飲み会で展開して部長の不機嫌な瞬間をネタにして笑ったり、部長は自身の不機嫌な瞬間の表情を知って自重したり、と職場を明るくするのに役立てたいです。

アルゴリズム

3ステップに分けられます。

  1. 感情推定
  2. ユーザー特化のモンタージュ用写真の調達
  3. ネタ画像生成

1. 感情推定

インカメラでユーザーの顔を常にチェックします。ネガティブな感情をポジティブに変えたいので、「怒り」「嫌悪」「悲哀」を検出したら写真を取るように設定しました。ちなみに、感情推定はMicrosoftのFace APIを使いました。

2. ユーザー特化のモンタージュ用写真の調達

ユーザーの不細工な瞬間の顔画像が取れたので、合成する別の画像を用意します。今回はランダムに画像を取ってくることにしました。ただし、乱数のシードにユーザーの顔画像の特徴を用いることにしました。 具体的には、 MS Face APIから顔の特徴点27箇所が分かるので、27箇所の周辺も含めて約67箇所の特徴点を選びました。67箇所から画素値(RGB)を取って-1から+1の範囲で正規化し、200次元のベクトルを作りました。この200次元のベクトルをApitoreWord2Vec APIに入力し、ベクトルに最も近い単語を無理やり引っ張ってきました。この単語をMS Image Search APIで検索し、コラージュ用の画像として確保しました。 ここの処理は数学的には何の意味もないですが、個人的に気に入っているアルゴリズムです。なんというか・・・美しいカオスというか。

3. ネタ画像生成

ユーザーの不細工な瞬間の顔画像とコラージュ用の画像を合成します。合成にはOpenCVのJava版であるJavaCVを使い、アルファブレンディングしました。

結果

受賞はなりませんでした。 ただ、私に投票してくれたって人が何人か居たので、良かったです笑 発表時にはややウケから一部にはめちゃウケって感じでした。

おわりに

反省点としては、相変わらずぼっちで参加したことですね。どこかのチームに入ろうと思っていましたが、なんとなく機を逃して早々に個人プレイをすることにしちゃいました。勧誘してくれた人も居ましたが、その方はチームメンバー多そうだったので別に自分いらないかなって。 一番苦戦したところはJavaCVです。 OpenCVは元々C++の有名なライブラリで、当然のように各言語に拡張されています。JavaCVは非公式なプロジェクトですがJava版のOpenCVとしては申し分ないです。ただ、ネットに情報がほとんどないので実装はかなり大変でした。C++のメモリ管理のところがJavaではないので、そのあたりのギャップが埋まらなかったり、C++のある関数がJavaだとどれに対応するのか分からなかったり、そもそも関数がなかったり。 JavaCVだけの特徴か分からないですが、JavaCVには自動でメモリをreallocationする機能が入っていて、これによってうまく動かない状態が9時間くらい続きました。挙動の確認のしづらさが辛味でした。 そんなこんなで作成した今回のハッカソンのプログラムはGitHubで利用できます。MSのCognitive APIをJavaから呼んでますので、そういう意味でも参考になるでしょう。情報の少ないJavaCVの実装サンプルが見られる良い教科書になれば幸いです。