Detectron2訓練自己的實例分割數據集

本文介紹 Detectron2訓練自己的實例分割數據集

Detectron2訓練自己的實例分割數據集

This article was original written by XRBLS, welcome re-post, first come with https://jinfagang.github.io . but please keep this copyright info, thanks, any question could be asked via wechat: jintianiloveu

本文介紹如何構造自己的類coco數據集,並用detectron2來訓練並預測。實際上detectron2出來已經有幾天了。但這個框架個人感覺離真正工業使用還有點距離,首先第一點是不好部署,其次是相關的其他模型導出支持比較差,比如不支持onnx,同時即便是導出的onnx模型也很難用上一些加速框架進行加速,比如不支持TensorRT。但如果你不是追求速度,用python做推理也是可以的,並且最關鍵的是,你可以用你的數據集訓練你的模型,或者是在這個框架上增加一些自己的修改,看看效果是不是更好之類。

首先看看這個如何來訓練自己的數據集。我們今天要用的數據是這個:

wget https://github.com/Tony607/detectron2_instance_segmentation_demo/releases/download/V0.1/data.zip

這篇文章很大借鑑於原作者的一些嘗試,感興趣的朋友可以給他github一個star。這個data是一個非常非常適合來測試分割的一個微型數據集,小到什麼程度?只有那麼25張圖片。。

類別大概是:

cats: [{'supercategory': 'date', 'id': 1, 'name': 'date'}, {'supercategory': 'fig', 'id': 2, 'name': 'fig'}, {'supercategory': 'hazelnut', 'id': 3, 'name': 'hazelnut'}]

(這裏date的意思是棗椰子,fig的意思是無花果,hazelnut是榛子。)

如果你下載好了數據,那麼基本上我們可以開始了。大家可以看到這個數據集還有一個trainval.json,完全是按照coco的標註方式來標註的。coco的json格式也是目前比較通用的是instance segmentation 或者是Panoptic segmentation標註格式。

Setup Detectron2

關於如何安裝detectron2這裏不展開敘述,大家可以按照github給予的步驟來。這裏給大家幾點提醒:

  • 要python3.6;
  • 要pytorch1.3.

其他的沒有了。

訓練

首先看一下這個非常小非常迷你的數據集,在100次訓練之後的效果:

可以看出來,這個效果還是非常不錯的啊。訓練的腳本也非常簡單:


import random
from detectron2.utils.visualizer import Visualizer
from detectron2.data.catalog import MetadataCatalog, DatasetCatalog
import fruitsnuts_data
import cv2
from detectron2.engine import DefaultTrainer
from detectron2.config import get_cfg
import os
from detectron2.engine.defaults import DefaultPredictor
from detectron2.utils.visualizer import ColorMode


fruits_nuts_metadata = MetadataCatalog.get("fruits_nuts")


if __name__ == "__main__":
    cfg = get_cfg()
    cfg.merge_from_file(
        "../../configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml"
    )
    cfg.MODEL.WEIGHTS = os.path.join(cfg.OUTPUT_DIR, "model_final.pth")
    print('loading from: {}'.format(cfg.MODEL.WEIGHTS))
    cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.5   # set the testing threshold for this model
    cfg.MODEL.ROI_HEADS.NUM_CLASSES = 3
    cfg.DATASETS.TEST = ("fruits_nuts", )
    predictor = DefaultPredictor(cfg)

    data_f = './data/images/2.jpg'
    im = cv2.imread(data_f)
    outputs = predictor(im)
    v = Visualizer(im[:, :, ::-1],
                   metadata=fruits_nuts_metadata,
                   scale=0.8,
                   instance_mode=ColorMode.IMAGE_BW   # remove the colors of unsegmented pixels
                   )
    v = v.draw_instance_predictions(outputs["instances"].to("cpu"))
    img = v.get_image()[:, :, ::-1]
    cv2.imshow('rr', img)
    cv2.waitKey(0)

大家可能覺得這個instance segmention訓練的太容易,那麼來挑戰難度大一點的?

確實,這個堅果數據集實在是太簡單了,簡單到我們甚至打印不出任何訓練過程,一眨眼模型就訓練好了。那就來個難度大一點的吧,我們將用Detectron2訓練Cityscapes的實例分割!

Detectron2 訓練Cityscapes實例分割

儘管在Detectron2裏面有Cityscapes的數據dataloader,但我們並不打算用它,相反,我們覺得使用統一化的coco數據集格式能夠更好的讓數據fit。當我們決定做這件事情的時候犯難了。如何從Cityscapes轉到coco?

好在有這個需求的人不少,這值得我們開發一個工具來轉它。我們維護的現成的工具腳本可以在這裏找到:

https://github.com/jinfagang/cityscapestococo

實際上我們將數據轉到coco之後,發現效果我們想象的還好,因爲這些標註都非常精準,並且包含了我們感興趣的常用類別,比如car,truck,rider,cyclist,motor-cycle等。這些步驟與我們上面訓練堅果數據集的步驟差不多,大家仿造步驟來,首先可視化數據確保我們的數據是準確無誤的。那麼接下里的事情就很簡單了。

看起來似乎還不錯,這些類別衆多而精準,接下來開始train。

這個instance segmention模型訓練完成之後是一種什麼樣的效果呢?模型還在訓練,我們等下一期技術文章發佈之後,給大家分享一下結果,同時,告訴大家一個好消息:

  1. 類似於MaskRCNN這樣的模型速度是很難在實際場景中用起來的,原因也很簡單,我們都需要realtime的東西,這速度差強人意,但是否有人嘗試更輕便的backbone呢?不得而知,不過好消息是實際上通過一些加速框架,是可以把MaskRCNN加速到realtime的。而這些,我們等到detectron2go發佈之後,或許會看得到一些好消息。

本文首發於MANA AI社區,如果你對AI感興趣,歡迎加入我們的社區一起交流:http://t.manaai.cn

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章