簡體   English   中英

使用 TF-slim 訓練的模型與 python 推理完美配合,但使用 C++ 給出了完全錯誤的結果

[英]Model trained with TF-slim works perfectly with python inference but gives totally wrong results with C++ one

我已經在我自己的自定義數據上使用TF-slim訓練了一個二類MobileNet_v1 使用 eval_image_classifier.py 代碼測試模型, 此命令的准確度為 0.936。 由於我的實際目標是使用 C++ 代碼部署模型,因此我使用freeze_graph.py和以下命令凍結模型:

python3 freeze_graph.py --input_graph=/path/to/graph.pbtxt \
      --input_checkpoint=/path/to/model.ckpt-CHECKPOINTNUMBER \
      --output_graph=frozen_inference_graph.pb \
      --output_node_names=MobilenetV1/Predictions/Reshape_1

graph.pbtxt與訓練過程一起創建。 我通過在預訓練的MobileNet模型上發出MobileNet代碼來獲得輸出節點名稱。 現在,為了在 C++ 中測試我的模型,我使用了label_image (實際上我有自己的代碼,但為了確保代碼本身,我使用了它),使用以下命令:

bazel-bin/tensorflow/examples/label_image/label_image \
    --image=/path/to/image.jpg --input_layer=fifo_queue_Dequeue \
    --output_layer=MobilenetV1/Predictions/Reshape_1 \
    --graph=frozen_inference_graph.pb --input_width=192 \
    --input_height=42 --labels=Labels.txt --input_mean=0 \
    --input_std=255

為了得到input_layer ,我第一次使用summarize_graph

bazel-bin/tensorflow/tools/graph_transforms/summarize_graph \
  --in_graph=frozen_inference_graph.pb

但是,它沒有給出任何輸入:

--input_layer= --input_layer_type= --input_layer_shape= --output_layer=MobilenetV1/Predictions/Reshape_1

然后,我嘗試通過首先導入凍結模型來使用tensorboard 這是我在那里看到的輸入:

在此處輸入圖片說明

使用上面label_image代碼的命令,無論輸入的圖片是什么,模型都只輸出一類。 我自己的代碼也有同樣的情況,我嘗試盡可能地復制eval_image_classifier.py執行的預處理步驟。 然而,由於結果如此截然不同,我認為這不是預處理的問題。

我查了一些類似的問題這一個 這里提出問題的人已經對權重進行了量化,他說沒有這個結果是一樣的,這不是我的情況。 還有這個,問題似乎在於指定了錯誤的輸入層。 我想我自己的問題也可能是因為輸入層,但我不知道我還能如何確定輸入層名稱? 我也試過prefetch_queue/fifo_queue但它給了我這個錯誤:

Running model failed: Invalid argument: Expects arg[0] to be resource but float is provided

我應該說我對 Tensorflow 比較陌生,到目前為止幾乎只使用過高級 API,而不是詳細的源代碼。 因此,我將不勝感激任何不太專業且為新手提供足夠詳細信息的幫助!

我設法解決了這個問題。 事實證明,您不應該使用 graph.pbtxt 來凍結模型。 為了以正確的方式進行凍結,我們首先需要導出一個推理圖:

python3 export_inference_graph.py --alsologtostderr \
   --model_name=mobilenet_v1 --output_file=unfrozen_graph.pb \
   --dataset_name=custom --dataset_dir=/path/to/data_dir

我以前試過這個,但是使用創建的 unfrozen_graph 和 freeze_graph.py 給了我錯誤,所以我放手了,然后完全忘記了它。 這些錯誤的原因是在export_inference_graph.py代碼中用作默認輸入大小的錯誤輸入大小以及我使用自定義大小訓練我的模型的事實。

長話短說,我使用以下命令凍結了圖表:

python3 freeze_graph.py --input_graph=/path/to/unfrozen_graph.pb \
  --input_binary=true --input_checkpoint=/path/to/model.ckpt-CHECKPOINTNUMBER \
  --output_graph=frozen_inference_graph.pb \
  --output_node_names=MobilenetV1/Predictions/Reshape_1

這一次,凍結圖沒有問題,輸入層名稱為“輸入”(操作:占位符)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM