You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

YOLOv5 Docker导入train.py报utils.dataloaders模块缺失求解

问题背景
  • 运行环境:YOLOv5 Docker 环境
  • 业务需求:将 YOLOv5 官方仓库的 train.py 导入自有代码使用
  • 项目入口文件为 main_train.py,初始代码如下:
from yolov5 import train
报错信息

构建镜像后运行入口文件抛出如下异常:

Traceback (most recent call last):
File "main_train.py", line 1, in <module>
from yolov5 import train
File "/code/yolov5/train.py", line 40, in <module>
import val  # for end-of-epoch mAP
File "/code/yolov5/val.py", line 37, in <module>
from models.common import DetectMultiBackend
File "/code/yolov5/models/common.py", line 24, in <module>
from utils.dataloaders import exif_transpose, letterbox
ModuleNotFoundError: No module named 'utils.dataloaders'
yolov5-train exited with code 1

核心异常:ModuleNotFoundError: No module named 'utils.dataloaders',进程异常退出。

问题原因

YOLOv5 官方源码默认设计为直接在仓库根目录下运行脚本,所有内部模块(models、utils 等)的导入逻辑都是基于仓库根目录的绝对导入,没有做子包适配。当把 yolov5 作为子目录/第三方包导入到外部项目时,Python 解释器的模块搜索路径默认指向外部项目的根目录,不会自动将 yolov5 自身的目录加入搜索路径,因此无法识别其内部的 utils、models 等模块。

修复方案

方案1:导入前手动注入模块搜索路径(改动最小,无需修改YOLOv5源码,推荐优先使用)

修改 main_train.py,在导入 yolov5 相关模块前,将 yolov5 的根目录加入 Python 系统路径,示例代码如下:

import sys
from pathlib import Path

# 路径对应Docker内yolov5仓库的实际绝对路径,和报错里的/code/yolov5保持一致即可
YOLOV5_ROOT = Path("/code/yolov5")
if str(YOLOV5_ROOT) not in sys.path:
    sys.path.insert(0, str(YOLOV5_ROOT))

# 路径注入完成后再导入,即可正常识别内部模块
from yolov5 import train

方案2:在yolov5包内自动注入路径(一次配置全局生效)

在 yolov5 文件夹下新建 __init__.py 文件,写入路径注入逻辑,后续所有位置导入 yolov5 都不需要重复加路径配置:
/code/yolov5/__init__.py 文件内容:

import sys
from pathlib import Path

# 自动获取当前yolov5包的根目录,加入系统搜索路径
PKG_DIRECTORY = Path(__file__).parent.resolve()
if str(PKG_DIRECTORY) not in sys.path:
    sys.path.insert(0, str(PKG_DIRECTORY))

配置完成后,原有 from yolov5 import train 代码无需任何修改即可正常运行。

方案3:修改YOLOv5内部导入为相对导入(不推荐)

批量修改 YOLOv5 源码内所有内部模块的导入语句,将根路径导入改为包相对导入,示例修改规则:

  • 将 import val 修改为 from . import val
  • 将 from models.common import DetectMultiBackend 修改为 from .models.common import DetectMultiBackend
  • 将 from utils.dataloaders import exif_transpose, letterbox 修改为 from .utils.dataloaders import exif_transpose, letterbox
    该方案改动量大,后续升级 YOLOv5 版本时需要重复修改所有导入语句,维护成本高,不建议使用。

内容的提问来源于stack exchange,提问作者Ali Amini Bagh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 20:21:29