-
Notifications
You must be signed in to change notification settings - Fork 103
/
Copy pathdeep.py
executable file
·150 lines (112 loc) · 5.44 KB
/
deep.py
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
from pytracking.features.featurebase import FeatureBase, MultiFeatureBase
import torch
import torchvision
from pytracking import TensorList
from pytracking.evaluation.environment import env_settings
import os
from pytracking.utils.loading import load_network
from ltr.models.backbone.resnet18_vggm import resnet18_vggmconv1
normalize = torchvision.transforms.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225])
class ResNet18m1(MultiFeatureBase):
"""ResNet18 feature together with the VGG-m conv1 layer.
args:
output_layers: List of layers to output.
net_path: Relative or absolute net path (default should be fine).
use_gpu: Use GPU or CPU.
"""
def __init__(self, output_layers, net_path=None, use_gpu=True, *args, **kwargs):
super(ResNet18m1, self).__init__(*args, **kwargs)
for l in output_layers:
if l not in ['vggconv1', 'conv1', 'layer1', 'layer2', 'layer3', 'layer4', 'fc']:
raise ValueError('Unknown layer')
self.output_layers = list(output_layers)
self.use_gpu = use_gpu
self.net_path = 'resnet18_vggmconv1/resnet18_vggmconv1.pth' if net_path is None else net_path
def initialize(self):
if isinstance(self.pool_stride, int) and self.pool_stride == 1:
self.pool_stride = [1] * len(self.output_layers)
self.layer_stride = {'vggconv1': 2, 'conv1': 2, 'layer1': 4, 'layer2': 8, 'layer3': 16, 'layer4': 32,
'fc': None}
self.layer_dim = {'vggconv1': 96, 'conv1': 64, 'layer1': 64, 'layer2': 128, 'layer3': 256, 'layer4': 512,
'fc': None}
self.mean = torch.Tensor([0.485, 0.456, 0.406]).view(1, -1, 1, 1)
self.std = torch.Tensor([0.229, 0.224, 0.225]).view(1, -1, 1, 1)
if os.path.isabs(self.net_path):
net_path_full = [self.net_path]
else:
root_paths = env_settings().network_path
if isinstance(root_paths, str):
root_paths = [root_paths]
net_path_full = [os.path.join(root, self.net_path) for root in root_paths]
self.net = None
for net_path in net_path_full:
try:
self.net = resnet18_vggmconv1(self.output_layers, path=net_path)
break
except:
pass
if self.net is None:
raise Exception('Did not find network file {}'.format(self.net_path))
if self.use_gpu:
self.net.cuda()
self.net.eval()
def dim(self):
return TensorList([self.layer_dim[l] for l in self.output_layers])
def stride(self):
return TensorList([s * self.layer_stride[l] for l, s in zip(self.output_layers, self.pool_stride)])
def extract(self, im: torch.Tensor):
im = im / 255
im -= self.mean
im /= self.std
if self.use_gpu:
im = im.cuda()
with torch.no_grad():
return TensorList(self.net(im).values())
class ATOMResNet18(MultiFeatureBase):
"""ResNet18 feature with the ATOM IoUNet.
args:
output_layers: List of layers to output.
net_path: Relative or absolute net path (default should be fine).
use_gpu: Use GPU or CPU.
"""
def __init__(self, output_layers=('layer3',), net_path='atom_iou', use_gpu=True, *args, **kwargs):
super().__init__(*args, **kwargs)
self.output_layers = list(output_layers)
self.use_gpu = use_gpu
self.net_path = net_path
def initialize(self):
self.net = load_network(self.net_path)
if self.use_gpu:
self.net.cuda()
self.net.eval()
self.iou_predictor = self.net.bb_regressor
self.layer_stride = {'conv1': 2, 'layer1': 4, 'layer2': 8, 'layer3': 16, 'layer4': 32, 'classification': 16,
'fc': None}
self.layer_dim = {'conv1': 64, 'layer1': 64, 'layer2': 128, 'layer3': 256, 'layer4': 512, 'classification': 256,
'fc': None}
self.iounet_feature_layers = self.net.bb_regressor_layer
if isinstance(self.pool_stride, int) and self.pool_stride == 1:
self.pool_stride = [1] * len(self.output_layers)
self.feature_layers = sorted(list(set(self.output_layers + self.iounet_feature_layers)))
self.mean = torch.Tensor([0.485, 0.456, 0.406]).view(1, -1, 1, 1)
self.std = torch.Tensor([0.229, 0.224, 0.225]).view(1, -1, 1, 1)
def dim(self):
return TensorList([self.layer_dim[l] for l in self.output_layers])
def stride(self):
return TensorList([s * self.layer_stride[l] for l, s in zip(self.output_layers, self.pool_stride)])
def extract(self, im: torch.Tensor):
im = im / 255
im -= self.mean
im /= self.std
if self.use_gpu:
im = im.cuda()
with torch.no_grad():
output_features = self.net.extract_features(im, self.feature_layers)
# Store the raw resnet features which are input to iounet
self.iounet_backbone_features = TensorList(
[output_features[layer].clone() for layer in self.iounet_feature_layers])
# Store the processed features from iounet, just before pooling
with torch.no_grad():
self.iounet_features = TensorList(self.iou_predictor.get_iou_feat(self.iounet_backbone_features))
return TensorList([output_features[layer] for layer in self.output_layers])