【华为昇腾】【青云1000】YOLOv5训练并部署到青云1000 基于Ascend 310

这篇具有很好参考价值的文章主要介绍了【华为昇腾】【青云1000】YOLOv5训练并部署到青云1000 基于Ascend 310。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

YOLOv5 训练并部署到 青云1000

准备数据集(PC)

  • 在个人电脑(PC)端准备
  • 待标注的图片,放置于全英文路径
  • AI辅助标注工具:X-Anylabeling

昇腾模型适配工具(PC)

  • 在个人电脑(PC)端安装
  • 安装文档
  • 训练目标检测模型

安装CANN环境(青云)

CANN介绍

  • CANN(Compute Architecture for Neural Networks)是华为针对AI场景推出的异构计算架构
  • 用户在程序中调用CANN提供的接口(或包装后的接口),可以让程序利用昇腾NPU的算力进行计算。地位类似于NVIDIA CUDA
  • CANN开发文档

CANN安装

  • 青云1000端安装
  • 需要 Python3.7.x(3.7.0-3.7.11)或 Python3.8.x(3.8.0-3.8.11)或 Python3.9.x(3.9.0-3.9.7)
    • 可以使用virtualenvconda
    • 若要在Ubuntu 18.04上直接安装高版本Python3,可以参考此博客
  • 确定要安装的CANN版本
    • CANN与青云固件版本应当匹配
    • 固件 1.0.13.alpha对应CANN 6.0.0.alpha00XCANN 6.0.RC1.alpha00X。实测CANN 6.0.1.alpha00X也可。
  • CANN安装包下载
  • CANN安装

部署YOLO模型(青云)

环境需求

  • 青云1000端部署
  • CANN环境
  • Python3.7.x(3.7.0-3.7.11)或 Python3.8.x(3.8.0-3.8.11)或 Python3.9.x(3.9.0-3.9.7)
  • ais_bench推理工具(Python包)

部署与推理

  • 部署文档。在解压得到infer_project/目录后,不要着急继续,请先按照附录的描述对其中一些文件进行修改。
  • 青云1000的昇腾芯片型号为Ascend310(不带任何后缀),在模型转换时需要修改配置文件中的SOC型号atc.sh模型转换脚本
  • 由工具生成的推理代码中,输入图像预处理(尤其是归一化)占用了大量时间,远远超过了模型推理本身的时间。可以使用预处理工具AIPP进行输入预处理。

附录

infer_project/

解压后的目录结构

infer_project
├── benchmark.aarch64
├── common
│   ├── eval.sh
│   ├── onnx2om.sh
│   ├── pth2om.sh
│   ├── quantize
│   ├── util
│   ├── world_cup.jpg
│   ├── yolov5_camera.ipynb
│   ├── yolov5_image.ipynb
│   └── yolov5_video.ipynb
├── config.yaml
├── data.yaml
├── edge_infer
│   ├── acl_image.py
│   ├── acl_model.py
│   ├── acl_net_dynamic.py
│   ├── acl_resource.py
│   ├── coco_names.txt
│   ├── constants.py
│   ├── deep_dims.om
│   ├── deepsort
│   ├── DeepSortDetector.py
│   ├── det_utils.py
│   ├── fusion_result.json
│   ├── mAP
│   ├── utils.py
│   ├── v5_object_detect.py
│   ├── video.py
│   ├── yolov5_infer.ipynb
│   └── yolov5s_v6.1_track.ipynb
├── models
│   ├── __init__.py
│   ├── __pycache__
│   ├── common.py
│   ├── experimental.py
│   ├── hub
│   ├── segment
│   ├── tf.py
│   ├── yolo.py
│   ├── yolov5l.yaml
│   ├── yolov5m.yaml
│   ├── yolov5n.yaml
│   ├── yolov5s.yaml
│   └── yolov5x.yaml
├── om_infer.py
├── onnx2om.py
├── run.py
├── test
│   ├── images
│   ├── labels
│   └── test.json
├── utils
│   ├── __init__.py
│   ├── __pycache__
│   ├── activations.py
│   ├── augmentations.py
│   ├── autoanchor.py
│   ├── autobatch.py
│   ├── aws
│   ├── callbacks.py
│   ├── dataloaders.py
│   ├── docker
│   ├── downloads.py
│   ├── flask_rest_api
│   ├── general.py
│   ├── google_app_engine
│   ├── loggers
│   ├── loss.py
│   ├── metrics.py
│   ├── plots.py
│   ├── segment
│   ├── torch_utils.py
│   └── triton.py
├── yolov5s.onnx
└── yolov5s.pt
infer_project/config.yaml

替换infer_project/config.yaml配置文件里的soc型号,替换为Ascend310

sed -i 's/soc: Ascend310.*/soc: Ascend310/g' infer_project/config.yaml
infer_project/common/util/atc.sh

为青云适配soc型号,并且使用AIPP进行模型预处理

onnx=$1
om=$2
bs=$3
soc=$4

input_shape="images:${bs},3,640,640"
input_fp16_nodes="images"

if [[ ${soc} == Ascend310B1 ]];then
    atc --model=${onnx} \
        --framework=5 \
        --output=${om}_bs${bs} \
        --input_format=NCHW \
        --input_shape=${input_shape} \
        --log=error \
        --soc_version=${soc} \
        --input_fp16_nodes=${input_fp16_nodes} \
        --output_type=FP16
fi

if [[ ${soc} == Ascend310P? ]];then
    atc --model=${onnx} \
        --framework=5 \
        --output=${om}_bs${bs} \
        --input_format=NCHW \
        --input_shape=${input_shape} \
        --log=error \
        --soc_version=${soc} \
        --input_fp16_nodes=${input_fp16_nodes} \
        --output_type=FP16 \
        --optypelist_for_implmode="Sigmoid" \
        --op_select_implmode=high_performance \
        --fusion_switch_file=common/util/fusion.cfg
fi

# 青云1000为Ascend310芯片
# 使用AIPP进行输入图像归一化预处理
# 在模型内部进行输入图像归一化预处理,因此输入为整型
if [[ ${soc} == Ascend310 ]];then
    atc --model=${onnx} \
        --framework=5 \
        --output=${om}_bs${bs} \
        --input_format=NCHW \
        --input_shape=${input_shape} \
        --log=error \
        --soc_version=${soc} \
        --output_type=FP16 \
        --optypelist_for_implmode="Sigmoid" \
        --op_select_implmode=high_performance \
        --fusion_switch_file=common/util/fusion.cfg \
        --insert_op_conf=common/util/aipp_yolov5s.cfg
fi
infer_project/common/util/aipp_yolov5s.cfg

AIPP预处理配置文件(请按照标题路径手动新建),将输入的八位整型三通道RGB图像像素值归一化至0-1,归一化后像素值类别为半精度浮点数。

aipp_op {
    aipp_mode : static
    related_input_rank : 0
    src_image_size_w : 640
    src_image_size_h : 640
    input_format : RGB888_U8
    mean_chn_0 : 0
    mean_chn_1 : 0
    mean_chn_2 : 0
    min_chn_0 : 0
    min_chn_1 : 0
    min_chn_2 : 0
    var_reci_chn_0 : 0.0039216
    var_reci_chn_1 : 0.0039216
    var_reci_chn_2 : 0.0039216
}
infer_project/edge_infer/yolov5_infer.py

以下代码是使用摄像头进行推理的案例,将其复制到infer_project/edge_infer/目录下的yolov5_infer.py文件(新建)即可。

请先填写代码内部留出的模型文件路径标签文件路径。标签文件的模板请参考infer_project/edge_infer/coco_names.txt

进行推理时,请用MobaXterm通过SSH连接青云开发板,激活相关Python环境后进入infer_project/edge_infer目录,执行DISPLAY=$SSH_CLIENT:0.0 python3 yolov5_infer.py即可调用摄像头进行推理。文章来源地址https://www.toymoban.com/news/detail-524825.html

#!/usr/bin/env python
# coding: utf-8

import time
import cv2
import torch
from skvideo.io import vreader, FFmpegWriter
from ais_bench.infer.interface import InferSession

from det_utils import letterbox, scale_coords, nms


def preprocess_image(image, cfg, bgr2rgb=True):
    img, scale_ratio, pad_size = letterbox(image, new_shape=cfg['input_shape'])
    if bgr2rgb:
        img = img[:, :, ::-1]
    img = img.transpose(2, 0, 1)  # HWC2CHW
    return img, scale_ratio, pad_size


def draw_bbox(bbox, img0, color, wt, names):
    det_result_str = ''
    for idx, class_id in enumerate(bbox[:, 5]):
        if float(bbox[idx][4] < float(0.05)):
            continue
        img0 = cv2.rectangle(img0, (int(bbox[idx][0]), int(bbox[idx][1])), (int(bbox[idx][2]), int(bbox[idx][3])),
                             color, wt)
        img0 = cv2.putText(img0, str(idx) + ' ' + names[int(class_id)], (int(bbox[idx][0]), int(bbox[idx][1] + 16)),
                           cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1)
        img0 = cv2.putText(img0, '{:.4f}'.format(bbox[idx][4]), (int(bbox[idx][0]), int(bbox[idx][1] + 32)),
                           cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1)
        det_result_str += '{} {} {} {} {} {}\n'.format(
            names[bbox[idx][5]], str(bbox[idx][4]), bbox[idx][0], bbox[idx][1], bbox[idx][2], bbox[idx][3])
    return img0


def get_labels_from_txt(path):
    labels_dict = dict()
    with open(path) as f:
        for cat_id, label in enumerate(f.readlines()):
            labels_dict[cat_id] = label.strip()
    return labels_dict


def draw_prediction(pred, image, labels):
    img_dw = draw_bbox(pred, image, (0, 255, 0), 2, labels)
    cv2.imshow('result', img_dw)


def infer_image(img_path, model, class_names, cfg):
    image = cv2.imread(img_path)
    img, scale_ratio, pad_size = preprocess_image(image, cfg)
    output = model.infer([img])[0]

    output = torch.tensor(output)
    boxout = nms(output, conf_thres=cfg["conf_thres"], iou_thres=cfg["iou_thres"])
    pred_all = boxout[0].numpy()
    scale_coords(cfg['input_shape'], pred_all[:, :4], image.shape, ratio_pad=(scale_ratio, pad_size))
    draw_prediction(pred_all, image, class_names)


def infer_frame_with_vis(image, model, labels_dict, cfg, bgr2rgb=True):
    img, scale_ratio, pad_size = preprocess_image(image, cfg, bgr2rgb)
    output = model.infer([img])[0]

    output = torch.tensor(output)
    boxout = nms(output, conf_thres=cfg["conf_thres"], iou_thres=cfg["iou_thres"])
    pred_all = boxout[0].numpy()
    scale_coords(cfg['input_shape'], pred_all[:, :4], image.shape, ratio_pad=(scale_ratio, pad_size))
    img_vis = draw_bbox(pred_all, image, (0, 255, 0), 2, labels_dict)
    return img_vis


def img2bytes(image):
    return bytes(cv2.imencode('.jpg', image)[1])


def infer_video(video_path, model, labels_dict, cfg, output_path='output.mp4'):
    cap = vreader(video_path)
    video_writer = None
    for img_frame in cap:
        image_pred = infer_frame_with_vis(img_frame, model, labels_dict, cfg, bgr2rgb=False)
        cv2.imshow('result', image_pred)

        if video_writer is None:
            video_writer = FFmpegWriter(output_path)
        video_writer.writeFrame(image_pred)
    video_writer.close()


def infer_camera(model, labels_dict, cfg):
    cap = cv2.VideoCapture(0)
    while True:
        _, img_frame = cap.read()
        infer_start = time.time()
        image_pred = infer_frame_with_vis(img_frame, model, labels_dict, cfg)
        infer_time = time.time() - infer_start
        print(1 / infer_time)
        cv2.imshow('result', image_pred)
        cv2.waitKey(1)


cfg = {
    'conf_thres': 0.4,
    'iou_thres': 0.5,
    'input_shape': [640, 640],
}

model_path = 'om模型文件路径'
label_path = '标签文件路径'
model = InferSession(0, model_path)
labels_dict = get_labels_from_txt(label_path)


infer_mode = 'camera'

if infer_mode == 'image':
    img_path = 'world_cup.jpg'
    infer_image(img_path, model, labels_dict, cfg)
elif infer_mode == 'camera':
    infer_camera(model, labels_dict, cfg)
elif infer_mode == 'video':
    video_path = 'world_cup.mp4'
    infer_video(video_path, model, labels_dict, cfg, output_path='output.mp4')

到了这里,关于【华为昇腾】【青云1000】YOLOv5训练并部署到青云1000 基于Ascend 310的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于YOLOv5 来训练头盔目标检测-附源码

    建筑工地头部头盔检测,基于目标检测工地安全帽和禁入危险区域识别系统,🚀😆附YOLOv5训练自己的数据集超详细教程!!! 目录 指标 yolov5s 为基础训练,epoch = 50 yolov5m 为基础训练,epoch = 100

    2024年02月13日
    浏览(48)
  • 【深度学习】YOLOv5实例分割 数据集制作、模型训练以及TensorRT部署

    yolov5-seg:官方地址:https://github.com/ultralytics/yolov5/tree/v6.2 TensorRT:8.x.x 语言:C++ 系统:ubuntu18.04 前言:由于yolo仓中提供了标准coco的json文件转txt代码,因此需要将labelme的json文件转为coco json. labelme JSON 转COCO JSON 使用labelme的CreatePolygons按钮开始绘制多边形,然后保存为json格式。

    2024年02月06日
    浏览(60)
  • yolov5训练pt模型并转换为rknn模型,部署在RK3588开发板上——从训练到部署全过程

    目录 一、任务介绍 二、实验过程 2.1 使用正确版本的yolov5进行训练(平台:x86机器windows系统) 2.2 best.pt转换为best.onnx(平台:x86机器window系统) 2.3 best.onnx转换为best.rknn(平台:x86机器Linux系统) 2.3.1 环境准备和工具包安装 2.3.2 onnx转换为rknn 2.4 RK3588部署rknn实现NPU加速(平台:

    2024年02月03日
    浏览(48)
  • 基于深度学习的跌倒检测系统(UI界面+YOLOv5+训练数据集)

    摘要:跌倒监测系统用于智能化监测是否有行人跌倒,通过YOLOv5的深度学习技术对视频、图片、摄像头等画面进行跌倒检测,分析并安全提醒。在介绍算法原理的同时,给出 P y t h o n 的实现代码、 P y Q t 的UI界面及训练数据集。跌倒监测系统主要用于日常生活中行人跌倒情况

    2023年04月18日
    浏览(52)
  • YOLOv5使用NCNN将模型部署到Android端教程(1)部署自己的训练模型到Android实现静态图片检测

    之前一直是在电脑端运行YOLOv5,但在户外调试的时候不太方便,因此考虑把YOLOv5的代码移植到手机端。 这个部署的流程其实很简单:原始pt权重中间onnx权重ncnn权重修改Android Studio源码得到安卓APP结束。如果你感觉博客教程太长了,那么很有可能是中间的图片太多,以及之前自

    2023年04月09日
    浏览(82)
  • 基于YOLOv5的停车位检测系统(清新UI+深度学习+训练数据集)

    摘要:基于YOLOv5的停车位检测系统用于露天停车场车位检测,应用深度学习技术检测停车位是否占用,以辅助停车场对车位进行智能化管理。在介绍算法原理的同时,给出 P y t h o n 的实现代码、训练数据集以及 P y Q t 的UI界面。博文提供了完整的Python代码和使用教程,适合新

    2024年02月11日
    浏览(48)
  • 基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的动物识别系统(Python+PySide6界面+训练代码)

    摘要:本博客文章深入解析了基于深度学习的动物识别系统的完整代码,并展示了采用领先的YOLOv8算法的实现代码。该系统与YOLOv7、YOLOv6、YOLOv5等早期版本的性能进行了比较,可以从静态图像到实时视频流的各种媒介中识别动物的高效性和准确性。文章不仅详尽地阐释了YOL

    2024年03月27日
    浏览(50)
  • 基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的快递包裹检测系统(Python+PySide6界面+训练代码)

    摘要:本文介绍了一种基于深度学习的快递包裹检测系统的代码,采用最先进的YOLOv8算法并对比YOLOv7、YOLOv6、YOLOv5等算法的结果,能够准确识别图像、视频、实时视频流以及批量文件中的快递包裹。文章详细解释了YOLOv8算法的原理,并提供了相应的Python实现代码、训练数据集

    2024年03月28日
    浏览(54)
  • 基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的布匹缺陷检测系统(Python+PySide6界面+训练代码)

    摘要:本文介绍了一种基于深度学习的布匹缺陷检测系统的代码,采用最先进的YOLOv8算法并对比YOLOv7、YOLOv6、YOLOv5等算法的结果,能够准确识别图像、视频、实时视频流以及批量文件中的布匹缺陷。文章详细解释了YOLOv8算法的原理,并提供了相应的Python实现代码、训练数据集

    2024年03月15日
    浏览(67)
  • 基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的疲劳驾驶检测系统(Python+PySide6界面+训练代码)

    摘要:本研究详述了一种采用深度学习技术的疲劳驾驶检测系统,该系统集成了最新的YOLOv8算法,并与YOLOv7、YOLOv6、YOLOv5等早期算法进行了性能评估对比。该系统能够在各种媒介——包括图像、视频文件、实时视频流及批量文件中——准确地识别疲劳驾驶行为。文章深入阐述

    2024年04月24日
    浏览(101)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包