Pretrained FastRCNN from FasterRCNN

Hi everybody,

My goal is to generate FastRCNN inference with my own proposals. Unfortunately, there is no implementation of this architecture in Pytorch so i decided to implement it by myself based on the FasterRCNN implementation.

I already tried to make my custom FastRCNN architecture based on FasterRCNN (torchvision.models.faster_rcnn) and GeneralizedRCNN (torchvision.models.generalized_rcnn) by removing the RPN parts and including the proposals parameter in the GeneralizedRCNN forward method.

I successfully loaded a resnet50 backbone but i didn’t found a way to load a pre-trained FastRCNNPredictor which is wrapped into the pre-trained model “fasterrcnn_resnet50_fpn_coco”.

Is it possible to extract the FastRCNNPredictor from a pre-trained model and to add it to my architecture ?

You should be able to directly access the predictor via:

model.roi_heads.box_predictor.state_dict().keys()
# > odict_keys(['cls_score.weight', 'cls_score.bias', 'bbox_pred.weight', 'bbox_pred.bias'])

and could thus try to load this state_dict into your new model’s submodule.

Thank you for your response.
I managed to successfully load backbone and box_predictor.

I have a general question. My final goal is to export the model in ONNX format in order to use it in C++ with OnnxRuntime. As i said, I based my custom FastRCNN architecture on FasterRCNN. When I export the model in ONNX format, should I expect that the post-processing parts (like box_regression applied to input proposals or box decoding as done in the FasterRCNN architecture) are also exported ? Or do I need to solely export the “processing parts” up to the box_predictor outputs and re-implement the post-processing operations in C++ ?

I’m not familiar enough with the ONNX export process for FasterRCNN, but I would assume that the “entire” model is exported as it’s passed to torch.onnx.export. I.e. if the post-processing steps are part of the model’s forward pass, I would assume they are also in the exported model.
One thing that you could check is if any methods are decorated with torch.jit.ignore, which wouldn’t be scripted.

Ok I will take a look.
Thank you for your quick responses and for your work :wink: