mmdetection 源码分析

本文主要针对比较火热的 mmdetection 的源代码进行解读说明,记录一下里面细节以及设计上的方案的优势。下文是本人的理解。持续更新。。。

  • 前言:首先引入里面用的Python的基础,以及基础库mmcv,最后在说明mmdetection

python 基础

类与对象

  • python 中类的私有变量是 以双下划线开始的 ,类外不可以访问,如
class A :

	def __init__(self,age, id=1):
 		self.age = age
 		self.id = id
 	@property
 	def age(self):
 		return self.__age
 	
 	@age.setter
 	def age(self, age):
 		self.__age = age
 	
 	@age.deleter
 	def age(self):
 		self.__age = None
obj = A(13) 
print(obj.age)
obj.age = 12
print(obj.age)

del obj.age
print(obj.age) #AttributeError: A instance has no attribute '_A__age'

print getattr(obj, 'name', "xu")       # 属性 name 不存在,但设置了默认值是xu

函数装饰器

  • 函数装饰器property,在类中很常用,好处主要是将方法当成属性使用。有3个常用参数 :obj.age 自动调用getter,
    self.age = 12 自动调用setter, del self.age 调用delete
  • @functools.wraps, 如果我们定义了函数装饰器,装饰一个函数,则这个函数的名字会改变,为了防止这种改变,一般要在装饰
  • 器前加一个 @functools.wraps
  def func(f):
  @functools.wraps(f)
    def wrapper(*args, **kwargs): 
      return f(*args, **kwargs)

    return wrapper
    
  @func
  def myfunc1():
    print("myfunc1")
  @func
  def myfunc2():
    print("myfunc2")

  if __name__ == '__main__':
    print(myfunc1.__name__)  # wrapper
    print(myfunc2.__name__)  # wrapper
  • 为了防止函数名字被无意识修改,解决办法引入functools.wraps即可,也是个好的习惯

函数参数

    def wrapper(p1, *args, **kwargs): 
    		print p1
    		print args
    		print kwargs
    wrapper(1,2,3,4,a=3)
    # 1
    # (2,3,4) 
    # {'a':3} 

魔法函数

  • 魔法函数可以帮助我们重载运算符,使代码简洁优雅
# coding=utf-8

import os,sys

"""
python中以双下划线开始和结束的函数(不可自己定义)为魔法函数
python中每个魔法函数都对应与Python中的内置函数或对应操作,比如__str__ 对应str() __eq__ 对应 == __add__ 对应 +

比较函数
<	object.__lt__(self, other)
<=	object.__le__(self, other)
==	object.__eq__(self, other)
!=	object.__ne__(self, other)
>=	object.__ge__(self, other)
>	object.__gt__(self, other)



"""
class A():
	"""docstring for ClassName"""
	def __init__(self, name):
		self.name = name
		self.id = len(name)

	def __eq__(self,other):
		return self.name == other.name

	def __add__(self,other):
		return self.id + other.id

	def __str__(self):
		return "name : {} ,id : {}".format(self.name,self.id)

	def __lt__(self,other):
		return self.name < other.name if self.name != other.name else self.age < other.age

m=[1,2,3,4]
n=[1,2,3,4]

print m == n

a= A("aa")
b= A("aa")


print  A("aa")
print a == b
print a+b
  • Python中字典

优雅代码 pythonic

import os.path as osp

this_dir = osp.dirname(__file__) # 获取当前执行Python文件的目录,相对于当前目录
#python ./patent/test.py  test_dir == ./patent

mmcv

mmdtetection

你可能感兴趣的:(Algorithm,python,objectDect)