you can read useful information later efficiently. 19日に行われた Kyoto.なんか #3 で発表・デモをさせていただいた内容まとめです。, アイドル顔識別 をずっとやっている中で、顔の識別・分類(Classification)はCNNを使って出来ているけれど まだ上手く出来ていない別のタスクがあって。, それが画像内からの顔領域の検出 (Detection, Localization)。, 「画像内に写っている人物が誰であるか」を識別するためには、まずはその画像に写っている「顔」を検出する必要がある。 Line 689:filters=18に設定 そうして検出された目の領域を表す座標をそれぞれ回転前の座標に変換すれば、元画像に対する目の領域も取得できる。, やはりある程度の誤検出はあるので、適当にフィルタリングして補正し、除外。 結果として、使用できたのは2,845点のうち936点だった。 こんにちは。 AI coordinatorの清水秀樹です。 Tensorflow object detectionも中々精度が高いと評判でしたので、以前はtutorialに従った静止画での物体検出を実施してみましたが、今回動画でもできるようにカスタマイズしたので紹介します。 TensorFlow公式のモデル群 TensorFlow Models リポジトリで、 “Object Detection API” が公開された。 その検出された顔それぞれについて分類器にかけて「この顔は さん」「この顔は××さん」と分類していくことになるわけで… すぎゃーんメモ. Line 696:classes=1に設定 ここからさらにデータセットを増やしていけばどんどん精度は上げられそうな気がする。, あとは実際の顔識別に使うような自撮りの多い画像たちを どうアノテーション付けてどう管理し、どう性能評価していくか、って話になってくると思う, ここからは完全に余談なのだけど、せっかく高速に顔検出できるモデルをTensorFlowで構築できたのだから、Webサービスとして公開できるようにしよう、と。 weightとYOLO v3ネットワークを使って、KerasにコンバートしたYOLO v3モデルを構築 型が付くと分かりやすく書きやすい、んだけど なかなか慣れなくて思った以上に苦戦した…, これくらいならHerokuで動かせるかと思ったけど、いざdeployしてみたところ “Memory quota exceeded” のエラーが出まくってしまって、どうもメモリの使用量がヤバいらしい…。 顔の検出: 6.5FPS 3物体検出(高FPS版): 4.4FPS. wget -P models https://storage.googleapis.com/models-hao/voc-model-labels.txt, python run_ssd_live_demo.py mb1-ssd models/mobilenet-v1-ssd-mp-0_675.pth models/voc-model-labels.txt, from torchvision import transforms - YOLO v3による顔検出:01.データセット準備 Line 7:subdivisions=8に設定, filters=(classes+5)*3 顔検出モデル . TensorFlowで顔検出器を自作する. Line 783:classes=1に設定, 今回の学習で生成されたweightを使って、Keras YOLO v3モデルを作成し、モデル予測する. こんな感じのコードで, この方法で上手く検出でき、与えられているアノテーションと同数の顔が正しく両目と共に検出されたものだけを用いてデータセットを作成。 つまり、このリポジトリのモデルで扱う形に適合した tfrecord ファイルを自分で用意できれば、簡単にそれを使った検出器を学習させ使うことができる、ということのようだ。, 自分が集めてきたアイドル顔画像から用意しても良かったけど、まずは一般に公開されているデータセットで試してみよう、と思って探してみたところ、FDDB というデータセットがヒットした。, 2,845点の画像それぞれについて、写っている顔領域を楕円で表現し その中心座標、長径・短径、傾き角度 のセットがアノテーションとして計5,171件 与えられている。, これで顔領域の検出だけなら学習させられそうだけど、これだけでは顔の傾きは取得できない。 | Tensorflow detection model zooにある 「ssd_mobilenet_v1_coco」を転移学習で「顔検出モデル」にした学習済みモデルをTensorFlow.jsで動かしてみます。 ※顔検出モデルは顔検出、顔識別(顔認識)に挑戦してみるの2章で作成したモデルです。 Web-friendly formatに変換 Line 776:filters=18に設定 元の実装はcaffeによるもので、TensorFlow版も書いている人が数人いたけど 何となくの原理は分かったような気がするし自分でも勉強がてらTensorFlowで書いてみよう…として、難しすぎて途中で挫折した。 ここでは、MS COCO dataset を使って学習済みの5種類の一般物体検出モデルが公開されている。, 下の方がより精度が高く、その分モデルは大きくなるし処理も重くなるようだ。 これらのタスクを分割して掲載 - YOLO v3による顔検出:01.データセット準備 - YOLO v3による顔検出:02.Darknetで学習 - YOLO v3による顔検出:03.Kerasで予測. TensorFlow Python. ちょっと少ないけど仕方ない。 畳み込み4層の識別モデルくらいなら大丈夫だったけど これくらいの規模だと厳しいか、、、, Herokuでメモリ多めのdynoにアップグレードすると$25くらいかかるみたいだし、それだったらどこかのVPSで2GBくらいあるやつを借りた方がいいか…? ssd_inception_v2_coco の学習済みモデルをベースにFine-Tuningする形で。 その検出された顔それぞれについて分類器にかけて「この顔は○○さん」「この顔は××さん」と分類していくことになるわけで。, 分類器に与える入力画像を切り抜いて抽出するのにもまず顔領域を検出する必要があるし、その分類器を学習させるためのデータセットも、様々な画像から顔領域を検出して切り抜いてそれぞれに対してラベル付けすることで作っている。 画像内の「犬猫の品種」を検出するトレーニングをローカルで行う [Object Detection API] 7位: 画像内の物体を検出するObject Detection APIの使用方法 [TensorFlow] 8位: ネットワークカメラを用いた顔認識及び人物特定システムの構築 [防犯カメラの自作] 9位 Google Cloud Machine Learning を使う方法も書いてあったのだけど ちょっと何故か上手くいかなかった(要 再挑戦)ので、今回はEC2のg2.2xlargeインタンスを使って学習を行った。 Please try again later. 赤= ... (MobileNet Original) 7.2MB: 3(顔検出) 132KB: 6(3物体検出) 366KB: 学習データ . By following users and tags, you can catch up information on technical fields that you are interested in as a whole, By "stocking" the articles you like, you can search right away. Line 4:コメントアウト なので、顔識別タスクには「顔領域の検出」が不可欠となっている。, 今までは、データセット作成のための顔画像収集にはOpenCVを使った回転補正機能つきの検出器を自作して使っていた。, OpenCVのHaar特徴によるカスケード型分類器を使った領域検出は、正面向き顔・目などを検出するため学習済みデータが標準で同梱されており、最も手軽に使える検出器と言える。 ランドマーク検出とポーズ推定の可視化 ... ここでデフォルトでは “SSD with Mobilenet” を使用します。他のモデルのリストについては detection model zoo を見てください、様々な速度と精度の創造的なモデルを実行することができます。 # What model to download. Line 603:filters=18に設定 しかし、この検出器は斜めに傾いた顔に対しては一気に精度が下がるという弱点があり、斜めに写っていることが多いアイドルの自撮りでは上手く検出できない場合が多い。 Darknet OpenCVを使ったものと同様、両目の位置さえ取れればそこから角度は算出できそうだけど、両目の位置の情報は残念ながら付属のアノテーションには含まれていない。, しかし「顔の存在する位置」「傾き」が与えられているなら、その領域を狙い打ちして OpenCV で検出することも可能なはず。, という操作で「縦に真っ直ぐになった顔が写っているはずの領域」を抽出した画像を一度作り、それに対して OpenCV による顔検出をかける。 Keras YOLO v3モデルで顔検出 過去に構築したモデルを使って、検出した顔画像から性別・人種・年齢を予測. 2017-08-20. いちおう動くことは動くけど、いつ止まってしまってもおかしくない、という感じ。 Line 6:batch=24に設定 ", "{class_names[labels[i]]}: {probs[i]:.2f}", cv2.rectangle(orig_image, (box[0], box[1]), (box[2], box[3]), (255, 255, 0), 4), https://cpp-learning.com/wp-content/uploads/2018/07/logo_hayabsa_note-1.png. ディープラーニング/フォトグラフ/ビットコイン/株/亜熱帯/マイクロコンピューター/混声合唱団/天体観測/バンド演奏, # scale each detection back up to the image, # detections[0,i,j]は[conf,xmin,ymin,xmax,ymax]の形状. GitHub. It should be one of vgg16-ssd, mb1-ssd and mb1-ssd-lite. Tensorflow detection model zooにある 「ssd_mobilenet_v1_coco」を転移学習で「顔検出モデル」にした学習済みモデルをTensorFlow.jsで動かしてみます。 ※顔検出モデルは顔検出、顔識別(顔認識)に挑戦してみるの2章で作成したモデルです。 Web-friendly formatに変換 ChainerファミリーのChainerCVとLight-Head R-CNNによる『カメラ・動画対応!リアルタイム物体検出ソフト』の開発手順を説明します。深層学習による物体検出の概要も説明しています。... # from https://github.com/amdegroot/ssd.pytorch, 'Usage: python run_ssd_example.py    [video file]', "The net type is wrong. 物体検出の問題は、性質のわからない、数が不明な物体をビデオ画像やカメラ画像から特定するという問題になります。 ... ssd_mobilenet_v1_coco ssd_mobilenet_v2_coco ssd_inception_v2_coco faster_rcnn_inception_v2_coco faster_rcnn_resnet50_coco mask_rcnn_inception_v2_coco ... 1.595 … たった800件ちょっとの画像でのデータを用意だけでもこれだけ検出できるようになっているのだから十分かな、という感触。 Failed to save quote. ©Copyright2020 cedro-blog.All Rights Reserved. What is going on with this article? Darknet YOLO v3をWIDER FACEデータセットで学習させてweightを作成 - YOLO v3による顔検出:02.Darknetで学習 train:trainデータ画像のパス一覧ファイル 顔検出モデルはFlaskを使ってJSON API化できる。 Chainerファミリ一つChainerCVのYoloサンプルソースをカメラ・動画に対応できるよう改造した「リアルタイム物体検出ソフト」を開発した。その開発手順を紹介します。... 深層学習による画像処理の概要からChainerCVとFCISで『物体検出ソフト』を作るまで. Help us understand the problem. names:クラス名一覧ファイル これらのタスクを分割して掲載 - YOLO v3による顔検出:01.データセット準備 - YOLO v3による顔検出:02.Darknetで学習 - YOLO v3による顔検出:03.Kerasで予測. 写真・動画の「人の動き」をリアルタイムで検出・解析することがGoogleのエッジ向けのプロセッサ「Edge TPU」で可能です。誰でも簡単に「人間の姿勢」を推定して検出・解析できる方法を紹介していきます。人の動作を検出!Edge TPUとP 上2つはまさに SSD を使ったものであり、ベースとなる CNN を元論文では VGG16 を使っていたのに対し軽量な MobileNet を使ったもの、 Inception V2 を使ったもの と2種類それぞれで実現しているようだ。 train用とvalidation用に分ける必要があるようだったのでこれをさらに 843:93 に分割して使用した。, で、あとはこれをそれぞれ画像に対する image/objcet/bbox/* や image/object/class/* といったkeyに情報を含めて tfrecord 形式に書き出す。, これで一応、データセットが作成できたので あとはこれを使って学習させる。 YOLOやSSDなどディープラーニングのネットワークをいくつか試してきましたが、今回は顔認識のニューラルネットワークであるFaceNetを動かしてみましたので手順を記録しておきます。, FaceNetは2015年にGoogleが発表した顔認証用のニューラルネットワークです。, FaceNetの論文はこちらから参照できます。https://arxiv.org/pdf/1503.03832.pdf, FaceNetはSiamese(シャム) Networkをベースにしており、入力画像がどのクラスに属するかではなく、画像同士が似ているか似てないかを表す距離を学習します。, クラスに分類する場合、候補となる人のどれに当たるかを分類することになるため、各人の画像を大量に収集して学習する必要があります。さらに、候補者が増えた場合は、再学習が必要です。一方、Siamese Networkのように画像間の距離を算出する場合は、その距離により2つの顔画像が同一人物かどうかを判断できるので少ない画像で判別が可能となります。画像は1枚でも判定が可能でそのような学習タスクをOne Shot Learningと呼びます。, Siamese Networkでは2つの画像のペアで学習を行いますが、FaceNetでは3つの画像の組み合わせで学習を行います。その時に使用する損失関数がTriplet Lossと呼ばれるもので、基準となるAnchorに対して、同一ラベルのものを近くに、異なるラベルのものを遠くに置くように学習します。, ネットワーク構成は以下のようになっています。顔のみを切り出し、正規化した画像を入力します。DEEP ARCHITECTUREの部分が特徴量を抽出するCNNで、論文上ではZeiler&Fergus、Inceptionを使用しています。他のCNNを使用することも可能と思われます。その出力CNNのに対してL2ノルムを取り、Triplet Lossを計算します。, オープンソースの顔認識技術としてOpenFaceというものもあります。http://cmusatyalab.github.io/openface/, こちらはFaceNet論文を元にしたオープンソースの実装です。DNN(Deep Neural Network)を用い、顔から128次元の特徴ベクトルを抽出します。, FaceNetは顔認識のニューラルネットワークですが、実際に認識をさせるためには写真から顔の部分を切り出す必要があります。このため、facenetではMTCNNという顔検知のニューラルネットワークを前段で使用しており、その結果をfacenetに入力する形になっています。, MTCNNの論文https://kpzhang93.github.io/MTCNN_face_detection_alignment/paper/spl.pdf, Face_IDという別のレポジトリに関するものですが、facenet(小文字表記はレポジトリ名)をベースに修正されているようで、共通している部分が多いです。, 上記サイトでは2つの命題について記載されています。①Face verification:登録された顔が画像の中にあるかを判別②Face identification:あらかじめ登録された顔のデータベースから          どれに当てはまるかを識別今回は①を試してみました, OS:Windows 10 Home (64bit) Python 3.5 Anaconda 4.2.0 Tensorflow 1.12.0, ①GITHUBからレポジトリをCloneして任意の場所に解凍します。https://github.com/davidsandberg/facenet, ②以下のURLから学習済みの重みをダウンロードし、facenetの下に保存します。 データセットがCASIA-WebFaceとVGGFace2の2種類あります。https://drive.google.com/file/d/1R77HmFADxe87GmoLwzfgMu_HY0IhcyBz/viewhttps://drive.google.com/file/d/1EXPBSXwTaqrSC0OhUdXNmKSh9qJUQ55-/view, ③Anacondaプロンプトを起動し、プロジェクトディレクトリに移動します。Requirements.txtに記載されているライブラリをインストールします。必要なライブラリは以下の通りです。, Tensorflow  scipy  scikit-learn  opencv-python  h5py   matplotlib  Pillow  requests  psutil, ※以下のコマンドで自動で必要なライブラリをインストールできますが、Tensorflowのバージョンが1.7.0になってしまうので、ダウングレードが不要であれば、Requirements.txtを修正のうえ、実行してください。私の環境では1.12.0でも問題なく動作しました。, $ python [重みファイルのパス] [比較したい画像ファイルパス(2つ以上も可)] \$ --image_size 160 --margin 32 --gpu_memory_fraction 0, 重みファイルのパス:②で取得したファイルのパスを指定比較したい画像パス:顔の類似度を計算したい画像ファイルを指定 手元に画像がない場合はサンプルとしてfacenet/data/imagesの中に画像があります。--image_size:画像サイズ デフォルトは160pixel--margin:顔検知した際、検知した場所から何pixel外側をクロップするか     デフォルト 44pixel--gpu_memory_fraction:GPUメモリ使用量の設定, $ python src/compare.py src/20180402-114759 \$ data/images/Anthony_Hopkins_0001.jpg \$ data/images/Anthony_Hopkins_0002.jpg \$ --image_size 160 --margin 32 --gpu_memory_fraction 0, Images:0: data\images\Anthony_Hopkins_0001.jpg1: data\images\Anthony_Hopkins_0002.jpg, Distance matrix     0            10   0.0000   0.85161   0.8516   0.0000, Anthony_Hopkinsの画像を二枚入力し、0と1の画像の距離が0.856となっています。距離が短いほど2つの顔が類似しているということになります。, 同一人物だけだと面白くないので別の顔画像で試した結果も示します。Face_IDのレポジトリにはもう少しサンプル画像が入っていますので、それを使って試しました。, Images:0: facenet/dataset/test-images/mark1.jpeg1: facenet/dataset/test-images/mark.jpeg2: facenet/dataset/test-images/bradley.jpeg3: facenet/dataset/test-images/hritik.jpeg, Distance matrix        0         1         2         3, 0    0.0000    0.6942    1.4113    1.46431    0.6942    0.0000    1.4722    1.42462    1.4113    1.4722    0.0000    1.12743    1.4643    1.4246    1.1274    0.0000, 0,1がマークザッカーバーグで同一人物、2,3は別の人物です。結果を見ると0-1の距離が約0.7と短く、それ以外の距離はすべて1以上です。FaceNetの論文では1.1が閾値としてよいとされているので、確かに同一人物では画像間の距離が1.1以下となっていることを確認できました。, GITHUBに公開されているFaceNetのレポジトリを実際に動かしてみて、顔同士の距離が算出され、それが人の類似度になっていることを確認しました。次は、このサンプルコードを使って、ラズパイでなにか作ってみたいと思います。, https://qiita.com/koshian2/items/554b3cbef6aeb1aab10d, https://www.slideshare.net/kaorunasuno/20150611-nasuno, https://blog.imind.jp/entry/2019/05/01/142232, https://blog.imind.jp/entry/2019/05/06/192603, masashi_kさんは、はてなブログを使っています。あなたもはてなブログをはじめてみませんか?, Powered by Hatena Blog Darknet ブログを報告する, https://kpzhang93.github.io/MTCNN_face_detection_alignment/paper/spl.pdf, https://drive.google.com/file/d/1R77HmFADxe87GmoLwzfgMu_HY0IhcyBz/view, https://drive.google.com/file/d/1EXPBSXwTaqrSC0OhUdXNmKSh9qJUQ55-/view, 経験値ゼロのハードウェアエンジニアがAIを理解して動かすことができるようになるまで, DETR(End-to-End Object Detection with Transformers)を動かしてみた. Keras YOLO v3モデルで顔検出 過去に構築したモデルを使って、検出した顔画像から性別・人種・年齢を予測. あとはフロントエンドだけどうにかしてUIを作るだけ。, 以前もちょいちょいReactとかwebpackとか使って似たようなものは作っていたので使い回しだけど、今回はTypeScriptで.tsxを書いてts-loaderでトランスパイル、という感じでやってみた。