已訓練模型在轉檔時遇到的種種問題

你好,我們使用mmclassification Colab的tutorial來進行訓練mobilenet_v2的模型,也有參考kneron mmclassification Github上面的step by step步驟,並在anaconda上進行訓練,兩者在驗證模型時的結果都相同,然而,兩者也同樣都在Pytorch latest.pth轉ONNX檔時分別遇到了問題,請問可以幫忙測試看看是訓練出來的模型有問題還是轉檔上面發生問題嗎?

Tagged:

Comments

  • 您好,

    -Can't open file 'tools/deployment/pytorch2onnx.py' No such file or directory: 您可以在跑程式前,先用Colab的files view找到檔案,再用copy path複製路徑。Colab的路徑,與使用者mount的Google Drive資料夾相關,這個部分可以在網路上找到相關說明。

    -KeyError: 'NORM_MEAN': mobilenet_v2_1x_cats_dogs.py不是原本kneron-mmclassification的檔案,所以不知道裡面有什麼,不過原本範例裡的regnetx-400mf_8xb128_in1k_normalize.py裡面有NORM_MEAN與NORM_STD,可以請您確認有沒有把它正確地放在mobilenet_v2_1x_cats_dogs.py裡面嗎? (上圖是kneron-mmclassification的config,下圖是Colab提供的config,格式需要一致)

    -RuntimeError Only support opset 11 and 12, but got 13: 不太確定您在網路上用的pth轉ONNX方法是如何轉換的,不過我們只支援ONNX v1.7並搭配opset 11或12,請在轉換時確認這些版本。

  • edited September 2022

    您好,經過比對以後,我發現Colab與Github(kneron-mmclassification)兩個教程在訓練模型上的步驟以及所生成的檔案不同,Colab是在訓練(train)過程中就加入了微調(fine-tune)模型,之後才測試(test)。而Github上面則是訓練(train)完後直接測試(test)。

    我們在Colab上面所生成的"mobilenet_v2_1x_cats_dogs.py" 內容與Kneron-mmclassification 原本的"regnetx-400mf_8xb128_in1k_normalize.py" 內容截然不同。

    "mobilenet_v2_1x_cats_dogs.py"的內容反而是跟https://github.com/open-mmlab/mmclassification/blob/master/docs/en/tutorials/finetune.md 這個微調模型教程裡面的檔案相同。

  • edited September 2022

    後來我們決定依照 Kneron-mmclassification的 regnet_step_by_step.md去操作。

    我們將regnetx-400mf_8xb128_in1k.py 裡面的

    確定上述都完成後執行 regnet_step_by_step.md 中 step 1-2 指令 : python tools/train.py configs/regnet/regnetx-400mf_8xb128_in1k.py

    遇到了以下圖片中的Error,我們已經根據圖中有顯示的程式錯誤去找出對應的程式檔案來看過了,也嘗試去Debug,但都不知從何下手。

    由於在操作及修改regnetx-400mf_8xb128_in1k.py時有更動的地方不多,比較明顯的更動就是圖片資料集以及其路徑。

    但如上述列點所述,我們已經依照Tutorial 3 Customize Dataset裡面要求的架構去編排我們的資料集了,但還是發生Error。

    請問該怎麼解決?

  • edited September 2022

    您好,

    for filename, gt_label in samples:

    ValueError: not enough values to unpack (expected 2, got 1)

    有可能是因為samples中,沒有分別拿到filename與gt_label (如下圖)

    有兩種dataset格式符合架構,一種需要annotation file,裡面有圖片的路徑與類別

    另一種格式不需要:

    如果方便的話,可以麻煩您提供您的dataset嗎? 我們會試著跑跑看會不會有相同的錯誤,謝謝您的耐心。


    Update: 另外,請確認是否有安裝mmcv-full (不是mmcv),如果沒有安裝的話,也有可能會造成錯誤。

  • edited September 2022

    您好 !

    我們知道samples要求要有filename跟gt_label,所以有確認過我們的dataset是否符合架構。但也有可能我們真的搞錯dataset編排方式,所以再請您幫我們確認。

    有,在anaconda有安裝mmcv-full !

    以下是我們dataset的雲端連結,是rar檔。

    https://drive.google.com/file/d/10nj1UCroWMtuaz5LUhBKXBCfWpi7tNO4/view?usp=sharing

  • 您好!

    我現在下載您的dataset確認了,可以正常訓練 (但是Validate時會有FileNotFoundError)。 所以不是dataset的問題,不好意思!

    在regnetx-400mf_8xb128_in1k.py裡,我只有改samples_per_gpu與workers_per_gpu,也有在kneron-mmclassification裡新增data與imagenet資料夾:

    如果確認這些都一樣,那也有可能是安裝的問題(例如: mmcv-full版本與PyTorch/CUDA版本不相符)。可以麻煩您再提供安裝的需求的版本嗎?

    這是我在用的版本,不一定要照著這個版本,不過可以給您當作參考:

    Python 3.8 (環境用anaconda)

    CUDA 11.1 (用 $nvcc --version檢查)

    mmcls  0.20.1

    mmcv-full  1.5.0 (mmcv-full是用$pip install mmcv-full==1.5.0 -f https://download.openmmlab.com/mmcv/dist/cu111/torch1.8.0/index.html,因為CUDA版本為11.1,PyTorch版本是1.8.0)

    torch  1.8.0 (PyTorch是用$conda install pytorch==1.8.0 torchvision==0.9.0 torchaudio==0.8.0 cudatoolkit=11.1 -c pytorch -c conda-forge安裝的,因為CUDA版本是11.1。PyTorch與CUDA的版本可以參考這裡: Previous PyTorch Versions | PyTorch)

    torchaudio  0.8.0

    torchvision  0.9.0

  • 您好,

    您說您使用我們的資料集可以正常訓練,所以我將python、CUDA、mmcls、mmcv-full 等環境重新安裝成與您相同的版本。

    我們在regnetx-400mf_8xb128_in1k.py內做的修改也與您完全相同,資料集也是同一個。

    而我帶來了一個好消息跟一個壞消息。

    好消息是 : Github上面的訓練模型指令 python tools/train.py configs/regnet/regnetx-400mf_8xb128_in1k.py 可以正常運作了 !

    壞消息是 : 在訓練過程中 ,出現了這個Error : FileNotFound : [Errno 2] No such file or directory: 'data/imagenet/val\\O_1004.jpg'

    與您上一則留言提到的Validate時會有FileNotFoundError,我們好像也遇到了。

    有確認過, O_1004.jpg 這張圖片有在data/imagenet/val這個資料夾內,txt檔內也有標註。

    我們有注意到錯誤訊息的尾端, FileNotFound : [Errno 2] No such file or directory: 'data/imagenet/val "" \\O_1004.jpg ""

    請問 \\ 代表的是什麼?

    請問該如何解決 ?

  • 您好,

    太好了! 很高興訓練模型指令可以正常運作。

    這個FileNotFoundError,是因為dataset的實際路徑是data/imagenet/val/O/O_xxx.jpg (我是在train的資料夾找到O_1004.jpg的),圖片外面有O跟R的資料夾,所以這個路徑是錯的。

    建議您可以把O與R的圖片,全都放在Val資料夾(Test也是)(所以不放在O跟R資料夾裡),因為meta/val.txt都有標記好了。或是也可以dataset資料夾不改,用meta/val.txt跟meta/test.txt來做標記 (例如: val.txt 的 O_104.jpg 0 改成 O/O_104.jpg 0,標記data/imagenet/val裡面完整的路徑)。

    在Python,\\是代表\,因為\後面加東西通常會有特殊的用法(像說\n代表換行),所以會需要兩個

    這些網站有說明一點: https://www.gushiciku.cn/pl/pemG/zh-tw / https://social.msdn.microsoft.com/Forums/en-US/accf32eb-9471-4026-a679-96175080a78a/folder-or-file-location-slash-quotquot-or-quotquot-?forum=netfxcompact

  • 您好,

    目前訓練模型、訓練模型完測試、測試完轉檔成onnx以及轉檔成功後再次驗證,上述這幾個步驟都成功執行了 ! !

    但是,在測試模型以及轉檔驗證做這兩個步驟時,得到了一個讓我們匪夷所思而且非常尷尬的結果

    accuracy_top-1 以及 accuracy_top-5 數值皆為 0 😱

    資料集圖片分配 : Train佔總圖片數70% 、Test佔總圖片數20% 、Val 佔總圖片數10

    請問這是我們資料集本身就有問題還是參數調整上有問題需要調整呢?

  • edited September 2022

    沒事了,我們解決了 ! 😁😁😁

    謝謝你們給予的所有幫助 !

  • 您好,

    目前我們已經將模型訓練出來了,模型經過測試,以及轉檔後的onnx經過驗證後,準確率皆符合預期。

    然而,在執行regnet_step_by_step.md最後的步驟,要去檢驗是否能真的分辨出類別(class)時,不管我們丟的是範例圖片或是我們自己準備的圖片,

    結果均為 class 1

    執行指令 : python KL720DemoGenericInferenceRegNetX_BypassHwPreProc.py -nef ./example_RegNetX_720.nef -img shark.jpg

    如下圖中,我們有做更動的參數有num_samples(預設為8192)、num_classes(預設為1000),其餘參數皆未更動。

    更動後的數據為 num_samples : 28000num_classes : 10

    • 更動依據 : 總圖片數為25016
    • 更動依據 : 總類別數為2,但如果把num_classes改為2會產生 Error : selected index k out of range,所以才將其調整為10。

    根據mmcls文檔中,分別下列定義

    • num_classes (int) – Number of categories excluding the background category.
    • num_samples (int) – The number of samples to update the bn stats. Defaults to 8192.


    下圖中,我們丟任何圖片進去檢測類別,所有的結果都為 [Result] :Top-1 class id :1 , 但我們的類別,也就是標註文件中,有明確分為類別0以及類別1

    因為我們的Dataset是繼承imagenet 的格式,而imagenet 原始類別有1000種,請問這樣會有直接的影響嗎?

    意思是說因為是繼承的關係,所以它辨識出來的結果是依據imagenet原始的1000種類別,而不是依據我們自己標註的文件。

    或是在前段敘述中提到的num_samples與num_classes參數調整有問題?


  • @Chen-Pocky

    Hi Pocky,

    Dataset是繼承imagenet 的格式,而imagenet 原始類別有1000種,請問這樣會有直接的影響嗎? 我認為不會有直接的影響。

    根據您出現這個的問題,您可能可以從兩個方向嘗試看:

    1. 您有提到 "更動依據 : 總類別數為2,但如果把num_classes改為2會產生 Error : selected index k out of range,所以才將其調整為10。"

    您可以嘗試將 num_classes 改為 2 再試試,Error : selected index k out of range 出現此錯誤訊息的解決方法可以參考以下這個 Link https://github.com/open-mmlab/mmclassification/issues/810


    2. 您有提到 "目前我們已經將模型訓練出來了,模型經過測試,以及轉檔後的onnx經過驗證後,準確率皆符合預期。"(恭喜您!

    您可能在使用 model ToolChain 時,對 model 量化的時候量化用的圖片使用張數不足(建議您使用 100 張圖片去做量化,範例中大概僅使用10圖片做量化),或是您量化的圖片需要跟您訓練模型與推論模型的場景需要有關連性。

    您可以使用 Kneron ToolChain End to End Simulator 去看您的 *.onnx、*.bie and *.nef model inference,您可以參考以下這個 Link (裡面會有使用範例連結) https://doc.kneron.com/docs/#toolchain/python_app/app_flow_manual/#python-api-inference

  • edited September 2022

    您好 ,

    我們量化圖片一直都是超過100張的 (199張),class id 有兩個,分別是 1 跟 0

    我們有先用imagenet範例的NEF檔去測試,它能正確辨識出 imagenet 原有的 1000種類別,

    從0~999都能正確辨識並在[Result]顯示出正確的class id。


    而當使用我們自己訓練的的NEF檔去做的時候, [Result]卻只會顯示 Top-1 class id : 1

    您提供的兩種方法我們都試過了,[Result]依然只會顯示 Top-1 class id : 1 😱

    我們確定步驟上沒問題、資料集沒問題。因為都能正常訓練及生成模型,也都能測試以及驗證。

    唯一可能會發生問題的就是程式,程式裡的參數調整之類的

    請問還有其他方法能解決嗎😓😓?

  • edited September 2022

    @Chen-Pocky

    Hi Pocky,

    是否可以提供您訓練出的 model (onnx.、.nef) 與 一些測試用的 data,我這邊幫您試試看。

    您可以在此 (20220912_ChenPocky) 提供。

  • 沒問題 ! 我們稍作整理過後再上傳

  • 已上傳 ! 麻煩您了 !

  • edited September 2022

    @Chen-Pocky

    Hi Pocky,

    1. 量化模型時使用到的圖片,是不是會直接影響到量化後的準確率? 最多可以用多少張?

    量化模型時使用到的圖片,會直接影響到 .nef model 推論的準確率。

    這邊是建議至少使用 100 張以上圖片做量化,但也可以依據您電腦的效能來提升您的圖片數量,因為有些情況,太多張圖片會使 Kneron Tool Chain 無法順轉換成 .nef model,所以您可以從 100 張、 200 張 、 300 張往上試試看。

    2. batch_size 是否會影響訓練後的辨識度? 如果想修改batch_size 應該去哪裡修改?

    修改 batch_size 這個參數會影響訓練後的辨識度,關於 batch_szie 這個參數的理解您可以參考此 Link: https://github.com/open-mmlab/mmdetection/issues/8342

The discussion has been closed due to inactivity. To continue with the topic, please feel free to post a new discussion.