#これまでやってきたこと
①OpenCVを使ってJPG画像を顔認識、顔の座標データ(x,y,w,h)を取得
②この座標データを使ってOpenCVでトリミング、文字挿入
上記①〜②の処理をこなす画像処理ツールを作ってきました
#トライしようとしたこと
このツールを更にパワーアップさせるため、以下の2点を盛り込もうとしました
・日本語パスに対応(デフォルトだとOpenCVが全角パスを読めないので)
・顔認識処理の部分をOpenCVではない更に高度なRetinafaceというライブラリに置き換える
そこで、解説本やRetinaFaceのGitHubページ(https://github.com/serengil/retinaface)を参考に以下のコードを作成しました。
Python
1from retinaface import RetinaFace 2import cv2 3import os 4 5def imread2(filename, flags=cv2.IMREAD_COLOR):#OpneCVを日本語パスに対応させる定義 6 buf = np.fromfile(filename, np.uint8) 7 img = cv2.imdecode(buf, flags) 8 return img 9 10def find_all_files(directory):#ディレクトリ以下全てをリスト化する定義 11 for root, dirs, files in os.walk(directory): 12 yield root 13 for file in files: 14 yield os.path.join(root, file) 15 16def face_detect(i,img_path):#顔認識させるための定義 17 18 img = imread2(img_path) 19 img_width = max(img.shape) 20 resp = RetinaFace.detect_faces(img_path, threshold = 0.5)#これが今回新しく試したいRetinaFace 21 22 print(resp)#この「resp」から得られたデータを将来的にトリミングとか文字挿入の画像処理に活用したい 23 24 25input_path = input('画像フォルダのパスを入力してください。') 26 27pictures = []#空のリスト 28folder_path =[]#空のリスト 29 30for file in find_all_files(input_path):#入力されたパス以下のファイルとフォルダを全部リスト化する定義 31 folder_path.append(file) 32 33for file in folder_path:#全ファイルとフォルダのリストの中から.jpgを別の新しいリストに移動 34 base, ext = os.path.splitext(file) 35 if ext == '.jpg': 36 pictures.append(file) 37 38i = 0 39while i < len(pictures):#新しいリストに対して顔認識をする 40 41 img_path = pictures[i] 42 face_detect(i,img_path) 43 print('-----------------------------') 44 45 i = i + 1 46 47print('完了')
#直面した問題
すると、半角パスの画像に対しては以下のように顔や目、口の詳細な情報を取得できました。
{'face_1': {'score': 0.9977211356163025, 'facial_area': [230, 250, 427, 491], 'landmarks': {'right_eye': [277.46255, 358.14325], 'left_eye': [369.09164, 353.0737], 'nose': [323.42743, 419.03287], 'mouth_right': [295.996, 445.4812], 'mouth_left': [365.11304, 441.3468]}}}
しかし全角パスを指定した場合、Windows10環境ではRetinafaceがエラーになってしまい処理が途中で止まってしまいました。OpenCVのエラーは発生しないので、トライしようとしたOpenCVの全角パス対応には成功していると思われます。
更に疑問なのは、同じプログラムをMacBookProで試したところRetinafaceエラーが発生しませんでした。
この問題は文字コードなどが原因で発生していると思われるのですが、Windows10環境で動かしたいので良い解決策があればご教示いただければ幸いです。あるいは、そもそも文字コードが原因だとする私の見立てが間違っているのでしょうか?
以上、お知恵をお借りできれば幸いです。
回答1件
あなたの回答
tips
プレビュー