色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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)圖像分類(含源碼)

王立奇 ? 來(lái)源:wangstoudamire ? 作者:wangstoudamire ? 2023-03-09 13:37 ? 次閱讀

前言

上一篇和大家一起分享了如何使用LabVIEW OpenCV dnn實(shí)現(xiàn)手寫數(shù)字識(shí)別,今天我們一起來(lái)看一下如何使用LabVIEW OpenCV dnn實(shí)現(xiàn)圖像分類

一、什么是圖像分類?

1、圖像分類的概念

圖像分類 ,核心是從給定的分類集合中給圖像分配一個(gè)標(biāo)簽的任務(wù)。實(shí)際上,這意味著我們的任務(wù)是分析一個(gè)輸入圖像并返回一個(gè)將圖像分類的標(biāo)簽。標(biāo)簽總是來(lái)自預(yù)定義的可能類別集。

示例:我們假定一個(gè)可能的類別集categories = {dog, cat, eagle},之后我們提供一張圖片(下圖)給分類系統(tǒng)。這里的目標(biāo)是根據(jù)輸入圖像,從類別集中分配一個(gè)類別,這里為eagle,我們的分類系統(tǒng)也可以根據(jù)概率給圖像分配多個(gè)標(biāo)簽,如eagle:95%,cat:4%,panda:1%

在這里插入圖片描述

2、MobileNet簡(jiǎn)介

MobileNet :基本單元是深度級(jí)可分離卷積(depthwise separable convolution),其實(shí)這種結(jié)構(gòu)之前已經(jīng)被使用在Inception模型中。深度級(jí)可分離卷積其實(shí)是一種可分解卷積操作(factorized convolutions),其可以分解為兩個(gè)更小的操作:depthwise convolution和pointwise convolution,如圖1所示。Depthwise convolution和標(biāo)準(zhǔn)卷積不同,對(duì)于標(biāo)準(zhǔn)卷積其卷積核是用在所有的輸入通道上(input channels),而depthwise convolution針對(duì)每個(gè)輸入通道采用不同的卷積核,就是說(shuō)一個(gè)卷積核對(duì)應(yīng)一個(gè)輸入通道,所以說(shuō)depthwise convolution是depth級(jí)別的操作。而pointwise convolution其實(shí)就是普通的卷積,只不過(guò)其采用1x1的卷積核。圖2中更清晰地展示了兩種操作。對(duì)于depthwise separable convolution,其首先是采用depthwise convolution對(duì)不同輸入通道分別進(jìn)行卷積,然后采用pointwise convolution將上面的輸出再進(jìn)行結(jié)合,這樣其實(shí)整體效果和一個(gè)標(biāo)準(zhǔn)卷積是差不多的,但是會(huì)大大減少計(jì)算量和模型參數(shù)量。

在這里插入圖片描述

MobileNet的網(wǎng)絡(luò)結(jié)構(gòu)如表所示。首先是一個(gè)3x3的標(biāo)準(zhǔn)卷積,然后后面就是堆積depthwise separable convolution,并且可以看到其中的部分depthwise convolution會(huì)通過(guò)strides=2進(jìn)行down sampling。然后采用average pooling將feature變成1x1,根據(jù)預(yù)測(cè)類別大小加上全連接層,最后是一個(gè)softmax層。如果單獨(dú)計(jì)算depthwise convolution和pointwise convolution,整個(gè)網(wǎng)絡(luò)有28層(這里Avg Pool和Softmax不計(jì)算在內(nèi))。

在這里插入圖片描述

二、使用python實(shí)現(xiàn)圖像分類(py_to_py_ssd_mobilenet.py)

1、獲取預(yù)訓(xùn)練模型

  • 使用tensorflow.keras.applications獲取模型(以mobilenet為例);
from tensorflow.keras.applications import MobileNet
    original_tf_model = MobileNet(
        include_top=True,
        weights="imagenet"
    )
  • 把original_tf_model打包成pb
def get_tf_model_proto(tf_model):
    # define the directory for .pb model
    pb_model_path = "models"
?
    # define the name of .pb model
    pb_model_name = "mobilenet.pb"
?
    # create directory for further converted model
    os.makedirs(pb_model_path, exist_ok=True)
?
    # get model TF graph
    tf_model_graph = tf.function(lambda x: tf_model(x))
?
    # get concrete function
    tf_model_graph = tf_model_graph.get_concrete_function(
        tf.TensorSpec(tf_model.inputs[0].shape, tf_model.inputs[0].dtype))
?
    # obtain frozen concrete function
    frozen_tf_func = convert_variables_to_constants_v2(tf_model_graph)
    # get frozen graph
    frozen_tf_func.graph.as_graph_def()
?
    # save full tf model
    tf.io.write_graph(graph_or_graph_def=frozen_tf_func.graph,
                      logdir=pb_model_path,
                      name=pb_model_name,
                      as_text=False)
?
    return os.path.join(pb_model_path, pb_model_name)
?

2、使用opencv_dnn進(jìn)行推理

  • 圖像預(yù)處理(blob)
def get_preprocessed_img(img_path):
    # read the image
    input_img = cv2.imread(img_path, cv2.IMREAD_COLOR)
    input_img = input_img.astype(np.float32)
?
    # define preprocess parameters
    mean = np.array([1.0, 1.0, 1.0]) * 127.5
    scale = 1 / 127.5
?
    # prepare input blob to fit the model input:
    # 1. subtract mean
    # 2. scale to set pixel values from 0 to 1
    input_blob = cv2.dnn.blobFromImage(
        image=input_img,
        scalefactor=scale,
        size=(224, 224),  # img target size
        mean=mean,
        swapRB=True,  # BGR -> RGB
        crop=True  # center crop
    )
    print("Input blob shape: {}\\n".format(input_blob.shape))
?
    return input_blob
  • 調(diào)用pb模型進(jìn)行推理
def get_tf_dnn_prediction(original_net, preproc_img, imagenet_labels):
    # inference
    preproc_img = preproc_img.transpose(0, 2, 3, 1)
    print("TF input blob shape: {}\\n".format(preproc_img.shape))
?
    out = original_net(preproc_img)
?
    print("\\nTensorFlow model prediction: \\n")
    print("* shape: ", out.shape)
?
    # get the predicted class ID
    imagenet_class_id = np.argmax(out)
    print("* class ID: {}, label: {}".format(imagenet_class_id, imagenet_labels[imagenet_class_id]))
?
    # get confidence
    confidence = out[0][imagenet_class_id]
    print("* confidence: {:.4f}".format(confidence))

3、實(shí)現(xiàn)圖像分類 (代碼匯總)

import os
?
import cv2
import numpy as np
import tensorflow as tf
from tensorflow.keras.applications import MobileNet
from tensorflow.python.framework.convert_to_constants import convert_variables_to_constants_v2
?
?
?
?
def get_tf_model_proto(tf_model):
    # define the directory for .pb model
    pb_model_path = "models"
?
    # define the name of .pb model
    pb_model_name = "mobilenet.pb"
?
    # create directory for further converted model
    os.makedirs(pb_model_path, exist_ok=True)
?
    # get model TF graph
    tf_model_graph = tf.function(lambda x: tf_model(x))
?
    # get concrete function
    tf_model_graph = tf_model_graph.get_concrete_function(
        tf.TensorSpec(tf_model.inputs[0].shape, tf_model.inputs[0].dtype))
?
    # obtain frozen concrete function
    frozen_tf_func = convert_variables_to_constants_v2(tf_model_graph)
    # get frozen graph
    frozen_tf_func.graph.as_graph_def()
?
    # save full tf model
    tf.io.write_graph(graph_or_graph_def=frozen_tf_func.graph,
                      logdir=pb_model_path,
                      name=pb_model_name,
                      as_text=False)
?
    return os.path.join(pb_model_path, pb_model_name)
?
?
def get_preprocessed_img(img_path):
    # read the image
    input_img = cv2.imread(img_path, cv2.IMREAD_COLOR)
    input_img = input_img.astype(np.float32)
?
    # define preprocess parameters
    mean = np.array([1.0, 1.0, 1.0]) * 127.5
    scale = 1 / 127.5
?
    # prepare input blob to fit the model input:
    # 1. subtract mean
    # 2. scale to set pixel values from 0 to 1
    input_blob = cv2.dnn.blobFromImage(
        image=input_img,
        scalefactor=scale,
        size=(224, 224),  # img target size
        mean=mean,
        swapRB=True,  # BGR -> RGB
        crop=True  # center crop
    )
    print("Input blob shape: {}\\n".format(input_blob.shape))
?
    return input_blob
?
?
def get_imagenet_labels(labels_path):
    with open(labels_path) as f:
        imagenet_labels = [line.strip() for line in f.readlines()]
    return imagenet_labels
?
?
def get_opencv_dnn_prediction(opencv_net, preproc_img, imagenet_labels):
    # set OpenCV DNN input
    opencv_net.setInput(preproc_img)
?
    # OpenCV DNN inference
    out = opencv_net.forward()
    print("OpenCV DNN prediction: \\n")
    print("* shape: ", out.shape)
?
    # get the predicted class ID
    imagenet_class_id = np.argmax(out)
?
    # get confidence
    confidence = out[0][imagenet_class_id]
    print("* class ID: {}, label: {}".format(imagenet_class_id, imagenet_labels[imagenet_class_id]))
    print("* confidence: {:.4f}\\n".format(confidence))
?
?
def get_tf_dnn_prediction(original_net, preproc_img, imagenet_labels):
    # inference
    preproc_img = preproc_img.transpose(0, 2, 3, 1)
    print("TF input blob shape: {}\\n".format(preproc_img.shape))
?
    out = original_net(preproc_img)
?
    print("\\nTensorFlow model prediction: \\n")
    print("* shape: ", out.shape)
?
    # get the predicted class ID
    imagenet_class_id = np.argmax(out)
    print("* class ID: {}, label: {}".format(imagenet_class_id, imagenet_labels[imagenet_class_id]))
?
    # get confidence
    confidence = out[0][imagenet_class_id]
    print("* confidence: {:.4f}".format(confidence))
?
?
def main():
    # configure TF launching
    #set_tf_env()
?
    # initialize TF MobileNet model
    original_tf_model = MobileNet(
        include_top=True,
        weights="imagenet"
    )
?
    # get TF frozen graph path
    full_pb_path = get_tf_model_proto(original_tf_model)
    print(full_pb_path)
?
    # read frozen graph with OpenCV API
    opencv_net = cv2.dnn.readNetFromTensorflow(full_pb_path)
    print("OpenCV model was successfully read. Model layers: \\n", opencv_net.getLayerNames())
?
    # get preprocessed image
    input_img = get_preprocessed_img("yaopin.png")
?
    # get ImageNet labels
    imagenet_labels = get_imagenet_labels("classification_classes.txt")
?
    # obtain OpenCV DNN predictions
    get_opencv_dnn_prediction(opencv_net, input_img, imagenet_labels)
?
    # obtain TF model predictions
    get_tf_dnn_prediction(original_tf_model, input_img, imagenet_labels)
?
?
if __name__ == "__main__":
    main()
?

三、使用LabVIEW dnn實(shí)現(xiàn)圖像分類(callpb_photo.vi)

本博客中所用實(shí)例基于****LabVIEW2018版本 ,調(diào)用mobilenet pb模型

1、讀取待分類的圖片和pb模型

在這里插入圖片描述

2、將待分類的圖片進(jìn)行預(yù)處理

在這里插入圖片描述

3、將圖像輸入至神經(jīng)網(wǎng)絡(luò)中并進(jìn)行推理

在這里插入圖片描述

4、實(shí)現(xiàn)圖像分類

在這里插入圖片描述

5、總體程序源碼:

按照如下圖所示程序進(jìn)行編碼,實(shí)現(xiàn)圖像分類,本范例中使用了一分類,分類出置信度最高的物體。

在這里插入圖片描述

如下圖所示為加載藥瓶圖片得到的分類結(jié)果,在前面板可以看到圖片和label:

在這里插入圖片描述

四、源碼下載

鏈接: https://pan.baidu.com/s/10yO72ewfGjxAg_f07wjx0A?pwd=8888

**提取碼:8888 **

審核編輯 黃宇

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

    關(guān)注

    1970

    文章

    3654

    瀏覽量

    323383
  • 人工智能
    +關(guān)注

    關(guān)注

    1791

    文章

    47208

    瀏覽量

    238298
  • 圖像分類
    +關(guān)注

    關(guān)注

    0

    文章

    90

    瀏覽量

    11915
  • OpenCV
    +關(guān)注

    關(guān)注

    31

    文章

    635

    瀏覽量

    41340
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

    【原創(chuàng)視頻】小草手把手教你LabVIEW之VISION圖像采集

    點(diǎn)擊學(xué)習(xí)>>《龍哥手把手教你學(xué)LabVIEW視覺(jué)設(shè)計(jì)》視頻教程視頻內(nèi)容:手把手講解如何通過(guò)筆記本自帶攝像頭,或者一般USB攝像頭,通過(guò)directshow來(lái)獲取
    發(fā)表于 05-01 12:37

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

    /jishu_484288_1_1.html小草手把手教你LabVIEW之VISION圖像采集(20150501)https://bbs.elecfans.com/jishu_4800
    發(fā)表于 05-26 13:48

    手把手教你LabVIEW儀器控制

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

    手把手教你構(gòu)建一個(gè)完整的工程

    手把手教你構(gòu)建一個(gè)完整的工程
    發(fā)表于 08-03 09:54 ?33次下載
    <b class='flag-5'>手把手</b><b class='flag-5'>教你</b>構(gòu)建一個(gè)完整的工程

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

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

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

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

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

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

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

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

    手把手教你安裝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次下載

    手把手教你如何開(kāi)始DSP編程

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

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

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

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

    LabVIEW中如何使用OpenCV DNN模塊實(shí)現(xiàn)手寫數(shù)字識(shí)別
    的頭像 發(fā)表于 03-08 16:10 ?1745次閱讀

    手把手教你學(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仿真
    主站蜘蛛池模板: 一区二区中文字幕在线观看 | 天美传媒MV高清免费看| 亚洲国产欧美在线看片| 最近更新2019中文字幕免费| 大胸美女被C得嗷嗷叫动态图| 国产在线精品亚洲| 男人脱女人衣服吃奶视频| 吸奶舔下面| 99久久久无码国产精品不卡按摩 | 三级在线观看网站| 伊人久久五月丁婷婷| 国产1000部成人免费视频| 久久影院午夜理论片无码| 无码任你躁久久久久久老妇双奶| 中文字幕无线手机在线| 国产精品久久久久久人妻香蕉 | 国产亚洲精品久久777777| 免费成年人在线视频| 亚洲 自拍 清纯 综合图区| 99re5久久热在线| 狠狠色狠狠色综合| 色噜噜视频影院| 69式国产真人免费视频| 交换:年轻夫妇-HD中文字幕| 秋霞电影在线观看午夜伦| 再插深点嗯好大好爽| 国产视频成人| 日本视频一区二区免费观看| 中文字幕在线观看亚洲视频| 国产免费久久爱久久啪| 日本妞欧洲| 97人妻丰满熟妇AV无码| 最新亚洲中文字幕在线观看| 国产午夜伦鲁鲁| 日日摸夜夜添夜夜爽出水| 91香蕉福利一区二区三区| 精品久久免费视频| 亚洲AV久久无码精品九号软件| 吃寂寞寡妇的奶| 欧美写真视频一区| 24小时日本在线观看片|