アドベントカレンダー最終日です。わーい
昨日は @starcoop が Heroku openで503エラーがでた話 でエラーの原因究明の流れを共有してくれました!
本日はネタアプリ回です。
できたもの
頭がいい人と頭が悪い人とあたまがわるいひとのネタアプリ pic.twitter.com/DQmATnSIKy
— なかもと (@yashinawa_retai) December 25, 2020
元ネタ
「物を見て、連想する数が多いほど賢い」とのことでモック的にできそうなのでやってみました。
なお、キャラクターの権利?が怖いので絵文字で代用しました。
概要
要素としては
- ウェブアプリ化
- FastAPI
- Vue.js
- 物体検出
- PyTorch
- VGG16(ImageNet)
- 知識グラフ
- ConceptNet
- グラフデータベース
- Neo4j
が登場します。流れとしては
- フロントから画像をAPIにPOST
- 画像中の物体を検出
- 物体名を英語から日本語に変換
- 日本語の物体名からネットワークを辿って列挙
- フロントに返して連想させる
くらいです。
各要素について
どんなだったかメモしておきます。
ウェブアプリ化
FastAPI
少しつまづいた点としては、アップロードされた画像ファイルを受け取って処理する方法です。
こちらを参考にしました。
How to convert the uploaded image to Numpy array? #2376
(自分の引用になってしまいますが) FastAPIでモックを作るときは、index.htmlを読み込んでもらうのが楽だと思います。ビルドしたフロントであったりCDNを利用した軽めのものでも楽にできます。
FastAPIでの静的ファイル, index.htmlの設定(WebSocket Chatの例を直す)
Vue.js
UIはVuerifyを利用しました。フロントというほどではなくほとんどindex.htmlペライチでVue.js, VuetifyのどちらもCDNを利用しました。
物体検出
PyTorch
大きな理由はないですが、GPUを使うときの書き方が好きで自分はよくPyTorchを利用しています。
VGG16(ImageNet)
今回はpretrained modelを利用しました。
TORCHVISION.MODELS
自然言語処理のHuggingFaceもそうですが、Deepなものをパッと動かせるのはとても罪悪感がありますね。
とはいえ、学習時と同じ条件にする必要があるので要注意です。こちらのサイトがいつもとても参考になります。
PyTorch (7) VGG16 - 人工知能に関する断創録
知識グラフ
連想を辿るために知識グラフを利用しました。初めの案ではMicrosoftのConcept-Graphを検討しましたが、学術利用のみでした。そこでConceptNetを利用することにします。
ConceptNet
IsAはもちろんSynonymなど多くの関係が格納されています。公式ページで少し遊ぶだけでも楽しいと思います。
WebAPIも公開されていますが、せっかくなのでダウンロードしてデータベースに格納することとしました。GitHubのWikiが充実しています。
commonsense/conceptnet5
また、正確な方法ではないですが、各NodeはLanguageも保持しているのでSynonym(同義)の関係を辿って”banana”(en)から「バナナ」(ja)を取得することができます。後述しますが、うまくいかないこともあります。
グラフデータベース
触ってみたかったのでNeo4jを採用しました。
Neo4j
ドキュメントがわかりやすくDocker, Docker-Composeの資料もあります。
How-To: Run Neo4j in Docker
ConceptNetや先述のConcept-Graphの格納方法も共有されています。
Non-Text Discovery with ConceptNet as a Neo4j Database [Community Post]
また、Neo4jの管理画面WebUIでは映画に関する関係グラフのチュートリアルがあり、「俳優Aの共演者とは共演した」が「俳優Aの共演者ではない」のような、いわゆる友達の友達のような内容も扱っています。楽しいです。
おわりに
データセットや事前学習済みモデルなど使いまくりで巨人の肩に乗るどころか騎馬戦をしている気分でした。
が、実は”banana”の日本語への変換で「甘蕉」と選んでしまって関係をあまり辿れなかったり、微調整中なのでコードなども含めて更新予定です。
完走した感想ですが、たくさんの後輩が参加してくれて嬉しかったです、らいねんもがんばってください。
アドベントカレンダー参加者のみなさん、お疲れ様でした!ケーキ食べるぞ〜〜