• [Atlas200] 【PresentServer】【C/C++版本】需要C/C++版本的Server端,不需要进行页面展示
    【功能模块】【PresentServer】需要C/C++版本的Server端,不需要进行页面展示【操作步骤&问题现象】1、Atlas 200 当从机接收服务器下发的数据流2、推理模型使用C/C++编写【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [问题求助] 华为Liteos studio工具无法找到c/c++源文件
    工具用着突然就无法打开c/c++标准库,重装软件也没用!!!【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [问题求助] 基于YOLOV3 相关问题: 模型移植与性能
    【操作步骤&问题现象】1、yolov3_v2.0程序(c++编写),用pytorch训练的模型(https://github.com/eriklindernoren/PyTorch-YOLOv3)能用到c++版本的yolov3上吗?2、c++版本的yolov3的后处理,是在npu上跑的还是在cpu上跑的?
  • [新手课堂] 倒置的方法//c++
    #include using namespace std;int main(){    int m=0,n,b;    cin>>n;    b=n;    while(n!=0)    {        m=m*10+n%10;//这一步大家带上数算算看就会懂了        n=n/10;    }    cout<<m<<endl;     return 0;}
  • [问题求助] liteos studio c++ support 编译出错
    【功能模块】   增加component【操作步骤&问题现象】1、新增项目后,不修改component任何内容,可以正常编译成功2、在componentJ节目中,勾选支持c++suport(即打开LOSCFG_KERNEL_CPPSUPPORT),然后confirm后,ide开始根据选择的component更新,更新完成后,     再进行编译,编译出错3、再去掉勾选支持c++suport,编译仍然报错。【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [问题求助] Atlas200DKC++代码修改树莓派摄像头到uvc格式的usb摄像头怎么做?
    在Atals200DK上部署了一个gitee上的sample但是这个sample调用的是树莓派的摄像头,如果我想修改为本地的usb摄像头,代码中要怎么修改呀?急!求助!samples: CANN Samples - Gitee.com
  • [问题求助] Atlas200DKC++代码修改树莓派摄像头到uvc格式的usb摄像头怎么做?
    在Atals200DK上部署了一个gitee上的sample但是这个sample调用的是树莓派的摄像头,如果我想修改为本地的usb摄像头,代码中要怎么修改呀?急!求助!samples: CANN Samples - Gitee.com
  • [活动体验] mindspore-lite 转换tflite图像分类模型
    1.下载tflite模型https://www.tensorflow.org/lite/guide/hosted_models因为要用mslite的量化,需要下tflite的浮点模型而不是tflite量化的模型。比如https://storage.googleapis.com/download.tensorflow.org/models/tflite/model_zoo/upload_20180427/inception_v3_2018_04_27.tgz下载后解压,得到tflite,pb等文件。注意tflite的模型图像尺寸不同,有的是224,有的是299。2.制作校准集mslite量化工具不能自行预处理图像,因而不能给jpeg的图像,需要转成二进制浮点数据,且图像数据排布是n,h,w,c。数组是行优先(c/c++)。这里用pytorch进行预处理:变形,裁剪,归一化。tflite模型的归一化都是0.5。https://git.cyh.ac.cn/cyh/mindsporelite-image-classification/src/master/np.py这里顺便把验证集也做成二进制的,方便推理时用。这里用的imagenet数据集是按类分文件夹的。3.转换模型,量化模型以inception v3为例,转换浮点模型和量化模型# floatconverter_lite --fmk=TFLITE --modelFile=inception_v3.tflite --outputFile=inception_v3.float# quantconverter_lite --fmk=TFLITE --modelFile=inception_v3.tflite         --outputFile=inception_v3.quant         --quantType=PostTraining --configFile=config/kl_nobias.cfg --quantWeightChannel=0配置文件image_path=/data/calib_data_c_299batch_count=100method_x=KLthread_num=4bias_correction=false转换完成得到inception_v3.float.ms和inception_v3.quant.ms两个模型。4.编写推理程序mslite似乎没有python的api,只有c++和java(Android)的。这里用c++写一个简单的推理。数据预处理也不在c++里写了。数据加载和推理按理可以用并发流水之类加速的,这里也不写了。但多线程还是得写一下,要不cpu推理50000张很慢。https://git.cyh.ac.cn/cyh/mindsporelite-image-classification/src/master/infer.cc编译命令g++ infer.cc -I. -Llib -lmindspore-lite -lpthread -o classification -O35.运行推理./classification msmodels/inception_v3.float.ms 50000 40 /data/val_data_c/%05d.bin这里valpath是一个c格式化字符串6.精度结果tflite-fp32 tflite模型官方标称的精度mslite-fp32 使用mslite转换的浮点模型的精度量化的模型:kl+bias correctionklmax+bias correctionmax从上面来看,biascorrection不是稳定提升kl也没有明显优势
  • [C/C++] 个人对c/c++的见解
    C++有很多新的特征,这些新特征并不一定实用,甚至很烦人。但是,C++的开发效率确实比C要高,所以我仍然采用断章取义的方式来介绍C++的知识。不管是C还是C++,实用就好。
  • [新手课堂] 倒置的方法//c++
    #include using namespace std;int main(){    int m=0,n,b;    cin>>n;    b=n;    while(n!=0)    {        m=m*10+n%10;//这一步大家带上数算算看就会懂了        n=n/10;    }    cout<<m<<endl;     return 0;}
  • [其他问题] MindSpore 是否支持使用C++库开发训练模型?
    MindSpore是否支持使用C++ API来开发、训练模型?类似于像PyTorch一样提供LibTorch  API? MindSpore Lite这个库好像没有提供自动微分api?
  • [问题求助] Mind Studio新建一个C++的样例工程无法修改保存pipeline并报错
    【功能模块】【操作步骤&问题现象】1、新建了一个detection and classification(C++)的样例工程2、修改sample.pipeline 时出现Mind Studio 不认识此后缀扩展名的提示,我暂时选择了以txt文本格式打开3、尝试修改pipeline的配置文件时,重新打开可视化界面出错(仅有一个模块自己连接了自己),并报错(IDE error occured)【截图信息】【日志信息】(可选,上传日志内容或者附件)java.lang.StackOverflowError    at com.huawei.mindstudio.ascend.mindxpipeline.ui.widget.cell.EditorMxCell.getInputPortsCnt(EditorMxCell.java:425)    at com.huawei.mindstudio.ascend.mindxpipeline.ui.widget.layout.EditorHierarchicalLayout.calVertexLayerNum(EditorHierarchicalLayout.java:94)    at com.huawei.mindstudio.ascend.mindxpipeline.ui.widget.layout.EditorHierarchicalLayout.calVertexLayerNum(EditorHierarchicalLayout.java:112)    at com.huawei.mindstudio.ascend.mindxpipeline.ui.widget.layout.EditorHierarchicalLayout.calVertexLayerNum(EditorHierarchicalLayout.java:112)    at com.huawei.mindstudio.ascend.mindxpipeline.ui.widget.layout.EditorHierarchicalLayout.calVertexLayerNum(EditorHierarchicalLayout.java:112)
  • [活动体验] ccsrc/pipeline/pynative/pynative_execute_ge.h
    pynative_execute_ge.h一般.h文件都是在里面声明几个函数,对其不进行实例化,然后在对应的.cc文件中,对在.h文件里面的函数进行实例化,将其的方法体进行实例化,也就是定义。但头文件不用被编译。我们把所有的函数声明全部放进一个头文件中,当某一个 .cpp 源文件需要它们时,它们就可以通过一个宏命令 “#include” 包含进这个 .cpp 文件中,从而把它们的内容合并到 .cpp 文件中去。当 .cpp 文件被编译时,这些被包含进去的 .h 文件的作用便发挥了// ifndef防止双重定义,宏定义MINDSPORE_CCSRC_PIPELINE_PYNATIVE_PYNATIVE_EXECUTE_GE_H_#ifndef MINDSPORE_CCSRC_PIPELINE_PYNATIVE_PYNATIVE_EXECUTE_GE_H_#define MINDSPORE_CCSRC_PIPELINE_PYNATIVE_PYNATIVE_EXECUTE_GE_H_#include <vector> //一个封装了动态大小数组的顺序容器#include <utility> //<utility>标头由自动包含在内 <map> ,以帮助管理其键/值对类型元素#include <string> //字符串string/*memory 是C++标准程序库中的一个头文件,定义了C++标准中的智能指针、内存分配器(allocator)、与垃圾回收有关的函数、临时性的申请与释放动态内存的函数、在内存上创建(构造)对象的函数等等*/#include <memory> // unordered_map 容器不会像 map 容器那样对存储的数据进行排序// map 容器中存储的数据是有序的,而 unordered_map 容器中是无序的#include <unordered_map>//导入自定义的头文件 #include "pipeline/pynative/base.h"#include "transform/graph_ir/convert.h"#include "transform/graph_ir/graph_runner.h"#include "transform/graph_ir/types.h"#include "utils/ms_context.h"//重新命名using GeTensor = ge::Tensor;using GeTensorPtr = std::shared_ptr<GeTensor>;using GeGraph = ge::Graph;using GeGraphPtr = std::shared_ptr<GeGraph>;// 定义mindspore命名空间,嵌套pynative命名空间namespace mindspore {namespace pynative {//定义布尔类型,只是单纯的声明并没有对其进行方法体的创建bool BuildSingleOpGraph(const OpExecInfoPtr &op_exec_info, const std::vector<GeTensorPtr> &inputs,const std::unordered_map<std::string, ValuePtr> &attrs, const GeGraphPtr &graph);//定义py::object类型,声明函数,并未实例化py::object RunOpInGE(const OpExecInfoPtr &op_exec_info, PynativeStatusCode *status);} // namespace pynative} // namespace mindspore#endif // MINDSPORE_CCSRC_PIPELINE_PYNATIVE_PYNATIVE_EXECUTE_GE_H_
  • [数据加载及处理] 动态图中的pynative 执行 ge②
    ```C++ /*续上pipeline/pynative/pynative_execute_ge.cc①*/ void ToTensorPtr(const OpExecInfoPtr op_exec_info, std::vector *const inputs) { MS_EXCEPTION_IF_NULL(inputs); MS_EXCEPTION_IF_NULL(op_exec_info); auto op_inputs = op_exec_info->op_inputs; // 将op_exec_info的值传入op_inputs size_t size = op_inputs.size(); // 算出op_inputs的值的长度 for (size_t i = 0; i size; i++) { // 遍历size的每个元素 if (py::isinstance(op_inputs[i])) { inputs->emplace_back(nullptr); // 尾部插入空,并继续运行 continue; } MeTensorPtr me_tensor_ptr = ConvertPyObjToTensor(op_inputs[i]); auto ge_tensor_ptr = transform::TransformUtil::ConvertTensor(me_tensor_ptr, kOpFormat_NCHW); // 判断将输入转换为GE张量在op中是否失败 if (ge_tensor_ptr == nullptr) { MS_LOG(EXCEPTION) "Convert inputs to GE tensor failed in op " op_exec_info->op_name "."; } // 为操作员设置输入以构建单节点图 inputs->push_back(ge_tensor_ptr); } } PynativeStatusCode ConvertAttributes(const OpExecInfoPtr &op_exec_info, const std::vector &inputs) { MS_EXCEPTION_IF_NULL(op_exec_info); // 将op_exec_info的值传入给op_attrs auto op_attrs = op_exec_info->op_attrs; // 创建一个空的map容器attrs std::unordered_map attrs{}; for (auto &item : op_attrs) { // 判断是否在py dict转换中键入错误 if (!py::isinstance(item.first)) { MS_LOG(ERROR) "Type error in py dict convert"; return PYNATIVE_OP_ATTRS_ERR; } std::string name = py::cast(item.first); auto attr_value = PyAttrValue(py::cast(item.second)); (void)attrs.emplace(name, attr_value); // 尾部插入 } // 构建graph GeGraphPtr graph = std::make_shared(op_exec_info->op_name); // 判断是否成功构建BuildSingleOpGraph if (BuildSingleOpGraph(op_exec_info, inputs, attrs, graph) == false) { MS_LOG(ERROR) "Failed to BuildSingleOpGraph"; return PYNATIVE_GRAPH_GE_BUILD_ERR; } // 将单个操作图添加到图形管理器中,它将通过会话进行迭代 transform::Status ret = transform::DfGraphManager::GetInstance().AddGraph(SINGLE_OP_GRAPH, std::shared_ptr(graph)); // 判断是否将将图形添加到图形管理器中 if (ret != transform::SUCCESS) { MS_LOG(ERROR) "Failed to AddGraph into graph manager"; return PYNATIVE_GRAPH_MANAGER_ERR; } return PYNATIVE_SUCCESS; } std::vector ConvertOutputTensors(const OpExecInfoPtr &op_exec_info, const std::vector &ge_tensors) { std::vector outputs; // 构建outputs列表 // 将op_exec_info里面的abstract传给abs_base AbstractBasePtr abs_base = op_exec_info->abstract; std::vector> shapes; // 创建long long型二维数组shapes if (abs_base != nullptr && abs_base->isa()) { auto arg_tensor = dyn_cast(abs_base); shapes.emplace_back(arg_tensor->shape()->shape()); // 尾部插入 outputs = transform::TransformUtil::ConvertGeTensors(ge_tensors, shapes); return outputs; } if (abs_base != nullptr && abs_base->isa()) { auto arg_tuple = dyn_cast(abs_base); size_t len = arg_tuple->size(); // len为arg_tuple的长度 for (size_t i = 0; i len; i++) { if (arg_tuple->elements()[i]->isa()) { auto arg_tensor = dyn_cast(arg_tuple->elements()[i]); shapes.emplace_back(arg_tensor->shape()->shape()); // 尾部插入 } } outputs = transform::TransformUtil::ConvertGeTensors(ge_tensors, shapes); return outputs; } for (auto &it : ge_tensors) { // 遍历ge_tensors auto tensor = transform::TransformUtil::ConvertGeTensor(it); if (tensor != nullptr) { // 尾部插入 outputs.emplace_back(tensor); } } return outputs; } py::object RunOpInGE(const OpExecInfoPtr &op_exec_info, PynativeStatusCode *status) { // 运行操作开始 MS_LOG(INFO) "RunOpInGe start"; MS_EXCEPTION_IF_NULL(op_exec_info); MS_EXCEPTION_IF_NULL(status); // 出错时返回空 py::tuple py::tuple err_ret(0); auto op_name = op_exec_info->op_name; transform::OpAdapterPtr adapter = transform::DfGraphConvertor::FindAdapter(op_name, true); if (adapter == nullptr) { // 无法找到 GE 适配器 MS_LOG(ERROR) "Unable to find GE Adapter for " ((std::string)py::str(op_name)); *status = PYNATIVE_OP_NOT_IMPLEMENTED_ERR; return std::move(err_ret); } std::vector inputs{}; ToTensorPtr(op_exec_info, &inputs); // 将我的 attr 转换为 ge AttrValue PynativeStatusCode ret = ConvertAttributes(op_exec_info, inputs); if (ret != PYNATIVE_SUCCESS) { *status = ret; return std::move(err_ret); } // 运行 graph transform::RunOptions run_options; run_options.name = SINGLE_OP_GRAPH; // 构建ge_inputs与ge_outputs std::vector ge_inputs; std::vector ge_outputs; transform::GraphRunnerOptions graph_runner_options; graph_runner_options.options["ge.trainFlag"] = "1"; auto graph_runner = std::make_shared(graph_runner_options); transform::Status run_ret; { // 在调用(可能长时间运行)C++ 代码之前释放 GIL py::gil_scoped_release release; run_ret = graph_runner->RunGraph(run_options, ge_inputs, &ge_outputs); } // 判断GraphRunner是否运行graph失败 if (run_ret != transform::Status::SUCCESS) { MS_LOG(ERROR) "GraphRunner fails to run graph"; *status = PYNATIVE_GRAPH_GE_RUN_ERR; return std::move(err_ret); // 移除err_ret } std::vector graph_outputs = ConvertOutputTensors(op_exec_info, ge_outputs); size_t output_size = graph_outputs.size(); // output_size记录长度 py::tuple result(output_size); for (size_t i = 0; i output_size; i++) { MS_EXCEPTION_IF_NULL(graph_outputs[i]); result[i] = *graph_outputs[i]; } *status = PYNATIVE_SUCCESS; // 运行操作结束 MS_LOG(INFO) "RunOpInGe end"; return std::move(result); } } // 命名空间 pynative } // 命名空间 mindspore ```
  • [活动体验] 数据处理中的去张量
    ```C++ // 导入自定义的.h文件 #include "minddata/dataset/core/de_tensor.h" #include "minddata/dataset/core/device_tensor.h" #include "minddata/dataset/include/dataset/constants.h" #include "minddata/dataset/core/type_id.h" #ifndef ENABLE_ANDROID #include "utils/log_adapter.h" #define EXCEPTION_IF_NULL(ptr) MS_EXCEPTION_IF_NULL(ptr) #else #include "mindspore/lite/src/common/log_adapter.h" #define EXCEPTION_IF_NULL(ptr) MS_ASSERT((ptr) != nullptr) #endif // 双重命名空间 namespace mindspore { namespace dataset { DETensor::DETensor(std::shared_ptr tensor_impl) : tensor_impl_(tensor_impl), name_("MindDataTensor"), // static_cast相当于传统的C语言里的强制转换,该运算符把expression转换为new_type类型, // 用来强迫隐式转换如non-const对象转为const对象,编译时检查, // 用于非多态的转换,可以转换指针及其他,但没有运行时类型检查来保证转换的安全性。 type_(static_cast(DETypeToMSType(tensor_impl_->type()))), shape_(tensor_impl_->shape().AsVector()), is_device_(false) {} #ifndef ENABLE_ANDROID DETensor::DETensor(std::shared_ptr device_tensor_impl, bool is_device) : device_tensor_impl_(device_tensor_impl), name_("MindDataDeviceTensor"), is_device_(is_device) { // Dvpp模块中shape_的顺序为(width, widthStride, height, heightStride) // 我们需要在shape_属性中添加[1]widthStride和[3]heightStride,它们是实际的YUV图像形状 // unsigned char = uint8_t; uint8_t flag = 0; // auto为C++语言存储类型,仅在语句块内部使用,初始化可为任何表达式 // 其特点是当执行流程进入该语句块时初始化可为任何表达式。 // auto被解释为一个自动存储变量的关键字,也就是申明一块临时内存 for (auto &i : device_tensor_impl->GetYuvStrideShape()) { if (flag % 2 == 1) { int64_t j = static_cast(i); shape_.emplace_back(j); } ++flag; } // 这是一张 YUV420 格式的图像,一个像素占用 1.5 个字节。 // 因此,图片为(H,W)格式的形状 。YUV420格式可以搜索更多信息 std::reverse(shape_.begin(), shape_.end()); MS_LOG(INFO) "This is a YUV420 format image, one pixel takes 1.5 bytes. Therefore, the shape of" " image is in (H, W) format. You can search for more information about YUV420 format"; } #endif const std::string &DETensor::Name() const { return name_; } // 枚举常量是枚举类型中的值,即枚举值。 // 枚举类型是一种用户定义的类型,只有用户在程序中定义它后才能被使用。 // 用户通常利用枚举类型定义程序中需要使用的一组相关的符号常量 enum mindspore::DataType DETensor::DataType() const { #ifndef ENABLE_ANDROID if (is_device_) { // 是否为空 EXCEPTION_IF_NULL(device_tensor_impl_); return static_cast(DETypeToMSType(device_tensor_impl_->DeviceDataType())); } #endif // 是否为空 EXCEPTION_IF_NULL(tensor_impl_); return static_cast(DETypeToMSType(tensor_impl_->type())); } size_t DETensor::DataSize() const { #ifndef ENABLE_ANDROID if (is_device_) { // 是否为空 EXCEPTION_IF_NULL(device_tensor_impl_); return device_tensor_impl_->DeviceDataSize(); } #endif // 是否为空 EXCEPTION_IF_NULL(tensor_impl_); return static_cast(tensor_impl_->SizeInBytes()); } // uint64_t : typedef unsigned long long const std::vector &DETensor::Shape() const { return shape_; } std::shared_ptr DETensor::Data() const { #ifndef ENABLE_ANDROID if (is_device_) { EXCEPTION_IF_NULL(device_tensor_impl_); // shared_ptr是一个最像指针的"智能指针" // 是boost.smart_ptr库中最有价值、最重要的组成部分,也是最有用的 // Boost库的许多组件--甚至还包括其他一些领域的智能指针都使用了shared_ptr return std::shared_ptr(device_tensor_impl_->GetHostBuffer(), [](const void *) {}); } #endif return std::shared_ptr(tensor_impl_->GetBuffer(), [](const void *) {}); } void *DETensor::MutableData() { #ifndef ENABLE_ANDROID if (is_device_) { // 是否为空 EXCEPTION_IF_NULL(device_tensor_impl_); return static_cast(device_tensor_impl_->GetDeviceMutableBuffer()); } #endif EXCEPTION_IF_NULL(tensor_impl_); // static_cast相当于传统的C语言里的强制转换,该运算符把expression转换为new_type类型 // 用来强迫隐式转换如non-const对象转为const对象,编译时检查,用于非多态的转换 // 可以转换指针及其他,但没有运行时类型检查来保证转换的安全性 return static_cast(tensor_impl_->GetMutableBuffer()); } bool DETensor::IsDevice() const { return is_device_; } std::shared_ptr DETensor::Clone() const { #ifndef ENABLE_ANDROID if (is_device_) { // 是否为空 EXCEPTION_IF_NULL(device_tensor_impl_); return std::make_shared(device_tensor_impl_, is_device_); } #endif return std::make_shared(tensor_impl_); } } // 命名空间 dataset } // 命名空间 mindspore ```
总条数:310 到第
上滑加载中