计算机视觉中的部分基础知识

  • IoU(编程 python)

    def bbox_iou(bbox1, bbox2):
    '''
    get iou between bbox1 and bbox2.
    :param bbox1: shape=(batch_size, 4)  [x, y, l, w]
    :param bbox2: shape=(batch_size, 4) [x, y, l, w]
    :return:
    '''
    area1 = bbox1[:, 2] * bbox1[:, 3]
    area2 = bbox2[:, 2] * bbox2[:, 3]
    
    bbox1_lt = bbox1[:, :2] - bbox1[:, 2:4] / 2
    bbox1_rb = bbox1[:, :2] + bbox1[:, 2:4] / 2
    bbox2_lt = bbox2[:, :2] - bbox2[:, 2:4] / 2
    bbox2_rb = bbox2[:, :2] + bbox2[:, 2:4] / 2
    
    inter_lt = max(bbox1_lt, bbox2_lt)
    inter_rb = min(bbox1_rb, bbox2_rb)
    inter_lw = max(inter_rb[:, 0] - inter_lt[:, 1], 0)
    inter_area = inter_lw[:, 0] * inter_lw[:, 1]
    
    iou = inter_area / (area1 + area2 - inter_area)
    return iou
    
  • nms (编程 python)

    def nms(dets, thresh):
    '''
    non maximum supression
    :param dets: shape=(batch_size, 5), [x, y, l, w, score]
    :return: dets after nms.
    '''
    scores = dets[:, 4]
    order = scores.argsort()[::-1]
    keep = []
    while order.size() > 0:
        i = order[0]
        keep.append(i)
        bboxes1 = dets[i:i+1, :]
        bboxes2 = dets[order[1:], :]
        iou = bbox_iou(bboxes1, bboxes2)
        inds = np.where(iou < thresh)[0]  # 返回索引
        order = order[inds+1]
    
    return dets[keep, :]
    
  • 评估指标

    • TP / FP / FN / TN

    • Recall / Precision
      R e c a l l = T P T P + F N Recall = \frac{TP}{TP + FN} Recall=TP+FNTP
      P r e c i s i o n = T P T P + F P Precision = \frac{TP}{TP + FP} Precision=TP+FPTP

    • F1值
      F 1 = 2 ∗ p r e c i s i o n ∗ r e c a l l p r e c i s i o n + r e c a l l F_1 = 2 * \frac{precision * recall}{precision + recall} F1=2precision+recallprecisionrecall

    • mIoU

      def batch_miou(pred, gt, class_num):
      '''
      batch miou in semantic segmentation.
      :param pred:
      :param gt:
      :param class_num:
      :return:
      '''
      eps = 1e-8
      pred_flatten = np.reshape(pred, -1)
      gt_flatten = np.reshape(gt, -1)
      ious = []
      for i in range(class_num):
          a = np.sum([pred_flatten == i])
          b = np.sum([gt_flatten == i])
          c = [pred_flatten == i, gt_flatten == i]
          c = np.sum(np.all(c, 0))
          iou = c / (a + b - c + eps)
          ious.append(iou)
      miou = np.mean(iou)
      return batch_miou()
      
    • AP

      根据不同的score阈值,会得到不同的P-R值,因此可以得到一条P-R曲线,PR曲线下的面积就是AP值, python程序实现如下:

      def pr_curve_area(precision, recall):
      '''
      Calculate pr_curve_area, that is ap value.
      
      :param precision: Precision array.
      :param recall: Recall array.
      
      :return: Ap value.
      '''
      precision = list(precision)
      precision.insert(0, 0.0)
      for i in range(len(precision) - 2, -1, -1):
          precision[i] = max(precision[i], precision[i + 1])
      recall = list(recall)
      recall.insert(0, 0.0)
      i_list = []
      for i in range(1, len(recall)):
          if recall[i] != recall[i - 1]:
              i_list.append(i)
      ap = 0.0
      for i in i_list:
          ap += (recall[i] - recall[i - 1]) * precision[i]
      return ap
      
    • ROC(receiver operating characteristic) 曲线

      它显示的真正率(TPR)与假正率(FPR)之间关系, ROC曲线下面的面积为AUC(area under curve),其面积越大则分类性能越好.

      T P R = T P T P + F N TPR = \frac{TP}{TP + FN} TPR=TP+FNTP
      F P R = F P T N + F P FPR = \frac{FP}{TN + FP} FPR=TN+FPFP

超参数设定和网络训练

  • 卷积层参数的设定

    小卷积核相比大卷积核有两项优势:

    • 增加网络容量和模型复杂度
    • 减少卷积核参数个数
  • 训练数据随机打乱

    信息论中曾提到, “从不相似的事件中学习总是比相似事件中学习更具信息量”。对模型的每轮训练前将训练数据集随机打乱,确保在模型不同轮数相同批次"看到"的数据是不同的。这样的处理不仅会提高模型收敛速率,同时,相比以前以固定次序训练的模型,此操作会略微提升模型在测试集上的预测效果.

  • 学习率设定

    • 模型训练开始时的学习率不宜过大
    • 在模型训练过程中,学习率应随轮数增加而减缓,如轮数减缓,指数减缓等

  • BN层

    • 不仅加快了模型的收敛速度;
    • 一定程度上缓和了"梯度弥散",从而使得训练深层网络模型更加容易和稳定.
  • 微调神经网络

    • 利用目标任务数据在原先预训练模型上继续进行训练过程
    • 设置较小的学习率,如1e-4以下
    • 根据层神设置不同的学习率,网络深层的学习率可稍大于浅层学习率
    • 微调网络的层数
    • 部分原始数据与目标数据协同训练

不平衡样本的处理

一般来说,不平衡的训练样本会导致训练模型侧重样本数目较多的的类别,而"轻视"样本数目较少的类别,这样模型在测试数据集上的泛化能力就会收到影响.

  • 数据层面处理方法
    • 数据重采样

      对样本较少的类别,可使用上采样,即复制该类图像直至与样本最多类别的样本数一致,也可以采用数据扩充方式替代简单的复制操作。

      对于样本较多的类别,可采用下采样,在批处理训练时对每批随机抽取的图像严格控制其样本较多的类别数量

      仅采用数据上采样有可能会引起模型过拟合问题,更保险且有效的数据重采样是将上采样和下采样结合使用.

    • 类别平衡采样

      • 把样本按类别分组,由每个类别生成一个样本列表,在训练过程中先随机选择一个或多个类别,然后由各个类别所对应的的样本类别表中随机选择样本,这样保证每个类别参与训练的机会均衡.
      • 类别重组

模型集成方法

集成学习(ensemble learning)是机器学习中的一类学习算法,指训练多个学习器并将它们组合起来使用的方法,这类算法在实践中通常能取得比单个学习器更好的预测结果.

  • 数据层面的集成方法
    • 测试阶段数据扩充,然后进行评价作为该测试图像最终的预测结果;
    • “简易集成法” 反复采样样本,训练若干模型,对测试数据的预测则从训练得到的若干个模型的结果取平均或投票获得,该方法在模型集成的同时,还能缓解数据不平衡带来的问题.
  • 模型层面的集成方法
    • 单模型集成

      • 多层特征融合

        一般地,进行多层特征融合操作时可直接将不同层网络特征级联(concatenate).一般选取靠近目标函数的几层卷积特征.

      • 网络"快照"集成法

        网络"快照"集成法利用了网络解空间中的这些局部最优解来对单个网络做模型集成。通过循环调整网络学习率(cyclic learning rate schedule)可使网络依次收敛到不同的局部最优解.

        对于每个循环结束后保存的模型,我们称之为模型"快照". 测试阶段做模型集成时,一般挑选最后m个模型"快照"用于集成.

    • 多模型集成

      • 多模型生成策略

        • 同一模型不同初始化
        • 同一模型不同训练轮数
        • 不同目标函数
        • 不同网络结构
        • dropout
      • 多模型集成方法

        假设共有 N N N个模型待集成, 对某测试样本 x x x,其预测结果为 N N N C C C维向量, s 1 , s 2 , . . . , s N s_1, s_2, ..., s_N s1,s2,...,sN

        • 直接平均法
          F i n a l _ s c o r e = ∑ i = 1 N s i N Final\_score = \frac{\sum_{i=1}^Ns_i}{N} Final_score=Ni=1Nsi
        • 加权平均法
          F i n a l _ s c o r e = ∑ i = 1 N w i s i N Final\_score = \frac{\sum_{i=1}^Nw_is_i}{N} Final_score=Ni=1Nwisi
        • 投票法 (多数表决法、相对多数表决法)

参考资料

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值