Python作为一门编程语言,这门语言的魅力和影响力已经远超C#、C++等编程语言前辈,被程序员誉为“美好的”编程语言。Python基本上可以说是全能的,系统运维、图形处理、数学处理、文本处理、数据库编程、网络编程、web编程、多媒体应用、pymo引擎、黑客编程、爬虫编写、机器学习、人工智能等等,Python应用无处不在。其优势更是不言而喻,简单易学、高层语言、免费开源、可移植性强、丰富的库、面向对象、可扩展性、可嵌入型、规范的代码等……
有很多初学Python的小伙伴们都觉得Python比较难学,看书吧,看了就忘了,网上的一些教程又是写的含糊不清,故而学习起来很吃力…
故此,本专栏亲自研究,实践,由易到难,层层深入,将调试过程中所遭所遇进行详细讲解,注意事项进行一一列举,希望能够帮助到各位初学Python的小伙伴,避免走弯路,费时费力。
本篇我们先学习下Python的人脸模型训练与人脸识别。话不多说,先看下效果图。
对于Python程序设计,主要就是基础语法、函数与模块、正则表达式、内存管理与多线程,即为Python的精髓。
1、基础语法:Python编程语言的变量、字符、常用运算符、元组和集合等等;
2、面向对象:这部分主要是学习从认识面向对象和类的特性,然后使用面向对象应用对遇到的异常进行处理;
3、函数与模块,这部分主要是学习函数的定义和标准模块与第三方模块、自定义包的实现等;
4、正则表达式,正则表达式是比较重要的,尤其是后面想从事爬虫的小伙伴,一定要把正则表达式学好;
5、内存管理与多线程,主要是了解Python编程语言的机制和掌握Python多线程。
初学者,不要怕麻烦,要不断的练习,看到自己感兴趣的,最好都能够亲自动手实践一下,特别是控件的重绘,最锻炼编程基础了。
#!/usr/bin/env python
import threading
from logging import root
import cv2
import os
import sys
from PIL import Image
import numpy as np
def getImageAndLabels(path):
facesSamples=[]
ids=[]
imagePaths=[os.path.join(path,f) for f in os.listdir(path)]
print(imagePaths)
# 检测人脸
face_detector = cv2.CascadeClassifier(
'/home/fwy/AndroidStudio/OpenCV-android-sdk/sdk/etc/haarcascades/haarcascade_frontalface_default.xml')
# 遍历列表中的图片
for imagePath in imagePaths:
# 打开图片
PIL_img = Image.open(imagePath).convert('L')
# 将图像转换为数组
img_numpy = np.array(PIL_img,'uint8')
faces = face_detector.detectMultiScale(img_numpy)
# 获取每张图片的id
print(os.path.split(imagePath))
id = int(os.path.split(imagePath)[1].split('.')[0])
for x,y,w,h in faces:
facesSamples.append(img_numpy[y:y+h,x:x+w])
ids.append(id)
return facesSamples,ids
if __name__== '__main__':
#图片路径
path = './data/jm/'
#获取图像 数组和id标签
faces,ids=getImageAndLabels(path)
#获取循环对象
recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.train(faces,np.array(ids))
#保存文件
recognizer.write('./data/trainer/trainer.yml')
#!/usr/bin/env python
import logging
import threading
import time
from logging import root
import cv2
import numpy as np
import os
#获取当前时间
def get_current_time():
now = time.time()
mlsec = repr(now).split('.')[1][:3]
current_time = time.strftime("%Y-%m-%d %H:%M:%S.{} %Z".format(mlsec),time.localtime(now))
return current_time
#日志动态打印
def write_log_to_Text(logmsg):
current_time = get_current_time()
logmsg_in = str(current_time) +" " + str(logmsg) #换行
logging.error(logmsg_in)
def recognizerFace(frame):
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
face_detector = cv2.CascadeClassifier(
'/home/fwy/AndroidStudio/OpenCV-android-sdk/sdk/etc/haarcascades/haarcascade_frontalface_default.xml')
t = time.strftime("%H %M %S")
write_log_to_Text("start detection...")
faces = face_detector.detectMultiScale(gray, minNeighbors=30)
t = time.strftime("%H %M %S")
write_log_to_Text("end detection...")
#
# 置信度评分用来衡量识别结果与原有模型之间的距离。0表示完全匹配。
# 在LBPH中:通常情况下,认为小于50的值是可以接受的,如果该值大于80则认为差别较大。
# 在EigenFaces中:值通常在0~20000之间,只要低于5000都被认为是相当可靠的识别结果。
# 在Fisherfaces中:值通常在0~20000之间,只要低于5000都被认为是相当可靠的识别结果。
#
for x, y, w, h in faces:
id, confidence = recognizer.predict(gray[y:y + h, x:x + w]) # 人脸识别
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
name = str(id)
cv2.putText(frame, name, (x, y), cv2.FONT_HERSHEY_COMPLEX, 1, (80, 80, 80), 2)
print('标签id:', id, '置信评分:', confidence)
# 加载训练数据和文件
recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.read('/home/fwy/PycharmProjects/FaceDetec/data/trainer/trainer.yml')
#准备识别的图片
img = cv2.imread('/home/fwy/PycharmProjects/C360_2018-12-14-08-58-20-612.jpg')#1707.jpg
recognizerFace(img)
cv2.namedWindow('result', 0)
cv2.imshow('result',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
人脸检测是 OpenCV 的一个重要的组成部分,也是人脸识别的基础。人脸识别其实就是一个能在给定图像或视频中识别出人脸。为了实现这一目标,我们可以使用一系列分好类的图像来进行“训练”,提出多种人脸特征,构成人脸特征库,然后再根据给定图像的人脸特征进行人脸库中特征比对,进行识别,根据相似度进行人脸判定。 这就是 基于OpenCV 人脸识别模型人脸识别的整个过程。 人脸识别模型的另一个重要特征是:每个识别都具有转置信(confidence)分值,也就是我们所说的对给定相似度的分值,可在实际应用中通过对其设置阈值来进行筛选控制。
获取到人脸训练库的数据,需要将这些数据加载到人脸识别算法进行比对处理。所有的人脸识别模型的face_detector.detectMultiScale函数返回值faces数组中,每一个face都有四个参数:图像x坐标,y坐标,w人脸图像宽度,h人脸图像高度。在通过id, confidence = recognizer.predict(gray[y:y + h, x:x + w]) 函数获取到人脸的ID和置信度,因此根据 ID 可以知道被识别的人是谁。要做到这一点,需用到「trainer/」目录中保存为.yml 文件,即训练人脸模型文件。
好了,今天就说这么多了,希望小伙伴们能从这篇文章中学到东西,也真心希望能够帮助正在苦学Python程序设计的小伙伴们,你们的成长是我最大的幸福。很感谢您能够在百忙之中浏览我的文章,有需要源码的小伙伴可以私信我。
源碼地址:https://download.csdn.net/download/hnjzfwy/85774111