This page is intended for users in Hong Kong. Go to the page for users in United States.

OCRと全文検索を使えば画像検索が実装できるという話

NoSchool CTOの齊藤(名人)です。


9月20日に画像検索機能をリリースしました。

この機能は、NoSchoolに蓄積されている過去の質問を、画像で検索できるというものです。わからない問題がある学生さんが、手元の問題集の写真を撮影して、似たような質問がヒットして、回答を読んで理解して次に進むことができるような世界観を目指して作っています。

機能に懸けた想いは社長の徃西が書いているブログを読んで頂くとして、

本記事では技術的な観点でどうやって実装したかという話をさせていただきます。


要約

・OCRと全文検索の組み合わせを使えば、文字量が多い画像の画像検索ができる

・Cloud Vision APIの日本語解析の性能はいい感じ

・Algoliaはパラメータの調整によって「長文で長文を検索する」ユースケースにも対応できる

・AlgoliaとLaravelの連携は、Eloquent Modelを使っているならめっちゃ便利


開発した機能はこちらで公開しています。

https://noschool.asia/question/search-image


ぜひお手元に問題集がある方は使ってみてください(なかなか居ないか・・・笑)

または、このブログのヘッダー画像をダウンロードして実験していただいてもOKです。


OCRと全文検索の組み合わせについて

画像検索の手法としてまず思いついたのは、画像の類似度を求める方法なので、画像類似度とかでググってみると、特徴量の算出に関する記事がたくさん出てきました。

AKAZEやORBを使った特徴量の算出を色々試してみたのですが、結局、勉強の質問の画像なんて紙に文字がプリントされていて似通ったものなので、精度があまり出ませんでした。

※これに関しては専門家がやるとまた話が違うと思うので、随時専門家の方と繋がりたいです。もしよかったらアドバイスください・・・!

ただ、別の観点でいうと、勉強の画像ってOCRすれば「微分方程式」「還元剤」など独特な単語が含まれていることが多いです。

これを上手く活用したらいいのではということで、OCRしたテキストを全文検索するという手法が思いつきました。


Cloud Vision APIの性能

機械学習関連のAPIで、GCPのものは以前Natural Language APIを使ったことがあったので、Cloud Vision APIを使ってみたところ、結構日本語英語ともになかなか高い精度が出たので、採用することにしました。

過去に投稿された2万枚以上の画像を一気にOCRして、全てデータベースに突っ込みました。


Algoliaで全文検索

データベースに格納したOCRテキストを、Laravel Scoutというライブラリを使ってAlgoliaに同期しました。

Algoliaは全文検索ができるサービスで、大量のテキストの中からお目当ての文章や単語を発見することができます。

よく使われるケースとしてはたとえばFAQのページの一番上の検索窓なんかに使われていて、わからないことを入力した瞬間にこのQuestionですか?というのを出すというようなユースケースです。

別に頑張ればSQLでできるんですけど、例えば3つほどの単語を入力したときにそれぞれの単語を適切に分割してそれぞれで検索し、よりマッチしていると思われるものから結果に出す、とかになるとなかなかテクニカルな領域になります。

形態素解析とかBoWとか呼ばれる技術を使うことになりますし、複数マッチしたものをより上の順位にするとか、「てにをは」的な助詞は検索に引っかかりすぎるからスコアを弱めるとかそういった調整を自前で実装するのは大変です。

それを全部API経由で利用できますよというのがAlgoliaです。

今回は、ユーザーが撮影した写真をまずOCRして、結果のテキストをAlgoliaに投げて、近いと思われるテキストを一覧で返してもらい、そのテキストには質問IDが紐付いているため、紐付いた質問データを自社のDBから引っこ抜いてユーザーの端末に返して一覧表示する、というのを組みました。


ユーザーが撮影した写真に含まれる文字数は数百文字に至るケースもありますが、Algoliaの検索パラメータを調整するとそういったユースケースでも精度を保つことができました。ここの工夫については秘密です笑


まとめ

ざっくりではありますが、上記のような考えで画像検索を実装できます。ぜひ多くの画像を持っているサービスの運営者は検討してみてはいかがでしょうか。

あと余談ですが、Algoliaは月額29ドルで個人運営のサービスで実験するには高いので、会社のサービスとして使えたのはいい経験になりました笑


Qiitaのほうにより技術に寄った話をまとめているので、ぜひ読んでください!

2万枚以上の問題集の写真から探せる画像検索をCloud Vision APIとAlgoliaを使って開発した話
https://qiita.com/mejileben/items/3ad7a760db799ab92611

株式会社NoSchool's job postings
3 Likes
3 Likes

Weekly ranking

Show other rankings
If this story triggered your interest, go ahead and visit them to learn more