insightface人脸识别代码记录(三)(评价函数)

一、前言

这次主要围绕~/src/train_softmax.py脚本中的两个类来进行记录,AccMetric类LossValueMetric类

目录地址:insightface人脸识别代码记录(总)(基于MXNet)

二、主要内容

以下为train_softmax.py中的部分代码,仅包含两个评价验证类。可以看出,这两个类均继承mxnet.metric.EvalMetric基础类。
两个类均是在update()中计算得到self.sum_metricself.num_inst,这两个类似于分子和分母,self.sum_metric存放的是预测的和实际一样的,self.num_inst存放的是预测的总和。而评价函数的主要工作就是改写update()
然后,通过mx.metric.create()来管理你的评价函数,或者通过另一种方式,mxnet.metric.CompositeEvalMetric类也可以,具体见下面的示例。最后把这个eval_metric送入fit()中,就没我们啥事了。但是,metric在fit()中究竟是怎么计算呢?
请接着往下看。

train_softmax.py:

class AccMetric(mx.metric.EvalMetric):
  def __init__(self):
    self.axis = 1
    super(AccMetric, self).__init__(
        'acc', axis=self.axis,
        output_names=None, label_names=None)
    self.losses = []
    self.count = 0

  def update(self, labels, preds):
    self.count+=1
    label = labels[0]
    pred_label = preds[1]
    if pred_label.shape != label.shape:
        pred_label = mx.ndarray.argmax(pred_label, axis=self.axis)
    pred_label = pred_label.asnumpy().astype('int32').flatten()
    label = label.asnumpy()
    if label.ndim==2:
      label = label[:,0]
    label = label.astype('int32').flatten()
    assert label.shape==pred_label.shape
    self.sum_metric += (pred_label.flat == label.flat).sum()
    self.num_inst += len(pred_label.flat)

class LossValueMetric(mx.metric.EvalMetric):
  def __init__(self):
    self.axis = 1
    super(LossValueMetric, self).__init__(
        'lossvalue', axis=self.axis,
        output_names=None, label_names=None)
    self.losses = []

  def update(self, labels, preds):
    loss = preds[-1].asnumpy()[0]
    self.sum_metric += loss
    self.num_inst += 1.0
    gt_label = preds[-2].asnumpy()
    #print(gt_label)
...
...
   metric1 = AccMetric()
   eval_metrics = [mx.metric.create(metric1)]

   if args.ce_loss:
     metric2 = LossValueMetric()
     eval_metrics.append( mx.metric.create(metric2) )
     
 # eval_metrics = mx.metric.CompositeEvalMetric()
 # for child_metric in [metrics_1, metrics_2]:
 #   	eval_metrics.add(child_metric)

...
...
model.fit(train_dataiter,
        begin_epoch        = begin_epoch,
        num_epoch          = end_epoch,
        eval_data          = val_dataiter,
        eval_metric        = eval_metrics,
        kvstore            = 'device',
        optimizer          = opt,
        #optimizer_params   = optimizer_params,
        initializer        = initializer,
        arg_params         = arg_params,
        aux_params         = aux_params,
        allow_missing      = True,
        batch_end_callback = _batch_callback,
        epoch_end_callback = epoch_cb )

这就得去官网看源码了,请看以下截图:
首先来到module模块中,即https://github.com/apache/incubator-mxnet/tree/master/python/mxnet/module,进入base_module.py中,我们便可以看到fit()的原型。如下图:
在这里插入图片描述
然后我们可以在fit()中找到评价函数到底是如何运作计算的。如下图:
在这里插入图片描述

然后跟着来到metric.py脚本中,https://github.com/apache/incubator-mxnet/blob/master/python/mxnet/metric.py,找到刚才的那个方法,get_global_name_value();然后根据self._has_global_stats这个参数,分为是否全局两种情况,分别计算,如下图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
总结一下这个fit()的过程:
首先,fit()是Module类的一个方法,所以我们要去module.py脚本找,这个脚本里定义的Module类,fit()方法继承自BaseModule类并且在BaseModule类中实现,Module类中并没有做修改,所以需要在BaseModule类中查看fit()方法。再来到base_module.py,即实现BaseModule类的地方,找到fit(),在其中找到metric调用的get_global_name_value(),最后来到metric.py,找到其计算方式。
在这里插入图片描述

三、结尾

这里就是关于Insightface中关于识别的评价函数的介绍。针对情况的不同,评价函数自然不同,但是万变不离其宗。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
抱歉,我是一个语言模型AI,无法编写和运行代码。不过,以下是用insightface实现人脸识别的一般步骤: 1. 安装insightface库 ``` pip install insightface ``` 2. 下载人脸检测模型和人脸识别模型 ``` import os import urllib model_urls = [ 'https://github.com/deepinsight/insightface/blob/master/models/model-r100-ii/model-0000.params?raw=true', 'https://github.com/deepinsight/insightface/blob/master/models/model-r100-ii/model-0000.params?raw=true', 'https://github.com/deepinsight/insightface/blob/master/models/retinaface/R50/retinaface-R50.zip?raw=true' ] model_names = [ 'model-r100-ii/model-0000.params', 'model-r100-ii/model-symbol.json', 'retinaface-R50/model' ] for url, name in zip(model_urls, model_names): if not os.path.exists(name): print('Downloading', name) urllib.request.urlretrieve(url, name) ``` 3. 加载人脸检测模型和人脸识别模型 ``` from insightface import model_zoo from insightface.model_zoo import get_model detector = get_model('retinaface_r50_v1') detector.prepare(ctx_id=-1, nms=0.4) recognition = get_model('arcface_r100_v1') recognition.prepare(ctx_id=-1) ``` 4. 加载人脸库 ``` import cv2 face_db = {} for file in os.listdir('faces'): name = os.path.splitext(file)[0] img = cv2.imread(os.path.join('faces', file)) embedding = recognition.get_embedding(img) face_db[name] = embedding ``` 5. 进行人脸识别 ``` img = cv2.imread('test.jpg') faces = detector.detect(img) for face in faces: embedding = recognition.get_embedding(face) min_distance = float('inf') min_name = None for name, db_embedding in face_db.items(): distance = recognition.get_distance(embedding, db_embedding) if distance < min_distance: min_distance = distance min_name = name if min_name is not None and min_distance < 0.8: cv2.rectangle(img, (face[0], face[1]), (face[2], face[3]), (0, 255, 0), 2) cv2.putText(img, min_name, (face[0], face[1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2) else: cv2.rectangle(img, (face[0], face[1]), (face[2], face[3]), (0, 0, 255), 2) cv2.putText(img, 'Unknown', (face[0], face[1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 0, 255), 2) cv2.imshow('result', img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 以上步骤仅供参考,实际使用时需要根据具体情况进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值