YoloV5部署时遇到的一些问题,ModuleNotFoundError: No module named ‘models‘,解决方法

我的情况是模型训练完了,精度还可以,但是需要将YoloV5中detect模块部署到软件中

把YoloV5的Models和Utils都移了过去,放在了软件专门放依赖的libs文件夹中,并且修改完全部的引用路径,但是还是报错。

多方查证,发现问题所在:如果使用torch.save(model, PATH)代码保存模型,当你用保存的模型进行预测的时候,源文件与预测程序之间需要相同的文件结构,这个方法会把模型的结构也保存到pt文件中,当你在部署模型的时候,如果你的依赖和detect不在同一文件夹下,即使你再怎么修改代码的引用方式都没有用。(ps:我看到有人说这个是因为import的时候路径不对,这个是新手问题。我真服了,这个人多半没有部署过yolo,再强调一遍啊,不是import问题,import没问题)

具体还是在源码中有人提出并解决了这个问题

ModuleNotFoundError:没有名为“models”的模块 ·问题 #353 ·超声波/约洛夫5 (github.com)

Yolo的模型结构为:

解决方法1:

和yolov5源码的路径保持一致,也就是说你自己写的detect.py需要和models还有utils在一个模块下面。

但是如果你的领导不许你这么做,非要你把依赖统一放到一起,而运行的文件单独放在另一边,那么这就没办法了。(不会吧,不会有人被一个莫名其妙的需求就直接被原本三分钟就能解决的问题卡了一周吧)

解决方法2:

从头训练,训练前把源码结构改成和你项目结构一致,例如,我的项目是libs文件夹下放models和utils,但是我的detect是和libs同级的文件夹,那么你就修改你源码的结构,把models和libs单独拎出来,按照你部署时的路径放置你的train,models,utils三个文件

但是这个解决办法的问题在于没有办法用预训练权重。你会发现yolo自带的四个预训练权重yolos,yolox,yolom,yolol这四个pt文件中貌似也保存了原始路径,也就是说你得从头训练,不使用预训练权重,这个可能会导致训练效果不佳,我最后就是没有达成和原先的相同精度。训练了四五轮都不如原先一轮精度高。

解决方法3:

据说将保存的模型转换成onnx可以解决这个问题,这样子的话我的detect要重写。

解决方法4:

在使用torch.load()加载模型的prune_mynet.py文件最开始加上如下两行代码:

import sys
sys.path.insert(0, './yolov5')

就是把你的utils和models所在文件夹放入系统路径中,这个是github上提出这个问题的人提出的解决方法

但是,如果当utils和models所在文件夹中有其他的同名文件,也就是说可能你的utils可能需要改名成utilsforyolo,modelsforyolo,这样的话,问题就又来了。(哎呀多灾多难啊)

解决方法5

改源码,只保存权重文件,而不保存路径。

在训练时的train.py中找到所有的torch.save()函数,应该是有两个,改成

torch.save(model.state_dict(), PATH)

也就是保存模型的state_dict属性,这个属性只有权重,没有路径。完美解决

猜你喜欢

转载自blog.csdn.net/m0_50317149/article/details/131774910