• [Atlas 300] 模型精度对比(推理)
    近期出现关于om模型与第三方框架模型精度问题,在此记录精度对比方法。精度对比指导书:https://support.huaweicloud.com/tg-Inference-cann/atlasaccuracy_16_0001.htmlmindstudio下载以及使用https://support.huaweicloud.com/ug-mindstudioc75/atlasms_02_0022.htmlmindstudio方式打开mindstudio,点击Files -> New -> Project,选择Ascend APP,并根据Sample ResNet50模板创建(用户需要根据自身业务要求创建对应的project,此处仅做展示用)。1、右键MyApp1,选择Add Model,添加转化好的om模型。如下图中的resnet50.om。2、选择script文件下的transferPic.py,进行jpg转化为bin,(请注意数据格式,必须与模型转化中输入要求的格式一致!)。3、修改模板代码中sample_process.cpp(此文件定义了om加载路径,图片加载路径)的om文件路径,以及推理图片位置。4、右键om文件,选择Dump Configuration。5、如下图,左边为om模型的结构。右上Dump Option,ALL:dump整个模型,Seversal:选择需要的层,None:不dump。DumpMode:All/Input/Output,字面意思。dumpPath设置dump的路径,下方OpSearch为om模型算子名称(包含了融合算子)。以TransData层为例,先选了Seversal,然后右键此层EnableDump。6、选择完成后,在src/acl.json文件有响应的改变。如下图,model_name为om文件名称(不要带后缀),layer显示了刚才选择了哪些层。dumpPath前面ip为mindstudio设置好的Device IP,详细请看mindstudio工作方式。也就是在5中设置好dump后,acl.json会自动进行修改。7、build & run,模型运行的数据就会保存在路径中。例如8、查看dump数据,转化为npy格式文件,后使用numpy.load加载om文件dump的数据。请参考此链接:https://support.huaweicloud.com/tg-training-cann/atlasacctrain_16_0016.html9、至此完了使用mindstudio对om文件的层数据的dump。使用命令行方式dump的关键是修改acl.json文件,因此也可以使用命令行方式。只是IDE会方便很多,可以通过可视化界面选择需要dump的层并自动更新acl.json文件。假设用户toolkit安装在/usr/local/Ascend/下,可以进入 ascend-toolkit/latest/x86_64-linux/acllib/sample/acl_execute_model/acl_resnet50 项目中进行om文件dump。修改acl.json文件,并根据指南运行样例即可:https://support.huaweicloud.com/asdevg-c-cann/atlassample_14_0028.htmlTF/Caffe模型dump请参考:https://bbs.huaweicloud.com/blogs/181059这里用vgg tf模型为例展示dump步骤:1、从样例中获取transferPic.py文件,并将jpg文件转化为bin文件(注意数据格式!)。2、从连接获取tools_tensorflow_dump.py:python3.7 tools_tensorflow_dump.py resnet.pb -i test.bin -n 'Inputs:0' -s [1,224,224,3] -a。根据图片实际pb文件名称,图片路径,pb文件输入名称:节点修改命令。3、4、根据指导书,转化成np array。https://support.huaweicloud.com/tg-training-cann/atlasacctrain_16_0016.html精度对比使用mindstudio,点击Ascend -> Model Accuracy Analyzer。选择对应的dump路径即可。tf-Resnet50+mindstudio示例(2020/12/21更新)1、下载pb/om文件:https://www.huaweicloud.com/ascend/resources/modelzoo/Models/7548422b6b9c4a809114435f6b128bb62、命令行方式atc转化om文件:atc --model=resnet_v1_50.pb --input_format=NHWC --input_shape='input:1,224,224,3' --framekwork=3 --input_fp16_nodes='input' --soc_version=Ascend310 --output=fp16input。 (--input_fp16_nodes使om与pb输入都是fp16)3、打开mindstudio,新建APP,以resnet50为模板。打开script/transferPic.py,进行jpg转bin操作。注意由于使用的是fp16数据格式,因此在代码中需要做以下修改。img = img.astype('float32') -> img = img.astype('float16')4、右键MyApp(项目名称),选择Add Model,将转化好的fp16input.om文件加载进来。会加载model目录下。5、修改sample_process.cpp中调用 om文件的路径。这里将调用om文件路径设置成刚刚生成fp16input.om所在的路径。同时修改推理图片的路径,设置成transferPic.py生成bin文件的目录。6、右键fp16input.om,选择Dump Configuration。根据实际要求选择需要dump的内容。这里我选择了dump所有层的output结构。7、选择build,编译项目。选择run运行项目。最终在 MyApp -> run -> dump目录下生成以时间戳命名的dump数据。8、根据:https://bbs.huaweicloud.com/blogs/181057 提示,选择resnet_v1_50.pb,推理bin文件路径。进行pb文件推理结果dump。9、mindstudio工具栏 -> Ascend -> Model Accuracy Analyzer,打开精度对比分析工具,选择dump路径,并点击compare,即可完成对比。‘10、结果展示。softmax层这里cos相似度接近1,结果不错。
  • [技术干货] 浅谈Mysql 查询JSON结果的相关函数
    JSON 格式字段是 Mysql 5.7 新加的属性,不够它本质上以字符串性质保存在库中的,刚接触时我只了解 $.xx 查询字段的方法,因为大部分时间,有这个就够了JSON_EXTRACT(json_doc [,path])查询字段mysql> set @j = '{"name":"wxnacy"}'; mysql> select JSON_EXTRACT(@j, '$.name'); +----------------------------+ | JSON_EXTRACT(@j, '$.name') | +----------------------------+ | "wxnacy"   | +----------------------------+还有一种更简洁的方式,但是只能在查询表时使用mysql> select ext -> '$.name' from test; +-----------------+ | ext -> '$.name' | +-----------------+ | "wxnacy" | +-----------------+在 $. 后可以正常的使用 JSON 格式获取数据方式,比如数组mysql> set @j = '{"a": [1, 2]}'; mysql> select JSON_EXTRACT(@j, '$.a[0]'); +----------------------------+ | JSON_EXTRACT(@j, '$.a[0]') | +----------------------------+ | 1    | +----------------------------+JSON_DEPTH(json_doc)计算 JSON 深度,计算方式 {} [] 有一个符号即为一层,符号下有数据增加一层,复杂 JSON 算到最深的一次为止,官方文档说 null 值深度为 0,但是实际效果并非如此,列举几个例子JSON_LENGTH(json_doc [, path])计算 JSON 最外层或者指定 path 的长度,标量的长度为1。数组的长度是数组元素的数量,对象的长度是对象成员的数量。mysql> SELECT JSON_LENGTH('[1, 2, {"a": 3}]'); +---------------------------------+ | JSON_LENGTH('[1, 2, {"a": 3}]') | +---------------------------------+ |    3 | +---------------------------------+ mysql> SELECT JSON_LENGTH('{"a": 1, "b": {"c": 30}}'); +-----------------------------------------+ | JSON_LENGTH('{"a": 1, "b": {"c": 30}}') | +-----------------------------------------+ |     2 | +-----------------------------------------+ mysql> SELECT JSON_LENGTH('{"a": 1, "b": {"c": 30}}', '$.b'); +------------------------------------------------+ | JSON_LENGTH('{"a": 1, "b": {"c": 30}}', '$.b') | +------------------------------------------------+ |      1 | +------------------------------------------------+JSON_TYPE(json_doc)返回一个utf8mb4字符串,指示JSON值的类型。 这可以是对象,数组或标量类型,如下所示:mysql> SET @j = '{"a": [10, true]}'; mysql> SELECT JSON_TYPE(@j); +---------------+ | JSON_TYPE(@j) | +---------------+ | OBJECT | +---------------+ mysql> SELECT JSON_TYPE(JSON_EXTRACT(@j, '$.a')); +------------------------------------+ | JSON_TYPE(JSON_EXTRACT(@j, '$.a')) | +------------------------------------+ | ARRAY    | +------------------------------------+ mysql> SELECT JSON_TYPE(JSON_EXTRACT(@j, '$.a[0]')); +---------------------------------------+ | JSON_TYPE(JSON_EXTRACT(@j, '$.a[0]')) | +---------------------------------------+ | INTEGER    | +---------------------------------------+ mysql> SELECT JSON_TYPE(JSON_EXTRACT(@j, '$.a[1]')); +---------------------------------------+ | JSON_TYPE(JSON_EXTRACT(@j, '$.a[1]')) | +---------------------------------------+ | BOOLEAN    | +---------------------------------------+可能的返回类型纯JSON类型:OBJECT:JSON对象ARRAY:JSON数组BOOLEAN:JSON真假文字NULL:JSON null文字数字类型:INTEGER:MySQL TINYINT,SMALLINT,MEDIUMINT以及INT和BIGINT标量DOUBLE:MySQL DOUBLE FLOAT标量DECIMAL:MySQL DECIMAL和NUMERIC标量时间类型:DATETIME:MySQL DATETIME和TIMESTAMP标量日期:MySQL DATE标量TIME:MySQL TIME标量字符串类型:STRING:MySQL utf8字符类型标量:CHAR,VARCHAR,TEXT,ENUM和SET二进制类型:BLOB:MySQL二进制类型标量,包括BINARY,VARBINARY,BLOB和BIT所有其他类型:OPAQUE(原始位)JSON_VALID返回0或1以指示值是否为有效JSON。 如果参数为NULL,则返回NULL。mysql> SELECT JSON_VALID('{"a": 1}'); +------------------------+ | JSON_VALID('{"a": 1}') | +------------------------+ |   1 | +------------------------+ mysql> SELECT JSON_VALID('hello'), JSON_VALID('"hello"'); +---------------------+-----------------------+ | JSON_VALID('hello') | JSON_VALID('"hello"') | +---------------------+-----------------------+ |   0 |   1 | +---------------------+-----------------------+
  • [训练管理] 新的算法页面进入后,配置数据来源后显示非法json,然后页面就不能编辑了。
    新的算法页面进入后,配置数据来源后显示非法json,然后页面就不能编辑了。
  • [数据处理] 【Mindspore】【Yolov3_Resnet18】coco2017数据集JSON转TXT有没有代码可以分享
    coco2017数据集JSON转TXT有没有代码可以分享,网上找了一个转换代码运行能够生成mindrecode文件,但是训练的时候会报错,不知道是哪里的问题。报错内容如下:File "/usr/local/ma/python3.7/lib/python3.7/site-packages/mindspore/dataset/engine/iterators.py", line 226, in get_output_shapesreturn [t for t in self.depipeline.GetOutputShapes()]RuntimeError: IndexError: index 154 is out of bounds for axis 3 with size 7
  • [传感器适配] canbus.json不能下发
    修改了canbus_config.json,现在不能下发成功,请帮忙解决,谢谢
  • [其他] 华为TE20API接口WEB_ChangeSessionIDAPI
    在调用WEB_ChangeSessionIDAPI更换回话ID的时候出现了点问题,还请指教!
  • [问题求助] Mindstudio2.1.0 build算子后没有.o和.json
    在工程成功build后,生成了caffe.proto的二进制文件lib_caffe_parser.so与算子插件二进制文件libcustom_instanceNorm_plugin.so但是没有创建kernel_meta文件夹以及对应的.o和.json文件算子实现代码如下:from te import tvm from te.platform.cce_build import build_config from topi.cce import util import te.lang.cce from topi import generic def custom_InstanceNorm(shape, dtype, kernel_name = "custom_InstanceNorm", need_build = True, need_print = False):     supported_dtypes = ['float16', 'float32']     device_api = 'DeviceInstanceNorm'     len_shape = len(shape)     if len_shape != 4:         raise RuntimeError("InstanceNorm Only support 4D inputs but input is %dD" % len_shape)     inputdate = tvm.placeholder(shape, dtype=dtype, name='inputdata')     batch, channel, height, width = inputdate.shape     p_gamme = tvm.placeholder((shape[0], shape[1]), dtype=dtype, name="p_gamme")     p_beta = tvm.placeholder((shape[0], shape[1]), dtype=dtype, name="p_beta")     rh = tvm.reduce_axis((0, height), name="rh")     rw = tvm.reduce_axis((0, width), name="rw")     s_mean = tvm.compute((batch, channel),                          lambda b, c: tvm.sum(inputdate[b, c, rh, rw] / (height * width), axis=[rh, rw]))     rh = tvm.reduce_axis((0, height), name="rh")     rw = tvm.reduce_axis((0, width), name="rw")     s_mean_2 = tvm.compute((batch, channel),                            lambda b, c: tvm.sum(tvm.intrin.power(inputdate[b, c, rh, rw], 2) / (height * width), axis=[rh, rw]))     s_var = tvm.compute((batch, channel),                         lambda b, c: s_mean_2[b, c] - tvm.intrin.power(s_mean[b, c], 2))     eps = tvm.const(0.00001, dtype=dtype)     out = tvm.compute((batch, channel, height, width),                       lambda b, c, h, w: (inputdate[b, c, h, w] - s_mean[b, c]) /                                          tvm.intrin.sqrt(s_var[b, c] + eps) * p_gamme[b][c] + p_beta[b][c])     schedule = tvm.create_schedule(out.op)     if need_print:         with build_config:             print(tvm.lower(schedule, [inputdate, p_gamme, p_beta, out], simple_mode=True))     if need_build:         with build_config:             tvm.build(schedule, [inputdate, p_gamme, p_beta, out], name=kernel_name)是Mindstudio不支持tvm.build这种构建方式,还是其他地方没有设置好?
  • [问题求助] 使用amexec工具,/home/HwHiAiUser/ide_daemon/dump/路径下找不到dump数据
    【功能模块】我在使用amexec工具,/home/HwHiAiUser/ide_daemon/dump/路径下找不到dump数据我按照这个步骤使用amexec工具:虽然我不知道这个acl.json是指om模型的目录下新建一个acl.json还是在/home/HwHiAiUser/tools/msame/out路径下的acl.json,所以我两个acl.json都改成上述内容了;然后我在开发板上直接使用可执行程序./msame,命令为:输出也没有错误吧?但是我只能在输出路径下得到一个txt文件或者bin文件,得不到dump数据。在目录/home/HwHiAiUser/ide_daemon/dump/路径下只有一个record文件夹,里面有个文档,文档里面啥也没有。这样就无法进行后续的结果比对程序。请问这是怎么回事呢?另外还有一个问题,在使用dump_data_conversion.pyc工具把.npy数据转换为.dp数据后,我得到的都是后缀为 .pb的数据,这个是正确的吗?还是应该得到后缀.dp的数据?希望有老师帮忙解答一下!万分感谢!
  • [问题求助] 请问一下你们1.32.B080有提供编译好的JSON或者XML解析库么?
    想自己加个配置文件,自己解析.能有现成的,我就不自己编译了.谢谢!~
  • [问题求助] wecode小程序无法预览,invalid-json
    点击预览提示预览失败,请重试{    "message": "invalid json response body at https://open.welink.huaweicloud.com/wecode/service/ide/uploadDebugFile reason: Unexpected token < in JSON at position 0",    "type": "invalid-json",    "state": false}
  • [AI大赛] json文件使用问题!
    技术人员您好,由于设备问题, 我们生成的json文件是在一台电脑上,而在云端训练用的另一台电脑,现在由于生成的json文件带有url连接,导致我们云端无法使用另一台电脑生成的json文件来进行训练。请问有什么办法可可以解决
  • [版务处理] 人脸库导入zip提示错误代码136参数异常需要什么格式的压缩包呢
     人脸库导入zip提示错误代码136参数异常需要什么格式的压缩包呢我是用添加单张人脸导出的格式拼接的json内容txt后缀和json后缀格式都试过了,然后打包用来上传提示参数异常,请问正确的格式模版是什么样呢
  • [技术干货] 0x08 LiteOS_Lab仓库组件详解 cJSON(下)
    三、cJson库中封装相关函数详解假设我们收到了一帧JSON格式来自服务器的数据,如下图:           从JSON的字面意思可以理解:该数据是一个命令,命令的键为“Light”,值为“ON”,命令单片机将板载LED灯打开。我们可以这样理解这个数据,”paras”、”service_id”和”command_name”都术语同一个object中的item,我们暂时可以忽略”paras”和”service_id”参数,先提取paras这个object类型的item,然后读取”paras”中的item的键是否包含”Light”,如果包含再读取”Light”键对应的值为ON还是OFF。       具体步骤可以分为:①    将MQTT接收任务中收到的“string“类型的数据转换为JSON格式②    读取object中的paras项目,并查询其中是否有特定名称的键(Light)③    提取特定名称键的值④    根据②、③步骤中获取的键、值来执行相应操作⑤    上报处理结果将MQTT接收任务中收到的数据解析为JSON格式首先创建一个cJSON类型的结构体指针,用于保存将MQTT接收任务中收到的“string“类型的数据转换为JSON格式的数据调用CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value);函数,传入MQTT接收任务中收到的“string“类型的数据指针,解析完成之后可以收到一个cJSON类型的结构体指针,使用完之后记得释放,否则会造成内存泄漏。从object中读取item       将解析出来的JSON结构体指针传入作为第一个参数,”paras”作为第二个参数传入CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * const string);函数,将得到一个cJSON类型的结构体指针,该指针的内容就是名为”paras”的item。       将名为”paras”的item cJSON结构体指针作为第一个参数,“Light”作为第二个参数传入CJSON_PUBLIC(cJSON_bool) cJSON_HasObjectItem(const cJSON *object, const char *string);函数,如果paras中包含名为”Light”的item,则会放回true,这是我们可以通过if语句进行判断,如果存在,则进行读取名为”Light”的键对应的值。从object中读取值       将指向名为”Light”的item的cJSON函数指针传入CJSON_PUBLIC(char *) cJSON_GetStringValue(cJSON *item);即可在函数返回值得到一个字符串指针,我们可以通过strstr等等之类的字符串比较函数判断该返回值是否为”ON”或者”OFF”,并指示单片机完成相应操作即可。 总结以及注意事项:cJSON库的操作到这里就大概说完了,大家还可以自行查阅cJSON.h文件,里面定义了很多函数和结构体,可以根据自己需要进行的操作调用相应的函数来处理,唯一需要注意的是无论是创建Object还是解析string,用完之后一定要记得释放内存,如果使用了例如将JSON格式的数据生成为非格式化字符串的函数一定要记得释放这个string字符串指针对的的内存,否则最终会造成内存泄露,导致程序出错。
  • [技术干货] 0x07 LiteOS_Lab仓库组件详解 cJSON(上)
    摘要:我们将设备采集到的数据上传到云平台一般有两种主流的方式:二进制码流和json,本章用于讲解在LiteOS仓库中集成的cJson库,用于将需要上报的数据封装为json格式或者将云平台下发的json格式数据解析出来。一、华为云平台需要的json数据格式当我们下位机使用mqtt协议来进行通讯并且mcu的ram和flash也比较充裕,我们就可以采用json格式来和云平台进行数据交互。首先在定义产品的时候协议类型选择MQTT和数据格式选择JSON:大家可以查看下这个帮助手册,主要说明了华为云平台要求的JSON数据格式的要求,JSON数据格式分为设备命令、设备消息和设备属性,我这里主要说的是设备属性和设备命令:设备属性上报、设备命令下发。services:类型为list(array),存放设备服务数据service_id:类型为string,与我们产品中的服务相对应Agricultureproperties:类型为object,存放设备服务的属性,例如Temperature、Humidity等,和属性名称及值对应,在产品中定义的,如下图。云平台收到的数据必须与我们在产品中定义的数据格式相同,必选的属性必须存在,否则该数据会被丢弃,如果收到的数据正确我们就可以在“设备”页面中看到如下显示:二、cJSON库简介到这里大家应该明白了为什么今天我们需要讲解cJson库了,cJson库的作用是什么了。cJSON库是一个基于MIT的代码,项目仓库地址:https://github.com/DaveGamble/cJSON,我们在LiteOS中主要用到其中的两个文件:cJSON.h和cJSON.c。该库可以十分方便的将我们的数据结构体,例如:转换为json格式的,甚至还能直接以非格式化字符的形式打印出来,就是这样的:,极大的提高了我们处理数据的效率,还能将json格式的数据转换为便于处理的键、值等等。三、cJson库中封装相关函数详解这里就以上面的Agriculture的上报属性数据的结构体为例,带领大家将它转换为JSON格式的数据。几个重要概念       Object和Item:Object和Item是相对的,不是绝对的,这句话有些抽象,我来举个例子向大家说明,例如之前我的定义的json数据:1、 ①到⑩之间的所有数据可以称为一个Object,②到⑩之间的数据就是它的键为”services”,类型为array的item。2、 ②到⑩之间的所有数据可以称为一个Object,其中③处的键值对是它的第一个键为“service_id”,类型为string的item,其中④到⑨处的键值对是它的第二个键为“properties”,类型为Object的item。3、 ④到⑧之间的所有数据可以称为一个Object,其中⑤⑥⑦都是分别是该Object的三个item,他们的类型都是int。        嵌套:嵌套的意思大家只要理解了上面我说的Object和Item的概念就算理解了。Object中嵌套了Object,那这个被嵌套的Object就是Item。cJSON结构体       该结构体的声明在cJSON.h文件中,大家可以自行查看。next和prev指针:通过cJSON结构体定义的变量可以实现一个链表,在进行增、删、查、改时通过next和prev指针来完成。child指针:当我们需要添加一个item到某个Object的时候(嵌套),就将这个item指针挂接到该节点的child成员上。type变量:用于标记该item的类型,例如string、number、bool、array、object等。valuestring指针:用于当item类型为string类型时,指向值所对应的字符串。valueint变量:用于当item类型为number类型时,存储值对应的int类型数据。Valuedouble变量:用于当item类型为number类型时,存储值对应的double类型数据。string指针:指向该item键的对应的名称。当该item为bool类型,其中的值为false或者true时,该值存储于type变量处。绑定系统特有的内存分配及释放函数       因为在创建object和删除object时需要使用到内存,所以在初始化cJSON库时,我们就需要将系统中进行内存分配及释放的函数注册到cJSON库中。例如裸机开发时,用malloc分配内存,用free释放内存。例如用LiteOS_Lab框架开发时,用osal_malloc分配内存,用osal_free释放内存。通过如下操作即可完成注册:Object的创建我们需要进行json格式数据处理时,首先通过JSON数据类型定义一个JSON数据类型变量指针,并通过cJSON_CreateObject为其分配内存并初始化(如果是array类型的object则调用cJSON_CreateArray,其他类型的创建可以自己类比,创建相关函数见下图)。向Object中添加item例如我们要创建如下的一个JSON格式的数据。首先需要创建两个Object,第一个称为root的Object,后面将键为properties的item挂上去,第二个为properties的Object,用于“温度、湿度、光照”键值对的挂接。代码部分:unsigned char* str_js = NULL;            //定义一个字符串指针cJSON* cjson_root = NULL;               //定义cJSON类型的指针cJSON* cjson_properties = NULL; cjson_root = cJSON_CreateObject();  //为上面的指针分配内存并进行初始化cjson_properties = cJSON_CreateObject(); //将温度、湿度、光照键值对添加到名为properties的Object中cJSON_AddNumberToObject(cjson_properties, "Temperature", 20);cJSON_AddNumberToObject(cjson_properties, "Humidity", 18);cJSON_AddNumberToObject(cjson_properties, "luminance", 50); //将名为cjson_data的Object挂接到名为cjson_root的Object上cJSON_AddItemToObject(cjson_root, "properties", cjson_properties); //将cJSON转换为非格式化字符串打印一下str_json = cJSON_Print(cjson_root);printf("Data is %s\r\n", str_json); //用完之后一定要记得释放cJSON_Delete(cjson_root);if(str_json!=NULL)osal_free(str_json); 效果图如下: PS:关于指令的解析放在下一篇来说!
  • [问题求助] tensorflow2.1环境在模型部署的时候,config.json中的runtime如何配置呢
    tensorflow2.1的推理模型,通过obs部署到线上时,显示下面的错误,针对python环境是3.7,tf版本是2.1请问runtime的配置如何写呢?