Самодельное распознавание лиц за считанные минуты (как быстро идентифицировать свою любимую девушку~)

искусственный интеллект алгоритм компьютерное зрение
"Время не упущено, творчество не останавливается, эта статья участвует вКонкурс эссе на конец 2021 года"
Благодаря недавнему обучению у меня много чувств, большие данные, искусственный интеллект, распределенные облачные вычисления, облачная облачная безопасность и Интернет всего - это действительно будущее направление! Так называемая веб-разработка, серверная часть на самом деле только начало.После того, как я поиграл в внутреннюю часть Python, я также испытал ведро семейства Spring (обучение).Пока приличный «сеанс 10,000» в основном не просто полагаясь на этот набор «увеличения». То, что может быть достигнуто путем «удаления, изменения и проверки», будет включать параллелизм и параллелизм, но если вы хотите сделать это хорошо, это будет включать распределенную микросервисную архитектуру и так далее. Кроме того, есть дополнительные сведения об услугах, например, как анализировать пользовательские предпочтения в режиме реального времени для продвижения соответствующего контента и так далее. Они тесно связаны с большими данными и тесно связаны с распределенными вычислениями. Конечно, отсюда я понимаю, что python не подходит, и вне зависимости от производительности отсюда видно, что решение python не так хорошо, как Java в этом плане, хотя у него тоже есть варианты. Но хорошо то, что Python с его богатой библиотекой классов легко использовать в машинном обучении и искусственном интеллекте, что делает его по-прежнему привлекательным, конечно, независимо от нижнего слоя.
Конечно, это не значит, что я не играю в эти штуки, это невозможно, ведь есть еще незавершенный веб-проект(White Hole) и пришлось провести рефакторинг с помощью Springboot.
# окружение

1.python 3.7 2.opencv

pip3 install opencv-python
pip3 install opencv-contrib-python

В данном случае это фактически простой вызов интерфейса.

используемый функциональный интерфейс

Мощный API, плавные программисты!

import cv2.cv2 as cv
cv.imread() #读取图片
cv.cvtColot() #图片颜色处理(灰度处理)
cv.imwrite() #保存图片
cv.imshow()  #展示图片
cv.waitKey() #窗口展示(其实是等待键盘输入,IO阻塞)停留传入时间毫秒,返回键盘按下的键位的ascll值
cv.resize() #修改图片大小
cv.rectangle() #绘制矩形
cv.circle() #绘制圆形
cv.CascadeClassifier()#使用训练模型
cv.VideoCapture() #读取视频0表示读取摄像头
face.LBPHFaceRecognizer_create() #数据训练
cv.destoryAllWindows() #释放内存

Процесс

Слова здесь в основном разделены на два больших шага

1. Прочитайте информацию о лице на изображении/видео и определите положение лица (создайте положение лица) 2. Сравните распознанные лица (извлечение признаков)

часть обнаружения лица

Чтение изображения/изменение размера

import cv2.cv2 as cv

Image = cv.imread("Image/face1.jpg")
cv.imshow("Image",Image)
Image_resize = cv.resize(Image,dsize=(200,200))
cv.imshow("ResizeImage",Image_resize)
cv.waitKey(0)
cv.destroyAllWindows()

картина прямоугольник

import cv2.cv2 as cv
img = cv.imread('Image/face1.jpg')
x,y,w,h = 100,100,100,100 #起始坐标
#绘制矩形
cv.rectangle(img,(x,y,x+w,y+h),color=(0,0,255),thickness=1) # 方框颜色,粗细
#绘制圆形
cv.circle(img,center=(x+w,y+h),radius=100,color=(255,0,0),thickness=5)
#显示
cv.imshow('re_img',img)
cv.waitKey(0)
cv.destroyAllWindows()

Распознавание лиц

#导入cv模块
import cv2.cv2 as cv
import cv2.data as data

#读取图像
img = cv.imread('Image/face1.jpg')
gary = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
face_detect = cv.CascadeClassifier(data.haarcascades+"haarcascade_frontalface_alt2.xml")
face = face_detect.detectMultiScale(gary)
for x,y,w,h in face:
    cv.rectangle(img,(x,y),(x+w,y+h),color=(0,0,255),thickness=2)
cv.imshow('result',img)

cv.waitKey(0)
#释放内存
cv.destroyAllWindows()

Описание функции

gary = cv.cvtColor(img,cv.COLOR_BGR2GRAY) бинаризировать изображение

face_detect = cv.CascadeClassifier(data.haarcascades+"haarcascade_frontalface_alt2.xml") Это нужно для загрузки и использования модели, обученной другими, для извлечения аватара, чтобы помочь нам извлечь лицо изображения, в дополнение к извлечению человеческих глаз и так далее.

face = face_detect.detectMultiScale(gary) извлекает размер и положение лица в соответствии с моделью и возвращает кортеж

фокус

face = face_detect.detectMultiScale(gary,1.01,5,0,(100,100),(300,300))
还可以这样用,1.01表示图片缩放倍数
5对比次数,意思是对比了五次还是一样的话就认为是人脸
0默认参数不用管,加上
(100,100) (300,300) 表示人脸的范围,这个可以设置
这些参数都可以不设置,直接使用默认的
face_detect = cv.CascadeClassifier(data.haarcascades+"haarcascade_frontalface_alt2.xml")
这里加载的模型其实是在虚拟环境下的site-pakges里面找到的

在这里插入图片描述Кроме того, если вы установили opencv, вы также можете найти его в каталоге установки opencv и можете использовать любой из них. Например, я установил его на диск D

face_detect = cv.CascadeClassifier('D:/opencv/opencv/sources/data/haarcascades/haarcascade_frontalface_alt2.xml')

Я заполняю путь напрямую Рекомендуется использовать значение по умолчанию напрямую.

 face_detect = 
 cv.CascadeClassifier(data.haarcascades+"haarcascade_frontalface_default.x")

Прочитать лицо аннотации к видео

cap = cv.VideoCapture(0) 读取摄像头
#导入cv模块
import cv2.cv2 as cv
import cv2.data as data
import time
#检测函数
def face_detect_demo(img):
    gary = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
    face_detect = cv.CascadeClassifier(data.haarcascades+"haarcascade_frontalface_default.xml")
    face = face_detect.detectMultiScale(gary)
    for x,y,w,h in face:
        cv.rectangle(img,(x,y),(x+w,y+h),color=(0,0,255),thickness=2)
    cv.imshow('result',img)
    

cap = cv.VideoCapture(0)
while True:
    flag, img = cap.read()
    if not flag:
        break
    face_detect_demo(img)
    if ord('q') == cv.waitKey(1):
        break
cap.release() #释放视像头内存
#释放内存
cv.destroyAllWindows()

В настоящее время считывается видеоинформация камеры.Если путь заполнен напрямую, содержимое видео будет считываться для аннотации лица.

распознавание лица

До сих пор было возможно извлечь лицо из видео или изображения (фактически, на текущем этапе удалось реализовать горячий плагин AI несколько дней назад, но используемая в настоящее время модель распознавания не очень хороша, если вы хотите использовать его, вам нужна специальная подготовка.Затем, в сочетании с периферийным драйвером, мы возвращаем координаты полученной головы сюда.Для большего количества игровых характеристик, мы должны вычислить смещение отдачи огнестрельного оружия, а затем водить курсором прицеливаться и стрелять.Принцип работы плагина на самом деле аналогичный,но он чужой.Координаты фиксируются прямо в памяти,не нами,но и через распознавание лиц)

ввод информации о лице

Для распознавания лиц необходимо записывать информацию о лице.Здесь есть два решения, одно это непосредственно подготовить картинку (то есть фотографию лица, которое нужно записать) или записать ее через камеру, т.к. нужно вызвать камеру, когда мы ее распознаем, поэтому рекомендуется начинать запись с камеры. Первый план заключается в подготовке фотографий, а второй план может смотреть на следующий код:

import cv2.cv2 as cv2
import os
import threading

name = None
save_flag = False
lock = threading.Lock()
def input_name():
    global name,save_flag
    while 1:
        if name =="Q" or name=="q":
            return
        else:
            name=input("\n:")
            save_flag = True


def Get_Face():
    global name,save_flag
    cap = cv2.VideoCapture(0)
    num = 1

    Path_save = r"Image/InPutImg/"
    if not os.path.exists(Path_save):
        os.makedirs(Path_save)

    while(1):
        ret_flag,VImg = cap.read()
        cv2.imshow("Capture_Test",VImg)
        cv2.waitKey(1)
        lock.acquire()
        if name:
            if name == "Q" or name == "q":
                lock.release()
                return
            if save_flag:
                cv2.imwrite(Path_save+str(num)+"."+name+".jpg",VImg)
                print("\n图片已保存:"+str(num)+"."+name+".jpg")
                num += 1
            save_flag = False

        lock.release()
    cap.release()
    cv2.destroyAllWindows()

if __name__=="__main__":
    t1 = threading.Thread(target=Get_Face)
    t2 = threading.Thread(target=input_name)
    t1.start()
    t2.start()


Здесь открывается дополнительный поток для управления вводом, но отображение не может быть синхронизировано, и оно будет заблокировано, когда это будет сделано~ После этого в папке проекта появится дополнительный файл

在这里插入图片描述Он содержит лица, захваченные камерой.

обучение данным

Это повторяет предыдущие шаги Извлеките лицо из полученного изображения, а затем обучите соответствующее лицо и идентификатор персонажа.

import os
import cv2.cv2 as cv
import numpy as np
import cv2.data as data
def getImageIds(path):
    #函数作用是提取人脸然后返回人物的人脸和id
    faceseare=[] # 保存检测出的人脸
    ids=[] #
    imagePaths=[os.path.join(path,f) for f in os.listdir(path)]
    #人脸检测
    face_detector = cv.CascadeClassifier(data.haarcascades+"haarcascade_frontalface_default.xml")
    if imagePaths:
        print('训练图片为:',imagePaths)
    else:
        print("请先录入人脸")
        return

    for imagePath in imagePaths:
        #二值化处理
        img = cv.imread(imagePath)
        img=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
        img_numpy=np.array(img,'uint8')#获取图片矩阵

        faces = face_detector.detectMultiScale(img_numpy)

        id = int(os.path.split(imagePath)[1].split('.')[0])

        for x,y,w,h in faces:
            ids.append(id)
            faceseare.append(img_numpy[y:y+h,x:x+w])
        print('已获取id:', id)

    return faceseare,ids

if __name__ == '__main__':
    #图片路径
    path='Image/InPutImg'
    #获取图像数组和id标签数组和姓名
    faces,ids=getImageIds(path)
    #获取训练对象
    recognizer=cv.face.LBPHFaceRecognizer_create()
    recognizer.train(faces,np.array(ids)) #把对应的人脸和id联系起来训练
    #保存训练文件
    model_save = "trainer/"
    if not os.path.exists(model_save):
        os.makedirs(model_save)
    recognizer.write('trainer/trainer.yml')

распознавание лица

Это последний шаг, главное выявить по забиву

import cv2.cv2 as cv
import os
import cv2.data as data

recogizer=cv.face.LBPHFaceRecognizer_create()#加载训练数据集文件
recogizer.read('trainer/trainer.yml')
names=[]
warningtime = 0

#准备识别的图片
def face_detect_demo(img):
    global warningtime
    gray=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
    face_detector=cv.CascadeClassifier(data.haarcascades+"haarcascade_frontalface_default.xm")
    face=face_detector.detectMultiScale(gray)
    for x,y,w,h in face:
        cv.rectangle(img,(x,y),(x+w,y+h),color=(0,0,255),thickness=2)
        cv.circle(img,center=(x+w//2,y+h//2),radius=w//2,color=(0,255,0),thickness=1)

        # 人脸识别
        ids, confidence = recogizer.predict(gray[y:y + h, x:x + w])

        if confidence > 80: #评分越大可信度越低
            warningtime += 1
            if warningtime > 100:
               warningtime = 0
               print("未识别出此人") #这块的话其实可以再搞一套对应的惩罚机制
            cv.putText(img, 'unkonw', (x + 10, y - 10), cv.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)
        else:
        #这里也对应一套识别后的机制
            cv.putText(img,str(names[ids-1]), (x + 10, y - 10), cv.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)
    cv.imshow('result',img)


def get_name(names):
    path = 'Image/InPutImg/'

    imagePaths=[os.path.join(path,f) for f in os.listdir(path)]
    for imagePath in imagePaths:
       name = str(os.path.split(imagePath)[1].split('.',2)[1])
       names.append(name)


cap=cv.VideoCapture(0)
get_name(names)
while True:
    flag,frame=cap.read()
    if not flag:
        break
    face_detect_demo(frame)
    if ord(' ') == cv.waitKey(10): #按下空格关了
        break
cap.release()
cv.destroyAllWindows()


Ниже представлена ​​демонстрация. 1. Картинка введена在这里插入图片描述

1.lena.jpg

Эффект:在这里插入图片描述На этом этапе самая основная идентификация была выполнена.Что касается механизма наказания здесь или механизма после идентификации, если вы можете объединить его с Raspberry Pi, вы можете создать специальную систему контроля доступа для спальни.