1. 程式人生 > >face_recognition IndexError: list index out of range

face_recognition IndexError: list index out of range

再利用face_recognition做人臉識別的時候訓練人臉圖片時報錯:

face_recognition IndexError: list index out of range

主要程式碼定位到:增加編碼到訓練集的face_recognition.face_encodings(...)

   #遍歷訓練集中每個資料集
   for class_dir in os.listdir(train_dir):
       if not os.path.isdir(os.path.join(train_dir,class_dir)):
           continue
       print "get:",class_dir
       
       #遍歷每個目錄下的每張照片
       for img_path in image_files_in_folder(os.path.join(train_dir,class_dir)):
           image = fr.load_image_file(img_path)
           boxes = fr.face_locations(image)
           
           #對於當前圖片 增加編碼到訓練集
           X.append(fr.face_encodings(image,known_face_locations=boxes)[0])
           y.append(class_dir)

分析原因:

在追加資料到X中時,會將識別的圖片編碼,但是前提是能識別出人臉,否則編碼資料則為空,這也為什麼會報訪問超出邊界BUG,這裡我們需要新增判斷。

   #遍歷訓練集中每個資料集
   for class_dir in os.listdir(train_dir):
       if not os.path.isdir(os.path.join(train_dir,class_dir)):
           continue
       print "get:",class_dir
       
       #遍歷每個目錄下的每張照片
       for img_path in image_files_in_folder(os.path.join(train_dir,class_dir)):
           image = fr.load_image_file(img_path)
           boxes = fr.face_locations(image)
           
           #對於當前圖片 增加編碼到訓練集
           encodings = fr.face_encodings(image,known_face_locations=boxes)
           
           if len(encodings) > 0:
                X.append(encodings[0])
                y.append(class_dir)
           else:
                print("No faces found in the image!")
           #X.append(fr.face_encodings(image,known_face_locations=boxes)[0])
           #y.append(class_dir)