Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 7025590

Browse files
authored
Object detection Internal Changes. (tensorflow#4757)
* Merged commit includes the following changes: 204316992 by Zhichao Lu: Update docs to prepare inputs -- 204309254 by Zhichao Lu: Update running_pets.md to use new binaries and correct a few things in running_on_cloud.md -- 204306734 by Zhichao Lu: Move old binaries into legacy folder and add deprecation notice. -- 204267757 by Zhichao Lu: Fixing a problem in VRD evaluation with missing ground truth annotations for images that do not contain objects from 62 groundtruth classes. -- 204167430 by Zhichao Lu: This fixes a flaky losses test failure. -- 203670721 by Zhichao Lu: Internal change. -- 203569388 by Zhichao Lu: Internal change 203546580 by Zhichao Lu: * Expand TPU compatibility g3doc with config snippets * Change mscoco dataset path in sample configs to the sharded versions -- 203325694 by Zhichao Lu: Make merge_multiple_label_boxes work for model_main code path. -- 203305655 by Zhichao Lu: Remove the 1x1 conv layer before pooling in MobileNet-v1-PPN feature extractor. -- 203139608 by Zhichao Lu: - Support exponential_decay with burnin learning rate schedule. - Add the minimum learning rate option. - Make the exponential decay start only after the burnin steps. -- 203068703 by Zhichao Lu: Modify create_coco_tf_record.py to output sharded files. -- 203025308 by Zhichao Lu: Add an option to share the prediction tower in WeightSharedBoxPredictor. -- 203024942 by Zhichao Lu: Move ssd mobilenet v1 ppn configs to third party. -- 202901259 by Zhichao Lu: Delete obsolete ssd mobilenet v1 focal loss configs and update pets dataset path -- 202894154 by Zhichao Lu: Move all TPU compatible ssd mobilenet v1 coco14/pet configs to third party. -- 202861774 by Zhichao Lu: Move Retinanet (SSD + FPN + Shared box predictor) configs to third_party. -- PiperOrigin-RevId: 204316992 * Add original files back.
1 parent ee6fdda commit 7025590

File tree

77 files changed

+3797
-167
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

77 files changed

+3797
-167
lines changed

research/object_detection/README.md

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,18 @@ https://scholar.googleusercontent.com/scholar.bib?q=info:l291WsrB-hQJ:scholar.go
3939

4040
## Table of contents
4141

42+
Setup:
43+
44+
* <a href='g3doc/installation.md'>Installation</a><br>
45+
4246
Quick Start:
4347

4448
* <a href='object_detection_tutorial.ipynb'>
4549
Quick Start: Jupyter notebook for off-the-shelf inference</a><br>
4650
* <a href="g3doc/running_pets.md">Quick Start: Training a pet detector</a><br>
4751

48-
Setup:
52+
Customizing a Pipeline:
4953

50-
* <a href='g3doc/installation.md'>Installation</a><br>
5154
* <a href='g3doc/configuring_jobs.md'>
5255
Configuring an object detection pipeline</a><br>
5356
* <a href='g3doc/preparing_inputs.md'>Preparing inputs</a><br>
@@ -73,7 +76,7 @@ Extras:
7376
* <a href='g3doc/instance_segmentation.md'>
7477
Run an instance segmentation model</a><br>
7578
* <a href='g3doc/challenge_evaluation.md'>
76-
Run the evaluation for the Open Images Challenge 2018.</a><br>
79+
Run the evaluation for the Open Images Challenge 2018</a><br>
7780

7881
## Getting Help
7982

research/object_detection/builders/box_predictor_builder.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,8 @@ def build(argscope_fn, box_predictor_config, is_training, num_classes):
8787
class_prediction_bias_init=conv_box_predictor.
8888
class_prediction_bias_init,
8989
use_dropout=conv_box_predictor.use_dropout,
90-
dropout_keep_prob=conv_box_predictor.dropout_keep_probability)
90+
dropout_keep_prob=conv_box_predictor.dropout_keep_probability,
91+
share_prediction_tower=conv_box_predictor.share_prediction_tower)
9192
return box_predictor_object
9293

9394
if box_predictor_oneof == 'mask_rcnn_box_predictor':

research/object_detection/builders/model_builder.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,13 @@
3333
from object_detection.models import faster_rcnn_pnas_feature_extractor as frcnn_pnas
3434
from object_detection.models import faster_rcnn_resnet_v1_feature_extractor as frcnn_resnet_v1
3535
from object_detection.models import ssd_resnet_v1_fpn_feature_extractor as ssd_resnet_v1_fpn
36+
from object_detection.models import ssd_resnet_v1_ppn_feature_extractor as ssd_resnet_v1_ppn
3637
from object_detection.models.embedded_ssd_mobilenet_v1_feature_extractor import EmbeddedSSDMobileNetV1FeatureExtractor
3738
from object_detection.models.ssd_inception_v2_feature_extractor import SSDInceptionV2FeatureExtractor
3839
from object_detection.models.ssd_inception_v3_feature_extractor import SSDInceptionV3FeatureExtractor
3940
from object_detection.models.ssd_mobilenet_v1_feature_extractor import SSDMobileNetV1FeatureExtractor
41+
from object_detection.models.ssd_mobilenet_v1_fpn_feature_extractor import SSDMobileNetV1FpnFeatureExtractor
42+
from object_detection.models.ssd_mobilenet_v1_ppn_feature_extractor import SSDMobileNetV1PpnFeatureExtractor
4043
from object_detection.models.ssd_mobilenet_v2_feature_extractor import SSDMobileNetV2FeatureExtractor
4144
from object_detection.protos import model_pb2
4245

@@ -45,10 +48,17 @@
4548
'ssd_inception_v2': SSDInceptionV2FeatureExtractor,
4649
'ssd_inception_v3': SSDInceptionV3FeatureExtractor,
4750
'ssd_mobilenet_v1': SSDMobileNetV1FeatureExtractor,
51+
'ssd_mobilenet_v1_fpn': SSDMobileNetV1FpnFeatureExtractor,
52+
'ssd_mobilenet_v1_ppn': SSDMobileNetV1PpnFeatureExtractor,
4853
'ssd_mobilenet_v2': SSDMobileNetV2FeatureExtractor,
4954
'ssd_resnet50_v1_fpn': ssd_resnet_v1_fpn.SSDResnet50V1FpnFeatureExtractor,
5055
'ssd_resnet101_v1_fpn': ssd_resnet_v1_fpn.SSDResnet101V1FpnFeatureExtractor,
5156
'ssd_resnet152_v1_fpn': ssd_resnet_v1_fpn.SSDResnet152V1FpnFeatureExtractor,
57+
'ssd_resnet50_v1_ppn': ssd_resnet_v1_ppn.SSDResnet50V1PpnFeatureExtractor,
58+
'ssd_resnet101_v1_ppn':
59+
ssd_resnet_v1_ppn.SSDResnet101V1PpnFeatureExtractor,
60+
'ssd_resnet152_v1_ppn':
61+
ssd_resnet_v1_ppn.SSDResnet152V1PpnFeatureExtractor,
5262
'embedded_ssd_mobilenet_v1': EmbeddedSSDMobileNetV1FeatureExtractor,
5363
}
5464

@@ -327,6 +337,8 @@ def _build_faster_rcnn_model(frcnn_config, is_training, add_summaries):
327337
second_stage_classification_loss_weight,
328338
second_stage_localization_loss_weight)
329339

340+
use_matmul_crop_and_resize = (frcnn_config.use_matmul_crop_and_resize)
341+
330342
common_kwargs = {
331343
'is_training': is_training,
332344
'num_classes': num_classes,
@@ -360,7 +372,9 @@ def _build_faster_rcnn_model(frcnn_config, is_training, add_summaries):
360372
'second_stage_classification_loss_weight':
361373
second_stage_classification_loss_weight,
362374
'hard_example_miner': hard_example_miner,
363-
'add_summaries': add_summaries}
375+
'add_summaries': add_summaries,
376+
'use_matmul_crop_and_resize': use_matmul_crop_and_resize
377+
}
364378

365379
if isinstance(second_stage_box_predictor, box_predictor.RfcnBoxPredictor):
366380
return rfcn_meta_arch.RFCNMetaArch(

research/object_detection/builders/model_builder_test.py

Lines changed: 254 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,13 @@
2828
from object_detection.models import faster_rcnn_pnas_feature_extractor as frcnn_pnas
2929
from object_detection.models import faster_rcnn_resnet_v1_feature_extractor as frcnn_resnet_v1
3030
from object_detection.models import ssd_resnet_v1_fpn_feature_extractor as ssd_resnet_v1_fpn
31+
from object_detection.models import ssd_resnet_v1_ppn_feature_extractor as ssd_resnet_v1_ppn
3132
from object_detection.models.embedded_ssd_mobilenet_v1_feature_extractor import EmbeddedSSDMobileNetV1FeatureExtractor
3233
from object_detection.models.ssd_inception_v2_feature_extractor import SSDInceptionV2FeatureExtractor
3334
from object_detection.models.ssd_inception_v3_feature_extractor import SSDInceptionV3FeatureExtractor
3435
from object_detection.models.ssd_mobilenet_v1_feature_extractor import SSDMobileNetV1FeatureExtractor
36+
from object_detection.models.ssd_mobilenet_v1_fpn_feature_extractor import SSDMobileNetV1FpnFeatureExtractor
37+
from object_detection.models.ssd_mobilenet_v1_ppn_feature_extractor import SSDMobileNetV1PpnFeatureExtractor
3538
from object_detection.models.ssd_mobilenet_v2_feature_extractor import SSDMobileNetV2FeatureExtractor
3639
from object_detection.protos import model_pb2
3740

@@ -50,7 +53,22 @@
5053
'ssd_resnet101_v1_fpn':
5154
ssd_resnet_v1_fpn.SSDResnet101V1FpnFeatureExtractor,
5255
'ssd_resnet152_v1_fpn':
53-
ssd_resnet_v1_fpn.SSDResnet152V1FpnFeatureExtractor
56+
ssd_resnet_v1_fpn.SSDResnet152V1FpnFeatureExtractor,
57+
'ssd_resnet50_v1_ppn':
58+
ssd_resnet_v1_ppn.SSDResnet50V1PpnFeatureExtractor,
59+
'ssd_resnet101_v1_ppn':
60+
ssd_resnet_v1_ppn.SSDResnet101V1PpnFeatureExtractor,
61+
'ssd_resnet152_v1_ppn':
62+
ssd_resnet_v1_ppn.SSDResnet152V1PpnFeatureExtractor
63+
}
64+
65+
SSD_RESNET_V1_PPN_FEAT_MAPS = {
66+
'ssd_resnet50_v1_ppn':
67+
ssd_resnet_v1_ppn.SSDResnet50V1PpnFeatureExtractor,
68+
'ssd_resnet101_v1_ppn':
69+
ssd_resnet_v1_ppn.SSDResnet101V1PpnFeatureExtractor,
70+
'ssd_resnet152_v1_ppn':
71+
ssd_resnet_v1_ppn.SSDResnet152V1PpnFeatureExtractor
5472
}
5573

5674

@@ -296,6 +314,87 @@ def test_create_ssd_resnet_v1_fpn_model_from_config(self):
296314
self.assertIsInstance(model, ssd_meta_arch.SSDMetaArch)
297315
self.assertIsInstance(model._feature_extractor, extractor_class)
298316

317+
def test_create_ssd_resnet_v1_ppn_model_from_config(self):
318+
model_text_proto = """
319+
ssd {
320+
feature_extractor {
321+
type: 'ssd_resnet_v1_50_ppn'
322+
conv_hyperparams {
323+
regularizer {
324+
l2_regularizer {
325+
}
326+
}
327+
initializer {
328+
truncated_normal_initializer {
329+
}
330+
}
331+
}
332+
}
333+
box_coder {
334+
mean_stddev_box_coder {
335+
}
336+
}
337+
matcher {
338+
bipartite_matcher {
339+
}
340+
}
341+
similarity_calculator {
342+
iou_similarity {
343+
}
344+
}
345+
anchor_generator {
346+
ssd_anchor_generator {
347+
aspect_ratios: 1.0
348+
}
349+
}
350+
image_resizer {
351+
fixed_shape_resizer {
352+
height: 320
353+
width: 320
354+
}
355+
}
356+
box_predictor {
357+
weight_shared_convolutional_box_predictor {
358+
depth: 1024
359+
class_prediction_bias_init: -4.6
360+
conv_hyperparams {
361+
activation: RELU_6,
362+
regularizer {
363+
l2_regularizer {
364+
weight: 0.0004
365+
}
366+
}
367+
initializer {
368+
variance_scaling_initializer {
369+
}
370+
}
371+
}
372+
num_layers_before_predictor: 2
373+
kernel_size: 1
374+
}
375+
}
376+
loss {
377+
classification_loss {
378+
weighted_softmax {
379+
}
380+
}
381+
localization_loss {
382+
weighted_l2 {
383+
}
384+
}
385+
classification_weight: 1.0
386+
localization_weight: 1.0
387+
}
388+
}"""
389+
model_proto = model_pb2.DetectionModel()
390+
text_format.Merge(model_text_proto, model_proto)
391+
392+
for extractor_type, extractor_class in SSD_RESNET_V1_PPN_FEAT_MAPS.items():
393+
model_proto.ssd.feature_extractor.type = extractor_type
394+
model = model_builder.build(model_proto, is_training=True)
395+
self.assertIsInstance(model, ssd_meta_arch.SSDMetaArch)
396+
self.assertIsInstance(model._feature_extractor, extractor_class)
397+
299398
def test_create_ssd_mobilenet_v1_model_from_config(self):
300399
model_text_proto = """
301400
ssd {
@@ -373,6 +472,160 @@ def test_create_ssd_mobilenet_v1_model_from_config(self):
373472
self.assertTrue(model._freeze_batchnorm)
374473
self.assertTrue(model._inplace_batchnorm_update)
375474

475+
def test_create_ssd_mobilenet_v1_fpn_model_from_config(self):
476+
model_text_proto = """
477+
ssd {
478+
freeze_batchnorm: true
479+
inplace_batchnorm_update: true
480+
feature_extractor {
481+
type: 'ssd_mobilenet_v1_fpn'
482+
conv_hyperparams {
483+
regularizer {
484+
l2_regularizer {
485+
}
486+
}
487+
initializer {
488+
truncated_normal_initializer {
489+
}
490+
}
491+
}
492+
}
493+
box_coder {
494+
faster_rcnn_box_coder {
495+
}
496+
}
497+
matcher {
498+
argmax_matcher {
499+
}
500+
}
501+
similarity_calculator {
502+
iou_similarity {
503+
}
504+
}
505+
anchor_generator {
506+
ssd_anchor_generator {
507+
aspect_ratios: 1.0
508+
}
509+
}
510+
image_resizer {
511+
fixed_shape_resizer {
512+
height: 320
513+
width: 320
514+
}
515+
}
516+
box_predictor {
517+
convolutional_box_predictor {
518+
conv_hyperparams {
519+
regularizer {
520+
l2_regularizer {
521+
}
522+
}
523+
initializer {
524+
truncated_normal_initializer {
525+
}
526+
}
527+
}
528+
}
529+
}
530+
normalize_loc_loss_by_codesize: true
531+
loss {
532+
classification_loss {
533+
weighted_softmax {
534+
}
535+
}
536+
localization_loss {
537+
weighted_smooth_l1 {
538+
}
539+
}
540+
}
541+
}"""
542+
model_proto = model_pb2.DetectionModel()
543+
text_format.Merge(model_text_proto, model_proto)
544+
model = self.create_model(model_proto)
545+
self.assertIsInstance(model, ssd_meta_arch.SSDMetaArch)
546+
self.assertIsInstance(model._feature_extractor,
547+
SSDMobileNetV1FpnFeatureExtractor)
548+
self.assertTrue(model._normalize_loc_loss_by_codesize)
549+
self.assertTrue(model._freeze_batchnorm)
550+
self.assertTrue(model._inplace_batchnorm_update)
551+
552+
def test_create_ssd_mobilenet_v1_ppn_model_from_config(self):
553+
model_text_proto = """
554+
ssd {
555+
freeze_batchnorm: true
556+
inplace_batchnorm_update: true
557+
feature_extractor {
558+
type: 'ssd_mobilenet_v1_ppn'
559+
conv_hyperparams {
560+
regularizer {
561+
l2_regularizer {
562+
}
563+
}
564+
initializer {
565+
truncated_normal_initializer {
566+
}
567+
}
568+
}
569+
}
570+
box_coder {
571+
faster_rcnn_box_coder {
572+
}
573+
}
574+
matcher {
575+
argmax_matcher {
576+
}
577+
}
578+
similarity_calculator {
579+
iou_similarity {
580+
}
581+
}
582+
anchor_generator {
583+
ssd_anchor_generator {
584+
aspect_ratios: 1.0
585+
}
586+
}
587+
image_resizer {
588+
fixed_shape_resizer {
589+
height: 320
590+
width: 320
591+
}
592+
}
593+
box_predictor {
594+
convolutional_box_predictor {
595+
conv_hyperparams {
596+
regularizer {
597+
l2_regularizer {
598+
}
599+
}
600+
initializer {
601+
truncated_normal_initializer {
602+
}
603+
}
604+
}
605+
}
606+
}
607+
normalize_loc_loss_by_codesize: true
608+
loss {
609+
classification_loss {
610+
weighted_softmax {
611+
}
612+
}
613+
localization_loss {
614+
weighted_smooth_l1 {
615+
}
616+
}
617+
}
618+
}"""
619+
model_proto = model_pb2.DetectionModel()
620+
text_format.Merge(model_text_proto, model_proto)
621+
model = self.create_model(model_proto)
622+
self.assertIsInstance(model, ssd_meta_arch.SSDMetaArch)
623+
self.assertIsInstance(model._feature_extractor,
624+
SSDMobileNetV1PpnFeatureExtractor)
625+
self.assertTrue(model._normalize_loc_loss_by_codesize)
626+
self.assertTrue(model._freeze_batchnorm)
627+
self.assertTrue(model._inplace_batchnorm_update)
628+
376629
def test_create_ssd_mobilenet_v2_model_from_config(self):
377630
model_text_proto = """
378631
ssd {

research/object_detection/builders/optimizer_builder.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,12 +90,15 @@ def _create_learning_rate(learning_rate_config):
9090

9191
if learning_rate_type == 'exponential_decay_learning_rate':
9292
config = learning_rate_config.exponential_decay_learning_rate
93-
learning_rate = tf.train.exponential_decay(
94-
config.initial_learning_rate,
93+
learning_rate = learning_schedules.exponential_decay_with_burnin(
9594
tf.train.get_or_create_global_step(),
95+
config.initial_learning_rate,
9696
config.decay_steps,
9797
config.decay_factor,
98-
staircase=config.staircase, name='learning_rate')
98+
burnin_learning_rate=config.burnin_learning_rate,
99+
burnin_steps=config.burnin_steps,
100+
min_learning_rate=config.min_learning_rate,
101+
staircase=config.staircase)
99102

100103
if learning_rate_type == 'manual_step_learning_rate':
101104
config = learning_rate_config.manual_step_learning_rate

0 commit comments

Comments
 (0)