github地址:https://github.com/haoxinl/face_detect/tree/master/data_script
前言
本文重点介绍数据收集的几种方法,包括了收集包含人脸的照片或视频以及从照片或视频中分离人脸两部分。详情还请见我的github:https://github.com/haoxinl/face_detect
正文
数据收集
如果你手机中存的照片多的话(至少也需要200张左右吧),可以直接跳过这一步骤~~
收集包含人脸的照片
主要依赖于cv2库
import cv2
cap = cv2.VideoCapture(0)
i=0
while(1):
# get a frame
ret, frame = cap.read()
# show a frame
cv2.imshow("capture", frame)
i += 1
if cv2.waitKey(1) & 0xFF == ord('q'):
cv2.imwrite("C:\pylearning\ml&dl\\face_detect\\test_img\\"+str(i)+'.jpg', frame)
continue
cap.release()
cv2.destroyAllWindows()
使用的是摄像头自带的摄像头,不断按q键即可快速截图
收集包含人脸的视频
主要依赖于cv2库
import cv2
cap = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*'MP4V')
out = cv2.VideoWriter('output3.mp4',fourcc, 20.0, (640,480))
while(cap.isOpened()):
ret, frame = cap.read()
if ret==True:
out.write(frame)
cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
cap.release()
out.release()
cv2.destroyAllWindows()
因为手动截图确实还是有不少麻烦,所以这里直接使用录视频的方式,之后再进行处理。
人脸分离
通过以上步骤我们已经得到了包含人脸的照片与视频,接下来将分别对其进行人脸分离
其实重点是cv2.CascadeClassifier库的应用,相关文件在我的github中config文件夹中
从照片中分离
def get_face(Path,objectPath,num):
face_cascade = cv2.CascadeClassifier('C:\pylearning\ml&dl\\face_detect_v0\config\haarcascade_frontalface_default.xml')
im = cv2.imread(Path)
faces = face_cascade.detectMultiScale(im, 1.3, 5)
for x, y, w, h in faces:
f = cv2.resize(im[y:(y + h), x:(x + w)], (128, 128))
cv2.imwrite(objectPath+'\\' + str(num) +'.jpg', f)
以上通过detectMultiScale操作检测到人脸区域,然后在原始图片上截取相关区域并进行存储。
从视频中分离
def get_img(video_path,face_path):
face_cascade = cv2.CascadeClassifier('C:\pylearning\ml&dl\\face_detect_v0\config\haarcascade_frontalface_default.xml')
vc = cv2.VideoCapture(video_path) # 读入视频文件
c = 1
if vc.isOpened(): # 判断是否正常打开
rval, frame = vc.read()
else:
rval = False
timeF = 5 # 视频帧计数间隔频率
while rval: # 循环读取视频帧
rval, frame = vc.read()
if (c % timeF == 0):
faces = face_cascade.detectMultiScale(frame, 1.3, 5)
# 每隔timeF帧进行存储操作
for x, y, w, h in faces:
f = cv2.resize(frame[y:(y + h), x:(x + w)], (128, 128))
cv2.imwrite(face_path+'\\'+str(int(c/timeF)) + '.jpg', f)
c+=1# 存储为图像
cv2.waitKey(1)
vc.release()
原理与从照片中分离大同小异。。。
结语
我们通过上述步骤已经得到了训练所需的素材,下面就开始正式训练^^