release commit
authorManu Mathew <a0393608@ti.com>
Tue, 7 Jan 2020 10:30:09 +0000 (16:00 +0530)
committerManu Mathew <a0393608@ti.com>
Tue, 7 Jan 2020 10:30:09 +0000 (16:00 +0530)
docs/Quantization.md
docs/Semantic_Segmentation.md
modules/pytorch_jacinto_ai/vision/models/pixel2pixel/fpn_pixel2pixel.py
modules/pytorch_jacinto_ai/xnn/quantize/quant_graph_module.py
run_segmentation.sh

index 376a29a51c1a7ccbd1ba867a6de4628e49332b16..35e5532f9db11d26bb54bd7990a97c3210ca7c63 100644 (file)
@@ -157,15 +157,12 @@ python ./scripts/train_classification_main.py --dataset_name image_folder_classi
 python ./scripts/train_segmentation_main.py --dataset_name cityscapes_segmentation --model_name deeplabv3lite_mobilenetv2_tv --data_path ./data/datasets/cityscapes/data --img_resize 384 768 --output_size 1024 2048 --gpus 0 1 --pretrained ./data/modelzoo/semantic_segmentation/cityscapes/deeplabv3lite-mobilenetv2/cityscapes_segmentation_deeplabv3lite-mobilenetv2_2019-06-26-08-59-32.pth --batch_size 8 --quantize True --epochs 150 --lr 5e-5 --evaluate_start False
 ```
 
-## Important Notes
+## Important Notes - read carefully
 **Multi-GPU training/calibration/validation with DataParallel is not yet working with our quantization modules** QuantCalibrateModule, QuantTrainModule. 
-- For now, we recommend not to wrap the modules in DataParallel if you are training/calibrating with quantization - i.e. if your model is wrapped in QuantCalibrateModule/QuantTrainModule/QuantTestModule. 
-- This may not be such a problem as calibration and quantization may not take as much time as the original training. 
-- If your calibration/training crashes with insufficient GPU memory, reduce the batch size and try again.
-- The original training (without quantization) can use Multi-GPU as usual and we do not have any restrictions on that.
+- **We recommend not to wrap the modules in DataParallel if you are training/calibrating/testing with quantization - i.e. if your model is wrapped in QuantCalibrateModule/QuantTrainModule/QuantTestModule.** If you get an error during training related to weights and input not being in the same GPU, please check and ensure that you are not using DataParallel with QuantCalibrateModule/QuantTrainModule/QuantTestModule. This may not be such a problem as calibration and quantization may not take as much time as the original training. If your calibration/training crashes with insufficient GPU memory, reduce the batch size and try again. The original training (without quantization) can use Multi-GPU as usual and we do not have any restrictions on that.
+- **The same module should not be re-used multiple times within the module** in order that the activation range estimation is correct. Unfortunately, in the torchvision ResNet models, the ReLU module in the BasicBlock and BottleneckBlock are re-used multiple times. We have corrected this by defining separate ReLU modules. This change is minor and **does not** affect the loading of existing pretrained weights. See the [our modified ResNet model definition here](./modules/pytorch_jacinto_ai/vision/models/resnet.py).
+- **Use Modules instead of functions** (we make use of modules to decide whether to do activation range clipping or not). For example use torch.nn.reLU instead of torch.nn.functional.relu(), torch.nn.AdaptiveAvgPool2d() instead of torch.nn.functional.adaptive_avg_pool2d(), torch.nn.Flatten() instead of torch.nn.functional.flatten() etc. If you are using functions in your model and is giving poor quantized accuracy, then consider replacing those functions by the corresponding modules.
 - Tools for Calibration and Trained Quantization have started appearing in mainstream Deep Learning training frameworks [[7,8]]. Using the tools natively provided by these frameworks may be faster compared to an implementation in the Python layer of these frameworks (like we have done) - but they may not be mature currently. 
-- In order that the activation range estimation is correct, **the same module should not be re-used multiple times within the module**. Unfortunately, in the torchvision ResNet models, the ReLU module in the BasicBlock and BottleneckBlock are re-used multiple times. We have corrected this by defining separate ReLU modules. This change is minor and **does not** affect the loading of existing pretrained weights. See the [our modified ResNet model definition here](./modules/pytorch_jacinto_ai/vision/models/resnet.py).
-- Use Modules instead of functions as much as possible (we make use of modules to decide whether to do activation range clipping or not). For example use torch.nn.AdaptiveAvgPool2d() instead of torch.nn.functional.adaptive_avg_pool2d(), torch.nn.Flatten() instead of torch.nn.functional.flatten() etc. If you are using functions in your model and is giving poor quantized accuracy, then consider replacing those functions by the corresponding modules.
 
 
 ## Results
index b2c86b780aaa5b1e62fdd4085b59e86d101c7f3f..997a22a5f438b7da167e261cd493d217a1785a32 100644 (file)
@@ -7,14 +7,10 @@ Commonly used Training/Validation commands are listed in the file [run_segmentat
 ## Model Configurations
 A set of common example model configurations are defined for all pixel to pixel tasks. These models can support multiple inputs (for example image and optical flow) as well as support multiple decoders for multi-task prediction (for example semantic segmentation + depth estimation + motion segmentation). 
 
-Whether to use multiple inputs or how many decoders to use are fully configurable. This framework is also flexible to add different model architectures or backbone networks. The following model configurations are currently available:<br>
-
+Whether to use multiple inputs or how many decoders to use are fully configurable. This framework is also flexible to add different model architectures or backbone networks. Some of the model configurations are currently available are:<br>
 * **deeplabv3lite_mobilenetv2_tv**: (default) This model is mostly similar to the DeepLabV3+ model [[6]] using MobileNetV2 backbone. The difference with DeepLabV3+ is that we removed the convolutions after the shortcut and kep one set of depthwise separable convolutions to generate the prediction. The ASPP module that we used is a lite-weight variant with depthwise separable convolutions (DWASPP). We found that this reduces complexity without sacrificing accuracy. Due to this we call this model DeepLabV3+(Lite) or simply  DeepLabV3Lite. (Note: The suffix "_tv" is used to indicate that our backbone model is from torchvision)<br> 
-
 * **fpn_pixel2pixel_aspp_mobilenetv2_tv**: This is similar to Feature Pyramid Network [[3]], but adapted for pixel2pixel tasks. We stop the decoder at a stride of 4 and then upsample to the final resolution from there. We also use DWASPP module to improve the receptive field. We call this model FPNPixel2Pixel. 
-
-* **fpn_pixel2pixel_aspp_mobilenetv2_tv_es64**: This is also FPN, but with a larger encoder stride(64). This is a low complexity model that can be used with higher resolutions.
-
+* **fpn_pixel2pixel_aspp_mobilenetv2_tv_fd**: This is also FPN, but with a larger encoder stride(64). This is a low complexity model (using Fast Downsampling Strategy [8]) that can be used with higher resolutions.
 * **fpn_pixel2pixel_aspp_resnet50**: Feature Pyramid Network (FPN) based pixel2pixel using ResNet50 backbone with DWASPP.
 
 ## Datasets: Cityscapes Dataset 
@@ -85,22 +81,26 @@ Inference can be done as follows (fill in the path to the pretrained model):<br>
 
 |Dataset    |Mode Architecture         |Backbone Model|Backbone Stride|Resolution |Complexity (GigaMACS)|MeanIoU%  |Model Configuration Name                    |
 |---------  |----------                |-----------   |-------------- |-----------|--------             |----------|----------------------------------------    |
-|Cityscapes |FPNPixel2Pixel with DWASPP|MobileNetV2   |64             |768x384    |0.99                 |62.43     |fpn_pixel2pixel_aspp_mobilenetv2_tv_es64    |
+|Cityscapes |FPNPixel2Pixel with DWASPP|MobileNetV2   |64             |768x384    |0.99                 |62.43     |fpn_pixel2pixel_aspp_mobilenetv2_tv_fd    |
 |Cityscapes |DeepLabV3Lite with DWASPP |MobileNetV2   |16             |768x384    |**3.54**             |**69.13** |**deeplabv3lite_mobilenetv2_tv**            |
-|Cityscapes |FPNPixel2Pixel            |MobileNetV2   |32             |768x384    |3.66                 |-         |fpn_pixel2pixel_mobilenetv2_tv              |
+|Cityscapes |FPNPixel2Pixel            |MobileNetV2   |32(\*2\*2)     |768x384    |3.66                 |70.28     |fpn_pixel2pixel_mobilenetv2_tv              |
 |Cityscapes |FPNPixel2Pixel with DWASPP|MobileNetV2   |32             |768x384    |3.84                 |70.39     |fpn_pixel2pixel_aspp_mobilenetv2_tv         |
-|Cityscapes |FPNPixel2Pixel            |MobileNetV2   |64             |1536x768   |3.85                 |69.82     |fpn_pixel2pixel_mobilenetv2_tv_es64         |
-|Cityscapes |FPNPixel2Pixel with DWASPP|MobileNetV2   |64             |1536x768   |**3.96**             |**71.28** |**fpn_pixel2pixel_aspp_mobilenetv2_tv_es64**|
-|Cityscapes |FPNPixel2Pixel with DWASPP|MobileNetV2   |64             |2048x1024  |7.03                 |72.67     |fpn_pixel2pixel_aspp_mobilenetv2_tv_es64    |
+|Cityscapes |FPNPixel2Pixel            |MobileNetV2   |64(\*2\*2)     |1536x768   |3.85                 |69.82     |fpn_pixel2pixel_mobilenetv2_tv_fd         |
+|Cityscapes |FPNPixel2Pixel with DWASPP|MobileNetV2   |64             |1536x768   |**3.96**             |**71.28** |**fpn_pixel2pixel_aspp_mobilenetv2_tv_fd**|
+|Cityscapes |FPNPixel2Pixel with DWASPP|MobileNetV2   |64             |2048x1024  |7.03                 |72.67     |fpn_pixel2pixel_aspp_mobilenetv2_tv_fd    |
 |Cityscapes |DeepLabV3Lite with DWASPP |MobileNetV2   |16             |1536x768   |14.48                |73.59     |deeplabv3lite_mobilenetv2_tv                |
 |Cityscapes |FPNPixel2Pixel with DWASPP|MobileNetV2   |32             |1536x768   |**15.37**            |**74.98** |**fpn_pixel2pixel_aspp_mobilenetv2_tv**     |
 
 |Dataset    |Mode Architecture         |Backbone Model|Backbone Stride|Resolution |Complexity (GigaMACS)|MeanIoU%  |Model Configuration Name                    |
 |---------  |----------                |-----------   |-------------- |-----------|--------             |----------|----------------------------------------    |
-|Cityscapes |ERFNet[[4]]               |              |               |1024x512   |27.705               |69.7      |N/A                                         |
-|Cityscapes |SwiftNetMNV2[[5]]         |MobileNetV2   |               |2048x1024  |41.0                 |75.3      |N/A                                         |
-|Cityscapes |DeepLabV3Plus[[6,7]]      |MobileNetV2   |16             |           |21.27                |70.71     |N/A                                         |
-|Cityscapes |DeepLabV3Plus[[6,7]]      |Xception65    |16             |           |418.64               |78.79     |N/A                                         |
+|Cityscapes |ERFNet[[4]]               |-             |-              |1024x512   |27.705               |69.7      |-                                           |
+|Cityscapes |SwiftNetMNV2[[5]]         |MobileNetV2   |-              |2048x1024  |41.0                 |75.3      |-                                           |
+|Cityscapes |DeepLabV3Plus[[6,7]]      |MobileNetV2   |16             |           |21.27                |70.71     |-                                           |
+|Cityscapes |DeepLabV3Plus[[6,7]]      |Xception65    |16             |           |418.64               |78.79     |-                                           |
+
+Notes: 
+- (\*2\*2) in the above table represents two additional Depthwise Separable Convolutions with strides (at the end of the backbone encoder). 
+- Backbione encoder stride of 64 (some rows in the above table) is achieved by Fast Downsampling Strategy [8]
 
 ## References
 [1]The Cityscapes Dataset for Semantic Urban Scene Understanding, Marius Cordts, Mohamed Omran, Sebastian Ramos, Timo Rehfeld, Markus Enzweiler, Rodrigo Benenson, Uwe Franke, Stefan Roth, Bernt Schiele, CVPR 2016, https://www.cityscapes-dataset.com/
@@ -119,4 +119,6 @@ International Journal of Computer Vision, 88(2), 303-338, 2010, http://host.robo
 
 [7] Tensorflow/Deeplab Model Zoo, https://github.com/tensorflow/models/blob/master/research/deeplab/g3doc/model_zoo.md
 
+[8] FD-MobileNet: Improved MobileNet with a Fast Downsampling Strategy, Zheng Qin, Zhaoning Zhang, Xiaotao Chen, Yuxing Peng - https://arxiv.org/abs/1802.03750)
+
 
index b84bfb93aff0c1a9716ab07cd1c4bbb8c1bbef28..12ad0e208cc00436cbc264ca72183ec931a6b94a 100644 (file)
@@ -7,11 +7,11 @@ from ..multi_input_net import MobileNetV2TVMI4, ResNet50MI4
 
 
 __all__ = ['FPNPixel2PixelASPP', 'FPNPixel2PixelDecoder',
-           'fpn_pixel2pixel_aspp_mobilenetv2_tv', 'fpn_pixel2pixel_aspp_mobilenetv2_tv_es64',
+           'fpn_pixel2pixel_aspp_mobilenetv2_tv', 'fpn_pixel2pixel_aspp_mobilenetv2_tv_fd',
            # no aspp models
-           'fpn_pixel2pixel_mobilenetv2_tv', 'fpn_pixel2pixel_mobilenetv2_tv_es64',
+           'fpn_pixel2pixel_mobilenetv2_tv', 'fpn_pixel2pixel_mobilenetv2_tv_fd',
            # resnet models
-           'fpn_pixel2pixel_aspp_resnet50', 'fpn_pixel2pixel_aspp_resnet50_es64',
+           'fpn_pixel2pixel_aspp_resnet50', 'fpn_pixel2pixel_aspp_resnet50_fd',
            ]
 
 
@@ -182,7 +182,7 @@ def fpn_pixel2pixel_aspp_mobilenetv2_tv(model_config, pretrained=None):
 
 
 # fast down sampling model (encoder stride 64 model)
-def fpn_pixel2pixel_aspp_mobilenetv2_tv_es64(model_config, pretrained=None):
+def fpn_pixel2pixel_aspp_mobilenetv2_tv_fd(model_config, pretrained=None):
     model_config = get_config_fpnp2p_mnv2().merge_from(model_config)
     model_config.fastdown = True
     model_config.strides = (2,2,2,2,2)
@@ -205,7 +205,7 @@ def fpn_pixel2pixel_mobilenetv2_tv(model_config, pretrained=None):
 
 
 # similar to the original fpn model with extra convolutions with strides (no aspp) - fast down sampling model (encoder stride 64 model)
-def fpn_pixel2pixel_mobilenetv2_tv_es64(model_config, pretrained=None):
+def fpn_pixel2pixel_mobilenetv2_tv_fd(model_config, pretrained=None):
     model_config = get_config_fpnp2p_mnv2().merge_from(model_config)
     model_config.use_aspp = False
     model_config.use_extra_strides = True
@@ -264,7 +264,7 @@ def fpn_pixel2pixel_aspp_resnet50(model_config, pretrained=None):
     return model, change_names_dict
 
 
-def fpn_pixel2pixel_aspp_resnet50_es64(model_config, pretrained=None):
+def fpn_pixel2pixel_aspp_resnet50_fd(model_config, pretrained=None):
     model_config = get_config_fpnp2p_resnet50().merge_from(model_config)
     model_config.fastdown = True
     model_config.strides = (2,2,2,2,2)
index 0ce62c868354e1ac85e647d48869999b194972ab..66b6006e8eb2d5d348d14f66109a4c945265ec12 100644 (file)
@@ -216,7 +216,11 @@ class QuantGraphModule(HookedModule):
                 if not hasattr(opt, 'qparams'):
                     opt.qparams = Dict()
                 #
-                opt.qparams.last_node = current_node
+                # update last_node if this is not a container module
+                # if this is a container module, the last_node would have been already filled in in the last leaf module
+                if len(module._modules) == 0:
+                    opt.qparams.last_node = current_node
+                #
 
 
     ################################################################
@@ -240,7 +244,11 @@ class QuantGraphModule(HookedModule):
 
         quantize_out = False
         if utils.is_activation(module):
-            quantize_out = True
+            if len(next_module)==1 and utils.is_activation(next_module[0]):
+                quantize_out = False
+            else:
+                quantize_out = True
+            #
         elif isinstance(module, (layers.AddBlock, layers.CatBlock, layers.MultBlock)):
             if len(next_module)==1 and utils.is_activation(next_module[0]):
                 quantize_out = False
index fef2a5efb62d3e1081bbfd535cf7bd4245b06003..35884902cd3fe765659159bffc110adf4388b5bc 100755 (executable)
@@ -9,7 +9,7 @@
 #--pretrained https://download.pytorch.org/models/mobilenet_v2-b0353104.pth
 
 #### Cityscapes Semantic Segmentation - original fpn - no aspp model, stride 64 model - Low Complexity Model
-#python ./scripts/train_segmentation_main.py --dataset_name cityscapes_segmentation --model_name fpn_pixel2pixel_aspp_mobilenetv2_tv_es64 --data_path ./data/datasets/cityscapes/data --img_resize 384 768 --output_size 1024 2048 --gpus 0 1 \
+#python ./scripts/train_segmentation_main.py --dataset_name cityscapes_segmentation --model_name fpn_pixel2pixel_aspp_mobilenetv2_tv_fd --data_path ./data/datasets/cityscapes/data --img_resize 384 768 --output_size 1024 2048 --gpus 0 1 \
 #--pretrained https://download.pytorch.org/models/mobilenet_v2-b0353104.pth
 
 #### Cityscapes Semantic Segmentation - Training with MobileNetV2+DeeplabV3Lite, Higher Resolution
@@ -17,7 +17,7 @@
 #--pretrained https://download.pytorch.org/models/mobilenet_v2-b0353104.pth
 
 #### Cityscapes Semantic Segmentation - original fpn - no aspp model, stride 64 model, Higher Resolution - Low Complexity Model
-#python ./scripts/train_segmentation_main.py --dataset_name cityscapes_segmentation --model_name fpn_pixel2pixel_aspp_mobilenetv2_tv_es64 --data_path ./data/datasets/cityscapes/data --img_resize 768 1536 --rand_crop 512 1024 --output_size 1024 2048 --gpus 0 1 \
+#python ./scripts/train_segmentation_main.py --dataset_name cityscapes_segmentation --model_name fpn_pixel2pixel_aspp_mobilenetv2_tv_fd --data_path ./data/datasets/cityscapes/data --img_resize 768 1536 --rand_crop 512 1024 --output_size 1024 2048 --gpus 0 1 \
 #--pretrained https://download.pytorch.org/models/mobilenet_v2-b0353104.pth
 
 #### Cityscapes Semantic Segmentation - Training with ResNet50+FPN