前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OpenCV4.0如何跑YOLOv3对象检测模型

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

作者头像
OpenCV学堂
发布2019-04-29 16:20:08
1.6K0
发布2019-04-29 16:20:08
举报

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网络预训练模型

代码语言:javascript
复制
# 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]

执行推断预测

代码语言:javascript
复制
# 基于多个Region层输出getUnconnectedOutLayersNames
blobImage = cv.dnn.blobFromImage(image, 1.0/255.0, (416, 416), None, True, False);
outNames = net.getUnconnectedOutLayersNames()
net.setInput(blobImage)
outs = net.forward(outNames)

解析输出结构

代码语言:javascript
复制
# 绘制检测矩形
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左右,天又亮拉!有图为证:

代码语言:javascript
复制
欢迎扫码加入【OpenCV研习社】

退笔如山未足珍

读书万卷始通神

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-03-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OpenCV学堂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
图像识别
腾讯云图像识别基于深度学习等人工智能技术,提供车辆,物体及场景等检测和识别服务, 已上线产品子功能包含车辆识别,商品识别,宠物识别,文件封识别等,更多功能接口敬请期待。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档