查看原文
其他

OpenCV4.0如何跑YOLOv3对象检测模型

gloomyfish OpenCV学堂 2020-02-04

OpenCV DNN对象检测概述

OpenCV4.0发布以来,其深度神经网络(Deep Neural Network-DNN)模块,功能变得十分的强大、本公众号坚持不断探索DNN模块中各种新模型支持与黑科技,先后发布了一系列关于OpenCV DNN使用的文章:


往期精选

OpenCV DNN支持图像分类、对象检测、图像分割常见通用网络模型,其中对象检测网络主要包括如下:

  • SSD

  • Faster-RCNN

  • RCNN

  • YOLO

这其中

  • DetectionOutput为SSD最后一层类型

  • im_info是Faster-RCNN/RCNN最后一层类型

  • Region是YOLO最后一层是类型

不同类型的输出层数据格式如下

输出层类型

数据格式

DetectionOutput

[batchId, classId, confidence, left, top, right, bottom]

im_info

[batchId, classId, confidence, left, top, right, bottom]

Region

[center_x, center_y, width, height,   objectness, N-class score data]

YOLOv3网络

YOLOv3网络在mAP与推断运行时间都达到了很高的性能,它与其它对象检测模型性能对象如下:

在COCO数据集上横向与各个对象检测模型对比如下:

从上面看出YOLOv3版本在运行实时性能与mAP方面完整的碾压SSD模型。YOLOv3能取得如此好的性能,跟它的网络结构对YOLO网络修改有很大关系,完整的YOLOv3版本的网络结构如下:

其中最重要的采用了多层金字塔特征网络(FPN),有效的提升检测的mAP,FPN的结构如下:


此外YOLOv3还采用了类似残差网络(Residual Blocks)的结构来进行特征提取学习

采用全卷积结构,有效减少了参数总数,取消了softmax层,最终输出结构如下:


DNN调用YOLOv3

加载YOLOv3网络预训练模型

# load tensorflow model
net = cv.dnn.readNetFromDarknet(config_text, model_bin)
image = cv.imread("D:/images/objects.jpg")
h = image.shape[0]
w = image.shape[1]

执行推断预测

# 基于多个Region层输出getUnconnectedOutLayersNames
blobImage = cv.dnn.blobFromImage(image, 1.0/255.0, (416416), NoneTrueFalse);
outNames = net.getUnconnectedOutLayersNames()
net.setInput(blobImage)
outs = net.forward(outNames)

解析输出结构

# 绘制检测矩形
classIds = []
confidences = []
boxes = []
for out in outs:
    for detection in out:
        scores = detection[5:]
        classId = np.argmax(scores)
        confidence = scores[classId]
        # numbers are [center_x, center_y, width, height]
        if confidence > 0.5:
            center_x = int(detection[0] * w)
            center_y = int(detection[1] * h)
            width = int(detection[2] * w)
            height = int(detection[3] * h)
            left = int(center_x - width / 2)
            top = int(center_y - height / 2)
            classIds.append(classId)
            confidences.append(float(confidence))
            boxes.append([left, top, width, height])

YOLOv3, CPU运行对象检测结果:

发现执行推断需要300多毫秒,CPU实时检测已经彻底凉凉拉,别担心!这些早在YOLO的作者预料之中,所以他还提供了YOLOv3的微缩版本,简称为

YOLOv3-tiny


使用YOLOv3-tiny版本

YOLOv3无法在CPU上做到实时运行,于是我有尝试了YOLOv3-tiny版本,发现基于OpenCV DNN在CPU上可以跑到帧率高达30FPS左右,天又亮拉!有图为证:

欢迎扫码加入【OpenCV研习社】


退笔如山未足珍

读书万卷始通神


关注我们

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存