富阳市建设局网站,常州做企业网站,网站建设策划书范本,品牌营销策划方案案例[嵌入式AI从0开始到入土]嵌入式AI系列教程
注#xff1a;等我摸完鱼再把链接补上 可以关注我的B站号工具人呵呵的个人空间#xff0c;后期会考虑出视频教程#xff0c;务必催更#xff0c;以防我变身鸽王。
第一章 昇腾Altas 200 DK上手 第二章 下载昇腾案例并运行 第三章…[嵌入式AI从0开始到入土]嵌入式AI系列教程
注等我摸完鱼再把链接补上 可以关注我的B站号工具人呵呵的个人空间后期会考虑出视频教程务必催更以防我变身鸽王。
第一章 昇腾Altas 200 DK上手 第二章 下载昇腾案例并运行 第三章 官方模型适配工具使用 第四章 炼丹炉的搭建基于Ubuntu23.04 Desktop 第五章 Ubuntu远程桌面配置 第六章 下载yolo源码及样例运行验证 第七章 转化为昇腾支持的om离线模型 第八章 jupyter lab的使用 第九章 yolov5在昇腾上推理 第十章 yolov5在昇腾上应用 未完待续… 文章目录 [嵌入式AI从0开始到入土]嵌入式AI系列教程前言一、获取案例1、获取系统镜像2、获取案例3、原始案例 二、修改案例1、打开jupyter2、atc转换模型3、安装依赖4、修改预处理函数5、修改模型和标签路径6、选择你需要的推理模式 三、问题1、No module named scikit2、No module named ais_bench3、 InputTensor Data Type mismatches.1、怀疑导出onnx模型问题2、怀疑版本问题3、om模型有问题 4、预测框错乱 总结 前言
注本文基于Atlas 200 Dk编写其他版本可能会有版本依赖问题 上一节中我们已经完成了图片推理但是仅仅图像的推理怎么够起码得视频或者摄像头吧。因此我参考了案例进行了修改。
一、获取案例
我扒了200i DK A2的案例下来似乎官方没有给案例的下载地址当然你也可以使用上一节的资源包然后新建这个案例文件。 当然你可以使用我本文置顶的资源都是我测试完成的。
1、获取系统镜像
下载地址https://ascend-repo.obs.cn-east-2.myhuaweicloud.com/Atlas%20200I%20DK%20A2/DevKit/images/23.0.RC3/1.2.3/A200I-DK-A2_desktop-image_1.2.3_ubuntu22.04-aarch64.img.xz
2、获取案例
下载完后解压在Ubuntu中挂载A200I-DK-A2_desktop-image_1.2.3_ubuntu22.04-aarch64.img镜像文件,案例在root_fs/home/HwHiAiUser/samples/notebooks下。这次我们取第一个案例即可。 复制出来上传到200DK。
3、原始案例
这里贴一份出来毕竟镜像有一点点大。挂资源大概率过不了审核。
# 导入代码依赖
import cv2
import numpy as np
import ipywidgets as widgets
from IPython.display import display
import torch
from skvideo.io import vreader, FFmpegWriter
import IPython.display
from ais_bench.infer.interface import InferSessionfrom det_utils import letterbox, scale_coords, nmsdef preprocess_image(image, cfg, bgr2rgbTrue):图片预处理img, scale_ratio, pad_size letterbox(image, new_shapecfg[input_shape])if bgr2rgb:img img[:, :, ::-1]img img.transpose(2, 0, 1) # HWC2CHWimg np.ascontiguousarray(img, dtypenp.float32)return img, scale_ratio, pad_sizedef 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)):continueimg0 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 img0def get_labels_from_txt(path):从txt文件获取图片标签labels_dict dict()with open(path) as f:for cat_id, label in enumerate(f.readlines()):labels_dict[cat_id] label.strip()return labels_dictdef draw_prediction(pred, image, labels):在图片上画出预测框并进行可视化展示imgbox widgets.Image(formatjpg, height720, width1280)img_dw draw_bbox(pred, image, (0, 255, 0), 2, labels)imgbox.value cv2.imencode(.jpg, img_dw)[1].tobytes()display(imgbox)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_threscfg[conf_thres], iou_threscfg[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, bgr2rgbTrue):# 数据预处理img, scale_ratio, pad_size preprocess_image(image, cfg, bgr2rgb)# 模型推理output model.infer([img])[0]output torch.tensor(output)# 非极大值抑制后处理boxout nms(output, conf_threscfg[conf_thres], iou_threscfg[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_visdef img2bytes(image):将图片转换为字节码return bytes(cv2.imencode(.jpg, image)[1])def infer_video(video_path, model, labels_dict, cfg):视频推理image_widget widgets.Image(formatjpeg, width800, height600)display(image_widget)# 读入视频cap cv2.VideoCapture(video_path)while True:ret, img_frame cap.read()if not ret:break# 对视频帧进行推理image_pred infer_frame_with_vis(img_frame, model, labels_dict, cfg, bgr2rgbTrue)image_widget.value img2bytes(image_pred)def infer_camera(model, labels_dict, cfg):外设摄像头实时推理def find_camera_index():max_index_to_check 10 # Maximum index to check for camerafor index in range(max_index_to_check):cap cv2.VideoCapture(index)if cap.read()[0]:cap.release()return index# If no camera is foundraise ValueError(No camera found.)# 获取摄像头camera_index find_camera_index()cap cv2.VideoCapture(camera_index)# 初始化可视化对象image_widget widgets.Image(formatjpeg, width1280, height720)display(image_widget)while True:# 对摄像头每一帧进行推理和可视化_, img_frame cap.read()image_pred infer_frame_with_vis(img_frame, model, labels_dict, cfg)image_widget.value img2bytes(image_pred)cfg {conf_thres: 0.4, # 模型置信度阈值阈值越低得到的预测框越多iou_thres: 0.5, # IOU阈值高于这个阈值的重叠预测框会被过滤掉input_shape: [640, 640], # 模型输入尺寸
}model_path yolo.om
label_path ./coco_names.txt
# 初始化推理模型
model InferSession(0, model_path)
labels_dict get_labels_from_txt(label_path)infer_mode videoif infer_mode image:img_path world_cup.jpginfer_image(img_path, model, labels_dict, cfg)
elif infer_mode camera:infer_camera(model, labels_dict, cfg)
elif infer_mode video:video_path racing.mp4infer_video(video_path, model, labels_dict, cfg)二、修改案例
1、打开jupyter
在yolov5_ascend_example文件夹下打开终端输入
jupyter lab --ip 192.168.3.2 --allow-root电脑浏览器访问http://192.168.3.2:8888右侧打开我们的mian.ipynb文件。
2、atc转换模型
200DK照抄200I DK A2最后改成Ascend 310B1
atc --modelmodels/best.onnx --framework5 --outputmodels/mymodel --input_formatNCHW --input_shapeimages:1,3,640,640 --input_fp16_nodesimages --logerror --soc_versionAscend310运行结果如下大约5到10分钟。当然你也可以用ubuntu主机去做会快很多我用pc转换只需要半分钟左右还是一台4代i7的老年机。
3、安装依赖
使用我的案例代码的直接运行即可
其他的请按照以下方法安装
!pip install scikit_video
!pip install pip_packages/aclruntime-0.0.2-cp39-cp39-linux_aarch64.whl
!pip install pip_packages/ais_bench-0.0.2-py3-none-any.whl注意aclruntime和ais_bench推理程序的whl包请前往昇腾gitee仓库下载。
4、修改预处理函数
这里我们使用自己训练的模型需要做如下修改。 将img np.ascontiguousarray(img, dtypenp.float32)改为img np.ascontiguousarray(img, dtypenp.float16)/255.0
5、修改模型和标签路径 6、选择你需要的推理模式 这里务必注意如果是在vscode里远程打开main.ipynb的不要推理视频 不仅不显示推理的图像还会导致内存占用不断升高且无法终止内核甚至杀不死进程最后爆内存断开ssh连接。最终我只能按下复位。
三、问题
1、No module named ‘scikit’
pip install scikit-video别搞错名字就行。
2、No module named ‘ais_bench’
访问Gitee仓库这里有三种方法作为懒人肯定是选择whl包安装啦。 我的pc机python是3.9所以下载这两个按照下方说明进行安装就行。 咱就粗暴一点强制覆盖安装啦。
pip3 install ./aclruntime-{version}-{python_version}-linux_{arch}.whl --force-reinstall
pip3 install ./ais_bench-{version}-py3-none-any.whl --force-reinstall安装成功会提示
# 成功安装aclruntime
Successfully installed aclruntime-{version}
# 成功安装ais_bench推理程序
Successfully installed ais_bench-{version}安装失败的话检查版本然后祭出重启大法。
3、 InputTensor Data Type mismatches. 这里是折磨了我三天的问题甚至进行了一下几个可能的排列组合请不要笑
1、怀疑导出onnx模型问题
我对比了两个onnx模型结构 发现只有这里不一样但是不应该会导致这个问题啊
2、怀疑版本问题
这里怀疑的是转换时的版本问题。因此进行了一波友好的控制变量法测试手动狗头。键盘差点不保
pc机cann7.0200dkcann5.1best.onnx我自己的模型yolov5s.onnx 200i案例的模型yolo.om 200i案例的模型best.om我pc机转的模型mymodel.om 200dk转的模型
最终耗时一下午还是失败了。
3、om模型有问题
最后只能怀疑是om模型有问题于是我使用atc指令查询其信息果然发现了问题所在。关于用法请参考文档。 对比两个模型在Atc command line中best.om多了--input_fp16_nodesimages。我回去一查嘿mindx似乎只能用fp16做输入而我之后转换的模型都是fp32的怪不得main.py报错。但是这时ais_bench推理的main.ipynb又报错了我们只需要把这个32改成16.
4、预测框错乱 这里在经过我刨地三尺翻了三遍论坛终于找到了罪魁祸首。详情请参考原文链接。 我们只需要在这个案例这一行后面添加/255.0即可。
总结
不要问我为什么放鸽子当你被bug折磨别说解决方案了甚至这个报错百度都搜不到那是心态直接爆炸啊。 强烈建议直接使用我置顶提供的案例文件避免踩坑从我做起 我是替你们踩坑的工具人呵呵下期继续希望能尽快爬出来吧。