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

重磅干货,第一时间送达

本文转自:opencv学堂

模型介绍

基于OpenVINO预训练模块中的道路分割模型,实现像素级别的图像分割,把像素划分为如下四个类别

  • 背景

  • 道路

  • 车道线

  • 标志

输入数据

要求输入图像BGR通道顺序的彩色图像,blob的大小为

BCHW = Nx3x512x896,其中

  • B表示批次数目

  • C表示图像通道

  • H表示图像高度

  • W表示图像宽度

输出数据

输出数据是四通道blob对象,格式为BCHW

其中C=4表示输出的四个分类得分,H表示feature map的高度, W表示featuremap的宽度,对输出blob进行解析可以得到输出的分割mask,对mask进行配色之后,得到最终的输出结果。

代码实现

1. 基于OpenVINO SDK开发完成演示程序,模型加载与创建推断请求的代码如下:

C++版本

    // 加载道路分割网络CNNNetReader network_reader;network_reader.ReadNetwork(model_xml);network_reader.ReadWeights(model_bin);// 请求网络输入与输出信息auto network = network_reader.getNetwork();InferenceEngine::InputsDataMap input_info(network.getInputsInfo());InferenceEngine::OutputsDataMap output_info(network.getOutputsInfo());// 设置输入精度InputInfo::Ptr& input = input_info.begin()->second;auto inputName = input_info.begin()->first;input->setPrecision(Precision::U8);input->getInputData()->setLayout(Layout::NCHW);/** 设置输出精度与内容**/DataPtr& output = output_info.begin()->second;auto outputName = output_info.begin()->first;const SizeVector outputDims = output->getTensorDesc().getDims();output->setPrecision(Precision::FP32);output->setLayout(Layout::NCHW);size_t N = outputDims[0];size_t C = outputDims[1];size_t H = outputDims[2];size_t W = outputDims[3];size_t image_stride = W*H*C;// 创建可执行网络对象auto executable_network = plugin.LoadNetwork(network, {});// 请求推断图InferRequest::Ptr async_infer_request_next = executable_network.CreateInferRequestPtr();InferRequest::Ptr async_infer_request_curr = executable_network.CreateInferRequestPtr();

Python版本

# 加载IR
log.info("Reading IR...")
net = IENetwork(model=model_xml, weights=model_bin)# 获取输入输出层
input_blob = next(iter(net.inputs))
out_blob = next(iter(net.outputs))
log.info("Loading IR to the plugin...")# 创建可执行网络
exec_net = plugin.load(network=net, num_requests=2)
# Read and pre-process input image
n, c, h, w = net.inputs[input_blob].shape
del net# 开始视频文件或者摄像头
cap = cv2.VideoCapture("D:/images/video/CarsDrivingUnderBridge.mp4")
# cap = cv2.VideoCapture(0)cur_request_id = 0
next_request_id = 1log.info("Starting inference in async mode...")
log.info("To switch between sync and async modes press Tab button")
log.info("To stop the demo execution press Esc button")
is_async_mode = True
render_time = 0# 读取视频流
ret, frame = cap.read()
initial_w = cap.get(3)
initial_h = cap.get(4)

2. 检查异步返回与解析输出数据的代码如下

C++版本

if (OK == async_infer_request_curr->Wait(IInferRequest::WaitMode::RESULT_READY)) {const Blob::Ptr output_blob = async_infer_request_curr->GetBlob(outputName);const float* output_data = output_blob->buffer().as<float*>();Mat result = Mat::zeros(Size(W, H), CV_8UC3);for (size_t h = 0; h < H; ++h) {for (size_t w = 0; w < W; ++w) {int index = 0;float max = -100;for (size_t ch = 0; ch < C; ++ch) {float data = output_data[W * H * ch + W * h + w];if (data > max) {index = ch;max = data;}}result.at<Vec3b>(h, w) = lut[index];}}// 计算FPSauto t1 = std::chrono::high_resolution_clock::now();ms dtime = std::chrono::duration_cast<ms>(t1 - t0);std::ostringstream out;out << "Detection time  : " << std::fixed << std::setprecision(2) << dtime.count()<< " ms (" << 1000.f / dtime.count() << " fps)";resize(result, result, curr_frame.size());putText(curr_frame, out.str(), Point(20, 20), FONT_HERSHEY_SIMPLEX, 0.75, Scalar(0, 0, 255), 2, 8);addWeighted(result, 0.2, curr_frame, 0.8, 0, curr_frame);
}

Python版本

if exec_net.requests[cur_request_id].wait(-1) == 0:# 解析mask输出res = exec_net.requests[cur_request_id].outputs[out_blob]# 降维res = np.squeeze(res, 0)# 矩阵转置res = res.transpose((1, 2, 0))# 获取类别 index,# 0 - 表示背景,# 1 - 道路,# 2 - 车道线 ,# 3 - 交通标志res = np.argmax(res, 2)hh, ww = res.shapemask = np.zeros((hh, ww, 3), dtype=np.uint8)mask[np.where(res > 0)] = (0, 255, 255)mask[np.where(res > 1)] = (255, 0, 255)# 显示maskcv2.imshow("segmentation mask", mask)mask = cv2.resize(mask, dsize=(frame.shape[1], frame.shape[0]))# print("final shape : ", res.shape)frame = cv2.addWeighted(mask, 0.4, frame, 0.6, 0)inf_end = time.time()det_time = inf_end - inf_start# 显示绘制文本inf_time_message = "Inference time: {:.3f} ms, FPS:{:.3f}".format(det_time * 1000, 1000 / (det_time * 1000 + 0.1))render_time_message = "OpenCV rendering time: {:.3f} ms".format(render_time * 1000)async_mode_message = "Async mode is on. Processing request {}".format(cur_request_id) if is_async_mode else \"Async mode is off. Processing request {}".format(cur_request_id)cv2.putText(frame, inf_time_message, (15, 15), cv2.FONT_HERSHEY_COMPLEX, 0.5, (255, 255, 0), 1)cv2.putText(frame, render_time_message, (15, 30), cv2.FONT_HERSHEY_COMPLEX, 0.5, (10, 10, 200), 1)cv2.putText(frame, async_mode_message, (10, int(initial_h - 20)), cv2.FONT_HERSHEY_COMPLEX, 0.5,(10, 10, 200), 1)

运行效果

输入视频帧

道路分割模型输出mask

最终显示效果

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

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

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

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

下载3:OpenCV实战项目20讲

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

交流群

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

OpenVINO开发教程之八 – 道路分割相关推荐

  1. SAP UI5 应用开发教程之八十五 - 如何用 OPA5 编写测试用例来测试用户输入文本的功能试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 作者简介 Jerry Wang,2007 年从电子科技大学计算机专业硕士毕业后加入 SAP 成都研究院工作至今.Jerry 是 SAP 社区导师,S ...

  2. SAP UI5 应用开发教程之八十二 - 采用 OPA5 开发支持页面跳转的 SAP UI5 集成测试用例试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

  3. SAP UI5 应用开发教程之八十三 - SAP UI5 的自动化测试套件页面的开发步骤介绍试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 作者简介 Jerry Wang,2007 年从电子科技大学计算机专业硕士毕业后加入 SAP 成都研究院工作至今.Jerry 是 SAP 社区导师,S ...

  4. SAP UI5 应用开发教程之八十一 - 采用 OPA5 进行 SAP UI5 集成测试(Integration Test)的一个例子试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

  5. SAP UI5 应用开发教程之八 - 多语言的支持

    从本步骤开始,我们将 SAP UI5 控件的文本,通过单独的资源文件(Resources files)维护,以达到对多语言的支持(internationalization,简称 i18n). 先看本文 ...

  6. SAP UI5 应用开发教程之六十七 - 基于 OData V4 的 SAP UI5 List-Detail(列表-明细)布局的实现方式试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

  7. SAP UI5 应用开发教程之六十六 - 基于 OData V4 的 SAP UI5 表格控件如何实现删除功能试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

  8. SAP UI5 应用开发教程之六十四 - 基于 OData V4 的 SAP UI5 表格控件如何实现 filter(过滤) 和 sort(排序)功能试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

  9. SAP UI5 应用开发教程之六十三 - 基于 OData V4 的本地 Mock Server 实现的深入介绍试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

最新文章

  1. testem方便的web tdd 测试框架使用
  2. Mysql数据类型之字符串的案例介绍(含latin1下varchar的最大长度是65532还是65533)
  3. network programming-简单的TCP客户服务器编程
  4. SAP CRM one order PERFORM read_header_ext的switch case分支
  5. 汉澳sinox2014x64server已经能够下载
  6. php进程数是指什么,25.查看php 某个服务的进程数
  7. 理论基础 —— 栈 —— 双端栈
  8. php 拖拽 上传文件 进度,在Vue中如何实现带进度条的文件拖动上传功能
  9. Java Web实训项目:西蒙购物网(下)
  10. JAVA如何选中一行上移,怎么把表格一行整体上移
  11. 256qam调制星座图_科普:5G是怎么调制的?
  12. 【答辩问题】计算机专业本科毕业设计答辩需注意的内容
  13. “小程序”的最佳入口位置--关于微信小程序的思考笔记
  14. [网络安全自学篇] 四.实验吧CTF实战之WEB渗透和隐写术解密
  15. 随机数公式Random
  16. python在财务中的应用实训报告-衡南2020年_商务办公软件应用与实践_高校邦_期末答案...
  17. 在MS Word 中添加 Mathtype 插件(vbe6ext.olb不能被加载问题 已解决)
  18. mysql添加一列求乘积_MySQL 生成累计乘积
  19. python实现RSA数字签名(纯算法实现)
  20. 决策树与随机森林初探

热门文章

  1. 算力超英伟达?华为推出两款“昇腾”芯片;五大AI战略正式公布
  2. 这次拿下Python全靠它了!一个交互式的学习资源!
  3. 加速点击控制应用中的边缘分析和机器学习部署 | 免费直播
  4. 一年暴涨近20倍,比特币是郁金香泡沫还是庞氏骗局?
  5. 领跑交互新时代 蓦然认知助力传统产业智能化升级
  6. AI一分钟 | 阿里云放大招要揽1000名AI人才,川普AI守国论遭遇54名科学家反对
  7. ICCV2017 | 一文详解GAN之父Ian Goodfellow 演讲《生成对抗网络的原理与应用》(附完整PPT)
  8. 面试官:Redis用过是吧?那你讲讲Redis都有哪些监控指标?
  9. 面试:TCP协议经典十五连问!
  10. 还分不清 Cookie、Session、Token、JWT?