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

初探目标检测

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

利用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加速库。这个我们首先要根据实现的代码案例来查看版本号,然后在官网按照步骤下载即可。我的环境版本要求如下图:
    这是我的环境配置
    昨晚寝室停电了,今天补一下,安装CUDA的时候出现了一个问题在这里插入图片描述
    解决方式是,如图,取消Visual的安装,即可,原因可能是电脑本身装有的发生了冲突在这里插入图片描述

  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

版权声明:本文为CSDN博主「风轻云淡这」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/white_gui/article/details/122279414

风轻云淡这

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐