Python3.6+OpenCV3.4.1下cv2.dnn无readNet属性问题求助
解决OpenCV 3.4.1中cv2.dnn无readNet属性的问题
嘿,这个问题我之前帮人排查过,其实原因很明确:OpenCV 3.4.1的dnn模块还没有引入readNet()这个统一的模型读取接口,这个方法是在后续版本(比如3.4.2及以上,或者4.x全系列)才添加的,用来统一不同框架模型的读取逻辑。
下面给你两个可行的解决方案:
方案一:修改示例代码适配3.4.1版本
既然你用的是3.4.1,直接把代码里的readNet()换成对应框架的专用读取函数就行:
- 如果是Caffe模型(
.prototxt+.caffemodel):把cv.dnn.readNet(args.model, args.config, args.framework)改成cv.dnn.readNetFromCaffe(args.config, args.model) - 如果是TensorFlow模型(
.pb+.pbtxt):改成cv.dnn.readNetFromTensorFlow(args.model, args.config) - 如果是Torch模型:用
readNetFromTorch()
举个具体的修改例子,原代码行:
net = cv.dnn.readNet(args.model, args.config, args.framework)
可以替换成根据框架判断的逻辑:
if args.framework == 'caffe': net = cv.dnn.readNetFromCaffe(args.config, args.model) elif args.framework == 'tensorflow': net = cv.dnn.readNetFromTensorFlow(args.model, args.config) # 其他框架同理补充
方案二:升级OpenCV到支持readNet的版本
如果不想改代码,直接把OpenCV升级到3.4.2及以上版本,或者4.x系列。升级的时候注意编译时依旧要确保CMake配置里的BUILD_opencv_dnn选项是勾选的(默认应该是开启的,但最好确认一下),这样编译安装后就能正常使用readNet()接口了。
另外可以顺便确认下,你编译OpenCV时有没有正确启用dnn模块?虽然你说编译无异常,但可以通过运行print(cv2.getBuildInformation())查看输出里的dnn相关项,确认是YES状态,排除模块未编译的可能。
内容的提问来源于stack exchange,提问作者Peshmerge
相关产品推荐
相关产品推荐

