スタバ警察bot
スタバ警察は、リプライされた画像がスタバで撮影されたものかどうかを判定するTwitter botです。
その社会的意義の低さに反して、わりと真剣にアーキテクチャ検討やツール開発を行っています。
https://gyazo.com/e20e97c8d285a0fbbbeb2733b45a77ba
開発秘話をPodcastで話したので聞いてください!!!(スタバ警察の話は9:00あたりから)
https://anchor.fm/notainc/episodes/3-niboshiSIerSaaSbot-e1jc7t9
背景
Twitterでは、「スタバなう」と呟きながら全く関係のない(主に食べ物の)画像をアップロードするという文化があります。
私は週10回スタバに行くほどのスタバ好きなので、スタバのマーケティング担当者が「スタバ」でツイート検索した日のことを考えると夜も眠れません。かならず、これら邪智暴虐のツイートを除かねばならぬと決意しました。
というのは冗談で、単に画像認識をやってみたかったのです。
(週10回スタバに行くのは冗談ではありません)
スタバ警察を支える技術
ディープラーニングによる画像認識
リプライされた画像がスタバかどうかを判定するために、kerasでVGG16と呼ばれるニューラルネットを構築しました。詳しくは以下の記事をご覧ください。
今後はResNetへの置き換えを検討しています。
GCP Cloud Build + Cloud Run
スタバ警察ではTwitter Account Activity APIのハンドリングサーバと画像認識サーバの2台構成ですが、どちらもCloud Run上で動いています。画像認識サーバはリクエストが来てからTensorflowのモデル読み込みを開始するため不安でしたが、コールドスタート時も5秒程度でレスポンスを返すので、今回の利用用途では許容範囲内かなと思っています。
アプリケーションアーキテクチャ
クリーンアーキテクチャで実装してみました。ただ、クリーンアーキテクチャはかなり重厚かつインターフェースレイヤーの必要性が個人的にはあまり感じられなかったので、次はもっと軽量なアーキテクチャを採用すると思います。
クリーンアーキテクチャについて勉強したまとめは以下に書いています。
Go言語用Twitter Account Activity APIライブラリの開発
ボットをリプライに反応させるためには、Twitter Account Activity(以下TAA)と呼ばれるAPIを利用する必要があります。
制約に基づくメッセージジェネレータの開発
スタバ警察のリプライメッセージは、判定結果と確信度に応じて内容を微妙に変えています。
また、ある単語を選択した結果が、後段で選択可能な単語に影響を与える場合もあります。
Twitter画像収集CLIツール
機械学習を行うためには学習データが必要です。今回の場合は「スタバなう」というツイートと一緒に投稿された画像です。
ただし、こういう場合は往々にして、その画像のメタデータ(誰がいつ投稿したのか)があとから欲しくなります。
今は人間が手でたまに実行しているだけなのですが、いずれkubernetesのcronjobで自動化したいと考えています。
画像管理ツール