清理的角度:

找出 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根据相似度进行人脸样本对图片清理相关推荐

  1. 使用face_recognition:摄像头实时给人脸打马赛克、疲劳检测、活体检测(张嘴检测)、计算两张人脸之间的相似度、人脸校准

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) 使用face_recognition进行摄像头实时给人脸打马赛 ...

  2. 度目人脸应用套件~联动闸机说明

    度目人脸应用套件 度目人脸应用套件购买链接 先礼后兵 优点: 识别速度超级快,150ms吧哈,初步测试,海思芯片算法加速这块做的真的好(怪不得美国制裁呢,怪你太强) 硬件板卡的集成度很高,基本需要的功 ...

  3. Java + opencv 实现人脸识别,图片人脸识别、视频人脸识别、摄像头实时人脸识别

    搭建环境 opencv官网下载windows安装包 https://opencv.org/releases/ 选择最新版4.1.1 下载完成后是一个opencv-4.1.1-vc14_vc15.exe ...

  4. 【opencv】人脸检测(图片实时)

    ■ 人脸检测(图片) 原图像:         在使用OpenCV的人脸检测之前,需要一个人脸训练模型,格式是xml的,我们这里使用OpenCV提供好的人脸分类模型xml,下载地址:https://g ...

  5. python 识别图片中的人脸,并裁剪人脸,将图片转化成固定大小,并将图片再按照自己的后缀名存储起来

    下列代码,识别图片中的人脸,并裁剪人脸,将图片转化成固定大小,再按照自己的后缀名存储起来 bug:我是用来识别单张图片中只有一个人脸的数据集,如果用来处理一张图片中的多个人脸,那么图片的命名可能会有b ...

  6. 【javaCV基于虹软人脸识别demo添加电脑摄像头人脸识别(图片保存,视频保存,摄像头显示等 )(附源码)】

    javaCV基于虹软人脸识别demo添加电脑摄像头人脸识别(图片保存,视频保存,摄像头显示等 )(附源码) 文章目录 javaCV基于虹软人脸识别demo添加电脑摄像头人脸识别(图片保存,视频保存,摄 ...

  7. 视频人脸识别和图片人脸识别的关系

    首先解释下视频人脸识别和图片人脸识别的区别,视频人脸识别是基于视频流进行人脸识别,用户的感觉就是直接在视频中就可以识别出人脸,而图片人脸识别,是用户直接上传图片,输出识别结果. 图片人脸识别可以描述为 ...

  8. python人脸对比相似度_python人脸对比

    import sys import ssl from urllib import request,parse # client_id 为官网获取的AK, client_secret 为官网获取的SK ...

  9. python中文相似度_python 人脸对比--百度API人脸相似度识别(超简单)-Go语言中文社区...

    说明:这篇是写使用百度人脸识别API进行人脸相似度识别对比,如 给两个人物照片,判断是否是同一个人.简单的4步完成. 1,获取百度人脸识别API的API Key和Secret Key.(10分钟内完成 ...

最新文章

  1. 鹅厂2020暑期实习第二次二面
  2. 聊聊分布式定时任务中间件架构及其实现--转
  3. HTML元素水平居中和垂直居中
  4. 网易实践|千万级在线直播弹幕方案
  5. 两个女孩的生日最后演变成了鬼节
  6. 全球五大顶级域名一周统计:7月第三周新增超9万个
  7. Day9 深度学习入门
  8. 计算仰角_41页最新全站仪测量方法及计算+图文解说,助你轻松掌握测量
  9. python中和js交互_python和js交互调用的方法
  10. 计算机系统-内存的最小存储单元
  11. Golang 位向量
  12. ijkplayer自定义协议播放加密视频
  13. struts2通配符使用
  14. 前后端请求设置签名验证,提升接口安全
  15. WORD VBA 操作WORD 文本框
  16. StartDT奇点云邀您参加2022云栖大会,11月3-5日杭州见
  17. Switch语句:空指针异常
  18. android app 马甲包,关于Android多渠道打包和马甲包问题
  19. 零基础也能快速上手的动画制作工具 | 万彩动画大师
  20. getpixel() java_android – 使用getPixel()方法提取的巨大负值

热门文章

  1. WSAGetLastError:10004 一个封锁操作被对 WSACancelBlockingCall的调用中断 的解决
  2. 深入理解 C 指针阅读笔记 -- 第六章
  3. 不能上网--只要四步判断出故障所在
  4. TCP/IP详解--第六章
  5. android androidx版本,Android AndroidX 简介与迁移
  6. matlab uitree update,elementUI tree 懒加载 更新节点
  7. zabbix mysql 表空间_Zabbix监控达梦数据库表空间
  8. jax_ws_对状态代码使用JAX-RS异常
  9. 计算机使用DHCP动态分配参数,某单位采用DHCP进行IP地址自动分配,用户收到()消息后方可使用其中分配的IP - 信管网...
  10. 计算机对应的自然科学,计算机类书稿加工应注意的几个问题