Azure Face APIとAmazon Rekognitionで性別判定を比べてみた
どうも、くずきです。
ユーザーの画像から性別を判定する方法は何かないかと思い、Amazon Rekognition
とAzure Face API
を試してみたのでメモっときます。
結論を先に言うと本番環境ではAmazon Rekognition
を使って性別判定して、数十万ユーザーの識別をしているけど、結構満足いく結果になってる。
Azure Face APIとは
Microsoft
が提供している画像認識のAPI。
詳しくは今回省くが、こんな感じで、性別/年齢/表情/眼鏡の有無などを判定できる。
今回選んだ理由としては、以下の記事の方が素晴らしい検証を行なっていて、識別率が高いという部分で選んだ。
検証用のコードはPHP
を利用している。
ここにコード書いてあるのでこれ使えばすぐできる。
(HTTP/Request2
の導入が多少めんどくさかったけど・・。)
Amazon Rekognitionとは
AWS
が提供している画像認識のAPI。
こっちも詳しくは書かないけど、同じように性別/年齢/表情/眼鏡の有無などを判定できる。
違いとしては目が開いているとか、眼鏡ではなくサングラスも判定できるとかあるけど、大きい違いは
- 年齢がRangeになっている
- 色々なパラメーターにConfidence(信頼度)がついている
年齢はRangeになって使いづらい感が否めないけど、性別判定にConfidence
がついてるのはかなり使える。
SNSの画像を利用して比べてみた
今回は、945枚のSNS
の画像を使った。
実際本番で使う画像で試したかったため、顔写真がわかりやすく乗っているような写真ではなく、ランダムで取って来ている画像のため人じゃない場合もある。
また、複数の人が写ってる画像の場合も今回は対象外にしてある。
正解画像
画像の種類 | 枚数 |
---|---|
男性の画像 | 163枚 |
女性の画像 | 230枚 |
上記以外または複数の人の画像 | 552枚 |
大体がその他画像という(泣き)。
正答
種類 | 男性 | 女性 | その他 |
---|---|---|---|
Rekognition | 112(68%) | 174(75%) | 512(92%) |
Face API | 75(46%) | 121(52%) | 522(94%) |
結果から見るとRekognition
のほうがとてもよく、Face API
はちゃんと正面向いてる場合は精度は高く使いやすいんだけど、目が見えづらかったり、口が見えてないと検出率が極端に悪い。Instagram
やTwitter
系のSNS
だと、Facebook
とは違い、しゃれてる画像や、少し離れた画像でとる人が多くこういう結果になったのだと思う。
例えば、こういう画像
(Rekognitionは認識)
(Face APIは認識せず)
こういう、これはさすがに分かるだろ〜っていうのがFace API
だと結構認識してくれなくて、、、最終的に候補からはずれてしまった。
誤答
正解が男性の場合
種類 | 女性 | その他 |
---|---|---|
Rekognition | 13 | 38 |
Face API | 5 | 83 |
正解が女性の場合
種類 | 男性 | その他 |
---|---|---|
Rekognition | 5 | 51 |
Face API | 3 | 106 |
その他が多くなるということ、検出率が低いということなんですが、
少しばかりの差ではあるが、精度に関してはFace API
のほうがたかそうだ。
まとめ
SNS
の種類にもよるけど、正面の写真ではなかったり、少し遠くから取ってるような画像が多いものに関してはRekognition
が有効ということがわかった。
おまけ
顎に手を当てれば女性になれるのかもしれない。
pythonを使ってORBとPerceptual Hashで画像の類似度を比べてみる
どうも、くずきです。
今回はPython
を使って画像の類似度を求めました。
なぜやりたいのかというと、インスタグラムなどのSNSで画像を設定していない人を除外したい。つまり、
この画像か、近しい画像を設定している人が見つけ出せれば良い。
比較対象の画像
ファイル名 | 画像 | 説明 |
---|---|---|
01.jpg | 今回の比較画像 | |
02.jpg | 女性の画像(インスタから持ってきたのでここではモザイク) | |
03.jpg | 男性の画像(インスタから持ってきたのでここではモザイク) | |
05.jpg | 比較画像と同じ | |
06.png | 比較画像の男風 | |
07.png | 比較画像の女風 | |
08.png | 化粧してる風な背景が比較画像に近い | |
11.jpg | 背景青い人の画像 | |
12.jpg | 背景青い人の画像 | |
13.jpg | 比較画像に少し文字載せたやつ | |
15.jpg | 比較画像にかなり文字載せたやつ |
ORBを使って類似度を求める
この方の記事の特徴点のマッチングの部分を参考にさせていただきました。
コードはほぼそのままお借りさせていただいたので、結果のみ。
TARGET_FILE: 01.jpg 02.jpg 86.5 03.jpg 76.0 05.jpg 0.0 06.png 57.0 07.png 20.0 08.png 93.0 11.jpg 66.0 12.jpeg 74.5 13.jpg 3.5 15.jpg 59.0
0になれば一致してる画像とみなされている。
06.png
、15.jpg
は除外したかったが思った以上に数値が高くなってしまい、閾値が設定しづらい。同じものが移動したり、回転したりしても特徴点を捉えることで同じものと認識する方法のためこういう結果なのは仕方ない。。
Perceptual Hashを使って類似度を求める
次に、画像をハッシュ値(64bit)に変換して、その距離を測ることによって類似度を求めるPerceptual Hash
というアルゴリズムを試してみる。
この方達の記事が参考になる。
Python
のimagehash
というライブラリで実装済みのため、それを利用する。
コード
from PIL import Image import imagehash import numpy import scipy import scipy.fftpack TARGET_FILE = '01.jpg' IMG_DIR = '/Users/SayKicho/images/' target_img_path = IMG_DIR + TARGET_FILE target_hash = imagehash.average_hash(Image.open(target_img_path)) files = os.listdir(IMG_DIR) print('TARGET_FILE: %s' % (TARGET_FILE), target_hash) print('files: %s' % (files)) for file in files: if file == '.DS_Store' or file == TARGET_FILE: continue comparing_img_path = IMG_DIR + file try: hash = imagehash.average_hash(Image.open(comparing_img_path)) haming = target_hash - hash except cv2.error: ret = 100000 print(file, hash, haming)
比較画像のハッシュ値(target_hash
)から比較対象のハッシュ値(hash
)を引き算してるところでハミング距離をだしてます。
TARGET_FILE: 01.jpg 00183c18183cffff 02.jpg ffe7c70707010302 51 03.jpg f4e0e9c7c7838330 47 05.jpg 00183c18183cffff 0 06.png 00383c3c18183cff 9 07.png 0018183c18187fff 7 08.png 0018181c1c18183c 16 11.jpg 00000306fcffffff 20 12.jpeg 103f1f8f82c7cfcf 28 13.jpg 00183c18183cffff 0 15.jpg 00181818181cffff 3
一番右がハミング距離。これが0になれば同じ画像と認識される。
さきほどORB
のほうで値が高くなってしまった、06.png
、15.jpg
の画像がかなり低く抑えられている。閾値はだいたい10
くらいにしておけば近しい画像と認識されそう。
急ぎ足で書いてしまったけど、Perceptual Hash
はあくまでも64bitのハッシュ値をもとめるアルゴリズムの総称をいっているので、細かくいうとAverage Hash
, Perceptive Hash
, Differece Hash
などがある。以下の記事に少し詳しく書いてあるので、気になる方はみとくといいかも。
感想
今回はPerceptual Hash
のAverage Hash
が一番効果よかったのでそれを用いて、インスタグラムの設定していない画像を見つけ出すことに成功した。
あまり画像周りに詳しくないので、他のアルゴリズムなども勉強しないとなー。
2017年の振り返りと2018年の抱負
プライベートも含めた振り返りと今年の抱負。
よかったこと
- 子供生まれた
- 子育てっていろいろ大変だけどすごく可愛い
- 自分の時間を自分でコントロールできない感覚に慣れるのに時間かかったなぁ
- CTOになった
- Reactを初めてさわってリリースした
- iOSアプリの作りに似てたからすごく作りやすかった
- キカガクのブラックボックスセミナー受講した
- 機械学習周りの計算式が結構理解できるようなった。おすすめ
- 日記を毎日書き続けた
- 3月からだけど毎日続けた
- 振り返りしやすいし、頭の整理になるから良い。ブログネタみつかるし。
- ブログ始めた
- id:kakku22の教えの元ブログを始めた。
- 技術の振り返りもできるし、メモとしてもすごくためになってる
- 調べた情報に+1してあげることで誰かのためになるんだなと思う
よくなかったこと
- ジムやめた
- おこづかい制になったので、やめたらめちゃ太った
- サービス作りにこだわりをもちすぎた
- 顧客ありきのサービスなのに、それをたまに忘れてしまう
- そこらへん熱くなりすぎないように、お金を顧客からもらうことについてもっと理解する
- やりたい技術があんまりできなかった
- もっと色々挑戦できる部分はあったと思う
- アウトプット駆動で、しっかり目標立ててやらんといけない
- LTの発表できなかった
- 目標にしてたけどやらなかった、もっとやりまする
- 勉強会ひらけななかった
- 強い「なぜ」やるのかをしっかりもたないとなぁ
2018年やりたいこと
- 最高のサービスを作る
- 2017年はセールスの強い方たちとプロダクトを作りあげるって思った以上に素晴らしいことなんだと実感。
- セールスとエンジニアの対立ってたまに聞くけど、最高のサービスを作り上げるためにはコラボレーションが重要。そういうチーム作りにしたい。
- セールス視点からのサービス、エンジニア視点からのサービス、みんな視点のサービス・・・色々な視点を忘れずに作り上げる
- スマートクリエイティブなエンジニアのチームを目指す
- "How Google Works"に定義されている自分が最強と思うエンジニアのチーム作りをしたい
- あんまりそういう方に会ったことないのは、自分がそうじゃないからだから自分も頑張る
- ビジネス感覚というものをもっと鍛えないといけないきがする
- Golangでサービス作る
- 前々から会社として新しいこともやらなきゃいけないと思っていたのもあり、部分的に導入していく
- ジム再開
- 会社で契約してもらえるから、復活
- ムキムキになる
- 色々なコミュニティと関わりを持つ
- いろんなコミュニティとの関わり合いは重要だな2017年は感じたので、それをもっと広げる
- 近しい業種というより、少し離れた業種も面白いかも
感想
なるべく厳選したけど、統一感ないなー。
今年も適度に頑張ろう!!
LaravelでRedshiftを扱う
どうも、くずきです。Line
で「クリスマス」という単語打つたびに背景が変わってイライラしてます。
今回は、Laravel
でRedshift
を扱う方法についてメモります。
使用しているライブラリは、
- Laravel 5.5
- php7.1.1 (phpenv + phpbuild)
[準備] phpenv+php-buildでPostgreSQLのライブラリをいれる
Redsfhit
ではPostgreSQL JDBC/ODBC
に基づいて構築されているため、接続の際にはPostgreSQL
の接続のように使える。
自分の環境はphpenv
+ php-build
でphp
をすでにインストールしてしまっているため、php-build
を設定後、php
を最近インストールする。
vim ~/.phpenv/plugins/php-build/share/php-build/definitions/7.1.1
上記の設定ファイルに、
configure_option -R "--with-pdo-pgsql" configure_option -R "--with-pgsql"
を追加する。
-R
を忘れないようにいれておこう。一番ハマったところだけど、以前別の方法でphp
環境に似たようなライブラリをいれてたみたく、-R
オプションをつけないせいで上書きしてくれなくてずっとインストールされなかった。。
一応自分の設定全部のせておく。
# 2つ追加 configure_option -R "--with-pdo-pgsql" configure_option -R "--with-pgsql" install_package "https://secure.php.net/distributions/php-7.1.1.tar.bz2" install_xdebug "2.5.0" enable_builtin_opcache
設定が終わったらいつも通り、
phpenv uninstall 7.1.1 phpenv install 7.1.1 phpenv rehash
とやればインストールされる。
LaravelにRedshiftに接続先情報に追加
config/database.php
のconnections
の項目の中に、redshift
の接続先を追加。
ここらへんはLaravel
での一般的なデータベースの接続と変わらないため細かい説明は割合します。
'redshift' => [ 'driver' => 'pgsql', 'host' => env('DB_REDSHIFT_HOST', '127.0.0.1'), 'port' => env('DB_REDSHIFT_PORT', '5439'), 'database' => env('DB_REDSHIFT_DATABASE', 'forge'), 'username' => env('DB_REDSHIFT_USERNAME', 'forge'), 'password' => env('DB_REDSHIFT_PASSWORD', ''), 'charset' => 'utf8', 'prefix' => '', 'schema' => 'public', 'sslmode' => 'prefer', ],
つづいて、.env
にも追加
DB_REDSHIFT_HOST=xxx.ddddd.ap-northeast-1.redshift.amazonaws.com DB_REDSHIFT_PORT=5439 DB_REDSHIFT_DATABASE=redshift DB_REDSHIFT_USERNAME=redshift_user DB_REDSHIFT_PASSWORD=password
LaravelからRedshiftを利用する
Laravel
ではすでにデータベースのマルチ接続に対応している。以下のリンクが詳しすぎて、そこみたほうがはやい。
一応自分の使い方を載せておくと、
$users = DB::connection('redshift')->select('SELECT id, name FROM users');
のようにやることで接続している。
Eloquent
に紐づけることができるため、できる人はそっちにしたほうが意識せずに使えるためそうしておこう。
まとめ
- RedshiftはPostgreSQLのドライバで繋がる
- php-buildの設定ファイルで-Rオプションを忘れずに
- Eloquentに接続先を紐付けよう
悲しいことに準備のところに一番時間を使ってしまった。。
RedashでTwitter APIを用いて、インフルエンサーの情報を可視化をする
どうも、くずきです。
今日は「Redash Advent Calendar 2017」12日目の記事として、RedashでTwitter APIを用いて、インフルエンサーのインサイト情報を可視化をすることをしたいと思います。
インフルエンサーって何やねんって人はすごく簡単にですが以前書いた記事を参考にしてほしい。
これをやるきっかけとしては、マーケティングデータを可視化する「Domo」というツールを使ってインフルエンサーのデータを可視化し、マーケティングツールとして使ってるという情報を聞いたので、、Redashだって!!!と思って書いてます。
[準備] Pythonデータソース機能を使えるようにする
まず事前準備として、Pythonデータソースを使えるようにしておく。
こちらも以前の記事で書いておいたのでそちらを見てほしい。
ツイッターのAPIを叩いてみる
まずは、今回使用するPython
のライブラリとして、requests_oauthlib
とjson
を追加しておこう。
(pip install
はしといてください)
次にここでは説明しないが、ツイッターAPIを叩くためのトークンを取得しておき、インフルエンサーであるid:kakaku22のデータを取得してみよう!
from requests_oauthlib import OAuth1Session import json CK = 'Consumer Key' CS = 'ConsumerSecret' AT = 'Access Token' AS = 'Access Token Secret' url = "https://api.twitter.com/1.1/statuses/user_timeline.json" params = { "screen_name": "kakakakakku", "exclude_replies": 1, "include_rts": 0 } twitter = OAuth1Session(CK, CS, AT, AS) req = twitter.get(url, params = params) timeline = json.loads(req.text) for tweet in timeline: print(tweet['text'].encode('utf-8'))
色々つぶやいてます。
表示したい情報を集計し、綺麗に表示する
本来は、こんな感じのデータを表示したい。
あんまり見せてはいけない情報すぎて、逆にわかりづらいと思うけど、、
ツイッターだと「フォロワー数」、「平均いいね数」、「平均リツイート数」などが指標となる。
あとは単に集計するだけなので、説明は割愛する。
from requests_oauthlib import OAuth1Session import json CK = 'Consumer Key' CS = 'ConsumerSecret' AT = 'Access Token' AS = 'Access Token Secret' url = "https://api.twitter.com/1.1/statuses/user_timeline.json" params = { "screen_name": "kakakakakku", "exclude_replies": 1, "include_rts": 0, "count": 200 } twitter = OAuth1Session(CK, CS, AT, AS) req = twitter.get(url, params = params) timeline = json.loads(req.text) sum_retweet_count = 0 sum_favorite_count = 0 avg_retweet = 0 avg_favorite_count = 0 for tweet in timeline: sum_favorite_count = tweet['favorite_count'] + sum_favorite_count sum_retweet_count = tweet['retweet_count'] + sum_retweet_count userInfo = timeline[0]['user'] avg_favorite_count = sum_favorite_count * 1.0/len(timeline) avg_retweet = sum_retweet_count * 1.0/len(timeline) result = {} add_result_row(result, { 'name': userInfo['screen_name'], 'follower_count': userInfo['followers_count'], 'avg_favorite': avg_favorite_count, 'avg_retweet': avg_retweet }) add_result_column(result, 'name', '', 'string') add_result_column(result, 'follower_count', '', 'integer') # フォロワー数 add_result_column(result, 'avg_favorite', '', 'float') # 平均平均いいね数 add_result_column(result, 'avg_retweet', '', 'float') # 平均平均リツイート数
色々な人のリストとまではいかなかったけど、一人分の情報を表示することができた。
感想
Redash
+ Twitter API
で簡易ではあるがインフルエンサーのデータの可視化ができた。
次の改善点としては複数人対応や、指定した人のデータを取得できるようにしたらインフルエンサーマーケティングツールとして使えるようになってきそうだ。データの保存とかもできたらいいなぁ。。もう使い方違う気がする。笑
インフルエンサーマーケティングって何だろう Part1
どうも、くずきです。
最初の投稿以外では初めての技術以外の話。
今の会社ではインフルエンサーマーケティングという事業をメインでやってて、基本的にはサービスとシステム面をみることが多い。CEO
やCOO
は事業ドメイン(ここだとインフルエンサーマーケティング)にかなり詳しいが、エンジニアとしての自分はどうだろうか。
サービスを作る上で、言われたことをシステムに落とし込むことだけをしていては良いものを作れないと思っている。事業ドメインを深く知った上で、ビジネスの側面とエンジニアリングを合わせてサービスを構築していくことが理想なんではないかなぁと。良いものの定義とか色々あるのでこの話はまた次のポエムの時に。。。
ということで、頭の中を整理するという意味も込めて書いてみる。
インフルエンサーとは何か
そもそもインフルエンサーって何だろう。
Wikipedia
で調べると
インフルエンサー(influencer)は、世間に与える影響力が大きい行動を行う人物のこと。*1
そのまんまの意味だ笑。
じゃあ影響力とはなんだろうか。
他人の考えや行動を変えさせるような力*2
となっている。
俺でいうと誰だろう、、スタートアップ系の話題だとUmada氏とかエリック・シュミット氏の考え方にはだいぶ影響されてると思う。技術面や精神面は近くの人が多くて、先輩であるid:kakku22とか実際によく話す方の影響を受けてる気がする。好き嫌いとか関わらず、ホリエモンやイケハヤ氏なども影響力はあると言える。
ネットやリアルは関係ないしに、影響力をある人を全てさすのだろう。
そう考えると、自分の先輩だって、友達だってある意味インフルエンサーだ。
じゃあインフルエンサーマーケティングとは何だろう
実はWikipedia
には続きがあって、
と書かれている。
今までの企業から消費者へのアプローチ方法としては
のように、ダイレクトマーケティングなどが主体となっていた。
インフルエンサーマーケティングは
インフルエンサーを通して、消費者(またはコミュニティ)にアプローチする。
なんでまたはコミュニティも含まれてるのかというと、ネット上では消費者に直接というより、ツイッターみたくファンのコミュニティと直接繋がってる場合もあるからだ。
今回はここまでで、次回は「影響力ある人は全てインフルエンサーマーケティングできるのか?」について考える。
1 https://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%B3%E3%83%95%E3%83%AB%E3%82%A8%E3%83%B3%E3%82%B5%E3%83%BC
2 https://kotobank.jp/word/%E5%BD%B1%E9%9F%BF%E5%8A%9B-443069
Redash + docker-composeでPythonデータソースを使うやり方と外部ライブラリを追加する方法
どうも、くずきです。
Redash
+ docker-compose
でPython
データソースを扱う場合に、Python
のライブラリを追加する機会があったのでメモときます。
今回はid:kakku22が提供している、Redash
のハンズオンをベースに構築している。
Pythonデータソースの追加の仕方
ハンズオンを終え「よっしゃPython
データソースもつかったろ!!」って意気込み、やろうとしたらまさかのデータソースにPython
がなかった。
ぐぐってみると公式に
Data Sources Options and Requirements · Redash Help Center
For security, the python query runner is disabled by default. To enable, add redash.query_runner.python to the REDASH_ADDITIONAL_QUERY_RUNNERS environmental variable. If you used the bootstrap script, or one of the provided images, add to /opt/redash/.env file the line: export REDASH_ADDITIONAL_QUERY_RUNNERS=redash.query_runner.python
セキュリティ上デフォルトオフにしてるから、使いたかったら.env
に追加してねとのことだった。
REDASH_ADDITIONAL_QUERY_RUNNERS: "redash.query_runner.python"
をdocker-compose.yml
に追加する。全部のせるとみづらいため一部だけのせとく。
server: image: redash/redash:2.0.1.b3080 command: server depends_on: - postgres - redis ports: - "5000:5000" environment: PYTHONUNBUFFERED: 0 REDASH_LOG_LEVEL: "INFO" REDASH_REDIS_URL: "redis://redis:6379/0" REDASH_DATABASE_URL: "postgresql://postgres@postgres/postgres" REDASH_COOKIE_SECRET: veryverysecret REDASH_WEB_WORKERS: 4 # 追加 REDASH_ADDITIONAL_QUERY_RUNNERS: "redash.query_runner.python" worker: image: redash/redash:2.0.1.b3080 command: scheduler environment: PYTHONUNBUFFERED: 0 REDASH_LOG_LEVEL: "INFO" REDASH_REDIS_URL: "redis://redis:6379/0" REDASH_DATABASE_URL: "postgresql://postgres@postgres/postgres" # 追加 REDASH_ADDITIONAL_QUERY_RUNNERS: "redash.query_runner.python" QUEUES: "queries,scheduled_queries,celery" WORKERS_COUNT: 2 REDASH_HOST: "http://localhost"
すごいアホだったんだけど、自分はserver
の方だけにしか追加してなくて小一時間動かず悩んでました・・。
あとはハンズオン通りに立ち上げると普通にPython
データソースが使える。
$ docker-compose -f docker-compose.yml up
Pythonの外部ライブラリを追加する
基本的には画像にある、「Modules to import prior to running the script」の項目にPython
で使用したいライブラリ(os, sysなど)をカンマ区切りで追加すればスクリプトを書く時に使用できる。
ただし、外部のライブラリを追加する場合は上記の部分に追加しても使用できない。
調べてみると
You need to install pandas in the worker container, which actually runs the query.
worker
のコンテナにpip install
しろってことらしい。
docker-compose
では、command
に追加でスクリプトの実行などができるためそれを利用する。
server: image: redash/redash:2.0.1.b3080 command: server depends_on: - postgres - redis ports: - "5000:5000" environment: PYTHONUNBUFFERED: 0 REDASH_LOG_LEVEL: "INFO" REDASH_REDIS_URL: "redis://redis:6379/0" REDASH_DATABASE_URL: "postgresql://postgres@postgres/postgres" REDASH_COOKIE_SECRET: veryverysecret REDASH_WEB_WORKERS: 4 REDASH_ADDITIONAL_QUERY_RUNNERS: "redash.query_runner.python" worker: image: redash/redash:2.0.1.b3080 # 追加 # pip installで追加したいライブラリを入れる。 command: > scheduler && basch -c ' pip install requests requests_oauthlib ' environment: PYTHONUNBUFFERED: 0 REDASH_LOG_LEVEL: "INFO" REDASH_REDIS_URL: "redis://redis:6379/0" REDASH_DATABASE_URL: "postgresql://postgres@postgres/postgres" REDASH_ADDITIONAL_QUERY_RUNNERS: "redash.query_runner.python" QUEUES: "queries,scheduled_queries,celery" WORKERS_COUNT: 2 REDASH_HOST: "http://localhost"
設定後、起動したら他のライブラリと同じくカンマ区切りでモジュールの追加をしたら利用できる。
感想
Redash
というよりDocker
の方の知識が必要だったなぁ。
ハンズオンにプルリクしようかな。