hand_net.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3 #
4 # The code is originated from
5 # https://github.com/DeNA/Chainer_Realtime_Multi-Person_Pose_Estimation/blob/master/models/HandNet.py
6 
7 from __future__ import print_function
8 
9 import os
10 import itertools, pkg_resources, sys
11 from distutils.version import LooseVersion
12 if LooseVersion(pkg_resources.get_distribution("chainer").version) >= LooseVersion('7.0.0') and \
13  sys.version_info.major == 2:
14  print('''Please install chainer < 7.0.0:
15 
16  sudo pip install chainer==6.7.0
17 
18 c.f https://github.com/jsk-ros-pkg/jsk_recognition/pull/2485
19 ''', file=sys.stderr)
20  sys.exit(1)
21 if [p for p in list(itertools.chain(*[pkg_resources.find_distributions(_) for _ in sys.path])) if "cupy-" in p.project_name ] == []:
22  print('''Please install CuPy
23 
24  sudo pip install cupy-cuda[your cuda version]
25 i.e.
26  sudo pip install cupy-cuda91
27 
28 ''', file=sys.stderr)
29  # sys.exit(1)
30 import chainer
31 import chainer.functions as F
32 import chainer.links as L
33 
34 
35 base_url = 'http://posefs1.perception.cs.cmu.edu/OpenPose/models/hand/'
36 models = {
37  'auto': 'pose_iter_102000.chainermodel',
38 }
39 
40 
41 class HandNet(chainer.Chain):
42 
43  def __init__(self, pretrained_model='auto'):
44  super(HandNet, self).__init__()
45  with self.init_scope():
46  self.conv1_1 = L.Convolution2D(
47  in_channels=3, out_channels=64, ksize=3, stride=1, pad=1)
48  self.conv1_2 = L.Convolution2D(
49  in_channels=64, out_channels=64, ksize=3, stride=1, pad=1)
50  self.conv2_1 = L.Convolution2D(
51  in_channels=64, out_channels=128, ksize=3, stride=1, pad=1)
52  self.conv2_2 = L.Convolution2D(
53  in_channels=128, out_channels=128, ksize=3, stride=1, pad=1)
54  self.conv3_1 = L.Convolution2D(
55  in_channels=128, out_channels=256, ksize=3, stride=1, pad=1)
56  self.conv3_2 = L.Convolution2D(
57  in_channels=256, out_channels=256, ksize=3, stride=1, pad=1)
58  self.conv3_3 = L.Convolution2D(
59  in_channels=256, out_channels=256, ksize=3, stride=1, pad=1)
60  self.conv3_4 = L.Convolution2D(
61  in_channels=256, out_channels=256, ksize=3, stride=1, pad=1)
62  self.conv4_1 = L.Convolution2D(
63  in_channels=256, out_channels=512, ksize=3, stride=1, pad=1)
64  self.conv4_2 = L.Convolution2D(
65  in_channels=512, out_channels=512, ksize=3, stride=1, pad=1)
66  self.conv4_3 = L.Convolution2D(
67  in_channels=512, out_channels=512, ksize=3, stride=1, pad=1)
68  self.conv4_4 = L.Convolution2D(
69  in_channels=512, out_channels=512, ksize=3, stride=1, pad=1)
70  self.conv5_1 = L.Convolution2D(
71  in_channels=512, out_channels=512, ksize=3, stride=1, pad=1)
72  self.conv5_2 = L.Convolution2D(
73  in_channels=512, out_channels=512, ksize=3, stride=1, pad=1)
74  self.conv5_3_CPM = L.Convolution2D(
75  in_channels=512, out_channels=128, ksize=3, stride=1, pad=1)
76  # stage1
77  self.conv6_1_CPM = L.Convolution2D(
78  in_channels=128, out_channels=512, ksize=1, stride=1, pad=0)
79  self.conv6_2_CPM = L.Convolution2D(
80  in_channels=512, out_channels=22, ksize=1, stride=1, pad=0)
81  # stage2
82  self.Mconv1_stage2 = L.Convolution2D(
83  in_channels=150, out_channels=128, ksize=7, stride=1, pad=3)
84  self.Mconv2_stage2 = L.Convolution2D(
85  in_channels=128, out_channels=128, ksize=7, stride=1, pad=3)
86  self.Mconv3_stage2 = L.Convolution2D(
87  in_channels=128, out_channels=128, ksize=7, stride=1, pad=3)
88  self.Mconv4_stage2 = L.Convolution2D(
89  in_channels=128, out_channels=128, ksize=7, stride=1, pad=3)
90  self.Mconv5_stage2 = L.Convolution2D(
91  in_channels=128, out_channels=128, ksize=7, stride=1, pad=3)
92  self.Mconv6_stage2 = L.Convolution2D(
93  in_channels=128, out_channels=128, ksize=1, stride=1, pad=0)
94  self.Mconv7_stage2 = L.Convolution2D(
95  in_channels=128, out_channels=22, ksize=1, stride=1, pad=0)
96  # stage3
97  self.Mconv1_stage3 = L.Convolution2D(
98  in_channels=150, out_channels=128, ksize=7, stride=1, pad=3)
99  self.Mconv2_stage3 = L.Convolution2D(
100  in_channels=128, out_channels=128, ksize=7, stride=1, pad=3)
101  self.Mconv3_stage3 = L.Convolution2D(
102  in_channels=128, out_channels=128, ksize=7, stride=1, pad=3)
103  self.Mconv4_stage3 = L.Convolution2D(
104  in_channels=128, out_channels=128, ksize=7, stride=1, pad=3)
105  self.Mconv5_stage3 = L.Convolution2D(
106  in_channels=128, out_channels=128, ksize=7, stride=1, pad=3)
107  self.Mconv6_stage3 = L.Convolution2D(
108  in_channels=128, out_channels=128, ksize=1, stride=1, pad=0)
109  self.Mconv7_stage3 = L.Convolution2D(
110  in_channels=128, out_channels=22, ksize=1, stride=1, pad=0)
111  # stage4
112  self.Mconv1_stage4 = L.Convolution2D(
113  in_channels=150, out_channels=128, ksize=7, stride=1, pad=3)
114  self.Mconv2_stage4 = L.Convolution2D(
115  in_channels=128, out_channels=128, ksize=7, stride=1, pad=3)
116  self.Mconv3_stage4 = L.Convolution2D(
117  in_channels=128, out_channels=128, ksize=7, stride=1, pad=3)
118  self.Mconv4_stage4 = L.Convolution2D(
119  in_channels=128, out_channels=128, ksize=7, stride=1, pad=3)
120  self.Mconv5_stage4 = L.Convolution2D(
121  in_channels=128, out_channels=128, ksize=7, stride=1, pad=3)
122  self.Mconv6_stage4 = L.Convolution2D(
123  in_channels=128, out_channels=128, ksize=1, stride=1, pad=0)
124  self.Mconv7_stage4 = L.Convolution2D(
125  in_channels=128, out_channels=22, ksize=1, stride=1, pad=0)
126  # stage5
127  self.Mconv1_stage5 = L.Convolution2D(
128  in_channels=150, out_channels=128, ksize=7, stride=1, pad=3)
129  self.Mconv2_stage5 = L.Convolution2D(
130  in_channels=128, out_channels=128, ksize=7, stride=1, pad=3)
131  self.Mconv3_stage5 = L.Convolution2D(
132  in_channels=128, out_channels=128, ksize=7, stride=1, pad=3)
133  self.Mconv4_stage5 = L.Convolution2D(
134  in_channels=128, out_channels=128, ksize=7, stride=1, pad=3)
135  self.Mconv5_stage5 = L.Convolution2D(
136  in_channels=128, out_channels=128, ksize=7, stride=1, pad=3)
137  self.Mconv6_stage5 = L.Convolution2D(
138  in_channels=128, out_channels=128, ksize=1, stride=1, pad=0)
139  self.Mconv7_stage5 = L.Convolution2D(
140  in_channels=128, out_channels=22, ksize=1, stride=1, pad=0)
141  # stage6
142  self.Mconv1_stage6 = L.Convolution2D(
143  in_channels=150, out_channels=128, ksize=7, stride=1, pad=3)
144  self.Mconv2_stage6 = L.Convolution2D(
145  in_channels=128, out_channels=128, ksize=7, stride=1, pad=3)
146  self.Mconv3_stage6 = L.Convolution2D(
147  in_channels=128, out_channels=128, ksize=7, stride=1, pad=3)
148  self.Mconv4_stage6 = L.Convolution2D(
149  in_channels=128, out_channels=128, ksize=7, stride=1, pad=3)
150  self.Mconv5_stage6 = L.Convolution2D(
151  in_channels=128, out_channels=128, ksize=7, stride=1, pad=3)
152  self.Mconv6_stage6 = L.Convolution2D(
153  in_channels=128, out_channels=128, ksize=1, stride=1, pad=0)
154  self.Mconv7_stage6 = L.Convolution2D(
155  in_channels=128, out_channels=22, ksize=1, stride=1, pad=0)
156 
157  if pretrained_model in models.keys():
158  data_dir = chainer.dataset.get_dataset_directory('openpose/hand')
159  model_path = os.path.join(data_dir, models[pretrained_model])
160  try:
161  os.makedirs(os.path.dirname(model_path))
162  except OSError:
163  pass
164  chainer.dataset.cache_or_load_file(
165  model_path,
166  lambda f: _download_pretrained_model(pretrained_model, f),
167  lambda f: f)
168  chainer.serializers.load_npz(model_path, self)
169  elif pretrained_model is not None:
170  if not os.path.exists(pretrained_model):
171  raise OSError('model does not exists: "%s"' % pretrained_model)
172  chainer.serializers.load_npz(pretrained_model, self)
173 
174  def __call__(self, x):
175  heatmaps = []
176 
177  h = F.relu(self.conv1_1(x))
178  h = F.relu(self.conv1_2(h))
179  h = F.max_pooling_2d(h, ksize=2, stride=2)
180  h = F.relu(self.conv2_1(h))
181  h = F.relu(self.conv2_2(h))
182  h = F.max_pooling_2d(h, ksize=2, stride=2)
183  h = F.relu(self.conv3_1(h))
184  h = F.relu(self.conv3_2(h))
185  h = F.relu(self.conv3_3(h))
186  h = F.relu(self.conv3_4(h))
187  h = F.max_pooling_2d(h, ksize=2, stride=2)
188  h = F.relu(self.conv4_1(h))
189  h = F.relu(self.conv4_2(h))
190  h = F.relu(self.conv4_3(h))
191  h = F.relu(self.conv4_4(h))
192  h = F.relu(self.conv5_1(h))
193  h = F.relu(self.conv5_2(h))
194  h = F.relu(self.conv5_3_CPM(h))
195  feature_map = h
196 
197  # stage1
198  h = F.relu(self.conv6_1_CPM(h))
199  h = self.conv6_2_CPM(h)
200  heatmaps.append(h)
201 
202  # stage2
203  h = F.concat((h, feature_map), axis=1) # channel concat
204  h = F.relu(self.Mconv1_stage2(h))
205  h = F.relu(self.Mconv2_stage2(h))
206  h = F.relu(self.Mconv3_stage2(h))
207  h = F.relu(self.Mconv4_stage2(h))
208  h = F.relu(self.Mconv5_stage2(h))
209  h = F.relu(self.Mconv6_stage2(h))
210  h = self.Mconv7_stage2(h)
211  heatmaps.append(h)
212 
213  # stage3
214  h = F.concat((h, feature_map), axis=1) # channel concat
215  h = F.relu(self.Mconv1_stage3(h))
216  h = F.relu(self.Mconv2_stage3(h))
217  h = F.relu(self.Mconv3_stage3(h))
218  h = F.relu(self.Mconv4_stage3(h))
219  h = F.relu(self.Mconv5_stage3(h))
220  h = F.relu(self.Mconv6_stage3(h))
221  h = self.Mconv7_stage3(h)
222  heatmaps.append(h)
223 
224  # stage4
225  h = F.concat((h, feature_map), axis=1) # channel concat
226  h = F.relu(self.Mconv1_stage4(h))
227  h = F.relu(self.Mconv2_stage4(h))
228  h = F.relu(self.Mconv3_stage4(h))
229  h = F.relu(self.Mconv4_stage4(h))
230  h = F.relu(self.Mconv5_stage4(h))
231  h = F.relu(self.Mconv6_stage4(h))
232  h = self.Mconv7_stage4(h)
233  heatmaps.append(h)
234 
235  # stage5
236  h = F.concat((h, feature_map), axis=1) # channel concat
237  h = F.relu(self.Mconv1_stage5(h))
238  h = F.relu(self.Mconv2_stage5(h))
239  h = F.relu(self.Mconv3_stage5(h))
240  h = F.relu(self.Mconv4_stage5(h))
241  h = F.relu(self.Mconv5_stage5(h))
242  h = F.relu(self.Mconv6_stage5(h))
243  h = self.Mconv7_stage5(h)
244  heatmaps.append(h)
245 
246  # stage6
247  h = F.concat((h, feature_map), axis=1) # channel concat
248  h = F.relu(self.Mconv1_stage6(h))
249  h = F.relu(self.Mconv2_stage6(h))
250  h = F.relu(self.Mconv3_stage6(h))
251  h = F.relu(self.Mconv4_stage6(h))
252  h = F.relu(self.Mconv5_stage6(h))
253  h = F.relu(self.Mconv6_stage6(h))
254  h = self.Mconv7_stage6(h)
255  heatmaps.append(h)
256 
257  return heatmaps
258 
259 
260 def _download_pretrained_model(model_type, dest_path):
261  from chainer.links import caffe
262 
263  if os.path.exists(dest_path):
264  raise OSError('destination already exists: %s' % dest_path)
265 
266  basename, ext = os.path.splitext(models[model_type])
267  url = base_url + basename + '.caffemodel'
268  caffe_model_path = chainer.dataset.cached_download(url)
269  if not os.path.exists(caffe_model_path):
270  raise OSError('caffe model does not exist: %s' % caffe_model_path)
271 
272  print('Converting to chainer model')
273  caffe_model = caffe.CaffeFunction(caffe_model_path)
274  chainer_model = HandNet(pretrained_model=None)
275  for link in chainer_model.links():
276  if not isinstance(link, chainer.Link) or not link.name:
277  continue
278  if eval('chainer_model.{0}.b.shape == caffe_model["{0}"].b.shape'.format(link.name)) and\
279  eval('chainer_model.{0}.W.shape == caffe_model["{0}"].W.shape'.format(link.name)):
280  exec('chainer_model.{0}.W.data = caffe_model["{0}"].W.data'.format(link.name))
281  exec('chainer_model.{0}.b.data = caffe_model["{0}"].b.data'.format(link.name))
282  print('Copied layer {0}'.format(link.name))
283  else:
284  print('Failed to copy layer {0}'.format(link.name))
285 
286  chainer.serializers.save_npz(dest_path, chainer_model)
287  return True
def _download_pretrained_model(model_type, dest_path)
Definition: hand_net.py:260
def __init__(self, pretrained_model='auto')
Definition: hand_net.py:43


jsk_perception
Author(s): Manabu Saito, Ryohei Ueda
autogenerated on Mon May 3 2021 03:03:27