点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

本文转自:opencv学堂

引言

前面说了OpenCV DNN不光支持图像分类与对象检测模型。此外还支持各种自定义的模型,deeplabv3模型是图像语义分割常用模型之一,本文我们演示OpenCV DNN如何调用Deeplabv3模型实现图像语义分割,支持的backbone网络分别为MobileNet与Inception。预训练模型下载地址如下:

https://github.com/tensorflow/models/blob/master/research/deeplab/g3doc/model_zoo.md

预训练的模型下载之后可以看到pb文件,ckpt文件,其中pb文件可以直接调用。

调用MobileNet的deeplabv3

下载MobileNet版本的deeplabv3模型,把mobilenetv2 ckpt转pb,脚本如下:

python deeplab/export_model.py \
--logtostderr \
--checkpoint_path="/home/lw/data/cityscapes/train/model.ckpt-2000" \
--export_path="/home/lw/data/pb/frozen_inference_graph.pb" \
--model_variant="mobilenet_v2" \
#--atrous_rates=6 \
#--atrous_rates=12 \
#--atrous_rates=18 \
#--output_stride=16 \
--decoder_output_stride=4 \
--num_classes=6 \
--crop_size=513 \
--crop_size=513 \
--inference_scales=1.0

接下来使用opencv加载mobilenetv2转换好的pb模型会报下面的错误:

使用mobilenetv2的解决办法:

import tensorflow as tf
from tensorflow.tools.graph_transforms import TransformGraph
from tensorflow.python.tools import optimize_for_inference_libgraph = 'frozen_inference_graph.pb'
with tf.gfile.FastGFile(graph, 'rb') as f:graph_def = tf.GraphDef()graph_def.ParseFromString(f.read())tf.summary.FileWriter('logs', graph_def)inp_node = 'MobilenetV2/MobilenetV2/input'out_node = 'logits/semantic/BiasAdd'graph_def = optimize_for_inference_lib.optimize_for_inference(graph_def, [inp_node], [out_node],tf.float32.as_datatype_enum)graph_def = TransformGraph(graph_def, [inp_node], [out_node], ["sort_by_execution_order"])with tf.gfile.FastGFile('frozen_inference_graph_opt.pb', 'wb') as f:f.write(graph_def.SerializeToString())

调用Inception的deeplabv3

接下来使用opencv加载xception转换好的pb模型

使用xception的解决办法

import tensorflow as tf
from tensorflow.tools.graph_transforms import TransformGraph
from tensorflow.python.tools import optimize_for_inference_lib
graph = 'frozen_inference_graph.pb'
with tf.gfile.FastGFile(graph, 'rb') as f:graph_def = tf.GraphDef()graph_def.ParseFromString(f.read())tf.summary.FileWriter('logs', graph_def)# inp_node = 'sub_2'  # 起始地节点# out_node = 'logits/semantic/BiasAdd' # 结束的节点graph_def = optimize_for_inference_lib.optimize_for_inference(graph_def, [inp_node], [out_node],tf.float32.as_datatype_enum)graph_def = TransformGraph(graph_def, [inp_node], [out_node], ["sort_by_execution_order"])with tf.gfile.FastGFile('frozen_inference_graph_opt.pb', 'wb') as f:f.write(graph_def.SerializeToString())

使用opencv进行推理(我用的是ADE20K预训练模型进行测试的)

import cv2
import numpy as np
np.random.seed(0)
color = np.random.randint(0, 255, size=[150, 3])
print(color)
# Load names of classes
#classes = None#with open("labels.names", 'rt') as f:
#    classes = f.read().rstrip('\n').split('\n')#legend = None
#def showLegend(classes):
#    global legend
#    if not classes is None and legend is None:
#        blockHeight = 30
#        print(len(classes), len(colors))
#        assert(len(classes) == len(colors))
#        legend = np.zeros((blockHeight * len(colors), 200, 3), np.uint8)
#        for i in range(len(classes)):
#            block = legend[i * blockHeight:(i + 1) * blockHeight]
#            block[:, :] = colors[i]
#            cv2.putText(block, classes[i], (0, blockHeight//2), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255))
#        cv2.namedWindow('Legend', cv2.WINDOW_NORMAL)
#        cv2.imshow('Legend', legend)
#        cv2.waitKey()# 读取图片
frame = cv2.imread("1.jpg")
frameHeight = frame.shape[0]
frameWidth = frame.shape[1]# 加载模型
net = cv2.dnn.readNet("frozen_inference_graph_opt.pb")
blob = cv2.dnn.blobFromImage(frame, 0.007843, (513, 513), (127.5, 127.5, 127.5), swapRB=True)
net.setInput(blob)
score = net.forward()
numClasses = score.shape[1]
height = score.shape[2]
width = score.shape[3]classIds = np.argmax(score[0], axis=0)  # 在列上求最大的值的索引
segm = np.stack([color[idx] for idx in classIds.flatten()])
segm = segm.reshape(height, width, 3)segm = cv2.resize(segm, (frameWidth, frameHeight), interpolation=cv2.INTER_NEAREST)
frame = (0.3*frame + 0.8*segm).astype(np.uint8)#showLegend(classes)cv2.imshow("img", frame)
cv2.waitKey()

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

OpenCV4 部署DeepLabv3+模型相关推荐

  1. ckpt下载 deeplabv3_OpenCV4 部署DeepLabv3+模型

    点击上方蓝字关注我们 微信公众号:OpenCV学堂 关注获取更多计算机视觉与深度学习知识 作者:本文作者不愿意留下署名 编辑:gloomyfish  引言 · 前面说了OpenCV DNN不光支持图像 ...

  2. yolo模型部署——tensorRT模型加速+triton服务器模型部署

    将最近的工作做个记录,方便日后学习回顾: 1.针对项目需求开发满足任务的模型,拿到任务就要去选相应的算法,由于是工程应用型,必须找填坑多的算法,这样遇到问题可参考的资料多. 2.做好以后,还要将开发的 ...

  3. 在Cuda上部署量化模型

    在Cuda上部署量化模型 介绍TVM自动量化.自动量化是TVM中的一种量化方式.将在ImageNet上导入一个GluonCV预先训练的模型到Relay,量化Relay模型,然后执行推理. import ...

  4. 手把手教你使用Flask轻松部署机器学习模型(附代码链接) | CSDN博文精选

    作者 | Abhinav Sagar 翻译 | 申利彬 校对 | 吴金笛 来源 | 数据派THU(ID:DatapiTHU) 本文旨在让您把训练好的机器学习模型通过Flask API 投入到生产环境  ...

  5. 独家 | 手把手教你如何使用Flask轻松部署机器学习模型(附代码链接)

    作者:Abhinav Sagar 翻译:申利彬 校对:吴金笛 本文约2700字,建议阅读7分钟. 本文可以让你把训练好的机器学习模型使用Flask API 投入生产环境. 本文旨在让您把训练好的机器学 ...

  6. keras保存模型_onnx+tensorrt部署keras模型

    由于项目需要,最近捣鼓了一波如何让用tensorrt部署训练好的模型来达到更快的推理速度,期间花费了大量的时间在知乎和各种网页上去搜索别人的方案,但始终没有找到我想要的条理相对清晰的记录贴(也许只是我 ...

  7. 使用tensorflow serving部署keras模型(tensorflow 2.0.0)

    点击上方"AI搞事情"关注我们 内容转载自知乎:https://zhuanlan.zhihu.com/p/96917543 Justin ho 〉 Tensorflow 2.0.0 ...

  8. cloud 部署_使用Google Cloud AI平台开发,训练和部署TensorFlow模型

    cloud 部署 实用指南 (A Practical Guide) The TensorFlow ecosystem has become very popular for developing ap ...

  9. 机器学习模型部署_9月版部署机器学习模型

    机器学习模型部署 每月版 (MONTHLY EDITION) Often, the last step of a Data Science task is deployment. Let's say ...

最新文章

  1. Linux 交叉编译简介
  2. ML之回归预测:利用6个单独+2个集成模型(LassoR、KernelRidgeR、ElasticNetR、GBR、XGBR、LGBMR,Avg、Stacking)对自动驾驶数据集【5+1】回归预测
  3. 13、 LEFT/RIGHT JOIN:外连接(左连接,右连接)
  4. 同一数据库如果处理多个完全不同的业务?
  5. sql去除空值_SQL汇总分析
  6. SpringMVC之组合注解@GetMapping
  7. python版本更新_Linux:更新、卸载软件、常见环境变量
  8. unix网络编程之基本套接口编程
  9. C++中this指针小记
  10. docker registry push 覆盖_Maven一键部署Springboot到Docker仓库,为自动化做准备
  11. Windows 98 SE
  12. 电路设计基础--MOS管驱动直流电机电路,看懂芯片手册
  13. 单片机原理及接口技术--01什么是单片机
  14. 【sketchup 2021】草图大师图像输出与渲染之Enscape渲染(优秀的实时渲染软件)的基本使用【渲染实时更新与同步、在线资源库、渲染和常规设置(图标背景、草地渲染)、导出为图像和独立文件】
  15. 流光快门Matlab,手机相机中的流光快门怎么用?教你用流光快门拍出最炫酷的照片...
  16. RGB565 转 HSV C语言实现
  17. 如何查询一个网站的域名备案信息?
  18. js在线预览[word,xls,ppt]-联机查看 Office 文档
  19. Redis常用数据结构及其场景归纳
  20. expected at least 1 bean which qualifies as autowire candidate for this ***错误的分析

热门文章

  1. 一道简约而不简单的算法题——数据流的中位数 | 附动画解析
  2. 今晚8点直播 | 详解基于百度自定义模板的OCR结果结构化处理技术
  3. 再见了!面试八股文。。。
  4. 盘点 HashMap 源码中的那些优雅的设计!
  5. 一款零注解侵入的 API 文档生成工具,你用过吗?
  6. 扔掉okhttp、httpClient,来试试这款轻量级HTTP客户端神器?
  7. Spring Boot+JWT+Shiro+MyBatisPlus 实现 RESTful 快速开发后端脚手架
  8. Github 标星 11.5K!这可能是最好的 Java 博客系统
  9. 微服务架构之「 API网关 」
  10. arXiv爆款:想了解Attention就看它!