Ascend-SACT/YOLOv4-npu
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

YOLOv4 模型迁移适配指导

1. 模型概述

YOLOv4(You Only Look Once v4)本身并不是专为自动驾驶设计的模型,而是一个通用的、高性能的实时目标检测框架。不过,由于其在速度与精度之间的良好平衡,YOLOv4 及其变种常被用于自动驾驶感知系统中的2D目标检测任务,例如检测车辆、行人、交通标志等。

2. 准备运行环境

2.1 软件环境

组件版本
Python3.11
PyTorch2.5.1
torch_npu2.5.1.post1.dev20250722
CANNcann_8.2.rc1

2.2 硬件环境

设备型号NPU 配置
Atlas 800T A3单卡 / 多卡(0~15)

2.3 准备镜像

镜像环境镜像地址
公网swr.cn-southwest-2.myhuaweicloud.com/atelier/pytorch_ascend:pytorch_2.5.1-cann_8.2.rc1-py_3.11-hce_2.0.2503-aarch64-snt9b23-20250729103313-3a25129

2.4 启动镜像

    docker run -itd -u root \
    --privileged \
    --device=/dev/davinci0 \
    --device=/dev/davinci1 \
    --device=/dev/davinci2 \
    --device=/dev/davinci3 \
    --device=/dev/davinci4 \
    --device=/dev/davinci5 \
    --device=/dev/davinci6 \
    --device=/dev/davinci7 \
    --device=/dev/davinci8 \
    --device=/dev/davinci9 \
    --device=/dev/davinci10 \
    --device=/dev/davinci11 \
    --device=/dev/davinci12 \
    --device=/dev/davinci13 \
    --device=/dev/davinci14 \
    --device=/dev/davinci15 \
    --device=/dev/davinci_manager \
    --device=/dev/devmm_svm \
    --device=/dev/hisi_hdc \
    -v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \
    -v /usr/local/dcmi:/usr/local/dcmi \
    -v /etc/ascend_install.info:/etc/ascend_install.info \
    -v /sys/fs/cgroup:/sys/fs/cgroup:ro \
    -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
    -v /usr/bin/hccn_tool:/usr/bin/hccn_tool \
    -v /etc/hccn.conf:/etc/hccn.conf \
    --shm-size 1024g --net=host \
    -v <host_dir>:<container_dir> \
    --name <container_name> <image_id> /bin/bash

3 运行指导

3.1 创建环境

docker exec -it yolov4 bash 
conda create -n yolov4 --clone PyTorch-2.5.1
conda activate yolov4

3.2 Pip 源配置(强烈建议)

为避免依赖下载失败或速度过慢,建议统一使用 华为内部 PyPI 镜像源:

pip config --user set global.index https://mirrors.huaweicloud.com/repository/pypi
pip config --user set global.index-url https://mirrors.huaweicloud.com/repository/pypi/simple
pip config --user set global.trusted-host mirrors.huaweicloud.com

3.3 下载模型源码

cd /home/ma-user/
git clone https://github.com/WongKinYiu/PyTorch_YOLOv4.git

3.4 安装依赖

cd PyTorch_YOLOv4
 pip install tensorboardX
 pip install numpy==1.17

3.5 数据集准备

执行如下命令下载coco2017数据集

# 下载图像
wget -P images/ http://images.cocodataset.org/zips/train2017.zip
wget -P images/ http://images.cocodataset.org/zips/val2017.zip
wget -P images/ http://images.cocodataset.org/zips/test2017.zip

# 下载标注
wget -P annotations/ http://images.cocodataset.org/annotations/annotations_trainval2017.zip
wget -P annotations/ http://images.cocodataset.org/annotations/image_info_test2017.zip

# 解压
unzip images/train2017.zip -d images/
unzip images/val2017.zip -d images/
unzip annotations/annotations_trainval2017.zip -d .

参考https://roboflow.com/formats/yolov5-pytorch-txt?ref=ultralytics 中YOLOv5 PyTorch TXT 的结构。 每张图片对应一个 txt 文件,每个文件中每一行代表一个边界框。每行的格式为:

class_id center_x center_y width height

归一化坐标,值范围为[0,1] 示例如下:

1 0.617 0.3594420600858369 0.114 0.17381974248927037

3.6 迁移适配

  1. 添加自动迁移代码 在train.py添加如下代码,用于在昇腾NPU自动迁移。
import torch_npu
from torch_npu.contrib import transfer_to_npu
  1. 解决RuntimeError: 父目录 /data1/testdata/coco/labels 不存在的问题,部分报错如下
  File "/home/ma-user/anaconda3/envs/yolov4/lib/python3.11/site-packages/torch/serialization.py", line 849, in save
    with _open_zipfile_writer(f) as opened_zipfile:
         ^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ma-user/anaconda3/envs/yolov4/lib/python3.11/site-packages/torch/serialization.py", line 716, in _open_zipfile_writer
    return container(name_or_buffer)
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ma-user/anaconda3/envs/yolov4/lib/python3.11/site-packages/torch/serialization.py", line 687, in __init__
    super().__init__(torch._C.PyTorchFileWriter(self.name))
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
RuntimeError: Parent directory /data1/testdata/coco/labels does not exist.

按数据准备章节生成对应的数据标签

  1. 解决AttributeError: module 'numpy' has no attribute 'int'.报错,部分错误信息如下
    bi = np.floor(np.arange(n) / batch_size).astype(np.int)  # batch index
                                                    ^^^^^^
  File "/home/ma-user/anaconda3/envs/yolov4/lib/python3.11/site-packages/numpy/__init__.py", line 305, in __getattr__
    raise AttributeError(__former_attrs__[attr])
AttributeError: module 'numpy' has no attribute 'int'.

将numpy降级为1.17

  1. 修复RuntimeError: Expected all tensors to be on the same device. Expected NPU tensor, please check whether the input tensor device is correct.报错,部分错误如下
PyTorch_YOLOv4/utils/loss.py
RuntimeError: Expected all tensors to be on the same device. Expected NPU tensor, please check whether the input tensor device is correct.

utils/loss.py修改如下防止数据部分在NPU和CPU无法进行计算,导致报错。 修改前

at = torch.arange(na).view(na, 1).repeat(1, nt)

修改后

at = torch.arange(na,device=anchors.device).view(na, 1).repeat(1, nt)

3.7 启动训练

修改data/coco.yaml中训练集和验证集路径为当前存放的数据路径。

train: /data1/testdata/coco/images/train2017/
val: /data1/testdata/coco/images/val2017/
# 指定0卡进行训练
python train.py --device 0 --batch-size 16 --img 640 640 --data coco.yaml --cfg cfg/yolov4-pacsp.cfg --weights '' --name yolov4-pacsp

3.8 性能

硬件卡数性能
910C15.22 it/s