文章目录

  • 前言
  • 一、OpenCV DNN模块
    • 1.OpenCV DNN简介
    • 2.LabVIEW中DNN模块函数
  • 二、TensorFlow pb文件的生成和调用
    • 1.TensorFlow2 Keras模型(mnist)
    • 2.使用Keras搭建cnn训练mnist(train.py),训练部分源码如下:
    • 3.训练结果保存成冻结模型(pb文件)(train.py),训练结果保存为冻结模型的源码如下:
    • 4.python opencv调用冻结模型(cvcallpb.py)
  • 三、LabVIEW OpenCV DNN实现手写数字识别
    • 1、实现手写数字识别并实现MNIST数据简单的可视化(mnist_loadpb_simple.vi)
    • 2、实现手写数字识别并实现MNIST数据高级的可视化(mnist_loadpb.vi)
  • 四、源码下载
  • 总结

前言

今天和大家一起来看一下在LabVIEW中如何使用OpenCV DNN模块实现手写数字识别

一、OpenCV DNN模块

1.OpenCV DNN简介

OpenCV中的DNN(Deep Neural Network module)模块是专门用来实现深度神经网络相关功能的模块。OpenCV自己并不能训练神经网络模型,但是它可以载入别的深度学习框架(例如TensorFlow、pytorch、Caffe等等)训练好的模型,然后使用该模型做inference(预测)。而且OpenCV在载入模型时会使用自己的DNN模块对模型重写,使得模型的运行效率更高。所以如果你想在OpenCV项目中融入深度学习模型,可以先用自己熟悉的深度学习框架训练好,然后使用OpenCV的DNN模块载入。

2.LabVIEW中DNN模块函数

DNN模块位于程序框图-函数选板-Addons-VIRobotics-opencv_yiku中,如下图所示:

Net选版中的函数与python中的函数对比如下:

二、TensorFlow pb文件的生成和调用

1.TensorFlow2 Keras模型(mnist)

注:本范例必须使用tensorflow 2.x版本

如下图所示所示为数据集以及LabVIEW与Python推理和训练代码,相关源码可在链接中下载。

2.使用Keras搭建cnn训练mnist(train.py),训练部分源码如下:

train_images = train_images.reshape(train_images.shape[0], 28, 28, 1)
test_images = test_images.reshape(test_images.shape[0], 28, 28, 1)
train_images = train_images / 255.0
test_images = test_images / 255.0train_labels = to_categorical(train_labels, 10)
test_labels = to_categorical(test_labels, 10)model = Sequential()  #创建一个Sequential模型
# 第一层卷积:6个卷积核, 大小:5*5, 激活函数:relu
model.add(Conv2D(6, kernel_size=(5, 5), activation='relu', input_shape=(28, 28, 1)))
# 第二层池化:最大池化
model.add(MaxPooling2D(pool_size=(2, 2)))
# 第三层卷积:16个卷积核, 大小: 5*5, 激活函数:relu
model.add(Conv2D(16, kernel_size=(5, 5), activation='relu'))
# 第四层池化:最大池化
model.add(MaxPooling2D(pool_size=(2, 2)))
# 进行扁平化
model.add(Flatten())
# 全连接层一:输出节点为120个
model.add(Dense(120, activation='relu'))
# 全连接层二:输出节点为84个
model.add(Dense(84, activation='relu'))
# 输出层:用softmax激活函数计算分类的概率
model.add(Dense(10, activation='softmax'))  # 最后是10个数字,10个分类
model.compile(optimizer=keras.optimizers.Adam(), loss=keras.metrics.categorical_crossentropy, metrics=['accuracy'])
model.fit(train_images, train_labels, batch_size=32, epochs=2, verbose=1)
loss, accuracy = model.evaluate(test_images, test_labels,verbose=0)
#model.save("A:\\code\\tensorflow\\course\\1_fashion_mnist\\mymodel")
print('损失:', loss)
print('准确率:', accuracy)

3.训练结果保存成冻结模型(pb文件)(train.py),训练结果保存为冻结模型的源码如下:

注:无需安装tensorflow也可以运行

#以下是生成pb的代码。注意:用model.save生成的pb文件不能被opencv调用
# Convert Keras model to ConcreteFunction
full_model = tf.function(lambda x: model(x))
full_model = full_model.get_concrete_function(tf.TensorSpec(model.inputs[0].shape, model.inputs[0].dtype))# Get frozen ConcreteFunction
frozen_func = convert_variables_to_constants_v2(full_model)
frozen_func.graph.as_graph_def()layers = [op.name for op in frozen_func.graph.get_operations()]
print("-" * 50)
print("Frozen model layers: ")
for layer in layers:print(layer)print("-" * 50)
print("Frozen model inputs: ")
print(frozen_func.inputs)
print("Frozen model outputs: ")
print(frozen_func.outputs)# Save frozen graph from frozen ConcreteFunction to hard drive
tf.io.write_graph(graph_or_graph_def=frozen_func.graph,logdir=datapath+r"\frozen_models",name="frozen_graph.pb",as_text=False)

运行之后可生成如下图所示的pb模型:

4.python opencv调用冻结模型(cvcallpb.py)


import time
model_path = 'frozen_models\\frozen_graph.pb'
config_path = ''
#net = cv.dnn.readNetFromTensorflow(model_path, config_path)
import gzip
import os
import numpy as np
datapath=os.path.split(os.path.realpath(__file__))[0]
import cv2def get_data():train_image = datapath+r"\train-images-idx3-ubyte.gz"test_image = datapath+r"\t10k-images-idx3-ubyte.gz"train_label = datapath+r"\train-labels-idx1-ubyte.gz"test_label = datapath+r"\t10k-labels-idx1-ubyte.gz" paths = [train_label, train_image, test_label,test_image]with gzip.open(paths[0], 'rb') as lbpath:y_train = np.frombuffer(lbpath.read(), np.uint8, offset=8)with gzip.open(paths[1], 'rb') as imgpath:x_train = np.frombuffer(imgpath.read(), np.uint8, offset=16).reshape(len(y_train), 28, 28)with gzip.open(paths[2], 'rb') as lbpath:y_test = np.frombuffer(lbpath.read(), np.uint8, offset=8)with gzip.open(paths[3], 'rb') as imgpath:x_test = np.frombuffer(imgpath.read(), np.uint8, offset=16).reshape(len(y_test), 28, 28)return (x_train, y_train), (x_test, y_test)(train_images, train_labels), (test_images, test_labels)=get_data()def to_categorical(labels,number):a=np.zeros((labels.shape[0],number),dtype=labels.dtype)count=0for i in labels:a[count][i]=1count+=1return aprint(train_images.shape)
train_images = train_images.reshape(train_images.shape[0], 28, 28, 1)
test_images = test_images.reshape(test_images.shape[0], 28, 28, 1)
train_images = train_images / 255.0
test_images = test_images / 255.0train_labels = to_categorical(train_labels, 10)
test_labels = to_categorical(test_labels, 10)# Load a model imported from Tensorflow
net = cv2.dnn.readNetFromTensorflow(model_path, config_path)a=test_images[0].reshape(1,1,28,28)net.setInput(a)# Runs a forward pass to compute the net output
networkOutput = net.forward()
print(networkOutput)

三、LabVIEW OpenCV DNN实现手写数字识别

1、实现手写数字识别并实现MNIST数据简单的可视化(mnist_loadpb_simple.vi)

(1)读取mnist测试数据集二进制文件

(2)载入pb神经网络模型

(3)从二进制文件里读取某一幅图并显示出来

(4)blobImage,并把blob的结果用强度图显示出来

(5)把blob的结果送入神经网络推理,获取结果

(6)总体源码及效果如下:

2、实现手写数字识别并实现MNIST数据高级的可视化(mnist_loadpb.vi)

与简单的可视化区别仅仅有以下几项:

(1)多了getLayerName读出所有的网络层名字

(2)使用了多通道的forward(输入为名称数组)
(3)将前六层(两次卷积——relu——池化用强度图显示出来)

总体源码如下:

运行效果如下:

四、源码下载

链接:https://pan.baidu.com/s/1NU_OcHgS0-5zNXQVkEt5uw
提取码:8888

总结

Q:我该使用tensorflow 1还是tensorflow 2?
A:目前看tensorflow 1与opencv dnn模块、树莓派等开源硬件兼容性更好,且视觉对象检测的模型暂时更丰富。Tesnroflow 2的Keras函数训练神经网络非常方便,但对第三方软硬件兼容性还未做到最佳。估计随着后续版本的推出,TF2会逐渐成为主流。有些新的神经网络算子,慢慢地就不支持TF1了。同时opencv、开源硬件也会不断更新适应最新版本的TF。
另外,训练图像神经网络不用局限于TF,pytorch也是很好的选择。目前我们公司已逐渐从TF转向pytorch了。

Q:LabVIEW的opencv及其dnn模块支持哪些硬件和神经网络模型?
A:官方的物体分类、物体检测、语义分割、实例分割都支持(后续会讲到),第三方的人脸识别、文字识别也已经通过验证。由少量的高精度实例分割模型暂时不支持,但我们会推出新的ONNX工具包,支持市面上几乎所有的模型。
支持的硬件方面,目前windows(CPU)模式是无缝支持的,windows和Linux下的Nvidia GPU、openvino模式需要联系我们重新编译。NPU等高性价比硬件目前仍然推荐使用python。

更多关于LabVIEW与人工智能技术,可添加技术交流群进一步探讨。qq群号:705637299

手把手教你使用LabVIEW OpenCV DNN实现手写数字识别(含源码)相关推荐

  1. OpenCV+TensorFlow图片手写数字识别(附源码)

    初次接触TensorFlow,而手写数字训练识别是其最基本的入门教程,网上关于训练的教程很多,但是模型的测试大多都是官方提供的一些素材,能不能自己随便写一串数字让机器识别出来呢?纸上得来终觉浅,带着这 ...

  2. 手把手教你使用LabVIEW OpenCV dnn实现图像分类(含源码)

    文章目录 前言 一.什么是图像分类? 1.图像分类的概念 2.MobileNet简介 二.使用python实现图像分类(py_to_py_ssd_mobilenet.py) 1.获取预训练模型 2.使 ...

  3. 基于opencv实现的手写数字识别

    一.使用模板匹配算法 match.py: import os import Function root_dir = "digits/train2" file7_7 = open(& ...

  4. 实战六:手把手教你用TensorFlow进行手写数字识别

    手把手教你用TensorFlow进行手写数字识别 github下载地址 目录 手写体数字MNIST数据集介绍 MNIST Softmax网络介绍 实战MNIST Softmax网络 MNIST CNN ...

  5. pyTorch入门(六)——实战Android Minist OpenCV手写数字识别(附源码地址)

    学更好的别人, 做更好的自己. --<微卡智享> 本文长度为4239字,预计阅读12分钟 前言 前面几篇文章实现了pyTorch训练模型,然后在Windows平台用C++ OpenCV D ...

  6. linux手写数字识别opencv,opencv实现KNN手写数字的识别

    人工智能是当下很热门的话题,手写识别是一个典型的应用.为了进一步了解这个领域,我阅读了大量的论文,并借助opencv完成了对28x28的数字图片(预处理后的二值图像)的识别任务. 预处理一张图片: 首 ...

  7. 在OpenCV里使用机器学习库sklearn 实现手写数字识别1

    前面学习过KNN的方式来实现手写数字识别,不过效果一般,那么有没有别的方法来试一试,或许可以改进一点呢.在本文里将要介绍使用SVM和HOG的方式来实现手写数字识别,比如最终结果如下图: 在这个例子里与 ...

  8. 手写数字识别【QT+OpenCV】

    手写数字识别[QT+OpenCV] [说明] 手写数字识别的实现方式很多. 本文尽量将其简化,以让大家能够快速了解怎样实现一个动起来的系统. [截图] [思路] 1.特征提取 将图像划分为5*5大小的 ...

  9. 2.7mnist手写数字识别之训练调试与优化精讲(百度架构师手把手带你零基础实践深度学习原版笔记系列)

    2.7mnist手写数字识别之训练调试与优化精讲(百度架构师手把手带你零基础实践深度学习原版笔记系列) 目录 2.7mnist手写数字识别之训练调试与优化精讲(百度架构师手把手带你零基础实践深度学习原 ...

最新文章

  1. Windows Server 2012 R2/2016/2019无法安装.NET Framework 3.5.1或语言包的解决方法
  2. python语音在线编辑-Python:语音处理,实现在线朗读RFC文档或本地文本文件
  3. Hibernate+Spring整合使用二级缓存
  4. 使用OpenCV进行相机标定
  5. ssm影城项目_影场与属性访问器界面
  6. 使用jclouds库在Amazon S3上上传
  7. matlab 万能,matlab 万能实用的线性曲线拟合方法
  8. 在模糊查询中怎样事先加载页面_8种信息类型,中后台产品功能自查清单
  9. 线程堆栈大小 pthread_attr_setstacksize 的使用【原创】
  10. Java——类和对象
  11. 大学生计算机面试基础题
  12. VS 2005部署应用程序提示“应用程序无法正常启动( 0x0150002)” 解决方案
  13. VS2017+Opencv3.3+Opencv_contribute编译
  14. Maven的pom.xml文件详解
  15. 容器技术Docker K8s 43 Serverless Kubernetes(ASK)详解-ASK网络、存储、日志、监控管理
  16. 计算机视觉硕士课程南京大学,南京大学计算机系研究生课程文库
  17. 2020抖音无人直播技术:最新不封号无人直播的操作方法详细介绍
  18. HTML+CSS网页设计期末课程大作业:个人网站设计——个人介绍(7页) web前端开发技术 web课程设计 网页规划与设计
  19. 迷宫(深度优先搜索)
  20. 搞数仓也得懂几个常用机器学习算法

热门文章

  1. 7种深度学习工具介绍(转)
  2. fastapi 如何响应文件下载
  3. CF765F Souvenirs(暴力、线段树)
  4. common.io中Tailer类读取文件内容乱码问题解决
  5. API `getFileSystemManager` is not yet implemented uni-app 图片转码解决方法
  6. PHP+mysql 入门级通讯录(一)
  7. VScode 插件live preview无法显示背景图片/图片
  8. [面试算法]24点计算
  9. 附源码|复杂网络社区发现——标签传播算法(LPA)
  10. 6. ESP8266固件的下载