0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

手把手教你使用LabVIEW OpenCV DNN實(shí)現(xiàn)手寫數(shù)字識(shí)別(含源碼)

王立奇 ? 來源:wangstoudamire ? 作者:wangstoudamire ? 2023-03-08 16:10 ? 次閱讀

前言

今天和大家一起來看一下在LabVIEW中如何使用OpenCV DNN模塊實(shí)現(xiàn)手寫數(shù)字識(shí)別

一、OpenCV DNN模塊

1.OpenCV DNN簡(jiǎn)介

**OpenCV中的DNN(Deep Neural Network module)模塊是專門用來實(shí)現(xiàn)深度神經(jīng)網(wǎng)絡(luò)相關(guān)功能的模塊。OpenCV自己并不能訓(xùn)練神經(jīng)網(wǎng)絡(luò)模型,但是它可以載入別的深度學(xué)習(xí)框架(例如TensorFlow、pytorch、Caffe等等)訓(xùn)練好的模型,然后使用該模型做inference(預(yù)測(cè))。而且OpenCV在載入模型時(shí)會(huì)使用自己的DNN模塊對(duì)模型重寫,使得模型的運(yùn)行效率更高。所以如果你想在OpenCV項(xiàng)目中融入深度學(xué)習(xí)模型,可以先用自己熟悉的深度學(xué)習(xí)框架訓(xùn)練好,然后使用OpenCV的DNN模塊載入。 **

2.LabVIEW中DNN模塊函數(shù)

DNN模塊位于程序框圖-函數(shù)選板-Addons-VIRobotics-opencv_yiku中,如下圖所示:

在這里插入圖片描述

Net選版中的函數(shù)與python中的函數(shù)對(duì)比如下:**

**在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

二、TensorFlow pb文件的生成和調(diào)用

1.TensorFlow2 Keras模型(mnist)

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

** 如下圖所示所示為數(shù)據(jù)集以及LabVIEW與Python推理和訓(xùn)練代碼,相關(guān)源碼可在鏈接中下載。**

在這里插入圖片描述

2.使用Keras搭建cnn訓(xùn)練mnist(train.py),訓(xùn)練部分源碼如下:

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.0
?
train_labels = to_categorical(train_labels, 10)
test_labels = to_categorical(test_labels, 10)
?
model = Sequential()  #創(chuàng)建一個(gè)Sequential模型
# 第一層卷積:6個(gè)卷積核, 大小:5*5, 激活函數(shù):relu
model.add(Conv2D(6, kernel_size=(5, 5), activation='relu', input_shape=(28, 28, 1)))
# 第二層池化:最大池化
model.add(MaxPooling2D(pool_size=(2, 2)))
# 第三層卷積:16個(gè)卷積核, 大小: 5*5, 激活函數(shù):relu
model.add(Conv2D(16, kernel_size=(5, 5), activation='relu'))
# 第四層池化:最大池化
model.add(MaxPooling2D(pool_size=(2, 2)))
# 進(jìn)行扁平化
model.add(Flatten())
# 全連接層一:輸出節(jié)點(diǎn)為120個(gè)
model.add(Dense(120, activation='relu'))
# 全連接層二:輸出節(jié)點(diǎn)為84個(gè)
model.add(Dense(84, activation='relu'))
# 輸出層:用softmax激活函數(shù)計(jì)算分類的概率
model.add(Dense(10, activation='softmax'))  # 最后是10個(gè)數(shù)字,10個(gè)分類
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('準(zhǔn)確率:', accuracy)

在這里插入圖片描述

3.訓(xùn)練結(jié)果保存成凍結(jié)模型(pb文件)(train.py),訓(xùn)練結(jié)果保存為凍結(jié)模型的源碼如下:

注:無需安裝tensorflow也可以運(yùn)行

#以下是生成pb的代碼。注意:用model.save生成的pb文件不能被opencv調(diào)用
# 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"rozen_models",
                  name="frozen_graph.pb",
                  as_text=False)

運(yùn)行之后可生成如下圖所示的pb模型:

在這里插入圖片描述

4.python opencv調(diào)用凍結(jié)模型(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 cv2
?
def get_data():
    train_image = datapath+r"	rain-images-idx3-ubyte.gz"
    test_image = datapath+r"	10k-images-idx3-ubyte.gz"
    train_label = datapath+r"	rain-labels-idx1-ubyte.gz"
    test_label = datapath+r"	10k-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=0
    for i in labels:
        a[count][i]=1
        count+=1
    return a
        
    
print(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.0
?
train_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實(shí)現(xiàn)手寫數(shù)字識(shí)別

1、實(shí)現(xiàn)手寫數(shù)字識(shí)別并實(shí)現(xiàn)MNIST數(shù)據(jù)簡(jiǎn)單的可視化(mnist_loadpb_simple.vi)

(1)讀取mnist測(cè)試數(shù)據(jù)集二進(jìn)制文件

在這里插入圖片描述

(2)載入pb神經(jīng)網(wǎng)絡(luò)模型

在這里插入圖片描述

**(3)從二進(jìn)制文件里讀取某一幅圖并顯示出來 **

在這里插入圖片描述

(4)blobImage,并把blob的結(jié)果用強(qiáng)度圖顯示出來

在這里插入圖片描述

(5)把blob的結(jié)果送入神經(jīng)網(wǎng)絡(luò)推理,獲取結(jié)果

在這里插入圖片描述

(6)總體源碼及效果如下:

在這里插入圖片描述

在這里插入圖片描述

2、實(shí)現(xiàn)手寫數(shù)字識(shí)別并實(shí)現(xiàn)MNIST數(shù)據(jù)高級(jí)的可視化(mnist_loadpb.vi)

與簡(jiǎn)單的可視化區(qū)別僅僅有以下幾項(xiàng):

(1)多了getLayerName讀出所有的網(wǎng)絡(luò)層名字

在這里插入圖片描述

**(2)使用了多通道的forward(輸入為名稱數(shù)組) **

在這里插入圖片描述(3)將前六層(兩次卷積——relu——池化用強(qiáng)度圖顯示出來)**

**在這里插入圖片描述

總體源碼如下:

在這里插入圖片描述

運(yùn)行效果如下:

在這里插入圖片描述

四、源碼下載

鏈接: https://pan.baidu.com/s/1NU_OcHgS0-5zNXQVkEt5uw

提取碼:8888

總結(jié)

Q:我該使用tensorflow 1還是tensorflow 2?

A:目前看tensorflow 1與opencv dnn模塊、樹莓派等開源硬件兼容性更好,且視覺對(duì)象檢測(cè)的模型暫時(shí)更豐富。Tesnroflow 2的Keras函數(shù)訓(xùn)練神經(jīng)網(wǎng)絡(luò)非常方便,但對(duì)第三方軟硬件兼容性還未做到最佳。估計(jì)隨著后續(xù)版本的推出,TF2會(huì)逐漸成為主流。有些新的神經(jīng)網(wǎng)絡(luò)算子,慢慢地就不支持TF1了。同時(shí)opencv、開源硬件也會(huì)不斷更新適應(yīng)最新版本的TF。

另外,訓(xùn)練圖像神經(jīng)網(wǎng)絡(luò)不用局限于TF,pytorch也是很好的選擇。目前我們公司已逐漸從TF轉(zhuǎn)向pytorch了。

Q:LabVIEW的opencv及其dnn模塊支持哪些硬件和神經(jīng)網(wǎng)絡(luò)模型?

A: 提供多種框架模型導(dǎo)入模塊 :包括tensorflow、pytorch、darknet、openvino等多個(gè)平臺(tái)的深度學(xué)習(xí)模型,官方的物體分類、物體檢測(cè)、語義分割、實(shí)例分割都支持(后續(xù)會(huì)講到),第三方的人臉識(shí)別、文字識(shí)別也已經(jīng)通過驗(yàn)證。少量的高精度實(shí)例分割模型暫時(shí)不支持,后續(xù)我們會(huì)給大家介紹ONNX工具包,支持市面上幾乎所有的模型。 支持的硬件方面,支持Nvidia GPU、Intel、TPU、NPU多種硬件加速。

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • LabVIEW
    +關(guān)注

    關(guān)注

    1958

    文章

    3651

    瀏覽量

    321491
  • 深度學(xué)習(xí)
    +關(guān)注

    關(guān)注

    73

    文章

    5440

    瀏覽量

    120798
  • dnn
    dnn
    +關(guān)注

    關(guān)注

    0

    文章

    59

    瀏覽量

    9024
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    手把手教你使用LabVIEW OpenCV dnn實(shí)現(xiàn)物體識(shí)別(Object Detection)源碼

    使用LabVIEW調(diào)用pb模型實(shí)現(xiàn)物體識(shí)別
    的頭像 發(fā)表于 03-10 15:58 ?1496次閱讀
    <b class='flag-5'>手把手</b><b class='flag-5'>教你</b>使用<b class='flag-5'>LabVIEW</b> <b class='flag-5'>OpenCV</b> <b class='flag-5'>dnn</b><b class='flag-5'>實(shí)現(xiàn)</b>物體<b class='flag-5'>識(shí)別</b>(Object Detection)<b class='flag-5'>含</b><b class='flag-5'>源碼</b>

    【匯總篇】小草手把手教你 LabVIEW 串口儀器控制

    `課程推薦>>《每天1小時(shí),龍哥手把手教您LabVIEW視覺設(shè)計(jì)》[hide]小草手把手教你 LabVIEW 串口儀器控制—生成
    發(fā)表于 02-04 10:45

    【視頻匯總】小草大神手把手教你Labview技巧及源代碼分享

    點(diǎn)擊學(xué)習(xí)>>《龍哥手把手教你學(xué)LabVIEW視覺設(shè)計(jì)》視頻教程原創(chuàng)視頻教程小草手把手教你LabVIEW
    發(fā)表于 05-26 13:48

    手把手教你LabVIEW儀器控制

    手把手教你LabVIEW儀器控制,串口學(xué)習(xí)
    發(fā)表于 12-11 12:00

    手把手教你如何一步一步實(shí)現(xiàn)人臉識(shí)別的門禁系統(tǒng)

    是一個(gè)人臉識(shí)別的門禁系統(tǒng)開源源碼及論文,基本功能實(shí)現(xiàn),但其教程較簡(jiǎn)略且有欠缺。本教程將從零開始,手把手教你如何一步一步
    發(fā)表于 12-14 06:44

    手把手教你寫批處理-批處理的介紹

    手把手教你寫批處理-批處理的介紹
    發(fā)表于 10-25 15:02 ?69次下載

    美女手把手教你如何裝機(jī)(中)

    美女手把手教你如何裝機(jī)(中) 再來是硬碟的部份,這款機(jī)殼還不錯(cuò),可以旋轉(zhuǎn)支架~
    發(fā)表于 01-27 11:14 ?1446次閱讀

    美女手把手教你如何裝機(jī)(下)

    美女手把手教你如何裝機(jī)(下) 接著下來就是今天的重頭戲,開核蘿!~
    發(fā)表于 01-27 11:16 ?2911次閱讀

    小草手把手教你LabVIEW儀器控制V1.0

    小草手把手教你LabVIEW儀器控制V1.0 ,感興趣的小伙伴們可以看看。
    發(fā)表于 08-03 17:55 ?94次下載

    手把手教你安裝Quartus II

    本章手把手把教你如何安裝 Quartus II 軟件 ,并將它激活 。此外 還有USB -Blaster下載器的驅(qū)動(dòng)安裝步驟 。
    發(fā)表于 09-18 14:55 ?9次下載

    手把手教你在家搭建監(jiān)控系統(tǒng)

    手把手教你在家搭建監(jiān)控系統(tǒng)
    發(fā)表于 01-17 19:47 ?25次下載

    手把手教你如何開始DSP編程

    手把手教你如何開始DSP編程。
    發(fā)表于 04-09 11:54 ?12次下載
    <b class='flag-5'>手把手</b><b class='flag-5'>教你</b>如何開始DSP編程

    手把手教你學(xué)LabVIEW視覺設(shè)計(jì)

    手把手教你學(xué)LabVIEW視覺設(shè)計(jì)手把手教你學(xué)LabVIEW視覺設(shè)計(jì)
    發(fā)表于 03-06 01:41 ?3066次閱讀

    手把手教你使用LabVIEW OpenCV dnn實(shí)現(xiàn)圖像分類(源碼

    使用LabVIEW OpenCV dnn實(shí)現(xiàn)圖像分類
    的頭像 發(fā)表于 03-09 13:37 ?1164次閱讀

    手把手教你學(xué)FPGA仿真

    電子發(fā)燒友網(wǎng)站提供《手把手教你學(xué)FPGA仿真.pdf》資料免費(fèi)下載
    發(fā)表于 10-19 09:17 ?2次下載
    <b class='flag-5'>手把手</b><b class='flag-5'>教你</b>學(xué)FPGA仿真