|

【AI_Column】如何以YOLOv3訓練自己的資料集 ─ 以小蕃茄為例

   
作者:許哲豪 Jack

在人工智慧的電腦視覺領域中,最常見的應用包括影像分類、物件偵測、像素級物件影像分割(語義分割及實例分割),其中以物件偵測的應用範圍最廣。

近年來物件偵測的算法(模型)不斷推陳出新,從最早的二階式(R-CNN、Fast R-CNN、Faster R-CNN)高精度算法演變到現在一階式(YOLO、SSD、R-FCN)高效算法,在這之中以 YOLO(You Only Look Once)系列最受大家喜愛。

目前 YOLO 已演進至第三代(下簡稱 YOLO v3),其主要搭配 Microsoft COCO 物件偵測 80 分類做為預設訓練資料集,如果只需偵測常見物件偵測(如人、動物、車輛等),那直接利用 YOLO 預訓練好的模型及權重值就可應用到實際場域了,不過這 80 類物件通常很難滿足我們的需求,因此如果想應用自己準備的資料集,如何收集(取像)、標註、訓練資料集及進行最後的推論就顯得非常重要,接下來就以辨識(偵測)小蕃茄為例為大家介紹完整的工作流程:

建構、標註、訓練及推論自己的資料集工作流程(圖片來源:OmniXRI)

此次會以小蕃茄為例主要是受到去年 FarmBot Taiwan User Group(FBTUG)總召哈爸號召多位創客高手及科技農夫創作的台版「開源採收機器人(HarvestBot)」專案所激勵。當時有許多電腦視覺及人工智慧高手投入水果的物件辨識(位置及尺寸,不含深度距離)程式開發,主要實驗對象是彩椒和柑橘,但受限於人力及優先順序,小蕃茄辨識部份暫被擱置。

由於今年接到 Intel 邀約分享 RealSense D435 深度感測器應用案例,因此想到重啟小蕃茄辨識案,同時也希望解決去年無法處理的深度(距離)計算的問題。由於撰文當下並不是小蕃茄產季,也沒有伙伴能提供實際場域取像,因此直接上網買了一串假的塑膠小蕃茄作為實驗對象,說實在的,除了綠色的蒂頭比較塑膠感外,整體而言非常逼真,很適合作為測試範本。以下所有範例程式、資料集皆可從筆者的OmniXRI部落格Github 取得,請多多利用。

建立資料集

為了使後續訓練的成果較理想,取像和訓練影像條件要盡可能接近,因此這裡直接使用 RealSense D435取像(彩色影像),而不採用其它高階、高解析度的攝影機,另外這麼做還能順便取得因攝影機本身受光照(白平衡、亮度、對比、色相等)及其它干擾產生的雜訊(如熱雜訊、低照度雜訊等)。

通常如果要作為深度學習的影像資料集,少說得取得幾千張,甚至數十萬張影像,但這裡只是示範如何建構,因此僅對小蕃茄的正反面各取數十張影像當作測試,其取像及測試環境如下圖所示,後續也可依需求自行增加影像的數量,至於如何取得 RealSense D435 的彩色影像可參考【3D感測器】如何擷取Intel RealSense™串流影像到OpenCV

會員福利
1

免費電子報

2

會員搶先看

3

主題訂閱

4

好文收藏

Author: 許 哲豪

工作經驗超過二十年,主要專長機電整合、電腦視覺、人機互動、人工智慧、專利分析及新創輔導。曾任機電整合工程師、機器視覺研發副理、技轉中心商業發展經理。目前擔任多家公司兼任技術顧問並積極推廣實境互動相關技術。 主持歐尼克斯實境互動工作室(OmniXRI):http://omnixri.blogspot.com Edge AI Taiwan邊緣智能交流區:https://www.facebook.com/groups/edgeaitw/

Share This Post On

32 Comments

  1. 許先生你好,
    可否請教先進一個問題。
    我剛開始學習深度學習,
    現在只是按書本操練,
    但是我發現自己系統的一個問題,
    比如 Mnist的樣本有60000筆,
    我看書上一個Epoch
    它都是從1/50000到50000/50000.
    但是我的系統
    就只會出現
    1/1250到 1250/1250.
    可否給個建議,看是從哪裡著手來查,或是說我必須重灌電腦。

    目前我的記憶體有128GB
    顯卡記憶體也有24GB
    windows10
    tensorflow 2.5
    keras 也是2.4
    謝謝你。

    Post a Reply
    • 一般資料集會分為訓練集、驗證集及測試集,60000筆只拿了50000筆來訓練及驗證,所以一個Epoch才會只有50000。
      若你只出現1250,建議你檢查一下關於訓練相關的設定值。
      另外我最近有寫一篇新的Yolov4自定義資料集物件偵測文章可參考一下。
      https://omnixri.blogspot.com/2021/05/google-colabyolov4-tiny.html
      ps. mnist是影像分類不是物件偵測。

      Post a Reply
  2. 老师,为什么我训练到一半就结束了?没有完全训练完成。请问是不是图像集太少?

    Post a Reply
    • 訓練若已收歛,或說LOSS已低過某過數值,就會停止。資料集過少,的確有可能產生過擬合現象,提早結束。但實際狀況仍需以錯誤訊息為主。

      Post a Reply
  3. 老師您好,目前是在做辨識日月潭新八景的研究,目前預估有點困難因為山水在日月潭的重覆率太高了,我的研究是希望用一些小物件去,如自行車道欄杆,或者自行車等等去判別八景…
    老師滿想知道yolov3的辨識能力到哪裡,是否可以徵辨識特定的山水呢?或是還是需要找一些物件去代表其中幾個八景。

    Post a Reply
    • 在影像辨識中最重要的是建立良好的已標註資料集,不管是影像分類還是物件偵測,如果一般人看到一張照片都分不出來是那個分類,那就不要為難電腦了,因為在標註上肯定會出狀況。
      一般要有好的辨識結果模型雖很重要,但大部份問題還是會出在資料集及標註,若資料集大小太小(只有幾百張)或分類極不平均時,通常不會得到太好的成果。
      如果反過來從網路上收集大家拍過的八景照片,或許能更明確指出分類重點為何,同時也被清楚標註,那資料集一多,才有討論模型辨識能力的空間。

      Post a Reply
  4. 您好想請問一下,訓練的資料每個物件大約需要幾張呢?各種角度個需要幾張才算是合適,如果像向山遊客中心這樣大型的物件是不是要分成幾個部份去訓練呢?

    Post a Reply
    • 資料集越多越好,且要多樣性(不同視點、光照等),通常要數千張才會有較理想訓練結果。
      有時沒這麼多(只有數十張)可採資料擴增(Data Augmentation)或改以遷移學習(Transfer Learning)方式處理,但和本範例方式做法不同,須另外參考其它人的文章。
      另外訓練時一定要一起訓練,目前常見的模型多半都不支援分成多個部份訓練後再組合。

      Post a Reply
  5. 您好 我訓練完的weights包含兩種class,不過在我開啟webcam辨識的時候,會在一些奇怪的地方框出1信任度的框框,例如Chair calss,在全黑的時候 他會框出chair信任度為1,我目前就是簡單些,多設一個other class避免辨識出現問題,但other class是我不需要的,所以如果想將它disable掉的話,程式碼需要怎麼做修正呢?

    Post a Reply
  6. 您好, 請教一下, 因為想在 Intel OpenVINO 下執行, 所以訓練結果的 Keras Model 權重檔 .h5 格式 如何利用 MO 轉 IR? MO 是否支援 DarkNet Model *.weights 格式進行轉換 IR?

    Post a Reply
    • 本文中有提到“由於此次使用的是 Keras 框架,所以須把下載到的 YOLO 預訓練權重值轉成 Keras 格式(*.h5),執行本部落格 Github 下 convert.py 即可轉換完成並置於 \model_data 下,其完整指令如下所示。
      python convert.py -w yolov3.cfg yolov3.weights model_data/yolo_weights.h5
      ”,所以MO目前是不支援Keras, Darknet轉IR,目前只支援ONNX, TensorFolw, MXNet, Kaldi。舊版的對於YOLOV3支援上時會有問題,從TensorFlow轉過來的YOLOV3會無法使用,要用OpenVINO指定YOLOV3工作程序。目前新版2020.3的對YOLOV3已較友善了。

      Post a Reply
  7. 不好意思想請教一下 如何在訓練過程中顯示accuracy呢
    目前用過在model.complie()加上metrics=[‘accuracy’]但會有list index out of range的error

    Post a Reply
  8. 不好意思想請教一下 有沒有辦法可以在訓練過程中顯示accuracy呢
    目前是在model.compile()加上metrics=[‘accuracy’] 但會有outputshape 問題

    Post a Reply
  9. 您好,我想請問一下我在執行convert.py時不太清楚output_path需要改成哪個路徑嗎?

    Post a Reply
    • 你可以使用目前路徑或指定路徑,重點是轉出來的檔案路徑要再指定給下一個動作使用。

      Post a Reply
  10. 請教一下,錨點的檔案是怎麼做出來的?有沒有需要針對不同類型的樣本訓練做改變嗎?如果是的話,要怎麼改,或者說怎麼去生成這個檔案?

    Post a Reply
    • 關於錨點及YoloV3相關設定可參考https://github.com/OmniXRI/OpenVINO_RealSense_HarvestBot/tree/master/my_yolo3/my_yolov3.cfg,對於其重要參數設定說明可參考本文提到CH大的“【採果辨識】建立自己的YOLO影像辨識模型 — 以柑橘為例”,https://makerpro.cc/2019/08/build-your-yolo-recognition-model/。

      Post a Reply
  11. 想請問一下,如果想要改成用鏡頭當作輸入,要改那些程式碼

    Post a Reply
    • 我原本就是用一般 WEBCAM 取像,為了方便訓練才把影像存成一個一個的檔案。所以你只須將WEBCAM取到的影像先存檔後再標註後即可訓練。訓練完後就WEBCAM讀入的影像可直接推論不用再轉存影像檔再讀檔才推論。以OpenCV舉例宣告一個 cv::VideoCapture cap; cv::Mat frame; cap >> frame; 再對frame進行推論即可。

      Post a Reply
      • 我有訓練成功並用影片測試完了,請問要怎麼對frame推論,是用detect_image(frame)嗎,還是要用detect_video

        Post a Reply
        • 如同本文「影像推論」說明”訓練完成就可以來測試推論效果如何,執行本部落格 Github 下 my_yolo.py 即可,這裡為求簡單起見,直接於程式第 216 列指定待推論影像檔(如果想改成外部參數或變成對影片檔連續推論可自行修改)。

          Post a Reply
  12. 您好!想請教一下
    我在訓練自己蒐集的資料時
    下了訓練的指令(darknet.exe detector train …..)後
    顯示如下
    CUDA-version: 9010 (10020), cuDNN: 7.0.5, CUDNN_HALF=1, GPU count: 1
    CUDNN_HALF=1
    OpenCV version: 3.4.0
    yolov3-tiny
    0 : compute_capability = 610, cudnn_half = 0, GPU: GeForce GTX 1070 Ti
    net.optimized_memory = 0
    mini_batch = 32, batch = 64, time_steps = 1, train = 1
    [yolo] params: iou loss: mse (2), iou_norm: 0.75, cls_norm: 1.00, scale_x_y: 1.00
    17 route 13 -> 13 x 13 x 256
    18 conv 128 1 x 1/ 1 13 x 13 x 256 -> 13 x 13 x 128 0.011 BF
    19 upsample 2x 13 x 13 x 128 -> 26 x 26 x 128
    20 route 19 8 -> 26 x 26 x 384
    21 conv 256 3 x 3/ 1 26 x 26 x 384 -> 26 x 26 x 256 1.196 BF
    22 conv 24 1 x 1/ 1 26 x 26 x 256 -> 26 x 26 x 24 0.008 BF
    23 yolo
    [yolo] params: iou loss: mse (2), iou_norm: 0.75, cls_norm: 1.00, scale_x_y: 1.00
    Total BFLOPS 5.451
    avg_outputs = 325268
    Allocate additional workspace_size = 33.55 MB
    Loading weights from yolov3-tiny.weights…
    seen 64, trained: 32013 K-images (500 Kilo-batches_64)
    Done! Loaded 24 layers from weights-file
    Learning Rate: 0.001, Momentum: 0.9, Decay: 0.0005
    If error occurs – run training with flag: -dont_show
    Saving weights to D://darknet-master/build/darknet/x64/data/tiny_yolov3-train/backup/yolov3-tiny_final.weights
    Create 6 permanent cpu-threads

    然後就結束了(跳回要輸入指令的狀態)
    這樣似乎是沒有成功開始訓練(?)
    想請問您是否知道會是什麼情況下會造成這種結果,該如何解決呢?

    謝謝你

    Post a Reply
  13. File “C:\Users\FangMing.conda\envs\tensorflow\lib\site-packages\keras\backend\tensorflow_backend.py”, line 381, in get_session

    1
    get_session

    is not available ‘

    RuntimeError:

    1
    get_session

    is not available when using TensorFlow 2.0.
    請問這個錯誤該怎麼解決呢?

    Post a Reply
    • 這個範例用的是Tensorflow 1.4版,但你好像用的是Tensorflow 2.0版,所以會出現這個問題。

      Post a Reply
  14. 你好,想請教一下在訓練自己的資料時yolov3.cfg不需要更改嗎?

    Post a Reply

Submit a Comment

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *