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
相关产品推荐
相关产品推荐

