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

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

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

dlibは、機械学習のC++の画像処理ライブラリの一つ。性能の高い顔の器官検出が簡単にでき、Pythonバインドもあります。オープンソースで無料で使用でき、機械学習以外の様々な機能も搭載されています。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

OpenCV

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Python

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

Q&A

解決済

1回答

3161閲覧

dlib,opencvを用いての顔画像生成プログラムの作成方法、助けてください。。。

oriharas

総合スコア12

dlib

dlibは、機械学習のC++の画像処理ライブラリの一つ。性能の高い顔の器官検出が簡単にでき、Pythonバインドもあります。オープンソースで無料で使用でき、機械学習以外の様々な機能も搭載されています。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

OpenCV

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Python

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

0グッド

0クリップ

投稿2018/12/29 19:07

編集2018/12/29 19:23

前提・実現したいこと

現在フォルダ内の画像から顔を認識し、切り取り顔画像を生成するといったプログラムを使って顔画像生成を行なっているのですが、同じ画像をなんども生成し、その後に以下のようなエラーメッセージが表示されてしまいます。初心者で独学のため、どなたかご教示お願い致します

発生している問題・エラーメッセージ

エラーメッセージ Traceback (most recent call last): File "face_cut.py", line 58, in <module> face_detect(images) File "face_cut.py", line 47, in face_detect face_img = cv2.resize(dst_img, (64,64)) cv2.error: OpenCV(3.4.5) /Users/travis/build/skvark/opencv-python/opencv/modules/imgproc/src/resize.cpp:3784: error: (-215:Assertion failed) !ssize.empty() in function 'resize'

該当のソースコード

python

1import glob 2import dlib 3import cv2 4 5候補画像を格納したディレクトリパス 6IMG_PATH = "ディレクトリパス" 7 8def face_detect(img_list): 9 10 11 12 顔領域を検出する識別器呼び出し 13 detector = dlib.get_frontal_face_detector() 14 15 候補画像を識別器にかけて座標情報を取得 16 for img_path in img_list: 17 18 トリミング用候補画像(カラーモード) 19 img = cv2.imread(img_path, cv2.IMREAD_COLOR) 20 21 画像配列を組み直して識別器に入力、顔領域と思われる座標情報取得 22 cv_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 23 faces = detector(cv_img, 1) 24 25 顔領域を検出すれば顔画像生成 26 img_count = 1 27 for face in faces: 28 29 候補画像サイズ取得 30 height, width = img.shape[:2] 31 32 顔領域の座標点取得 33 top = face.top() 34 bottom = face.bottom() 35 left = face.left() 36 right = face.right() 37 38 イレギュラーな顔領域は無視 39 if not top < 0 and left < 0 and bottom > height and right > width: 40 break 41 else: 42 顔領域トリミング 43 dst_img = img[top:bottom, left:right] 44 45 顔画像サイズ正規化して保存 46 face_img = cv2.resize(dst_img, (64,64)) 47 new_img_name = str(img_count) + '.jpg' 48 cv2.imwrite(new_img_name, face_img) 49 img_count += 1 50 print(new_img_name) 51 52 53if __name__ == '__main__': 54 55 指定ディレクトリより候補画像を取得、API等を用いて顔画像生成 56 images = glob.glob(IMG_PATH + '*.jpg') 57 face_detect(images) 58 59### 試したこと 60 61ここに問題に対して試したことを記載してください。 62 63### 補足情報(FW/ツールのバージョンなど) 64Python 3.7.1 65OpenCV(3.4.5) 66dlib 19.16

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

Python 3.7.1
OpenCV(3.4.5)
dlib 19.16

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

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

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

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

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

guest

回答1

0

ベストアンサー

アドバイス含め3点コメントさせていただきますね:)

  • 複数ファイルを保存する際は、名前が本当に被っていないか確かめる

保存先のパスをprintしてみたりすると、img_countは想定の値になっていますか

  • メソッドは太らせすぎないようにする

face_detectメソッドの中身が大きいので適切な処理ごとにメソッドを分けるともっとデバッグしやすくなると思います!分け方は慣れなのですが、今回の場合だと例えば「顔座標取得」「トリミング&前処理」「画像保存」の3メソッド等でしょうか(人によるのでこの限りではないです)

  • エラーメッセージから解決法をググる

エラーログを全てコピペするのではなく、一行で収まる程度かつ自分のPC依存な部分を省くといい感じに見つかると思います

cv2.error: OpenCV(3.4.5) /Users/travis/build/skvark/opencv-python/opencv/modules/imgproc/src/resize.cpp:3784: error: (-215:Assertion failed) !ssize.empty() in function 'resize'

というエラーのうち、error: (-215:Assertion failed) !ssize.empty() in function s'resize' あたりをコピペしてググると次のリンクが出てきて、確認してみると画像が読み込めてないようですね

Python2.7.6でOpenCV Errorが発生します - スタック・オーバーフロー

投稿2018/12/29 22:52

chck

総合スコア184

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

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

oriharas

2018/12/31 05:20

回答ありがとうございます、もしご存知の場合御教示お願い致します 保存された画像をprintで表示してみたのですが以下のように 1.jpg 1.jpg 1.jpg 2.jpg 1.jpg 1.jpg 1.jpg 1.jpg 2.jpg 1.jpg 2.jpg 3.jpg 4.jpg 1.jpg 1.jpg 1.jpg 1.jpg 1.jpg 2.jpg 1.jpg 2.jpg 1.jpg 1.jpg 2.jpg 1.jpg 1.jpg 以上のように表示されて想定の値になっていませんでした、 何か解決策はありますでしょうか?
chck

2018/12/31 21:49 編集

どんなファイル名にしたいかによりますが、どうしてファイル名(`new_img_name = str(img_count) + '.jpg'`)が想定の値になっていないかを探すといいと思います この例でいうとファイル名はimg_countに依存してそうで、printの値をみると定期的に1に戻ってますよね、ということはimg_countがどこかで`img_count = 1`に初期化されてるということです もっと具体的に言うと、2重のfor loopになっていてimg_pathを回すほうのfor loop(つまり画像1枚1枚の見て回る処理)で`img_count = 1`しているので、別の画像になるたびに`1.jpg`で上書きしているということです 上記を踏まえると、画像ごとに`img_count = 1`しないで、for loopの外側(`for img_path in img_list:`のすぐ上とか)で`img_count = 1`すればどうでしょうか ちょっと細かく書いて申し訳ありませんが、考え方的にはこんな感じです!
oriharas

2019/01/14 22:02

返信遅くなり申し訳ありません 無事に解決しました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問