大一刚结束,为了留在学校的创新实验室,暑假半个月做了这么一个人脸识别的项目(算是个小项目吧??)
一、Python安装及环境
(一)、安装python+pycharm
在官网下载了python3.7,然后去了微信公众号【软件安装管家】下载了pycharm的安装包,安装步骤公众号里有,而且非常详细!
(二)、环境配置
打开cmd或者powershell
一般的库用 pip install ***就可以,比如说 pip install numpy。pip在我下载安装python3.7时就已经安装过了,照理应该不用手动安装了。
卸载库:pip uninstall ***
查看库:pip list
如果安装失败,多试几次,如果一直都失败,可以去点击打开链接 (https://www.lfd.uci.edu/~gohlke/pythonlibs/)下载下来,然后输入指令 pip install ...\opencv_python-3.4.2+contrib-cp37-cp37m-win32.whl 就可以了,路径不要有中文。
(这边我装的是+contrib,比较全。)
还有一个步骤!!!将...\opencv\build\python\2.7\x86中的cv2.pyd文件复制到...\Python\Python37-32\Lib\site-packages中。
二、模型
我没有找很专业的人脸模型,亲朋好友还有我喜欢的明星各找了6张图,还有就是我自己的。
大概就是建一个这样的project。
大家都看到了,我模型训练和人脸识别是分了两个.py文件,恕我无能,我只能做到这个地步了。(那天凌晨2点做完的,本来想直接发给实验室负责人(其实就是个学长),但是想了想算了,第二天给他发了效果图,就是文章刚开始的bene,他问了一个大概,都没看具体的,就这样蒙混过关了233。希望有大佬能教我怎么合并起来~~~)
三、代码
face_train
import cv2 import os import numpy as np from PIL import Image import pickle BASE_DIR=os.path.dirname(os.path.abspath(__file__)) image_dir=os.path.join(BASE_DIR,"images") face_cascade=cv2.CascadeClassifier('D:\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt2.xml') recognizer=cv2.face.LBPHFaceRecognizer_create() current_id=0 label_ids={} y_labels=[] x_train=[] for root,dirs,files in os.walk(image_dir): for file in files: if file.endswith("png") or file.endswith("jpg"): path=os.path.join(root,file) label=os.path.basename(root).replace(" ","-").lower() print(label,path) if not label in label_ids: label_ids[label]=current_id current_id +=1 id_=label_ids[label] print(label_ids) #y_labels.append(label) #x_train.append(path)#verify this image,turn into a NUMPY array,Gray pil_image=Image.open(path).convert("L") size=(550,550) final_image=pil_image.resize(size,Image.ANTIALIAS) image_array=np.array(final_image,"uint8") print(image_array) faces=face_cascade.detectMultiScale(image_array,scaleFactor=1.5,minNeighbors=5) for(x,y,w,h)in faces: roi=image_array[y:y+h,x:x+w] x_train.append(roi) y_labels.append(id_) #print(y_labels) #print(x_train) with open("label.pickle",'wb')as f: pickle.dump(label_ids,f) recognizer.train(x_train,np.array(y_labels)) recognizer.save("trainner.yml")
face
import numpy as np import cv2 import pickle face_cascade = cv2.CascadeClassifier('D:\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt2.xml') eye_cascade = cv2.CascadeClassifier('D:\\opencv\\sources\\data\\haarcascades\\haarcascade_eye.xml') smile_cascade = cv2.CascadeClassifier('D:\\opencv\\sources\\data\\haarcascades\\haarcascade_smile.xml') recognizer=cv2.face.LBPHFaceRecognizer_create() recognizer.read("trainner.yml") labels={"person_name":1} with open("label.pickle",'rb')as f: og_labels=pickle.load(f) labels={v:k for k,v in og_labels.items()} cap=cv2.VideoCapture(0) while(True): ret,frame=cap.read() gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) faces=face_cascade.detectMultiScale(gray,scaleFactor=1.5,minNeighbors=5) for(x,y,w,h) in faces: print(x,y,h,w) roi_gray=gray[y:y+h,x:x+w]#(ycord_start,ycord_end) roi_color=frame[y:y+h,x:x+w] id_, conf=recognizer.predict(roi_gray) if conf>=4 and conf<=85: print(id_) print(labels[id_]) font=cv2.FONT_HERSHEY_SIMPLEX name=labels[id_] color=(255,255,255) stroke=2 cv2.putText(frame,name,(x,y),font,1,color,stroke,cv2.LINE_AA) img_item="7.png" cv2.imwrite(img_item,roi_color) color=(255,0,0)#BGR 0-255 stroke=2 end_cord_x=x+w end_cord_y=y+h cv2.rectangle(frame,(x,y),(end_cord_x,end_cord_y),color,stroke) subitems=smile_cascade.detectMultiScale(roi_gray) for(ex,ey,ew,eh)in subitems: cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2) cv2.imshow('frame',frame) if cv2.waitKey(20)&0xFF==ord('q'): break cap.release() cv2.destroyAllWindows()
参考资料:https://www.youtube.com/watch?v=PmZ29Vta7Vc&t=3535s 英语好的可以去听一下他对代码的解读(要翻墙,翻墙软件评论给你Vx我发你)
不太会写文,打算作为日记记录一下第一次做东西的过程,非常欢迎大佬以及和我一样的小白指正讨论!!!!