PythonとKerasでインスタの画像検索システム

Todd Perry
6 min readOct 25, 2018

--

最近Pythonを使って、基本的な画像分析のプロジェクトを行った。Google Reverse Image Searchのように画像でInstagramを検索するシステムを作成した。この記事で、画像検索システムの動き方を説明したい。ここでコードを見られる。

開発環境

・Python 3.6.6
・Tensorflow 1.10.0
・Keras 1.0.4

画像分析

このプロジェクトの一番大切な部分は画像の相似を計算するシステムだ。深層学習モデルを作るためにKerasというライブラリーを使った。KerasはTensorflowを利用するけど、Tensorflowと違って数学とか深層学習の知識が要らない、それでとても使いやすい。あとは、Imgnetという画像分析モデルを使ったから、一からモデルを設計することも要らなかった。Imgnetは画像( 224* 224)のピクセルデータを引数として与えられて、画像の内容に関係する三次元(7*7*512)の行列を返す。このScipyの関数で二つの一次元のべクターの相似を計算できるから、三次元の画像の行列を一次元のべクターに変更して、Scipyの関数に与えたら、二枚の画像の内容を比べられる。

以下のコードで二枚の画像を比較する関数が書いてある。

思ったよりコード少ないでしょ?
実行してみよう!三枚の写真で機能をテストする。以下に表示してる。

car1.jpg
car2.jpg
elephant.jpg

まず、car1.jpgとcar2.jpgを比べよう。

よし!車の種類は全然違うけど、計算した相似は39.8% だった!
次、車の写真と像の写真を試そう。

相似は4.95% だけだった。最高、動きそうだ!

データセットの収集

画像を比べられるコードを実装できたのに、InstagramのデータがないとReverse Image Searchを作成できないから、次にインスタの画像をスクレーパーを作ろう。このプロジェクトを行う前に分からなかったけど、アカウントを持たなくてもインスタの画像を取られる。https://www.instagram.com/explore/tags/beer

上のURLでハッシュタグ(この場合はBeer)の最近の写真を見られる。HTMLから画像のURLを見つけて取れるけど、もっと簡単な取り方がある。 URLの終わりに以下のクエリストリングをつけたら、返されるデータはHTMLじゃなくて、JSONになる。
https://www.instagram.com/explore/tags/beer?__a=1

ギークの俺にとって、簡単に処理できるJSONデータを見つけられたのは、最高だった

インスタのEndpoint向けのスクレーパーを書いた。ダウンロードする画像ごとに、この前の画像分析の関数を使って一次元のべクターを計算した。色々なハッシュタグの最近の画像をダウンロードして分析した。結果は、ハッシュタグごとに、100個くらいの画像べクターとURLが入ってるファイルを作成した。そのファイルをS3にアップした。

API作成

今まで、画像を比べる関数を書いて、インスタから画像をダウンロードしてべクターを変更にした。次のステップはAPIの作り!ユーザーは画像で検索するように、画像を受けるAPIを書く必要がある。俺はHugというAPIライブラリーが気に入ったから使おうと思ってた。HugでRESTのEndpointはとても作りやすい、俺のAPIのコードは以下に書いてある。

APIを実行する時にIISClientというクラスは自動でS3からデータをダウンロードして、POSTのEndpointが立てられる。Curlでテストできる、実行しよう!

成功です!car1.jpgという車の写真をAPIに送ったら、似てる写真の情報が返してきた。返した画像のハッシュタグの中で、#carとか#ferrariが入ってるので、ちゃんと動いてるみたいだ。

最後、UXで使おう!デザイナーの仲間はAPIを利用するフロントエンドを作成した。ユーザーはファイルを選択してアップしたら、似てる画像とよく出てくるハッシュタグが表示される。Car1.jpgで検索した、結果は以下。

結論

このプロジェクトはとても面白くて楽しかった。上手く行けば、読んだ人も楽んで面白い画像分析コードを書ける。深層学習は怖い分野のようだけど、Kerasとか他の使いやすいライブラリで開発したら、誰でもできると思う。

読んでくれてありがとう。下手な日本語で書いてごめん、実はこれは最初の日本語のブログだけでなく、俺の初めてのブログだ。楽しかったから、他の面白いプロジェクトを取り組んだらまた書こうと思ってる!

--

--