今日学习内容
今天主要围绕 YOLOv11 的模型训练与视频预测展开,遇到并解决了多个实际问题。上午调试视频预测代码时,因帧分辨率过大(1422×2160)导致内存分配错误(_ArrayMemoryError),通过自动缩放帧后再还原的方式解决。下午训练自定义模型时,遇到了特征图尺寸不匹配的错误,通过修正 YAML 文件中卷积步长和索引,并恢复被污染的 block.py 文件,最终模型成功构建。此外,还处理了数据集路径配置错误的问题。
遇到的主要问题及解决方案
- 视频预测内存不足
· 现象:使用 model.predict(source=video) 时出现 Unable to allocate 8.79 MiB 错误,视频帧过大导致 OpenCV 无法分配内存。
· 解决:采用逐帧读取视频,在送入模型前先缩小帧尺寸(等比例缩放到 640 边长),预测后再将标注帧放大回原始尺寸保存。这样既避免内存溢出,又保证了输出视频的分辨率不变。
- 自定义模型(含 P2 检测层和 SimAM 注意力)特征图尺寸不匹配
· 现象:训练时报 RuntimeError: Sizes of tensors must match except in dimension 1. Expected size 8 but got size 16,提示在 head 的 Concat 层中拼接的两个特征图高宽不一致。
· 原因分析:
· YAML 中 head 第11层使用了步长为2的卷积,导致尺寸缩小一半,后续与 P4 层(40×40)拼接时尺寸不一致(20×40)。
· 同时发现测试代码错误地放在了 block.py 文件末尾,导致导入时 YOLO 未定义。
· 解决:
· 将 head 第11层的卷积步长从 2 改为 1,保持尺寸为 20×20,与上采样后的 P4 层(40×40)不直接拼接,而是先上采样再拼接。
· 清理 block.py 文件,移除末尾的测试代码,确保自定义模块 C3k2_SimAM 正确注册。
· 修正 YAML 中 backbone 索引(如第28行融合 C2PSA 层应使用索引10)。
- 数据集路径错误
· 现象:训练时提示 Dataset 'coal.yaml' images not found, missing path '...\coaloal\images\val',路径中出现了拼写错误 coaloal。
· 解决:检查 coal.yaml 文件,将 path 修正为正确的数据集根目录(如 E:\...\datasets\coal),并确保 train 和 val 相对路径正确。
学到的知识点
-
YOLOv8 视频处理的内存管理:当输入帧过大时,可在读取后立即缩放,避免模型内部因内存分配失败而崩溃。
-
模型自定义的调试方法:使用 model.model(dummy) 测试前向传播,打印中间层尺寸定位错误;用独立的测试脚本验证模型结构,避免污染源码文件。
-
YAML 结构对特征图尺寸的影响:FPN 中的卷积步长和上采样操作必须精确匹配,否则拼接时会出现尺寸不一致。
-
数据集配置的路径约定:path 指定数据集根目录,train 和 val 为相对路径,确保实际目录存在且命名正确。
收获与反思
今天在调试中更加深刻体会到"细节决定成败":一个卷积步长、一个索引数字、一个路径拼写错误,都可能导致整个程序失败。通过逐步定位和修正,不仅解决了问题,也加深了对 YOLOv8 内部结构的理解。未来在自定义模型时,应先测试前向传播,确保结构正确再投入训练,避免后期反复调试。
下一步计划
· 开始训练自定义模型,观察 SimAM 注意力对检测精度的提升效果。
· 尝试用 GPU 加速训练(当前为 CPU),提升效率。
· 继续完善视频预测脚本,增加进度条和日志记录。