问题:在使用Python做车牌识别项目,打包完发现执行到SVM字符识别的时候用OpenCV库里的load()保存模型时出错。
我使用的解决方案:
1.如果确定待加载的SVM模型文件和训练数据集没问题,检查load()里的路径是不是带中文,该函数不支持中文路径。
搜索到的其他解决方案:
从字面意思上看出现的错误在于SVM类型的缺失或无效,因此有可能是:
1.SVM模型没导入进去,检查一下路径。
2.xml格式的模型文件出了问题。有以下几种方案:
1).用记事本打开xml格式的模型文件,找到开头的<opencv_ml_svm>,删除这一行。
Save and Load SVM in OpenCV in Python - Stack Overflowhttps://stackoverflow.com/questions/54662467/save-and-load-svm-in-opencv-in-python 2).把self.model = self.model.load(fn)换成:
file = cv2.FileStorage(fn, cv2.FILE_STORAGE_READ)
self.model.read(fn=file.getNode('opencv_ml_svm'))
踩坑记录:TypeError: Expected cv::FileNode for argument ‘fn‘ cv2.read()报错_春田花花幼稚园优秀毕业生的博客-CSDN博客knn.read(‘knn.xml’)修改为file = cv2.FileStorage('knn.xml', cv2.FILE_STORAGE_READ)self.knn.read(fn=file.getNode('opencv_ml_knn'))getNode后面带的文件内的命名https://blog.csdn.net/weixin_44544354/article/details/115872499 3).用了OpenCV高版本库的调用函数调用OpenCV低版本库所生成的xml分类器导致的。
例如用了opencv3.2的调用函数调用opencv2.x所生成的xml分类器,其中opencv2.x所生成的xml有<my_svm> tag,而opencv3.2中的xml没有这个tag。
用"my_svm_model.xml"加载模型即可。
使用Opencv时调用svm->load和VideoCapture报错的问题分析_lifei092的博客-CSDN博客问题 1:调用svm->load("SVM_HOG.xml"));时出现“Parsing error (Missing or invalid SVM type) in cv::ml::SVMImpl::read_params ... ...”的报错。原因分析:可能使用了opencv3.2的调用函数调用opencv2.x所生成的xml分类器导致的,其中opencv2.x所生成的xml有&l...https://blog.csdn.net/lifei092/article/details/86737338https://github.com/opencv/opencv/issues/6572
https://github.com/opencv/opencv/issues/6572题外话:
找了一下午,还以为自己的代码有什么藏得特别深的bug。由于我在程序开头指定了模型的保存路径SVM_MODEL_PATH以及训练数据集的保存路径DATA_PATH默认在程序运行路径下,所以一开始我以为是获取程序运行路径的方法不对,搜索一番后发现打包完的程序解包时会解包到C盘的一个临时文件夹,用FILEPATH = os.path.dirname(os.path.abspath(__file__)获取到的路径好像会出问题,于是换成FILEPATH = sys._MEIPASS。关于sys._MEIPASS可以参考:Python中 sys._MEIPASS 是什么_maozexijr的博客-CSDN博客用pyinstaller 打包生成的 exe 文件,在运行时动态生成依赖文件,sys._MEIPASS 就是这些依赖文件所在文件夹的路径通常C:\Windows\Temp\_MEIxxxx或C:\Users\用户名\AppData\Local\Temp\_MEIxxxx仅在 exe 运行时有效,IDE运行时报错:AttributeError: module 'sys...https://blog.csdn.net/MAOZEXIJR/article/details/91971027
后来发现不加载SVM模型直接利用数据集生成新的模型时会闪退,找了一下发现运行到self.model.save(SVM_MODEL_PATH)语句的时候闪退了,这时候我还是以为解包后获取路径出了问题,于是我就把模型保存的路径名称改成了'.\svm.xml',结果发现运行是能运行了,打包完的程序运行后始终找不到生成的模型在哪,于是每一次初始化程序的时候都会重新生成模型。又找了一下发现模型生成到了C:\Users\USERNAME(USERNAME是你自己的用户名)文件夹下,我真的是哭笑不得,只能把路径改了回去。
后来我把SVM识别字符模块单独拿出来打包到另外的文件夹,结果发现莫名其妙没问题了。再次检查了一番之后发现现在的打包路径没中文名了,这才想起来Python环境下OpenCV库的一些加载保存函数是不支持中文路径的。重新把整个程序打包到了英文路径下,运行成功。