今晚和一个朋友进行了简单的技术交流,说出来大家可能不信,对于一个接触这些电脑技术才1年时间不到的我在昨晚认真的逛了一圈github后,我整个人对技术的认知都要发生改变了,我称它为思想启蒙运动,对于电脑等众多技术的认知之前都太浅显了,等我手上这个树莓派小项目玩完,我就去试试认真玩一下github也去试试如何创建我自己的服务器和博客。这里我也将我朋友推荐给我的课程粘贴出来给大家以供学习:[自制双语字幕] 计算机教育缺失的一课(2020) - 第1讲 - 课程概览与 shell_哔哩哔哩_bilibili

提一嘴文明6真好玩,一晚就是一天

(一)采集自己的人脸数据

首先先进入到我们的python虚拟环境

cd venv
source bin/acrivate

创建一个专门用来存储自己人脸信息的文件夹

mkdir -p ~/date/huang

然后编辑自己的人脸识别文件

vim test_camera.py
import cv2
import numpy as np
 
cap = cv2.VideoCapture(0)
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_alt2.xml")

count = 0
 
print(face_cascade)
 
while True:
    ret,frame = cap.read()
    if ret:
        gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
        faces = face_cascade.detectMultiScale(gray,scaleFactor=1.5,minNeighbors=6)
 
 
#画个框来标记人脸
        for(x,y,w,h) in faces:
            cv2.rectangle(frame,(x,y),(x+w,y+h),(25,0,0),3)
            print(x,y,w,h)

            count += 1
            cv2.imshow("date/huang" + str(count) + ".jpg",gray[y:y+h,x:x+w])
 
        cv2.imshow("gray",gray)
        cv2.imshow("frame",frame)
 
    if cv2.waitKey(1) & 0xFF == ord("q"):
        break
    elif count == 70:
        break

cap.release()
cv2.destroyAllWindows()
 
 
 

 

ok,运行该程序,这时我们让我们的树莓派持续识别我们的人脸数据,当它采集到我们的人脸信息70张灰白照片时,程序会自行关闭

这就有了70张我们自己的灰白人脸照片了。

ok为了方便进行分类,我们需要从网上下载一些人物图片下来,我这里下载了小李子,基努李维斯,大本,麦叔,奥本海默的照片

 编写人脸识别的训练脚本

vim face_train.py
import os
import cv2
import numpy as np
import pickle

current_id = 0
#huang:5........
label_ids = {}
train  = []
labels = []

BASE_DIR = os.path.dirname(os.path.abspath(__file__))
image_dir = os.path.join(BASE_DIR,"date")

#这里opencv的训练库有多个
recognizer = cv2.face.LBPHFaceRecognizer_create()

classifier = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_alt2.xml")

for root, dirs,files in os.walk(image_dir):
    for file in files:
        path = os.path.join(root,file)
        image = cv2.imread(path)
        gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
        image_array = np.array(gray,"uint8")
        label = os.path.basename(root)

        if not label in label_ids:
            label_ids[label] = current_id
            current_id += 1

        id = label_ids[label]

        faces = classifier.detectMultiScale(image_array,scaleFactor=1.5,minNeighbors=6)

        for(x,y,w,h) in faces:
            roi = image_array[y:y+h,x:x+w]
            train.append(roi)
            labels.append(id)


with open("label.pickle","wb") as f:
    pickle.dump(label_ids,f)

recognizer.train(train,np.array(labels))
recognizer.save("mytrainer.xml")

执行该程序 

我这里的face_test和face_detector都是之前的test_camera.py,只不过我改了个名字复制了一份

ok,然后我们使用face_detector.py, 并对他进行修改


import cv2
import numpy as np
import pickle

cap = cv2.VideoCapture(1)
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_alt2.xml")
recognizer   = cv2.face.LBPHFaceRecognizer_create()
recognizer.read("./mytrainer.xml")

labels=[]
with open("label.pickle","rb") as f:
    origin_labels = pickle.load(f)
    labels = {v:k for k,v in origin_labels.items()}



while True:
    ret, frame = cap.read()
    if ret:
        gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
        faces = face_cascade.detectMultiScale(gray,scaleFactor=1.0,minNeighbors=5)
       
       #draw a rectangle on face.
        for(x,y,w,h) in faces:
            cv2.rectangle( frame, ( x , y ) , ( x+w , y+h ) , ( 255 , 0 , 0 ) , 3 )
            print(x,y,w,h)
            gray_roi = gray[y:y+h,x:x+w]

            id,conf = recognizer.predict(gray_roi)
            if conf >= 60:
                print(labels[id])
                cv2.putText(frame,str(labels[id]),(x,y-16),cv2.FONT_HERSHEY_SIMPLEX,3,(255,0,0),3)


        cv2.imshow("gray",gray)    
        cv2.imshow("frame",frame)

    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

cap.release()
cv2.destroyAllWindows()

完成了,但我不知道它干嘛老是以为我是拔叔,可能我比较帅吧

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐