くらしのマーケット開発ブログ

「くらしのマーケット」を運営する、みんなのマーケット株式会社のテックブログ。積極採用中です。

OpenCVを用いたCとDjangoの特徴検出について

みなさんこんにちは、エンジニアのツヅキです。
突然ですが問題です。 みんなのマーケットのオフィスにはCDjangoという名前の猫が二匹います。
下記に2枚の画像がありますが、どちらかがCでどちらかがDjangoの写真です。
さて、どちらがCでどちらがDjangoでしょうか?

画像1 画像2

正解は、最初の画像がCで後の画像がDjangoです。
どちらがCで、どちらがDjangoかわかりましたか?(私はわかりませんでした)
そんな、どちらがどちらかわからない私のような人間はふと思います。
顔の特徴などがわかったら、2匹を判別できるのではないだろうか。。。。
さあ、ここからが本題、2匹の猫の特徴をOpneCVインテルが開発・公開したオープンソースのコンピュータビジョン向けライブラリ)[1]を用いてCDjangoの顔画像の特徴を調べていきます。

利用する画像について

今回は、4枚の画像を利用しました。

画像1 画像3 画像2 画像4jango

利用するプログラミング言語およびパッケージについて

利用する言語

  • Python3

    利用するライブラリ

  • OpenCV3

    特徴を調べる

    今回は、4枚の画像の特徴を調べるために、特徴点というものを探していきます。

特徴点とは、際立って検出できる画像上の点のことをいう。[1]

らしいです。
ということで、特徴を見ていきましょう!
特徴を検出するプログラムを以下に示します。

akaze = cv2.AKAZE_create()
face_feature = akaze.detect(img)
photo_face  = cv2.drawKeypoints(img, face_feature, None, flags=2)
cv2.imwrite(“test.jpg", photo_face)

上記のプログラム[2]によって検出された2匹の特徴を以下に示します。

c1 c2 d1 d2

上の2枚はCの特徴を検出したものです。2枚目の画像に関しては背景の画像の特徴も捉えてしまっていますが、おでこのあたりに赤の値が高めの特徴を多く捉えていることがわかります。
また、下の2枚はDjangoの特徴を検出したものです。おでこのあたりに緑の値が高めの特徴を多く捉えていることがわかります。

特徴を一致させる

先ほど特徴を調べましたが、今度は別の2匹の画像の特徴を一致させてみます。 特徴を一致させるプログラムの一部を以下にします。

akaze = cv2.AKAZE_create()
bf = cv2.BFMatcher()
kp1, des1 = akaze.detectAndCompute(img1, None)
kp2, des2 = akaze.detectAndCompute(img2, None)
matches = bf.knnMatch(des1, des2, k=2)
cat = []
for m, n in matches:
    if m.distance < 0.75 * n.distance:
        cat.append([m])
img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, cat, None, flags=2)
cv2.imwrite(“test.jpg", img3)

上記のプログラム[3]によって検出された2匹の特徴を一致させた画像を以下に示します。

c d

上の画像が、Cの特徴を一致させた画像です。おでこのあたりに赤の特徴が一致したことを示す線と鼻のあたりに緑の特徴が一致したことを示す線があります。
また、下の画像が、Djangoの特徴を一致させた画像です。おでこから目にかけて緑の特徴が一致したことを示す線と、鼻のあたりに橙色の特徴が一致したことを示す線があります。

結果

2匹の顔画像から特徴を検出することができました。
Cは赤色が多めで、Djangoは緑色が多めということがわかりました。
これにより、人間の目で2匹を区別しなくても、特徴点から2匹を判別することができるようになりました。
この技術を応用すれば画像を自動で判別し
「写真に写っているのは人の顔なのか」
「誰が写っている写真なのか」
などがわかるようになるかもしれません。
(これは簡単な特徴を検出しただけなので、この特徴が全てではありません。
また、顔画像ではなくて、背景の中に2匹がいたらどうなるの?とか、他の猫を認識させたらどうなるの?とかはまた別のお話です。)

最後に

私は今、上記の技術を応用して、くらしのマーケットのサイトで活用できるよう奮闘中です。
私たちテックチームでは「くらしのマーケット」を一緒に作る仲間を募集しています。ご興味のある方、ご応募お待ちしております!
www.minma.jp

参考文献

[1] https://ja.wikipedia.org/wiki/OpenCV
[2] https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%BC%E3%83%8A%E3%83%BC%E6%A4%9C%E5%87%BA%E6%B3%95
[3] https://qiita.com/hitomatagi/items/caac014b7ab246faf6b1