新版yolov5项目报错 ImportError: cannot import name ‘xx‘ from ‘xx‘

本文详细记录了在使用yolov57.0版本时遇到的常见问题,包括模块缺失、函数调用错误和返回值问题,提供了相应的解决方法,帮助用户快速定位并修复这些问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


第一次使用yolov5-7.0版本实现界面可视化时,发现运行时会报很多错误,有的是没安装库,有的是无法从模块中导入库,原因是在新版的yolov5如版本7.0中,有些函数可能已经被移除,或是移到其他模块中,或者被重命名,现在将报的错误总结一下,方便以后的使用:

  1. 模块缺失

错误1: ModuleNotFoundError: No module named 'PyQt5'

解决方法: 直接在终端输入 pip install PyQt5或者pip install PyQt5 -i https://pypi.tuna.tsinghua.edu.cn/simple使用后者镜像源下载的速度更快。

另外,也可以使用其他镜像源下载,在这里补充几个第三方库国内镜像:
1.豆瓣 https://pypi.douban.com/simple
2.阿里云 https://mirrors.aliyun.com/pypi/simple
3.清华大学 https://pypi.tuna.tsinghua.edu.cn/simple
4.中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple

错误2:ModuleNotFoundError: No module named 'utils.datasets'
错误原因:查看 yolov5/utils 文件夹中发现没有 datasets.py 文件,只有 dataloaders.py 文件,可能是被重命名了
在这里插入图片描述

解决方法:根据报错的地址,将 yolov5 文件夹里 detect_qt5.py 中第十行的from utils.datasets import LoadStreams, LoadImages改为from utils.dataloaders import LoadStreams, LoadImages

  1. 函数调用错误

错误1:ImportError: cannot import name 'scale_coords' from 'utils.general' (C:\Users\Administrator\yolov5\utils\general.py)

解决方法:将 utils 文件夹中 general.py 中对应位置的 'scale_coords'改为'scale_boxes'

错误2:ImportError: cannot import name 'save_one_box' from 'utils.general' (C:\Users\Administrator\yolov5\utils\general.py)

错误原因:打开general.py文件,Ctrl+F搜索,发现文件中没有定义’save_one_box’函数,而在utils/plots.py文件中可以搜索到’save_one_box’,

解决方法:在 detect_qt5.py 文件中找到from utils.general import xx,将'save_one_box'移至 from utils.plots import xx 后面

错误3:ImportError: cannot import name 'plot_one_box' from 'utils.plots' (C:\Users\Administrator\yolov5\utils\plots.py)
错误原因:这是因为在 plots.py 文件中没有定义'plot_one_box'

解决方法:我们可以在程序中直接定义一个:

def plot_one_box(x, img, color=None, label=None, line_thickness=None):
    # Plots one bounding box on image img
    tl = line_thickness or round(0.002 * (img.shape[0] + img.shape[1]) / 2) + 1  # line/font thickness
    color = color or [random.randint(0, 255) for _ in range(3)]
    c1, c2 = (int(x[0]), int(x[1])), (int(x[2]), int(x[3]))
    cv2.rectangle(img, c1, c2, color, thickness=tl, lineType=cv2.LINE_AA)
    if label:
        tf = max(tl - 1, 1)  # font thickness
        t_size = cv2.getTextSize(label, 0, fontScale=tl / 3, thickness=tf)[0]
        c2 = c1[0] + t_size[0], c1[1] - t_size[1] - 3
        cv2.rectangle(img, c1, c2, color, -1, cv2.LINE_AA)  # filled
        cv2.putText(img, label, (c1[0], c1[1] - 2), 0, tl / 3, [225, 255, 255], thickness=tf, lineType=cv2.LINE_AA)

错误4:ImportError: cannot import name 'load_classifier' from 'utils.torch_utils' (C:\Users\Administrator\yolov5\utils\torch_utils.py)

解决方法:在utils所有的文件中都没有找到’load_classifier’函数,也无法确定是否被更名或移除,可以在torch_utils中添加一个定义,添加后目前还没有报错:


def load_classifier(name='resnet101', n=2):
    """在detect.py中调用
    用于检测结束后可能需要第二次分类  直接修改torchvision中的预训练模型的分类类别即可
    :params name: 分类模型名字 默认resnet101
    :params n: 分类模型的分类类别数  需要在加载了预训练模型后将model的最后一层的类别数改为n
    """
    #
    # 加载torchvision中已经写好的pretrained模型  reshape为n类输出
    model = torchvision.models.__dict__[name](pretrained=True)

    # ResNet model properties
    # input_size = [3, 224, 224]
    # input_space = 'RGB'
    # input_range = [0, 1]
    # mean = [0.485, 0.456, 0.406]
    # std = [0.229, 0.224, 0.225]

    # 将加载的预训练模型的最后一层的分类类别数改为n  Reshape output to n classes
    # 总体的过程 = 将fc层的权重和偏置清0 + 修改类别个数为n
    filters = model.fc.weight.shape[1]
    model.fc.bias = nn.Parameter(torch.zeros(n), requires_grad=True)
    model.fc.weight = nn.Parameter(torch.zeros(n, filters), requires_grad=True)
    model.fc.out_features = n
    # 返回reshape后的模型 进行二次分类
    return model

该办法参考这位博主的文章【YOLOV5-5.x 源码解读】torch_utils.py

错误5:ImportError: cannot import name 'time_synchronized' from 'utils.torch_utils' (C:\Users\Administrator\yolov5\utils\torch_utils.py)

解决方法:将utils文件夹中 torch_utils.py 中对应位置的'time_synchronized'改为'time_sync'

错误6:TypeError: attempt_load() got an unexpected keyword argument 'map_location'
错误原因:在新版本中函数定义如下:def attempt_load(weights, device=None, inplace=True, fuse=True),而在 detect_qt5.py 文件中代码为model = attempt_load(weights, map_location=device) ,所以会报错。

解决办法:删除 detect_qt5.py 文件中对应函数变量的'map_location'

  1. 返回值错误

错误:ValueError: too many values to unpack (expected 4)
在这里插入图片描述
错误原因: dataset 的返回值与实际需要的值不匹配:
在代码中找到 dataset ,发现它来源自 LoadImages 或是 LoadSteams 这个两函数,那么很可能是这两个函数的返回值出了问题,我们顺藤摸瓜继续CTRL+F搜索 LoadStreams
在这里插入图片描述
可以看到这两个函数都来自 utils 文件夹中的dataloaders.py文件
在这里插入图片描述
打开文件后搜索这两个函数,找到其定义,看是哪个返回值超出了4,最后发现下图函数的返回值有5个。
在这里插入图片描述
解决方法:', s'注释掉,发现可以正常运行。

<think>嗯,用户遇到了一个ImportError,具体是无法从'ultralytics.yolo.utils.downloads'导入'attempt_download'。我需要先理解这个错误的可能原因,然后找到解决方法。 首先,根据引用[2]中的情况,PyCharm有时会混淆导入本地模块和第三方库。用户可能在项目中有一个同名的模块或包,导致Python错误地导入了错误的文件。这时候,将项目根目录标记为“Sources Root”可能会有帮助,这样PyCharm就能正确识别本地模块了。用户应该检查他们的项目结构,确认是否有utils或models这样的文件夹与第三方库冲突。 接下来,检查模块结构是否正确。引用[3]提到相对导入超出顶级包的问题,这可能是因为文件结构不正确。用户需要确保他们的文件路径设置正确,例如在导入时使用绝对路径而不是相对路径,或者调整sys.path来包含顶级包的位置。例如,添加项目根目录到sys.path中,这样可以确保Python能够找到正确的模块。 另一个可能性是版本兼容性问题。用户可能使用的ultralytics库版本过旧或过新,导致'attempt_download'函数不存在或者被移动到了其他模块。建议用户检查ultralytics的文档,确认该函数在哪个版本中可用,或者是否已被重命名或移除。如果是版本问题,升级或降级库版本可能会解决。 如果用户是从其他项目迁移代码,比如YOLOv5YOLOv8,可能存在模块路径的变化。例如,YOLOv8可能将某些函数移动到了不同的子模块中。这时候需要参考官方文档或示例代码,调整导入语句的路径,比如从'ultralytics.utils.downloads'导入而不是原来的路径。 此外,清理缓存和重新安装依赖也是一个有效的步骤。Python有时会缓存旧的模块文件,导致即使更新了代码,导入的仍然是旧版本。使用命令行清除.pyc文件或__pycache__目录,然后重新安装ultralytics库,可以排除缓存引起的错误。 最后,如果以上方法都不奏效,用户可能需要检查他们的代码中是否有拼写错误,或者直接查看下载模块的源码,确认'attempt_download'是否存在,或者是否被其他名称替代。如果问题依然存在,参考引用[3]中的方法,手动将项目路径添加到sys.path中,确保模块能够正确导入。 总结下来,可能的解决方案包括检查项目结构、调整导入路径、处理版本问题、清理缓存,以及查阅官方文档。用户需要逐一尝试这些方法,直到问题解决。</think>针对你遇到的ImportError无法从$ultralytics.yolo.utils.downloads$导入$attempt_download$的问题,以下是逐步解决方案: ### 解决方案 1. **检查模块结构** - 确认安装的ultralytics版本是否包含$attempt_download$函数。执行命令: ```bash pip show ultralytics ``` 若版本过旧(如v8.0以下),尝试升级: ```bash pip install ultralytics --upgrade ``` 2. **路径冲突排查** - 若项目中有本地文件夹命名为$ultralytics$或$yolo$,会与第三方库路径冲突。根据引用[2],需将项目根目录标记为**Sources Root**: - 右键项目文件夹 → Mark Directory as → Sources Root 3. **调整导入路径** - 根据引用[3],若函数路径已变更,尝试替换导入语句: ```python # 原错误语句 from ultralytics.yolo.utils.downloads import attempt_download # 调整为 from ultralytics.utils.downloads import attempt_download # 注意路径层级变化 ``` 4. **清理Python缓存** - 删除项目中的$__pycache__$文件夹和$.pyc$文件,执行: ```bash find . -name "__pycache__" -exec rm -rf {} + find . -name "*.pyc" -exec rm -f {} + ``` 5. **验证函数存在性** - 在Python终端直接验证函数是否存在: ```python from ultralytics.utils.downloads import attempt_download print(help(attempt_download)) # 应输出函数说明 ``` ### 相关问题 1. 如何检查Python包的函数是否被弃用? 2. 使用PyCharm时如何避免第三方库与本地模块命名冲突? 3. 升级包后出现API不兼容如何回退版本? --- 通过以上步骤,可解决$attempt_download$的导入错误。若仍存在问题,建议参考引用[2][3]检查项目路径设置,或查阅[ultralytics官方文档](https://docs.ultralytics.com)确认函数最新位置。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值