Repo(欢迎star): https://github.com/thb1314/tensorrt-onnx-fasterrcnn-fpn-roiailigin FasterRCNN作为经典的two-staged detector,至今为止其精度配合FPN+ROIAlign依然SOTA。 然而FasterRCNN在TensorRT的部署却没有one-stage的检测器那么容易。因为TensorRT输入输出要求shape是确定值,就算新的版本支持动态batch_size,但是在一开始也要确定最大输入的batch_size,中间的算子是不允许运行时更改维度的。 这成为FasterRCNN+FPN+ROIAlign在TensorRT部署的难点,因为rpn的输出需要经过nms+roialign,尽管nms和roialign可以通过plugin的方式来实现,但是nms的输出是不固定的。 此外,在计算roialign计算时,应该采用fpn哪个输出层的feature是根据rpn输出的bbox来计算的,onnx对于这里的计算步骤用计算图的表示引入了大量的判断算子,这在TensorRT的onnx解析器中是不支持的。 本项目采用
torchvision.models.detection.fasterrcnn_resnet50_fpn为待部署模型,着手解决部署中产生的一些问题。 主要思路:将rpn部分和检测头分开,分成两个模型。rpn部分采用onnx解析,nms+roialigin部分使用原生cuda来做。处理后的feature送入header部分,然后再一次经过cuda实现的nms得到最终结果。
代码见repo下的model和test
上面步骤涉及到计算图的修建,过程较为繁琐。
tensorRT部分需要完成哪些事?
roi_align如何实现?
以上需求的实现可以在tensorrt_code/application/src/application/app_fasterrcnn中可以找到
仓库代码持续更新中,如果有问题可以在本文下面留言,也可以在仓库issue区提出问题,如果可以动动小手给个star,我将不胜感激。