BL脳 - BL本かどうかをカバーから判断するAI -
はじめに
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枚なので増やしたいけど、サイトに負荷かかりそう。
サイトの企業に連絡して、一緒にできるといいのかな。
Discussion