總結本篇是mmdetection原始碼解讀第二篇,主要講解mmdetection是初始化資料類的。本文以coco資料集為例,當然,原始碼解讀不可能面面俱到,重要的是揣摩設計者的思想以及實現過程。另外,本文先暫時不予介紹dataloader構建過程。
通常我們利用pytorch讀取資料集需要構建兩個部分,乙個是資料集初始化,主要完成資料集的儲存路徑;乙個是實現getitem方法,變成迭代器來訓練模型:
這裡解釋下pipline。在mmdetection中,pipline實際上是一系列順序的關於影象讀取,增強,合併的函式。即例項了乙個影象增強物件,之後在getitem中利用transforms對data進行增強。這裡簡單有個理解即可。後續我會詳細介紹。
擷取mmdetection中用於train的訓練集的配置檔案。**:configs/_base_/datasets/coco_detection.。
dataset_type =
'cocodataset'
data_root =
'/home/wujian/wll/mmdet-master/data/coco/'
img_norm_cfg =
dict
( mean=
[123.675
,116.28
,103.53
], std=
[58.395
,57.12
,57.375
], to_rgb=
true
)train_pipeline =
[dict
(type
='loadimagefromfile'),
dict
(type
='loadannotations'
, with_bbox=
true),
dict
(type
='resize'
, img_scale=
(800
,512
), keep_ratio=
true),
dict
(type
='randomflip'
, flip_ratio=
0.5)
,dict
(type
='normalize'
,**img_norm_cfg)
,dict
(type
='pad'
, size_divisor=32)
,dict
(type
='defaultformatbundle'),
dict
(type
='collect'
, keys=
['img'
,'gt_bboxes'
,'gt_labels'])
,]
上述配置檔案中,dataset_type表示讀取coco格式的資料集。data_root是資料集儲存路徑。train_pipline用於影象增強函式的引數檔案。
mmdetection中使用build_dataset函式來完成dataset例項化。
datasets =
[build_dataset(cfg.data.train)
]
@datasets.register_module(
)class
customdataset
(dataset)
: classes =
none
def__init__
(self,
ann_file,
pipeline,
classes=
none
, data_root=
none
, img_prefix='',
seg_prefix=
none
, proposal_file=
none
, test_mode=
false
, filter_empty_gt=
true):
self.ann_file = ann_file
self.data_root = data_root
self.img_prefix = img_prefix
self.seg_prefix = seg_prefix
self.proposal_file = proposal_file
self.test_mode = test_mode
self.filter_empty_gt = filter_empty_gt
self.classes = self.get_classes(classes)
# load annotations (and proposals)
self.data_infos = self.load_annotations(self.ann_file)
# processing pipeline
self.pipeline = compose(pipeline)
這裡初始化了data_root,值得注意的是最後一行self.pipline = compose(pipline),這就是第一部分例項化了乙個影象增強的類。
我們看下compose類:
@pipelines.register_module(
)class
compose
(object):
def__init__
(self, transforms)
:assert
isinstance
(transforms, collections.abc.sequence)
self.transforms =
# transforms即傳入的乙個長度為8,且每個元素是字典的list。
for transform in transforms:
ifisinstance
(transform,
dict):
transform = build_from_cfg(transform, pipelines)
放下getitem函式,依舊在customdataset類內:
def
__getitem__
(self, idx)
:if self.test_mode:
return self.prepare_test_img(idx)
while
true
: data = self.prepare_train_img(idx)
if data is
none
: idx = self._rand_another(idx)
# 這裡寫的魯棒,若idx失效,則隨機讀取另一張影象
continue
return data
defprepare_train_img
(self, idx)
: img_info = self.data_infos[idx]
ann_info = self.get_ann_info(idx)
results =
dict
(img_info=img_info, ann_info=ann_info)
if self.proposals is
notnone
: results[
'proposals'
]= self.proposals[idx]
self.pre_pipeline(results)
return self.pipeline(results)
從函式可以看出:首先借助idx讀取data,然後利用prepare_train_img完成data的影象增強。之後,return data。
以上就是mmdetection中dataset類例項過程。首先初始化路徑以及完成影象增強pipline的例項。然後完成getitem函式。
mmdetection 訓練資料
修改數目類別 下面展示一些內聯 片。model dict roi head dict bbox head dict num classes 1 修改檢測類別名稱 修改檢測類別 注意 當目標類別為一類時需要檢測類別為列表形式不是元組將檢測檔案複製到虛擬環境中。若上述檔案發生變換需要重新執行,重新編譯。...
mmdetection 使用技巧篇
在config檔案中新增 log config dict interval 50,hooks dict type textloggerhook dict type tensorboardloggerhook 生成tensorboard 日誌 設定之後,會在work dir目錄下生成乙個tf logs...
mmdetection原始碼解讀(一)
一 安裝測試 官方github上很詳細 測試 show result img path,result,model.classes 測試注意事項 1.mmdetection目前不支援windos系統,我使用ubuntu16.04 如果跑通應該沒啥問題了。二 mmdetection utils regi...