基于深度学习的目标检测系统(一)

初探目标检测

  • 今天开始记录我的基于深度学习的目标检测学习

利用Python实现IoU的计算,代码如下:

    def iou(boxA, boxB):
        # 计算重合部分的上、下、左、右4个边的值,注意最大最小函数的使用
        left_max = max(boxA[0], boxB[0])
        top_max = max(boxA[1], boxB[1])
        right_min = min(boxA[2], boxB[2])
        bottom_min = min(boxA[3], boxB[3])
        # 计算重合部分的面积
        inter =max(0, (right_min-left_max))max(0, (bottom_min-top_max)
        Sa = (boxA[2]-boxA[0])*(boxA[3]-boxA[1])
        Sb = (boxB[2]-boxB[0])*(boxB[3]-boxB[1])
        # 计算所有区域的面积并计算iou,如果是Python 2,则要增加浮点化操作
        union = Sa+Sb-inter
        iou = inter/union
        return iou
        # 对于IoU而言,我们通常会选取一个阈值,如0.5,来确定预测框是正确的还是错误的。
        # 当两个框的IoU大于0.5时,我们认为是一个有效的检测,否则属于无效的匹配。

几种名词解释

  • 正确检测框TP(True Positive):预测框正确地与标签框匹配了,两者间的IoU大于0.5。

  • 误检框FP(False Positive):将背景预测成了物体,通常这种框与图中所有标签的IoU都不会超过0.5。

  • 漏检框FN(False Negative):本来需要模型检测出的物体,模型没有检测出。

  • 正确背景(True Negative):本身是背景,模型也没有检测出来,这种情况在物体检测中通常不需要考虑。

  • 对于一个检测器,通常使用mAP(mean Average Precision)这一指标来评价一个模型的好坏,这里的AP指的是一个类别的检测精度,mAP则是多个类别的平均精度。评测需要每张图片的预测值与标签值。

  • 预测值(Dets):物体类别、边框位置的4个预测值、该物体的得分。

  • 标签值(GTs):物体类别、边框位置的4个真值。
    在预测值与标签值的基础上,我们首先将所有的预测框按照得分从高到低进行排序(因为得分越高的边框其对于真实物体的概率往往越大),然后从高到低遍历预测框。

从代码层面详细讲述AP求解过程

  • 假设当前经过标签数据与预测数据的加载,我们得到了下面两个变量:
  1. det_boxes:包含全部图像中所有类别的预测框,其中一个边框包含了[left, top, right, bottom, score, NameofImage]。
  2. gt_boxes:包含了全部图像中所有类别的标签,其中一个标签的内容为[left, top, right, bottom, 0]。需要注意的是,最后一位0代表该标签有没有被匹配过,如果匹配过则会置为1,其他预测框再去匹配则为误检框。
    for c in classes:
        # 通过类别作为关键字,得到每个类别的预测、标签及总标签数
        dects = det_boxes[c]
        gt_class = gt_boxes[c]
        npos = num_pos[c]
        # 利用得分作为关键字,对预测框按照得分从高到低排序
        dects = sorted(dects, key=lambda conf: conf[5], reverse=True)
        # 设置两个与预测边框长度相同的列表,标记是True Positive还是False Positive
        TP = np.zeros(len(dects))
        FP = np.zeros(len(dects))
        # 对某一个类别的预测框进行遍历
        for d in range(len(dects)):
          # 将IoU默认置为最低
          iouMax = sys.float_info.min
          # 遍历与预测框同一图像中的同一类别的标签,计算IoU
          if dects[d][-1] in gt_class:
                for j in range(len(gt_class[dects[d][-1]])):
                      iou = Evaluator.iou(dects[d][:4], gt_class[dects[d][-1]][j][:4])
                        if iou > iouMax:
                            iouMax = iou
                            jmax = j              # 记录与预测有最大IoU的标签
                # 如果最大IoU大于阈值,并且没有被匹配过,则赋予TP
                if iouMax >= cfg['iouThreshold']:
                      if gt_class[dects[d][-1]][jmax][4] == 0:
                          TP[d] = 1
                          gt_class[dects[d][-1]][jmax][4] = 1  # 标记为匹配过
                  # 如果被匹配过,赋予FP
                  else:
                      FP[d] = 1
                # 如果最大IoU没有超过阈值,赋予FP
                else:
                    FP[d] = 1
            # 如果对应图像中没有该类别的标签,赋予FP
            else:
                  FP[d] = 1
        # 利用NumPy的cumsum()函数,计算累计的FPTP
        acc_FP = np.cumsum(FP)
        acc_TP = np.cumsum(TP)
        rec = acc_TP / npos                         # 得到每个点的Recall
        prec = np.divide(acc_TP, (acc_FP + acc_TP))     # 得到每个点的Precision
        # 利用Recall与Precision进一步计算得到AP
        [ap, mpre, mrec, ii] = Evaluator.CalculateAveragePrecision(rec, prec)

部署环境

  1. 查了一下资料,发现首先要按照Nvidiad的显卡驱动,并能够显示GPU的内存,使用情况等信息。

  2. 安装CUDA(Compute Unified Device Architecture)。CUDA是NVIDIA推出的通用并行计算架构,可以使类似于PyTorch之类的深度学习框架调用GPU来解决复杂的计算问题。为了实现更高效的GPU并行计算,通常我们还需要安装cuDNN库。cuDNN库是由NVIDIA开发的专用于深度神经网络的GPU加速库。这个我们首先要根据实现的代码案例来查看版本号,然后在官网按照步骤下载即可。我的环境版本要求如下图:
    基于深度学习的目标检测系统(一)_第1张图片
    昨晚寝室停电了,今天补一下,安装CUDA的时候出现了一个问题基于深度学习的目标检测系统(一)_第2张图片
    解决方式是,如图,取消Visual的安装,即可,原因可能是电脑本身装有的发生了冲突基于深度学习的目标检测系统(一)_第3张图片

  3. 突然发现自己的pthon版本是3.7,各种方法都尝试了,还是下回来了3.6之后,马上就可以安装了,试过各种方法,发现最后只能通过命令python -m pip install http://download.pytorch.org/whl/cu90/torch-0.4.0-cp36-cp36m-win_amd64.whl 进行安装

  4. 最后测试导入torch的时候,报错 ImportError: DLL load failed: 找不到指定的模块。
    解决方法:从https://anaconda.org/anaconda/intel-openmp/files下载win-64/intel-openmp-2018.0.0-8.tar.bz2
    解压后把Library\bin中的dll文件放入C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\bin
    确保CUDA目录已添加到您的%PATH%环境变量中

今日总结

由于是第一次接触相关知识,像个无头苍蝇一样,导致代码只能稍微看懂一点,但是具体还是不知道如何去实现,我暂时是看《深度学习之PyTorch物体检测实战》,各位大佬如有更好的书籍或者路线,可以在下方评论,万分感谢!!!
还有这个环境的部署,属实是真的难顶,期间遇到了各种难题,幸好没有放弃,我感觉还是电脑安装的环境比较杂,比较乱,才导致了这么多问题的出现,有必要的话还是格式化电脑从头安装环境的好,还有一点就是环境版本的选择,尽量按照要求来,不要选择太高的版本了。

参考链接

CUDA和cuDNN安装参考
https://blog.csdn.net/sinat_23619409/article/details/84202651

你可能感兴趣的:(深度学习,目标检测,深度学习,计算机视觉)