From 4eb5345e2970aa0bc85f381fca2c899d82eb68bb Mon Sep 17 00:00:00 2001 From: TonyCY24 Date: Fri, 21 Nov 2025 17:55:27 +0800 Subject: [PATCH] Merge pull request #28053 from TonyCY24:docs/mask-rcnn-compatibility samples: add compatibility note for Mask R-CNN in OpenCV 5.0 #28053 ### Pull Request Readiness Checklist See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request - [x] I agree to contribute to the project under Apache 2 License. - [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV - [x] The PR is proposed to the proper branch - [x] There is a reference to the original bug report and related work - [ ] There is accuracy test, performance test and test data in opencv_extra repository, if applicable Patch to opencv_extra has the same branch name. - [ ] The feature is well documented and sample code can be built with the project CMake ### Summary Updates documentation in `samples/dnn/mask_rcnn.py` to clarify a compatibility issue with OpenCV 5.0. ### Details As verified in issue #27240, OpenCV 5.0 introduces stricter graph optimization. The default `.pbtxt` used in this sample treats `detection_out_final` as an intermediate layer (it is not listed in `getUnconnectedOutLayersNames`). While OpenCV 4.x implicitly allows retrieving this layer, OpenCV 5.0 throws an error when requesting it: > "the number of requested and actual outputs must be the same" This PR adds: 1. A warning note in the file header explaining the strict output requirement. 2. An inline comment near `net.forward()` to guide users debugging this error. Relates to issue: #27240 --- samples/dnn/mask_rcnn.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/samples/dnn/mask_rcnn.py b/samples/dnn/mask_rcnn.py index 352dfd191a..bbd3eacc15 100644 --- a/samples/dnn/mask_rcnn.py +++ b/samples/dnn/mask_rcnn.py @@ -1,3 +1,15 @@ +''' +Mask R-CNN +This is an example of using Mask R-CNN for object detection and instance segmentation. + +NOTE regarding OpenCV 5.0+: +The default model configuration (.pbtxt) used in this sample relies on retrieving +intermediate layers (e.g., 'detection_out_final'). OpenCV 5.0 introduces stricter +graph optimization which may prune intermediate layers not explicitly registered as outputs. +If you encounter an error such as "the number of requested and actual outputs must be the same", +please note that the provided .pbtxt may need to be updated to explicitly declare +'detection_out_final' as an output node. +''' import cv2 as cv import argparse import numpy as np @@ -91,6 +103,8 @@ while cv.waitKey(1) < 0: # Run a model net.setInput(blob) + # NOTE: In OpenCV 5.0, requesting 'detection_out_final' will fail if the .pbtxt + # does not register it as an output. See file header for details. boxes, masks = net.forward(['detection_out_final', 'detection_masks']) numClasses = masks.shape[1]