mmdetection原始碼解讀(一)

2021-09-28 11:31:59 字數 4039 閱讀 1409

一、安裝測試:(官方github上很詳細)

測試:

show_result(img_path, result, model.classes)測試注意事項:

1. mmdetection目前不支援windos系統,我使用ubuntu16.04

如果跑通應該沒啥問題了。

二:mmdetection/utils/registry.py 文件解讀:

import inspect

import mmcv

class registry(object):

"""這裡主要實現乙個registry類,用來規範註冊網路的各個模組,比如backebone, neck,還有dataset,pipeline等等這些模組。

""" def __init__(self, name):

self._name = name

self._module_dict = dict()

def __repr__(self):

"""這個函式主要是給類乙個輸出,我的理解是就是輸出類相關資訊。

用下面的**自己測試看看。

#from mmdet.utils import registry

#print(registry('backbone'))

"""format_str = self.__class__.__name__ + '(name={}, items={})'.format(

self._name, list(self._module_dict.keys()))

return format_str

@property #負責修飾乙個物件函式,讓類生成成員變數對應的setter和getter函式

def name(self):

return self._name

@property

def module_dict(self):

return self._module_dict

def get(self, key):

return self._module_dict.get(key, none)

def _register_module(self, module_class):

"""register a module.

args:

module (:obj:`nn.module`): module to be registered.

"""if not inspect.isclass(module_class):

raise typeerror('module must be a class, but got {}'.format(

type(module_class)))

module_name = module_class.__name__

if module_name in self._module_dict:

raise keyerror('{} is already registered in {}'.format(

module_name, self.name))

self._module_dict[module_name] = module_class

def register_module(self, cls):

self._register_module(cls)

return cls

def build_from_cfg(cfg, registry, default_args=none):

"""這個函式大意就是從config檔案中cfg各個模組使用registry進行註冊。

build a module from config dict.

args:

cfg (dict): config dict. it should at least contain the key "type".

registry (:obj:`registry`): the registry to search the type from.

default_args (dict, optional): default initialization arguments.

returns:

obj: the constructed object.

"""assert isinstance(cfg, dict) and 'type' in cfg

assert isinstance(default_args, dict) or default_args is none

args = cfg.copy()

obj_type = args.pop('type')

if mmcv.is_str(obj_type):

obj_cls = registry.get(obj_type)

if obj_cls is none:

raise keyerror('{} is not in the {} registry'.format(

obj_type, registry.name))

elif inspect.isclass(obj_type):

obj_cls = obj_type

else:

raise typeerror('type must be a str or valid type, but got {}'.format(

type(obj_type)))

if default_args is not none:

for name, value in default_args.items():

args.setdefault(name, value)

return obj_cls(**args)

三:資料集介紹:

mmdetection現在支援coco和voc資料集格式,資料集的格式使用官方介紹的

mmdetection

----------------- data

-----coco

-----vocdevkit

主要巢狀關係是

以mmdetection/mmdet/datasets/cityscapes.py為例:

from .coco import cocodataset

from .registry import datasets

@datasets.register_module

class cityscapesdataset(cocodataset):

"""自定義coco格式資料類<------cocodataset <-----------customdataset <----------dataset(torch.utils.data.dataset)

vocdataset<-----------xmldataset<----------customdataset<--------dataset(同上)

其他一些函式主要是用來讀取分析coco的.json和voc的xml檔案的,具體細節先不談,先了解整體框架

"""classes = ('person', 'rider', 'car', 'truck', 'bus', 'train', 'motorcycle', 'bicycle')

azkaban web server原始碼解析

azkaban主要用於hadoop相關job任務的排程,但也可以應用任何需要排程管理的任務,可以完全代替crontab。azkaban主要分為web server 任務上傳,管理,排程 executor server 接受web server的排程指令,進行任務執行 1.資料表 projects 工...

JDK LinkedHashMap原始碼解析

今天來分析一下jdk linkedhashmap的源 public class linkedhashmapextends hashmapimplements map可以看到,linkedhashmap繼承自hashmap,並且也實現了map介面,所以linkedhashmap沿用了hashmap的大...

Redux原始碼createStore解讀常用方法

const store createstore reducer,preloadedstate enhancer 直接返回當前currentstate,獲取state值,return state 我覺得應該深轉殖乙個新的物件返回,不然有可能會被外部修改 function getstate consol...