はじめに
株式会社じげんの伊崎です。
主に全社データ分析基盤の構築を担当しています。
内容について
画像のベクトル化を深層学習で行う方法を説明します。
技術的な説明は最小限にとどめて、とりあえずベクトル化し、使ってみることを目指します。
画像検索や画像を使ったレコメンドに興味のある方に役立つ内容です。
はじめにベクトル化のやり方を書き、その後で使い方の例を書きます。
画像について
本記事で扱う画像は著作権フリーのものを使用しています。
1枚目: Chiemsee2016によるPixabayからの画像
2枚目: Ilona KrijgsmanによるPixabayからの画像
3枚目: PexelsによるPixabayからの画像
ベクトル化の方法
Kerasの事前学習済みライブラリを使う方法を書きます。
実行環境はGoogle Colaboratory(Colab)です。
import numpy as np
import tensorflow as tf
model = tf.keras.applications.EfficientNetB0(include_top=False, pooling="avg")
def image2vec(image_path):
raw = tf.io.read_file(image_path)
image = tf.image.decode_jpeg(raw, channels=3)
image = tf.image.resize(image, [224, 224])
vec = model.predict(np.array([image.numpy()]))[0]
return vec
Colabに画像をアップロードし、そのパスに対してimage2vecを実行すると、numpyの1次元配列が返ります。
例えば以下の画像が
以下のような配列となります。
array([-0.03999095, 1.113671 , -0.13362627, ..., -0.13771635,
-0.14991407, -0.17145288], dtype=float32)
これがベクトル化です。
画像ベクトルの使い方
画像同士の近さ判定
ベクトル同士の近さを測ることにより、画像の近さを測ることができます。
ベクトルの近さ(コサイン類似度)を測る方法は、以下の記事を参考にさせていただきました。
計算すると、最初にベクトル化した画像と以下の画像の類似度が0.021059312とわかります。
続いて、最初の画像と以下の画像を比べると、類似度は0.11230692となります。
猫と犬より、猫とトラのほうが近いという結果になりました。
画像検索
上の例では2枚の画像を比較しました。
大量の画像を用意し、ある1枚の画像とそれぞれの画像との類似度を測ることで、画像を類似度順に並べることができます。
これにより、画像検索が実現できます。
こちらに関しては、以下の記事に詳しく記載されています。
画像によるレコメンド
ある商品を見ているユーザーに対し、上記の手法で類似した商品を提示することでレコメンドが実装できます。
さらに、ユーザー行動をもとにした高度なレコメンドを実装する際にも、しばしば画像のベクトルが使われます。
こちらに関しては、以下の記事に詳しく記載されています。
ごく簡単な解説
ベクトル化の過程をひとことで言うと
「画像分類の仕方を事前に学習したモデルに、特徴量(ベクトル)の取り出しだけさせる」
ということをやっています。
終わりに
駆け足でベクトル化について書きました。
画像ベクトル化の有用さを少しでも感じていただけたら嬉しいです。