人臉檢測 二

weixin_33866037發表於2018-04-30

目的:

  1. 檢測出使用者路徑下所有的圖片的人像特徵,儲存在指定目錄;
  2. 人像原始特徵為100*100 圖片;

程式碼特點:

用自制的filewalk函式遍歷使用者目錄,並跟上了檔案操作回撥函式,使得程式碼閱讀起來更一目瞭然。

完整程式碼:

import os
import matplotlib.pyplot as plt
import numpy as np
from cv2 import cv2
from skimage import color, draw, io, transform

face_cascade=cv2.CascadeClassifier()
face_cascade.load(r'C:\ProgramData\Anaconda3\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')

def feature_model(full_path_file,detected_path=r'C:\Users\super\Desktop\detected'):
    try:img = io.imread(full_path_file)
    except:return 0
    path,file = os.path.split(full_path_file)
    file_name,file_postfix = os.path.splitext(file)
    gray = np.array(color.rgb2gray(img)*256,dtype='uint8')
    faces=face_cascade.detectMultiScale(gray)
    for index,face in enumerate(faces):
        x,y,w,h = face
        face_detected = img[y:y+h,x:x+w,:]
        face_detected = transform.resize(face_detected,(100, 100),mode='reflect')
        full_path_detected_file = os.path.join(detected_path,file_name+'_%s%s'%(index,file_postfix))
        plt.imsave(full_path_detected_file,face_detected)

def walk(path,callback=print):
    files = os.listdir(path)
    for file in files:
        try:
            if os.path.isdir(os.path.join(path,file)):
                walk(os.path.join(path,file),callback)
            else:
                print(os.path.join(path,file))
                callback(os.path.join(path,file))
        except:pass

def main():
    walk(path,feature_model)

if __name__ == "__main__":
    path = r'C:\Users\super'
    main()

可以改進之處:

  1. 沒有指定人臉特徵目錄的話就自己創造一個目錄,目前沒有實現這個功能;
  2. 特殊許可權的檔案目錄不能開啟;
  3. 人臉識別的原始cv2檢測器太垃圾,檢測出許多非人臉特徵,所以如果照片集裡有很多非人像的圖片就完全沒法用啊!
  4. 非人像特徵太多不能作為人臉識別原始資料,請繼續篩選;
  5. 依圖片集大小這個程式可能會執行兩三個小時;
  6. 據說編碼不能太完美主義,不然會沒完沒了~

效果:

4299975-05746989661f1bb6.png
效果

相關文章