def test_rpn_scriptability(self): cfg = get_cfg() proposal_generator = RPN(cfg, { "res4": ShapeSpec(channels=1024, stride=16) }).eval() num_images = 2 images_tensor = torch.rand(num_images, 30, 40) image_sizes = [(32, 32), (30, 40)] images = ImageList(images_tensor, image_sizes) features = {"res4": torch.rand(num_images, 1024, 1, 2)} fields = {"proposal_boxes": Boxes, "objectness_logits": torch.Tensor} proposal_generator_ts = scripting_with_instances( proposal_generator, fields) proposals, _ = proposal_generator(images, features) proposals_ts, _ = proposal_generator_ts(images, features) for proposal, proposal_ts in zip(proposals, proposals_ts): self.assertEqual(proposal.image_size, proposal_ts.image_size) self.assertTrue( torch.equal(proposal.proposal_boxes.tensor, proposal_ts.proposal_boxes.tensor)) self.assertTrue( torch.equal(proposal.objectness_logits, proposal_ts.objectness_logits))
def test_rpn(self): torch.manual_seed(121) cfg = get_cfg() backbone = build_backbone(cfg) proposal_generator = RPN(cfg, backbone.output_shape()) num_images = 2 images_tensor = torch.rand(num_images, 20, 30) image_sizes = [(10, 10), (20, 30)] images = ImageList(images_tensor, image_sizes) image_shape = (15, 15) num_channels = 1024 features = {"res4": torch.rand(num_images, num_channels, 1, 2)} gt_boxes = torch.tensor([[1, 1, 3, 3], [2, 2, 6, 6]], dtype=torch.float32) gt_instances = Instances(image_shape) gt_instances.gt_boxes = Boxes(gt_boxes) with EventStorage(): # capture events in a new storage to discard them proposals, proposal_losses = proposal_generator( images, features, [gt_instances[0], gt_instances[1]] ) expected_losses = { "loss_rpn_cls": torch.tensor(0.0804563984), "loss_rpn_loc": torch.tensor(0.0990132466), } for name in expected_losses.keys(): err_msg = "proposal_losses[{}] = {}, expected losses = {}".format( name, proposal_losses[name], expected_losses[name] ) self.assertTrue(torch.allclose(proposal_losses[name], expected_losses[name]), err_msg) expected_proposal_boxes = [ Boxes(torch.tensor([[0, 0, 10, 10], [7.3365392685, 0, 10, 10]])), Boxes( torch.tensor( [ [0, 0, 30, 20], [0, 0, 16.7862777710, 13.1362524033], [0, 0, 30, 13.3173446655], [0, 0, 10.8602609634, 20], [7.7165775299, 0, 27.3875980377, 20], ] ) ), ] expected_objectness_logits = [ torch.tensor([0.1225359365, -0.0133192837]), torch.tensor([0.1415634006, 0.0989848152, 0.0565387346, -0.0072308783, -0.0428492837]), ] for proposal, expected_proposal_box, im_size, expected_objectness_logit in zip( proposals, expected_proposal_boxes, image_sizes, expected_objectness_logits ): self.assertEqual(len(proposal), len(expected_proposal_box)) self.assertEqual(proposal.image_size, im_size) self.assertTrue( torch.allclose(proposal.proposal_boxes.tensor, expected_proposal_box.tensor) ) self.assertTrue(torch.allclose(proposal.objectness_logits, expected_objectness_logit))
def verify_rpn(self, conv_dims, expected_conv_dims): torch.manual_seed(121) cfg = get_cfg() cfg.MODEL.RPN.CONV_DIMS = conv_dims backbone = build_backbone(cfg) proposal_generator = RPN(cfg, backbone.output_shape()) for k, conv in enumerate(proposal_generator.rpn_head.conv): self.assertEqual(expected_conv_dims[k], conv.out_channels) return proposal_generator
def test_rpn(self): torch.manual_seed(121) cfg = get_cfg() backbone = build_backbone(cfg) proposal_generator = RPN(cfg, backbone.output_shape()) num_images = 2 images_tensor = torch.rand(num_images, 20, 30) image_sizes = [(10, 10), (20, 30)] images = ImageList(images_tensor, image_sizes) image_shape = (15, 15) num_channels = 1024 features = {"res4": torch.rand(num_images, num_channels, 1, 2)} gt_boxes = torch.tensor([[1, 1, 3, 3], [2, 2, 6, 6]], dtype=torch.float32) gt_instances = Instances(image_shape) gt_instances.gt_boxes = Boxes(gt_boxes) with EventStorage(): # capture events in a new storage to discard them proposals, proposal_losses = proposal_generator( images, features, [gt_instances[0], gt_instances[1]]) expected_losses = { "loss_rpn_cls": torch.tensor(0.08011703193), "loss_rpn_loc": torch.tensor(0.101470276), } for name in expected_losses.keys(): err_msg = "proposal_losses[{}] = {}, expected losses = {}".format( name, proposal_losses[name], expected_losses[name]) self.assertTrue( torch.allclose(proposal_losses[name], expected_losses[name]), err_msg) self.assertEqual(len(proposals), len(image_sizes)) for proposal, im_size in zip(proposals, image_sizes): self.assertEqual(proposal.image_size, im_size) expected_proposal_box = torch.tensor([[0, 0, 10, 10], [7.2702, 0, 10, 10]]) expected_objectness_logit = torch.tensor([0.1596, -0.0007]) self.assertTrue( torch.allclose(proposals[0].proposal_boxes.tensor, expected_proposal_box, atol=1e-4)) self.assertTrue( torch.allclose(proposals[0].objectness_logits, expected_objectness_logit, atol=1e-4))
def test_rpn(self): torch.manual_seed(121) cfg = get_cfg() backbone = build_backbone(cfg) proposal_generator = RPN(cfg, backbone.output_shape()) (gt_instances, features, images, image_sizes) = self.get_gt_and_features() with EventStorage(): # capture events in a new storage to discard them proposals, proposal_losses = proposal_generator( images, features, [gt_instances[0], gt_instances[1]]) expected_losses = { "loss_rpn_cls": torch.tensor(0.08011703193), "loss_rpn_loc": torch.tensor(0.101470276), } for name in expected_losses.keys(): err_msg = "proposal_losses[{}] = {}, expected losses = {}".format( name, proposal_losses[name], expected_losses[name]) self.assertTrue( torch.allclose(proposal_losses[name], expected_losses[name]), err_msg) self.assertEqual(len(proposals), len(image_sizes)) for proposal, im_size in zip(proposals, image_sizes): self.assertEqual(proposal.image_size, im_size) expected_proposal_box = torch.tensor([[0, 0, 10, 10], [7.2702, 0, 10, 10]]) expected_objectness_logit = torch.tensor([0.1596, -0.0007]) self.assertTrue( torch.allclose(proposals[0].proposal_boxes.tensor, expected_proposal_box, atol=1e-4)) self.assertTrue( torch.allclose(proposals[0].objectness_logits, expected_objectness_logit, atol=1e-4))