OpenCV ObjectnessBING视觉显著性检测报错无法打开yml.gz文件
报错含义
错误日志核心信息:
Can't open archive: '/ObjNessB2W8HSV.wS1.yml.gz' mode=rb3
这个报错是OpenCV文件读取模块抛出的,代表程序正尝试以二进制只读模式打开gzip压缩的BING显著性检测模型文件ObjNessB2W8HSV.wS1.yml.gz,但在系统根目录/下找不到该文件,读取失败。重复弹出多条相同报错,是因为算法运行需要依次读取多个模型文件,每找不到一个就会触发一次错误提示。
触发原因
- ObjectnessBING是基于预训练模型的显著性检测算法,运行必须依赖提前训练好的模型权重文件,没有配置模型路径时无法完成显著性计算。
- 代码中
saliency.setTrainingPath(args["model"])这行配置模型路径的语句被注释,OpenCV没有收到手动指定的模型路径时,会默认到系统根目录查找模型文件,必然找不到对应资源。 - OpenCV的saliency模块不会在首次调用算法时自动下载所需的模型文件,必须手动准备模型并配置正确路径。
修复方案
- 第一步:准备BING算法所需的全部预训练模型文件,包含
ObjNessB2W8HSV.wS1.yml.gz、ObjNessB2W8HSV.wS2.yml.gz、ObjNessB2W8I.wS1.yml.gz、ObjNessB2W8I.wS2.yml.gz等,将所有模型文件放在同一个无中文、无特殊字符的本地文件夹内。 - 第二步:取消代码中模型路径配置行的注释,将路径参数指向存放模型的文件夹(注意
setTrainingPath方法需要传入的是模型所在文件夹的路径,不是单个模型文件的路径)。修正后的可运行代码示例:
import cv2 import argparse # 解析命令行参数 ap = argparse.ArgumentParser() ap.add_argument("-i", "--image", required=True, help="待检测图像的路径") ap.add_argument("-m", "--model", required=True, help="BING模型文件所在文件夹的路径") args = vars(ap.parse_args()) # 读取输入图像 image = cv2.imread(args["image"]) # 初始化ObjectnessBING显著性检测器 saliency = cv2.saliency.ObjectnessBING_create() # 配置模型路径(取消该行注释) saliency.setTrainingPath(args["model"]) # 执行显著性计算 (success, saliencyMap) = saliency.computeSaliency(image) if success: numDetections = saliencyMap.shape[0] print(f"共检测到{numDetections}个显著性候选区域")
- 第三步:运行代码时正确传入图像路径和模型文件夹路径即可,若仍报文件读取错误,优先检查路径拼写是否正确、路径下的模型文件是否完整。
内容的提问来源于stack exchange,提问作者梁珮瑶
相关产品推荐
相关产品推荐

