今天用 pytorch yolov5 训练了一批图片, 就在测试的时候发现, 尽然报如下的错误…

Traceback (most recent call last):
  File "d:\AI\WCMS\www\ai.cycleblock.cn\www\handlers\OnlineRecognitionYolo5.py", line 86, in post
    res = common.Yolo5AI.DetectOneImage(image)
  File "d:\AI\WCMS\www\ai.cycleblock.cn\www\common\Yolo5AI.py", line 193, in DetectOneImage
    return detect(orgimg0,opt)
  File "d:\AI\WCMS\www\ai.cycleblock.cn\www\common\Yolo5AI.py", line 95, in detect
    model = attempt_load(weights, map_location=device)  # load FP32 model
  File "d:\AI\WCMS\www\ai.cycleblock.cn\www\yolov5\models\experimental.py", line 137, in attempt_load
    model.append(torch.load(w, map_location=map_location)['model'].float().fuse().eval())  # load FP32 model
  File "C:\ProgramData\Anaconda3\envs\pytorch\lib\site-packages\torch\serialization.py", line 584, in load
    return _load(opened_zipfile, map_location, pickle_module, **pickle_load_args)
  File "C:\ProgramData\Anaconda3\envs\pytorch\lib\site-packages\torch\serialization.py", line 842, in _load
    result = unpickler.load()
ModuleNotFoundError: No module named 'models'

这错误蹦的我是一头雾水…
后来在同学的帮助下,
找到了. 原因和解决方案, 网上也有其它的解决方案. 但是我觉得, 同学给的下面这种解决方案最好.

import os,sys
root_path = os.getcwd()
sys.path.insert(0,root_path+"/yolov5") #这个后面的"/yolov5" 文件夹应该是指向的 yolov5根目录.

把这段代码放到主运行的py文件中.例如我的是StartWeb.py
这样就可以正常运行了.

原因分析如下. serialization.py 这个文件从字面意思上理解就是序列化和反序列化了.
由于python是解释性语言, 序列化的文件里面保存的 “命名空间” 是按照yolov5的根目录开始的.

而我的程序在运行的时候是按照StartWeb.py 当做根目录开始的.
在我的项目里是这样安排目录的.

|__WCMS
	  |___common
	  |___yolov4
	  |___yolov5
	  |___StartWeb.py

反解析的时候根目录的起始点不同了,导致了找不到models
sys.path 就是为了解决这种目录错乱引起的问题而设.
关于sys.path 我就不详细解释了, 网上的说明很多… 这个很重要.
尤其是在规范化的项目下面. 这个很重要.