頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


PythonのOpenCVでデータセット内の重複画像をチェックする

CreateMLで人の顔を見分けたい
↑この続き。
機械学習(CreateML)で顔を見分けるために”良質な”データセットを作成しようと試みている。

画像検索で得た画像を使うとどうしても、これ持ってるよな?持ってたっけ?となってしまう。
なるべく避けようとするのだが、そうすると判断につかれるとかチェックに時間がかかってしまったりする。
そして実際どうしても重複してしまう。

なら重複覚悟でサクサク画像を得てから、後で重複をチェックすることにした。


(その1)顔の中にある目の相対位置で評価する

OpenCVで顔検出

↑PythonのOpenCVで顔や目の位置を得ることができる(※1)。
これを使って得た顔部分基準で目の相対位置なんかで評価すればいいんじゃね?というアイデアで実装を進めた。

ところがどうもよい結果がでない。調べてみたところ以下のようなことが原因だった。


サンプル画像1
サンプル画像2

↑例えばこの2枚の画像。単に1枚をクロップ(トリミング)したのがもう1枚の画像。この2枚の画像に対して顔の位置を検出した結果がこちら↓

OpenCVで顔検出結果1
OpenCVで顔検出結果2

同じ位置に顔を検出するものかと思っていたが微妙に違う。
そういうものなら仕方ない、とあきらめ別な方法を試してみた。



(その2)顔のランドマークを使う

OpenCVでランドマーク検出1

↑顔の輪郭や目の位置などを細かく取得できるのを利用してみた(※2)。
これだと顔のいろんな位置の座標を取得できる。

OpenCVでランドマーク検出2

↑ある点からある点へのベクトルを作成して、x軸との傾き(単位ベクトルにして内積から)などを評価、比較すればいいのでは?という考えで実装してみた。

類似画像検出結果1

↑これだと使えそうな程度にはなり、サクサクと重複している可能性のある画像を表示することができるようになった。

類似画像検出結果2

↑単に向きを数値化しているようなものなので似たような角度で撮影された画像は全く違っていても似ている、と判断するので完全自動化まではいかないが、自分の用途にはOKだ。



※1 参考サイト
Python, OpenCVで顔検出と瞳検出(顔認識、瞳認識) | note.nkmk.me

※2 参考サイト
顔のランドマークを検出 Python + OpenCV + dlib を使う | 404 Motivation Not Found
スポンサーサイト

<< グレーのMTLTextureからCIImageを作成する  TopPage  コードの表示方法を変更 >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
https://ringsbell.blog.fc2.com/tb.php/1303-4a15b104




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.