人脸识别:史上最详细人脸识别adaface讲解-模型训练与测试--第二节

4 篇文章 2 订阅
4 篇文章 1 订阅

这章节我会讲解的是我在工作上的项目,人脸识别adaface,以下的讲解为个人的看法,若有地方说错的我会第一时间纠正,如果觉得博主讲解的还可以的话点个赞,就是对我最大的鼓励~

上一章节,我们谈到了如何下载资源和制作训练的数据集,我相信大家处理后的结果和我下面的一样(如下图),这个图像有500w+张,我就不打开这个文件夹给大家看了,好了,我们现在开始我们的模型训练了,模型能正常打通训练,才能做别的东西,如果你训练都训不起来,那谈什么修改网络啥的呢,对吧~

在这里插入图片描述

现在我们开始看一下配置文件是怎样的,打开config.py可以看到,参数有很多,我们主要讲一下我们所调的,没有注释的默认就好。

    parent_parser = argparse.ArgumentParser(add_help=False)
    #数据集路径
    parent_parser.add_argument('--data_root', type=str, default='')
    #训练数据集的路径
    parent_parser.add_argument('--train_data_path', type=str, default='faces_emore/imgs')
    #验证集的路径
    parent_parser.add_argument('--val_data_path', type=str, default='faces_emore')
    #训练数据集
    parent_parser.add_argument('--train_data_subset', action='store_true')
    parent_parser.add_argument('--prefix', type=str, default='default')
    #使用多少个gpu进行训练
    parent_parser.add_argument('--gpus', type=int, default=1, help='how many gpus')
    #用多卡多机进行训练
    parent_parser.add_argument('--distributed_backend', type=str, default='ddp', choices=('dp', 'ddp', 'ddp2'),)
    parent_parser.add_argument('--use_16bit', action='store_true', help='if true uses 16 bit precision')
    #训练的一个总epoch
    parent_parser.add_argument('--epochs', default=26, type=int, metavar='N', help='number of total epochs to run')
    parent_parser.add_argument('--seed', type=int, default=42, help='seed for initializing training.')
    #训练一个epoch所用到的图片,这里面是指一共训练的多少张图片,如果用多卡的话,就要一张卡可以训练的图片数量乘以几张卡。
    #例如两张卡的话,一张卡能训256张图,两张卡就是2*256=512,那么下面就填512。
    parent_parser.add_argument('--batch_size', default=256, type=int,
                               help='mini-batch size (default: 256), this is the total '
                                    'batch size of all GPUs on the current node when '
                                    'using Data Parallel or Distributed Data Parallel')
    #学习率
    parent_parser.add_argument('--lr',help='learning rate',default=0.002, type=float)
    #在epoch=12、20、24的时候进行一个学习率的下降
    parent_parser.add_argument('--lr_milestones', default='12,20,24', type=str, help='epochs for reducing LR')
    parent_parser.add_argument('--lr_gamma', default=0.1, type=float, help='multiply when reducing LR')
    #线程数量
    parent_parser.add_argument('--num_workers', default=36, type=int)
    parent_parser.add_argument('--fast_dev_run', dest='fast_dev_run', action='store_true')
    parent_parser.add_argument('--evaluate', action='store_true', help='use with start_from_model_statedict')
    parent_parser.add_argument('--resume_from_checkpoint', type=str, default='')
    parent_parser.add_argument('--start_from_model_statedict', type=str, default='')
    #使用ir_18作为主干网络
    parser.add_argument('--arch', default='ir_18')
    parser.add_argument('--momentum', default=0.9, type=float, metavar='M')
    parser.add_argument('--weight_decay', default=1e-4, type=float)

    parser.add_argument('--head', default='adaface', type=str, choices=('adaface'))
    parser.add_argument('--m', default=0.4, type=float)
    parser.add_argument('--h', default=0.333, type=float)
    parser.add_argument('--s', type=float, default=64.0)
    parser.add_argument('--t_alpha', default=0.01, type=float)

    parser.add_argument('--low_res_augmentation_prob', default=0.2, type=float)
    parser.add_argument('--crop_augmentation_prob', default=0.2, type=float)
    parser.add_argument('--photometric_augmentation_prob', default=0.2, type=float)

    parser.add_argument('--accumulate_grad_batches', type=int, default=1)
    parser.add_argument('--test_run', action='store_true')
    parser.add_argument('--save_all_models', action='store_true')

1、参数设定好之后,我们就可以开始模型的训练了,运行一下main.py函数,即可开始训练。
2、下图为训练成功时的样子。由于我只是师范一下,我只用了一张卡来训,训练成功后我就kill掉了。
3、最后模型保存的位置在目录下的,experiments文件中,只保存最好的一个模型,如果需要保存全部模型,自行修改一下代码即可。
在这里插入图片描述
在这里插入图片描述
好了,在这里我们模型已经训练出来了,接下来我们看一下测试效果如何。
首先我们看一下推理的代码inference.py。这里我修改了一下源码,直接检测用前面所说的libface算法检测到人脸之后,保存改头像图片,之后进行一个预测,因此只需要改一下图片的输入就可以直接预测了,不需要再经过一个人脸检测的模块,这样速度也会上来。这里我把我自己的代码给分享出来,大家可以参考一下。

import net
import torch
import os
import cv2
from face_alignment import align
import numpy as np


adaface_models = {
    'ir_18':r".\experiments\default_08-01_1\epoch=24-step=142174.ckpt".replace('\\','/'),
}

def load_pretrained_model(architecture='ir_18'):
    # load model and pretrained statedict
    assert architecture in adaface_models.keys()
    model = net.build_model(architecture)
    statedict = torch.load(adaface_models[architecture])['state_dict']
    model_statedict = {key[6:]:val for key, val in statedict.items() if key.startswith('model.')}
    model.load_state_dict(model_statedict)
    model.eval()
    return model

def to_input(pil_rgb_image):
    np_img = np.array(pil_rgb_image)
    brg_img = ((np_img[:,:,::-1] / 255.) - 0.5) / 0.5
    tensor = torch.tensor([brg_img.transpose(2,0,1)]).float()
    return tensor

if __name__ == '__main__':

    model = load_pretrained_model('ir_18')
    feature, norm = model(torch.randn(1,3,112,112))

    test_image_path = 'face_alignment/test'
    features = []
    for fname in sorted(os.listdir(test_image_path)):
        # img = cv2.imread(os.path.join(test_image_path, fname))
        # img = torch.from_numpy(img)
        img = cv2.imread(os.path.join(test_image_path, fname))
        img = np.expand_dims(img, axis=0)
        img = img.astype(np.float32)
        img = img.transpose(0, 3, 1, 2)
        img = torch.from_numpy(img)
        # aligned_rgb_img = align.get_aligned_face(path)
        # bgr_tensor_input = to_input(aligned_rgb_img)

        feature, _ = model(img)
        features.append(feature)

    similarity_scores = torch.cat(features) @ torch.cat(features).T
    print(similarity_scores)

这里用到的三张图片,预测结果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
这里我给大家讲述一下这个输出结果,我们看做这个矩阵为3*3,行就是1 2 3,竖也是1 2 3,这样我们可以看做,第一张图片跟第一张图片的相似度为 1 ,因为是自己跟自己对比,肯定是1,然后第一张图片跟第二张图片对比的相似度为0.4200,第一张图片跟第三张图片对比的相似度为0.2764,如此类推……0.3713的相似度为第二张图片跟第三张图片对比的结果。

到这里我们的模型训练和测试已经告一段落啦,相信大家都已经完成了这不操作,接下来我会分享我自己编写的转onnx代码,因为作者这里没有提供,本人纯手工编写。希望大家能多多支持。如果觉得博主讲解的可以的话,点个赞就是我最大的动力,谢谢~
  • 9
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
本文将介绍如何使用OpenCV进行人脸识别模型训练。 1. 收集人脸数据 首先需要准备一些标记了人脸的图像,可以通过人工标注或使用自动化工具来收集。要求每个人的数据独立,没有与其他人的数据交叠。对于每个人,建议至少收集15张标记了人脸的图像。 2. 准备数据集 将数据集按照以下格式进行组织: ``` data/ person1/ image1.jpg image2.jpg ... person2/ image1.jpg image2.jpg ... ... ``` 3. 训练模型 使用OpenCV中的 `cv2.face.LBPHFaceRecognizer_create()` 函数进行模型训练。此函数需要接收两个参数,打开数据集后,第一个是训练图像列表,第二个是标记列表。 一旦模型训练完成,可以将它保存下来以备后续使用。 以下是示例代码: ```python import cv2 import os # 准备数据集 data_dir = "data" labels = [] images = [] for subdir in os.listdir(data_dir): subdir_path = os.path.join(data_dir, subdir) if os.path.isdir(subdir_path): label = int(subdir[1:]) for filename in os.listdir(subdir_path): image_path = os.path.join(subdir_path, filename) image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE) images.append(image) labels.append(label) # 训练模型 face_recognizer = cv2.face.LBPHFaceRecognizer_create() face_recognizer.train(images, labels) # 保存模型 model_file = "face_recognizer.yml" face_recognizer.write(model_file) print("Model Trained") ``` 以上代码将在 `data` 目录中查找子目录 `person1`, `person2` 等人的图像。`cv2.imread()` 函数读取图像并将其添加到图像列表中,同时将标签添加到相应的标签列表中。然后通过 `cv2.face.LBPHFaceRecognizer_create()` 函数来创建一个人脸识别器,并调用 `train()` 函数以训练识别器。最后,使用 `write()` 函数将模型保存到文件中。 4. 使用模型 训练完成后,可以使用以下代码来使用模型: ```python import cv2 # 加载模型 model_file = "face_recognizer.yml" face_recognizer = cv2.face.LBPHFaceRecognizer_create() face_recognizer.read(model_file) # 读取图像并进行人脸识别 image = cv2.imread("test_image.jpg", cv2.IMREAD_GRAYSCALE) label = face_recognizer.predict(image)[0] ``` 使用 `cv2.face.LBPHFaceRecognizer_create()` 函数加载模型,然后再使用 `read()` 函数加载已保存的模型。要对新图像进行预测,读取图像并使用 `predict()` 函数进行预测。该函数将返回一个元组 (label, confidence) ,其中 label 是预测的标签,confidence 是模型的置信度。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值