質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

3回答

3151閲覧

MTCNNの顔検出の実行時間を早くしたい

napojin

総合スコア12

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

1クリップ

投稿2020/02/14 11:02

MTCNNの顔検出に非常に時間がかかる

** 困っていること **

顔検出のライブラリのMTCNNを使って、動画から顔のパーツの座標を特徴としてデータフレームを作っていたのですが、1時間50分で画像の197ファイルの検出しかできず、約120000ファイル(全データ)では1ヶ月半ぐらいかかりそうです。処理時間は2,3日以内を目処に考えています。

そこで時間を節約するために、以下に関して知識があれば、アドバイスをいただきたいです。

  1. 処理速度を高める手段の提案(計算リソースの追加など)
  2. MTCNNより、顔検出速度が早いライブラリ(約120000ファイルを1週間以内)
  3. マルチプロセスなどのコード上の工夫の余地
  4. その他の代案

** 現在使用しているGCPのVMスペック **
vCPU x 2、メモリ 13 GB
NVIDIA K80 GPUs x 2

** 該当コード**

python

1import cv2 as cv 2from tqdm.notebook import tqdm 3from collections import defaultdict 4import glob 5import pandas as pd 6from mtcnn.mtcnn import MTCNN 7 8filenames = glob.glob('video_folder/*.mp4') 9 10data_dict = defaultdict() 11for filename in tqdm(filenames): 12 fn = filename.split('/')[-1] 13 capture_image = cv.VideoCapture(filename) 14 if not capture_image.isOpened(): 15 print("Something Wrong!!") 16 break 17 ret, frame = capture_image.read() 18 detector = MTCNN() 19 result = detector.detect_faces(frame) 20# result is empty array when anything detect 21 data_dict[fn] = result[0] if len(result)!=0 else None 22 23df_data = pd.DataFrame.from_dict(data_dict) 24df_data = df_data.T 25display(df_data.head()) 26... 27

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

1時間50分で画像の197ファイルの検出しかできず、

110分で197ファイルということは1画像あたり34秒となりますが、いくら計算量がかかる CNN とはいえ、時間がかかりすぎな気がします。

今、試しに以下の条件で100枚の推論を試しましたが、1枚あたり0.5秒ぐらいでした。

  • GPU: TITAN X (Pascal)
  • 画像サイズ 2000x1400

考えられる要因

CPU 実行になっている

CUDA/CuDNN のバージョンがあっていない等で GPU が使われていないで、CPU 実行になっていたりしないでしょうか。
実行中に nvidia-smi で GPU が使われているかどうかを確認してみてください。もし、GPU が使われていてその遅さなら、MTCNN の速度向上は改善の見込みがないです。
ちなみに GPU が2枚刺さっていても、複数 GPU を使うように実装されていない限り、通常は1枚の GPU しか使われません。

画像サイズが大きい

また、画像サイズがかなり大きい場合は、検出前にリサイズしておくと早くなるかもしれません。

重みの読み込みは一回でいい

以下のモデルの作成はループの外に出せば、多少早くなるかもしれません。

python

1detector = MTCNN()

以前、以下のライブラリで顔検出を試したことがあります。
正面の顔ならそこそこの精度で検出できたと思います。

GitHub - ageitgey/face_recognition: The world's simplest facial recognition api for Python and the command line

投稿2020/02/14 12:16

編集2020/02/14 12:31
tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

napojin

2020/02/14 13:15

>>>考えられる要因として、CUDA/CuDNN のバージョンがあっていない等で GPU が使われていないで、CPU 実行になっていたりしないでしょうか ありがとうございます。実行中のnvidia-smiの実行結果は以下のようになりました。 GPUのプロセスは一応動いているようです。ただ、GPY Memory Usageが小さすぎるので、MTCNNに使われていないっぽいです。 $ nvidia-smi Fri Feb 14 12:29:31 2020 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 418.87.01 Driver Version: 418.87.01 CUDA Version: 10.1 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | |===============================+======================+======================| | 0 Tesla K80 Off | 00000000:00:04.0 Off | 0 | | N/A 73C P0 70W / 149W | 68MiB / 11441MiB | 0% Default | +-------------------------------+----------------------+----------------------+ | 1 Tesla K80 Off | 00000000:00:05.0 Off | 0 | | N/A 66C P8 33W / 149W | 11MiB / 11441MiB | 0% Default | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: GPU Memory | | GPU PID Type Process name Usage | |=============================================================================| | 0 19886 C ...om/anaconda3/envs/ml_env/bin/python 57MiB | +-----------------------------------------------------------------------------+ >>> GPU が2枚刺さっていても、複数 GPU を使うように実装されていない限り、通常は1枚の GPU しか使われません。 おっしゃる通り、GPUは一枚しか動いてませんでした。pytorchを使えば、GPUを稼働させてMTCNNを使えそうなので、試してみます。 現在使用中 https://github.com/ipazc/mtcnn Pytorch https://github.com/timesler/facenet-pytorch from facenet_pytorch import MTCNN mtcnn = MTCNN(post_process=False, device='cuda') >>> 画像サイズがかなり大きい場合は、検出前にリサイズしておくと早くなるかもしれません。 ありがとうございます。画像サイズはかなり大きく、幅1920, 高さ1080の動画がほとんどです。 一切手を加えずデータフレームに変換していました。 >>> 以前、以下のライブラリで顔検出を試したことがあります これは知りませんでした。今、openCVのCascadeClassifierを試したのですが、かなり誤認してたので、まずMTCNNでGPUを設定する方法を探してみて、それで改善しなければ試してみます。
guest

0

自己解決

無事解決できました!
結論から言うとGPUが使われていませんでした。

$ conda install -c anaconda tensorflow-gpu
をしたところ、
from tensorflow.python.client import device_lib
device_lib.list_local_devices()
で確認して、gpuが認識されるようになりました。

しかし、
Error
TypeError: softmax() got an unexpected keyword argument 'axis'
が出るようになり、おそらくバージョンによるエラーが表示されました。
tensorflowのバージョンを2.0から1.3に落としたところ、カーネルが勝手にシャットダウンするようになりました。
その後、色々バージョンを試しましたが、結局アプデートとした結果、競合なく読み込まれました。

$ conda update conda -n root 
$ conda update tensorflow 
$ conda update tensorflow-gpu 

$ pip freeze | grep tensorflow
tensorflow==1.15.0
tensorflow-estimator==1.15.1

[mtcnnバージョン]
import mtcnn
mtcnn.version
'0.1.0'

コード実行後、無事GPU2つの稼働を確認できました。
$ nvidia-smi
Fri Feb 14 15:34:25 2020
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 418.87.01 Driver Version: 418.87.01 CUDA Version: 10.1 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 Tesla K80 Off | 00000000:00:04.0 Off | 0 |
| N/A 73C P0 70W / 149W | 11033MiB / 11441MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
| 1 Tesla K80 Off | 00000000:00:05.0 Off | 0 |
| N/A 73C P0 75W / 149W | 69MiB / 11441MiB | 0% Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| 0 32578 C ...om/anaconda3/envs/my_env/bin/python 11020MiB |
| 1 32578 C ...om/anaconda3/envs/my_env/bin/python 58MiB |
+-----------------------------------------------------------------------------+

投稿2020/02/14 15:52

napojin

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

tiitoiさんがおっしゃった通り、detector = MTCNN()をループの外にして一回きりの読み込みにしたところ、実行速度が約288倍になり、1分あたり、1330ファイルの検出が行えるようになりました。
まさかここまで影響が出るとは思ってませんでした。ありがとうございました。

投稿2020/02/15 10:15

napojin

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問