健全な sunaemonRT の開発

更新日時:

概要

@sunaemonRT_univ を作りました。

@sunaemonRT の絵付きツイートのうち、大学で見ても問題なさそうなものを自動判定してリツイートします。

開発で詰まったところメモ

詳しくは ソースコード をみてもらうことにして、かいつまんで話す。

もともと Microsoft Azure Computer Vision API は認識はしていた。いつか使ってみたいと思っていた。その機会がやってきた。

価格 を見る限り 1 ヶ月 5000 回まで叩くのは無料らしい。そこで 1 日の画像の上限を 100 件に制限した。

サンプル があるので Azure 側の API 叩くところは苦労しなかった。

Twitter Gem のほうがよほど苦労した。 仕様書が古くて、 Twitter に投稿された画像をどのように取得するのかわからなかった。 結局 pry でインスタンスに .methods を実行して名前を手がかりに進めていった。

定期実行は Clockwork で行うことにした。

Twitter REST API で同じ Tweet を取得するのは問題ないが、 同じ画像を何度も Azure に投げることはしたくない。 何らかの方法で記録を取ることになる。再起動する際にも同じものをチェックしたくないので、 不揮発性のメモリに結果を保存することになる。 データベースを使用するのが普通だろうが、こういうときに 私は Hash で管理し to_s してファイルに書き出し、読み込む という手段を使用している。 これは手軽に導入できる。

  • 日付をファイルにする。
  • 今日から 3 日前まで読み込むことで、昔の画像は読み込まなくなる。
  • 読み込む際は eval する。
  • 時刻は require 'time' してから Time.parse(time) する。

ここまでは経験があった。 今回詰まったところは タイムゾーン である。 Twitter REST API はグリニッジ標準時で時刻を返す。これを考慮していなかった。 Twitter Gem もそれに倣うことになる。 日付をファイルにしていたので、ツイートレポート機能に 9 時間の間違いが生じていた。 調べた限り、標準でタイムゾーンをいじるには環境変数を書き換える方法があるが お手軽な方法はなかった。今回採用したのは ActiveSupport を使用する方法で require 'active_support/all' してから time.in_time_zone("Tokyo") とした。

開発の経緯

ある後輩とは、いうまでもなく @sunaemon0 君のことである。「彼のリツイートによる 2 次元絵」のアカウントが @sunaemonRT である。

私は Twitter は時間の無駄だと思っている。 そもそも、アカウントにアクセスするのは大学にいる時とプログラミングコンテストのときだけと決めている。 TL をスクロールしていくと sunaemonRT によりいつも TL が 2 次元絵で埋まっている。 それを見ていると「こんなことしている場合じゃない」と思える。 だからすなえもん君は私の時間を無駄にしないことに貢献していることになる。

ところが sunaemonRT には欠点がある。不健全な絵が混じっているということである。 個人的に見る分には問題ないだろう。 しかし、上述したとおり、私は大学で sunaemonRT を開くのである。 大学では 30 型のモニタを使っているので、 sunaemonRT の絵が大きく映し出される。そこに不健全な絵が混じっている。これはよくない。 隣の席の方からハラスメントと言われると言い訳もできないだろう。

  • Twitter で時間を無駄にしないために 2 次元絵をリツイートする
  • しかし不健全な絵はリツイートしない

そんな sunaemonRT が必要であった。そこで誕生したのが「健全な sunaemonRT」である。

結果

基本的には健全な絵を的確にリツイートしているように思う。しかし……

ということが早速始まり、

となった。結果、

ということに。すなえもん君が機械学習を破るのを見て、人間ってすげーと思った。

参考までに、傾向

健全の定義:Adult はもちろん Racy も弾くことにしたので、ここでは水着や下着の絵も不健全と判定することにしている。

逆に言えば男の子に判定されてしまうと、上半身が裸でも健全判定されやすい。

他にも以下の傾向がある。

  • ふとももが見えているとそれだけで不健全判定されやすい。
    • これは謎仕様だが、多分ふとももが見える絵は下着が見えていることが多いためにそう学習したのではないだろうか。
    • 例:『エロマンガ先生』の紗霧の絵などは殆どが Racy 判定されていた。
  • 基本的には人間の露出度を見るので、例えば下着を持っている絵などは健全判定されてしまう。
    • これは仕方ない気がする。
  • いわゆる「湯気で隠す」といった手法を取られると健全判定されてしまいやすい。
  • 立ち絵の判定はかなり確実だが、特殊な構図は判定が難儀しているようだ。

大雑把には以上の通り。詳しく話してもいいのだが、記述が変態的になるのでやめておく。

コメントする