本帖最后由 liuli 于 2024-6-5 18:49 编辑
首先我的python都是在网上学的也没有学太深,所以一些格式或者别的有点问题,但是肯定能运行,我都在本地运行过了。
至于如何用python实现开发可以看这篇文章:小白用小安派学习过程第四篇
之后可以看看妖猊这位大佬的其他帖子。
导入包
import cv2
import os
import numpy as np
from PIL import Image
好了那么开始处理照片和训练模型吧
- def baoCun(face_id, face_detector):
- # 打开摄像头
- cap = cv2.VideoCapture(0)
- # 在tu/下创建人像编号文件夹,face_id就是人像编号
- os.makedirs('tu/' + str(face_id), exist_ok=True)
- # 拍照十次,可以根据你的需求更改次数,照片越多训练出的模型越大
- # 最高700多张就可以了,我感觉和十次也没有差太多,正常用50~100差不多了,太多模型会很大
- for i in range(10):
- # 从摄像头读取图片
- success, img = cap.read()
- # 转为灰度图片,减少程序符合,提高识别度
- gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
- # 检测人脸
- faces = face_detector.detectMultiScale(gray, 1.3, 5)
- # 框选人脸
- for (x, y, w, h) in faces:
- # xy为左上角的坐标,w为宽,h为高,用rectangle为人脸标记画框
- cv2.rectangle(img, (x, y), (x + w, y + w), (255, 0, 0))
- # 将图片处理好的图片保存到文件夹内,如:tu/1/user-1-0.jpg
- cv2.imwrite('tu/' + str(face_id) + '/user-' + str(face_id) + '-' + str(i) + '.jpg', gray[y:y + h, x:x + w])
- cv2.imshow('sheXingTou', img)
- print('已拍照' + str(int(i) + 1) + '次')
- pass
- face_detector="haarcascade_frontalface_default.xml"
- fa = int(input('输入编号:'))
- baoCun(face_id=fa, face_detector=face_detecto)
复制代码
2.训练模型
- def moxing_yi(i, renlian, face_samples, ids):
- # 通过图片路径将其转换为灰度图片
- img = Image.open(i).convert('L')
- # 将图片转化为数组
- img_np = np.array(img, 'uint8')
- # 为了获取id,将图片和路径分裂并获取
- id = int(os.path.split(i)[-1].split("-")[1])
- faces = renlian.detectMultiScale(img_np)
- for (x, y, w, h) in faces:
- face_samples.append(img_np[y:y + h, x:x + w])
- ids.append(id)
- return face_samples, ids
- def moxing_run(renlian, p):
- # 遍历图片路径,放到recog
- recog = cv2.face.LBPHFaceRecognizer_create()
- # 读取学生文件夹里的图片名称
- img_mc = [os.path.join(p, f) for f in os.listdir(p)]
- face_samples = []
- ids = []
- for i in img_mc:
- faces, ids = moxing_yi(self, i=i, renlian=renlian, face_samples=face_samples, ids=ids)
- # 训练模型
- recog.train(faces, np.array(ids))
- # 保存模型
- recog.save('trainner/' + img_mc[0].split("-")[1] + '.yml')
- os.makedirs('trainner', exist_ok=True)
- # 搞个循环取出不同人的照片
- for p in [os.path.join('tu/', f) for f in os.listdir('tu/')]:
- print('训练:' + p)
- moxing_run(renlian=renlian, p=p)
复制代码
好了这样人像模型就训练好了,最终的模型会放在文件夹trainner里。
|