3 from __future__
import division
4 from __future__
import print_function
12 os.environ[
'MPLBACKEND'] =
'Agg' 14 import itertools, pkg_resources, sys
15 from distutils.version
import LooseVersion
16 if LooseVersion(pkg_resources.get_distribution(
"chainer").version) >= LooseVersion(
'7.0.0')
and \
17 sys.version_info.major == 2:
18 print(
'''Please install chainer < 7.0.0: 20 sudo pip install chainer==6.7.0 22 c.f https://github.com/jsk-ros-pkg/jsk_recognition/pull/2485 25 if [p
for p
in list(itertools.chain(*[pkg_resources.find_distributions(_)
for _
in sys.path]))
if "cupy-" in p.project_name ] == []:
26 print(
'''Please install CuPy 28 sudo pip install cupy-cuda[your cuda version] 30 sudo pip install cupy-cuda91 35 from chainer
import cuda
36 from chainer.datasets
import TransformDataset
37 from chainer.training
import extensions
38 import chainer_mask_rcnn
as cmr
48 rospack = rospkg.RosPack()
49 jsk_perception_datasets_path = osp.join(
50 rospack.get_path(
'jsk_perception'),
'learning_datasets')
52 parser = argparse.ArgumentParser()
55 parser.add_argument(
'--train_dataset_dir', type=str,
56 default=osp.join(jsk_perception_datasets_path,
57 'kitchen_dataset',
'train'))
58 parser.add_argument(
'--val_dataset_dir', type=str,
59 default=osp.join(jsk_perception_datasets_path,
60 'kitchen_dataset',
'test'))
64 '--model_name', type=str, default=
'resnet50',
65 choices=[
'vgg16',
'resnet50',
'resnet101'])
68 parser.add_argument(
'--gpu', type=int, default=0)
69 parser.add_argument(
'--batch_size', type=int, default=1)
70 parser.add_argument(
'--max_epoch', type=int, default=100)
71 parser.add_argument(
'--lr', type=float, default=0.00125)
72 parser.add_argument(
'--weight_decay', type=float, default=0.0001)
73 parser.add_argument(
'--out_dir', type=str, default=
None)
74 parser.add_argument(
'--progressbar_update_interval', type=float,
76 parser.add_argument(
'--print_interval', type=float, default=100)
77 parser.add_argument(
'--print_interval_type', type=str,
79 choices=[
'epoch',
'iteration'])
80 parser.add_argument(
'--log_interval', type=float, default=10)
81 parser.add_argument(
'--log_interval_type', type=str,
83 choices=[
'epoch',
'iteration'])
84 parser.add_argument(
'--plot_interval', type=float, default=5)
85 parser.add_argument(
'--plot_interval_type', type=str,
87 choices=[
'epoch',
'iteration'])
88 parser.add_argument(
'--eval_interval', type=float, default=10)
89 parser.add_argument(
'--eval_interval_type', type=str,
91 choices=[
'epoch',
'iteration'])
92 parser.add_argument(
'--save_interval', type=float, default=10)
93 parser.add_argument(
'--save_interval_type', type=str,
95 choices=[
'epoch',
'iteration'])
97 args = parser.parse_args()
120 now = datetime.datetime.now()
122 timestamp = now.strftime(
'%Y%m%d-%H%M%S')
125 rospkg.get_ros_home(),
'learning_logs', timestamp)
141 n_fg_class = len(self.train_dataset.fg_class_names)
143 pooling_func = cmr.functions.roi_align_2d
144 anchor_scales = (4, 8, 16, 32)
148 mask_initialW = chainer.initializers.Normal(0.01)
152 n_fg_class=n_fg_class,
153 pretrained_model=
'imagenet',
154 pooling_func=pooling_func,
155 anchor_scales=anchor_scales,
159 mask_initialW=mask_initialW,
161 elif self.
model_name in [
'resnet50',
'resnet101']:
162 n_layers =
int(self.model_name.lstrip(
'resnet'))
163 self.
mask_rcnn = cmr.models.MaskRCNNResNet(
165 n_fg_class=n_fg_class,
166 pooling_func=pooling_func,
167 anchor_scales=anchor_scales,
171 mask_initialW=mask_initialW,
175 'Unsupported model_name: {}'.format(self.
model_name))
179 cuda.get_device_from_id(self.
gpu).use()
184 lr=self.
lr, momentum=0.9)
185 self.optimizer.setup(self.
model)
186 self.optimizer.add_hook(
189 if self.
model_name in [
'resnet50',
'resnet101']:
192 self.mask_rcnn.extractor.conv1.disable_update()
193 self.mask_rcnn.extractor.bn1.disable_update()
194 self.mask_rcnn.extractor.res2.disable_update()
195 for link
in self.mask_rcnn.links():
196 if isinstance(link, cmr.links.AffineChannel2D):
197 link.disable_update()
200 train_dataset_transformed = TransformDataset(
202 val_dataset_transformed = TransformDataset(
204 cmr.datasets.MaskRCNNTransform(self.
mask_rcnn, train=
False))
207 train_dataset_transformed, batch_size=self.
batch_size)
209 val_dataset_transformed, batch_size=self.
batch_size,
210 repeat=
False, shuffle=
False)
213 converter = functools.partial(
214 cmr.datasets.concat_examples,
217 indices_concat=[0, 2, 3, 4],
218 indices_to_device=[0, 1],
220 self.
updater = chainer.training.updater.StandardUpdater(
231 extensions.ExponentialShift(
'lr', 0.1),
232 trigger=chainer.training.triggers.ManualScheduleTrigger(
235 evaluator = cmr.extensions.InstanceSegmentationVOCEvaluator(
237 use_07_metric=
True, label_names=self.train_dataset.fg_class_names)
243 extensions.snapshot_object(
244 self.model.mask_rcnn,
'snapshot_model.npz'),
245 trigger=chainer.training.triggers.MaxValueTrigger(
246 'validation/main/map',
251 extensions.dump_graph(
252 root_name=
'main/loss',
253 out_name=
'network_architecture.dot'))
257 extensions.ProgressBar(
260 extensions.observe_lr(),
263 extensions.LogReport(
267 extensions.PrintReport([
275 'main/roi_mask_loss',
278 'validation/main/map',
283 extensions.PlotReport([
287 'main/roi_mask_loss',
291 file_name=
'loss_plot.png',
296 extensions.PlotReport(
297 [
'validation/main/map'],
298 file_name=
'accuracy_plot.png',
308 params[
'fg_class_names'] = self.train_dataset.fg_class_names
310 params[
'out_dir'] = self.
out_dir 311 params[
'gpu'] = self.
gpu 314 params[
'lr'] = self.
lr 317 fcn.extensions.ParamsReport(params, file_name=
'params.yaml'))
320 target_names = dict()
321 target_names[
'fg_class_names'] = self.train_dataset.fg_class_names
323 fcn.extensions.ParamsReport(
324 target_names, file_name=
'fg_class_names.yaml'))
327 if __name__ ==
'__main__':
def setup_optimizer(self)
progressbar_update_interval