Detectron2目标检测运行无显示、弹窗无响应如何解决
我参考这篇文章提供的代码,使用训练完成的模型对图像开展目标检测推理,分别尝试cv2.imread、detectron2的read_image接口读取输入图片,效果一致,完整代码如下:
# import some common detectron2 utilities from detectron2.engine import DefaultPredictor from detectron2.config import get_cfg from detectron2.utils.visualizer import Visualizer from detectron2.data import MetadataCatalog import cv2 from detectron2.data.detection_utils import read_image WINDOW_NAME = "COCO detections" #im = cv2.imread("sample.jpg") # this also shows the same result im = read_image("sample.jpg", format="BGR") # Create config cfg = get_cfg() cfg.merge_from_file("C:/Users/preet/detectron_repo/configs/COCO-Detection/faster_rcnn_X_101_32x8d_FPN_3x.yaml") cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.5 # set threshold for this model cfg.MODEL.WEIGHTS = "detectron2://COCO-Detection/faster_rcnn_X_101_32x8d_FPN_3x/139173657/model_final_68b088.pkl" # Create predictor predictor = DefaultPredictor(cfg) # Make prediction outputs = predictor(im) v = Visualizer(im[:, :, ::-1], MetadataCatalog.get(cfg.DATASETS.TRAIN[0]), scale=1.2) v = v.draw_instance_predictions(outputs["instances"].to("cpu")) cv2.namedWindow(WINDOW_NAME, cv2.WINDOW_NORMAL) cv2.imshow(WINDOW_NAME, v.get_image()[:, :, ::-1])
代码运行后弹出的结果窗口显示“无响应”,窗口内未展示任何检测结果,同时运行时输出如下警告信息:
UserWarning: torch.meshgrid: in an upcoming release, it will be required to pass the indexing argument. (Triggered internally at C:\cb\pytorch_1000000000000\work\aten\src\ATen\native\TensorShape.cpp:2228.) return _VF.meshgrid(tensors, **kwargs) # type: ignore[attr-defined]
排查解决方法
输出的torch.meshgrid警告是PyTorch与当前安装的detectron2版本的兼容提示,不会阻塞程序运行,也不是窗口无响应的诱因,按以下优先级排查修复:
- 核心问题修复:OpenCV的
imshow函数本身不会阻塞程序,也不会启动GUI消息循环,现有代码执行到imshow后会直接运行到程序末尾退出,窗口没有进程维持消息响应就会显示“无响应”。只需要在cv2.imshow()代码后追加两行逻辑即可:
# 等待任意按键按下,0代表永久等待,传入其他数字代表等待毫秒数 cv2.waitKey(0) # 按键触发后销毁所有OpenCV创建的窗口 cv2.destroyAllWindows()
- 权重下载阻塞排查:如果是第一次运行这段代码,
detectron2://前缀的模型权重会自动从远程拉取,下载过程中程序处于阻塞状态,不会有终端输出,此时提前弹出的窗口会暂时显示无响应。不要强制关闭窗口,观察终端网络/下载进度提示,等权重下载完成、推理执行结束后,结果会正常渲染到窗口中。 - 图片读取有效性校验:确认
sample.jpg和运行脚本的工作路径一致,文件没有损坏。可以在图片读取代码后加一行print(im.shape),如果能正常输出(高度, 宽度, 3)格式的元组,说明图片读取正常;如果报NoneType相关错误,就是路径不对或者图片损坏,调整为绝对路径即可。 - 警告消除(可选,不影响功能):如果不想看到meshgrid相关警告,要么升级detectron2到适配最新PyTorch的版本,要么在导入torch的代码后加一行补丁逻辑:
import torch # 给meshgrid补默认indexing参数,消除警告 _original_meshgrid = torch.meshgrid torch.meshgrid = lambda *args, **kwargs: _original_meshgrid(*args, indexing='ij', **kwargs)
内容的提问来源于stack exchange,提问作者Preetom Saha Arko
相关产品推荐
相关产品推荐

