def __call__(self, x, rois, roi_indices, spatial_scale):
        roi_indices = roi_indices.astype(np.float32)
        indices_and_rois = self.xp.concatenate((roi_indices[:, None], rois),
                                               axis=1)

        # roi poolingをする前に、thin feature mapに変換します
        # activationしないっぽいことが書いてあるんだよなー
        left_path = self.conv_bl(self.conv_ul(x))
        right_path = self.conv_br(self.conv_ur(x))
        tfp = left_path + right_path

        pool = _roi_align_2d_yx(tfp, indices_and_rois, self.roi_size,
                                self.roi_size, spatial_scale)

        h = F.relu(self.fc(pool))
        roi_cls_locs = self.cls_loc(h)
        roi_scores = self.score(h)
        # at prediction time, we use two pass method.
        # at first path, we predict box location and class
        # at second path, we predict mask with accurate location from first path
        if chainer.config.train:
            mask = F.relu(self.conv2(pool))
            mask = F.relu(self.conv3_(mask))
            mask = F.relu(self.conv4(mask))
            mask = self.deconv1_(pool)
            #mask = self.conv2(self.deconv1(pool))
            return roi_cls_locs, roi_scores, mask
        else:
            # cache tfp for second path
            self.tfp = tfp
            return roi_cls_locs, roi_scores
    def __call__(self, x, indices_and_rois, levels, spatial_scales):

        pool_box = list()
        levels = chainer.cuda.to_cpu(levels).astype(np.int32)
        for l, i in zip(levels, indices_and_rois):
            pool_box.append(
                _roi_align_2d_yx(x[l], i[None], self.roi_size_box,
                                 self.roi_size_box, spatial_scales[l]))

        pool_box = F.concat(pool_box, axis=0)

        h = F.relu(self.conv1(pool_box))
        h = F.relu(self.fc1(h))
        h = F.relu(self.fc2(h))
        roi_cls_locs = self.cls_loc(h)
        roi_scores = self.score(h)
        # at prediction time, we use two pass method.
        # at first path, we predict box location and class
        # at second path, we predict mask with accurate location from first path
        if chainer.config.train:
            pool_mask = list()
            for l, i in zip(levels, indices_and_rois):
                pool_mask.append(
                    _roi_align_2d_yx(x[l], i[None], self.roi_size_mask,
                                     self.roi_size_mask, spatial_scales[l]))
            mask = F.concat(pool_mask, axis=0)
            for l in self.mask_convs.children():
                mask = F.relu(l(mask))
            #mask = F.relu(self.mask1(pool_mask))
            #mask = F.relu(self.mask2(mask))
            #mask = F.relu(self.mask3(mask))
            #mask = F.relu(self.mask4(mask))
            mask = self.conv2(self.deconv1(mask))
            *_, h, w = mask.shape
            mask = F.resize_images(mask, output_shape=(2 * h, 2 * w))
            return roi_cls_locs, roi_scores, mask
        else:
            # cache
            self.x = x
            return roi_cls_locs, roi_scores
    def predict_mask(self, levels, indices_and_rois, spatial_scales):
        pool_mask = list()
        for l, i in zip(levels, indices_and_rois):
            pool_mask.append(
                _roi_align_2d_yx(self.x[l], i[None], self.roi_size_mask,
                                 self.roi_size_mask, spatial_scales[l]))
        pool_mask = F.concat(pool_mask, axis=0)
        mask = F.relu(self.mask1(pool_mask))
        mask = F.relu(self.mask2(mask))
        mask = F.relu(self.mask3(mask))
        mask = F.relu(self.mask4(mask))
        mask = self.conv2(self.deconv1(mask))

        return mask
    def predict_mask(self, rois, roi_indices, spatial_scale):
        roi_indices = roi_indices.astype(np.float32)
        indices_and_rois = self.xp.concatenate((roi_indices[:, None], rois),
                                               axis=1)
        pool = _roi_align_2d_yx(self.tfp, indices_and_rois, self.roi_size,
                                self.roi_size, spatial_scale)

        mask = F.relu(self.conv2(pool))
        mask = F.relu(self.conv3_(mask))
        mask = F.relu(self.conv4(mask))
        mask = self.deconv1_(pool)
        #        mask = self.deconv1(pool)
        #        mask = self.conv2_(mask)
        #        mask = self.conv3(mask)
        #        mask = self.conv2(self.deconv1(pool))
        return mask
    def __call__(self, x, rois, roi_indices, spatial_scale):
        roi_indices = roi_indices.astype(np.float32)
        indices_and_rois = self.xp.concatenate(
            (roi_indices[:, None], rois), axis=1)

        pool = _roi_align_2d_yx(x, indices_and_rois, self.roi_size,
                                self.roi_size, spatial_scale)

        # h: 分岐する直前まで
        h = F.relu(self.res5(pool))
        h = F.relu(self.conv1(h))
        # global average pooling
        gap = _global_average_pooling_2d(h)
        roi_cls_locs = self.cls_loc(gap)
        roi_scores = self.score(gap)
        # mask
        mask = self.conv2(F.relu(self.deconv1(h)))
        return roi_cls_locs, roi_scores, mask
    def predict_mask(self, levels, indices_and_rois, spatial_scales):
        pool_mask = list()
        for l, i in zip(levels, indices_and_rois):
            pool_mask.append(
                _roi_align_2d_yx(self.x[l], i[None], self.roi_size_mask,
                                 self.roi_size_mask, spatial_scales[l]))
        mask = F.concat(pool_mask, axis=0)
        for l in self.mask_convs:
            mask = F.relu(l(mask))
        #mask = F.relu(self.mask1(pool_mask))
        #mask = F.relu(self.mask2(mask))
        #mask = F.relu(self.mask3(mask))
        #mask = F.relu(self.mask4(mask))
        mask = self.conv2(self.deconv1(mask))
        *_, h, w = mask.shape
        mask = F.resize_images(mask, output_shape=(2 * h, 2 * w))

        return mask