文章目录

  • 前言
  • 一、干扰因素
    • 1、主动因素
    • 2、固有因素
  • 二、特征点检测
    • 1、PFLD
    • 2、LLCV
  • 三、人脸比对
    • 1、人脸 1:1
    • 2、人脸 1:n
    • 3、人脸 1:N
    • 4、人脸 M:N
  • 四、高清分辨率网络
    • 1、HRNet
  • 五、手部关键点检测
    • 1、分类 + 定位问题
    • 2、2D-3D hand detection

前言

本文为9月6日关键点检测学习笔记——人脸和手部特征点检测,分为五个章节:

  • 干扰因素;
  • 特征点检测;
  • 人脸比对;
  • 高清分辨率网络;
  • 手部关键点检测。

一、干扰因素

1、主动因素

  • 可通过用户简单配合来消除;
  • 系统可通过拒绝识别和质量判断来获取高质量图像。

2、固有因素

  • 现场很难去除的干扰因素,识别器需对其鲁棒。

二、特征点检测

1、PFLD

  • Loss:
    L:=1M∑m=1M∑m=1Nγn∣∣dnm∣∣γn=∑c=1Cωnc∑k=1K(1−cosθnk)∣∣dnm∣∣22\mathcal{L} := \frac{1}{M} \sum_{m=1}^{M} \sum_{m=1}^{N} \gamma_n ||d_n^m||\\ \gamma_n = \sum_{c=1}^{C} \omega _n^c \sum_{k=1}^{K} (1 - cos\theta_n^k) ||d_n^m||_2^2 L:=M1​m=1∑M​m=1∑N​γn​∣∣dnm​∣∣γn​=c=1∑C​ωnc​k=1∑K​(1−cosθnk​)∣∣dnm​∣∣22​
    其中,∣∣dnm∣∣||d_n^m||∣∣dnm​∣∣ 是第 m个输入的第 n个 landmark 的误差;θ1,θ2,θ3(K=3)\theta_1, \theta_2, \theta_3\ (K=3)θ1​,θ2​,θ3​ (K=3) 是 GT 值与 estimated yaw, pitch, and roll angles 间的偏向角;CCC 代表 6个类别:侧脸,正脸,抬头,低头,清晰,模糊。

2、LLCV

8000 点人脸关键点技术。

  • 单张彩色图像或单段视频作为输入;
  • 支持全方位姿态、各种极端表情。

三、人脸比对

1、人脸 1:1

将一张人脸照片与人脸库中的多张人脸逐一比对,将所有人脸全部比对一次。

2、人脸 1:n

  • 静态大库检索,找相似。
  • 图片检索,进行N次(亿级)人脸比对,并留下比分大于阈值的结果。

3、人脸 1:N

4、人脸 M:N

  • 不同人脸库进行比对。
  • 相当于是M个人脸1:N相加的结果。

  • Siamese Network:


四、高清分辨率网络

  • Dilated convolution 空洞卷积:

1、HRNet

  • 并行的高分辨率 ⇒ 低分辨率网络;
  • 多尺度融合。


train.py 代码如下:

import os
import pprint
import argparseimport torch
import torch.nn as nn
import torch.optim as optim
import torch.backends.cudnn as cudnn
from tensorboardX import SummaryWriter
from torch.utils.data import DataLoader
import sys
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
import lib.models as models
from lib.config import config, update_config
from lib.datasets import get_dataset
from lib.core import function
from lib.utils import utilsdef parse_args():parser = argparse.ArgumentParser(description='Train Face Alignment')parser.add_argument('--cfg', help='experiment configuration filename',required=True, type=str)args = parser.parse_args()update_config(config, args)return argsdef main():args = parse_args()logger, final_output_dir, tb_log_dir = \utils.create_logger(config, args.cfg, 'train')logger.info(pprint.pformat(args))logger.info(pprint.pformat(config))cudnn.benchmark = config.CUDNN.BENCHMARKcudnn.determinstic = config.CUDNN.DETERMINISTICcudnn.enabled = config.CUDNN.ENABLEDmodel = models.get_face_alignment_net(config)# copy model fileswriter_dict = {'writer': SummaryWriter(log_dir=tb_log_dir),'train_global_steps': 0,'valid_global_steps': 0,}gpus = list(config.GPUS)model = nn.DataParallel(model, device_ids=gpus).cuda()# losscriterion = torch.nn.MSELoss(size_average=True).cuda()optimizer = utils.get_optimizer(config, model)best_nme = 100last_epoch = config.TRAIN.BEGIN_EPOCHif config.TRAIN.RESUME:model_state_file = os.path.join(final_output_dir,'latest.pth')if os.path.islink(model_state_file):checkpoint = torch.load(model_state_file)last_epoch = checkpoint['epoch']best_nme = checkpoint['best_nme']model.load_state_dict(checkpoint['state_dict'])optimizer.load_state_dict(checkpoint['optimizer'])print("=> loaded checkpoint (epoch {})".format(checkpoint['epoch']))else:print("=> no checkpoint found")if isinstance(config.TRAIN.LR_STEP, list):lr_scheduler = torch.optim.lr_scheduler.MultiStepLR(optimizer, config.TRAIN.LR_STEP,config.TRAIN.LR_FACTOR, last_epoch-1)else:lr_scheduler = torch.optim.lr_scheduler.StepLR(optimizer, config.TRAIN.LR_STEP,config.TRAIN.LR_FACTOR, last_epoch-1)dataset_type = get_dataset(config)train_loader = DataLoader(dataset=dataset_type(config,is_train=True),batch_size=config.TRAIN.BATCH_SIZE_PER_GPU*len(gpus),shuffle=config.TRAIN.SHUFFLE,num_workers=config.WORKERS,pin_memory=config.PIN_MEMORY)val_loader = DataLoader(dataset=dataset_type(config,is_train=False),batch_size=config.TEST.BATCH_SIZE_PER_GPU*len(gpus),shuffle=False,num_workers=config.WORKERS,pin_memory=config.PIN_MEMORY)for epoch in range(last_epoch, config.TRAIN.END_EPOCH):lr_scheduler.step()function.train(config, train_loader, model, criterion,optimizer, epoch, writer_dict)# evaluatenme, predictions = function.validate(config, val_loader, model,criterion, epoch, writer_dict)is_best = nme < best_nmebest_nme = min(nme, best_nme)logger.info('=> saving checkpoint to {}'.format(final_output_dir))print("best:", is_best)utils.save_checkpoint({"state_dict": model,"epoch": epoch + 1,"best_nme": best_nme,"optimizer": optimizer.state_dict(),}, predictions, is_best, final_output_dir, 'checkpoint_{}.pth'.format(epoch))final_model_state_file = os.path.join(final_output_dir,'final_state.pth')logger.info('saving final model state to {}'.format(final_model_state_file))torch.save(model.module.state_dict(), final_model_state_file)writer_dict['writer'].close()if __name__ == '__main__':main()

五、手部关键点检测

1、分类 + 定位问题


2、2D-3D hand detection


9月6日关键点检测学习笔记——人脸和手部特征点检测相关推荐

  1. 9月14日计算机视觉基础学习笔记——基本图像处理

    文章目录 前言 一.计算机视觉的由来 二.计算机如何看到图像 三.计算机处理图像的方式.方法 1.直接从 camera 读取 2.从文件读取 3.生成矩阵显示 四.图像处理 1.颜色空间转换 (1). ...

  2. 9月16日计算机视觉基础学习笔记——认识机器视觉

    文章目录 前言 一.Week 1 homework 1.基本操作 2.滤波 二.从图像处理到计算机视觉 1.反色变换 2.Gamma 变换 3.直方图 & 直方图均衡化 三.计算机视觉的两个步 ...

  3. 【ERP】ERP发展阶段有哪些?对ERP发展各个阶段概念的理解(20年3月29日第二章学习笔记)

    ERP发展历经五大阶段 1.ROP库存订货点法 2.MRP物料需求计划 3.闭环MRP 4.MRPII制造业资源计划 5.ERP企业资源计划 1.ROP库存订货点法 ROP,库存订货点法,很好理解,就 ...

  4. 10月15日计算机视觉基础学习笔记——分割网络的设计

    文章目录 前言 一.分割器的设计 1.优化:减小 feature map 2.上采样 up sampling 二.经典分割模型的涨点方法 前言 本文为10月15日计算机视觉基础学习笔记--分割网络的设 ...

  5. 深度学习笔记(33) 特征点检测

    深度学习笔记(33) 特征点检测 1. 特征点 2. 设定特征点 3. 关键特征点 1. 特征点 利用神经网络进行对象定位,即通过输出四个参数值bx.by.bh和bw给出图片中对象的边界框 概括地说, ...

  6. 人脸和手部特征点检测

    人脸和手部特征点检测 1. Schedule of Face Recognition 2. 人脸识别应用模式 3. Facial Landmark Detection 4. Current 5. 挑战 ...

  7. 【ERP】ERP,MRP和MRPII的关系是怎样的?(20年3月29日第二章学习笔记)

    1.ERP与MRP的关系 MRP与ERP的关系在本人ERP第一章的笔记中已有提及,可以点击超链接跳转观看. 2.ERP与MRPII的关系 从ERP概念的提出公司Gartner Group Inc界定E ...

  8. 1月12日,HTML学习笔记2

    妈蛋,这两天看HTML看上瘾了,感觉这玩意有点简单,反馈期太短了,我的python都荒废了/(ㄒoㄒ)/~~. 不多说了,把记录贴上来,到时过几天再拿出来整理一下,写上注释,顺便当做复习 去研究css ...

  9. 2013年7月28日web前端学习笔记-------head相关标签应用

    7月份快过完了.趁周日写写学过觉得有用的东西. 1.缩略图的展示问题,不要以为缩略图设置了width,height,就是缩略图了.比如一个300kb的500*500原始图片,用户请求web服务器后,展 ...

最新文章

  1. python访问序列元素的编号用什么括起来_Python 序列通用操作介绍
  2. Bezier(贝塞尔曲线)
  3. EF 从sqlserver2008 迁移到 2005出现的BUG
  4. linux .desktop权限,如何在Ubuntu Xenial Xerus 16.04 Linux Desktop上以root用户身份登录
  5. 可到了关键部分的作文
  6. Java 算法 打水问题
  7. 【Elasticsearch】Elasticsearch如何物理删除给定期限的历史数据?
  8. LINUX命令之stat及显示的三个时间戳
  9. 200个化工网站批量爬取
  10. knot DNS 02 Tips - XDP
  11. 关于文件、文件夹加密隐藏原理的一点想法
  12. 《硅谷钢铁侠:埃隆·马斯克的冒险人生》文摘
  13. Windows窗口固定工具
  14. 36个顶级数据分析方法与模型,学会任意1种,都能让你超越95%的人
  15. 基于粒子群算法的PID控制器优化设计
  16. Pytorch - 弹性训练原理
  17. 图解RAM结构与原理,系统内存的Channel、Chip与Bank
  18. On-Demand Resources Guide中文版(按需加载资源--下)
  19. 在澳洲学计算机挣得多吗,2020年澳洲计算机科学专业挂科率高吗?
  20. VMware内CentOS-7-Minimal的安装与配置(详细图文教程)

热门文章

  1. min-height不生效
  2. nginx php permanent,Nginx中的rewrite指令详解(break,last,redirect,permanent)
  3. [转]Go在谷歌:以软件工程为目的的语言设计
  4. PDF应该怎么转换成Excel文档呢?
  5. android五层系统架构,Android系统的五层架构、Dalvik与ART、最后有个奇怪的问题请教orz...
  6. /etc/hosts.allow和/etc/hosts.deny的讲解
  7. 面渣逆袭:MySQL六十六问,两万字+五十图详解!
  8. OpenWrt固件编译
  9. 计算机网络 (2)标准化工作、性能指标、分层结构
  10. Content type 'multipart/form-data;boundary=----WebKitF;charset=UTF-8' not supported