Python:图像人脸检测并分类为人脸和非人脸
Python: Image face detection and sorting into face and no face
我正在尝试创建一个分类系统,根据是否有脸对图像进行分类。而且似乎 运行 并不像预期的那样。第一张图片排序后,循环停止工作,我似乎无法弄清楚出了什么问题。 (我知道它是多么低效)。总而言之,我希望得到一些关于为什么它可能不起作用的指示。
import cv2
import os
from PIL import Image
lst = [
file
for file in os.listdir("~/face detect")
if file.endswith(".jpg")
]
for image in lst:
face_cascade=cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml")
img = cv2.imread(image)
gray_img=cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray_img,
scaleFactor= 1.15,
minNeighbors= 15)
print("Found {0} faces!".format(len(faces)))
if len(faces) > 0:
directory = '~/Face'
os.chdir(directory)
output_filename = "".join(image.split('.')[:-1]) + "_face.jpg" # Set output file name
cv2.imwrite(output_filename, img)
else:
directory = '~/No_face'
os.chdir(directory)
output_filename = "".join(image.split('.')[:-1]) + "_no_face.jpg" # Set output file name
cv2.imwrite(output_filename, img )
print("image sorted")
# resized=cv2.resize(img,(int(img.shape[1]/3), int(img.shape[0]/3)))
# cv2.imshow("Deteced-face", resized)
# cv2.waitKey(0)
# cv2.destroyAllWindows()
你的主要问题是路径。让我猜测您的 python 文件位于“~/face detect”文件夹中,这就是读取第一张图像的原因。然后 os.chdir(directory)
来了,找不到更多的图像。我更正了以一种不太天真的方式使用文件夹的路径(正确的方法是使用 glob 但我不想使答案过于复杂)。另请注意,无需更改目录即可保存到它,事实上我在循环外初始化了 cv2.CascadeClassifier
import cv2
import os
INPUT_DIR = './input'
FACES_DIR = './out_faces'
NO_FACES_DIR = './out_no_faces'
images_names = [file for file in os.listdir(INPUT_DIR) if file.endswith(".jpg")]
print(images_names)
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml") # init once
for image_name in images_names:
img = cv2.imread('{}/{}'.format(INPUT_DIR, image_name)) # notice the INPUT_DIR
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray_img, scaleFactor=1.15, minNeighbors=15)
print("Found {0} faces!".format(len(faces)))
if len(faces) > 0:
output_fp = '{}/{}'.format(FACES_DIR, image_name.replace('.jpg', '_face.jpg')) # notice the FACES_DIR
for (x, y, w, h) in faces: # if you want to add the face that was detected
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
else:
output_fp = '{}/{}'.format(NO_FACES_DIR, image_name.replace('.jpg', '_no_face.jpg')) # notice the NO_FACES_DIR
cv2.imwrite(output_fp, img)
print("image {} saved at {}".format(image_name, output_fp))
我正在尝试创建一个分类系统,根据是否有脸对图像进行分类。而且似乎 运行 并不像预期的那样。第一张图片排序后,循环停止工作,我似乎无法弄清楚出了什么问题。 (我知道它是多么低效)。总而言之,我希望得到一些关于为什么它可能不起作用的指示。
import cv2
import os
from PIL import Image
lst = [
file
for file in os.listdir("~/face detect")
if file.endswith(".jpg")
]
for image in lst:
face_cascade=cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml")
img = cv2.imread(image)
gray_img=cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray_img,
scaleFactor= 1.15,
minNeighbors= 15)
print("Found {0} faces!".format(len(faces)))
if len(faces) > 0:
directory = '~/Face'
os.chdir(directory)
output_filename = "".join(image.split('.')[:-1]) + "_face.jpg" # Set output file name
cv2.imwrite(output_filename, img)
else:
directory = '~/No_face'
os.chdir(directory)
output_filename = "".join(image.split('.')[:-1]) + "_no_face.jpg" # Set output file name
cv2.imwrite(output_filename, img )
print("image sorted")
# resized=cv2.resize(img,(int(img.shape[1]/3), int(img.shape[0]/3)))
# cv2.imshow("Deteced-face", resized)
# cv2.waitKey(0)
# cv2.destroyAllWindows()
你的主要问题是路径。让我猜测您的 python 文件位于“~/face detect”文件夹中,这就是读取第一张图像的原因。然后 os.chdir(directory)
来了,找不到更多的图像。我更正了以一种不太天真的方式使用文件夹的路径(正确的方法是使用 glob 但我不想使答案过于复杂)。另请注意,无需更改目录即可保存到它,事实上我在循环外初始化了 cv2.CascadeClassifier
import cv2
import os
INPUT_DIR = './input'
FACES_DIR = './out_faces'
NO_FACES_DIR = './out_no_faces'
images_names = [file for file in os.listdir(INPUT_DIR) if file.endswith(".jpg")]
print(images_names)
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml") # init once
for image_name in images_names:
img = cv2.imread('{}/{}'.format(INPUT_DIR, image_name)) # notice the INPUT_DIR
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray_img, scaleFactor=1.15, minNeighbors=15)
print("Found {0} faces!".format(len(faces)))
if len(faces) > 0:
output_fp = '{}/{}'.format(FACES_DIR, image_name.replace('.jpg', '_face.jpg')) # notice the FACES_DIR
for (x, y, w, h) in faces: # if you want to add the face that was detected
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
else:
output_fp = '{}/{}'.format(NO_FACES_DIR, image_name.replace('.jpg', '_no_face.jpg')) # notice the NO_FACES_DIR
cv2.imwrite(output_fp, img)
print("image {} saved at {}".format(image_name, output_fp))