[45a3e1]: / darkflow / dark / layer.py

Download this file

83 lines (66 with data), 2.1 kB

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
from ..utils import loader
import numpy as np
class Layer(object):
def __init__(self, *args):
self._signature = list(args)
self.type = list(args)[0]
self.number = list(args)[1]
self.w = dict() # weights
self.h = dict() # placeholders
self.wshape = dict() # weight shape
self.wsize = dict() # weight size
self.setup(*args[2:]) # set attr up
self.present()
for var in self.wshape:
shp = self.wshape[var]
size = np.prod(shp)
self.wsize[var] = size
def load(self, src_loader):
var_lay = src_loader.VAR_LAYER
if self.type not in var_lay: return
src_type = type(src_loader)
if src_type is loader.weights_loader:
wdict = self.load_weights(src_loader)
else:
wdict = self.load_ckpt(src_loader)
if wdict is not None:
self.recollect(wdict)
def load_weights(self, src_loader):
val = src_loader([self.presenter])
if val is None:
return None
else:
return val.w
def load_ckpt(self, src_loader):
result = dict()
presenter = self.presenter
for var in presenter.wshape:
name = presenter.varsig(var)
shape = presenter.wshape[var]
key = [name, shape]
val = src_loader(key)
result[var] = val
return result
@property
def signature(self):
return self._signature
# For comparing two layers
def __eq__(self, other):
return self.signature == other.signature
def __ne__(self, other):
return not self.__eq__(other)
def varsig(self, var):
if var not in self.wshape:
return None
sig = str(self.number)
sig += '-' + self.type
sig += '/' + var
return sig
def recollect(self, w):
self.w = w
def present(self):
self.presenter = self
def setup(self, *args):
pass
def finalize(self):
pass