mxnet根据相似度进行人脸样本对图片清理
清理的角度:
找出 ID (gallery) 和它的 prob 最不相似 的 数据 (可能是标注错误,不同ID的数据错误混杂等)
找出 ID 和别的 prob 最相似 的 数据 (可能是标注错误,数据重复拷贝,同一个ID多次采集等)
找出ID与ID之间最相似的。也是为了排除重复数据或者重复采集
下面的方法主要关注角度1、角度3 ,实际中 角度2 也需要非常关注!
角度1
背景:每个ID有一张ID图片和多张prob图片,id图片命名例如:AA20210501S0338.jpg prob图片命名例如:AA20210501S0338_m001.jpg
做法:加载模型,提取特征,计算id和prob的平均相似度,排序,保存
import numpy as np
import os
import mxnet as mx
from menpo.visualize import print_progress
from collections import namedtuple
Batch = namedtuple('Batch', ['data'])
def constructmodel(prefix, ctx, epoch):
sym, arg_params, aux_params = mx.model.load_checkpoint(prefix, epoch)
all_layers = sym.get_internals()
sym = all_layers['fc1_output']
model = mx.mod.Module(symbol=sym, context=ctx, label_names = None)
model.bind(for_training=False, data_shapes=[('data', (1, 3, 112, 112))])
model.set_params(arg_params, aux_params)
return model
def extractfeature(model, img, featurelength = 512):
model.forward(Batch([img]))
net_out = model.get_outputs()
emb = net_out[0].asnumpy()
emb = emb.reshape((featurelength, 1))
return emb
def id_getfeatures_dict(model, imglist, image_root="",featurelength = 512):
features = []
feature_dict = {}
with open(imglist,'r') as file:
lines = file.readlines()
for line in print_progress(lines):
vec = line.strip().split('\t')
imagepath = vec[0]
key = os.path.splitext(imagepath)[0]
ori_img = mx.image.imread(os.path.join(image_root,imagepath))
oriimg = ori_img.astype('float32')
oriimg = mx.image.imresize(oriimg, 112, 112) # resize
oriimg = oriimg.transpose((2, 0, 1)) # Channel first
oriimg = oriimg.expand_dims(axis=0) # batchify
emb = extractfeature(model, oriimg)
# feature_dict[imagepath] = emb
feature_dict.setdefault(key, []).append(emb)
# features.append(emb)
return feature_dict
def prob_getfeatures_dict(model, imglist, image_root="",featurelength = 512):
features = []
feature_dict = {}
with open(imglist,'r') as file:
lines = file.readlines()
for line in print_progress(lines):
vec = line.strip().split('\t')
imagepath = vec[0]
key = imagepath.split('_m')[0]
ori_img = mx.image.imread(os.path.join(image_root,imagepath))
oriimg = ori_img.astype('float32')
oriimg = mx.image.imresize(oriimg, 112, 112) # resize
oriimg = oriimg.transpose((2, 0, 1)) # Channel first
oriimg = oriimg.expand_dims(axis=0) # batchify
emb = extractfeature(model, oriimg)
# feature_dict[imagepath] = emb
feature_dict.setdefault(key, []).append(emb)
# features.append(emb)
return feature_dict
def cal_sim(id_fdict,prob_fdict):
assert len(id_fdict.keys()) == len(prob_fdict.keys())
sim_dict = {}
sim_num_dict = {}
f = open('../id_prob_sims.txt', 'w')
for k in print_progress(id_fdict.keys()):
idfea = id_fdict[k]
sims = []
for probfea in prob_fdict[k]:
s = np.dot(np.squeeze(idfea), np.squeeze(probfea)) / (np.linalg.norm(idfea) * np.linalg.norm(probfea))
sims.append(s)
sim_dict[k] = sum(sims)/len(sims)
sim_num_dict[k] = len(sims)
sim_tuple = sorted(sim_dict.items(), key=lambda item:item[1])
for k in sim_tuple:
f.write('%s\t%s\t%s\n'%(k[0],sim_num_dict[k[0]],k[1]))
f.close()
modelPth = '/home/model,368'
prefix,epoch=modelPth.split(',')
ctx=[mx.gpu(0)]
featurelen = 512
id_img_list = '../clean_id_list.txt'
prob_img_list = '../clean_prob_list.txt'
ID_path = '../ID_img_aligned'
prob_path = '../prob_img_aligned_clean'
model = constructmodel(prefix, ctx, int(epoch))
id_features_dict = id_getfeatures_dict(model, id_img_list, ID_path, featurelen)
prob_features_dict = prob_getfeatures_dict(model, prob_img_list, prob_path, featurelen)
cal_sim(id_features_dict,prob_features_dict)
注意:需要选用性能比较强的模型进行特征提取。
相似度比较低的ID需要人工check 其ID图片和prob图片的一致性
角度3
# 其他函数相同
import itertools
def cal_sim(id_fdict,prob_fdict):
assert len(id_fdict.keys()) == len(prob_fdict.keys()),'%s-%s'%(len(id_fdict.keys()),len(prob_fdict.keys()))
sim_dict = {}
sim_num_dict = {}
f = open('../id_inter_sims.txt', 'w')
id_combins = list(itertools.combinations(id_fdict.keys(), 2))
for (idk1,idk2) in print_progress(id_combins):
idfea = id_fdict[idk1]
probfea = id_fdict[idk2]
sims = []
s = np.dot(np.squeeze(idfea), np.squeeze(probfea)) / (np.linalg.norm(idfea) * np.linalg.norm(probfea))
sim_dict['%s\t%s'%(idk1,idk2)] = s
sim_tuple = sorted(sim_dict.items(), key=lambda item:item[1])
for k in sim_tuple:
k0,k1 = k[0].split('\t')
f.write('%s\t%s\t%s\n'%(k0,k1,k[1]))
f.close()
modelPth = '/home/model,368'
prefix,epoch=modelPth.split(',')
ctx=[mx.gpu(0)]
featurelen = 512
id_img_list = '../clean_id_list.txt'
ID_path = '../ID_img_aligned'
model = constructmodel(prefix, ctx, int(epoch))
id_features_dict = id_getfeatures_dict(model, id_img_list, ID_path, featurelen)
cal_sim(id_features_dict,id_features_dict)
原文链接:https://blog.csdn.net/qxqxqzzz/article/details/118091009
mxnet根据相似度进行人脸样本对图片清理相关推荐
- 使用face_recognition:摄像头实时给人脸打马赛克、疲劳检测、活体检测(张嘴检测)、计算两张人脸之间的相似度、人脸校准
日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) 使用face_recognition进行摄像头实时给人脸打马赛 ...
- 度目人脸应用套件~联动闸机说明
度目人脸应用套件 度目人脸应用套件购买链接 先礼后兵 优点: 识别速度超级快,150ms吧哈,初步测试,海思芯片算法加速这块做的真的好(怪不得美国制裁呢,怪你太强) 硬件板卡的集成度很高,基本需要的功 ...
- Java + opencv 实现人脸识别,图片人脸识别、视频人脸识别、摄像头实时人脸识别
搭建环境 opencv官网下载windows安装包 https://opencv.org/releases/ 选择最新版4.1.1 下载完成后是一个opencv-4.1.1-vc14_vc15.exe ...
- 【opencv】人脸检测(图片实时)
■ 人脸检测(图片) 原图像: 在使用OpenCV的人脸检测之前,需要一个人脸训练模型,格式是xml的,我们这里使用OpenCV提供好的人脸分类模型xml,下载地址:https://g ...
- python 识别图片中的人脸,并裁剪人脸,将图片转化成固定大小,并将图片再按照自己的后缀名存储起来
下列代码,识别图片中的人脸,并裁剪人脸,将图片转化成固定大小,再按照自己的后缀名存储起来 bug:我是用来识别单张图片中只有一个人脸的数据集,如果用来处理一张图片中的多个人脸,那么图片的命名可能会有b ...
- 【javaCV基于虹软人脸识别demo添加电脑摄像头人脸识别(图片保存,视频保存,摄像头显示等 )(附源码)】
javaCV基于虹软人脸识别demo添加电脑摄像头人脸识别(图片保存,视频保存,摄像头显示等 )(附源码) 文章目录 javaCV基于虹软人脸识别demo添加电脑摄像头人脸识别(图片保存,视频保存,摄 ...
- 视频人脸识别和图片人脸识别的关系
首先解释下视频人脸识别和图片人脸识别的区别,视频人脸识别是基于视频流进行人脸识别,用户的感觉就是直接在视频中就可以识别出人脸,而图片人脸识别,是用户直接上传图片,输出识别结果. 图片人脸识别可以描述为 ...
- python人脸对比相似度_python人脸对比
import sys import ssl from urllib import request,parse # client_id 为官网获取的AK, client_secret 为官网获取的SK ...
- python中文相似度_python 人脸对比--百度API人脸相似度识别(超简单)-Go语言中文社区...
说明:这篇是写使用百度人脸识别API进行人脸相似度识别对比,如 给两个人物照片,判断是否是同一个人.简单的4步完成. 1,获取百度人脸识别API的API Key和Secret Key.(10分钟内完成 ...
最新文章
- 鹅厂2020暑期实习第二次二面
- 聊聊分布式定时任务中间件架构及其实现--转
- HTML元素水平居中和垂直居中
- 网易实践|千万级在线直播弹幕方案
- 两个女孩的生日最后演变成了鬼节
- 全球五大顶级域名一周统计:7月第三周新增超9万个
- Day9 深度学习入门
- 计算仰角_41页最新全站仪测量方法及计算+图文解说,助你轻松掌握测量
- python中和js交互_python和js交互调用的方法
- 计算机系统-内存的最小存储单元
- Golang 位向量
- ijkplayer自定义协议播放加密视频
- struts2通配符使用
- 前后端请求设置签名验证,提升接口安全
- WORD VBA 操作WORD 文本框
- StartDT奇点云邀您参加2022云栖大会,11月3-5日杭州见
- Switch语句:空指针异常
- android app 马甲包,关于Android多渠道打包和马甲包问题
- 零基础也能快速上手的动画制作工具 | 万彩动画大师
- getpixel() java_android – 使用getPixel()方法提取的巨大负值
热门文章
- WSAGetLastError:10004 一个封锁操作被对 WSACancelBlockingCall的调用中断 的解决
- 深入理解 C 指针阅读笔记 -- 第六章
- 不能上网--只要四步判断出故障所在
- TCP/IP详解--第六章
- android androidx版本,Android AndroidX 简介与迁移
- matlab uitree update,elementUI tree 懒加载 更新节点
- zabbix mysql 表空间_Zabbix监控达梦数据库表空间
- jax_ws_对状态代码使用JAX-RS异常
- 计算机使用DHCP动态分配参数,某单位采用DHCP进行IP地址自动分配,用户收到()消息后方可使用其中分配的IP - 信管网...
- 计算机对应的自然科学,计算机类书稿加工应注意的几个问题