2017-12-05 2 views
0

こんにちは、私は顔のJPG画像のフォルダを見て顔認識トレーナーを実行しようとしています順番にエラーを返すOSErrorの:画像ファイルを識別することはできません「のdataSet/.DS_Store」

import os            # importing the OS for path 
import cv2            # importing the OpenCV library 
import numpy as np          # importing Numpy library 
from PIL import Image         # importing Image library 

EigenFace = cv2.face.EigenFaceRecognizer_create(15)  # creating EIGEN FACE RECOGNISER 
FisherFace = cv2.face.FisherFaceRecognizer_create(2)  # Create FISHER FACE RECOGNISER 
LBPHFace = cv2.face.LBPHFaceRecognizer_create(1, 1, 7,7) # Create LBPH FACE RECOGNISER 

path = 'dataSet'          # path to the photos 
def getImageWithID (path): 
    imagePaths = [os.path.join(path, f) for f in os.listdir(path)] 
    FaceList = [] 
    IDs = [] 
    for imagePath in imagePaths: 
     faceImage = Image.open(imagePath).convert('L') # Open image and convert to gray 
     faceImage = faceImage.resize((110,110))   # resize the image so the EIGEN recogniser can be trained 
     faceNP = np.array(faceImage, 'uint8')   # convert the image to Numpy array 
     ID = int(os.path.split(imagePath)[-1].split('.')[1]) # Retreave the ID of the array 
     FaceList.append(faceNP)       # Append the Numpy Array to the list 
     IDs.append(ID)         # Append the ID to the IDs list 
     cv2.imshow('Training Set', faceNP)    # Show the images in the list 
     cv2.waitKey(1) 
    return np.array(IDs), FaceList      # The IDs are converted in to a Numpy array 
IDs, FaceList = getImageWithID(path) 

Traceback (most recent call last): 
    File "/Users/jef/PycharmProjects/testProject/Python/Trainer_All.py", line 28, in <module> 
    IDs, FaceList = getImageWithID(path) 
    File "/Users/jef/PycharmProjects/testProject/Python/Trainer_All.py", line 19, in getImageWithID 
    faceImage = Image.open(imagePath).convert('L') # Open image and convert to gray 
    File "/Users/jef/venv1/lib/python3.6/site-packages/PIL/Image.py", line 2452, in open 
    % (filename if filename else fp)) 
OSError: cannot identify image file 'dataSet/.DS_Store' 

フォルダーのdataSetが存在し、私のMacでコードを実行しています。最新のバージョンのピロー、numpyとcv2をOSGrrorで検索しましたが、この特定の問題の解決にはあまり役に立ちませんでした。何か案は?

+1

...イメージではない '.DS_Store'を読み込もうとしています。フォルダから削除します。または単に 'imagePaths'で' .DS_Store'を削除してください。もっと簡単に 'glob'を使い、' .jpg'や '.png'で終わるファイルや画像の拡張子をつかんでください。 –

+0

私はフォルダをチェックして、何も表示されませんでした。 '.DS_Store'はいくつかの.jpg画像だけです。グロブを実装するためにコードを変更する方法を教えていただけますか? – Purple82

+1

macOSは、あなたが訪問するフォルダに '.DS_Store'ファイルを挿入して、OSが物事をより速く読み込めるようにします。それはフォルダの中などのアイコンのための設定を保持します。 '.'で始まるファイルは、Finderウィンドウ内では通常見えない隠しファイルです。ターミナルのフォルダに移動すると、 'ls -a'でそのフォルダが表示されます。ターミナルの中で 'rm .DS_Store'を使ってそれを削除することはできますが、次にFinderでフォルダを表示したときにmacOSがそれを再度置くことがあります。 –

答えて

1

os.listdir()は、.DS_Storeのような隠しファイルを含め、ディレクトリ内のすべてのファイルを提供します。 macOSでは.DS_StoreはFinderで表示されるたびにディレクトリに挿入された隠しファイル(.で始まるファイル)がディレクトリに挿入されると、ファイルアイコンの読み込み速度が向上し、そのフォルダにサムネイルサイズなどの設定が保存されます。ファイルon Wikipediaの詳細を読むことができます。

ディレクトリに移動し、ls -aで端末にファイルをリストすると、そのファイルを見ることができます。

いずれにしても、画像ファイルとして試してみる必要はありません。これを回避するbazillionの方法がありますが、ここではいくつかあります:

for imagePath in imagePaths: 
    if imagePath == directory + '.DS_Store': 
     continue 
    # rest of your program 

または

imagePaths = [os.path.join(path, f) for f in os.listdir(path)] 
if directory + '.DS_Store' in imagePaths: 
    imagePaths.remove(directory + '.DS_Store') 

またはちょうどだけしたい拡張子を持つファイルをつかむためにglobを使用します。

ここ
import glob 
imagePaths = [f for f in glob.glob(directory+'*.jpg')] # or .png, .tif, etc 

*は、「任意の文字列」を意味するワイルドカードであるため、directory/1.jpgdirectory/asdf.jpgと他のすべての可能性は0から始まりますであり、末尾が.jpgである。

それとも

rm .DS_Store 

で、端末でのディレクトリから削除しますが、これは再びあなたがFinderでフォルダを表示する次回ファイルを挿入しますMacOSのように一時的なソリューションです。

関連する問題