BL脳 - BL本かどうかをカバーから判断するAI -

1 min読了の目安(約1300字TECH技術記事

はじめに

BL脳というwebサービスを作りました。
画像を送るとBL本かどうかを判断してくれます。

herokuの無料枠を使っているため、アイドル状態になっている場合はアクセスに時間がかかります。
サーバサイドで画像は保存していません。

開発のきっかけ

BLに詳しい友人から、BL本を何冊も勧められていました。
何冊か見ているうちに、「あれ?これってBL本っぽいな」という感覚を得るようになりました。
この感覚は機械学習できるんじゃないかと思って開発しました。

開発の流れは、データ収集 -> 転移学習 -> web開発です。

データ収集

教師あり学習ですので、タグ付けされたデータが必要です。
データは友人がよく使っているサイトからBL本にジャンル分けされているisbnを1万件取得しました。
BL本以外として、少年漫画のデータも取得しました。

本のカバーはopenBDで取得しました。
ただし、取れた本のカバーは1500件ぐらいでした。

転移学習

画像認識のモデルはGhostNetにしました。
かなり新しいモデルで、重みが少ないため、サーバに優しそうです。

GhostNetは、ImageNetでの学習済みモデルがあったので、それを利用しました。
ImageNetは1000分類ですが、今回はBLか少年漫画かに分類するので、
最後の層を2分類に変えて学習させました。

1エポック目から精度が80%以上だったので、ImageNetの凄さを感じました。
10エポックほど学習させて、終了しました。最終的に90%ぐらいの精度出ています。

web開発

サーバサイドはpythonでreponder、クライアントサイドは、vue.js + typescriptです。

ユーザがアップロードした画像をクライアントサイドでリサイズしてサーバ側にデータを送り、
サーバ側で画像を推論して、結果をクライアントサイドに送ります。
クライアントサイドでは、推論結果から画像を生成します。

サーバサイドで画像を生成しても良かったのですが、転送量を考慮して、
クライアントサイドで生成するようにしています。

今後の展望

ここからは、ただのつぶやきです。

9割も当てるとかすげぇ。
どうやって判断してるのか詳しく知りたい。
GANで自動生成とかしたら捗りそう。友人が。

すべてクライアントサイドでやるのもいいかな。onnx.jsを使えばいいのかな?
GhostNetが軽いとはいえ、重みデータが15MBあるんですよねぇ。
8bitに量子化しても、四分の一なので、どの程度効果があるのか。

twitterで拡散しやすいようにOGPを生成してもいいかも。
ただ、画像の管理とか大変そう。gyazoを使おうと調べたりした。

学習画像が1500枚なので増やしたいけど、サイトに負荷かかりそう。
サイトの企業に連絡して、一緒にできるといいのかな。