create_db_for_feature_based_object_recognition.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 
3 from __future__ import print_function
4 
5 import argparse
6 import glob
7 import os.path as osp
8 
9 import itertools, pkg_resources, sys
10 from distutils.version import LooseVersion
11 if LooseVersion(pkg_resources.get_distribution("chainer").version) >= LooseVersion('7.0.0') and \
12  sys.version_info.major == 2:
13  print('''Please install chainer < 7.0.0:
14 
15  sudo pip install chainer==6.7.0
16 
17 c.f https://github.com/jsk-ros-pkg/jsk_recognition/pull/2485
18 ''', file=sys.stderr)
19  sys.exit(1)
20 if [p for p in list(itertools.chain(*[pkg_resources.find_distributions(_) for _ in sys.path])) if "cupy-" in p.project_name ] == []:
21  print('''Please install CuPy
22 
23  sudo pip install cupy-cuda[your cuda version]
24 i.e.
25  sudo pip install cupy-cuda91
26 
27 ''', file=sys.stderr)
28  # sys.exit(1)
29 import chainer
30 from chainer import cuda
31 import numpy as np
32 import rospkg
33 import skimage.io
34 from sklearn.metrics import classification_report
35 from sklearn.neighbors import KNeighborsClassifier
36 import tqdm
37 import yaml
38 
39 # TODO(wkentaro): Support Resnet50/101
40 from jsk_recognition_utils.chainermodels import ResNet152Feature
41 
42 
43 def get_templates(template_dir):
44  target_names = yaml.load(open(osp.join(template_dir, 'target_names.yaml')))
45  for cls_id, cls_name in enumerate(target_names):
46  obj_dir = osp.join(template_dir, cls_name)
47  for img_file in glob.glob(osp.join(obj_dir, '*.jpg')):
48  dirname, basename = osp.split(img_file)
49  mask_file = osp.join(dirname, 'masks', basename)
50  img = skimage.io.imread(img_file)
51  mask = skimage.io.imread(mask_file) >= 127
52  yield cls_id, img, mask
53 
54 
55 def main():
56  parser = argparse.ArgumentParser()
57  parser.add_argument('template_dir', help='Template dir')
58  parser.add_argument('db_file', help='DB file which will be created')
59  parser.add_argument('-g', '--gpu', type=int, default=0)
60  args = parser.parse_args()
61 
62  template_dir = args.template_dir
63  db_file = args.db_file
64  gpu = args.gpu
65 
66  pkg_path = rospkg.RosPack().get_path('jsk_perception')
67  mean_file = osp.join(pkg_path, 'trained_data/resnet_lsvrc2012_mean.npy')
68  pretrained_model = osp.join(
69  pkg_path, 'trained_data/resnet152_from_caffe.npz')
70 
71  target_names = yaml.load(open(osp.join(template_dir, 'target_names.yaml')))
72 
73  mean = np.load(mean_file)
74 
75  model = ResNet152Feature()
76  chainer.serializers.load_npz(pretrained_model, model)
77  if gpu >= 0:
78  chainer.cuda.get_device_from_id(gpu).use()
79  model.to_gpu()
80 
81  chainer.global_config.train = False
82  chainer.global_config.enable_backprop = False
83 
84  ###########################################################################
85 
86  X = []
87  y = []
88  for cls_id, img, mask in tqdm.tqdm(get_templates(template_dir)):
89  img = img[:, :, ::-1] # RGB- > BGR
90  img = img.astype(np.float64)
91  img[mask] -= mean[mask]
92  img[~mask] = 0
93 
94  img = img.transpose(2, 0, 1)
95  img = img.astype(np.float32)
96  x_data = np.asarray([img])
97  x_data = cuda.to_gpu(x_data)
98  x = chainer.Variable(x_data)
99  feat = model(x)
100 
101  feat = cuda.to_cpu(feat.data)
102  feat = feat.squeeze(axis=(2, 3))
103  for f in feat:
104  X.append(f)
105  y.append(cls_id)
106  X = np.asarray(X)
107  y = np.asarray(y)
108  np.savez_compressed(db_file, X=X, y=y, target_names=target_names)
109 
110  knn = KNeighborsClassifier(n_neighbors=1)
111  knn.fit(X, y)
112  y_pred = knn.predict(X)
113  # validation: must be all 1.0
114  print(classification_report(y, y_pred, labels=range(len(target_names)),
115  target_names=target_names))
116 
117 
118 if __name__ == '__main__':
119  main()


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