🐾

Slack のペットの画像を分類して「にゃーん」と言ったら猫の画像を返すボットを作りました

2020/12/23に公開2

はじめに

この記事は Slack Advent Calendar 2020 23 日目の記事です。

Slack に投稿された動物の画像を自動で分類してボットに登録、「にゃーん」と言ったらネコの画像を、「わんわん」と言ったらイヌの画像を返すボット「iyashi」を作りました。

サンプルの GIF 画像をサイズの関係でかなりカットしたので、分かりづらかった方は GitHub の README を見てみてください。

なぜ

Slack に投稿された画像ではなく、Web 上で自動で画像を拾ってくればいいのではと思った方もいるかもしれません。

なぜわざわざ機械学習まで使ってボットを作成したかというと、いろいろな方が可愛いペットの画像を投稿してくださる幸せなチャネルに出会ったからです。

皆さんも出会えるといいですね。

最初は Slack 標準搭載の Slack Bot を使用していたのですが、以下の問題が発生したのでそちらを解決するために自作しました。

  • 手動で追加するのが面倒
  • カスタムレスポンスの文字数制限にひっかかった

Slack Bot はコーディングなしで簡単にボットを作成できるので非常に便利ではあります。

デモ

デモ用の Slack ワークスペースを用意したので気軽に試してみてください。

Heroku Button に対応しているので、Heroku アカウントがあればコーディングなしで各々の Slack にボットを導入することもできます。

Heroku Button は GitHub の README に設置しています。

iyashi: Usage

参考:Heroku Button

対応している動物

他にも追加して欲しい動物があれば、GitHub でも Slack でも気軽にコメントください。

  • ネコ
  • イヌ
  • フクロウ
  • チンチラ
  • ハリネズミ

反応する単語

全体の流れ

にゃーん

  1. にゃーん
  2. ボットがデータベースからランダムに画像 URL を取得
  3. ボットに返す
  4. ボットが画像 URL を Slack に投稿

画像投稿

  1. メッセージから添付されている画像 URL を取得
  2. 画像 URL を展開して機械学習のモデルに投げる
  3. 判定結果をボットに返す
  4. データベースに画像 URL を登録
  5. 画像が投稿された Slack のコメントにリアクションをつける

使用したもの

Slack Bot

  • Heroku
    • PostgreSQL: 投稿された画像 URL の保存先
  • slackbot
    • Python で簡単に Slack のボットを作成できるライブラリ
    • 返信・送信・リアクションを簡単に行えます
from slackbot.bot import respond_to, listen_to

@respond_to("疲れた")
def tsukareta(message):
    message.reply("頑張れ")

@listen_to("にゃーん")
def nyan(message):
    message.send("ネコ発見")

@listen_to("わんわん")
def nyan(message):
    message.react("dog")

機械学習のモデル作成

  • PyTorch: 機械学習のライブラリ
    • モデルの作成に使用
  • flickr API: 画像投稿サイトの API
    • モデル作成のための画像データ収集元
    • 質の良い画像がたくさんあります
  • Google Colab
    • モデルの学習場所
    • GPU も無料で使えます

PyTorch が用意してくれている ResNet-18 の学習済モデルを転移学習させてモデルを作りました。
コードは公式チュートリアルをちょっと変更しただけです。

参考:PyTorch: TRANSFER LEARNING FOR COMPUTER VISION TUTORIAL

flickr から画像を収集するコードはこちらに公開しています。
PyTorch の torchvision.datasets.ImageFolder で扱いやすい形で画像をダウンロードできます。

本当に機械学習必要ですか?

今回は「Slack のメンバーが飼っているペットの画像を自動で登録する」ことが目的だったのでルールベースでも十分いけたと思います。

  • ルールベース 1:80 % (仮)
    • 「ネコ」がほとんどなので全て「ネコ」として判定
  • ルールベース 2:90 % (仮)
    • A さんは「イヌ」を飼っている
      • A さんから投稿された画像は全て「イヌ」として判定
    • B さんは「ネコ」と「イヌ」を飼っている
      • B さんが投稿する画像はランダムで判定
  • 機械学習:98 %
    • 実装難易度・工数・運用コストが以下省略

業務で機械学習の導入を検討する際は本当に必要なのかしっかり考えないといけません。

おわりに

私は犬派です。

Discussion