ほぼPython

Not技術ブログBut勉強ブログ 内容には誤りがあることが多いです

Twython経由でダイレクトメッセージ(DM)を取得できない問題を解決する

TwythonはTwitter APIを使うのに最も便利なライブラリのひとつです。



ですが、Twitter APIの仕様変更により、Twythonを使ってDMの取得が不可能となっています。実行すると 404エラーになります。(2019/09/07現在)



簡単に解決できるので、解決法を書いておきます。


解決方法

まずは、twythonのコード本体を探します。



ここが参考になります。

qiita.com


コード本体が見つかったらendpoints.pyを開いて

get_sent_messagesという関数の

return self.get('direct_messages/sent', params=params)

return self.get('direct_messages/events/list', params=params)

のように変更するだけです。

このように、エンドポイントを変更するだけでtwitter API の仕様変更にも対応できるケースが多いです。
便利ですね。

ヒマだったので俺の推しキャラ3名を認識できる人工知能(AI)を作ってみた《めぐみん、緑川花、黒猫》

タイトルは狙いました。ごめんなさい。

 

より正確に言うと「SVMを使ってアニメキャラ3名の分類を試してみた」的な感じですが、これだと誰にも興味持たれないかなと思ったので・・・許してください。

 

さて、今日はヒマだったのでSVMという機械学習アルゴリズムを利用して僕が好きなアニメキャラ3名(黒猫、緑川花、めぐみん)の分類ができるか試してみました。

 

結論を先に言うと、予想以上にイイ感じに分類できました。

 

 目次

 

 分類する推しキャラたち

今回分類する僕の推しキャラは3名です。

 

一人目はめぐみんです。この子は「この素晴らしい世界に祝福を!」に出てくる魔法使いです。この子もまた中二病こじらせていますが、実は結構すごい魔法使いだったりします。

f:id:short_4010:20190825211757j:plain

 

二人目は緑川花ちゃんです。この子は「監獄学園」に出てくるドSなお嬢様です。ドSを気取っていますが、意外と乙女なところもあり、とても可愛いです。

f:id:short_4010:20190825212233p:plain

 

三人目は黒猫ちゃんです。この子は「俺の妹がこんなに可愛いわけがない」のサブヒロインみたいな子です。中二病をこじらせていてとても可愛いです。

f:id:short_4010:20190825211447j:plain

 

 さてさて、今回はこれらの子を機械学習を使って分類できるようにしたいと思います。

 

例えるなら、赤ちゃんにこのうちの誰かの画像を見せたとき、その画像に映っている子が誰であるか答えられるように教育するようなものです。

 

分類に利用したアルゴリズム

分類にはSVMサポートベクターマシン)という機械学習アルゴリズムを利用しました。(理論的な説明は省きます、というか説明できるほど理解していません。)

素から実装しようと思うとなかなか大変なのですがscikit-learnという機械学習用のパッケージを利用するととても簡単に実装することが出来ます。

イメージですが、SVMは下の画像みたいな感じに分類してくれます。

 

f:id:short_4010:20190825213305g:plain

 

特徴を抜き出す

さて、SVMで学習させることが決まりましたが、学習には特徴量が必要です。

そこで、画像データから、画像を分類するのに有効そうな情報を抜き出します。

アルゴリズムは用意されているものを使うとなると、この特徴量の選択が腕の見せ所となります。

実際に人間も物を判別するときにその物の特徴に着目していますよね。それと似ています。例えばゾウとサイのわかりやすい違いは長い鼻があるかどうかですよね。そんな感じで、うまく画像を分けられるような特徴量を抜き出します。

 

ここから具体的にどんな特徴量を使ったのか書きますが、少し難しい話になりますので読み飛ばしてもらっても構いません。

 

さて、上に載せた推しキャラの画像を見ると分かると思いますが、結構、「」が違いますよね。黒猫は紫っぽいイメージ、めぐみんは赤っぽいイメージ、緑川花は黄色っぽいイメージです。

 

そこで、今回は、カラーヒストグラムというものを使いました。そもそも色というのはRGBの組み合わせで表現されていますよね。

デジタル画像はR,G,Bそれぞれについて0~255の組み合わせで一つの色を表現します。

 

例えば、R,G,B = (100,200,20)みたいな感じです。これだと緑色が最も強く、その次に赤、一番弱いのが青色となります。これは黄緑っぽい色になります。

 

さて、こんな風に考えると全部で256*256*256 =16777216色を表現することが出来ます。

この約1677万色のうち、与えた画像にどの色が何回出てきたのかを数えたものを特徴量として使います。

イメージとしてはこんな感じです。

f:id:short_4010:20190825221535p:plain

 

この1677万の数字の組合わせを画像から抜き出して、この数字の組み合わせをもとに学習を行いました・・・。と書きたいところですが、実際には減色や色空間の変換などを行っています。

 

書くのに飽きてきたので簡単に説明しますが、、こんなにも多くの組み合わせを使うと、組み合わせが多すぎてうまく画像ごとの特徴を発見できなかったりします。そこで、0~255の組み合わせで表現されているものを4段階に変換します。R,G,Bがそれぞれ4段階で表現されるようにしたので、合計の数字の組み合わせは4*4*4 = 64通りとなりました。めちゃくちゃ減りました。

 

カラーヒストグラムをグラフにするとこんな感じになります。

f:id:short_4010:20190825230030p:plain

 

それぞれのキャラの特徴

学習には合計30枚のデータを使いました。

f:id:short_4010:20190825222928p:plain

 

とりあえず、背景とかも特に取り除くことなく画像をカラーヒストグラム(特徴量)に変換してみました。

 

めぐみんの一枚目の画像のカラーヒストグラムはこんな感じになりました。

これを見ると、やっぱり赤っぽい色がたくさん出現していますね。背景と思われる白の値が大きく出ていますが、とりあえず無視します。残りの9枚についてもこんな感じにカラーヒストグラムを作りました。

f:id:short_4010:20190825224510p:plain

 

次に、緑川花ちゃんです。花ちゃんも一枚目についてとりあえずグラフにしてみました。花ちゃんの髪の毛の色(黄色)や服の色(茶色)が出ていますね。しかしそれ以外にも青っぽい色がかなり出ています。これは背景ですね・・・。一枚目の背景は空なのでその色がかなり出てしまっています。背景取り除いた方がいいんですけど面倒なのでとりあえずそのままやってみます。残りの9枚についてもカラーヒストグラムを作りました。

f:id:short_4010:20190825225257p:plain

 

最後に、黒猫ちゃんです。こちらも一枚目についてグラフにしました。黒猫らしい紫色がかなり出ていますね。残りの9枚についてもカラーヒストグラムを作りました。

f:id:short_4010:20190825230231p:plain

 

これらのデータを使ってSVMの訓練を行いました。

つまり、プログラムに10枚のめぐみん、10枚の緑川花、10枚の黒猫の画像をカラーヒストグラムという数値のデータに変換して渡します。プログラムは渡されたデータから特徴をとらえて、それぞれのキャラを覚えるわけです。

 

分類します!

さて、実際にPythonでコードを書いてプログラムにそれぞれのキャラを学習させました。結構時間かかりました。10分くらいかけてプログラムが勉強していました。

 

勉強が終わったので、実際に僕の推しキャラを正しく覚えられたかテストしてみました。

プログラムに以下の合計9枚の画像を見せてみました。(テストデータ少ないですが、とりあえず9枚で・・・)

 

f:id:short_4010:20190825231613p:plain

(追記:学習データと被らないよう注意したつもりでしたがめぐみんの三枚目が学習データと被っていました!やらかした!)

 

結果は以下のようになりました。

 

f:id:short_4010:20190825232526p:plain

 

なんと!!実に9枚中8枚の画像について正しく分類できました!

1枚、めぐみんの画像が黒猫と分類されてしまっているのはおそらく背景の影響ですね。画像を見てもらうと分かると思いますが、背景が紫っぽい感じなので間違ってしまったのだと思います。きっと背景を削除すればもっと正しく分類できると思います。

 

ただカラーヒストグラムを使うだけで思った以上に精度高く分類出来てびっくりしました!さすがSVM!(?)

 

最後に

たった30枚の画像ですが、テストの9枚に対して結構いい感じに分類出来て嬉しかったです。

 

背景を取り除かずにそのまま使ってしまっているので、これをちゃんと取り除けばもっと良くなるかなと思います。

 

あと今回のカラーヒストグラムのように0の部分が多い(疎なデータ)をいい感じに変換する方法あったと思うのでそういうのも試す余地がありますね。

 

また、今回はただ色情報のみを使っていますが、本気で分類するならもっといろいろな特徴量を抜きだす必要がありそうです。

 

いろいろと適当ですが、暇つぶしなのでこれくらいで・・・。

 

追記:テストデータに学習データを含めてしまったのはやらかしました・・・。研究でこういうありえないミスをしないよう気を付けます・・・。

Bloggerの記事内のアドセンス自動広告(?)を停止する

BloggerGoogleが提供する無料のブログサービスです。

 

同じグーグルが運営していることから、広告の配信について、グーグルアドセンス側からだけでなく、Blogger側からもいろいろ設定できます

 

広告の配信をBlogger側からも設定できることはメリットのように思いますが、Blogger側で設定したことを忘れて、アドセンス側で自動広告の配信を停止したはずなのにいつまでもBloggerで広告が表示されるみたいな現象が起きます。

 

私の場合は、自動広告の配信を停止したくて、いろんなページに書いてある方法(アドセンス側から自動広告の広告ユニットを削除する、みたいな)を試しましたが、いつまで経っても各記事の一番下に表示される広告が消えませんでした。(あとから気づいたことですが、これは自動広告とは別なのかもしれません。どう設定したのか忘れてしまいました)

 

自分でいろいろ試してみて無事広告の停止に成功したので書いておきます。

 

Bloggerにログインして「レイアウト」をクリックします。すると、どこに何を配置するかみたいなページが出てきます。

 

そのうちで「ページの本文」の「ブログの投稿」の編集ページを開くと下の画像のようなページがあり、そこに「投稿の間に広告を表示する」というチェックボックスがあります。ここのチェックを外すことで、無事、各記事の下に表示される自動広告(?)を停止することができました。

 

自分で設定したことなのですが、昔にやったことなのですっかり忘れていました・・・。

f:id:short_4010:20190822121631p:plain