-
在昇腾910芯片,训练Transformer大模型时,我们的序列长度特别长,例如8192的序列长度,这边遇到的一个问题是,当我们预先将数据处理为mindrecords格式的数据后,在设置 dataset_sink_mode=True 的情况下,数据迭代会因为超时而报错(如下错误信息)。[ERROR] DEVICE(301,fff158ff6160,python):2023-01-09-11:35:20.909.119 [mindspore/ccsrc/plugin/device/ascend/hal/device/ascend_kernel_runtime.cc:721] DumpTaskExceptionInfo] Dump node (Default/GetNext-op3507) task error input/output data to: ./rank_21/node_dump [WARNING] DEVICE(301,fff158ff6160,python):2023-01-09-11:35:20.909.161 [mindspore/ccsrc/plugin/device/ascend/hal/device/ascend_kernel_runtime.cc:728] DumpTaskExceptionInfo] GetNext error may be caused by slow data processing (bigger than 20s / batch) or transfer data to device error. [WARNING] DEVICE(301,fff158ff6160,python):2023-01-09-11:35:20.909.171 [mindspore/ccsrc/plugin/device/ascend/hal/device/ascend_kernel_runtime.cc:730] DumpTaskExceptionInfo] Suggestion: [WARNING] DEVICE(301,fff158ff6160,python):2023-01-09-11:35:20.909.180 [mindspore/ccsrc/plugin/device/ascend/hal/device/ascend_kernel_runtime.cc:731] DumpTaskExceptionInfo] 1) Set the parameter dataset_sink_mode=False of model.train(...) or model.eval(...) and try again. [WARNING] DEVICE(301,fff158ff6160,python):2023-01-09-11:35:20.909.188 [mindspore/ccsrc/plugin/device/ascend/hal/device/ascend_kernel_runtime.cc:733] DumpTaskExceptionInfo] 2) Reduce the batch_size in data processing and try again. [WARNING] DEVICE(301,fff158ff6160,python):2023-01-09-11:35:20.909.196 [mindspore/ccsrc/plugin/device/ascend/hal/device/ascend_kernel_runtime.cc:734] DumpTaskExceptionInfo] 3) You can create iterator by interface create_dict_iterator() of dataset class to independently verify the performance of data processing without training.我们的尝试在构建数据迭代类中,设置大的进程数,例如 dataset.map(operations=map_func, num_parallel_workers=32) 和 dataset.batch(batch_size, drop_remainder=drop, num_parallel_workers=32) 这样似乎会导致机器的内存占用过大。如果我将 dataset_sink_mode=False,那是不是会导致训练中CPU将成为瓶颈,降低昇腾芯片的利用率。
-
pipeline缺少插件怎么办,重装新的版本吗?
-
在源码中mindspore/ccsrc/cxx_api/graph/graph_data.h与mindspore/ccsrc/minddata/dataset/engine/gnn/graph_data.h两者是否存在联系,中间是否有引用关系呢?目前的最主要问题是哪一块代码是ms中计算图获取的部分?
-
这一节涉及一些实操的内容,但我的电脑还没有配置好,所以先看知识性的内容,以后弄好了填坑课程目标了解PyTorch与昇腾平台的适配了解Davinci硬件架构了解什么样的模型在昇腾上更亲和了解软件术语了解Ascend-PyTorch的安装步骤了解如何将原生的PyTorch模型代码适配至Ascend-PyTorchPyTorch==在线对接适配==方案最大限度继承pytorch框架动态图的特性最大限度继承原生pytorch上的使用方式:最小的开发方式和代码的重用最大限度继承pytorch原生的体系结构扩展性好,对于新的网络类型或结构,只涉及相关计算类算子的开发和实现,对于框架类的算子可以复用达芬奇架构计算单元Cube:矩阵运算fp16的16×16与16×16的矩阵乘相关操作:matmul、conv2d、linearVextor:向量运算算力低于Cube,但灵活性高计算类型:fp16、fp32、int8Scalar:各类型的标量数据运算&程序的流程控制功能上类似于小的CPU软件架构Ascend-PyTorch安装==挖坑==PyTorch模型迁移手工迁移脚本转换工具(msFmkTransplt)自动迁移(推荐) ==挖坑==
-
作业一实战场景:下载基于Caffe ResNet-50网络实现图片分类(仅推理)样例应用的源码,并参考Readme成功编译、运行应用,体验基础推理过程。评分细则:使用atc工具转换模型,提供转换命令及转换成功的截图。使用转换后的模型,重新编译运行样例应用(基于Caffe ResNet-50网络实现图片分类(仅推理)),提交成功编译运行应用的截图。总结实战过程中遇到的问题及解决方法,并提交总结。优化样例应用,包括优化代码逻辑、优化代码注释、补充代码注释等,提交优化后的源码、优化思路说明、优化位置说明。评分一和评分二:1.连接华为云服务器并克隆下载samples代码库git clone https://gitee.com/ascend/samples.git2.切换用户及目录(因为cann包装在该用户下)cd /home/su - HwHiAiUsersource ~/Ascend/ascend-toolkit/set_env.shcd samples/cplusplus/level2_simple_inference/1_classification/resnet50_imagenet_classification3.切换到/caffe_model目录下使用wget命令会下载到当前目录wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/003_Atc_Models/AE/ATC%20Model/resnet50/resnet50.prototxtwget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/003_Atc_Models/AE/ATC%20Model/resnet50/resnet50.caffemodel4.转换模型atc --model=caffe_model/resnet50.prototxt --weight=caffe_model/resnet50.caffemodel --framework=0 --output=model/resnet50 --soc_version=Ascend310 --input_format=NCHW --input_fp16_nodes=data --output_type=FP32 --out_nodes=prob:05.下载图片并转换为bin文件请从以下链接获取该样例的输入图片,并以运行用户将获取的文件上传至开发环境的“样例目录/data“目录下。如果目录不存在,需自行创建。wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/models/aclsample/dog1_1024_683.jpgwget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/models/aclsample/dog2_1024_683.jpg6.编译运行6.1请先进入“cplusplus/level2_simple_inference/1_classification/resnet50_imagenet_classification”样例目录6.2设置环境变量,配置程序编译依赖的头文件与库文件路径。当开发环境与运行环境的操作系统架构相同时,配置示例如下所示:export DDK_PATH=$HOME/Ascend/ascend-toolkit/latest export NPU_HOST_LIB=$DDK_PATH/runtime/lib64/stub6.3切换到样例目录,创建目录用于存放编译文件,例如,本文中,创建的目录为“build/intermediates/host“。mkdir -p build/intermediates/host6.4切换到“build/intermediates/host“目录,执行如下命令生成编译文件。当开发环境与运行环境操作系统架构相同时,执行如下命令编译。cd build/intermediates/host cmake ../../../src -DCMAKE_CXX_COMPILER=g++ -DCMAKE_SKIP_RPATH=TRUE6.5执行如下命令,生成的可执行文件main在“样例目录/out“目录下。make6.6切换到可执行文件main所在的目录,例如“$HOME/cplusplus/level2_simple_inference/1_classification/resnet50_imagenet_classification/out”,运行可执行文件。./main遇到的问题:执行环境设置时,报错报错原因:查看Ubuntu系统/bin/sh的实际链接,发现使用的是dash,而source xxx.sh或者. xxx.sh命令需要使用bash解析器,因此出现报错。解决办法:Ubuntu下shell执行source命令报source: not found问题处理_柚子君.的博客-CSDN博客作业二基于Caffe ResNet-50网络实现图片分类(仅推理)样例,更换为ResNet-101分类模型。更换同类模型时,由于模型的输入、输出相似,所以源码基本可以复用,只需更换模型即可。定制点说明如下下载ResNet-101模型(resnet101_tf.pb),放到resnet50_imagenet_classification样例的caffe_model目录(表示原始模型的存放路径),执行以下命令转换模型,在output参数处指定的model目录下获取resnet101_tf.om:atc --model=caffe_model/resnet101_tf.pb --framework=3 --output=model/resnet101_tf --output_type=FP32 --soc_version=Ascend310 --input_shape="input:1,224,224,3" --log=info生成测试数据进入resnet50_imagenet_classification样例的script目录,修改transferPic.py脚本中的如下内容,将float16改为float32:img = img.astype("float16")修改后:img = img.astype("float32")切换到“resnet50_imagenet_classification样例目录/data“目录下,执行transferPic.py脚本,将*.jpg转换为*.bin,同时将图片从1024*683的分辨率缩放为224*224。在“resnet50_imagenet_classification样例目录/data“目录下生成2个*.bin测试文件。python3 ../script/transferPic.py调用AscendCL接口(例如aclmdlLoadFromFileWithMem接口)加载ResNet-101模型:在src/sample_process.cpp文件中定制代码。参考Caffe ResNet-50网络实现图片分类(仅推理)样例的readme,重新编译并运行。评分细则:使用atc工具转换模型,提供转换命令及转换成功的截图。(5分)使用转换后的模型、定制后的代码,重新编译运行应用,提交成功编译运行应用的截图。(10分)总结实战过程中遇到的问题及解决方法,并提交总结。(5分)评分一:同作业一中,下载好模型后,执行上述ATC模型转换命令即可评分二:修改sample_process.cpp中om模型的位置作业三使用Pytorch实现LeNet网络的minist手写数字识别。硬件平台不限,可以基于windows或者linux系统,尽量给出整个过程的截图,并在最后给出loss或者accuracy运行结果,提供打印loss和accuracy日志,给出截图。参考链接Github:cid:link_3 答:根据链接中的文件,设置好训练参数等,运行训练脚本即可作业四采用课程中学习到的手工或者自动迁移方式,将上述脚本迁移到昇腾npu上,单机单卡,提供迁移脚本,突出关键点并截图答:自动迁移,仅PyTorch 1.8.1版本及以上使用,自动迁移方式较简单,只需在训练脚本中添加引入几行代码。 import torch_npu from torch_npu.contrib import transfer_to_npu 作业五提供使用ddp迁移的单机8卡的训练脚本,无需运行,提供修改后的脚本,并突出关键点
-
背景一个encoder-decoder结构的网络,主干网络里面有很多矩阵乘MatMul和LayerNorm,由于在Ascend平台上跑的,如果使用float32进float32出,性能会慢的难以接收,但是使用float16会训着训练连续溢出导致训练失败。排查策略加loss scale由于不确定溢出是上溢还是下溢,一般可以添加动态的loss scale来排查是哪种溢出情况:iterator = dataset.create_tuple_iterator() for i, data in enumerate(iterator): loss, overflow, scaling_sens = train_net(*data) print("step: {}, loss: {}, overflow:{}, scale:{}".format(i, loss, overflow, scaling_sens))train_net参考官网迁移指南-调试调优篇 包装训练网络和loss scale。注意需要使用动态的loss scale,默认scale值要大一点才好做判断。如果一直持续overflow,但是到scale值小到一定值就不overflow了,那之前应该是上溢,用小一点的loss scale就行;如果持续overflow,直至scale值到1还是会持续溢出,那不确定是上溢还是下溢,需要开溢出dump来继续排查了。溢出dumpMindSpore 异步dump有个dump溢出算子输入输出的功能,只需要将op_debug_mode设置成3就行,其他按需配置。按教程执行训练,整个过程会慢一点,并且需要dump目录留有足够的硬盘空间,当发生溢出时会dump该算子的输入和输出,可以直接用numpy打开看下输入数据是否合理,如果有不合理的数据的话,在代码里加措施规避,比如:Sqrt的输入是0,反向溢出,除法的除数是0等等。如果输入是合理的,那需要看下计算算子精度表达范围,float16表达范围:-65504~65504,超出这个范围也会有溢出,这时需要对计算输入加clip或者Norm操作缩小输入的范围。我这次遇到的情况就是数值超过float16能表达的上线了,接MatMul的Cast操作溢出。解决策略由于不想让网络变慢,保留了MatMul float16计算,增加了MatMul之前的LayerNorm的eps,从1e-5 -> 1e-3,保证MatMul输入不要过大,另外给MatMul的两个输入除一个系数,我这次是除了32,由于MatMul后面接的SoftMax,线性操作不影响其分布,所以可以这么做,这样修改完之后溢出情况基本解决。
-
按照教程,sd卡制卡显示成功,但是插入卡后上电只亮两个灯,之后检查sd卡分区,发现没有ascend_seclog这个目录。
-
↵大家好!我在跑MindScience中的MindElec时,遇到了一些安装上的问题。我基于ubuntu 22.04系统,使用anaoncda成功安装了mindspore-gpu,使用指令检测:python -c "import mindspore;mindspore.run_check()"得到:mindspore version 1.9.0The result of multiplication calculation is correct, MindSpore has been installed successfully!其中,为了安装MindElec库,安装的python=3.7,cuda=11.6。由于没有ascend硬件,使用的GPU,则在cid:link_0中,将代码train.py的device_target手动改为“GPU”:context.set_context(mode=context.GRAPH_MODE, save_graphs=False, device_target="GPU", save_graphs_path="./graph")然而,运行时报错如下,报错一:[ERROR] ME(9704:139975885083712,MainProcess):2023-01-02-19:17:19.449.580 [mindspore/run_check/_check_version.py:194] Cuda ['10.1', '11.1', '11.6'] version(libcu*.so need by mindspore-gpu) is not found, please confirm that the path of cuda is set to the env LD_LIBRARY_PATH, or check whether the CUDA version in wheel package and the CUDA runtime in current device matches, please refer to the installation guidelines: https://www.mindspore.cn/install[ERROR] ME(9704:139975885083712,MainProcess):2023-01-02-19:17:19.449.691 [mindspore/run_check/_check_version.py:194] Cuda ['10.1', '11.1', '11.6'] version(libcu*.so need by mindspore-gpu) is not found, please confirm that the path of cuda is set to the env LD_LIBRARY_PATH, or check whether the CUDA version in wheel package and the CUDA runtime in current device matches, please refer to the installation guidelines: https://www.mindspore.cn/install[ERROR] ME(9704:139975885083712,MainProcess):2023-01-02-19:17:19.455.499 [mindspore/run_check/_check_version.py:194] Cuda ['10.1', '11.1', '11.6'] version(libcudnn*.so need by mindspore-gpu) is not found, please confirm that the path of cuda is set to the env LD_LIBRARY_PATH, or check whether the CUDA version in wheel package and the CUDA runtime in current device matches, please refer to the installation guidelines: https://www.mindspore.cn/install[ERROR] ME(9704:139975885083712,MainProcess):2023-01-02-19:17:19.455.585 [mindspore/run_check/_check_version.py:194] Cuda ['10.1', '11.1', '11.6'] version(libcudnn*.so need by mindspore-gpu) is not found, please confirm that the path of cuda is set to the env LD_LIBRARY_PATH, or check whether the CUDA version in wheel package and the CUDA runtime in current device matches, please refer to the installation guidelines: https://www.mindspore.cn/install[ERROR] ME(9704,7f4eace85440,python):2023-01-02-19:17:19.504.811 [mindspore/ccsrc/runtime/hardware/device_context_manager.cc:46] LoadDynamicLib] Load dynamic library libmindspore_gpu failed, returns [libcudnn.so.8: cannot open shared object file: No such file or directory].报错二:RuntimeError: Create device context failed, please make sure target device:GPU is available.----------------------------------------------------- C++ Call Stack: (For framework developers)----------------------------------------------------mindspore/ccsrc/runtime/hardware/device_context_manager.cc:208 GetOrCreateDeviceContext这里表示未检测出cuda11.6和GPU,但我的python解释器里有cuda11.6,且python -c "import mindspore;mindspore.run_check()"测试都通过了。请问大家如何解决?非常感谢!
-
无论将生成好的hdf5数据文件放在哪个目录下,都会出现如上报错
-
MindX SDK-Overlap-Recovery重叠文本还原参考设计1 介绍本开发样例使用自研算法完成重叠文本的还原任务,供用户参考。 本系统基于昇腾Ascend310卡。本仓库是重叠文本识别任务(Overlap-CRNN)的上游任务,即完成对重叠文本还原并输出文本实例的mask。1.1 支持的产品本系统采用Ascend 310作为实验验证的推理硬件平台,训练硬件平台支持Ascend和GPU。1.2 支持的版本推理代码支持的版本为MindX SDK 3.0RC3,Ascend-CANN-toolkit 6.0.RC1。1.3 软件方案介绍软件方案主要为文本还原的系统,子系统功能具体描述请参考 表1.1 系统方案各子系统功能描述。重叠文本还原子系统可以实现还原重叠文本并得到各个文本实例的mask,本方案选择使用基于分割的算法并提出一种重叠区域感知的模块来恢复出重叠文本实例。系统方案中各模块功能如表1.2 所示。表1.1 系统方案各子系统功能描述:序号子系统功能描述1重叠文本还原子系统重叠文本还原子系统将得到重叠文本实例的mask的结果,之后将结果送入到下游的文字识别模型进行文字识别。表1.2 系统方案中各模块功能:序号子系统功能描述1输入图像将图像(JPG/PNG格式)通过Pillow库读入。2图像解码通过Pillow第三方库对图像解码。3图像放缩模型的输入为固定尺寸,所以需要对输入图片进行等比例放缩。4文字还原在图像放缩后,将缓存区数据送入文字还原模型。本方案选用自研算法进行文本还原5结果可视化通过Pillow库可视化单张图像的预测的文本实例mask。1.4 代码目录结构与说明eg:本sample工程名称为Overlap-Recovery,工程根目录如下图所示:├── train #训练代码的文件夹 ├── inference #推理代码的文件夹其中,Overlap-Recovery/train工程目录如下图所示,训练部分代码下载链接。├── eval.py #精度测试 ├── train.py #模型训练主函数 ├── export.py #将ckpt模型导出为onnx格式的模型 ├── __init__.py ├── src #模型源码及相关辅助函数 │ ├── __init__.py │ ├── dataset #数据集加载、预处理等相关函数 │ │ ├── __init__.py │ │ ├── base_dataset.py #dataset类的基类 │ │ ├── build_dataset.py #提供接口构造dataset对象 │ │ ├── data_process.py #数据预处理相关函数 │ │ ├── real_dataset.py #用于测试数据的dataset类 │ │ ├── synth_dataset.py #用于训练数据的dataset类 │ │ ├── utils.py #dataset构造所需的辅助函数 │ ├── deoccluder #去重叠算法相关代码 │ │ ├── __init__.py │ │ ├── deoccluder_r50.py #模型主结构代码 │ │ ├── fpn_neck.py # FPN模块代码 │ │ ├── resnet.py # resnet-50 backbone代码 │ │ ├── utils.py # 辅助函数 │ │ ├── rpn # kernel初始化相关 │ │ │ ├── __init__.py │ │ │ ├── kernel_head.py # kernel初始化相关函数 │ │ │ ├── positional_encoding.py # 位置编码函数 │ │ │ ├── semantic_fpn_warpper.py # 语义fpn编码 │ │ ├── roi # kernel更新相关 │ │ │ ├── __init__.py │ │ │ ├── custom_kernel_iter_head.py # kernel迭代函数 │ │ │ ├── custom_kernel_update_head.py # kernel更新函数 │ │ │ ├── kernel_update_head.py # kernel更新函数基类 │ │ │ ├── kernel_updator.py # kernel更新辅助函数 │ │ ├── custom_cells # 算法组件 │ │ │ ├── __init__.py │ │ │ ├── custom_assigner.py # 标签分配函数 │ │ │ ├── custom_blocks.py # 自定义模块 │ │ │ ├── custom_losses.py # 自定义损失函数 │ │ │ ├── custom_match_cost.py # 自定义匹配代价评估函数 │ │ │ ├── custom_operations.py # 自定义算子 │ │ │ ├── custom_samplers.py # 自定义采样函数 │ ├── model_utils # 模型训练相关代码 │ │ ├── __init__.py │ │ ├── device_adapter.py │ │ ├── local_adapter.py │ │ ├── moxing_adapter.py │ │ ├── configs # 配置文件函数 │ │ │ ├── __init__.py │ │ │ ├── config_base.py │ │ │ ├── config_model.py │ ├── utils # 将pytorch权重转为mindspore权重 │ │ └── pth2ckpt.py ├── scripts # scripts文件 │ ├── convert_resnet.sh # 将pytorch的resnet权重转为mindspore权重 │ └── train.sh # 训练指令 ├── resource_utils # 转换pytorch权重所需的相关材料 │ └──resnet50_dict.json其中,Overlap-Recovery/inference工程目录如下图所示:├── eval.py #精度测试 ├── eval_utils.py #指标计算的辅助函数 ├── load_ann.py #加载测试集 ├── load_img_data.py #加载图片数据 ├── ominfer.py #单张图片推理 ├── preprocess_utils.py #加载图片做预处理的辅助函数 ├── README.md ├── models #不同类型的模型文件 │ ├── best_iou.onnx │ └── best_iou.ckpt │ └── best_iou.om ├── dataset #测试数据集 │ ├── img │ └── annotation.json1.5 技术实现流程图实现流程图如下图所示:1.6 特性及适用场景本案例中的还原模型适用于常规图像的文本,并可以返回测试图像的文本区域的IOU指标。本模型在以下几种情况还原效果良好:图像中文字清晰可见、排版工整、字符大小适中等。在以下几种情况去噪效果不太好:图像中文字模糊、排版随意、字符较小等。1.7 代码地址本项目的代码地址为:cid:link_22 环境依赖下面列出环境依赖软件和版本。推荐系统为ubuntu 18.04或centos 7.6。2.1 训练环境训练支持Ascend和GPU硬件。其中GPU环境下依赖的软件和版本如下表:软件名称版本CUDA11.1ubuntu18.04.1 LTSpython3.9.2MindSpore1.9.0opencv-python4.6.0.66numpy1.23.1pillow9.1.0mmcv0.2.14loguru0.2.14tqdm4.64.1imagesize1.4.1terminaltables3.1.10其中Ascend环境下依赖的软件和版本如下表:软件名称版本Ascend-CANN-toolkit6.0.RC1ubuntu18.04.1 LTSpython3.9.2MindSpore1.9.0opencv-python4.6.0.66numpy1.23.1pillow9.1.0mmcv0.2.14loguru0.2.14tqdm4.64.1imagesize1.4.1terminaltables3.1.102.2 推理环境推理环境依赖软件和版本如下表:软件名称版本MindX SDK3.0RC3Ascend-CANN-toolkit6.0.RC1ubuntu18.04.1 LTSpython3.9.2cv24.5.5.64numpy1.23.1pillow9.1.0mmcv-full1.7.0在运行推理项目前,需要设置环境变量:环境变量介绍. ${sdk_path}/set_env.sh . ${ascend_toolkit_path}/set_env.sh3 模型训练步骤0 下载训练部分的源码放置到Overlap-Recovery/train文件夹下。步骤1 从pytorch官方下载resnet-50预训练权重 ,并利用脚本转换成mindspore支持的格式# 准备好logs保存路径 mkdir train/logs # 运行转换脚本 sh train/scripts/convert_resnet.sh PATH-TO-PYTORCH-WEIGHT PATH-TO-MINDSPORE-WEIGHT步骤2 修改训练相关的配置参数在train/src/model_utils/config_base.py中,完成下述参数的修改:a) 设置训练设备类型:设置103行的device_target选择在GPU或者Ascend设备上训练。b) 修改105行mindrecord_dir为预期的log输出和模型保存路径。c) 修改预训练backbone路径:将107行的pretrained_r50改为步骤1中转换后的backbone权重路径。# 用于训练的设备 ['GPU', 'Ascend'] device_target='GPU', # 训练时的log文件和权重的保存路径 mindrecord_dir='path-for-saving-logs-and-files', # 预训练backbone的权重路径 pretrained_r50='path-to-pretrained-model',d) 修改数据集路径:参考测试数据的格式准备好训练数据,修改synth_data_root和real_data_root参数为训练集、测试集的根目录。# 39行的训练集的根目录 SYNTH_DATA_ROOT = "root-directory-to-train-data" # 41行的测试集的根目录 REAL_DATA_ROOT = "root-directory-to-test-data"e) 修改训练的epoch数量: 将94行的total_epoch根据训练集数据量调整为合适的数值。在本案例中total_epoch设置为了60,但训练数据量较大,所以在训练到第2个epoch时性能就满足要求,也可以提前终止训练。步骤3 按照2.1节环境依赖要求配置好训练所需运行环境后,执行如下命令启动模型训练。python train/train.py注:在Ascend上如需指定特定设备序号,可在训练命令前加上DEVICE_ID=X。在GPU上如需指定特定设备序号,可在训练命令前加上CUDA_VISIBLE_DEVICES=X。步骤4 使用训练好的mindspore模型直接推理修改train/src/model_utils/config_base.py中112行checkpoint_path参数为要测评的checkpoint的路径,执行如下命令推理。python train/eval.py4 模型转换通过第三节的训练后得到ckpt模型文件,在项目运行前需要先将ckpt文件通过 export.py 转换成ONNX模型文件,然后在本代码仓下通过ATC将ONNX转换成om模型,其中ckpt->onnx的转换在训练环境下进行(参考第2.1节所述),onnx->om的转换在推理环境下进行(参考第2.2节所述)。模型转换工具(ATC)相关介绍如下:ATC介绍具体步骤如下:准备好训练得到的ckpt模型文件,放至服务器上Overlap-Recovery/train/models文件夹下,环境同训练环境相同(硬件包含CPU,参考第2.1节所述)。进入Overlap-Recovery/train文件夹下,修改export.py文件中ckpt_file_path和file_name参数为自己的路径,执行如下命令完成ckpt->onnx的模型转换:cd train python export.py将生成的ONNX模型转移到推理服务器,放至在Overlap-Recovery/inference/models路径下,环境同推理环境相同(硬件为Ascend 310,参考第2.2节述所)。进入推理服务器执行如下命令(修改onnx_model_path和output_model_path参数为自己的路径)完成onnx->om的模型转换:cd inference/models atc --model=[onnx_model_path] --framework=5 --output=[output_model_path] --soc_version=Ascend310 --input_shape="img:1,3,768,768" --precision_mode=force_fp32执行该命令会在当前目录下生成项目需要的模型文件[output_model].om。执行后终端输出为:ATC start working now, please wait for a moment. ATC run success, welcome to the next use.表示命令执行成功。相关模型的下载链接如下:models.zip。 将模型按照提供的文件夹目录放至即可。5 模型推理当已有模型的om文件,保存在Overlap-Recovery/inference/models/下,推理所需环境如第2.2节所述。示例步骤如下:步骤1 将任意一张待预测的图片存到当前目录下(./Overlap-Recovery/inference),文件名修改为test。步骤2 按照第4节模型转换获取om模型,放置在Overlap-Recovery/inference/models/路径下。若未自行转换模型,使用的是仓库提供的模型,则无需修改相关文件,否则修改ominfer.py中相关配置,将model_path对象的路径改成实际的om模型的路径;img_prefix和img_name对象的路径改成实际的测试图片的路径;save_path对象设置成需要保存可视化图像的路径。步骤3 在命令行输入 如下命令运行单张图片模型推理:cd inference python ominfer.py步骤4 运行结束输出test文件夹,预测的mask可视化结果保存在test文件夹下。6 测试精度步骤1 在Overlap-Recovery/inference/dataset/路径下准备相同格式的数据集(已提供测试用的数据集,按照文件目录放至即可:dataset.zip)步骤2 在命令行输入 如下命令运行精度测试:cd inference python eval.py模型在测试集上的精度达标,最终模型的的精度为87.0%,满足精度要求(≥80%)。
-
问题现象:根据emmc烧录制卡流程,完成制卡操作后,重启板子,通过本地以太网口无法进入系统?无法ping通目标板IP地址?emmc制卡系统版本:Ubuntu 18.04烧录完成后,EMMC模式启动日志如下:560000020251456000002025152707178b806f00080current[1], last[0].Start watchdogboot_count = 1......0000010aGet board ID:4SNPS PHY PLL state Error [0x868]:0x00000000 [0x86C]:0x00000000 454ms0000011000000000 - 00000000000001130000011300000000000001ca000001ca - 000001ca00000000 0000031e 00000308pmu second pmu initial:0x00000003.current[2], last[0].current[3], last[0].0.5c-init okPartition 0 is not a vaild NVE partition[NVE]current_id = 1,nve_age = 1,age = 0[NVE]current_id = 2,nve_age = 2,age = 1Partition 3 is not a vaild NVE partition[NVE]current_id = 2 number of nvbin = 24, version = -1828191725[NVE]nve_offser = 0x000038a0 nve_valid_items = 22current[4], las0].cpu mode 3, efuse:264!cpu pll recfg function,success---200763!current[5], last[0].current[6], last[0].current[7], last[0].Ddr_freq->ddr_freq 1600 !uc sector[0] valid flag not enabled!uc sector[1] valid flag not enabled![UC]ddr_iecc_en:0freq 60 vol 2:ch_mask: 0x000000ffch_lr: 0x00000003ch_num: 0x00000008rank_num: 0x00000001Manufacturer ID[0]:0x00000013Manufacturer ID[1]:0x00000013Manufacturer ID[2]:0x00000013Manufacturer ID[3]:0x00000013Manufacturer ID[4]:0x00000013Manufacturer ID[5]:0x00000013Manufacturer ID[6]:0x00000013Manufacturer ID[7]:0x00000013Total size:0x00000008DDR info:0x00000813DDR_TYPE_8CH_ALL 1_rank 8G !DDR HHA interleave enabled!idx: 0 start_addr_l: 0x00000000 start_addr_h: 0x00000000 length: 0x00000800idx: 1 start_addr_l: 0x80000000 start_addr_h: 0x00000008 length: 0x00001800uce init entryuce profile total is 0x0000032cuce init endfreq 400 vol 2:freq 1600 vol 2:HVrefThres:8uce init entryuce profile total is 0x00000298uce init endtransfer ddr data to l2_buf 0x40000000.DDR Total Capacity: 8192 MB.DDR Rank Type: single.DDR Channel with DRAM: A B C D E F G HDDR Init 849 mscurrent[8], last[0].====================================Xloader version is 00000001.00000003.00000002.00000893====================================maintain:00000000, static:00000000current[9], last[0].[STID]adcin7:0x0000009f.[STID]adcin7_remap:0x00000001.[STID]adcin8:0x000000a0.[STID]adcin8_remap:0x00000001.current[10], last[0].SPI FLASH download uefi.current[25], last[0].PCIE_RC_MODE...g_imgNum = 1current[26], last[0].SPI FLASH download uefi finish.sicurrent[34], last[0].ns, succurrent[35], last[0].si succurrent[36], last[0].s vr bgns vr, sccurrent[37], last[0].sv sucsv suchigh mntn_config=0xa0000000, low mntn_config=0x00000000high addr=0x00000008, low addr=0x90000000lpm3 will WFEdisreset A55.current[0], last[0].aicore_power_on:312----core1 step1aicore_pmu_up:233----repair step 5_aicore0_buck_on:164---state -0x00000007--cfg:0x00000064--buck voltage:0x00000064_aicore1_buck_on:222---state -0x0000000f--cfg:0x00000064--buck voltage:0x00000064_aimemory0_1_buck_on:193---state -0x0000000f--cfg:0x00000064--buck voltage:0x00000064aicore_pmu_up:257----pmu up step1aicore0_power_reset:74aicore0_power_reset:83aicore1_power_reset:88aicore1_power_reset:97aicore1_isolation_enable:112----repair step 4aicore_power_on:331----power on success.DDR HHA interleave endump static ddr 0x0@0x0rc_ep_mode = 0====================================UEFI version is 1.3.2.893====================================dump static ddr 0x0@0x0dump static ddr 0x0@0x0UEFI Platform GICD init...OKUEFI ltf startUEFI ctf okNOTICE: B T FNOTICE: 2NOTICE: 31UEFI ltf finishInstall gSpiFlashProtocol Protocol Interface ok!AgingResultSaveDxeEntry ............. finishPcie Port Init Start.Run RC Mode Init code[get_ltssm_def_param][539]get table-idx 0[pcie_set_port_en_enable][722]: port 8 disableport_id : 8, reset bit_mask:21port_id : 8, dereset bit_mask:21[pcie_establish_link_phase1][3817]: port 8 config:[pcie_establish_link_phase1][3818]: port enable: 1[pcie_establish_link_phase1][3819]: port mode: 1[pcie_establish_link_phase1][3820]: port lane num: 2[pcie_port_global_config][2013][pcie_port_global_config][2021][pcie_port_global_config][2029][pcie_establish_link_phase1][3828][pcie_establish_link_phase1][3845][pcie_establish_link_phase1][3858]mac set data 16bit[pcie_establish_link_phase1][3866]RP TL init[pcie_establish_link][3909][pcie_establish_link][3917][pcie_establish_link][3925][pcie_set_port_en_enable][719]: port 8 enable[pcie_establish_link][3974]Pcie iATU Init Start!Start nve init(5026).UEFI get board id from DDR:4[nve_find_valid_partition]current_id = 2 valid_items = 22, version = -1, sha_support = -1Finish nve init(5559).this is not uart loopback mode.atl emmc environment: not install SDDriverUEFI get slot id from DDR:11this is not uart loopback mode.Now start to auto boot linux.(5588)This is Flash Boot EntryEmmc_Start_OS start! bootInfo = 0x202, envState = 0x0 reset_sude-reset_su[emmc_controller_init]:[675L]2:[emmc_controller_init]:[675L]0:eMMC:use IDMA[emmc_controller_init]:[740L]Set EMMC GPIO register to 0:EMMC_REG_OFF_GPIO=0x0.[emmc_controller_init]:[747L]Set EMMC UHS_REG_EXT register:EMMC_REG_OFF_UHSREGEXT=0xE70000.[emmc_controller_init]:[752L]Set EMMC GPIO register:EMMC_REG_OFF_GPIO=0x10700.eMMC controller init OK!cmd[0] arg[0][emmc_set_card_ready]:send CMD0 OKcmd[1] arg[40FF8000]cmd1 resp = 0x40FF8080cmd[1] arg[40FF8000]cmd1 resp = 0x40FF8080cmd[1] arg[40FF8000]cmd1 resp = 0x40FF8080cmd[1] arg[40FF8000]cmd1 resp = 0x40FF8080cmd[1] arg[40FF8000]cmd1 resp = 0x40FF8080cmd[1] arg[40FF8000]cmd1 resp = 0x40FF8080cmd[1] arg[40FF8000]cmd1 resp = 0x40FF8080cmd[1] arg[40FF8000]cmd1 resp = 0x40FF8080cmd[1] arg[40FF8000]cmd1 resp = 0x40FF8080cmd[1] arg[40FF8000]cmd1 resp = 0x40FF8080cmd[1] arg[40FF8000]cmd1 resp = 0x40FF8080cmd[1] arg[40FF8000]cmd1 resp = 0x40FF8080cmd[1] arg[40FF8000]cmd1 resp = 0x40FF8080cmd[1] arg[40FF8000]cmd1 resp = 0x40FF8080cmd[1] arg[40FF8000]cmd1 resp = 0x40FF8080cmd[1] arg[40FF8000]cmd1 resp = 0x40FF8080cmd[1] arg[40FF8000]cmd1 resp = 0x40FF8080cmd[1] arg[40FF8000]cmd1 resp = 0x40FF8080cmd[1] arg[40FF8000]cmd1 resp = 0x40FF8080cmd[1] arg[40FF8000]cmd1 resp = 0x40FF8080cmd[1] arg[40FF8000]cmd1 resp = 0x40FF8080cmd[1] arg[40FF8000]cmd1 resp = 0x40FF8080cmd[1] arg[40FF8000]cmd1 resp = 0x40FF8080cmd[1] arg[40FF8000]cmd1 resp = 0x40FF8080cmd[1] arg[40FF8000]cmd1 resp = 0x40FF8080cmd[1] arg[40FF8000]cmd1 resp = 0x40FF8080cmd[1] arg[40FF8000]cmd1 resp = 0x40FF8080cmd[1] arg[40FF8000]cmd1 resp = 0x40FF8080cmd[1] arg[40FF8000]cmd1 resp = 0x40FF8080cmd[1] arg[40FF8000]cmd1 resp = 0x40FF8080cmd[1] arg[40FF8000]cmd1 resp = 0xC0FF8080[emmc_set_card_ready]:card is readycmd[2] arg[0][emmc_set_card_ready]:send CMD2 OKcmd[3] arg[60000][emmc_set_card_ready]:send CMD3 OKcmd[9] arg[60000][emmc_set_card_ready]:send CMD9 OKcmd[7] arg[60000][emmc_set_card_ready]:send CMD7 OKcmd[13] arg[60000][emmc_set_card_ready]:send CMD7 OKcmd[6] arg[3B90101]cmd[13] arg[60000][emmc_set_card_ready]:ext csd OKcmd[6] arg[3B70201]cmd[13] arg[60000]emun eMMC success!cmd[6] arg[3B10201]update ext csdcmd[13] arg[60000]cmd[6] arg[3A20101]update ext csdcmd[13] arg[60000]cmd[6] arg[3B30801]update ext csdcmd[13] arg[60000]cmd[23] arg[0]emmc_load_image:iter 0, dst[2F0F8798],src[0],size[200]emmc_read : block_count = 1,start_block = 16cmd[18] arg[10][emmc_multi_blk_read_DMA]:[209L]:data transfered overcmd[12] arg[60000]emmc Block HEAD_MAIN_MAGIC_BLOCK value = 0x0emmc_load_image:iter 0, dst[2F0F8798],src[0],size[200]emmc_read : block_count = 1,start_block = 17cmd[18] arg[11][emmc_multi_blk_read_DMA]:[209L]:data transfered overcmd[12] arg[60000]emmc Block HEAD_MAIN_MAGIC_BLOCK value = 0x0close watch dog[GetImgFromEmmc]:[451L]: Set SNPATTR bit to 0:SC_AXI_USER_H32_EMMC=0x50.Start dump(5963)mntn config is 0xA000000000000000[get_dump_flag_of_rc]:[878L] This is cold bootread 5 from ack fieldread 9 from upload field, ret[0]Finish dump(5976)Enter4BCmdReadEnter4BCmd(2490):ok!Enter4BCmd..............................OKcheck img(0x13C0000) precode OKcheck img(0x8C0000) precode OKcheck img(0x14C0000) precode OKcheck img(0x400000) precode OKcheck img(0x840000) precode OKcopy img(0x13C0000 | 0xDD7C000 | 0xFC000)copy img(0x8C0000 | 0x7E7C000 | 0xAFC000)copy img(0x14C0000 | 0x880000000 | 0x27FC000)copy img(0x400000 | 0xA40000 | 0x3C000)copy img(0x840000 | 0x12E80000 | 0x7C000)Exit4BCmdReadExit4BCmd(2449):ok!Exit4BCmdRead..............................OK[get_reboot_reason_from_pmu]:[708L] This is cold bootV-TEENOTICE: t-p12.C-dtbu ns.C-Imageu ns.Check dtb hash ... MemCmp:7F, 7FokCheck Image hash ... MemCmp:E5, E5okboardid = 3004Update FDT[0] base = 0x0, length = 0x80000000[1] base = 0x880000000, length = 0x180000000soc node = 38988Lpapnv->cpu_idle_en = 0Lpapnv->acpu_num = 8cpus node = 184cpu-map node = 1312cluster0 node = 1324cpus node = 184[cpu@0] subnode = 228[cpu@1] subnode = 356[cpu@2] subnode = 484[cpu@3] subnode = 612[cpu@4] subnode = 740[cpu@5] subnode = 868[cpu@6] subnode = 996[cpu@7] subnode = 1124[GetKernelLogBuf]:[468L] tmp=0x1fc000[GetKernelLogBuf]:[481L] end=10 argsBuf[0x6fe04000 default_hugepagesz=2M reboot_reason=AP_S_COLDBOOT himntn=1010000000000000000000000000000000000000000000000000000000000000 slotid=11 boardid=004][GetKernelLogBuf]:[489L] kernel log buffer[0x6FE04000][0x1FC000][get_reserved_mem_size]:[1188L] memory total size[0x200000000], ddr dump size[0x0][get_reserved_mem]:[1242L] reserved memory[0x0][0x0]Start to boot LinuxV-LPM3LPMCU has covered bootrom keypoint.NOTICE: l-p12.W-LPM3Start to jump Linux kernel(27287)
-
1 案例概述1.1 概要描述点击此处获取该案例。人体关键点检测是指在输入图像上对指定的 18 类人体骨骼关键点位置进行检测,然后将关键点正确配对组成相应的人体骨架,展示人体姿态。本项目基于MindX SDK,在昇腾平台上,实现了对本地视频或RTSP视频流进行人体关键点检测并连接成人体骨架,最后将检测结果可视化并保存。1.2 特性及适用场景使用测试视频应当人物清晰、光线充足、无环境背景干扰,而且人物在画面中占据范围不应太小、人物姿态不应过于扭曲、人物不应完全侧对镜头、背景不应太复杂;视频切勿有遮挡,不清晰等情况。1.3 模型介绍本项目主要用到了用于人体关键点检测的OpenPose模型,OpenPose模型相关文件可以点击此处下载。1.4 实现流程技术流程图如下:2 软件方案介绍2.1 技术原理人体关键点检测插件的输入是模型推理插件输出的特征图,对于 OpenPose 模型,输出两个特征图,分别是关键点特征图 K 和关联度特征图 P,其中 K 的形状大小为 19 × w × h,P 的形状大小为 38 × w × h(w, h 表示特征图宽、高), K中每个通道的二维特征图上每个位置的值表示该类关键点在该位置的置信度,共计 18 类关键点,关键点特征图的最后一个通道即第 19 个通道为背景点类。P 中每两个通道组成的三维特征图上的每个位置的值表示对应类别关键点在该位置处的向量坐标(x, y),通过计算两个不同类关键点组成的连接置信度将关键点连接成骨架,关键点之间组成的骨架共 19 类。关键点插件从输出特征图检测得到人体关键点和骨架的整体流程为:将推理输出特征图缩放至原图尺寸大小。 先将 K 和 P 放大 8 倍,因为 OpenPose 模型推理过程中会将输入缩小 8 倍得到特征图,然后去除 mxpi_imageresize 插件在缩放原图到指定尺寸时在图片右侧和下方添加的补边值,最后将特征图缩放到原图的尺寸大小。从关键点特征图检测得到每一类的候选关键点。 首先将置信度小于一定阈值 T 的点的置信度设为 0,这些位置不会成为候选关键点;如果该点的置信度值大于其上、下、左、右四个相邻点的置信度值,则该点是该类关键点的一个候选关键点;对于每个候选关键点,去除其周围与其欧式距离小于一定阈值 TD 的其他候选关键点。结合关联度特征图 P 将候选关键点配对形成候选骨架。 对于每个骨架(kp1, kp2), 得到 kp1 的所有候选关键点集 S1={kp1_0, kp1_1, ……} 和 kp2 的所有候选关键点集 S2={kp2_0, kp2_1, ……},将 S1 中的每个点 kp1_i和 S2 中的每个点 kp2_j 组合,计算每个点对是该骨架的置信度。计算方式为:在 kp1_i 和 kp2_j 两点连成的线段上等间距的生成 10 个点,每两个相邻点确定一个子段,通过这些子段计算该骨架的置信度并筛选得到候选骨架, 最后去除冲突的候选骨架,即两个骨架有相同的端点时,保留置信度高的骨架。将候选骨架组成人体。 将有相同端点的骨架依次连接,最终组成一个或多个人体。2.2 项目方案架构介绍本系统设计了不同的功能模块。主要流程为:视频拉流传入业务流中,然后通过解码插件对视频进行解码,再对解码出来的YUV图像进行尺寸调整,然后利用OpenPose模型进行人体关键点检测,然后我们自己编写的后处理插件会把人体关键点信息传递给绘图插件,绘图完毕后进行视频编码,最后把结果输出。各模块功能描述如表2.1所示:表2.1 系统方案中各模块功能:序号子系统功能描述1视频拉流调用MindX SDK的 mxpi_rtspsrc接收外部调用接口的输入视频路径,对视频进行拉流2视频解码调用MindX SDK的mxpi_videodecoder3图像缩放调用mxpi_imageresize对解码后的YUV格式的图像进行指定宽高的缩放4检测推理使用已经训练好的OpenPose模型,检测出图像中的车辆信息。插件:mxpi_tensorinfer5模型后处理使用自己编译的mxpi_rtmopenposepostprocess插件的后处理库libmxpi_rtmopenposepostprocess.so,进行人体关键点检测的后处理6绘图调用OSD基础功能在YUV图片上绘制直线。插件:mxpi_opencvosd7视频编码调用MindX SDK的mxpi_videoencoder进行视频编码8输出调用MindX SDK的appsink进行业务流结果的输出3 开发环境准备3.1 环境依赖说明推荐系统为ubuntu 18.04,环境依赖软件和版本如下表:依赖软件版本说明ubuntuubuntu 18.04.6 LTS操作系统CANN5.0.5.alpha001Ascend-cann-toolkit开发套件包MindX SDK3.0.RC2mxVision软件包3.2 环境搭建3.2.1 依赖安装CANN获取链接,安装参考链接MindX SDK获取链接,安装参考链接3.2.2 环境变量设置确保环境中正确安装mxVision SDK。在编译运行项目前,需要设置环境变量:MindX SDK 环境变量:. ${SDK-path}/set_env.shCANN 环境变量:. ${ascend-toolkit-path}/set_env.sh环境变量介绍SDK-path: SDK mxVision 安装路径 ascend-toolkit-path: CANN 安装路径3.3 第三方软件依赖依赖软件说明使用教程live555实现视频转rstp进行推流链接ffmpeg实现mp4格式视频转为264格式视频链接3.4 模型转换本项目主要用到了用于人体关键点检测的OpenPose模型,OpenPose模型相关文件可以点击此处下载。本项目在MindX SDK中需要使用om模型,我们需要对模型进行转换。首先需要将pytorch模型转换为onnx模型,然后使用ATC模型转换工具将onnx模型转换为om模型。本项目提供了输入尺寸为(512,512)的onnx模型,点击此处下载,如不需要修改模型输入尺寸,可直接执行步骤二。步骤一 pth模型转onnx模型获取“lightweight-human-pose-estimation.pytorch”代码包文件 方法一:通过git方式获取 在服务器上,进入指定目录,执行以下命令:git clone cid:link_8.git将在当前目录下生成“lightweight-human-pose-estimation.pytorch”目录及目录中的相关文件;方法二:通过网页获取 点击访问pytorch 参考项目,通过下载zip文件方式下载“lightweight-human-pose-estimation.pytorch”代码压缩包,上传至服务器指定位置后解压得到“lightweight-human-pose-estimation.pytorch-master”目录及目录中的相关文件; 注:模型转换后续步骤采用“通过网页获取”得到的文件目录进行说明。安装相关依赖 进入“lightweight-human-pose-estimation.pytorch-master”目录,执行以下命令安装相关依赖:pip install -r requirements.txt代码预处理 进入“lightweight-human-pose-estimation.pytorch-master/scripts/”目录下,对“convert_to_onnx.py”文件做以下修改:def convert_to_onnx(net, output_name): input = torch.randn(1, 3, 512, 512) # 模型输入宽高,可自定义,此处修改为"512,512" input_names = ['data'] output_names = ['stage_0_output_1_heatmaps', 'stage_0_output_0_pafs', 'stage_1_output_1_heatmaps', 'stage_1_output_0_pafs'] torch.onnx.export(net, input, output_name, verbose=True, opset_version=11, input_names=input_names, output_names=output_names) # 使用pytorch将pth导出为onnx,此处增加ATC转换工具支持的ONNX算子库版本(如opset_version=11)onnx模型转换通过pth模型链接下载获取“checkpoint_iter_370000.pth”模型文件并拷贝至“lightweight-human-pose-estimation.pytorch-master”目录下,并在拷贝目标目录下执行以下命令将pth模型转换成onnx模型:python scripts/convert_to_onnx.py --checkpoint-path=checkpoint_iter_370000.pth注: 1)"--checkpoint-path"为下载的pth模型文件所在目录;若想指定输出的 onnx 模型文件名称,可增加"--output-name"参数,若不指定,则默认输出"human-pose-estimation.onnx"; 2)若服务器不存在"GPU"卡,可参考“6 常见问题”中的相关解决方法。步骤二 onnx模型转om模型进入"${RTMHumanKeypointsDetection代码包目录}/models/"目录,对"insert_op.cfg"文件做以下修改:related_input_rank: 0 src_image_size_w: 512 # onnx模型输入的宽,请根据对应模型进行修改 src_image_size_h: 512 # onnx模型输入的高,请根据对应模型进行修改 crop: false将“步骤一”转换得到的onnx模型拷贝至"${RTMHumanKeypointsDetection代码包目录}/models/"目录下,并在拷贝目标目录下执行以下命令将onnx模型转换成om模型:atc --model=./human-pose-estimation.onnx --framework=5 --output=openpose_pytorch_512 --soc_version=Ascend310 --input_shape="data:1, 3, 512, 512" --input_format=NCHW --insert_op_conf=./insert_op.cfg注: --model 为输入的onnx模型文件及所在目录 --output 为输出的om模型的名称 --input_shape 为指定的模型输入宽、高 等待该命令执行完毕,可能需要一些时间,执行完成后会在当前目录下生成项目需要的om模型文件。执行后终端输出为:ATC start working now, please wait for a moment. ATC run success, welcome to the next use.表示转换成功。4 编译与运行步骤1 按照3.3小结第三方软件依赖安装live555和ffmpeg,按照 Live555离线视频转RTSP说明文档将mp4视频转换为h264格式,并配置rtsp流地址,然后修改RTMHumanKeypointsDetection/pipeline目录下的rtmOpenpose.pipeline文件中mxpi_rtspsrc0的内容。 "mxpi_rtspsrc0": { "factory": "mxpi_rtspsrc", "props": { "rtspUrl":"rtsp://xxx.xxx.xxx.xxx:xxxx/xxx.264", // 修改为自己所使用的的服务器和文件名 "channelId": "0" }, "next": "mxpi_videodecoder0" },步骤2 本项目需要使用 mxpi_opencvosd 插件,使用前需要生成所需的模型文件。执行MindX SDK开发套件包安装目录下 operators/opencvosd/generate_osd_om.sh 脚本生成所需模型文件。步骤3 按照第3节模型转换中的步骤获得om模型文件,放在models/目录下。注意检查om模型文件名是否和pipeline/rtmOpenpose.pipeline中的mxpi_tensorinfer0 插件 modelPath 属性值相同,若不同需改为一致。 "mxpi_tensorinfer0":{ "next":"mxpi_rtmopenposepostprocess0", "factory":"mxpi_tensorinfer", "props":{ "dataSource": "mxpi_imageresize0", "modelPath":"./models/openpose_pytorch_512.om" //检查om模型文件名是否正确 } },若修改了模型的输入尺寸,还需要将 mxpi_imageresize0 插件中的 resizeWidth 和 resizeHeight 属性改成修改后的模型输入尺寸值;将 mxpi_rtmopenposepostprocess0 插件中的 inputWidth 和 inputHeight 属性改成修改后的模型输入尺寸值。 "mxpi_imageresize0":{ "next":"queue3", "factory":"mxpi_imageresize", "props":{ "interpolation":"2", "resizeWidth":"512", //输入的宽,请根据对应模型进行修改 "resizeHeight":"512", //输入的高,请根据对应模型进行修改 "dataSource":"mxpi_videodecoder0", "resizeType":"Resizer_KeepAspectRatio_Fit" } }, "mxpi_rtmopenposepostprocess0":{ "next":"queue4", "factory":"mxpi_rtmopenposepostprocess", "props":{ "imageSource":"mxpi_videodecoder0", "inputHeight":"512", //输入的高,请根据对应模型进行修改 "dataSource":"mxpi_tensorinfer0", "inputWidth":"512" //输入的宽,请根据对应模型进行修改 } },步骤4 编译。在plugins/目录里面执行命令:bash build.sh注:其中SDK安装路径${SDK安装路径}需要替换为用户的SDK安装路径步骤5 运行。回到项目主目录下执行命令:bash run.sh命令执行成功后会在当前目录下生成结果视频文件out.h264,查看文件验证检测结果。5 指标验证5.1 性能测试使用/test目录下的main.cpp替换项目目录下的main.cpp,然后按照第4小结编译与运行中的步骤进行编译运行,服务器会输出运行到该帧的平均帧率,运行日志如下:fps:63.9352 I20220729 16:59:22.297983 27442 MxpiVideoEncoder.cpp:324]Plugin(mxpi videoencodero)fps (65). I20220729 16:59:22.302567 27448 MxpiRTMOpenposePostProcess.cpp:787]MxpiRTMOpenposePostProcess:Process start I20220729 16:59:22.312167 27448 MxpiRTMOpenposePostProcess.cpp:834]MxpiRTMOpenposePostProcess:Process end I2022072916:59:22.31323827427main.cpp:116]Dealing frame id:2104 fps:63.9351 I20220729 16:59:22.317531 27448 MxpiRTMOpenposePostProcess.cpp:787]MxpiRTMOpenposePostProcess:Process start I20220729 16:59:22.327153 27448 MxpiRTMOpenposePostProcess.cpp:834]MxpiRTMOpenposePostProcess:Process end I2022072916:59:22.32923327427main.cpp:116]Dealing frame id:2105 fps:63.9344 I20220729 16:59:22.332511 27448 MxpiRTMOpenposePostProcess.cpp:787]MxpiRTMOpenposePostProcess:Process start I20220729 16:59:22.341825 27448 MxpiRTMOpenposePostProcess.cpp:834]MxpiRTMOpenposePostProcess:Process end I2022072916:59:22.34488227427main.cpp:116]Dealing frame id:2106 fps:63.9344 I20220729 16:59:22.347272 27448 MxpiRTMOpenposePostProcess.cpp:787]MxpiRTMOpenposePostProcess:Process start I20220729 16:59:22.356643 27448 MxpiRTMOpenposePostProcess.cpp:834]MxpiRTMOpenposePostProcess:Process end I2022072916:59:22.36108327427main.cpp:116]Dealing frame id:2107 fps:63.9333 I20220729 16:59:22.362097 27448 MxpiRTMpenposePostProcess.cpp:787]MxpiRTMOpenposePostProcess:Process start I20220729 16:59:22.371462 27448 MxpiRTMOpenposePostProcess.cpp:834]MxpiRTMOpenposePostProcess:Process end I2022072916:59:22.37468327427main.cpp:116]Dealing frame id:2108 fps:63.9373 I20220729 16:59:22.376840 27448 MxpiRTMOpenposePostProcess.cpp:787]MxpiRTMOpenposePostProcess:Process start I20220729 16:59:22.386106 27448 MxpiRTMOpenposePostProcess.cpp:834]MxpiRTMOpenposePostProcess:Process end I2022072916:59:22.39022427427main.cpp:116]Dealing frame id:2109通过日志结果,我们可以看出项目实际可以处理帧率在60fps左右的视频分析,而项目要求达到的性能是25fps,所以满足项目的性能要求。注:输入视频帧率应高于25,否则无法发挥全部性能。5.2 精度测试使用COCO评测工具进行精度测试,数据集使用COCO VAL 2017数据集,使用输入为512*512的模型。具体步骤如下:准备数据集。点击此处下载测试集图片,点击此处下载测试集标注,在 eval 目录下创建 dataset 目录,解压到 eval/dataset/ 目录下,结构如下:├── eval │ ├── dataset │ │ ├── annotations │ │ │ └── person_keypoints_val2017.json │ │ └── val2017 │ │ ├── 000000000139.jpg │ │ ├── 000000000285.jpg │ │ └── other-images安装测试工具。pip install pycocotools编译proto。在 eval/proto/ 目录中执行命令:bash build.sh编译用于精度测试的后处理插件。在 eval/plugins/ 目录中执行命令:bash build.sh运行精度测试脚本。在eval/目录中执行命令:python eval.py生成检测结果文件,并输出 COCO 格式的评测结果: Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets= 20 ] = 0.398 Average Precision (AP) @[ IoU=0.50 | area= all | maxDets= 20 ] = 0.675 Average Precision (AP) @[ IoU=0.75 | area= all | maxDets= 20 ] = 0.398 Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets= 20 ] = 0.336 Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets= 20 ] = 0.488 Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 20 ] = 0.451 Average Recall (AR) @[ IoU=0.50 | area= all | maxDets= 20 ] = 0.701 Average Recall (AR) @[ IoU=0.75 | area= all | maxDets= 20 ] = 0.459 Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets= 20 ] = 0.356 Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets= 20 ] = 0.586可以看出,使用输入为512*512的模型。模型在COCO VAL 2017数据集上,IOU 阈值为 0.50:0.95 时的精度值为39.8%,而原模型的精度是40%,和原模型相差不到1%,所以满足精度要求。6 常见问题6.1 检测输出帧率过低问题问题描述:控制台输出检测的帧率严重低于25fps(如下10fps)。I20220727 09:21:02.990229 32360 MxpiVideoEncoder.cpp:324] Plugin(mxpi_videoencoder0) fps (10).解决方案:确保输入的视频帧率高于25fps。6.2 视频编码参数配置错误问题问题描述:运行过程中报错如下:E20220728 17:05:59.947093 19710 DvppWrapper.cpp:573] input width(888) is not same as venc input format(1280) E20220728 17:05:59.947126 19710 MxpiVideoEncoder.cpp:310] [mxpi_videoencoder0][2010][DVPP: encode H264 or H265 fail] Encode fail.pipeline/rtmOpenpose.pipeline中视频编码插件分辨率参数指定错误。手动指定imageHeight 和 imageWidth 属性,需要和视频输入分配率相同。解决方案:确保pipeline/rtmOpenpose.pipeline中 mxpi_videoencoder0 插件中的 imageHeight 和 imageWidth 为输入视频的实际高和宽。6.3 pth模型转onnx模型报错问题描述:在pth模型转onnx模型的过程中,执行 convert_to_onnx.py 脚本时报如下错误:Traceback (most recent call last): File "/home/wxg/zhongzhi/RTMHumanKeypointsDetection/lightweight-human-pose-estimation.pytorch/scripts/convert_to_onnx.py", line 26, in <module> checkpoint = torch.load(args.checkpoint_path) File "/usr/local/python3.9.2/lib/python3.9/site-packages/torch/serialization.py", line 795, in load return _legacy_load(opened_file, map_location, pickle_module, **pickle_load_args) File "/usr/local/python3.9.2/lib/python3.9/site-packages/torch/serialization.py", line 1012, in _legacy_load result = unpickler.load() File "/usr/local/python3.9.2/lib/python3.9/site-packages/torch/serialization.py", line 958, in persistent_load wrap_storage=restore_location(obj, location), File "/usr/local/python3.9.2/lib/python3.9/site-packages/torch/serialization.py", line 215, in default_restore_location result = fn(storage, location) File "/usr/local/python3.9.2/lib/python3.9/site-packages/torch/serialization.py", line 182, in _cuda_deserialize device = validate_cuda_device(location) File "/usr/local/python3.9.2/lib/python3.9/site-packages/torch/serialization.py", line 166, in validate_cuda_device raise RuntimeError('Attempting to deserialize object on a CUDA ' RuntimeError: Attempting to deserialize object on a CUDA device but torch.cuda.is_available() is False. If you are running on a CPU-only machine, please use torch.load with map_location=torch.device('cpu') to map your storages to the CPU.解决方案:pth模型转onnx模型调用了“CUDA”,此依赖操作需要基于“GPU”卡,昇腾服务器只存在“NPU”卡。若想正常转换onnx模型,需修改“/usr/local/python3.9.2/lib/python3.9/site-packages/torch/serialization.py”脚本655行的“MAP_LOCATION” 指定“cpu”进行pth模型转换onnx模型。
-
AI的发展把人类从繁重和重复的劳动中解放出来,把我们带入了一个“无所不能”的世界。但是这也意味着,AI一旦沦为危险分子的工具,对人类社会安全的威胁也能做到“无孔不入”。AI之下如何保证安全?答案是:打造企业级可信AI框架,AI也可以有自我约束。问题来了,如何保证企业级安全可信?在过去,由于开源属性,AI框架很少和安全认证话题同时提及,业界的关注点常常是准确性和易用性。然而为了从根本上制约AI的弊端,昇思MindSpore主动送检SGS Brightsight实验室,取得了全球首份AI框架的CC EAL2+证书。今天通过一张图带大家了解,一个靠谱的、负责任的、可信赖的AI框架——昇思MindSpore。往期推荐:【一图读懂昇思MindSpore • 第1期】秒懂简介 | 你和昇思MindSpore只有一张图的距离!【一图读懂昇思MindSpore • 第2期】分布式并行 | 打破深度学习性能墙!【一图读懂昇思MindSpore · 第3期】图算融合 | 破而后立,晓喻新生【一图读懂昇思MindSpore · 第4期】动静统一 | 科学研究,高效部署【一图读懂昇思MindSpore · 第5期】Beyond AI | 万物皆可AI,薛定谔也不例外想了解昇思MindSpore更多特性?欢迎留言讨论~
-
如何像CUDA_VISIBLE_DEVICES一样设置使用的Atlas芯片
-
使用MindStudio进行Pytorch模型迁移以及推理MindStudio环境搭建Mind Studio是一套基于IntelliJ框架的开发工具链平台,提供了应用开发、调试、Profiling工具、模型转换、模型可视化功能,以及对开发者来说至关重要的精度对比、自定义算子开发等重要功能,同时还提供了网络移植、优化和分析功能,方便用户开发应用程序。按照平台教程安装MindStudio即可完成本部分的环境搭建。模型简介本次实验我们的目标是在MindStudio上使用ResNet进行图像分类任务。ResNet曾在ILSVRC2015比赛中取得冠军,在图像分类上具有很大的潜力。 ResNet的主要思想是在网络中增加了直连通道,使得原始输入信息能够直接传输到后面的层中,ResNet的残差块的结构如下图所示。ResNet会重复将残差块串联,形成多层网络。一般常见的ResNet根据层数的大小有ResNet-18,ResNet-34,ResNet-50,ResNet-101等等。创建推理工程打开 MindStudio,点击 New Project,进入新建工程界面。选择 Ascend APP。填入项目名 resNeXt101_32x8d。首次新建训练工程时,需要配置 CANN 的版本。点击 Change。点击 + 配置远程连接,然后根据选项填入自己服务器的ip地址、端口号、用户名和密码等。配置 Remote CANN location。该参数需要填入 ascend-toolkit 在服务器上的路 径地址。在这里,我们 toolkit 的路径如下 /usr/local/Ascend/ascend-toolkit/5.1.RC1。 点击 finishing 进行配置。点击Next,选择Pytorch Project。点击Finish,完成工程创建,进入工程主界面。将环境部署到远端Mind Studio可以支持实时将本地文件夹内容同步到服务器,可以达到像自己电脑上执行模型推理一样的效果,此过程需要两个步骤. 点击 File -> Settings -> Tools,即可看到两个设置的入口。配置ssh首先点击SSH Configurations,再点击 + 配置远程连接,然后根据选项填入自己服务器的ip地址、端口号、用户名和密码。部署本地文件夹相当于将远端服务器的路径与本地的文件夹形成一个对应关系。Deployment配置能够更精准地连接远程服务,它需要选择一个SSH连接定位远程主机,然后设置本地与远程项目目录的对应关系。首先选择连接哪一个SSH服务,然后测试连接是否可用。下一步,设置项目目录映射关系,点击Mappings,然后选择本地的项目目录和远程的项目目录(最好是提前创建好文件夹),接下来跑代码的时候MindStudio会保证这两个目录文件的同步。配置好Mappings后,建议配置Excluded Paths,因为MindStudio的默认同步行为会把Mappings对应目录的文件保持完全相同,这意味着只存在于远程的数据集文件夹会被删除(如果本地没有数据集)。在此我配置了几个需要排除的文件夹目录。配置python环境点击File -> Project Structure->SDKs可以看到如图所示的界面。点击+号,可以新增python SDK和JDK。点击Add Python SDK后,将弹出下图所示的界面,点击左侧的SSH Interpreter,如下图所示,首先选择使用哪一个Deployment,这是刚刚我们配置过的。然后选择python解释器的路径。图中的路径是MindStudio自动检测出来的,但一般需要自己找自己的Python环境安装目录。然后点击Project,选择刚才添加到MindStudio中的python解释器,将其作为本项目使用的解释器。数据预处理首先执行数据预处理脚本image_torch_preprocess.py,将原生的图片数据转换为bin格式的输入文件。第一个参数为原始数据验证集(.jpeg)所在路径,第二个参数为输出的二进制文件(.bin)所在路径。每个图像对应生成一个二进制文件。在预处理获得bin文件之后,再执行get_info.py提取输入信息:模型转换模型转换主要分为两步,第一步是将原有的pth模型转换为通用的onnx模型,第二步是将onnx模型转化为npu适用的om模型。首先调用python脚本将pth模型转换为onnx模型:再使用ATC工具将onnx模型导出为om模型。MindStudio提供了atc工具的窗口化应用,它会根据用户选择自动生成atc指令。Model Converter的入口如图所示:选择onnx模型路径,模型输出名称,目标设备,输入格式和batchsize等信息。本实验需要跑到不同的batch size,这里只需要修改shape参数即可生成对应不同batch size的om模型。MindStudio自动生成如下atc指令,用户可以在此做最后的校验,点击Finish即可开始进行模型转换。转换成功得到结果如下:离线推理使用benchmark工具进行推理,可以如图所示创建应用:点击 + 号,再点击Ascend App按照自己的模型的相关信息进行填写即可。在不同机器上执行效率对比如下表格:精度对比推理结束之后,可以调用imagenet_acc_eval.py脚本来和原有标签数据进行对比,得到top5的结果。最后的到精度表现如下:top1准确率为79.3%,top5准确率为94.52%。
推荐直播
-
HDC深度解读系列 - Serverless与MCP融合创新,构建AI应用全新智能中枢2025/08/20 周三 16:30-18:00
张昆鹏 HCDG北京核心组代表
HDC2025期间,华为云展示了Serverless与MCP融合创新的解决方案,本期访谈直播,由华为云开发者专家(HCDE)兼华为云开发者社区组织HCDG北京核心组代表张鹏先生主持,华为云PaaS服务产品部 Serverless总监Ewen为大家深度解读华为云Serverless与MCP如何融合构建AI应用全新智能中枢
回顾中 -
关于RISC-V生态发展的思考2025/09/02 周二 17:00-18:00
中国科学院计算技术研究所副所长包云岗教授
中科院包云岗老师将在本次直播中,探讨处理器生态的关键要素及其联系,分享过去几年推动RISC-V生态建设实践过程中的经验与教训。
回顾中 -
一键搞定华为云万级资源,3步轻松管理企业成本2025/09/09 周二 15:00-16:00
阿言 华为云交易产品经理
本直播重点介绍如何一键续费万级资源,3步轻松管理成本,帮助提升日常管理效率!
回顾中
热门标签