[딥러닝 사례 소개 2] 컨볼루션 신경망과 케라스 기반 얼굴인식 모델 구축

기사 디렉토리

1. 도구 및 환경

2. 딥러닝 환경 구축

3. 합성곱 신경망 기반 얼굴인식 모델 구축 및 테스트

1. 핵심 코드

1단계: 데이터 레이블 0과 1에 각각 해당하는 자신과 다른 사람의 얼굴 특징 데이터 수집

 2단계: 얼굴 특징을 인식하는 모델 훈련 및 모델을 .h5 형식의 파일로 저장

 3단계: .h5 파일 형식의 얼굴 인식 모델을 읽고, 카메라에 기록된 얼굴 이미지를 인식합니다.

2. 인정의 기본원칙

3. 실행 및 테스트

1단계: 자신과 다른 사람의 얼굴 특징 데이터 수집(컴퓨터 카메라를 켜야 합니다. 그렇지 않으면 오류가 보고됩니다!)

2단계: 얼굴 데이터 모델 교육 10회 수행

3단계: 얼굴 인식 및 비교 테스트

4. 분석 및 요약

참조 기사


1. 도구 및 환경

  • 파이참 2022.1.4
  • 콘다 버전 : 4.5.4
  • 파이썬 버전 : 3.6.5.final.0
  • 플랫폼: win-64

2. 딥러닝 환경 구축

자세한 내용은 제가 쓴 이 글의 두 번째 부분을 참조하시기 바랍니다.

[딥러닝 사례 소개 1] Keras 기반 필기 디지털 이미지 인식 icon-default.png?t=N4P3https://blog.csdn.net/qq_52487066/article/details/131048466?spm=1001.2014.3001.5501 환경 구축다음을 다운로드 받아야 합니다. toolkit , Anaconda Prompt에서 다음 명령을 차례로 실행합니다.

conda install py-opencv -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install dlib==19.7.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install face_recognition -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install Pillow -i https://pypi.tuna.tsinghua.edu.cn/simple

툴킷 다운로드 및 가져오기가 완료되었으며, 프로젝트 구축 및 운영은 다음과 같습니다.


3. 합성곱 신경망 기반 얼굴인식 모델 구축 및 테스트

1. 핵심 코드

1단계: 데이터 레이블 0과 1 에 각각 해당하는 자신과 다른 사람의 얼굴 특징 데이터 수집

get_my_face.py

import cv2
import dlib
import os
import random

output_dir = './my_crop_faces'
size = 160
if not os.path.exists(output_dir):
    os.makedirs(output_dir)

# 改变图片的亮度与对比度
def relight(img, light=1, bias=0):
    w = img.shape[1]
    h = img.shape[0]
    #image = []
    for i in range(0,w):
        for j in range(0,h):
            for c in range(3):
                tmp = int(img[j,i,c]*light + bias)
                if tmp > 255:
                    tmp = 255
                elif tmp < 0:
                    tmp = 0
                img[j,i,c] = tmp
    return img

#使用dlib自带的frontal_face_detector作为我们的特征提取器
detector = dlib.get_frontal_face_detector()
# 打开摄像头 参数为输入流,可以为摄像头或视频文件
camera = cv2.VideoCapture(0)

index = 0
while True:
    if (index <= 1000):
        print('Being processed picture %s' % index)
        # 从摄像头读取照片
        success, img = camera.read()
        # 转为灰度图片
        gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        # 使用detector进行人脸检测
        dets = detector(gray_img, 1)

        for i, d in enumerate(dets):
            x1 = d.top() if d.top() > 0 else 0
            y1 = d.bottom() if d.bottom() > 0 else 0
            x2 = d.left() if d.left() > 0 else 0
            y2 = d.right() if d.right() > 0 else 0

            face = img[x1:y1,x2:y2]
            # 调整图片的对比度与亮度, 对比度与亮度值都取随机数,这样能增加样本的多样性
            face = relight(face, random.uniform(0.5, 1.5), random.randint(-50, 50))
            face = cv2.resize(face, (size,size))
            cv2.imshow('image', face)
            cv2.imwrite(output_dir+'/'+str(index)+'.jpg', face)
            index += 1
        key = cv2.waitKey(30) & 0xff
        if key == 27:
            break
    else:
        print('Finished!')
        break

 2단계: 얼굴 특징을 인식하는 모델 훈련 및 모델을 .h5 형식의 파일 로 저장

model_train.py

#-*- coding: utf-8 -*-
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Convolution2D, MaxPooling2D
from keras.optimizers import SGD
from keras.utils import np_utils
import os
import cv2
import numpy as np
from sklearn.model_selection import train_test_split
import random

def get_files(input_dir):
    file_list = []
    for (path, dirnames, filenames) in os.walk(input_dir):
        # print(path) #输出对应顶层文件夹
        # print(dirnames)#在当前文件夹下的文件夹
        # print(filenames)#在当前文件夹下的文件夹
        for filename in filenames:
            if filename.endswith('.jpg') or filename.endswith('.bmp'):
                # print(filename)
                full_path = os.path.join(path, filename)
                # print(full_path)
                file_list.append(full_path)
    return file_list

#设置hujianhua文件夹的对应标签为0
def getPaddingSize(img):
    h, w, _ = img.shape
    top, bottom, left, right = (0,0,0,0)
    longest = max(h, w)

    if w < longest:
        tmp = longest - w
        # //表示整除符号
        left = tmp // 2
        right = tmp - left
    elif h < longest:
        tmp = longest - h
        top = tmp // 2
        bottom = tmp - top
    else:
        pass
    return top, bottom, left, right

def read_img_label(file_list, label):
    size = 64
    imgs = []
    labs = []
    #01
    num = 0
    for filename in file_list:
        # print(filename)
        img = cv2.imread(filename)
        # print(img.shape)
        top, bottom, left, right = getPaddingSize(img)
        # 将图片放大, 扩充图片边缘部分
        img = cv2.copyMakeBorder(img, top, bottom, left, right, cv2.BORDER_CONSTANT, value=[0, 0, 0])
        img = cv2.resize(img, (size, size))
        imgs.append(img)
        labs.append(label)
        num = num + 1

    # print(len(imgs))
    # print(len(labs))
    return imgs, labs


def read_dataset():
    input_dir = "./data_collection/my_crop_faces"


    all_imgs_list = []
    all_label_list = []
    my_file_list = get_files(input_dir)
    # 0->[0,1] 1->[1,0]
    label = 0 #[0, 1]
    my_imgs_list, my_labs_list = read_img_label(my_file_list, label)

    input_dir = "./data_collection/others_img_crop"

    others_file_list = get_files(input_dir)
    label = 1 #[1, 0] #->0
    others_imgs_list, others_labs_list = read_img_label(others_file_list, label)

    for img in my_imgs_list:
        all_imgs_list.append(img)
    for img in others_imgs_list:
        all_imgs_list.append(img)

    for label in my_labs_list:
        all_label_list.append(label)
    for label in others_labs_list:
        all_label_list.append(label)

    imgs_array = np.array(all_imgs_list)
    # print(imgs_array.shape)

    labs_array = np.array(all_label_list)
    # print(labs_array.shape)

    return imgs_array,labs_array


#加载数据集并按照交叉验证的原则划分数据集并进行相关预处理工作
def load_data(img_rows = 64, img_cols = 64,
         img_channels = 3, nb_classes = 2):
    #加载数据集到内存
    images, labels = read_dataset()
    print(images.shape)
    print(labels.shape)

    train_images, valid_images, train_labels, valid_labels = train_test_split(images, labels, test_size = 0.3, random_state = random.randint(0, 100))
    _, test_images, _, test_labels = train_test_split(images, labels, test_size = 0.5, random_state = random.randint(0, 100))

    train_images = train_images.reshape(train_images.shape[0], img_rows, img_cols, img_channels)
    valid_images = valid_images.reshape(valid_images.shape[0], img_rows, img_cols, img_channels)
    test_images = test_images.reshape(test_images.shape[0], img_rows, img_cols, img_channels)
    input_shape = (img_rows, img_cols, img_channels)

    #输出训练集、验证集、测试集的数量
    print(train_images.shape[0], 'train samples')
    print(valid_images.shape[0], 'valid samples')
    print(test_images.shape[0], 'test samples')

    #我们的模型使用categorical_crossentropy作为损失函数,因此需要根据类别数量nb_classes将
    #类别标签进行one-hot编码使其向量化,在这里我们的类别只有两种,经过转化后标签数据变为二维
    train_labels = np_utils.to_categorical(train_labels, nb_classes)
    valid_labels = np_utils.to_categorical(valid_labels, nb_classes)
    test_labels = np_utils.to_categorical(test_labels, nb_classes)
    print(train_labels.shape)
    print(valid_labels.shape)
    print(test_labels.shape)
    #像素数据浮点化以便归一化
    train_images = train_images.astype('float32')
    valid_images = valid_images.astype('float32')
    test_images = test_images.astype('float32')

    #将其归一化,图像的各像素值归一化到0~1区间
    train_images /= 255
    valid_images /= 255
    test_images /= 255

    return train_images, train_labels, valid_images, valid_labels, test_images, test_labels

#建立模型
def build_model(nb_classes = 2):
    #构建一个空的网络模型,它是一个线性堆叠模型,各神经网络层会被顺序添加,专业名称为序贯模型或线性堆叠模型
    model = Sequential()

    #以下代码将顺序添加CNN网络需要的各层,一个add就是一个网络层
    model.add(Convolution2D(32, 3, 3, border_mode='same',
                                 input_shape =  (64, 64, 3)))    #1 2维卷积层
    model.add(Activation('relu'))                                  #2 激活函数层

    model.add(Convolution2D(32, 3, 3))                             #3 2维卷积层
    model.add(Activation('relu'))                                  #4 激活函数层

    model.add(MaxPooling2D(pool_size=(2, 2)))                      #5 池化层
    model.add(Dropout(0.25))                                       #6 Dropout层

    model.add(Convolution2D(64, 3, 3, border_mode='same'))         #7  2维卷积层
    model.add(Activation('relu'))                                  #8  激活函数层

    model.add(Convolution2D(64, 3, 3))                             #9  2维卷积层
    model.add(Activation('relu'))                                  #10 激活函数层

    model.add(MaxPooling2D(pool_size=(2, 2)))                      #11 池化层
    model.add(Dropout(0.25))                                       #12 Dropout层

    model.add(Flatten())                                           #13 Flatten层
    model.add(Dense(512))                                          #14 Dense层,又被称作全连接层
    model.add(Activation('relu'))                                  #15 激活函数层
    model.add(Dropout(0.5))                                        #16 Dropout层
    model.add(Dense(nb_classes))                                   #17 Dense层
    model.add(Activation('softmax'))                               #18 分类层,输出最终结果
    #输出模型概况
    print(model.summary())
    return model

model = build_model()

sgd = SGD(lr=0.01, decay=1e-6,
          momentum=0.9, nesterov=True)  # 采用SGD+momentum的优化器进行训练,首先生成一个优化器对象
model.compile(loss='categorical_crossentropy',
                   optimizer=sgd,
                   metrics=['accuracy'])  # 完成实际的模型配置工作

train_images, train_labels, valid_images, valid_labels, test_images, test_labels = load_data()

batch_size = 20
nb_epoch = 10
train_history = model.fit(train_images,
               train_labels,
               batch_size=batch_size,
               nb_epoch=nb_epoch,
               validation_data=(valid_images, valid_labels),
               shuffle=True)

scores = model.evaluate(test_images, test_labels)
print('accuracy=', scores[1])
prediction = model.predict_classes(test_images)
# print(prediction)
model.save('./me.face.model.h5')

 3단계: .h5 파일 형식의 얼굴 인식 모델을 읽고, 카메라에 기록된 얼굴 이미지를 인식합니다.

video_predict.py

import cv2
import dlib
from keras.models import load_model
import sys

size = 64

# 使用dlib自带的frontal_face_detector作为我们的特征提取器
detector = dlib.get_frontal_face_detector()

cam = cv2.VideoCapture(0)

model = load_model('./me.face.model.h5')

while True:
    _, img = cam.read()
    gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    dets = detector(gray_image, 1)
    for i, d in enumerate(dets):
        x1 = d.top() if d.top() > 0 else 0
        y1 = d.bottom() if d.bottom() > 0 else 0
        x2 = d.left() if d.left() > 0 else 0
        y2 = d.right() if d.right() > 0 else 0
        face = img[x1:y1, x2:y2]
        # 调整图片的尺寸
        face = cv2.resize(face, (size, size))
        shape_img = (face.reshape(1, size, size, 3)).astype('float32') / 255

        prediction = model.predict_classes(shape_img)
        print(prediction[0])
        name = "unknown"
        if prediction[0] == 0:
            print("识别出本人")
            name = "Aricl."
        else:
            print("不是本人")
            name = "unknown"
        cv2.rectangle(img, (x2, x1), (y2, y1), (255, 0, 0), 3)
        font = cv2.FONT_HERSHEY_SIMPLEX
        cv2.putText(img, name, (x2, x1), font, 0.8, (255, 255, 255), 1)

    cv2.imshow('image', img)
    key = cv2.waitKey(30) & 0xff
    if key == 27:
        sys.exit(0)

2. 인정의 기본원칙

        핵심 중 하나는 이미지 처리를 위한 오픈 소스 컴퓨터 비전 라이브러리인 OpenCV(Open source Computer Vision Library)를 사용하는 것입니다.

        컴퓨터 비전에 대한 오픈 소스 API 함수 라이브러리 모음입니다 . 즉, (1) 과학적 연구든 상업적 응용이든 개발에 사용할 수 있습니다. (2) 모든 API 기능의 소스 코드는 공개되며 내부 구현의 프로그램 단계를 볼 수 있습니다.(3 ) OpenCV의 소스 코드를 수정하여 필요한 특정 API 함수를 컴파일하고 생성할 수 있습니다. 그러나 라이브러리로서 제공하는 것은 일반적으로 사용되는 일부 고전적이고 인기 있는 알고리즘의 API일 뿐입니다.

        일반적인 컴퓨터 비전 알고리즘에는 일반적으로 다음 단계가 포함됩니다.

  1. 데이터 수집
  2. 전처리
  3. 특징 추출
  4. 기능 선택
  5. 분류기 설계 및 교육
  6. 분류

이 여섯 부분에 대해 OpenCV는 개발자가 호출할 수 있는 API를 제공합니다.

        두 번째 핵심은 Keras를 사용하여 컨볼루션 신경망을 구축하는 것 입니다 .

        Keras는 인공 지능을 위한 비교적 좋은 진입 프레임워크입니다. TensorFlow에 기본 프레임워크로 추가된 고급 Python 신경망 프레임워크 로 TensorFlow용 고급 API를 제공합니다.

        TensorFlow를 프로그래밍 세계의 Java 또는 C++에 비유한다면 Keras는 프로그래밍 세계의 Python이며 TensorFlow의 고급 패키지 로 TensorFlow와 함께 사용하여 모델을 빠르게 구축할 수 있습니다.

        그리고 Keras는 TensorFlow에서 공식적으로 지원합니다. 머신에 사용 가능한 GPU가 있으면 코드는 병렬 컴퓨팅을 위해 GPU를 자동으로 호출합니다. 이는 매우 강력합니다!

3. 실행 및 테스트

1단계: 자신과 다른 사람의 얼굴 특징 데이터 수집(컴퓨터 카메라를 켜야 합니다. 그렇지 않으면 오류가 보고됩니다!)

 

2단계: 얼굴 데이터 모델 교육 10회 수행

3단계: 얼굴 인식 및 비교 테스트

위 사진은 저(블로거 Aricl.)이고, 아래 사진은 제 룸메이트(알 수 없는 얼굴)인데, 여전히 얼굴 인식 정확도가 좋은 것을 알 수 있습니다!


4. 분석 및 요약

        이번에는 컨볼루션 신경망과 Keras를 기반으로 얼굴 인식 모델을 구축하여 구현의 기본 원칙은 Python의 OpenCV 라이브러리를 참조하고 그 안의 얼굴 분류기를 호출 한 다음 컴퓨터의 카메라를 호출하여 단일 프레임 을 읽는 것입니다. 루프의 데이터 실시간 얼굴 감지를 수행하고 얼굴의 프레임을 만들고 정보를 표시합니다.

        먼저 얼굴 데이터를 수집해야 합니다. 본인 등의 얼굴 특징 데이터 총 1,000개 수집 완료 후 데이터 모델 학습 총 10회 학습 , 6,000회 이상의 교육을 통해 좋은 모델은 .h5 형식 파일 로 저장됩니다 . 그런 다음 카메라를 호출하여 각 프레임의 얼굴 사진을 읽고, 사진을 그레이스케일하고, 얼굴을 감지하고 해당 영역의 프레임을 지정하고, 얼굴 인식 및 비교를 위해 .h5 얼굴 인식 모델 파일을 읽고, 위의 정보를 개인 또는 알 수 없음으로 표시합니다.

        또한 채집 시 채집할 인물과 환경에 대한 일정한 요구사항이 있는데, 카메라가 얼굴을 선명하게 볼 수 있도록 빛이 밝아야 하며 얼굴이 카메라를 향하여 채집된 얼굴 특징이 데이터가 더 정확 하고 인식 효과가 더 좋습니다 .

        이번에는 얼굴인식에 대한 예비 입문일 뿐이고 배우는 것에 대한 관심이 크지만 블로거가 대학원 입시를 준비하고 있어서 예비적인 이해밖에 할 수 없습니다. 앞으로도 관련 기술을 배우고 연구하겠습니다. 이 분야에서 기회가 있을 때 어서! !

참조 기사

icon-default.png?t=N4P3Python+Keras+ opencv 로 얼굴인식 실현 %84%E5%BB%BA%E4%BA%BA%E8%84%B8%E8%AF%86%E5%88%AB%E6%A8%A1%E5%9E%8B&utm_medium=distribute.pc_search_result. 없음 -task-blog-2~all~sobaiduweb~default-3-91038858.nonecase&spm=1018.2226.3001.4187 얼굴 감지 및 인식 Python 구현 시리즈(5) - keras 라이브러리를 사용하여 얼굴 인식 모델 학습icon-default.png?t=N4P3https://blog.csdn.net/weixin_44491431/article/details/113839543?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168601107216800185824691%2522%252C %2522s cm%2522%253A%252220140713.130102334..%2522%257D&request_id =168601107216800185824691&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-113839543-null-null.142^v88^control_2,239^v2^insert_chatgpt &utm_term=%E4 %BD%BF % E7%94%A8케라스%E6%9E%84%E5%BB%BA%E4%BA%BA%E8%84%B8%E8%AF%86%E5%88%AB%E6%A8%A1%E5 % 9E%8B&spm=1018.2226.3001.4187 Keras를 사용하여 얼굴 인식 및 인식하는 방법을 알려줍니다.icon-default.png?t=N4P3https://blog.csdn.net/m0_55479420/article/details/115268470?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168601107216800185824691%2522%252C%2522scm %2522%253A%252220140713.130102334..%2522%257D&request_id =168601107216800185824691&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-115268470-null-null.142^v88^control_2,239^v2^insert_chatgpt&utm_term=%E4 %BD%BF% E7%94%A8케라스%E6%9E%84%E5%BB%BA%E4%BA%BA%E8%84%B8%E8%AF%86%E5%88%AB%E6%A8%A1%E5% 9E%8B&spm=1018.2226.3001.4187

추천

출처blog.csdn.net/qq_52487066/article/details/131060004