Tensorflow的C語言接口部署DeeplabV3+語義分割模型

2021-02-20 OpenCV學堂

tensorflow框架一般都是基於Python調用,但是有些時候跟應用場景,我們希望調用tensorflow C語言的接口,在C++的應用開發中使用它。要這麼幹,首先需要下載tensorflow源碼,完成編譯,然後調用相關的API函數實現C語言版本的調用,完成模型的加載、前向推理預測與解析。

本文主要講DeeplabV3+語義分割模型的tensorflow C接口部署,不涉及到模型的訓練過程,訓練過程可以參考:

https://github.com/tensorflow/models/tree/master/research/deeplab.

官方提供了PASCAL VOC 2012,Cityscapes,ADE20K不同數據集上預訓練好的模型,同時還有基於ImageNet預訓練好的不同backbone網絡, 包括mobilenetv2,xception,resnet,我們可以根據自己的需求來選擇合適的backbone。本文不涉及tensorflow C版本的編譯,只是講解如何通過API調用預訓練模型進行前向推理預測,模型的導出文件為:

frozen_inference_graph.pb

在tensorflow中,輸入數據格式為Tensor格式,有專門的函數讀取圖片及轉換,但這樣給圖像預處理帶來了不便,所以一般情況下,會先用opencv對圖像進行讀取及預處理,再從opencv的Mat格式轉為tensorflow的Tensor格式,代碼如下:區區幾行代碼,卻是參考了無數資料及測試才得出來的,真是心酸

1TF_Tensor* CreateTensor(TF_DataTypedata_type, conststd::int64_t* dims, std::size_tnum_dims, constvoid* data, std::size_tlen) 
2{
3    if (dims == nullptr || data == nullptr) 
4    {
5        returnnullptr;
6    }
7    TF_Tensor* tensor = TF_AllocateTensor(data_type, dims, static_cast<int>(num_dims), len);
8    if (tensor == nullptr) 
9    {
10        returnnullptr;
11    }
12    void* tensor_data = TF_TensorData(tensor);
13    if (tensor_data == nullptr) 
14    {
15        TF_DeleteTensor(tensor);
16        returnnullptr;
17    }
18    std::memcpy(TF_TensorData(tensor), data, std::min(len, TF_TensorByteSize(tensor)));
19    return tensor;
20}
21
22TF_Tensor* Mat2Tensor(cv::Matimg) 
23{
24    conststd::vector<std::int64_t>input_dims = { 1, 513, 513, 3 };
25    autodata_size = sizeof(std::uint8_t);
26    for (autoi : input_dims)
27    {
28        data_size *= i;
29    }
30    cv::resize(img, img, cv::Size(513, 513));
31    cvtColor(img, img, cv::COLOR_RGB2BGR);
32    TF_Tensor* image_input = CreateTensor(TF_UINT8, input_dims.data(), input_dims.size(), img.data, data_size);
33    returnimage_input;
34}

我們在執行推理的過程中,可能並不希望模型使用全部的GPU資源,又或者希望不同模型使用不同的GPU資源,這個時候需要設置。代碼如下:

1TF_SessionOptions *options = TF_NewSessionOptions();
2uint8_tconfig[16] = { 0x32, 0xe, 0x9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x3f, 0x20, 0x1, 0x2a, 0x1, 0x30};
3TF_SetConfig(options, (void*)config, 16, status);

這個是模型使用25%的GPU資源,GPU的id為0,通過如下python代碼即可獲得配置參數。

1import tensorflow as tf
2gpu_options = tf.GPUOptions(allow_growth=True,per_process_gpu_memory_fraction=0.25,visible_device_list='0')
3config = tf.ConfigProto(gpu_options=gpu_options)
4serialized = config.SerializeToString()
5list(map(hex, serialized))
6print(list(map(hex, serialized)))

利用上面的配置,逐步打開及關閉3個模型的GPU使用情況如下圖:

相關焦點

  • OpenCV4 部署DeepLabv3+模型
    此外還支持各種自定義的模型,deeplabv3模型是圖像語義分割常用模型之一,本文我們演示OpenCV DNN如何調用Deeplabv3模型實現圖像語義分割,支持的backbone網絡分別為MobileNet與Inception。
  • 利用DeepLab在Tensorflow中進行語義圖像分割
    語義圖像分割,也就是將「道路」、「天空」、「人」和「狗」等語義標籤分配給圖像中每一個像素的任務,可以實現大量的新應用,例如 Pixel 2 與
  • 使用PixelLib來實現圖像分割
    圖像分割的一些主要應用包括:語義分割:使用相同類別的對象使用相同的顏色映射進行分割。實例分割:它不同於語義分割,它會對同一對象的不同實例用不同的顏色映射來進行分割。PixelLib:是為了在現實生活中更容易實現圖像分割而構建的庫。PixelLib是一個靈活的庫,可以集成到需要應用圖像分割的軟體解決方案中。
  • tensorflow(6)利用tensorflow/serving實現模型部署及預測
    在文章tensorflow(5)將ckpt轉化為pb文件並利用tensorflow/serving實現模型部署及預測中,筆者以一個簡單的例子,來介紹如何在tensorflow中將ckpt轉化為pb文件,並利用tensorflow/serving來實現模型部署及預測。本文將會介紹如何使用tensorflow/serving來實現單模型部署、多模型部署、模型版本控制以及模型預測。
  • 谷歌開源語義圖像分割模型DeepLab-v3+ | 附代碼
    安妮 編譯自 谷歌官方博客量子位 出品 | 公眾號 QbitAI今天,谷歌宣布開源語義圖像分割模型DeepLab-v3+。
  • tensorflow(8)將h5文件轉化為pb文件並利用tensorflow/serving實現模型部署
    在文章Keras入門(七)使用Flask+Keras-bert構建模型預測服務,我們也介紹了如何使用Flask和example.h5文件來實現模型預測的HTTP服務。  本文將會介紹如何將h5文件轉化為pb文件並利用tensorflow/serving實現模型部署。
  • 6 種方法部署 TensorFlow2 機器學習模型,簡單 + 快速 + 跨平臺!
    知識點Keras 導入預訓練模型預訓練模型的使用方法保存模型為 HDF5 格式保存模型為 SavedModel 格式3. 環境配置目前,TensorFlow 2 已正式發布,你需要通過 pip install -U tensorflow 進行升級安裝。
  • 業界 | 谷歌最新語義圖像分割模型DeepLab-v3+今日開源
    GitHub 地址:https://github.com/tensorflow/models/tree/master/research/deeplab語義圖像分割任務是指將語義標籤(例如「道路」、「天空」、「人」、「狗」)分配給圖像中的每一個像素,這種技術有很多新應用,例如,Pixel 2 和 Pixel 2 XL 智慧型手機中肖像模式的合成淺景深效應,以及行動裝置的實時語義分割等
  • 開源 | 5行代碼,快速實現圖像分割
    安裝最新版本的TensorFlow、Pillow、OpenCV-Python、scikit-image和PixelLib:pip3 install tensorflowpip3 install pillowpip3 install opencv-pythonpip3 install scikit-imagepip3 install pixellib
  • 谷歌最新語義圖像分割模型 DeepLab-v3+ 現已開源 | 軟體推介
    >作業系統:跨平臺開發廠商:GoogleGoogle 研究團隊開源在 Tensorflow 中進行語義圖像分割(Semantic Image Segmentation)模型 DeepLab-v3+,包括 Google Pixel 2 和 Pixel 2XL 手機上的人像模式(Portrait Mode),以及 YouTube 為影片實時更換背景功能,都是這項技術的應用。
  • 5行代碼,快速實現圖像分割,代碼逐行詳解,手把手教你處理圖像 | 開源
    安裝最新版本的TensorFlow、Pillow、OpenCV-Python、scikit-image和PixelLib:pip3 install tensorflowpip3 install pillowpip3 install opencv-pythonpip3 install scikit-imagepip3 install pixellib
  • 基於TensorFlow、Docker和Flask部署深度學習模型
    本文翻譯自https://towardsdatascience.com/deploying-deep-learning-models-using-tensorflow-serving-with-docker-and-flask-3b9a76ffbbda通常,任何數據科學項目的生命周期都包括定義問題、收集和預處理數據、然後進行數據分析和預測建模,這其中最棘手的部分是我們模型部署給最終用戶使用
  • TensorFlow 2.0 部署:模型導出
    在部署模型時,我們的第一步往往是將訓練好的整個模型完整導出為一系列標準格式的文件,然後即可在不同的平臺上部署模型文件。這時,TensorFlow 為我們提供了 SavedModel 這一格式。當模型導出為 SavedModel 文件時,無需建立模型的原始碼即可再次運行模型,這使得 SavedModel 尤其適用於模型的分享和部署。後文的 TensorFlow Serving(伺服器端部署模型)、TensorFlow Lite(移動端部署模型)以及 TensorFlow.js 都會用到這一格式。Keras 模型均可方便地導出為 SavedModel 格式。
  • TensorFlow 資源大全中文版
    – DCN的TensorFlow實現TensorFlow實現HMM – 實現HMM的維特比算法和前後向算法DeepOSM – 使用OpenStreetMap和衛星圖像訓練深度學習網絡DQN-tensorflow – TensorFlow通過OpenAI Gym實現深度學習來實現「深度強化學習下達到人類水平的控制」Highway Networks
  • 用 TFserving 部署深度學習模型
    個人簡介:wedo實驗君, 數據分析師;熱愛生活,熱愛寫作1.什麼是TFserving當你訓好你的模型,需要提供給外部使用的時候,你就需要把模型部署到線上,並提供合適的接口給外部調用。你可能會考慮一些問題:目前流行的深度學習框架Tensorflow和Pytorch, Pytorch官方並沒有提供合適的線上部署方案;Tensorflow則提供了TFserving方案來部署線上模型推理。另外,Model Server for Apache MXNet 為MXNet模型提供推理服務。
  • TensorFlow架構與設計:會話生命周期
    前端系統是一個支持多語言的編程環境,並提供統一的編程模型支撐用戶構造計算圖。Client通過Session,連接TensorFlow後端的「運行時」,啟動計算圖的執行過程。後端系統是TensorFlow的運行時系統,主要負責計算圖的執行過程,包括計算圖的剪枝,設備分配,子圖計算等過程。
  • TensorFlow 與 PyTorch 之爭
    論文地址:http://download.tensorflow.org/paper/whitepaper2015.pdfTensorFlow 現已被公司、企業與創業公司廣泛用於自動化工作任務和開發新系統,其在分布式訓練支持、可擴展的生產和部署選項、多種設備(比如安卓)支持方面備受好評。
  • 保姆級教程 | TensorFlow-YOLOv3 從本地訓練到伺服器部署全過程
    本項目主要對原 tensorflow-yolov3 版本做了許多細節上的改進, 增加了TensorFlow-Serving 工程化部署, 訓練了多個數據集,包括 Visdrone2019, 安全帽等數據集, 安全帽上 mAP 在 98% 左右, 推理速度1080上608 的尺寸大概25fps。
  • 手把手教你實現Tensorflow Lite動態庫編譯(適用於Windows端模型部署)
    Linux 和微控制器;(3)支持多種語言,包括 Java、Swift、Objective-C、C++ 和 Python;(4)高性能,支持硬體加速和模型優化;(5)提供多種平臺上的常見機器學習任務的端到端示例,例如圖像分類、對象檢測、姿勢估計、問題回答、文本分類等。
  • 乾貨 | tensorflow模型導出與OpenCV DNN中使用
    (object detetion)模型導出使用,當前支持的模型包括以下:也就是說通過tensorflow object detection API框架進行遷移學習訓練模型,導出預測圖之後,可以通過OpenCV3.4.1以上版本提供幾個python腳本導出graph配置文件,然後就可以在OpenCV DNN模塊中使用tensorflow相關的模型了。