前提・実現したいこと
PythonでdlibとOpenCVを用いてHelen datasetを学習して顔器官検出
このページ最後の認識のプログラムを実行すると顔が認識した瞬間エラーがでて止まってしまいます。
参考サイトの学習済みモデルhelen-dataset.datをダウンロードして、predictorとして読み込みをしています。
顔認識をした瞬間に止まってしまうので、predictorに問題があると考えています。
エラーメッセージが'str' object is not callableとなっており、helen-dataset.datのなかにエラー原因のstrがあるのでしょうか?
発生している問題・エラーメッセージ
TypeError Traceback (most recent call last) <ipython-input-2-bb9c0dbc2bdd> in <module> 64 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 65 ---> 66 landmarks = facemark(gray) 67 68 for landmark in landmarks: <ipython-input-2-bb9c0dbc2bdd> in facemark(gray_img) 53 landmarks.append( 54 numpy.array( ---> 55 [[p.x, p.y] for p in predictor(gray_img, rect).parts()]) 56 ) 57 return landmarks TypeError: 'str' object is not callable
該当のソースコード
import cv2 import dlib import numpy import os predictor ='helen-dataset.dat' face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') def face_position(gray_img): """Detect faces position Return: faces: faces position list (x, y, w, h) """ faces = face_cascade.detectMultiScale(gray_img, minSize=(100, 100)) return faces def facemark(gray_img): faces_roi = face_position(gray_img) landmarks = [] for face in faces_roi: x, y, w, h = face face_img = gray_img[y: y + h, x: x + w]; detector = dlib.get_frontal_face_detector() rects = detector(gray_img, 1) landmarks = [] for rect in rects: landmarks.append( numpy.array( [[p.x, p.y] for p in predictor(gray_img, rect).parts()]) ) return landmarks if __name__ == '__main__': cap = cv2.VideoCapture(0) while cap.isOpened(): ret, frame = cap.read() gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) landmarks = facemark(gray) for landmark in landmarks: for points in landmark: cv2.drawMarker(frame, (points[0], points[1]), (21, 255, 12)) cv2.imshow("video frame", frame) if cv2.waitKey(25) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows()
試したこと
def facemark(gray_img):のなかの
for rect in rects: landmarks.append( numpy.array( [[p.x, p.y] for p in predictor(gray_img, rect).parts()]) )
部分をコメントアウトすると顔が映っても動作し続けることを確認しました。
そのため、コメントアウトした
for rect in rects: landmarks.append( numpy.array( [[p.x, p.y] for p in predictor(gray_img, rect).parts()]) )
ここのpredictor に問題があると考えていますが、同じような経験された方はいませんか?
補足情報(FW/ツールのバージョンなど)
python3.6.8
windows
jupyter notebook

回答1件
あなたの回答
tips
プレビュー