From c65b1a6afea17dfe1ef8a01fdf8feb49c362ed19 Mon Sep 17 00:00:00 2001 From: xuegangxiao Date: Thu, 16 Mar 2023 12:00:06 +0800 Subject: [PATCH 01/61] =?UTF-8?q?#=E3=80=90=E4=BF=AE=E6=94=B9=E8=AF=B4?= =?UTF-8?q?=E6=98=8E=20Modification=E3=80=91=20=E8=A7=86=E9=A2=91=E8=B4=A8?= =?UTF-8?q?=E9=87=8F=E8=AF=8A=E6=96=AD310B=E9=80=82=E9=85=8D=20#=E3=80=90?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=BA=20Modifier=E3=80=91=20=E8=96=9B?= =?UTF-8?q?=E6=B8=AF=E6=BD=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pipeline/VideoQualityDetection.pipeline | 1 - mxVision/VideoQualityDetection/run.sh | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/mxVision/VideoQualityDetection/pipeline/VideoQualityDetection.pipeline b/mxVision/VideoQualityDetection/pipeline/VideoQualityDetection.pipeline index e35095e0b..9c6ac11ed 100644 --- a/mxVision/VideoQualityDetection/pipeline/VideoQualityDetection.pipeline +++ b/mxVision/VideoQualityDetection/pipeline/VideoQualityDetection.pipeline @@ -18,7 +18,6 @@ "outputImageFormat": "YUV420SP_NV12", "vdecChannelId": "0" }, - "former": "mxpi_rtspsrc0", "next": "mxpi_qualitydetection0" }, "mxpi_qualitydetection0": { diff --git a/mxVision/VideoQualityDetection/run.sh b/mxVision/VideoQualityDetection/run.sh index 5b010023b..a7a985eb9 100644 --- a/mxVision/VideoQualityDetection/run.sh +++ b/mxVision/VideoQualityDetection/run.sh @@ -15,7 +15,6 @@ # limitations under the License. set -e - export LD_LIBRARY_PATH="${MX_SDK_HOME}/lib":"${MX_SDK_HOME}/opensource/lib":"${MX_SDK_HOME}/opensource/lib64":"/usr/local/Ascend/ascend-toolkit/latest/acllib/lib64":${LD_LIBRARY_PATH} export GST_PLUGIN_SCANNER="${MX_SDK_HOME}/opensource/libexec/gstreamer-1.0/gst-plugin-scanner" export GST_PLUGIN_PATH="${MX_SDK_HOME}/opensource/lib/gstreamer-1.0":"${MX_SDK_HOME}/lib/plugins" @@ -23,7 +22,7 @@ export GST_PLUGIN_PATH="${MX_SDK_HOME}/opensource/lib/gstreamer-1.0":"${MX_SDK_H # complie g++ main.cpp -I "${MX_SDK_HOME}/include/" -I "${MX_SDK_HOME}/opensource/include/" -L "${MX_SDK_HOME}/lib/" \ -L "${MX_SDK_HOME}/opensource/lib/" -std=c++11 -pthread -D_GLIBCXX_USE_CXX11_ABI=0 -Dgoogle=mindxsdk_private -fPIC -fstack-protector-all \ --g -Wl,-z,relro,-z,now,-z,noexecstack -pie -Wall -lglog -lmxbase -lstreammanager -lcpprest -lprotobuf -o main +-g -Wl,-z,relro,-z,now,-z,noexecstack -pie -Wall -lglog -lmxbase -lstreammanager -lcpprest -lmindxsdk_protobuf -o main # run ./main -- Gitee From 8218d6a33f3f90343c7942508b5e8207b317bd38 Mon Sep 17 00:00:00 2001 From: xuegangxiao Date: Thu, 16 Mar 2023 19:39:04 +0800 Subject: [PATCH 02/61] =?UTF-8?q?#=E3=80=90=E4=BF=AE=E6=94=B9=E8=AF=B4?= =?UTF-8?q?=E6=98=8E=20Modification=E3=80=91=20OSD=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E6=8C=87=E5=AF=BC310B=E9=80=82=E9=85=8D=20#=E3=80=90=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E4=BA=BA=20Modifier=E3=80=91=20=E8=96=9B=E6=B8=AF?= =?UTF-8?q?=E6=BD=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tutorials/OsdSample/pipeline/SampleOsd.pipeline | 3 +++ tutorials/OsdSample/python/main.py | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/tutorials/OsdSample/pipeline/SampleOsd.pipeline b/tutorials/OsdSample/pipeline/SampleOsd.pipeline index 9757602fb..3b45c7804 100644 --- a/tutorials/OsdSample/pipeline/SampleOsd.pipeline +++ b/tutorials/OsdSample/pipeline/SampleOsd.pipeline @@ -41,6 +41,9 @@ "next":"mxpi_imageencoder0" }, "mxpi_imageencoder0":{ + "props": { + "encodeLevel": "10" + }, "factory":"mxpi_imageencoder", "next":"appsink0" }, diff --git a/tutorials/OsdSample/python/main.py b/tutorials/OsdSample/python/main.py index 6b24b5de6..b0e268579 100644 --- a/tutorials/OsdSample/python/main.py +++ b/tutorials/OsdSample/python/main.py @@ -58,13 +58,13 @@ if __name__ == '__main__': message_json = json.load(f) print(message_json) in_plugin_id = 1 - osd_instances_list = MxpiOSDType.Mxpiosd_instances_list() + osd_instances_list = MxpiOSDType.MxpiOsdInstancesList() osd_instances_list = ParseDict(message_json, osd_instances_list) protobuf_vec = InProtobufVector() protobuf = MxProtobufIn() protobuf.key = b'appsrc1' - protobuf.type = b'MxTools.Mxpiosd_instances_list' + protobuf.type = b'MxTools.MxpiOsdInstancesList' protobuf.protobuf = osd_instances_list.SerializeToString() protobuf_vec.push_back(protobuf) ret = stream_manager_api.SendProtobuf(stream_name, in_plugin_id, protobuf_vec) -- Gitee From 7f67f583b17b0384e8fd300a13542623838cd12c Mon Sep 17 00:00:00 2001 From: DlinR Date: Sat, 18 Mar 2023 16:06:28 +0800 Subject: [PATCH 03/61] =?UTF-8?q?310B=E9=80=82=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contrib/CrowdCounting/README.md | 29 ++---- contrib/GestureKeypointDetection/README.md | 41 +++----- .../detection.pipeline | 2 +- .../model/hand/model_conversion.sh | 39 -------- .../model/keypoint/model_conversion.sh | 40 -------- contrib/PersonCount/README.md | 98 +++++++------------ contrib/PersonCount/main.py | 4 +- .../model_conversion.sh | 7 -- .../insert_op.cfg | 0 contrib/PersonCount/run.sh | 2 +- contrib/PortraitSegmentation/README.md | 42 +------- contrib/RemoteSensingSegmentation/README.md | 35 +++---- .../util/model_conversion.sh | 40 -------- contrib/SuperResolution/README.md | 73 ++++---------- .../SuperResolution/model/model_conversion.sh | 39 -------- contrib/VideoGestureRecognition/README.md | 58 ++++------- contrib/VideoGestureRecognition/build.sh | 6 -- contrib/msame/README.md | 12 +-- contrib/msame/msame.py | 26 ++--- contrib/msame/set_env.sh | 26 ----- 20 files changed, 136 insertions(+), 483 deletions(-) delete mode 100644 contrib/GestureKeypointDetection/model/hand/model_conversion.sh delete mode 100644 contrib/GestureKeypointDetection/model/keypoint/model_conversion.sh delete mode 100644 contrib/PersonCount/model transformation script/model_conversion.sh rename contrib/PersonCount/{model transformation script => model}/insert_op.cfg (100%) delete mode 100644 contrib/RemoteSensingSegmentation/util/model_conversion.sh delete mode 100644 contrib/SuperResolution/model/model_conversion.sh delete mode 100644 contrib/msame/set_env.sh diff --git a/contrib/CrowdCounting/README.md b/contrib/CrowdCounting/README.md index 1ec51fd38..11c63acdc 100644 --- a/contrib/CrowdCounting/README.md +++ b/contrib/CrowdCounting/README.md @@ -5,7 +5,7 @@ ### 1.1 支持的产品 -支持昇腾310芯片 +支持昇腾310B芯片 ### 1.2 支持的版本 @@ -57,14 +57,9 @@ eg:推荐系统为ubuntu 18.04或centos 7.6,环境依赖软件和版本如 在编译运行项目前,需要设置环境变量: -将下述环境变量中的{MX_INSTALL_PATH}替换为实际的安装路径,一般为/usr/local/Ascend/ascend-toolkit/latest - ``` -export install_path={MX_INSTALL_PATH} -export PATH=/usr/local/python3.9.2/bin:${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATH -export PYTHONPATH=${install_path}/atc/python/site-packages:${install_path}/atc/python/site-packages/auto_tune.egg/auto_tune:${install_path}/atc/python/site-packages/schedule_search.egg:$PYTHONPATH -export LD_LIBRARY_PATH=${install_path}/atc/lib64:$LD_LIBRARY_PATH -export ASCEND_OPP_PATH=${install_path}/opp +. /usr/local/Ascend/ascend-toolkit/set_env.sh #toolkit默认安装路径,根据实际安装路径修改 +. ${SDK_INSTALL_PATH}/mxVision/set_env.sh ``` ## 3 模型转换 @@ -80,7 +75,7 @@ export ASCEND_OPP_PATH=${install_path}/opp 将上述下载得文件统一放在CrowdCounting/model文件夹下,并使用ATC模型转换工具进行模型转换,参考如下指令: ``` -atc --input_shape="blob1:1,3,800,1408" --weight="count_person.caffe.caffemodel" --input_format=NCHW --output="count_person.caffe" --soc_version=Ascend310 --insert_op_conf=insert_op.cfg --framework=0 --model="count_person.caffe.prototxt" +atc --input_shape="blob1:1,3,800,1408" --weight="count_person.caffe.caffemodel" --input_format=NCHW --output="count_person.caffe" --soc_version=Ascend310B1 --insert_op_conf=insert_op.cfg --framework=0 --model="count_person.caffe.prototxt" ``` 得到count_person.caffe.om文件 @@ -89,21 +84,9 @@ atc --input_shape="blob1:1,3,800,1408" --weight="count_person.caffe.caffemodel" **步骤1** -修改CMakeLists.txt文件 将set(MX_SDK_HOME "$ENV{MX_SDK_HOME}")中的"$ENV{MX_SDK_HOME}"替换为实际的SDK安装路径 - -**步骤2** - cd到CrowdCounting目录下,执行如下编译命令: bash build.sh -**步骤3** - -设置环境变量 ASCEND_HOME Ascend安装的路径,将${MX_SDK_HOME}改为实际安装路径,一般为/usr/local/Ascend LD_LIBRARY_PATH 指定程序运行时依赖的动态库查找路径,包括ACL,开源软件库,libmxbase.so以及模型后处理开发的动态链接库路径,比如:libyolov3postprocess.so - -``` -export LD_LIBRARY_PATH=${MX_SDK_HOME}/lib/modelpostprocessors:${MX_SDK_HOME}/lib:${MX_SDK_HOME}/opensource/lib:${MX_SDK_HOME}/opensource/lib64:/usr/local/Ascend/driver/lib64:/usr/local/Ascend/ascend-toolkit/latest/acllib/lib64:${LD_LIBRARY_PATH} -``` - -**步骤4** +**步骤2** 下载人群计数图像,需自行在网络找图,暂支持JPG格式,任意图像分辨率。再将该下载的图片作为推理图片放入CrowdCounting目录下,执行: @@ -115,7 +98,7 @@ export LD_LIBRARY_PATH=${MX_SDK_HOME}/lib/modelpostprocessors:${MX_SDK_HOME}/lib | 依赖软件 | 版本 | 说明 | | -------- | ----- | ------------------------------------------------------------ | -| mxVision | 2.0.4 | 提供昇腾计算语言(AscendCL)的高级编程API,简化插件和推理应用开发。 | +| mxVision | 5.0rc1 | 提供昇腾计算语言(AscendCL)的高级编程API,简化插件和推理应用开发。 | diff --git a/contrib/GestureKeypointDetection/README.md b/contrib/GestureKeypointDetection/README.md index a6160a242..eea8d109b 100644 --- a/contrib/GestureKeypointDetection/README.md +++ b/contrib/GestureKeypointDetection/README.md @@ -8,14 +8,14 @@ ### 1.1 支持的产品 -本项目以昇腾Atlas310卡为主要的硬件平台。 +本项目以昇腾Atlas310B卡为主要的硬件平台。 ### 1.2 支持的版本 -支持的SDK版本为2.0.4 -支持的cann版本为5.0.4 +支持的SDK版本为5.0rc1 +支持的cann版本为6.2 ### 1.3 软件方案介绍 @@ -63,26 +63,15 @@ | 软件名称 | 版本 | | -------- | ------ | | cmake | 3.5+ | -| mxVision | 2.0.4 | +| mxVision | 5.0rc1 | | python | 3.9.2 | 确保环境中正确安装mxVision SDK。 在编译运行项目前,需要设置环境变量: ``` -export MX_SDK_HOME=${SDK安装路径}/mxVision -export LD_LIBRARY_PATH="${MX_SDK_HOME}/lib:${MX_SDK_HOME}/opensource/lib:/usr/local/Ascend/ascend-toolkit/latest/acllib/lib64:/usr/local/Ascend/ascend-toolkit/latest/acllib/lib64/stub:${LD_LIBRARY_PATH}" -export PYTHONPATH="${MX_SDK_HOME}/python:${PYTHONPATH}" -export GST_PLUGIN_SCANNER="${MX_SDK_HOME}/opensource/libexec/gstreamer-1.0/gst-plugin-scanner" -export GST_PLUGIN_PATH="${MX_SDK_HOME}/opensource/lib/gstreamer-1.0:${MX_SDK_HOME}/lib/plugins" -``` - -- 环境变量介绍 - -``` -MX_SDK_HOME: mxVision SDK 安装路径 -LD_LIBRARY_PATH: lib库路径 -PYTHONPATH: python环境路径 +. /usr/local/Ascend/ascend-toolkit/set_env.sh #toolkit默认安装路径,根据实际安装路径修改 +. ${SDK_INSTALL_PATH}/mxVision/set_env.sh ``` @@ -95,7 +84,7 @@ PYTHONPATH: python环境路径 1. 从上述 onnx 模型下载链接中下载 onnx 模型至 ``model/hand`` 文件夹下,文件名为:yolov3_hand.onnx 。 2. 进入 ``model/hand`` 文件夹下执行命令: ``` -bash model_convertion.sh +atc --model=yolov3_hand.onnx --framework=5 --output=hand --input_format=NCHW --output_type=FP32 --soc_version=Ascend310B1 --input_shape="input.1:1,3,416,416" --insert_op_conf=./aipp.cfg --log=info ``` 执行该命令后会在当前文件夹下生成项目需要的模型文件 hand.om。执行后终端输出为: ``` @@ -111,9 +100,9 @@ ATC run success, welcome to the next use. 自行转换模型步骤如下: 1. 从上述 onnx 模型下载链接中下载 onnx 模型至 ``model/hand_keypoint`` 文件夹下,文件名为:resnet_50_size-256.onnx 。 -2. 进入 ``model/hand`` 文件夹下执行命令: +2. 进入 ``model/keypoint`` 文件夹下执行命令: ``` -bash model_convertion.sh +atc --model=./resnet_50_size-256.onnx --framework=5 --output=hand_keypoint --soc_version=Ascend310B1 --input_shape="input:1, 3, 256, 256" --input_format=NCHW --insert_op_conf=./insert_op.cfg ``` 执行该命令后会在当前文件夹下生成项目需要的模型文件 hand_keypoint.om。执行后终端输出为: ``` @@ -122,17 +111,15 @@ ATC run success, welcome to the next use. ``` ## 4. 运行 -**步骤1** 根据环境SDK的安装路径配置detection.pipeline中的{$MX_SDK_HOME}。 -**步骤2** 按照第 2 小节 **环境依赖** 中的步骤设置环境变量。 +**步骤1** 按照第 2 小节 **环境依赖** 中的步骤设置环境变量。 -**步骤3** 按照第 3 小节 **模型转换** 中的步骤获得 om 模型文件,放置在 ``model/hand`` 和 ``model/hand_keypoint`` 目录下。 +**步骤2** 按照第 3 小节 **模型转换** 中的步骤获得 om 模型文件,放置在 ``model/hand`` 和 ``model/hand_keypoint`` 目录下。 -**步骤4** 网上下载手势图片。 +**步骤3** 网上下载手势图片。 -**步骤5** 图片检测。将关于人手手势的图片放在项目目录下,命名为 test.jpg。在该图片上进行检测,执行命令: +**步骤4** 图片检测。将关于人手手势的图片放在项目目录下,命名为 test.jpg。在该图片上进行检测,执行命令: ``` -python3 main.py test.jpg +python main.py test.jpg ``` 命令执行成功后在当前目录下生成检测结果文件 result_test.jpg,查看结果文件验证检测结果。 - diff --git a/contrib/GestureKeypointDetection/detection.pipeline b/contrib/GestureKeypointDetection/detection.pipeline index 9f5f07000..ef8c3223c 100644 --- a/contrib/GestureKeypointDetection/detection.pipeline +++ b/contrib/GestureKeypointDetection/detection.pipeline @@ -40,7 +40,7 @@ "dataSource": "mxpi_tensorinfer0", "postProcessConfigPath": "./model/hand/hand.cfg", "labelPath": "./model/hand/coco.names", - "postProcessLibPath": "{$MX_SDK_HOME}/lib/modelpostprocessors/libyolov3postprocess.so" + "postProcessLibPath": "libyolov3postprocess.so" }, "factory": "mxpi_objectpostprocessor", "next": "mxpi_imagecrop0" diff --git a/contrib/GestureKeypointDetection/model/hand/model_conversion.sh b/contrib/GestureKeypointDetection/model/hand/model_conversion.sh deleted file mode 100644 index 353cf96d8..000000000 --- a/contrib/GestureKeypointDetection/model/hand/model_conversion.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/bin/bash - -# Copyright(C) Huawei Technologies Co.,Ltd. 2012-2021 All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -# 该脚本用来将 pth 模型文件转换成.om模型文件 -# This is used to convert pth model file to .om model file. - - -# 设置环境变量(请确认install_path路径是否正确) -# Set environment PATH (Please confirm that the install_path is correct). - -export install_path=/usr/local/Ascend/ascend-toolkit/latest -export PATH=/usr/local/python3.9.2/bin:${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATH -export PYTHONPATH=${install_path}/atc/python/site-packages:${install_path}/atc/python/site-packages/auto_tune.egg/auto_tune:${install_path}/atc/python/site-packages/schedule_search.egg -export LD_LIBRARY_PATH=${install_path}/atc/lib64:$LD_LIBRARY_PATH -export ASCEND_OPP_PATH=${install_path}/opp - -# 执行,转换 Openpose 模型 -# Execute, transform Openpose model. -atc --model=yolov3_hand.onnx --framework=5 --output=hand --input_format=NCHW --output_type=FP32 --soc_version=Ascend310 --input_shape="input.1:1,3,416,416" --insert_op_conf=./aipp.cfg --log=info - -# 删除除 om 模型外额外生成的文件 -# Remove miscellaneous - -rm fusion_result.json -rm -rf kernel_meta diff --git a/contrib/GestureKeypointDetection/model/keypoint/model_conversion.sh b/contrib/GestureKeypointDetection/model/keypoint/model_conversion.sh deleted file mode 100644 index a31dd9069..000000000 --- a/contrib/GestureKeypointDetection/model/keypoint/model_conversion.sh +++ /dev/null @@ -1,40 +0,0 @@ -#!/bin/bash - -# Copyright(C) Huawei Technologies Co.,Ltd. 2012-2021 All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -# 该脚本用来将 pth 模型文件转换成.om模型文件 -# This is used to convert pth model file to .om model file. - - -# 设置环境变量(请确认install_path路径是否正确) -# Set environment PATH (Please confirm that the install_path is correct). - -export install_path=/usr/local/Ascend/ascend-toolkit/latest -export PATH=/usr/local/python3.9.2/bin:${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATH -export PYTHONPATH=${install_path}/atc/python/site-packages:${install_path}/atc/python/site-packages/auto_tune.egg/auto_tune:${install_path}/atc/python/site-packages/schedule_search.egg -export LD_LIBRARY_PATH=${install_path}/atc/lib64:$LD_LIBRARY_PATH -export ASCEND_OPP_PATH=${install_path}/opp - -# 执行,转换 Openpose 模型 -# Execute, transform Openpose model. - -atc --model=./resnet_50_size-256.onnx --framework=5 --output=hand_keypoint --soc_version=Ascend310 --input_shape="input:1, 3, 256, 256" --input_format=NCHW --insert_op_conf=./insert_op.cfg - -# 删除除 om 模型外额外生成的文件 -# Remove miscellaneous - -rm fusion_result.json -rm -rf kernel_meta diff --git a/contrib/PersonCount/README.md b/contrib/PersonCount/README.md index 1ef3f0e90..b73240bdd 100644 --- a/contrib/PersonCount/README.md +++ b/contrib/PersonCount/README.md @@ -17,11 +17,11 @@ ### 1.1 支持的产品 可列出项目所用的硬件平台、支持的硬件平台、访问方式等 -人群计数项目使用的硬件平台为华为海思Ascend310。其中,om模型适配海思Ascend310硬件平台,模型的推理过程也由硬件平台Ascend310完成。 +人群计数项目使用的硬件平台为华为海思Ascend310B。 ### 1.2 支持的版本 -支持的SDK版本:20.2.0 +支持的SDK版本:5.0rc1 ### 1.3 软件方案介绍 @@ -39,7 +39,7 @@ ### 1.4 代码目录结构与说明 -本工程名称为 [南开大学]人群密度统计,工程目录如下图所示: +``` │ build.sh //用于生成后处理共享库的编译命令使用sh build.sh完成编译 │ main.py //对待检测图片进行人群计数的主体程序,包含读入图片数据、模型推理、写热度图等功能特性 │ run.sh //人群计数的运行脚本,运行main.py文件 @@ -55,17 +55,16 @@ | └─err1.png //章节6使用到的错误报告截图 │ ├─model //转换后的om模型 +│ |--insert_op.cfg //模型转换需要的配置文件 │ └─count_person_8.caffe.om │ -├─model transformation script -│ |--insert_op.cfg //模型转换需要的配置文件 -│ └─ model_conversion.sh //模型转换脚本 -│ -├─pipeline //本项目使用的前端是python开发,用到的pipeline配置嵌入到main.py,所以该文件夹为空 +├─pipeline +│ └─test.pipeline ├─Plugin1 //编译后处理插件所需的源文件,生成的共享库文件存放于build文件夹 │ |--CMakeLists.txt │ |--Plugin1.cpp └─ └─Plugin1.h +``` ### 1.5 技术实现流程图 @@ -80,60 +79,46 @@ | 软件名称 | 版本 | | -------- | ------ | -| MindX SDK mxManufacture | 2.0.4 | -| ascend-toolkit | 5.0.4 | +| MindX SDK | 5.0RC1 | +| ascend-toolkit | 6.2 | 在编译运行项目前,需要设置环境变量: -MX_SDK_HOME="~/mxManufacture" -LD_LIBRARY_PATH=\\${MX_SDK_HOME}/lib:\\${MX_SDK_HOME}/opensource/lib:\\${MX_SDK_HOME}/opensource/lib64:/usr/local/Ascend/ascend-toolkit/latest/acllib/lib64:/usr/local/Ascend/driver/lib64:/usr/local/Ascend/ascend-toolkit:\\${LD_LIBRARY_PATH} -PYTHONPATH=\\${MX_SDK_HOME}/python:\\${PYTHONPATH} -install_path=/usr/local/Ascend/ascend-toolkit/latest -PATH=/usr/local/python3.9.2/bin:\\${install_path}/atc/ccec_compiler/bin:\\${install_path}/atc/bin:\\$PATH -PYTHONPATH=\\${install_path}/atc/python/site-packages:\\${install_path}/atc/python/site-packages/auto_tune.egg/auto_tune:\\${install_path}/atc/python/site-packages/schedule_search.egg -LD_LIBRARY_PATH=\\${install_path}/atc/lib64:\\$LD_LIBRARY_PATH -ASCEND_OPP_PATH=\\${install_path}/opp -- 环境变量介绍 -MX_SDK_HOME指明MindX SDK mxManufacture的根安装路径,用于包含MindX SDK提供的所有库和头文件。 -LD_LIBRARY_PATH提供了MindX SDK已开发的插件和相关的库信息。 -install_path指明ascend-toolkit的安装路径。 -PATH变量中添加了python的执行路径和atc转换工具的执行路径。 -LD_LIBRARY_PATH添加了ascend-toolkit和MindX SDK提供的库目录路径。 -ASCEND_OPP_PATH指明atc转换工具需要的目录。 +``` +. /usr/local/Ascend/ascend-toolkit/set_env.sh #toolkit默认安装路径,根据实际安装路径修改 +. ${SDK_INSTALL_PATH}/mxVision/set_env.sh +``` -具体执行命令 -export MX_SDK_HOME="~/mxManufacture" -export LD_LIBRARY_PATH=\\${MX_SDK_HOME}/lib:\\${MX_SDK_HOME}/opensource/lib:\\${MX_SDK_HOME}/opensource/lib64:/usr/local/Ascend/ascend-toolkit/latest/acllib/lib64:/usr/local/Ascend/driver/lib64:/usr/local/Ascend/ascend-toolkit:\\${LD_LIBRARY_PATH} +## 编译与运行 -export install_path=/usr/local/Ascend/ascend-toolkit/latest -export PATH=/usr/local/python3.9.2/bin:\\${install_path}/atc/ccec_compiler/bin:\\${install_path}/atc/bin:\\$PATH -export PYTHONPATH=\\${install_path}/atc/python/site-packages:\\${install_path}/atc/python/site-packages/auto_tune.egg/auto_tune:\\${install_path}/atc/python/site-packages/schedule_search.egg -export LD_LIBRARY_PATH=\\${install_path}/atc/lib64:\\$LD_LIBRARY_PATH -export ASCEND_OPP_PATH=\\${install_path}/opp +**步骤1** 修改相应文件 +修改main.py中的DATASET_PATH变量,该变量指向待检测的图片路径。修改main.py中gt_path变量,改变了指向待检测图片的groundtruth. -## 依赖安装 +此外,如果想要得到pipeline中各个插件的具体运行时间, +可以修改mxManufacture SDK的sdk.conf文件,使得enable_ps变量为true. -安装MindX SDK mxManufacture: -chmod u+x Ascend-mindxsdk-mxmanufacture_2.0.4_linux-aarch64.run -./Ascend-mindxsdk-mxmanufacture_2.0.4_linux-aarch64.run +**步骤2** 设置环境变量 -ascend-toolkit: -从/usr/local/Ascend/ascend-toolkit/latest/路径获取 +按照第二章节设置环境变量所需的具体执行指令执行即可。 -## 编译与运行 -(描述项目安装运行的全部步骤,,如果不涉及个人路径,请直接列出具体执行命令) +**步骤3** 编译 -示例步骤如下: -**步骤1** (修改相应文件)修改Plugin1目录下的CMakeLists.txt中PROJECT_SOURCE_DIR变量,该变量指向MindX SDK mxManufacture的根安装路径。修改main.py中的Dataset_Path变量,该变量指向待检测的图片路径。修改main.py中gt_num变量,改变了指向待检测图片的groundtruth.此外,如果想要得到pipeline中各个插件的具体运行时间, -可以修改mxManufacture SDK的sdk.conf文件,使得enable_ps变量为true. +首先通过运行build.sh脚本文件生成后处理使用的共享库 +``` +sh build.sh +``` +然后使用模型转换命令将caffe模型转化为om模型待使用 +``` +atc --input_shape="blob1:8,3,800,1408" --weight="model/count_person.caffe.caffemodel" --input_format=NCHW --output="model/count_person_8.caffe" --soc_version=Ascend310B1 --insert_op_conf=model/insert_op.cfg --framework=0 --model="model/count_person.caffe.prototxt"。 +``` -**步骤2** (设置环境变量)按照第二章节设置环境变量所需的具体执行指令执行即可。 +**步骤4** 运行 -**步骤3** (执行编译的步骤)首先通过运行build.sh脚本文件生成后处理使用的共享库如sh build.sh。然后使用模型转换命令将caffe模型转化为om模型待使用,具体命令为atc --input_shape="blob1:8,3,800,1408" --weight="model/count_person.caffe.caffemodel" --input_format=NCHW --output="model/count_person_8.caffe" --soc_version=Ascend310 --insert_op_conf=model/insert_op.cfg --framework=0 --model="model/count_person.caffe.prototxt"。此外,我们已经在文件夹model transformation script提供了模型转换脚本将脚本文件复制到主目录即可运行. +直接运行run.sh。 -**步骤4** (运行及输出结果)直接运行run.sh即可,生成的热度图保存在当前目录的heat_map文件夹下,并且每张热度图的命名以原图片名称为前缀以heatmap为后缀。此外,我们还在文件夹accuracy and performance code提供了精度与性能测试代码,将test.py和test.sh拷贝到主目录中然后执行sh test.sh即可运行精度与性能测试代码。 +生成的热度图保存在当前目录的heat_map文件夹下,并且每张热度图的命名以原图片名称为前缀以heatmap为后缀。此外,我们还在文件夹accuracy and performance code提供了精度与性能测试代码,将test.py和test.sh拷贝到主目录中然后执行sh test.sh即可运行精度与性能测试代码。 @@ -144,21 +129,4 @@ ascend-toolkit: | 依赖软件 | 版本 | 说明 | | -------- | ----- | ------------------------ | -| cmake | 3.10.2 | 用于编译并生成后处理插件 | -| python | 3.9.2 | 用于编译用户程序如main.py | - - - -## 6 常见问题 - -请按照问题重要程度,详细列出可能要到的问题,和解决方法。 - -### 6.1 batch问题 - -**问题描述:** -在使用batch机制时,模型需要的数据维度和输入到流中的数据维度不匹配。该问题造成的主要原因是因为老版的MindX_SDK不提供自动组batch功能。程序中使用多次senddata函数,每次send一张图片到流中,并假设tensorinfer插件能够自动组batch然后进行batch模型的推理。 -截图或报错信息: -![err information](https://gitee.com/superman418/mindxsdk-referenceapps/raw/master/contrib/PersonCount/img/err1.png) -**解决方案:** - -新版Ascend-mindxsdk-mxmanufacture_2.0.4_linux-aarch64中的tensorinfer插件能够自动组batch然后进行batch模型的推理,可以解决该问题。 \ No newline at end of file +| python | 3.9.2 | 用于编译用户程序如main.py | \ No newline at end of file diff --git a/contrib/PersonCount/main.py b/contrib/PersonCount/main.py index 16676febf..7605a00c6 100644 --- a/contrib/PersonCount/main.py +++ b/contrib/PersonCount/main.py @@ -102,7 +102,7 @@ if __name__ == '__main__': # Construct the input of the stream DATA_INPUT = MxDataInput() #dataset path needs to fixde as specific path - DATASET_PATH = '../tools/python_count/ShanghaiTech/part_B_images/' + DATASET_PATH = 'ShanghaiTech/part_B_images/' NAME_LIST = os.listdir(DATASET_PATH) PERSON_NUM_LIST = [] GT_LIST = [] @@ -154,7 +154,7 @@ if __name__ == '__main__': #load ground truth information #gt_num represents the person number of ground truth. #the ground truth needs to fix as specific path. - gt_path = "../tools/python_count/ShanghaiTech/part_B_test/GT_IMG_" + str(i) + ".mat" + gt_path = "ShanghaiTech/part_B_test/GT_IMG_" + str(i) + ".mat" data1 = sio.loadmat(gt_path) gt_num = int(data1['image_info'][0][0][0][0][1][0][0]) GT_LIST.append(gt_num) diff --git a/contrib/PersonCount/model transformation script/model_conversion.sh b/contrib/PersonCount/model transformation script/model_conversion.sh deleted file mode 100644 index ee5124e4a..000000000 --- a/contrib/PersonCount/model transformation script/model_conversion.sh +++ /dev/null @@ -1,7 +0,0 @@ -# /bin/sh -export install_path=/usr/local/Ascend/ascend-toolkit/latest -export PATH=/usr/local/python3.9.2/bin:${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATH -export PYTHONPATH=${install_path}/atc/python/site-packages:${install_path}/atc/python/site-packages/auto_tune.egg/auto_tune:${install_path}/atc/python/site-packages/schedule_search.egg -export LD_LIBRARY_PATH=${install_path}/atc/lib64:$LD_LIBRARY_PATH -export ASCEND_OPP_PATH=${install_path}/opp -atc --input_shape="blob1:8,3,800,1408" --weight="model/count_person.caffe.caffemodel" --input_format=NCHW --output="model/count_person_8.caffe" --soc_version=Ascend310 --insert_op_conf="model/insert_op.cfg" --framework=0 --model="model/count_person.caffe.prototxt" diff --git a/contrib/PersonCount/model transformation script/insert_op.cfg b/contrib/PersonCount/model/insert_op.cfg similarity index 100% rename from contrib/PersonCount/model transformation script/insert_op.cfg rename to contrib/PersonCount/model/insert_op.cfg diff --git a/contrib/PersonCount/run.sh b/contrib/PersonCount/run.sh index 69926ff0e..f8a73cb75 100644 --- a/contrib/PersonCount/run.sh +++ b/contrib/PersonCount/run.sh @@ -3,5 +3,5 @@ export LD_LIBRARY_PATH=${MX_SDK_HOME}/lib:${MX_SDK_HOME}/opensource/lib:${MX_SDK_HOME}/opensource/lib64:/usr/local/Ascend/ascend-toolkit/latest/acllib/lib64:/usr/local/Ascend/driver/lib64:${LD_LIBRARY_PATH} export PYTHONPATH=${MX_SDK_HOME}/python:${PYTHONPATH} -python3 main.py +python main.py exit \ No newline at end of file diff --git a/contrib/PortraitSegmentation/README.md b/contrib/PortraitSegmentation/README.md index 02b2570ab..5654d3b94 100644 --- a/contrib/PortraitSegmentation/README.md +++ b/contrib/PortraitSegmentation/README.md @@ -21,10 +21,8 @@ | 软件名称 | 版本 | | :--------: | :------: | |ubantu 18.04|18.04.1 LTS | -|MindX SDK|2.0.4| +|MindX SDK|5.0rc1 | |Python| 3.9.2| -|numpy | 1.18.2 | -|opencv_python|3.4.0| 请注意MindX SDK使用python版本为3.9.2,如出现无法找到python对应lib库请在root下安装python3.9开发库 `apt-get install libpython3.9` @@ -38,22 +36,12 @@ 在pb文件所在目录下执行以下命令 ``` -#设置环境变量(请确认install_path路径是否正确) -#Set environment PATH (Please confirm that the install_path is correct). - -export install_path=/usr/local/Ascend/ascend-toolkit/latest - -export PATH=/usr/local/python3.9.2/bin:${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATH - -export PYTHONPATH=${install_path}/atc/python/site-packages:${install_path}/atc/python/site-packages/auto_tune.egg/auto_tune:${install_path}/atc/python/site-packages/schedule_search.egg - -export LD_LIBRARY_PATH=${install_path}/atc/lib64:$LD_LIBRARY_PATH -export ASCEND_OPP_PATH=${install_path}/opp +. /usr/local/Ascend/ascend-toolkit/set_env.sh #toolkit默认安装路径,根据实际安装路径修改 #执行,转换Portrait.pb模型 #Execute, transform Portrait.pb model. -atc --model=portrait.pb --input_shape="Inputs/x_input:1,224,224,3" --framework=3 --output=portrait --insert_op_conf=insert_op.cfg --soc_version=Ascend310 +atc --model=portrait.pb --input_shape="Inputs/x_input:1,224,224,3" --framework=3 --output=portrait --insert_op_conf=insert_op.cfg --soc_version=Ascend310B1 ``` 执行完模型转换脚本后,若提示如下信息说明模型转换成功,会在output参数指定的路径下生成portrait.om模型文件。 ``` @@ -71,27 +59,7 @@ https://gitee.com/ascend/docs-openmind/blob/master/guide/mindx/sdk/tutorials/%E5 ``` 2. 配置 ``` -#执行如下命令,打开.bashrc文件 -cd $home -vi .bashrc -#在.bashrc文件中添加以下环境变量: - -export MX_SDK_HOME=${SDK安装路径}/mxVision - -export LD_LIBRARY_PATH=${MX_SDK_HOME}/lib:${MX_SDK_HOME}/opensource/lib:${MX_SDK_HOME}/opensource/lib64:${MX_SDK_HOME}/opensource/lib64:/usr/local/Ascend/ascend-toolkit/latest/acllib/lib64:/usr/local/Ascend/driver/lib64/ - -export PYTHONPATH=${MX_SDK_HOME}/python - -export GST_PLUGIN_SCANNER=${MX_SDK_HOME}/opensource/libexec/gstreamer-1.0/gst-plugin-scanner - -export GST_PLUGIN_PATH=${MX_SDK_HOME}/opensource/lib/gstreamer-1.0:${MX_SDK_HOME}/lib/plugins - -#保存退出.bashrc -#执行如下命令使环境变量生效 -source ~/.bashrc - -#查看环境变量 -env +. ${SDK_INSTALL_PATH}/mxVision/set_env.sh ``` 3. 配置pipeline 根据所需场景,配置pipeline文件,调整路径参数等。 @@ -124,7 +92,7 @@ mkdir result 默认的阈值参数为1。 ``` -例:python3 main.py data/background.jpg data/portrait.jpg 1 +例:python main.py data/background.jpg data/portrait.jpg 1 ``` 7. 查看结果 diff --git a/contrib/RemoteSensingSegmentation/README.md b/contrib/RemoteSensingSegmentation/README.md index 263f9b272..1307b2b51 100644 --- a/contrib/RemoteSensingSegmentation/README.md +++ b/contrib/RemoteSensingSegmentation/README.md @@ -9,7 +9,7 @@ 昇腾310(推理) ### 1.2 支持的版本 -本样例配套的CANN版本为 [5.0.4](https://www.hiascend.com/software/cann/commercial) ,MindX SDK版本为 [2.0.4](https://www.hiascend.com/software/Mindx-sdk) 。 +本样例配套的CANN版本为 [6.2](https://www.hiascend.com/software/cann/commercial) ,MindX SDK版本为 [5.0RC1](https://www.hiascend.com/software/Mindx-sdk) 。 ### 1.3 目录结构 ``` @@ -59,7 +59,19 @@ pip install -r requiremenst.txt #安装依赖,可能会因为网络问题而报 **步骤2.5** 步骤2.4执行完成后会在克隆项目`models`目录下生成`DANet.onnx`和`Deeplabv3.onnx`,复制到本项目`models`下执行步骤3 -**步骤3** 在本项目`util`目录下运行模型转换脚本 `./model_conversion.sh`(如不是可执行脚本,先将其转换`chmod +x model_conversion.sh`), 执行完模型转换脚本后,会在`models`目录下生成相应的DANet和Deeplabv3的`om`模型文件 +**步骤3** 在本项目`models`目录下运行模型转换命令 + +首先需要引入环境变量 + +``` +. /usr/local/Ascend/ascend-toolkit/set_env.sh #toolkit默认安装路径,根据实际安装路径修改 + +atc --framework=5 --model=DANet.onnx --output=DANet --soc_version=Ascend310B1 --insert_op_conf=../config/configure.cfg --log=error + +atc --framework=5 --model=Deeplabv3.onnx --output=Deeplabv3 --soc_version=Ascend310B1 --insert_op_conf=../config/configure.cfg --log=error +``` + +执行完模型转换命令后,会在`models`目录下生成相应的DANet和Deeplabv3的`om`模型文件 模型转换使用了ATC工具,如需更多信息请参考: @@ -90,23 +102,8 @@ pip install -r requiremenst.txt #安装依赖,可能会因为网络问题而报 ## 3 模型推理 ### 3.1 配置MindXSDK和Python环境变量 -```bash -# 执行如下命令,打开.bashrc文件 -cd $HOME -vi .bashrc -# 在.bashrc文件中添加以下环境变量 -MX_SDK_HOME= SDK安装路径 -LD_LIBRARY_PATH=${MX_SDK_HOME}/lib:${MX_SDK_HOME}/opensource/lib:${MX_SDK_HOME}/opensource/lib64:/usr/local/Ascend/ascend-toolkit/latest/acllib/lib64:/usr/local/Ascend/driver/lib64/ -GST_PLUGIN_SCANNER=${MX_SDK_HOME}/opensource/libexec/gstreamer-1.0/gst-plugin-scanner -GST_PLUGIN_PATH=${MX_SDK_HOME}/opensource/lib/gstreamer-1.0:${MX_SDK_HOME}/lib/plugins -PYTHONPATH=${MX_SDK_HOME}/python - -# 保存退出.bashrc文件 -# 执行如下命令使环境变量生效 -source ~/.bashrc - -# 查看环境变量 -env +``` +. ${SDK_INSTALL_PATH}/mxVision/set_env.sh ``` ### 3.2 运行 > 运行前请下载 [测试集图片](https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/contrib/RemoteSensingSegmentation/data.zip) 放入目录`test_set`下, 随后进入工程目录,键入执行指令 diff --git a/contrib/RemoteSensingSegmentation/util/model_conversion.sh b/contrib/RemoteSensingSegmentation/util/model_conversion.sh deleted file mode 100644 index 0e596b1ea..000000000 --- a/contrib/RemoteSensingSegmentation/util/model_conversion.sh +++ /dev/null @@ -1,40 +0,0 @@ -#!/bin/bash - -# Copyright(C) 2021. Huawei Technologies Co.,Ltd. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -set -e - -# 该脚本用来将onnx模型文件转换成.om模型文件 -# This is used to convert onnx model file to .om model file. - - -# 设置环境变量(请确认install_path路径是否正确) -# Set environment PATH (Please confirm that the install_path is correct). - -export install_path=/usr/local/Ascend/ascend-toolkit/latest -export PATH=/usr/local/python3.9.2/bin:${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATH -export PYTHONPATH=${install_path}/atc/python/site-packages:${install_path}/atc/python/site-packages/auto_tune.egg/auto_tune:${install_path}/atc/python/site-packages/schedule_search.egg -export LD_LIBRARY_PATH=${install_path}/atc/lib64:$LD_LIBRARY_PATH -export ASCEND_OPP_PATH=${install_path}/opp - - -# 执行,转换DANet和Deeplabv3+模型 -# Execute, transform DANet and Deeplabv3+ model - -atc --framework=5 --model=../models/DANet.onnx --output=../models/DANet --soc_version=Ascend310 --insert_op_conf=../config/configure.cfg --log=error -atc --framework=5 --model=../models/Deeplabv3.onnx --output=../models/Deeplabv3 --soc_version=Ascend310 --insert_op_conf=../config/configure.cfg --log=error -# 退出 -# exit -exit 0 \ No newline at end of file diff --git a/contrib/SuperResolution/README.md b/contrib/SuperResolution/README.md index fcf6e35d0..cbdc9b417 100644 --- a/contrib/SuperResolution/README.md +++ b/contrib/SuperResolution/README.md @@ -2,20 +2,24 @@ ## 介绍 -基于MindX SDK 2.0.1 mxVision开发图像超分辨率程序。本程序采用python开发,通过预处理操作对输入的图片数据解码为YUV格式图片,并将解码后的图片缩放到模型推理要求的尺寸。然后利用图像超分辨率模型VDSR获取得到图片超分辨率重建结果。最后,利用python的第三方图像处理库PIL将低分辨率的输入图像和超分辨率重建的结果一同可视化。其次,针对两个图片集91-images和General-100进行PSNR(峰值信噪比)验证。 +基于MindX SDK mxVision开发图像超分辨率程序。本程序采用python开发,通过预处理操作对输入的图片数据解码为YUV格式图片,并将解码后的图片缩放到模型推理要求的尺寸。然后利用图像超分辨率模型VDSR获取得到图片超分辨率重建结果。最后,利用python的第三方图像处理库PIL将低分辨率的输入图像和超分辨率重建的结果一同可视化。其次,针对两个图片集91-images和General-100进行PSNR(峰值信噪比)验证。 程序输入:任意jpg图片 程序输出:输出得到低分辨率图片(256 x 256px)和超分辨率重建图片(768 x 768px)组合的可视化大图 ### 支持的产品 -昇腾310(推理) +昇腾310B(推理) -### 支持的版本 +## 环境依赖 -本样例配套的CANN版本为 [5.0.4](https://www.hiascend.com/software/cann/commercial) ,MindX SDK版本为 [2.0.4](https://www.hiascend.com/software/Mindx-sdk) 。 +### 软件版本 -MindX SDK安装前准备可参考《用户指南》,[安装教程](https://gitee.com/ascend/mindxsdk-referenceapps/blob/master/docs/quickStart/1-1安装SDK开发套件.md) +| 软件 | 版本 | 说明 | 获取方式 | +| ------------------- | ------------ | ----------------------------- | ------------------------------------------------------------ | +| mxVision | 5.0 RC1 | mxVision软件包 | [链接](https://www.hiascend.com/software/Mindx-sdk) | +| Ascend-CANN-toolkit | 6.2 | Ascend-cann-toolkit开发套件包 | [链接](https://www.hiascend.com/software/cann/commercial) | +| 操作系统 | Ubuntu 18.04 | 操作系统 | Ubuntu官网获取 ### 目录结构 @@ -42,20 +46,17 @@ MindX SDK安装前准备可参考《用户指南》,[安装教程](https://git |-------- util.py // 工具方法 ``` + +### 准备工作 +> 配置环境变量 -## 环境依赖 - -### 软件版本 - -| 软件 | 版本 | 说明 | 获取方式 | -| ------------------- | ------------ | ----------------------------- | ------------------------------------------------------------ | -| mxVision | 2.0.4 | mxVision软件包 | [链接](https://www.hiascend.com/software/Mindx-sdk) | -| Ascend-CANN-toolkit | 5.0.4 | Ascend-cann-toolkit开发套件包 | [链接](https://www.hiascend.com/software/cann/commercial) | -| 操作系统 | Ubuntu 18.04 | 操作系统 | Ubuntu官网获取 | +``` +. /usr/local/Ascend/ascend-toolkit/set_env.sh #toolkit默认安装路径,根据实际安装路径修改 +. ${SDK_INSTALL_PATH}/mxVision/set_env.sh -### 准备工作 +``` > 模型转换 @@ -90,22 +91,13 @@ aipp_op { **步骤4** 使用ATC模型转换工具进行模型转换 -运行模型转换脚本 `model_conversion.sh` 或在 `model` 目录下执行以下命令 +`model` 目录下执行以下命令 ``` -# 设置环境变量(请确认install_path路径是否正确) -# Set environment PATH (Please confirm that the install_path is correct). - -export install_path=/usr/local/Ascend/ascend-toolkit/latest -export PATH=/usr/local/python3.9.2/bin:${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATH -export PYTHONPATH=${install_path}/atc/python/site-packages:${install_path}/atc/python/site-packages/auto_tune.egg/auto_tune:${install_path}/atc/python/site-packages/schedule_search.egg -export LD_LIBRARY_PATH=${install_path}/atc/lib64:$LD_LIBRARY_PATH -export ASCEND_OPP_PATH=${install_path}/opp - # 执行,转换VDSR模型成om格式 # Execute, transform VDSR model. -atc --model=./VDSR.prototxt --weight=./VDSR.caffemodel --framework=0 --input_format=NCHW --input_shape="data: 1, 1, 768, 768" --output=./VDSR_768_768 --soc_version=Ascend310 --output_type=FP32 --insert_op_conf=YUV420SP_U8_GRAY.cfg +atc --model=./VDSR.prototxt --weight=./VDSR.caffemodel --framework=0 --input_format=NCHW --input_shape="data: 1, 1, 768, 768" --output=./VDSR_768_768 --soc_version=Ascend310B1 --output_type=FP32 --insert_op_conf=YUV420SP_U8_GRAY.cfg ``` 执行完模型转换脚本后,会在model目录下生成相应的VDSR_768_768.om模型文件。 @@ -127,31 +119,6 @@ atc --model=./VDSR.prototxt --weight=./VDSR.caffemodel --framework=0 --input_for } ``` -### 配置环境变量 - -```bash -# 执行如下命令,打开.bashrc文件 -cd $HOME -vi .bashrc -# 在.bashrc文件中添加以下环境变量 -MX_SDK_HOME=${SDK安装路径} - -LD_LIBRARY_PATH=${MX_SDK_HOME}/lib:${MX_SDK_HOME}/opensource/lib:${MX_SDK_HOME}/opensource/lib64:/usr/local/Ascend/ascend-toolkit/latest/acllib/lib64:/usr/local/Ascend/driver/lib64/ - -GST_PLUGIN_SCANNER=${MX_SDK_HOME}/opensource/libexec/gstreamer-1.0/gst-plugin-scanner - -GST_PLUGIN_PATH=${MX_SDK_HOME}/opensource/lib/gstreamer-1.0:${MX_SDK_HOME}/lib/plugins - -PYTHONPATH=${MX_SDK_HOME}/python - -# 保存退出.bashrc文件 -# 执行如下命令使环境变量生效 -source ~/.bashrc - -# 查看环境变量 -env -``` - ## 运行 1) 准备一张测试图片,置于 image 文件夹中(仅支持jpg格式) @@ -159,8 +126,8 @@ env 2) 进入工程目录,键入执行指令,发起推理性能测试: ```python -python3 main.py ${测试图片路径} -例如: python3 main.py image/head.jpg +python main.py ${测试图片路径} +例如: python main.py image/head.jpg # 或者在main.py中配置 input_image_path input_image_path = 'image/${测试图片文件名}' # 仅支持jpg格式 diff --git a/contrib/SuperResolution/model/model_conversion.sh b/contrib/SuperResolution/model/model_conversion.sh deleted file mode 100644 index c1d5e2984..000000000 --- a/contrib/SuperResolution/model/model_conversion.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/bin/bash - -# Copyright(C) 2021. Huawei Technologies Co.,Ltd. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -set -e - -# 该脚本用来将caffe模型文件转换成.om模型文件 -# This is used to convert caffe model file to .om model file. - - -# 设置环境变量(请确认install_path路径是否正确) -# Set environment PATH (Please confirm that the install_path is correct). - -export install_path=/usr/local/Ascend/ascend-toolkit/latest -export PATH=/usr/local/python3.9.2/bin:${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATH -export PYTHONPATH=${install_path}/atc/python/site-packages:${install_path}/atc/python/site-packages/auto_tune.egg/auto_tune:${install_path}/atc/python/site-packages/schedule_search.egg -export LD_LIBRARY_PATH=${install_path}/atc/lib64:$LD_LIBRARY_PATH -export ASCEND_OPP_PATH=${install_path}/opp - - -# 执行,转换VDSR模型 -# Execute, transform VDSR model. - -atc --model=./VDSR.prototxt --weight=./VDSR.caffemodel --framework=0 --input_format=NCHW --input_shape="data: 1, 1, 768, 768" --output=./VDSR_768_768 --soc_version=Ascend310 --output_type=FP32 --insert_op_conf=YUV420SP_U8_GRAY.cfg -# 退出 -# exit -exit 0 \ No newline at end of file diff --git a/contrib/VideoGestureRecognition/README.md b/contrib/VideoGestureRecognition/README.md index ccf965049..ae75c953c 100644 --- a/contrib/VideoGestureRecognition/README.md +++ b/contrib/VideoGestureRecognition/README.md @@ -55,6 +55,7 @@ ```bash export PATH=/usr/local/ffmpeg/bin:$PATH export LD_LIBRARY_PATH=/usr/local/ffmpeg/lib:$LD_LIBRARY_PATH +export FFMPEG_path=/usr/local/ffmpeg/ ``` #### FFmpeg @@ -70,6 +71,12 @@ make install ``` ### 准备工作 +> 配置环境变量 + +``` +. /usr/local/Ascend/ascend-toolkit/set_env.sh #toolkit默认安装路径,根据实际安装路径修改 +. ${SDK_INSTALL_PATH}/mxVision/set_env.sh +``` > 模型转换 @@ -82,19 +89,10 @@ make install 在模型权重和网络文件所在目录下执行以下命令 ``` -# 设置环境变量(请确认install_path路径是否正确) -# Set environment PATH (Please confirm that the install_path is correct). - -export install_path=/usr/local/Ascend/ascend-toolkit/latest -export PATH=/usr/local/python3.9.2/bin:${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATH -export PYTHONPATH=${install_path}/atc/python/site-packages:${install_path}/atc/python/site-packages/auto_tune.egg/auto_tune:${install_path}/atc/python/site-packages/schedule_search.egg -export LD_LIBRARY_PATH=${install_path}/atc/lib64:$LD_LIBRARY_PATH -export ASCEND_OPP_PATH=${install_path}/opp - # 执行,转换Resnet18模型 # Execute, transform Resnet18 model. -atc --model=./resnet18_gesture.prototxt --weight=./resnet18_gesture.caffemodel --framework=0 --output=gesture_yuv --soc_version=Ascend310 --insert_op_conf=./insert_op.cfg --input_shape="data:1,3,224,224" --input_format=NCHW +atc --model=./resnet18_gesture.prototxt --weight=./resnet18_gesture.caffemodel --framework=0 --output=gesture_yuv --soc_version=Ascend310B1 --insert_op_conf=./insert_op.cfg --input_shape="data:1,3,224,224" --input_format=NCHW ``` 执行完模型转换脚本后,会生成相应的.om模型文件。 执行完模型转换脚本后,会生成相应的.om模型文件。 @@ -108,51 +106,31 @@ atc --model=./resnet18_gesture.prototxt --weight=./resnet18_gesture.caffemodel - main.cpp中配置rtsp流源地址(需要自行准备可用的视频流,视频流格式为H264)。 同样地测试视频也可下载([链接](https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/contrib/VideoGestureRecognition/data.zip))。 +```rtspList.emplace_back("#{本地或rtsp流地址}"); ``` + 提示:使用测试视频中的手势尺寸大致应为视频大小的二分之一,同时应当符合国际标准,背景要单一,手势要清晰,光线充足;视频切勿有遮挡,不清晰等情况。 [Live555拉流教程](../../docs/参考资料/Live555离线视频转RTSP说明文档.md) -```c++ rtspList.emplace_back("#{本地或rtsp流地址}"); ``` -[配置ResnetDetector插件的模型加载路径modelPath] -```c++ reasonerConfig.resnetModelPath = "${Resnet18.om模型路径}"``` +配置ResnetDetector插件的模型加载路径modelPath +```reasonerConfig.resnetModelPath = "${Resnet18.om模型路径}"``` 配置ResnetDetector插件的模型加载路径labelPath -```c++ reasonerConfig.resnetLabelPath = "${resnet18.names路径}";``` +```reasonerConfig.resnetLabelPath = "${resnet18.names路径}";``` 其他可配置项DECODE_FRAME_QUEUE_LENGTH DECODE_FRAME_WAIT_TIME SAMPLING_INTERVAL MAX_SAMPLING_INTERVAL -```c++ DECODE_FRAME_QUEUE_LENGTH = 100; DECODE_FRAME_WAIT_TIME = 10; SAMPLING_INTERVAL = 24; MAX_SAMPLING_INTERVAL = 100;``` - - -### 配置环境变量 - ``` -# 执行如下命令,打开.bashrc文件 -cd $HOME -vi .bashrc -# 在.bashrc文件中添加以下环境变量 -MX_SDK_HOME=${SDK安装路径} -FFMPEG_PATH=${FFMPEG安装路径} - -LD_LIBRARY_PATH=${MX_SDK_HOME}/lib:${MX_SDK_HOME}/opensource/lib:${MX_SDK_HOME}/opensource/lib64:${FFMPEG_PATH}/lib:/usr/local/Ascend/ascend-toolkit/latest/acllib/lib64:/usr/local/Ascend/driver/lib64/ - -GST_PLUGIN_SCANNER=${MX_SDK_HOME}/opensource/libexec/gstreamer-1.0/gst-plugin-scanner - -GST_PLUGIN_PATH=${MX_SDK_HOME}/opensource/lib/gstreamer-1.0:${MX_SDK_HOME}/lib/plugins - -# 保存退出.bashrc文件 -# 执行如下命令使环境变量生效 -source ~/.bashrc - -#查看环境变量 -env +DECODE_FRAME_QUEUE_LENGTH = 100; +DECODE_FRAME_WAIT_TIME = 10; +SAMPLING_INTERVAL = 24; +MAX_SAMPLING_INTERVAL = 100; ``` ### 配置SDK路径 -配置CMakeLists.txt文件中的`MX_SDK_HOME`与`FFMPEG_PATH`环境变量 +配置CMakeLists.txt文件中的`FFMPEG_PATH`环境变量 ``` -set(MX_SDK_HOME ${SDK安装路径}/mxVision) set(FFMPEG_PATH {ffmpeg实际安装路径}) ``` diff --git a/contrib/VideoGestureRecognition/build.sh b/contrib/VideoGestureRecognition/build.sh index 9de629ed7..16c270a03 100644 --- a/contrib/VideoGestureRecognition/build.sh +++ b/contrib/VideoGestureRecognition/build.sh @@ -22,11 +22,6 @@ cur_path=$(cd "$(dirname "$0")" || exit; pwd) # build type build_type="Release" -function prepare_env() -{ - export LD_LIBRARY_PATH=/usr/local/Ascend/ascend-toolkit/latest/acllib/lib64:/usr/local/Ascend/driver/lib64/:$LD_LIBRARY_PATH -} - function prepare_path() { if [ -d "$1" ]; then rm -rf "$1" @@ -40,7 +35,6 @@ function prepare_path() { function build() { echo "current dir: $cur_path" - prepare_env path_build=${cur_path}/build prepare_path "$path_build" diff --git a/contrib/msame/README.md b/contrib/msame/README.md index a9d2d5f01..02cbc9858 100644 --- a/contrib/msame/README.md +++ b/contrib/msame/README.md @@ -5,12 +5,11 @@ [msame-C++工具链接](https://gitee.com/ascend/tools/tree/master/msame) ### 1.1 支持的产品 -本项目以昇腾Atlas300I卡为主要的硬件平台。 +本项目以昇腾Atlas300卡为主要的硬件平台。 ### 1.2 支持的版本 -MindX SDK mxVision:2.0.4 -mxVision version:2.0.4.b096 -Plat: linux aarch64 +MindX SDK mxVision:5.0rc1 + ### 1.3 适用场景 使用于单输入或多输入模型推理 @@ -48,7 +47,7 @@ Plat: linux aarch64 | 软件名称 | 版本 | | -------- | ------ | | Python | 3.9.0 | -| mxVision | 2.0.4 | +| mxVision | 5.0RC1 | | numpy | 1.21.2 | 软件依赖说明: @@ -60,7 +59,8 @@ Plat: linux aarch64 在编译运行项目前,需要设置环境变量: ``` -source set_env.sh +. /usr/local/Ascend/ascend-toolkit/set_env.sh #toolkit默认安装路径,根据实际安装路径修改 +. ${SDK_INSTALL_PATH}/mxVision/set_env.sh ``` ## 3 依赖安装 diff --git a/contrib/msame/msame.py b/contrib/msame/msame.py index 742345ed9..7a95ea8e5 100644 --- a/contrib/msame/msame.py +++ b/contrib/msame/msame.py @@ -65,11 +65,11 @@ def infer(saves): os.makedirs(_output) m = sdk.model(_filepath, device_id) index = 0 - for i in m.output_dtype: + for i in range(m.output_num): types_output.append([]) - types_output[index].append(str(i)) + types_output[index].append(str(m.output_dtype(i))) index += 1 - types_input = str(m.input_dtype[0]) + types_input = str(m.input_dtyp(0)) multi = 1 f = [] if args.input != '': @@ -82,7 +82,7 @@ def infer(saves): else: print("Error: file doesn't exit") sys.exit(0) - if len(m.input_shape) == 1: + if m.input_num == 1: if os.path.isdir(args.input): isf = 0 for fi in os.listdir(args.input): @@ -167,12 +167,12 @@ def get_multi_dir(m, input_type, dirs): def get_input_num(m, input_type): inputsize = [] index = 0 - for j in m.input_shape: + for j in range(m.input_num): inputsize.append(1) - for k in j: + for k in m.input_shape(j): inputsize[index] *= k index += 1 - types_input = str(m.input_dtype[0]) + types_input = str(m.input_dtype(0)) files_name = [] tis = [] t = [] @@ -215,23 +215,25 @@ def get_input_num(m, input_type): def t_save(path, m, t, saves, types_output): multi = 1 - for p in m.input_shape[0]: + for p in m.input_shape(0): multi = multi * p if t[0][0].shape[0] != multi : print("Error : Please check the input shape and input dtype") sys.exit(0) - if len(m.input_shape) == 1: - tim = sdk.Tensor(t[0][0]) + if m.input_num == 1: + tim = sdk.Tensor(t[0][0].reshape(m.input_shape(0))) tim.to_device(device_id) else: - if len(t) != len(m.input_shape): + if len(t) != m.input_num: print("Error : Please check the input shape and input dtype") sys.exit(0) tim = [] + idx = 0 for bs in t: - bs = sdk.Tensor(bs[0]) + bs = sdk.Tensor(bs[0].reshape(m.input_shape(idx))) bs.to_device(device_id) tim.append(bs) + idx += 1 last_time = time.time() outputs = m.infer(tim) now_time = time.time() diff --git a/contrib/msame/set_env.sh b/contrib/msame/set_env.sh deleted file mode 100644 index 7beb513e1..000000000 --- a/contrib/msame/set_env.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash - -# Copyright (c) Huawei Technologies Co., Ltd. 2020-2021. All rights reserved. -# Description: SDK uninstallation tool. -# Author: MindX SDK -# Create: 2020 -# History: NA - -path="${BASH_SOURCE[0]}" - -if [[ -f "$path" ]] && [[ "$path" =~ 'set_env.sh' ]];then - sdk_path=$(cd $(dirname $path); pwd ) - - if [[ -f "$sdk_path"/filelist.txt ]] && [[ -f "$sdk_path"/version.info ]];then - export MX_SDK_HOME="$sdk_path" - export GST_PLUGIN_SCANNER="${MX_SDK_HOME}/opensource/libexec/gstreamer-1.0/gst-plugin-scanner" - export GST_PLUGIN_PATH="${MX_SDK_HOME}/opensource/lib/gstreamer-1.0":"${MX_SDK_HOME}/lib/plugins" - export LD_LIBRARY_PATH="${MX_SDK_HOME}/lib/modelpostprocessors":"${MX_SDK_HOME}/lib":"${MX_SDK_HOME}/opensource/lib":"${MX_SDK_HOME}/opensource/lib64":${LD_LIBRARY_PATH} - export PYTHONPATH=${MX_SDK_HOME}/python:$PYTHONPATH - else - echo "The package is incomplete, please check it." - fi -else - echo "There is no 'set_env.sh' to import" -fi - -- Gitee From bb0e3189c36dbec5c398fd068d520af9bc2431ab Mon Sep 17 00:00:00 2001 From: dailinrui <602182685@qq.com> Date: Sat, 18 Mar 2023 08:27:15 +0000 Subject: [PATCH 04/61] update contrib/PersonCount/README.md. Signed-off-by: dailinrui <602182685@qq.com> --- contrib/PersonCount/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contrib/PersonCount/README.md b/contrib/PersonCount/README.md index b73240bdd..6b953ff71 100644 --- a/contrib/PersonCount/README.md +++ b/contrib/PersonCount/README.md @@ -69,7 +69,7 @@ ### 1.5 技术实现流程图 (可放入流程图片) -![Image text](https://gitee.com/superman418/mindxsdk-referenceapps/raw/master/contrib/PersonCount/img/tech_arch.png) +![Image text](./img/tech_arch.png) ## 2 环境依赖 @@ -97,7 +97,7 @@ 修改main.py中的DATASET_PATH变量,该变量指向待检测的图片路径。修改main.py中gt_path变量,改变了指向待检测图片的groundtruth. 此外,如果想要得到pipeline中各个插件的具体运行时间, -可以修改mxManufacture SDK的sdk.conf文件,使得enable_ps变量为true. +可以修改SDK的sdk.conf文件,使得enable_ps变量为true. **步骤2** 设置环境变量 -- Gitee From bb51f72ace8d12812ac7ceb38b8558696c3a8b31 Mon Sep 17 00:00:00 2001 From: dailinrui <602182685@qq.com> Date: Sat, 18 Mar 2023 08:29:53 +0000 Subject: [PATCH 05/61] update contrib/msame/msame.py. Signed-off-by: dailinrui <602182685@qq.com> --- contrib/msame/msame.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/msame/msame.py b/contrib/msame/msame.py index 7a95ea8e5..320ebdb84 100644 --- a/contrib/msame/msame.py +++ b/contrib/msame/msame.py @@ -69,7 +69,7 @@ def infer(saves): types_output.append([]) types_output[index].append(str(m.output_dtype(i))) index += 1 - types_input = str(m.input_dtyp(0)) + types_input = str(m.input_dtype(0)) multi = 1 f = [] if args.input != '': -- Gitee From 00ab40b4749f515b36f1a9aba28756516bfaa9bd Mon Sep 17 00:00:00 2001 From: DlinR Date: Sat, 18 Mar 2023 17:03:47 +0800 Subject: [PATCH 06/61] no message --- contrib/PersonCount/main.py | 4 ++-- contrib/VideoGestureRecognition/README.md | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/contrib/PersonCount/main.py b/contrib/PersonCount/main.py index 7605a00c6..6da8312bb 100644 --- a/contrib/PersonCount/main.py +++ b/contrib/PersonCount/main.py @@ -154,8 +154,8 @@ if __name__ == '__main__': #load ground truth information #gt_num represents the person number of ground truth. #the ground truth needs to fix as specific path. - gt_path = "ShanghaiTech/part_B_test/GT_IMG_" + str(i) + ".mat" - data1 = sio.loadmat(gt_path) + GT_PATH = "ShanghaiTech/part_B_test/GT_IMG_" + str(i) + ".mat" + data1 = sio.loadmat(GT_PATH) gt_num = int(data1['image_info'][0][0][0][0][1][0][0]) GT_LIST.append(gt_num) #end time diff --git a/contrib/VideoGestureRecognition/README.md b/contrib/VideoGestureRecognition/README.md index ae75c953c..b804715d6 100644 --- a/contrib/VideoGestureRecognition/README.md +++ b/contrib/VideoGestureRecognition/README.md @@ -166,7 +166,6 @@ Scanning dependencies of target sample > ② 运行项目根目录下的`build.sh` ```bash -chmod +x build.sh bash build.sh ``` ### 执行脚本 @@ -174,7 +173,6 @@ bash build.sh 执行`run.sh`脚本前请先确认可执行文件`sample`已生成。 ``` -chmod +x run.sh bash run.sh ``` -- Gitee From f8f6361ca4e5c21524e3669b08c7fb6123d98e97 Mon Sep 17 00:00:00 2001 From: xuegangxiao Date: Mon, 20 Mar 2023 15:07:58 +0800 Subject: [PATCH 07/61] SDK postProcess sample adaption for 310B --- .../SamplePostProcess/src/samplepostprocess/SamplePostProcess.h | 2 +- tutorials/SamplePostProcess/src/yolov3/Yolov3PostProcess.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tutorials/SamplePostProcess/src/samplepostprocess/SamplePostProcess.h b/tutorials/SamplePostProcess/src/samplepostprocess/SamplePostProcess.h index a475a74b4..2bb605c64 100644 --- a/tutorials/SamplePostProcess/src/samplepostprocess/SamplePostProcess.h +++ b/tutorials/SamplePostProcess/src/samplepostprocess/SamplePostProcess.h @@ -35,7 +35,7 @@ namespace MxBase { SamplePostProcess &operator=(const SamplePostProcess &other); - bool IsValidTensors(const std::vector &tensors) const override; + bool IsValidTensors(const std::vector &tensors) const; private: uint32_t classNum_ = 0; diff --git a/tutorials/SamplePostProcess/src/yolov3/Yolov3PostProcess.h b/tutorials/SamplePostProcess/src/yolov3/Yolov3PostProcess.h index 2eb42b548..dfbfad788 100644 --- a/tutorials/SamplePostProcess/src/yolov3/Yolov3PostProcess.h +++ b/tutorials/SamplePostProcess/src/yolov3/Yolov3PostProcess.h @@ -66,7 +66,7 @@ namespace MxBase { const std::map > ¶mMap = {}) override; protected: - bool IsValidTensors(const std::vector &tensors) const override; + bool IsValidTensors(const std::vector &tensors) const; void ObjectDetectionOutput(const std::vector &tensors, std::vector > &objectInfos, -- Gitee From 2f15613e44208cab72fbc46c020ed278c93f7b5e Mon Sep 17 00:00:00 2001 From: xuegangxiao Date: Mon, 20 Mar 2023 17:44:06 +0800 Subject: [PATCH 08/61] =?UTF-8?q?=E5=9B=BE=E5=83=8F=E6=A3=80=E6=B5=8Bsampl?= =?UTF-8?q?e=E6=A0=B7=E4=BE=8B310B=E9=80=82=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tutorials/ImageDetectionSample/cpp/README.md | 136 ++++++++++++++++++ .../ImageDetectionSample/cpp/test.pipeline | 54 +++++++ tutorials/ImageDetectionSample/python/main.py | 2 +- 3 files changed, 191 insertions(+), 1 deletion(-) create mode 100644 tutorials/ImageDetectionSample/cpp/README.md create mode 100644 tutorials/ImageDetectionSample/cpp/test.pipeline diff --git a/tutorials/ImageDetectionSample/cpp/README.md b/tutorials/ImageDetectionSample/cpp/README.md new file mode 100644 index 000000000..df3a21c29 --- /dev/null +++ b/tutorials/ImageDetectionSample/cpp/README.md @@ -0,0 +1,136 @@ +# 图像检测样例命令行运行 + +## 介绍 + +提供的sample样例,实现对本地图片进行YOLOv3目标检测,生成可视化结果。 + +### 准备工作 + +> 模型转换 + +步骤1 在 + +**步骤1** 在ModelZoo上下载YOLOv3模型。[下载地址](https://www.hiascend.com/zh/software/modelzoo/detail/1/ba2a4c054a094ef595da288ecbc7d7b4) + +**步骤2** 将获取到的YOLOv3模型pb文件存放至:"样例项目所在目录/model/"。 + +**步骤3** 模型转换 + +在pb文件所在目录下执行一下命令 + +``` +# 设置环境变量(请确认install_path路径是否正确) +# Set environment PATH (Please confirm that the install_path is correct). + +export install_path=/usr/local/Ascend/ascend-toolkit/latest +export PATH=/usr/local/python3.9.2/bin:${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATH +export PYTHONPATH=${install_path}/atc/python/site-packages:${install_path}/atc/python/site-packages/auto_tune.egg/auto_tune:${install_path}/atc/python/site-packages/schedule_search.egg +export LD_LIBRARY_PATH=${install_path}/atc/lib64:$LD_LIBRARY_PATH +export ASCEND_OPP_PATH=${install_path}/opp + +# 执行,转换YOLOv3模型 +# Execute, transform YOLOv3 model. + +atc --model=./yolov3_tf.pb --framework=3 --output=./yolov3_tf_bs1_fp16 --soc_version=Ascend310 --insert_op_conf=./aipp_yolov3_416_416.aippconfig --input_shape="input:1,416,416,3" --out_nodes="yolov3/yolov3_head/Conv_6/BiasAdd:0;yolov3/yolov3_head/Conv_14/BiasAdd:0;yolov3/yolov3_head/Conv_22/BiasAdd:0" +# 说明:out_nodes制定了输出节点的顺序,需要与模型后处理适配。 +``` + +执行完模型转换脚本后,会生成相应的.om模型文件。 执行完模型转换脚本后,会生成相应的.om模型文件。 + +模型转换使用了ATC工具,如需更多信息请参考: + + https://gitee.com/ascend/docs-openmind/blob/master/guide/mindx/sdk/tutorials/%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99.md + +> 配置pipeline + +配置mxpi_tensorinfer插件的模型加载路径`modelPath` + +``` +"mxpi_tensorinfer0": { + "props": { + "dataSource": "mxpi_imageresize0", + "modelPath": "${yolov3.om模型路径}" + }, + "factory": "mxpi_tensorinfer", + "next": "mxpi_objectpostprocessor0" + }, +``` + +配置模型后处理插件mxpi_objectpostprocessor,`postProcessLibPath`的后处理库路径,路径根据SDK安装路径决定,可以通过`find -name libyolov3postprocess.so`搜索路径。 + +- eg: SDK安装路径/mxVision/lib/modelpostprocessors/libyolov3pos + +``` +"mxpi_objectpostprocessor0": { + "props": { + "dataSource": "mxpi_tensorinfer0", + "postProcessConfigPath": "model/yolov3_tf_bs1_fp16.cfg", + "labelPath": "${SDK安装路径}/samples/mxVision/models/yolov3/yolov3.names", + "postProcessLibPath": "${SDK安装路径}/lib/modelpostprocessors/libyolov3postprocess.so" + }, + "factory": "mxpi_objectpostprocessor", + "next": "appsink0" + }, +``` + +### 配置环境变量 + +``` +# 执行如下命令,打开.bashrc文件 +vi .bashrc +# 在.bashrc文件中添加以下环境变量 +MX_SDK_HOME=${SDK安装路径} + +LD_LIBRARY_PATH=${MX_SDK_HOME}/lib:${MX_SDK_HOME}/opensource/lib:${MX_SDK_HOME}/opensource/lib64:/usr/local/Ascend/ascend-toolkit/latest/acllib/lib64:/usr/local/Ascend/driver/lib64/ + +GST_PLUGIN_SCANNER=${MX_SDK_HOME}/opensource/libexec/gstreamer-1.0/gst-plugin-scanner + +GST_PLUGIN_PATH=${MX_SDK_HOME}/opensource/lib/gstreamer-1.0:${MX_SDK_HOME}/lib/plugins + +# 保存退出.bashrc文件 +# 执行如下命令使环境变量生效 +source ~/.bashrc + +#查看环境变量 +env +``` + +### 配置SDK路径 + +配置CMakeLists.txt文件中的`MX_SDK_HOME`环境变量 + +``` +set(MX_SDK_HOME ${SDK安装路径}/mxVision) +``` + +### 编译项目文件 + +新建立build目录,进入build执行cmake ..(..代表包含CMakeLists.txt的源文件父目录),在build目录下生成了编译需要的Makefile和中间文件。执行make构建工程,构建成功后就会生成可执行文件。 + +``` +mkdir build + +cd build + +cmake .. + +make +Scanning dependencies of target sample +[ 50%] Building CXX object CMakeFiles/sample.dir/main.cpp.o +[100%] Linking CXX executable ../sample +[100%] Built target sample +# sample就是CMakeLists文件中指定生成的可执行文件。 +``` + +### 执行脚本 + +执行run.sh脚本前请先确认可执行文件sample已生成。 + +``` +chmod +x run.sh +bash run.sh +``` + +### 查看结果 + +执行run.sh完毕后,sample会将目标检测结果保存在工程目录下`result.jpg`中。 \ No newline at end of file diff --git a/tutorials/ImageDetectionSample/cpp/test.pipeline b/tutorials/ImageDetectionSample/cpp/test.pipeline new file mode 100644 index 000000000..bbf2573b9 --- /dev/null +++ b/tutorials/ImageDetectionSample/cpp/test.pipeline @@ -0,0 +1,54 @@ +{ + "detection": { + "stream_config": { + "deviceId": "0" + }, + "appsrc0": { + "props": { + "blocksize": "409600" + }, + "factory": "appsrc", + "next": "mxpi_imagedecoder0" + }, + "mxpi_imagedecoder0": { + "props": { + "deviceId": "0" + }, + "factory": "mxpi_imagedecoder", + "next": "mxpi_imageresize0" + }, + "mxpi_imageresize0": { + "props": { + "dataSource": "mxpi_imagedecoder0", + "resizeHeight": "416", + "resizeWidth": "416" + }, + "factory": "mxpi_imageresize", + "next": "mxpi_tensorinfer0" + }, + "mxpi_tensorinfer0": { + "props": { + "dataSource": "mxpi_imageresize0", + "modelPath": "${yolov3.om模型路径}" + }, + "factory": "mxpi_tensorinfer", + "next": "mxpi_objectpostprocessor0" + }, + "mxpi_objectpostprocessor0": { + "props": { + "dataSource": "mxpi_tensorinfer0", + "postProcessConfigPath": "model/yolov3_tf_bs1_fp16.cfg", + "labelPath": "${SDK安装路径}/samples/mxVision/models/yolov3/yolov3.names", + "postProcessLibPath": "${libyolov3postprocess.so路径}" + }, + "factory": "mxpi_objectpostprocessor", + "next": "appsink0" + }, + "appsink0": { + "props": { + "blocksize": "4096000" + }, + "factory": "appsink" + } + } +} diff --git a/tutorials/ImageDetectionSample/python/main.py b/tutorials/ImageDetectionSample/python/main.py index 444929084..56b2e9ca6 100644 --- a/tutorials/ImageDetectionSample/python/main.py +++ b/tutorials/ImageDetectionSample/python/main.py @@ -74,7 +74,7 @@ if __name__ == '__main__': "props": { "dataSource": "mxpi_tensorinfer0", "postProcessConfigPath": "models/yolov3_tf_bs1_fp16.cfg", - "labelPath": "models/coco.names", + "labelPath": "${SDK安装路径}/samples/mxVision/models/yolov3/yolov3.names", "postProcessLibPath": "${SDK安装路径}/lib/modelpostprocessors/libyolov3postprocess.so" }, "factory": "mxpi_objectpostprocessor", -- Gitee From 1b6f0b3c5a7367aee42e216bbb149dce528e4c9d Mon Sep 17 00:00:00 2001 From: xuegangxiao Date: Mon, 20 Mar 2023 17:46:16 +0800 Subject: [PATCH 09/61] =?UTF-8?q?=E5=9B=BE=E5=83=8F=E6=A3=80=E6=B5=8Bsampl?= =?UTF-8?q?e=E6=A0=B7=E4=BE=8B310B=E9=80=82=E9=85=8D(label=20filename/path?= =?UTF-8?q?name)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tutorials/ImageDetectionSample/C++/README.md | 136 ------------------ .../ImageDetectionSample/C++/test.pipeline | 54 ------- .../{C++ => cpp}/CMakeLists.txt | 0 tutorials/ImageDetectionSample/cpp/README.md | 5 +- .../{C++ => cpp}/main.cpp | 0 .../model/aipp_yolov3_416_416.aippconfig | 0 .../{C++ => cpp}/model/yolov3_tf_bs1_fp16.cfg | 0 .../ImageDetectionSample/{C++ => cpp}/run.sh | 0 8 files changed, 4 insertions(+), 191 deletions(-) delete mode 100644 tutorials/ImageDetectionSample/C++/README.md delete mode 100644 tutorials/ImageDetectionSample/C++/test.pipeline rename tutorials/ImageDetectionSample/{C++ => cpp}/CMakeLists.txt (100%) rename tutorials/ImageDetectionSample/{C++ => cpp}/main.cpp (100%) rename tutorials/ImageDetectionSample/{C++ => cpp}/model/aipp_yolov3_416_416.aippconfig (100%) rename tutorials/ImageDetectionSample/{C++ => cpp}/model/yolov3_tf_bs1_fp16.cfg (100%) rename tutorials/ImageDetectionSample/{C++ => cpp}/run.sh (100%) diff --git a/tutorials/ImageDetectionSample/C++/README.md b/tutorials/ImageDetectionSample/C++/README.md deleted file mode 100644 index 3bc16d2ee..000000000 --- a/tutorials/ImageDetectionSample/C++/README.md +++ /dev/null @@ -1,136 +0,0 @@ -# 图像检测样例命令行运行 - -## 介绍 - -提供的sample样例,实现对本地图片进行YOLOv3目标检测,生成可视化结果。 - -### 准备工作 - -> 模型转换 - -步骤1 在 - -**步骤1** 在ModelZoo上下载YOLOv3模型。[下载地址](https://www.hiascend.com/zh/software/modelzoo/detail/1/ba2a4c054a094ef595da288ecbc7d7b4) - -**步骤2** 将获取到的YOLOv3模型pb文件存放至:"样例项目所在目录/model/"。 - -**步骤3** 模型转换 - -在pb文件所在目录下执行一下命令 - -``` -# 设置环境变量(请确认install_path路径是否正确) -# Set environment PATH (Please confirm that the install_path is correct). - -export install_path=/usr/local/Ascend/ascend-toolkit/latest -export PATH=/usr/local/python3.9.2/bin:${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATH -export PYTHONPATH=${install_path}/atc/python/site-packages:${install_path}/atc/python/site-packages/auto_tune.egg/auto_tune:${install_path}/atc/python/site-packages/schedule_search.egg -export LD_LIBRARY_PATH=${install_path}/atc/lib64:$LD_LIBRARY_PATH -export ASCEND_OPP_PATH=${install_path}/opp - -# 执行,转换YOLOv3模型 -# Execute, transform YOLOv3 model. - -atc --model=./yolov3_tf.pb --framework=3 --output=./yolov3_tf_bs1_fp16 --soc_version=Ascend310 --insert_op_conf=./aipp_yolov3_416_416.aippconfig --input_shape="input:1,416,416,3" --out_nodes="yolov3/yolov3_head/Conv_6/BiasAdd:0;yolov3/yolov3_head/Conv_14/BiasAdd:0;yolov3/yolov3_head/Conv_22/BiasAdd:0" -# 说明:out_nodes制定了输出节点的顺序,需要与模型后处理适配。 -``` - -执行完模型转换脚本后,会生成相应的.om模型文件。 执行完模型转换脚本后,会生成相应的.om模型文件。 - -模型转换使用了ATC工具,如需更多信息请参考: - - https://gitee.com/ascend/docs-openmind/blob/master/guide/mindx/sdk/tutorials/%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99.md - -> 配置pipeline - -配置mxpi_tensorinfer插件的模型加载路径`modelPath` - -``` -"mxpi_tensorinfer0": { - "props": { - "dataSource": "mxpi_imageresize0", - "modelPath": "${yolov3.om模型路径}" - }, - "factory": "mxpi_tensorinfer", - "next": "mxpi_objectpostprocessor0" - }, -``` - -配置模型后处理插件mxpi_objectpostprocessor,`postProcessLibPath`的后处理库路径,路径根据SDK安装路径决定,可以通过`find -name libyolov3postprocess.so`搜索路径。 - -- eg: SDK安装路径/mxVision/lib/modelpostprocessors/libyolov3pos - -``` -"mxpi_objectpostprocessor0": { - "props": { - "dataSource": "mxpi_tensorinfer0", - "postProcessConfigPath": "model/yolov3_tf_bs1_fp16.cfg", - "labelPath": "${SDK安装路径}/samples/mxVision/models/yolov3/coco.names", - "postProcessLibPath": "${libyolov3postprocess.so路径}" - }, - "factory": "mxpi_objectpostprocessor", - "next": "appsink0" - }, -``` - -### 配置环境变量 - -``` -# 执行如下命令,打开.bashrc文件 -vi .bashrc -# 在.bashrc文件中添加以下环境变量 -MX_SDK_HOME=${SDK安装路径} - -LD_LIBRARY_PATH=${MX_SDK_HOME}/lib:${MX_SDK_HOME}/opensource/lib:${MX_SDK_HOME}/opensource/lib64:/usr/local/Ascend/ascend-toolkit/latest/acllib/lib64:/usr/local/Ascend/driver/lib64/ - -GST_PLUGIN_SCANNER=${MX_SDK_HOME}/opensource/libexec/gstreamer-1.0/gst-plugin-scanner - -GST_PLUGIN_PATH=${MX_SDK_HOME}/opensource/lib/gstreamer-1.0:${MX_SDK_HOME}/lib/plugins - -# 保存退出.bashrc文件 -# 执行如下命令使环境变量生效 -source ~/.bashrc - -#查看环境变量 -env -``` - -### 配置SDK路径 - -配置CMakeLists.txt文件中的`MX_SDK_HOME`环境变量 - -``` -set(MX_SDK_HOME ${SDK安装路径}/mxVision) -``` - -### 编译项目文件 - -新建立build目录,进入build执行cmake ..(..代表包含CMakeLists.txt的源文件父目录),在build目录下生成了编译需要的Makefile和中间文件。执行make构建工程,构建成功后就会生成可执行文件。 - -``` -mkdir build - -cd build - -cmake .. - -make -Scanning dependencies of target sample -[ 50%] Building CXX object CMakeFiles/sample.dir/main.cpp.o -[100%] Linking CXX executable ../sample -[100%] Built target sample -# sample就是CMakeLists文件中指定生成的可执行文件。 -``` - -### 执行脚本 - -执行run.sh脚本前请先确认可执行文件sample已生成。 - -``` -chmod +x run.sh -bash run.sh -``` - -### 查看结果 - -执行run.sh完毕后,sample会将目标检测结果保存在工程目录下`result.jpg`中。 \ No newline at end of file diff --git a/tutorials/ImageDetectionSample/C++/test.pipeline b/tutorials/ImageDetectionSample/C++/test.pipeline deleted file mode 100644 index 537631b9c..000000000 --- a/tutorials/ImageDetectionSample/C++/test.pipeline +++ /dev/null @@ -1,54 +0,0 @@ -{ - "detection": { - "stream_config": { - "deviceId": "0" - }, - "appsrc0": { - "props": { - "blocksize": "409600" - }, - "factory": "appsrc", - "next": "mxpi_imagedecoder0" - }, - "mxpi_imagedecoder0": { - "props": { - "deviceId": "0" - }, - "factory": "mxpi_imagedecoder", - "next": "mxpi_imageresize0" - }, - "mxpi_imageresize0": { - "props": { - "dataSource": "mxpi_imagedecoder0", - "resizeHeight": "416", - "resizeWidth": "416" - }, - "factory": "mxpi_imageresize", - "next": "mxpi_tensorinfer0" - }, - "mxpi_tensorinfer0": { - "props": { - "dataSource": "mxpi_imageresize0", - "modelPath": "${yolov3.om模型路径}" - }, - "factory": "mxpi_tensorinfer", - "next": "mxpi_objectpostprocessor0" - }, - "mxpi_objectpostprocessor0": { - "props": { - "dataSource": "mxpi_tensorinfer0", - "postProcessConfigPath": "model/yolov3_tf_bs1_fp16.cfg", - "labelPath": "${SDK安装路径}/samples/mxVision/models/yolov3/coco.names", - "postProcessLibPath": "${libyolov3postprocess.so路径}" - }, - "factory": "mxpi_objectpostprocessor", - "next": "appsink0" - }, - "appsink0": { - "props": { - "blocksize": "4096000" - }, - "factory": "appsink" - } - } -} diff --git a/tutorials/ImageDetectionSample/C++/CMakeLists.txt b/tutorials/ImageDetectionSample/cpp/CMakeLists.txt similarity index 100% rename from tutorials/ImageDetectionSample/C++/CMakeLists.txt rename to tutorials/ImageDetectionSample/cpp/CMakeLists.txt diff --git a/tutorials/ImageDetectionSample/cpp/README.md b/tutorials/ImageDetectionSample/cpp/README.md index df3a21c29..930c9785b 100644 --- a/tutorials/ImageDetectionSample/cpp/README.md +++ b/tutorials/ImageDetectionSample/cpp/README.md @@ -32,7 +32,10 @@ export ASCEND_OPP_PATH=${install_path}/opp # Execute, transform YOLOv3 model. atc --model=./yolov3_tf.pb --framework=3 --output=./yolov3_tf_bs1_fp16 --soc_version=Ascend310 --insert_op_conf=./aipp_yolov3_416_416.aippconfig --input_shape="input:1,416,416,3" --out_nodes="yolov3/yolov3_head/Conv_6/BiasAdd:0;yolov3/yolov3_head/Conv_14/BiasAdd:0;yolov3/yolov3_head/Conv_22/BiasAdd:0" -# 说明:out_nodes制定了输出节点的顺序,需要与模型后处理适配。 + +# 说明1:out_nodes制定了输出节点的顺序,需要与模型后处理适配。 +# 说明2:若用例执行在310B上,则--soc_version=Ascend310需修改为Ascend310B1 + ``` 执行完模型转换脚本后,会生成相应的.om模型文件。 执行完模型转换脚本后,会生成相应的.om模型文件。 diff --git a/tutorials/ImageDetectionSample/C++/main.cpp b/tutorials/ImageDetectionSample/cpp/main.cpp similarity index 100% rename from tutorials/ImageDetectionSample/C++/main.cpp rename to tutorials/ImageDetectionSample/cpp/main.cpp diff --git a/tutorials/ImageDetectionSample/C++/model/aipp_yolov3_416_416.aippconfig b/tutorials/ImageDetectionSample/cpp/model/aipp_yolov3_416_416.aippconfig similarity index 100% rename from tutorials/ImageDetectionSample/C++/model/aipp_yolov3_416_416.aippconfig rename to tutorials/ImageDetectionSample/cpp/model/aipp_yolov3_416_416.aippconfig diff --git a/tutorials/ImageDetectionSample/C++/model/yolov3_tf_bs1_fp16.cfg b/tutorials/ImageDetectionSample/cpp/model/yolov3_tf_bs1_fp16.cfg similarity index 100% rename from tutorials/ImageDetectionSample/C++/model/yolov3_tf_bs1_fp16.cfg rename to tutorials/ImageDetectionSample/cpp/model/yolov3_tf_bs1_fp16.cfg diff --git a/tutorials/ImageDetectionSample/C++/run.sh b/tutorials/ImageDetectionSample/cpp/run.sh similarity index 100% rename from tutorials/ImageDetectionSample/C++/run.sh rename to tutorials/ImageDetectionSample/cpp/run.sh -- Gitee From 3defcc010b1ef7f01c973cf5cadab2636c7a0356 Mon Sep 17 00:00:00 2001 From: xuegangxiao Date: Mon, 20 Mar 2023 22:26:20 +0800 Subject: [PATCH 10/61] =?UTF-8?q?mxBase=E5=9B=BE=E5=83=8F=E6=A3=80?= =?UTF-8?q?=E6=B5=8B=E6=A0=B7=E4=BE=8B310B=E9=80=82=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tutorials/mxBaseSample/yolov3PostProcess/Yolov3PostProcess.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/mxBaseSample/yolov3PostProcess/Yolov3PostProcess.h b/tutorials/mxBaseSample/yolov3PostProcess/Yolov3PostProcess.h index ec9f7ca11..847e54a4b 100644 --- a/tutorials/mxBaseSample/yolov3PostProcess/Yolov3PostProcess.h +++ b/tutorials/mxBaseSample/yolov3PostProcess/Yolov3PostProcess.h @@ -63,7 +63,7 @@ public: const std::vector &resizedImageInfos = {}, const std::map> ¶mMap = {}) override; protected: - bool IsValidTensors(const std::vector &tensors) const override; + bool IsValidTensors(const std::vector &tensors) const; void ObjectDetectionOutput(const std::vector &tensors, std::vector> &objectInfos, -- Gitee From 0d976f20c9651754774586a91241b88efbec8e0d Mon Sep 17 00:00:00 2001 From: xuegangxiao Date: Mon, 20 Mar 2023 22:27:16 +0800 Subject: [PATCH 11/61] =?UTF-8?q?mxBase=E5=9B=BE=E5=83=8F=E6=A3=80?= =?UTF-8?q?=E6=B5=8B=E6=A0=B7=E4=BE=8B310B=E9=80=82=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tutorials/mxBaseSample/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/mxBaseSample/README.md b/tutorials/mxBaseSample/README.md index 492de0579..753324574 100644 --- a/tutorials/mxBaseSample/README.md +++ b/tutorials/mxBaseSample/README.md @@ -25,7 +25,7 @@ export LD_LIBRARY_PATH=${install_path}/atc/lib64:$LD_LIBRARY_PATH export ASCEND_OPP_PATH=${install_path}/opp ``` -(2) 转换模型 +(2) 转换模型(若运行在310B上,模型转换时需将Ascend310修改为Ascend310B1) ``` atc --model=./yolov3_tf.pb --framework=3 --output=./yolov3_tf_bs1_fp16 --soc_version=Ascend310 --insert_op_conf=./aipp_yolov3_416_416.aippconfig --input_shape="input:1,416,416,3" --out_nodes="yolov3/yolov3_head/Conv_6/BiasAdd:0;yolov3/yolov3_head/Conv_14/BiasAdd:0;yolov3/yolov3_head/Conv_22/BiasAdd:0" ``` -- Gitee From 7631eb280e15a0529eb1915db2b61c51d2da9e49 Mon Sep 17 00:00:00 2001 From: DlinR Date: Tue, 21 Mar 2023 14:03:15 +0800 Subject: [PATCH 12/61] no message --- contrib/GestureKeypointDetection/README.md | 2 +- contrib/PersonCount/run.sh | 2 +- contrib/PortraitSegmentation/README.md | 2 +- contrib/SuperResolution/README.md | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/contrib/GestureKeypointDetection/README.md b/contrib/GestureKeypointDetection/README.md index eea8d109b..e0de8eb10 100644 --- a/contrib/GestureKeypointDetection/README.md +++ b/contrib/GestureKeypointDetection/README.md @@ -120,6 +120,6 @@ ATC run success, welcome to the next use. **步骤4** 图片检测。将关于人手手势的图片放在项目目录下,命名为 test.jpg。在该图片上进行检测,执行命令: ``` -python main.py test.jpg +python3 main.py test.jpg ``` 命令执行成功后在当前目录下生成检测结果文件 result_test.jpg,查看结果文件验证检测结果。 diff --git a/contrib/PersonCount/run.sh b/contrib/PersonCount/run.sh index f8a73cb75..69926ff0e 100644 --- a/contrib/PersonCount/run.sh +++ b/contrib/PersonCount/run.sh @@ -3,5 +3,5 @@ export LD_LIBRARY_PATH=${MX_SDK_HOME}/lib:${MX_SDK_HOME}/opensource/lib:${MX_SDK_HOME}/opensource/lib64:/usr/local/Ascend/ascend-toolkit/latest/acllib/lib64:/usr/local/Ascend/driver/lib64:${LD_LIBRARY_PATH} export PYTHONPATH=${MX_SDK_HOME}/python:${PYTHONPATH} -python main.py +python3 main.py exit \ No newline at end of file diff --git a/contrib/PortraitSegmentation/README.md b/contrib/PortraitSegmentation/README.md index 5654d3b94..95cd397de 100644 --- a/contrib/PortraitSegmentation/README.md +++ b/contrib/PortraitSegmentation/README.md @@ -92,7 +92,7 @@ mkdir result 默认的阈值参数为1。 ``` -例:python main.py data/background.jpg data/portrait.jpg 1 +例:python3 main.py data/background.jpg data/portrait.jpg 1 ``` 7. 查看结果 diff --git a/contrib/SuperResolution/README.md b/contrib/SuperResolution/README.md index cbdc9b417..f59d84540 100644 --- a/contrib/SuperResolution/README.md +++ b/contrib/SuperResolution/README.md @@ -126,8 +126,8 @@ atc --model=./VDSR.prototxt --weight=./VDSR.caffemodel --framework=0 --input_for 2) 进入工程目录,键入执行指令,发起推理性能测试: ```python -python main.py ${测试图片路径} -例如: python main.py image/head.jpg +python3 main.py ${测试图片路径} +例如: python3 main.py image/head.jpg # 或者在main.py中配置 input_image_path input_image_path = 'image/${测试图片文件名}' # 仅支持jpg格式 -- Gitee From 05d64151152742db52f980c5ef3a99e324b2b0ef Mon Sep 17 00:00:00 2001 From: DlinR Date: Tue, 21 Mar 2023 14:05:52 +0800 Subject: [PATCH 13/61] =?UTF-8?q?=E5=AE=A2=E6=B5=81=E7=BB=9F=E8=AE=A1?= =?UTF-8?q?=E9=80=82=E9=85=8D=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pipeline/passengerflowestimation.pipeline | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/contrib/PassengerflowEstimation/pipeline/passengerflowestimation.pipeline b/contrib/PassengerflowEstimation/pipeline/passengerflowestimation.pipeline index 646238ecd..cf77e2e19 100644 --- a/contrib/PassengerflowEstimation/pipeline/passengerflowestimation.pipeline +++ b/contrib/PassengerflowEstimation/pipeline/passengerflowestimation.pipeline @@ -90,6 +90,9 @@ "next": "mxpi_selectobject0" }, "mxpi_selectobject0": { + "props": { + "dataSource": "mxpi_objectpostprocessor0" + } "factory": "mxpi_selectobject", "next": "motV2" }, @@ -135,8 +138,6 @@ "next": "mxpi_opencvosd0:1" }, "mxpi_opencvosd0": { - "dataSourceImage": "queue2", - "dataSourceOsd": "queue11", "factory": "mxpi_opencvosd", "next": "queue9" }, -- Gitee From a30119df384284108522fb3addad332552ae121c Mon Sep 17 00:00:00 2001 From: bilei Date: Tue, 21 Mar 2023 16:20:12 +0800 Subject: [PATCH 14/61] Change the file name. --- contrib/HelmetIdentification/Test/select.py | 33 --------------------- 1 file changed, 33 deletions(-) delete mode 100644 contrib/HelmetIdentification/Test/select.py diff --git a/contrib/HelmetIdentification/Test/select.py b/contrib/HelmetIdentification/Test/select.py deleted file mode 100644 index d74aa0326..000000000 --- a/contrib/HelmetIdentification/Test/select.py +++ /dev/null @@ -1,33 +0,0 @@ -# Copyright 2021 Huawei Technologies Co., Ltd -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at - -# http://www.apache.org/licenses/LICENSE-2.0 - -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import os -import shutil -import cv2 - -with open("ImageSets/Main/test.txt", "r") as f: - data = f.readlines() - text_data = [] - for line in data: - line_new = line.strip('\n') # Remove the newline character of each element in the list - text_data.append(line_new) - print(text_data) - -path = 'JPEGImages' -save_path = 'TestImages' - -for item in os.listdir(path): - file_name = item.split('.')[0] - if file_name in text_data: - img = cv2.imread(path + '/' + item) - cv2.imwrite(save_path + '/' + file_name + ".jpg", img) \ No newline at end of file -- Gitee From 6909803e1760ad82cd668b80a8f5f55b3498ac0d Mon Sep 17 00:00:00 2001 From: DlinR Date: Tue, 21 Mar 2023 17:02:54 +0800 Subject: [PATCH 15/61] =?UTF-8?q?=E5=8F=A5=E5=AD=90=E6=83=85=E6=84=9F?= =?UTF-8?q?=E5=88=86=E7=B1=BB310B=E9=80=82=E9=85=8D=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contrib/SentimentAnalysis/README.md | 50 +++++-------------- .../SentimentAnalysis/mxBase/CMakeLists.txt | 3 +- .../sdk/pipeline/sentiment_analysis.pipeline | 2 +- 3 files changed, 15 insertions(+), 40 deletions(-) diff --git a/contrib/SentimentAnalysis/README.md b/contrib/SentimentAnalysis/README.md index 4f35804ca..04283c1ed 100644 --- a/contrib/SentimentAnalysis/README.md +++ b/contrib/SentimentAnalysis/README.md @@ -7,12 +7,12 @@ ### 1.1 支持的产品 -本项目以昇腾Atlas310卡为主要的硬件平台。 +本项目以昇腾Atlas310B卡为主要的硬件平台。 ### 1.2 支持的版本 -支持的SDK版本为2.0.4。 -支持的CANN版本为5.0.4。 +支持的SDK版本为5.0rc1。 +支持的CANN版本为6.2。 ### 1.3 软件方案介绍 @@ -100,7 +100,6 @@ | 软件名称 | 版本 | | -------- | ------ | | cmake | 3.10.2 | -| mxVision | 2.0.4 | | python | 3.9.2 | 确保环境中正确安装mxVision SDK。 @@ -108,25 +107,8 @@ 在编译运行项目前,需要设置环境变量: ``` -export MX_SDK_HOME=${SDK安装路径}/mxVision -export LD_LIBRARY_PATH=${MX_SDK_HOME}/lib:${MX_SDK_HOME}/opensource/lib:${MX_SDK_HOME}/opensource/lib64:/usr/local/Ascend/ascend-toolkit/latest/acllib/lib64:/usr/local/Ascend/driver/lib64:${LD_LIBRARY_PATH} -export PYTHONPATH=${MX_SDK_HOME}/python:${PYTHONPATH} - -export install_path=/usr/local/Ascend/ascend-toolkit/latest -export PATH=/usr/local/python3.9.2/bin:${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATH -export LD_LIBRARY_PATH=${install_path}/atc/lib64:$LD_LIBRARY_PATH -export ASCEND_OPP_PATH=${install_path}/opp -``` - -- 环境变量介绍 - -``` -MX_SDK_HOME:MindX SDK mxVision的根安装路径,用于包含MindX SDK提供的所有库和头文件。 -LD_LIBRARY_PATH:提供了MindX SDK已开发的插件和相关的库信息。 -install_path:ascend-toolkit的安装路径。 -PATH:添加python的执行路径和atc转换工具的执行路径。 -LD_LIBRARY_PATH:添加ascend-toolkit和MindX SDK提供的库目录路径。 -ASCEND_OPP_PATH:atc转换工具需要的目录。 +. /usr/local/Ascend/ascend-toolkit/set_env.sh #toolkit默认安装路径,根据实际安装路径修改 +. ${SDK_INSTALL_PATH}/mxVision/set_env.sh ``` ## 3 模型获取及转换 @@ -144,7 +126,7 @@ ASCEND_OPP_PATH:atc转换工具需要的目录。 cd $HOME/models/sentiment_analysis ``` -atc --model=./sentiment_analysis.pb --framework=3 --input_format=ND --output=./sentiment_analysis --input_shape="Input-Token:1,500;Input-Segment:1,500" --out_nodes="dense_1/Softmax:0" --soc_version=Ascend310 --op_select_implmode="high_precision" +atc --model=./sentiment_analysis.pb --framework=3 --input_format=ND --output=./sentiment_analysis --input_shape="Input-Token:1,500;Input-Segment:1,500" --out_nodes="dense_1/Softmax:0" --soc_version=Ascend310B1 --op_select_implmode="high_precision" ``` 执行成功后终端输出为: @@ -166,14 +148,7 @@ cp ./sentiment_analysis.om $HOME/mxbase/model/ **步骤3** 按照第 3 小节 模型获取及转换 中的步骤获得 om 模型文件。 -**步骤4** 将本项目代码的文件路径中出现的 ${SDK目录} 替换成自己SDK的存放目录,下面是需要替换的代码。 - -``` -mxBase目录下的CMakeList.txt中的第13行代码 set(MX_SDK_HOME ${SDK目录}) -sdk/pipeline目录下sentiment_analysis.pipeline文件中的第26行 "postProcessLibPath": "${SDK目录}/lib/modelpostprocessors/libresnet50postprocess.so" -``` - -**步骤5** pipeline项目运行在sdk目录下执行命令: +**步骤4** pipeline项目运行在sdk目录下执行命令: ``` python3 main.py @@ -181,18 +156,14 @@ python3 main.py 命令执行成功后在out目录下生成分类结果文件 prediction_label.txt,查看结果文件验证分类结果。 -**步骤6** mxBase项目在mxBase目录中,执行以下代码进行编译。 +**步骤5** mxBase项目在mxBase目录中,执行以下命令进行编译运行。 ``` mkdir build cd build cmake .. make -``` - -编译完成后,将可执行文件 mxBase_sentiment_analysis 移动到mxBase目录下,执行下面代码运行 -``` ./mxBase_sentiment_analysis ./data/sample.txt ``` @@ -202,7 +173,7 @@ make **步骤1** 按照第 4 小节 编译与运行 的步骤将样例运行成功。 -**步骤2** 从网址https://mindx.sdk.obs.myhuaweicloud.com/mindxsdk-referenceapps%20/contrib/BertTextClassification/data.zip下载后解压,将解压后的test.csv文件分别放在sdk/data目录和mxBase/data目录。 +**步骤2** 从网址 https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/contrib/SentimentAnalysis/data.zip 下载后解压,将解压后的test.csv文件分别放在sdk/data目录和mxBase/data目录。 **步骤3** pipeline项目中的精度测试文件为sdk/test目录下的test.py,将test.py移到sdk目录下,执行下面代码,得到pipeline的精度测试结果。 @@ -217,6 +188,9 @@ Test::test_accuracy(); ``` ## 5 其他问题 + 1.本项目的设计限制输入样例为文本文件,其他文件如图片、音频不能进行推理。 + 2.本项目的模型对中性数据进行分类时预测结果较差,可能有以下几个方面,一是对中性数据的分类本身有一定的难度;二是在训练模型时提供数据集中的中性数据较少,模型对于中性数据的分类效果并不好;三是在模型转换的过程中可能会存在精度的缺失。 +3.若使用者是采用的先将代码下载至本地,再上传至服务器的步骤运行代码,词表文件data/vocab.txt可能会编码异常,造成mxbase代码读取词表有误,精度下降的问题;建议使用者直接下载项目文件至服务器运行,避免该问题。 diff --git a/contrib/SentimentAnalysis/mxBase/CMakeLists.txt b/contrib/SentimentAnalysis/mxBase/CMakeLists.txt index 66573e3fe..7c215da4c 100644 --- a/contrib/SentimentAnalysis/mxBase/CMakeLists.txt +++ b/contrib/SentimentAnalysis/mxBase/CMakeLists.txt @@ -2,6 +2,7 @@ cmake_minimum_required(VERSION 3.10) project(mxBase_sentiment_analysis) set(CMAKE_CXX_STANDARD 14) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/") include_directories(./SentimentAnalysis) file(GLOB_RECURSE SentimentAnalysis ${PROJECT_SOURCE_DIR}/SentimentAnalysis/*cpp) include_directories(./test) @@ -10,7 +11,7 @@ set(TARGET mxBase_text_classification) add_compile_options(-std=c++11 -fPIE -fstack-protector-all -fPIC -Wl,-z,relro,-z,now,-z,noexecstack -s -pie -Wall) add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0 -Dgoogle=mindxsdk_private) -set(MX_SDK_HOME ${SDK目录}) +set(MX_SDK_HOME "$ENV{MX_SDK_HOME}") include_directories( ${MX_SDK_HOME}/include ${MX_SDK_HOME}/opensource/include diff --git a/contrib/SentimentAnalysis/sdk/pipeline/sentiment_analysis.pipeline b/contrib/SentimentAnalysis/sdk/pipeline/sentiment_analysis.pipeline index 8ee8aa55f..bdb5d944c 100644 --- a/contrib/SentimentAnalysis/sdk/pipeline/sentiment_analysis.pipeline +++ b/contrib/SentimentAnalysis/sdk/pipeline/sentiment_analysis.pipeline @@ -23,7 +23,7 @@ "dataSource": "mxpi_tensorinfer0", "postProcessConfigPath": "config/sentiment_analysis_aipp_tf.cfg", "labelPath": "config/sentiment_analysis_label.names", - "postProcessLibPath": "${SDK目录}lib/modelpostprocessors/libresnet50postprocess.so" + "postProcessLibPath": "libresnet50postprocess.so" }, "factory": "mxpi_classpostprocessor", "next": "appsink0" -- Gitee From 7efb9c4e006cd24ac06b87653244fe52b2e48eb5 Mon Sep 17 00:00:00 2001 From: bilei Date: Tue, 21 Mar 2023 17:18:26 +0800 Subject: [PATCH 16/61] Modify the HelmetIde. --- .../HelmetIdentification/Models/main-env.sh | 14 ------- contrib/HelmetIdentification/README.md | 38 +++++-------------- 2 files changed, 10 insertions(+), 42 deletions(-) delete mode 100644 contrib/HelmetIdentification/Models/main-env.sh diff --git a/contrib/HelmetIdentification/Models/main-env.sh b/contrib/HelmetIdentification/Models/main-env.sh deleted file mode 100644 index 7cbd319a4..000000000 --- a/contrib/HelmetIdentification/Models/main-env.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash - -export MX_SDK_HOME=${MX_SDK_HOME} -export install_path=/usr/local/Ascend/ascend-toolkit/latest -export PATH=/usr/local/python3.9.2/bin:/usr/local/ffmpeg/bin/:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin -export PYTHONPATH=/usr/local/python3.9.2/bin:${MX_SDK_HOME}/python -export LD_LIBRARY_PATH=${MX_SDK_HOME}/lib:${MX_SDK_HOME}/opensource/lib:${MX_SDK_HOME}/opensource/lib64:${install_path}/acllib/lib64:/usr/local/Ascend/driver/lib64:${MX_SDK_HOME}/include:${MX_SDK_HOME}/python - -export GST_PLUGIN_SCANNER=${MX_SDK_HOME}/opensource/libexec/gstreamer-1.0/gst-plugin-scanner -export GST_PLUGIN_PATH=${MX_SDK_HOME}/opensource/lib/gstreamer-1.0:${MX_SDK_HOME}/lib/plugins -export ASCEND_OPP_PATH=${install_path}/opp -export GST_DEBUG=3 - -# ${MX_SDK_HOME}为远程SDK安装路径 \ No newline at end of file diff --git a/contrib/HelmetIdentification/README.md b/contrib/HelmetIdentification/README.md index 61f6b0eb4..40bbe0e25 100644 --- a/contrib/HelmetIdentification/README.md +++ b/contrib/HelmetIdentification/README.md @@ -6,7 +6,7 @@ ### 1.1 支持的产品 -昇腾310(推理) +昇腾310(推理)、昇腾310B(推理) ### 1.2 支持的版本 @@ -29,7 +29,6 @@ MindX SDK安装前准备可参考《用户指南》,[安装教程](https://git ├──Helmet_yolov5.cfg #后处理配置文件 ├──HelmetDetection.pipline # 安全帽识别推理流程pipline ├──imgclass.names # 模型所有可识别类 - ├──main-env.sh # 环境变量设置脚本 ├──main.py # 推理运行程序 ├──modify_yolov5s_slice.py #slice算子修改脚本 ├──dy_resize.py # resize算子修改 @@ -38,7 +37,7 @@ MindX SDK安装前准备可参考《用户指南》,[安装教程](https://git ├──MxpiSelectedFrame # 跳帧插件 ├── Test ├──performance_test_main.py # 性能测试脚本 - ├──select.py # 测试集筛选脚本 + ├──test_select.py # 测试集筛选脚本 ├──parse_voc.py # 测试数据集解析脚本 ├──testmain.py # 测试主程序 ├──map_calculate.py # 精度计算程序 @@ -66,29 +65,12 @@ MindX SDK安装前准备可参考《用户指南》,[安装教程](https://git -在运行脚本main.py前(2.2章节),需要通过环境配置脚本main-env.sh设置环境变量,运行命令: +在运行脚本main.py前(2.2章节),需要执行如下两个环境配置脚本设置环境变量,运行命令: ```shell -source main-env.sh +. /usr/local/Ascend/ascend-toolkit/set_env.sh # Ascend-cann-toolkit开发套件包默认安装路径,根据实际安装路径修改 +. ${MX_SDK_HOME}/mxVision/set_env.sh # ${MX_SDK_HOME}替换为用户的SDK安装路径 ``` -- 环境变量介绍 - -```bash -export MX_SDK_HOME=${MX_SDK_HOME} -export install_path=/usr/local/Ascend/ascend-toolkit/latest -export PATH=/usr/local/python3.9.2/bin:${install_path}/arm64-linux/atc/ccec_compiler/bin:${install_path}/arm64-linux/atc/bin:${install_path}/atc/bin -export PYTHONPATH=/usr/local/python3.9.2/bin:${MX_SDK_HOME}/python -export ${MX_SDK_HOME}/lib:${MX_SDK_HOME}/opensource/lib:${MX_SDK_HOME}/opensource/lib64:${install_path}/acllib/lib64:/usr/local/Ascend/driver/lib64:${MX_SDK_HOME}/include:${MX_SDK_HOME}/python - -export GST_PLUGIN_SCANNER=${MX_SDK_HOME}/opensource/libexec/gstreamer-1.0/gst-plugin-scanner -export GST_PLUGIN_PATH=${MX_SDK_HOME}/opensource/lib/gstreamer-1.0:${MX_SDK_HOME}/lib/plugins -export ASCEND_OPP_PATH=${install_path}/opp -export GST_DEBUG=3 -``` - -注:其中SDK安装路径${MX_SDK_HOME}替换为用户的SDK安装路径;install_path替换为开发套件包所在路径。LD_LIBRARY_PATH用以加载开发套件包中llib库。GST_DEBUG用以mxpi_rtspsrc取流地址配置不正确时出现warning日志提示。 - - ## 3.推理 @@ -141,13 +123,13 @@ python3 modify_yolov5s_slice.py YOLOv5_s.onnx 可以得到修改好后的YOLOv5_s.onnx模型 -3. 最后运行atc-env脚本将onnx转为om模型,运行命令如下: +3. 最后运行atc-env脚本将onnx转为om模型,运行命令如下。注意若推理芯片为310B,需将atc-env脚本中模型转换atc命令中的soc_version参数设置为Ascend310B1。 ```shell sh atc-env.sh ``` -提示 **ATC run success** 说明转换成功 +提示 **ATC run success** 说明转换成功。 脚本中包含atc命令: @@ -316,13 +298,13 @@ python3 performance_test_main.py ├── JPEGImages # 数据集原图片 ``` -注:将数据集中的三个文件放置于项目的根目录Test文件下,与**select.py**同目录。 +注:将数据集中的三个文件放置于项目的根目录Test文件下,与**test_select.py**同目录。 ###### 3.2.2测试数据集筛选 -依据数据集中ImageSets文件夹中test.txt文件,从原始数据集中筛选出测试数据集,该程序**select.py**放在源码根目录Test中,在同目录下创建文件夹TestImages用来存储筛选的数据。在该目录下运行命令: +依据数据集中ImageSets文件夹中test.txt文件,从原始数据集中筛选出测试数据集,该程序**test_select.py**放在源码根目录Test中,在同目录下创建文件夹TestImages用来存储筛选的数据。在该目录下运行命令: ```shell -python3.9.2 select.py +python3.9.2 test_select.py ``` 程序运行后在根目录Test中会存放筛选出的测试集图片共1517张。 -- Gitee From 8df15c780eb442a53ffb2ae63f32555c915724ea Mon Sep 17 00:00:00 2001 From: bilei Date: Tue, 21 Mar 2023 18:26:56 +0800 Subject: [PATCH 17/61] Modify the FireDetection and FacemaskDetection. --- contrib/FireDetection/README.md | 4 +-- contrib/FireDetection/model/model_conver.sh | 6 +--- .../HelmetIdentification/Models/atc-env.sh | 6 +--- contrib/facemaskdetection/README.md | 36 +++++-------------- contrib/facemaskdetection/model_conversion.sh | 11 +----- 5 files changed, 13 insertions(+), 50 deletions(-) diff --git a/contrib/FireDetection/README.md b/contrib/FireDetection/README.md index eb042cd40..adffeb172 100644 --- a/contrib/FireDetection/README.md +++ b/contrib/FireDetection/README.md @@ -2,7 +2,7 @@ ## 1 介绍 -高速公路车辆火灾识别基于 MindX SDK 开发,在 Ascend 310 芯片上进行目标检测,将检测结果保存成图片。项目主要流程为:通过 live555 服务器进行拉流输入视频,然后进行视频解码将 H.264 格式的视频解码为图片,图片缩放后经过模型推理进行火焰和烟雾检测,识别结果经过后处理后利用 cv 可视化识别框,如果检测到烟雾和火灾进行告警。 +高速公路车辆火灾识别基于 MindX SDK 开发,可在 Ascend 310 及 Ascend 310B 芯片上进行目标检测,将检测结果保存成图片。项目主要流程为:通过 live555 服务器进行拉流输入视频,然后进行视频解码将 H.264 格式的视频解码为图片,图片缩放后经过模型推理进行火焰和烟雾检测,识别结果经过后处理后利用 cv 可视化识别框,如果检测到烟雾和火灾进行告警。 ### 1.1 支持的产品 @@ -110,7 +110,7 @@ export PYTHONPATH="${MX_SDK_HOME}/python:${PYTHONPATH}" 运行结果:生成`best_s_t.onnx`文件。 -- **步骤5** 将`best_s_t.onnx`文件重命名为`firedetection.onnx`,然后运行当前目录`FireDetection\model`下的`model_conver.sh` +- **步骤5** 将`best_s_t.onnx`文件重命名为`firedetection.onnx`,然后运行当前目录`FireDetection\model`下的`model_conver.sh`。注意若推理芯片为310B,需将atc-env脚本中模型转换atc命令中的soc_version参数设置为Ascend310B1。 ```bash bash model_conver.sh diff --git a/contrib/FireDetection/model/model_conver.sh b/contrib/FireDetection/model/model_conver.sh index 9700b8ba7..b15ec6c48 100644 --- a/contrib/FireDetection/model/model_conver.sh +++ b/contrib/FireDetection/model/model_conver.sh @@ -13,11 +13,7 @@ # limitations under the License. # set ATC environment variate -export install_path=/usr/local/Ascend/ascend-toolkit/latest -export PATH=/usr/local/python3.9.2/bin:${install_path}/arm64-linux/atc/ccec_compiler/bin:${install_path}/arm64-linux/atc/bin:$PATH -export PYTHONPATH=${install_path}/arm64-linux/atc/python/site-packages:${install_path}/arm64-linux/atc/python/site-packages/auto_tune.egg/auto_tune:${install_path}/arm64-linux/atc/python/site-packages/schedule_search.egg -export LD_LIBRARY_PATH=${install_path}/arm64-linux/atc/lib64:$LD_LIBRARY_PATH -export ASCEND_OPP_PATH=${install_path}/opp +. /usr/local/Ascend/ascend-toolkit/set_env.sh # The path where Ascend-cann-toolkit is located # atc transform model atc \ diff --git a/contrib/HelmetIdentification/Models/atc-env.sh b/contrib/HelmetIdentification/Models/atc-env.sh index 2afbfa4dc..fa4c4c260 100644 --- a/contrib/HelmetIdentification/Models/atc-env.sh +++ b/contrib/HelmetIdentification/Models/atc-env.sh @@ -1,11 +1,7 @@ #!/bin/bash # This is used to convert onnx model file to .om model file. -export install_path=/usr/local/Ascend/ascend-toolkit/latest -export PATH=/usr/local/python3.9.2/bin:${install_path}/arm64-linux/atc/ccec_compiler/bin:${install_path}/arm64-linux/atc/bin:$PATH -export PYTHONPATH=${install_path}/arm64-linux/atc/python/site-packages:${install_path}/arm64-linux/atc/python/site-packages/auto_tune.egg/auto_tune:${install_path}/arm64-linux/atc/python/site-packages/schedule_search.egg -export LD_LIBRARY_PATH=${install_path}/arm64-linux/atc/lib64:$LD_LIBRARY_PATH -export ASCEND_OPP_PATH=${install_path}/opp +. /usr/local/Ascend/ascend-toolkit/set_env.sh # The path where Ascend-cann-toolkit is located export Home="./path/" # Home is set to the path where the model is located diff --git a/contrib/facemaskdetection/README.md b/contrib/facemaskdetection/README.md index bb9f1ade7..535924b7a 100644 --- a/contrib/facemaskdetection/README.md +++ b/contrib/facemaskdetection/README.md @@ -5,7 +5,7 @@ ### 1.1 支持的产品 -本项目以昇腾Atlas310卡为主要的硬件平台。 +本项目以昇腾Atlas310、Atlas310B卡为主要的硬件平台。 ### 1.2 支持的版本 @@ -54,25 +54,13 @@ CANN版本为5.0.4。 | opencv-python | 4.5.2.54 | 用于识别结果画框 | python3 -m pip install opencv-python | -在编译运行项目前,需要设置环境变量: +在编译运行项目前,需要执行如下两个环境配置脚本设置环境变量: -- 环境变量介绍 - -``` -export MX_SDK_HOME=${MX_SDK_HOME} -export install_path=/usr/local/Ascend/ascend-toolkit/latest -export PATH=/usr/local/python3.9.2/bin:${install_path}/arm64-linux/atc/ccec_compiler/bin:${install_path}/arm64-linux/atc/bin:${install_path}/atc/bin:$PATH -export PYTHONPATH=/usr/local/python3.9.2/bin:${MX_SDK_HOME}/python -export ${MX_SDK_HOME}/lib:${MX_SDK_HOME}/opensource/lib:${MX_SDK_HOME}/opensource/lib64:${install_path}/acllib/lib64:/usr/local/Ascend/driver/lib64:${MX_SDK_HOME}/include:${MX_SDK_HOME}/python - -export GST_PLUGIN_SCANNER=${MX_SDK_HOME}/opensource/libexec/gstreamer-1.0/gst-plugin-scanner -export GST_PLUGIN_PATH=${MX_SDK_HOME}/opensource/lib/gstreamer-1.0:${MX_SDK_HOME}/lib/plugins -export ASCEND_OPP_PATH=${install_path}/opp -export GST_DEBUG=3 +```shell +. /usr/local/Ascend/ascend-toolkit/set_env.sh # Ascend-cann-toolkit开发套件包默认安装路径,根据实际安装路径修改 +. ${MX_SDK_HOME}/mxVision/set_env.sh # ${MX_SDK_HOME}替换为用户的SDK安装路径 ``` - - ## 依赖下载 所用模型与软件依赖如下表所示。 @@ -92,21 +80,13 @@ export GST_DEBUG=3 pb文件转换为om文件 -1. 设置环境变量: +1. 执行如下脚本设置环境变量: ``` -export install_path=/usr/local/Ascend/ascend-toolkit/latest - -export PATH=/usr/local/python3.9.2/bin:${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATH - -export PYTHONPATH=${install_path}/atc/python/site-packages:${install_path}/atc/python/site-packages/auto_tune.egg/auto_tune:${install_path}/atc/python/site-packages/schedule_search.egg - -export LD_LIBRARY_PATH=${install_path}/atc/lib64:$LD_LIBRARY_PATH - -export ASCEND_OPP_PATH=${install_path}/opp +. /usr/local/Ascend/ascend-toolkit/set_env.sh # Ascend-cann-toolkit开发套件包默认安装路径,根据实际安装路径修改 ``` -2. 运行atc工具将pb模型文件转为om模型,运行命令如下: +2. 运行atc工具将pb模型文件转为om模型,运行命令如下。注意若推理芯片为310B,需将atc-env脚本中模型转换atc命令中的soc_version参数设置为Ascend310B1。 ``` atc --model=./face_mask_detection.pb --framework=3 --output=./aipp --output_type=FP32 --soc_version=Ascend310 --input_shape="data_1:1,260,260,3" --input_format=NHWC --insert_op_conf=./face_mask.aippconfig diff --git a/contrib/facemaskdetection/model_conversion.sh b/contrib/facemaskdetection/model_conversion.sh index 0ef69f345..b2f24f988 100644 --- a/contrib/facemaskdetection/model_conversion.sh +++ b/contrib/facemaskdetection/model_conversion.sh @@ -22,16 +22,7 @@ # 设置环境变量(请确认install_path路径是否正确) # Set environment PATH (Please confirm that the install_path is correct). -export install_path=/usr/local/Ascend/ascend-toolkit/latest - -export PATH=/usr/local/python3.9.2/bin:${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATH - -export PYTHONPATH=${install_path}/atc/python/site-packages:${install_path}/atc/python/site-packages/auto_tune.egg/auto_tune:${install_path}/atc/python/site-packages/schedule_search.egg - -export LD_LIBRARY_PATH=${install_path}/atc/lib64:$LD_LIBRARY_PATH - -export ASCEND_OPP_PATH=${install_path}/opp - +. /usr/local/Ascend/ascend-toolkit/set_env.sh # The path where Ascend-cann-toolkit is located atc --model=./face_mask_detection.pb --framework=3 --output=./aipp --output_type=FP32 --soc_version=Ascend310 --input_shape="data_1:1,260,260,3" --input_format=NHWC --insert_op_conf=./face_mask.aippconfig \ No newline at end of file -- Gitee From c9da1a571fda07812e096253941e99a5f45e30e6 Mon Sep 17 00:00:00 2001 From: xuegangxiao Date: Wed, 22 Mar 2023 10:23:13 +0800 Subject: [PATCH 18/61] =?UTF-8?q?=E3=80=90=E4=BF=AE=E6=94=B9=E8=AF=B4?= =?UTF-8?q?=E6=98=8E=20Modification=E3=80=91=20README=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=EF=BC=8C310B=E9=80=82=E9=85=8D=20=E3=80=90=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E4=BA=BA=20Modifier=E3=80=91=20=E8=96=9B=E6=B8=AF=E6=BD=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tutorials/ImageDetectionSample/cpp/README.md | 9 ++++----- .../PipelineInputOutputSample/C++/README.md | 5 +---- tutorials/mxBaseSample/README.md | 17 ++++------------- tutorials/mxBaseVideoSample/README.md | 13 +++++++------ 4 files changed, 16 insertions(+), 28 deletions(-) diff --git a/tutorials/ImageDetectionSample/cpp/README.md b/tutorials/ImageDetectionSample/cpp/README.md index 930c9785b..115f79534 100644 --- a/tutorials/ImageDetectionSample/cpp/README.md +++ b/tutorials/ImageDetectionSample/cpp/README.md @@ -22,11 +22,10 @@ # 设置环境变量(请确认install_path路径是否正确) # Set environment PATH (Please confirm that the install_path is correct). -export install_path=/usr/local/Ascend/ascend-toolkit/latest -export PATH=/usr/local/python3.9.2/bin:${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATH -export PYTHONPATH=${install_path}/atc/python/site-packages:${install_path}/atc/python/site-packages/auto_tune.egg/auto_tune:${install_path}/atc/python/site-packages/schedule_search.egg -export LD_LIBRARY_PATH=${install_path}/atc/lib64:$LD_LIBRARY_PATH -export ASCEND_OPP_PATH=${install_path}/opp +```c +. /usr/local/Ascend/ascend-toolkit/set_env.sh # Ascend-cann-toolkit开发套件包默认安装路径,请根据实际安装路径修改。 + +``` # 执行,转换YOLOv3模型 # Execute, transform YOLOv3 model. diff --git a/tutorials/PipelineInputOutputSample/C++/README.md b/tutorials/PipelineInputOutputSample/C++/README.md index 1f4cb0c0b..b6362a95e 100644 --- a/tutorials/PipelineInputOutputSample/C++/README.md +++ b/tutorials/PipelineInputOutputSample/C++/README.md @@ -19,11 +19,8 @@ set(MX_SDK_HOME ${SDK安装路径}/mxVision) ### 配置环境变量 执行以下命令: - ``` -export MX_SDK_HOME="${CUR_PATH}/../../.." - -export LD_LIBRARY_PATH="${MX_SDK_HOME}/lib":"${MX_SDK_HOME}/opensource/lib":"${MX_SDK_HOME}/opensource/lib64":"/usr/local/Ascend/ascend-toolkit/latest/acllib/lib64":${LD_LIBRARY_PATH} +. ${MX_SDK_HOME}/set_env.sh # ${MX_SDK_HOME}替换为用户的SDK安装路径 ``` ### 编译运行 diff --git a/tutorials/mxBaseSample/README.md b/tutorials/mxBaseSample/README.md index 753324574..1d30b959a 100644 --- a/tutorials/mxBaseSample/README.md +++ b/tutorials/mxBaseSample/README.md @@ -15,14 +15,10 @@ Init > ReadImage >Resize > Inference >PostProcess >DeInit **步骤3** 执行模型转换命令 (1) 配置环境变量 -#### 设置环境变量(请确认install_path路径是否正确) +#### 设置toolkit环境变量(请确认install_path路径是否正确) #### Set environment PATH (Please confirm that the install_path is correct). ```c -export install_path=/usr/local/Ascend/ascend-toolkit/latest -export PATH=/usr/local/python3.9.2/bin:${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATH -export PYTHONPATH=${install_path}/atc/python/site-packages:${install_path}/atc/python/site-packages/auto_tune.egg/auto_tune:${install_path}/atc/python/site-packages/schedule_search.egg:$PYTHONPATH -export LD_LIBRARY_PATH=${install_path}/atc/lib64:$LD_LIBRARY_PATH -export ASCEND_OPP_PATH=${install_path}/opp +. /usr/local/Ascend/ascend-toolkit/set_env.sh # Ascend-cann-toolkit开发套件包默认安装路径,请根据实际安装路径修改。 ``` (2) 转换模型(若运行在310B上,模型转换时需将Ascend310修改为Ascend310B1) @@ -33,14 +29,9 @@ atc --model=./yolov3_tf.pb --framework=3 --output=./yolov3_tf_bs1_fp16 --soc_ver ## 编译与运行 **步骤1** 修改CMakeLists.txt文件 将set(MX_SDK_HOME ${SDK安装路径}) 中的${SDK安装路径}替换为实际的SDK安装路径 -**步骤2** 设置环境变量 -ASCEND_HOME Ascend安装的路径,一般为/usr/local/Ascend -LD_LIBRARY_PATH 指定程序运行时依赖的动态库查找路径,包括ACL,开源软件库,libmxbase.so以及libyolov3postprocess.so的路径 +**步骤2** 设置mxVision环境变量 ``` -export ASCEND_HOME=/usr/local/Ascend -export ASCEND_VERSION=nnrt/latest -export ARCH_PATTERN=. -export LD_LIBRARY_PATH=${MX_SDK_HOME}/lib/modelpostprocessors:${MX_SDK_HOME}/lib:${MX_SDK_HOME}/opensource/lib:${MX_SDK_HOME}/opensource/lib64:/usr/local/Ascend/driver/lib64:/usr/local/Ascend/ascend-toolkit/latest/acllib/lib64:${LD_LIBRARY_PATH} +. ${MX_SDK_HOME}/set_env.sh # ${MX_SDK_HOME}替换为用户的SDK安装路径 ``` **步骤3** cd到mxbase目录下,执行如下编译命令: diff --git a/tutorials/mxBaseVideoSample/README.md b/tutorials/mxBaseVideoSample/README.md index 229ae0317..98ccd437b 100644 --- a/tutorials/mxBaseVideoSample/README.md +++ b/tutorials/mxBaseVideoSample/README.md @@ -20,17 +20,18 @@ # 设置环境变量(请确认install_path路径是否正确) # Set environment PATH (Please confirm that the install_path is correct). -export install_path=/usr/local/Ascend/ascend-toolkit/latest -export PATH=/usr/local/python3.9.2/bin:${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATH -export PYTHONPATH=${install_path}/atc/python/site-packages:${install_path}/atc/python/site-packages/auto_tune.egg/auto_tune:${install_path}/atc/python/site-packages/schedule_search.egg -export LD_LIBRARY_PATH=${install_path}/atc/lib64:$LD_LIBRARY_PATH -export ASCEND_OPP_PATH=${install_path}/opp +```c +. /usr/local/Ascend/ascend-toolkit/set_env.sh # Ascend-cann-toolkit开发套件包默认安装路径,请根据实际安装路径修改。 + +``` # 执行,转换YOLOv3模型 # Execute, transform YOLOv3 model. atc --model=./yolov3_tf.pb --framework=3 --output=./yolov3_tf_bs1_fp16 --soc_version=Ascend310 --insert_op_conf=./aipp_yolov3_416_416.aippconfig --input_shape="input:1,416,416,3" --out_nodes="yolov3/yolov3_head/Conv_6/BiasAdd:0;yolov3/yolov3_head/Conv_14/BiasAdd:0;yolov3/yolov3_head/Conv_22/BiasAdd:0" -# 说明:out_nodes制定了输出节点的顺序,需要与模型后处理适配。 +# 说明1:out_nodes制定了输出节点的顺序,需要与模型后处理适配。 +# 说明2:若用例执行在310B上,则--soc_version=Ascend310需修改为Ascend310B1 + ``` 执行完模型转换脚本后,会生成相应的.om模型文件。 执行完模型转换脚本后,会生成相应的.om模型文件。 -- Gitee From b914bcddf2bfc17e74a4c2a76e9b26d48bd9b27a Mon Sep 17 00:00:00 2001 From: bilei Date: Thu, 23 Mar 2023 11:58:27 +0800 Subject: [PATCH 19/61] Modify the . --- contrib/OpenCVPlugin/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/OpenCVPlugin/README.md b/contrib/OpenCVPlugin/README.md index ec45cc389..195919652 100644 --- a/contrib/OpenCVPlugin/README.md +++ b/contrib/OpenCVPlugin/README.md @@ -12,7 +12,7 @@ ### 1.1 支持的产品 -本项目以昇腾Atlas310卡为主要的硬件平台。 +本项目以昇腾Atlas310、Atlas310B卡为主要的硬件平台。 ### 1.2 支持的版本 -- Gitee From ffcf5db1840095d24b64e9f4c32aee4f5b59a373 Mon Sep 17 00:00:00 2001 From: bilei Date: Thu, 23 Mar 2023 19:05:08 +0800 Subject: [PATCH 20/61] Modify the FCOS. --- contrib/FCOS/README.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/contrib/FCOS/README.md b/contrib/FCOS/README.md index a8aadca92..9e0742735 100644 --- a/contrib/FCOS/README.md +++ b/contrib/FCOS/README.md @@ -11,7 +11,7 @@ ### 1.1支持的产品 -本产品以昇腾310(推理)卡为硬件平台。 +本产品以昇腾310(推理)、310B(推理)卡为硬件平台。 ### 1.2支持的版本 @@ -109,7 +109,7 @@ pip3 install mmdet ## 4 模型转换 -本项目使用的模型是FCOS目标检测模型这个模型是一个无anchor检测器。FCOS直接把预测特征图上的每个位置$(x,y)$当作训练样本,若这个位置在某个ground truth box的内部,则视为正样本,该位置的类别标签$c$对应这个box的类别,反之则视为负样本。这个网络的输出为目标框的左上角坐标、右下角坐标、类别和置信度。本项目的onnx模型可以直接[下载](https://www.hiascend.com/zh/software/modelzoo/models/detail/1/6fcc4747a48245d29351c26cd052dd13)。下载后,里面自带的om模型是可以直接使用的,或者自行使用ATC工具将onnx模型转换成为om模型,模型转换工具的使用说明参考[链接](https://gitee.com/ascend/docs-openmind/blob/master/guide/mindx/sdk/tutorials/%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99.md)。 +本项目使用的模型是FCOS目标检测模型这个模型是一个无anchor检测器。FCOS直接把预测特征图上的每个位置$(x,y)$当作训练样本,若这个位置在某个ground truth box的内部,则视为正样本,该位置的类别标签$c$对应这个box的类别,反之则视为负样本。这个网络的输出为目标框的左上角坐标、右下角坐标、类别和置信度。本项目的onnx模型可以直接[下载](https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/contrib/Fcos/ATC%20Fcos.zip)。下载后,里面自带的om模型是可以直接使用的,或者自行使用ATC工具将onnx模型转换成为om模型,模型转换工具的使用说明参考[链接](https://gitee.com/ascend/docs-openmind/blob/master/guide/mindx/sdk/tutorials/%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99.md)。 模型转换步骤如下: @@ -117,10 +117,13 @@ pip3 install mmdet 2.进入models文件夹目录下,设置环境变量如下: +``` +. /usr/local/Ascend/ascend-toolkit/set_env.sh # Ascend-cann-toolkit开发套件包默认安装路径,根据实际安装路径修改 +``` 设置完环境变量之后,就进行模型的转换: -模型转换语句如下: +模型转换语句如下,注意若推理芯片为310B,需将atc-env脚本中模型转换atc命令中的soc_version参数设置为Ascend310B1。 ``` atc --model=fcos.onnx --framework=5 --soc_version=Ascend310 --input_format=NCHW --input_shape="input:1,3,800,1333" --output=fcos_bs1 --precision_mode=allow_fp32_to_fp16 -- Gitee From 14d00fb860d63a41f8332354dbf6e781a4dc707d Mon Sep 17 00:00:00 2001 From: bilei Date: Fri, 24 Mar 2023 09:48:47 +0800 Subject: [PATCH 21/61] Modify the FCOS. --- contrib/FCOS/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/FCOS/README.md b/contrib/FCOS/README.md index 9e0742735..ff0c6f10a 100644 --- a/contrib/FCOS/README.md +++ b/contrib/FCOS/README.md @@ -2,7 +2,7 @@ ## 1 介绍 -本开发项目演示FCOS模型实现目标检测。本系统基于mxVision SDK进行开发,以昇腾Atlas310卡为主要的硬件平台,主要实现目标检测。待检测的图片中物体不能被遮挡太严重,并且物体要完全出现在图片中。图片亮度不能过低。输入一张图片,最后会输出图片中能检测到的物体。项目主要流程: +本开发项目演示FCOS模型实现目标检测。本系统基于mxVision SDK进行开发,以昇腾Atlas310、Atlas310B卡为主要的硬件平台,主要实现目标检测。待检测的图片中物体不能被遮挡太严重,并且物体要完全出现在图片中。图片亮度不能过低。输入一张图片,最后会输出图片中能检测到的物体。项目主要流程: 1.环境搭建; 2.模型转换; -- Gitee From 50f01612e0043b7b9bf30a5259fe60286983bbc5 Mon Sep 17 00:00:00 2001 From: xuegangxiao Date: Sat, 25 Mar 2023 15:15:55 +0800 Subject: [PATCH 22/61] code check --- tutorials/ImageDetectionSample/cpp/main.cpp | 43 ++++++++------------- 1 file changed, 17 insertions(+), 26 deletions(-) diff --git a/tutorials/ImageDetectionSample/cpp/main.cpp b/tutorials/ImageDetectionSample/cpp/main.cpp index a6bf9868c..613401d99 100644 --- a/tutorials/ImageDetectionSample/cpp/main.cpp +++ b/tutorials/ImageDetectionSample/cpp/main.cpp @@ -30,13 +30,13 @@ static APP_ERROR ReadFile(const std::string& filePath, MxStream::MxstDataInput& { char c[PATH_MAX + 1] = {0x00}; size_t count = filePath.copy(c, PATH_MAX +1); - if(count != filePath.length()){ + if(count != filePath.length()) { LogError << "Failed to copy file path(" << c << ")."; return APP_ERR_COMM_FAILURE; } // 得到文件的绝对路径 char path[PATH_MAX + 1] = { 0x00 }; - if((strlen(c) > PATH_MAX) || (realpath(c, path) == nullptr)){ + if((strlen(c) > PATH_MAX) || (realpath(c, path) == nullptr)) { LogError << "Failed to get image, the image path is (" << filePath << ")."; return APP_ERR_COMM_NO_EXIST; } @@ -52,17 +52,17 @@ static APP_ERROR ReadFile(const std::string& filePath, MxStream::MxstDataInput& long fileSize = ftell(fp); fseek(fp, 0, SEEK_SET); // 若文件内容不为空,把文件内容写入dataBuffer中 - if(fileSize > 0){ + if(fileSize > 0) { dataBuffer.dataSize = fileSize; dataBuffer.dataPtr = new (std::nothrow) uint32_t[fileSize]; - if(dataBuffer.dataPtr == nullptr){ + if(dataBuffer.dataPtr == nullptr) { LogError << "allocate memory with \"new uint32_t\" failed."; fclose(fp); return APP_ERR_COMM_FAILURE; } uint32_t readRet = fread(dataBuffer.dataPtr, 1, fileSize, fp); - if(readRet <= 0){ + if(readRet <= 0) { fclose(fp); return APP_ERR_COMM_READ_FAIL; } @@ -78,7 +78,7 @@ static std::string ReadPipelineConfig(const std::string &pipelineConfigPath) { // 用二进制方式打开文件 std::ifstream file(pipelineConfigPath.c_str(), std::ifstream::binary); - if(!file){ + if(!file) { LogError << pipelineConfigPath << " file is not exists"; return ""; } @@ -112,7 +112,7 @@ static APP_ERROR SaveResult(const std::shared_ptr &mxpi memorySrc.ptrData = (void*)visionData.dataptr(); MxBase::MemoryData memoryDst(visionData.datasize(), MxBase::MemoryData::MEMORY_HOST_NEW); APP_ERROR ret = MxBase::MemoryHelper::MxbsMallocAndCopy(memoryDst, memorySrc); - if(ret != APP_ERR_OK){ + if(ret != APP_ERR_OK) { LogError << "Fail to malloc and copy host memory."; return ret; } @@ -130,7 +130,7 @@ static APP_ERROR SaveResult(const std::shared_ptr &mxpi const uint32_t yOffset = 10; const uint32_t lineType = 8; const float fontScale = 1.0; - for(uint32_t i = 0; i < (uint32_t)mxpiObjectList->objectvec_size(); i++){ + for(uint32_t i = 0; i < (uint32_t)mxpiObjectList->objectvec_size(); i++) { auto& object = mxpiObjectList->objectvec(i); uint32_t y0 = object.y0(); uint32_t x0 = object.x0(); @@ -140,13 +140,12 @@ static APP_ERROR SaveResult(const std::shared_ptr &mxpi cv::putText(imgBgr, object.classvec(0).classname(), cv::Point(x0 + xOffset, y0 + yOffset), cv::FONT_HERSHEY_SIMPLEX, fontScale, green, thickness, lineType); // 绘制矩形 - cv::rectangle(imgBgr,cv::Rect(x0, y0, x1 - x0, y1 - y0), - green, thickness); + cv::rectangle(imgBgr,cv::Rect(x0, y0, x1 - x0, y1 - y0),green, thickness); } // 把Mat类型的图像矩阵保存为图像到指定位置。 cv::imwrite("./result.jpg", imgBgr); ret = MxBase::MemoryHelper::MxbsFree(memoryDst); - if(ret != APP_ERR_OK){ + if(ret != APP_ERR_OK) { LogError << "Fail to MxbsFree memory."; return ret; } @@ -156,16 +155,16 @@ static APP_ERROR SaveResult(const std::shared_ptr &mxpi // 打印protobuf信息 static APP_ERROR PrintInfo(std::vector outPutInfo) { - if(outPutInfo.size() == 0){ + if(outPutInfo.size() == 0) { LogError << "outPutInfo size is 0"; return APP_ERR_ACL_FAILURE; } - if(outPutInfo[0].errorCode != APP_ERR_OK){ + if(outPutInfo[0].errorCode != APP_ERR_OK) { LogError << "GetProtobuf error. errorCode=" << outPutInfo[0].errorCode; return outPutInfo[0].errorCode; } - for(MxStream::MxstProtobufOut info : outPutInfo){ + for(MxStream::MxstProtobufOut info : outPutInfo) { LogInfo << "errorCode=" << info.errorCode; LogInfo << "key=" << info.messageName; LogInfo << "value=" << info.messagePtr.get()->DebugString(); @@ -179,7 +178,7 @@ int main(int argc, char* argv[]) // 读取test.pipeline文件信息 std::string pipelineConfigPath = "./test.pipeline"; std::string pipelineConfig = ReadPipelineConfig(pipelineConfigPath); - if(pipelineConfig == ""){ + if(pipelineConfig == "") { return APP_ERR_COMM_INIT_FAIL; } @@ -187,13 +186,13 @@ int main(int argc, char* argv[]) // 新建一个流管理MxStreamManager对象并初始化 auto mxStreamManager = std::make_shared(); APP_ERROR ret = mxStreamManager->InitManager(); - if(ret != APP_ERR_OK){ + if(ret != APP_ERR_OK) { LogError << GetError(ret) << "Fail to init Stream manager."; return ret; } // 加载pipeline得到的信息,创建一个新的stream业务流 ret = mxStreamManager->CreateMultipleStreams(pipelineConfig); - if(ret != APP_ERR_OK){ + if(ret != APP_ERR_OK) { LogError << GetError(ret) << "Fail to creat Stream."; return ret; } @@ -201,7 +200,7 @@ int main(int argc, char* argv[]) // 将图片的信息读取到dataBuffer中 MxStream::MxstDataInput dataBuffer; ret = ReadFile("./test.jpg", dataBuffer); - if(ret != APP_ERR_OK){ + if(ret != APP_ERR_OK) { LogError << "Fail to read image file, ret = " << ret << "."; return ret; } @@ -232,11 +231,3 @@ int main(int argc, char* argv[]) mxStreamManager->DestroyAllStreams(); return 0; } - - - - - - - - -- Gitee From ab40914b6a26041545198a8a80861cbdc03ab7f8 Mon Sep 17 00:00:00 2001 From: xuegangxiao Date: Sat, 25 Mar 2023 15:56:51 +0800 Subject: [PATCH 23/61] code check --- tutorials/ImageDetectionSample/cpp/main.cpp | 40 +++++++++---------- tutorials/ImageDetectionSample/python/main.py | 8 ++-- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/tutorials/ImageDetectionSample/cpp/main.cpp b/tutorials/ImageDetectionSample/cpp/main.cpp index 613401d99..693e0dc84 100644 --- a/tutorials/ImageDetectionSample/cpp/main.cpp +++ b/tutorials/ImageDetectionSample/cpp/main.cpp @@ -30,20 +30,20 @@ static APP_ERROR ReadFile(const std::string& filePath, MxStream::MxstDataInput& { char c[PATH_MAX + 1] = {0x00}; size_t count = filePath.copy(c, PATH_MAX +1); - if(count != filePath.length()) { + if (count != filePath.length()) { LogError << "Failed to copy file path(" << c << ")."; return APP_ERR_COMM_FAILURE; } // 得到文件的绝对路径 char path[PATH_MAX + 1] = { 0x00 }; - if((strlen(c) > PATH_MAX) || (realpath(c, path) == nullptr)) { + if ((strlen(c) > PATH_MAX) || (realpath(c, path) == nullptr)) { LogError << "Failed to get image, the image path is (" << filePath << ")."; return APP_ERR_COMM_NO_EXIST; } // 打开文件 // path里面的值是test.jpg文件的绝对路径 FILE *fp = fopen(path, "rb"); - if(fp == nullptr){ + if (fp == nullptr) { LogError << "Failed to open file (" << path << ")."; return APP_ERR_COMM_OPEN_FAIL; } @@ -52,17 +52,17 @@ static APP_ERROR ReadFile(const std::string& filePath, MxStream::MxstDataInput& long fileSize = ftell(fp); fseek(fp, 0, SEEK_SET); // 若文件内容不为空,把文件内容写入dataBuffer中 - if(fileSize > 0) { + if (fileSize > 0) { dataBuffer.dataSize = fileSize; dataBuffer.dataPtr = new (std::nothrow) uint32_t[fileSize]; - if(dataBuffer.dataPtr == nullptr) { + if (dataBuffer.dataPtr == nullptr) { LogError << "allocate memory with \"new uint32_t\" failed."; fclose(fp); return APP_ERR_COMM_FAILURE; } uint32_t readRet = fread(dataBuffer.dataPtr, 1, fileSize, fp); - if(readRet <= 0) { + if (readRet <= 0) { fclose(fp); return APP_ERR_COMM_READ_FAIL; } @@ -78,7 +78,7 @@ static std::string ReadPipelineConfig(const std::string &pipelineConfigPath) { // 用二进制方式打开文件 std::ifstream file(pipelineConfigPath.c_str(), std::ifstream::binary); - if(!file) { + if (!file) { LogError << pipelineConfigPath << " file is not exists"; return ""; } @@ -112,7 +112,7 @@ static APP_ERROR SaveResult(const std::shared_ptr &mxpi memorySrc.ptrData = (void*)visionData.dataptr(); MxBase::MemoryData memoryDst(visionData.datasize(), MxBase::MemoryData::MEMORY_HOST_NEW); APP_ERROR ret = MxBase::MemoryHelper::MxbsMallocAndCopy(memoryDst, memorySrc); - if(ret != APP_ERR_OK) { + if (ret != APP_ERR_OK) { LogError << "Fail to malloc and copy host memory."; return ret; } @@ -130,7 +130,7 @@ static APP_ERROR SaveResult(const std::shared_ptr &mxpi const uint32_t yOffset = 10; const uint32_t lineType = 8; const float fontScale = 1.0; - for(uint32_t i = 0; i < (uint32_t)mxpiObjectList->objectvec_size(); i++) { + for (uint32_t i = 0; i < (uint32_t)mxpiObjectList->objectvec_size(); i++) { auto& object = mxpiObjectList->objectvec(i); uint32_t y0 = object.y0(); uint32_t x0 = object.x0(); @@ -140,12 +140,12 @@ static APP_ERROR SaveResult(const std::shared_ptr &mxpi cv::putText(imgBgr, object.classvec(0).classname(), cv::Point(x0 + xOffset, y0 + yOffset), cv::FONT_HERSHEY_SIMPLEX, fontScale, green, thickness, lineType); // 绘制矩形 - cv::rectangle(imgBgr,cv::Rect(x0, y0, x1 - x0, y1 - y0),green, thickness); + cv::rectangle(imgBgr, cv::Rect(x0, y0, x1 - x0, y1 - y0), green, thickness); } // 把Mat类型的图像矩阵保存为图像到指定位置。 cv::imwrite("./result.jpg", imgBgr); ret = MxBase::MemoryHelper::MxbsFree(memoryDst); - if(ret != APP_ERR_OK) { + if (ret != APP_ERR_OK) { LogError << "Fail to MxbsFree memory."; return ret; } @@ -155,16 +155,16 @@ static APP_ERROR SaveResult(const std::shared_ptr &mxpi // 打印protobuf信息 static APP_ERROR PrintInfo(std::vector outPutInfo) { - if(outPutInfo.size() == 0) { + if (outPutInfo.size() == 0) { LogError << "outPutInfo size is 0"; return APP_ERR_ACL_FAILURE; } - if(outPutInfo[0].errorCode != APP_ERR_OK) { + if (outPutInfo[0].errorCode != APP_ERR_OK) { LogError << "GetProtobuf error. errorCode=" << outPutInfo[0].errorCode; return outPutInfo[0].errorCode; } - for(MxStream::MxstProtobufOut info : outPutInfo) { + for (MxStream::MxstProtobufOut info : outPutInfo) { LogInfo << "errorCode=" << info.errorCode; LogInfo << "key=" << info.messageName; LogInfo << "value=" << info.messagePtr.get()->DebugString(); @@ -178,7 +178,7 @@ int main(int argc, char* argv[]) // 读取test.pipeline文件信息 std::string pipelineConfigPath = "./test.pipeline"; std::string pipelineConfig = ReadPipelineConfig(pipelineConfigPath); - if(pipelineConfig == "") { + if (pipelineConfig == "") { return APP_ERR_COMM_INIT_FAIL; } @@ -186,13 +186,13 @@ int main(int argc, char* argv[]) // 新建一个流管理MxStreamManager对象并初始化 auto mxStreamManager = std::make_shared(); APP_ERROR ret = mxStreamManager->InitManager(); - if(ret != APP_ERR_OK) { + if (ret != APP_ERR_OK) { LogError << GetError(ret) << "Fail to init Stream manager."; return ret; } // 加载pipeline得到的信息,创建一个新的stream业务流 ret = mxStreamManager->CreateMultipleStreams(pipelineConfig); - if(ret != APP_ERR_OK) { + if (ret != APP_ERR_OK) { LogError << GetError(ret) << "Fail to creat Stream."; return ret; } @@ -200,14 +200,14 @@ int main(int argc, char* argv[]) // 将图片的信息读取到dataBuffer中 MxStream::MxstDataInput dataBuffer; ret = ReadFile("./test.jpg", dataBuffer); - if(ret != APP_ERR_OK) { + if (ret != APP_ERR_OK) { LogError << "Fail to read image file, ret = " << ret << "."; return ret; } // 通过SendData函数传递输入信息到指定的工作元件模块 // streamName是pipeline文件中业务流名称;inPluginId为输入端口编号,对应输入元件的编号 ret = mxStreamManager->SendData(streamName, 0, dataBuffer); - if(ret != APP_ERR_OK){ + if (ret != APP_ERR_OK){ delete dataBuffer.dataPtr; LogError << "Fail to send data to stream, ret = " << ret << "."; return ret; @@ -217,7 +217,7 @@ int main(int argc, char* argv[]) std::vector keyVec = {"mxpi_objectpostprocessor0", "mxpi_imagedecoder0"}; std::vector output = mxStreamManager->GetProtobuf(streamName, 0, keyVec); ret = PrintInfo(output); - if(ret != APP_ERR_OK){ + if (ret != APP_ERR_OK){ LogError << "Fail to print the info of output, ret = " << ret << "."; return ret; } diff --git a/tutorials/ImageDetectionSample/python/main.py b/tutorials/ImageDetectionSample/python/main.py index 56b2e9ca6..9c8e59ced 100644 --- a/tutorials/ImageDetectionSample/python/main.py +++ b/tutorials/ImageDetectionSample/python/main.py @@ -160,12 +160,12 @@ if __name__ == '__main__': 'confidence': round(results.classVec[0].confidence, 4), 'text': results.classVec[0].className} - text = "{}{}".format(str(bboxes['confidence']), " ") + text = "{}{}".format(str(bboxes.get('confidence')), " ") - for item in bboxes['text']: + for item in bboxes.get('text'): text += item - cv2.putText(img, text, (bboxes['x0'] + 10, bboxes['y0'] + 10), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (255, 0, 0), 1) - cv2.rectangle(img, (bboxes['x0'], bboxes['y0']), (bboxes['x1'], bboxes['y1']), (255, 0, 0), 2) + cv2.putText(img, text, (bboxes.get('x0') + 10, bboxes.get('y0') + 10), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (255, 0, 0), 1) + cv2.rectangle(img, (bboxes.get('x0'), bboxes.get('y0')), (bboxes.get('x1'), bboxes.get('y1')), (255, 0, 0), 2) cv2.imwrite("./result.jpg", img) -- Gitee From 6feaf681bcf6eddb944b9af661682c7199f9ae95 Mon Sep 17 00:00:00 2001 From: bilei Date: Mon, 27 Mar 2023 11:25:45 +0800 Subject: [PATCH 24/61] Modify the Version. --- contrib/FCOS/README.md | 6 +++--- contrib/FireDetection/README.md | 8 ++++---- contrib/HelmetIdentification/README.md | 6 +++--- contrib/OpenCVPlugin/README.md | 4 ++-- contrib/PeopleKeypointDetection/README.md | 18 +++++++++--------- contrib/facemaskdetection/README.md | 8 ++++---- 6 files changed, 25 insertions(+), 25 deletions(-) diff --git a/contrib/FCOS/README.md b/contrib/FCOS/README.md index ff0c6f10a..f860350ef 100644 --- a/contrib/FCOS/README.md +++ b/contrib/FCOS/README.md @@ -15,7 +15,7 @@ ### 1.2支持的版本 -该项目支持的SDK版本为2.0.4,CANN版本为5.0.4。 +该项目支持的SDK版本为5.0.RC1,CANN版本昇腾Atlas310卡使用6.3.RC1,Atlas310B卡使用6.2.RC1。 ### 1.3软件方案介绍 @@ -77,9 +77,9 @@ | 软件名称 | 版本 | 说明 | 获取方式 | | ------------------- | ------ | ----------------------------- | ----------------------------------------------------------------- | -| MindX SDK | 2.0.4 | mxVision软件包 | [点击打开链接](https://www.hiascend.com/software/Mindx-sdk) | +| MindX SDK | 5.0.RC1 | mxVision软件包 | [点击打开链接](https://www.hiascend.com/software/Mindx-sdk) | | ubuntu | 18.04 | 操作系统 | 请上ubuntu官网获取 | -| Ascend-CANN-toolkit | 5.0.4 | Ascend-cann-toolkit开发套件包 | [点击打开链接](https://www.hiascend.com/software/cann/commercial) | +| Ascend-CANN-toolkit | 310使用6.3.RC1,310B使用6.2.RC1 | Ascend-cann-toolkit开发套件包 | [点击打开链接](https://www.hiascend.com/software/cann/commercial) | | mmdetection | 2.25.0 | 用于评估准确度 | 请上mmdetection官网 | 在项目开始运行前需要设置环境变量: diff --git a/contrib/FireDetection/README.md b/contrib/FireDetection/README.md index adffeb172..4bcce8cfa 100644 --- a/contrib/FireDetection/README.md +++ b/contrib/FireDetection/README.md @@ -6,11 +6,11 @@ ### 1.1 支持的产品 -昇腾 310(推理) +昇腾 310(推理)、昇腾 310B(推理) ### 1.2 支持的版本 -本样例配套的 CANN 版本为 [5.0.4](https://gitee.com/link?target=https%3A%2F%2Fwww.hiascend.com%2Fsoftware%2Fcann%2Fcommercial),MindX SDK 版本为 [2.0.4](https://www.hiascend.com/software/Mindx-sdk)。 +本样例配套的 CANN 版本为 [昇腾Atlas310卡使用6.3.RC1,Atlas310B卡使用6.2.RC1](https://gitee.com/link?target=https%3A%2F%2Fwww.hiascend.com%2Fsoftware%2Fcann%2Fcommercial),MindX SDK 版本为 [5.0.RC1](https://www.hiascend.com/software/Mindx-sdk)。 MindX SDK 安装前准备可参考《用户指南》,[安装教程](https://gitee.com/ascend/mindxsdk-referenceapps/blob/master/docs/quickStart/1-1安装SDK开发套件.md) @@ -54,9 +54,9 @@ MindX SDK 安装前准备可参考《用户指南》,[安装教程](https://gi | 软件名称 | 版本 | 说明 | 获取方式 | | ------------------- | ----------- | ----------------------------- | ------------------------------------------------------------ | -| MindX SDK | 2.0.4 | mxVision软件包 | [链接](https://gitee.com/link?target=https%3A%2F%2Fwww.hiascend.com%2Fsoftware%2Fmindx-sdk%2Fmxvision) | +| MindX SDK | 5.0.RC1 | mxVision软件包 | [链接](https://gitee.com/link?target=https%3A%2F%2Fwww.hiascend.com%2Fsoftware%2Fmindx-sdk%2Fmxvision) | | ubuntu | 18.04.1 LTS | 操作系统 | Ubuntu官网获取 | -| Ascend-CANN-toolkit | 5.0.4 | Ascend-cann-toolkit开发套件包 | [链接](https://gitee.com/link?target=https%3A%2F%2Fwww.hiascend.com%2Fsoftware%2Fcann%2Fcommercial) | +| Ascend-CANN-toolkit | 310使用6.3.RC1,310B使用6.2.RC1 | Ascend-cann-toolkit开发套件包 | [链接](https://gitee.com/link?target=https%3A%2F%2Fwww.hiascend.com%2Fsoftware%2Fcann%2Fcommercial) | 在运行项目需要的环境变量如下,运行前不需要特别设置,环境依赖已经写入脚本中,脚本在`FireDetection/envs`目录下: diff --git a/contrib/HelmetIdentification/README.md b/contrib/HelmetIdentification/README.md index 40bbe0e25..80eddf900 100644 --- a/contrib/HelmetIdentification/README.md +++ b/contrib/HelmetIdentification/README.md @@ -10,7 +10,7 @@ ### 1.2 支持的版本 -本样例配套的CANN版本为[5.0.4](https://www.hiascend.com/software/cann/commercial),MindX SDK版本为[2.0.4](https://www.hiascend.com/software/Mindx-sdk)。 +本样例配套的CANN版本为[昇腾Atlas310卡使用6.3.RC1,Atlas310B卡使用6.2.RC1](https://www.hiascend.com/software/cann/commercial),MindX SDK版本为[5.0.RC1](https://www.hiascend.com/software/Mindx-sdk)。 MindX SDK安装前准备可参考《用户指南》,[安装教程](https://gitee.com/ascend/mindxsdk-referenceapps/blob/master/docs/quickStart/1-1安装SDK开发套件.md) @@ -58,8 +58,8 @@ MindX SDK安装前准备可参考《用户指南》,[安装教程](https://git | 软件 | 版本 | 说明 | 获取方式 | | ------------------- | ------------ | ----------------------------- | ------------------------------------------------------------ | -| mxVision | 2.0.4 | mxVision软件包 | [链接](https://www.hiascend.com/software/Mindx-sdk) | -| Ascend-CANN-toolkit | 5.0.4 | Ascend-cann-toolkit开发套件包 | [链接](https://www.hiascend.com/software/cann/commercial) | +| mxVision | 5.0.RC1 | mxVision软件包 | [链接](https://www.hiascend.com/software/Mindx-sdk) | +| Ascend-CANN-toolkit | 310使用6.3.RC1,310B使用6.2.RC1 | Ascend-cann-toolkit开发套件包 | [链接](https://www.hiascend.com/software/cann/commercial) | | 操作系统 | Ubuntu 18.04 | 操作系统 | Ubuntu官网获取 | | opencv-python | 4.5.2.54 | 用于识别结果画框 | python3 -m pip install opencv-python | diff --git a/contrib/OpenCVPlugin/README.md b/contrib/OpenCVPlugin/README.md index 195919652..37ffc2782 100644 --- a/contrib/OpenCVPlugin/README.md +++ b/contrib/OpenCVPlugin/README.md @@ -17,7 +17,7 @@ ### 1.2 支持的版本 -支持的SDK版本为 2.0.4, CANN 版本为 5.0.4。 +支持的SDK版本为 5.0.RC1, CANN 版本为昇腾Atlas310卡使用6.3.RC1,Atlas310B卡使用6.2.RC1。 ### 1.3 软件方案介绍 @@ -105,7 +105,7 @@ OpenCVPlugin 插件流程图。 | 软件名称 | 版本 | | -------- | ----- | | cmake | 3.5+ | -| mxVision | 2.0.4 | +| mxVision | 5.0.RC1 | | python | 3.9.2 | 确保环境中正确安装mxVision SDK。 diff --git a/contrib/PeopleKeypointDetection/README.md b/contrib/PeopleKeypointDetection/README.md index 2776855a7..7a397dbc5 100644 --- a/contrib/PeopleKeypointDetection/README.md +++ b/contrib/PeopleKeypointDetection/README.md @@ -11,7 +11,7 @@ ### 1.1 支持的产品 -本项目以昇腾Atlas310卡为主要的硬件平台。 +本项目以昇腾Atlas310、Atlas310B卡为主要的硬件平台。 ### 1.2 支持的版本 @@ -21,8 +21,8 @@ | 软件名称 | 版本 | | :-------: | :---: | -| MindX SDK | 2.0.4 | -| CANN | 5.0.4 | +| MindX SDK | 5.0.RC1 | +| Ascend-CANN-toolkit | (310使用6.3.RC1,310B使用6.2.RC1) | ### 1.3 软件方案介绍 @@ -93,13 +93,13 @@ | 软件名称 | 版本 | | :-----------: | :---------: | | ubuntu | 18.04.1 LTS | -| MindX SDK | 2.0.4 | +| MindX SDK | 5.0.RC1 | | Python | 3.9.2 | -| CANN | 5.0.4 | +| CANN | 310使用6.3.RC1,310B使用6.2.RC1 | | numpy | 1.22.3 | | opencv-python | 4.5.5 | | cmake | 3.5+ | -| mxVision | 2.0.4 | +| mxVision | 5.0.RC1 | | natsort | 8.2.0 | ### 2.2 环境搭建 @@ -124,7 +124,7 @@ YOLOv3 模型参考[实现代码](https://www.hiascend.com/zh/software/modelzoo/ **步骤3** 模型转换。 -在`./model/people/`目录下执行以下命令: +在`./model/people/`目录下执行以下命令。注意若推理芯片为310B,需将模型转换atc命令中的soc_version参数设置为Ascend310B1: ```bash atc --model=yolov3_tf.pb --framework=3 --output=yolov3_tf_aipp --input_format=NHWC --output_type=FP32 --soc_version=Ascend310 --input_shape="input:1,416,416,3" --out_nodes="yolov3/yolov3_head/Conv_6/BiasAdd:0;yolov3/yolov3_head/Conv_14/BiasAdd:0;yolov3/yolov3_head/Conv_22/BiasAdd:0" --insert_op_conf=yolov3_tf_aipp.cfg @@ -149,7 +149,7 @@ ATC run success, welcome to the next use. **步骤3** 模型转换。 -在`./model/keypoint/`目录下,执行以下命令: +在`./model/keypoint/`目录下,执行以下命令。注意若推理芯片为310B,需将模型转换atc命令中的soc_version参数设置为Ascend310B1: ```bash atc --framework=5 --model=3DMPPE-ROOTNET.onnx --output=3DMPPE-ROOTNET_bs1 --input_format=NCHW --input_shape="image:1,3,256,256;cam_param:1,1" --soc_version=Ascend310 @@ -199,7 +199,7 @@ ATC run success, welcome to the next use. **步骤3** 下载[coco.names]([yolo_objectDetection_imagesCPU/coco.names at master · misbah4064/yolo_objectDetection_imagesCPU · GitHub](https://github.com/misbah4064/yolo_objectDetection_imagesCPU/blob/master/coco.names)),重命名为coco_people.names并放置在 ``./model/people/`` 目录下。 -**步骤4** 下载[MuPoTS数据集]([http://gvv.mpi-inf.mpg.de/projects/SingleShotMultiPerson/MultiPersonTestSet.zip](http://gvv.mpi-inf.mpg.de/projects/SingleShotMultiPerson/MultiPersonTestSet.zip))MultiPersonTestSet,并将数据集解压在pic文件夹下。 +**步骤4** 下载[MuPoTS数据集](http://gvv.mpi-inf.mpg.de/projects/SingleShotMultiPerson/MultiPersonTestSet.zip)MultiPersonTestSet,并将数据集解压在pic文件夹下。 **步骤5** 生成ini配置文件。在untils文件夹中,执行命令: diff --git a/contrib/facemaskdetection/README.md b/contrib/facemaskdetection/README.md index 535924b7a..32d223cd2 100644 --- a/contrib/facemaskdetection/README.md +++ b/contrib/facemaskdetection/README.md @@ -9,9 +9,9 @@ ### 1.2 支持的版本 -支持的SDK版本为2.0.4。 +支持的SDK版本为5.0.RC1。 -CANN版本为5.0.4。 +CANN版本昇腾Atlas310卡使用6.3.RC1,Atlas310B卡使用6.2.RC1。 ### 1.3 代码目录结构与说明 @@ -48,8 +48,8 @@ CANN版本为5.0.4。 | 软件 | 版本 | 说明 | 获取方式 | | ------------------- | ------------ | ----------------------------- | ------------------------------------------------------------ | -| mxVision | 2.0.4 | mxVision软件包 | [链接](https://www.hiascend.com/software/Mindx-sdk) | -| Ascend-CANN-toolkit | 20.2.rc1 | Ascend-cann-toolkit开发套件包 | [链接](https://www.hiascend.com/software/cann/commercial) | +| mxVision | 5.0.RC1 | mxVision软件包 | [链接](https://www.hiascend.com/software/Mindx-sdk) | +| Ascend-CANN-toolkit | 310使用6.3.RC1,310B使用6.2.RC1 | Ascend-cann-toolkit开发套件包 | [链接](https://www.hiascend.com/software/cann/commercial) | | 操作系统 | Ubuntu 18.04 | 操作系统 | Ubuntu官网获取 | | opencv-python | 4.5.2.54 | 用于识别结果画框 | python3 -m pip install opencv-python | -- Gitee From d11efd9eacfc3b09de62001b49e8672bf02bd39c Mon Sep 17 00:00:00 2001 From: bilei Date: Tue, 28 Mar 2023 19:24:08 +0800 Subject: [PATCH 25/61] Modify the facemaskdetection. --- contrib/facemaskdetection/test_image.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/contrib/facemaskdetection/test_image.py b/contrib/facemaskdetection/test_image.py index 6093921d2..75f622b5b 100644 --- a/contrib/facemaskdetection/test_image.py +++ b/contrib/facemaskdetection/test_image.py @@ -96,8 +96,7 @@ def inference( ymax + shift_size, ] ) - return output_info - + return output_info0 if __name__ == "__main__": streamManagerApi = StreamManagerApi() @@ -117,8 +116,10 @@ if __name__ == "__main__": # Construct the input of the stream PATH = "./testimages/FaceMaskDataset/test/" + start_time= time.time() + count = 0 for item in os.listdir(PATH): - start_stamp = time.time() + count = count + 1 img_path = os.path.join(PATH, item) print(img_path) img_name = item.split(".")[0] @@ -197,7 +198,7 @@ if __name__ == "__main__": img = cv2.imread(img_path) output_info = inference(img, show_result=False) open(img_txt, "a+") - for i in enumerate(output_info): + for i, _ in enumerate(output_info): with open(img_txt, "a+") as f: result = "{} {} {} {} {} {}".format( id2class[output_info[i][0]], @@ -212,4 +213,8 @@ if __name__ == "__main__": # destroy streams + end_time = time.time() + time_diff = end_time - start_time + res_fps = count / time_diff + print(f"result fps: {res_fps }") streamManagerApi.DestroyAllStreams() -- Gitee From f383975e3e3400d995d476401b9f8de36e1e6163 Mon Sep 17 00:00:00 2001 From: bilei Date: Tue, 28 Mar 2023 19:25:56 +0800 Subject: [PATCH 26/61] Modify the facemaskdetection. --- contrib/facemaskdetection/test_image.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/facemaskdetection/test_image.py b/contrib/facemaskdetection/test_image.py index 75f622b5b..1a47c53a2 100644 --- a/contrib/facemaskdetection/test_image.py +++ b/contrib/facemaskdetection/test_image.py @@ -216,5 +216,5 @@ if __name__ == "__main__": end_time = time.time() time_diff = end_time - start_time res_fps = count / time_diff - print(f"result fps: {res_fps }") + print(f"result fps: {res_fps}") streamManagerApi.DestroyAllStreams() -- Gitee From cf2e51f14b9fdfa9cbbfd67f7c158077e336c6f6 Mon Sep 17 00:00:00 2001 From: bilei Date: Tue, 28 Mar 2023 21:03:04 +0800 Subject: [PATCH 27/61] Modify the facemaskdetection. --- contrib/facemaskdetection/test_image.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/contrib/facemaskdetection/test_image.py b/contrib/facemaskdetection/test_image.py index 1a47c53a2..ed01b9124 100644 --- a/contrib/facemaskdetection/test_image.py +++ b/contrib/facemaskdetection/test_image.py @@ -108,7 +108,7 @@ if __name__ == "__main__": # create streams by pipeline config file pipeline_path = b"main.pipeline" - tensor_key = b"appsrc0" + TENSOR_KEY = b"appsrc0" ret = streamManagerApi.CreateMultipleStreamsFromFile(pipeline_path) if ret != 0: print("Failed to create Stream, ret=%s" % str(ret)) @@ -116,10 +116,10 @@ if __name__ == "__main__": # Construct the input of the stream PATH = "./testimages/FaceMaskDataset/test/" - start_time= time.time() - count = 0 + start_time = time.time() + COUNT = 0 for item in os.listdir(PATH): - count = count + 1 + COUNT = COUNT + 1 img_path = os.path.join(PATH, item) print(img_path) img_name = item.split(".")[0] @@ -129,14 +129,14 @@ if __name__ == "__main__": if os.path.exists(img_path) != 1: print("The test image does not exist.") - streamName = b"detection" + STREAM_NAME = b"detection" inPluginId = 0 dataInput = MxDataInput() with open(img_path, "rb") as f: dataInput.data = f.read() # Inputs data to a specified stream based on streamName. - uniqueId = streamManagerApi.SendData(streamName, inPluginId, dataInput) + uniqueId = streamManagerApi.SendData(STREAM_NAME, inPluginId, dataInput) if uniqueId < 0: print("Failed to send data to stream.") exit() @@ -144,7 +144,7 @@ if __name__ == "__main__": key_vec = StringVector() key_vec.push_back(b"mxpi_tensorinfer0") # get inference result - infer_result = streamManagerApi.GetProtobuf(streamName, inPluginId, key_vec) + infer_result = streamManagerApi.GetProtobuf(STREAM_NAME, inPluginId, key_vec) a = infer_result.size() if infer_result.size() == 0: print("infer_result is null") @@ -215,6 +215,6 @@ if __name__ == "__main__": end_time = time.time() time_diff = end_time - start_time - res_fps = count / time_diff + res_fps = COUNT / time_diff print(f"result fps: {res_fps}") streamManagerApi.DestroyAllStreams() -- Gitee From 05e49f1b105305cd620a4dfc19ab85531ab16e4a Mon Sep 17 00:00:00 2001 From: DlinR Date: Wed, 29 Mar 2023 10:45:51 +0800 Subject: [PATCH 28/61] =?UTF-8?q?310b=E9=80=82=E9=85=8D=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contrib/CrowdCounting/README.md | 8 +-- contrib/GestureKeypointDetection/README.md | 17 +++-- contrib/MeterReader/README.md | 23 ++++--- .../MeterReader/pipeline/yolov5/det.pipeline | 2 +- contrib/MonocularDepthEstimation/README.md | 63 +++++-------------- .../model/model_conversion.sh | 40 ------------ contrib/PersonCount/README.md | 30 +++------ contrib/PortraitSegmentation/README.md | 12 ++-- contrib/RemoteSensingSegmentation/README.md | 8 ++- contrib/SentimentAnalysis/README.md | 18 +++--- .../SentimentAnalysis/SentimentAnalysis.h | 1 + contrib/SuperResolution/README.md | 12 ++-- contrib/VideoGestureRecognition/README.md | 22 ++++--- contrib/ai_paint/README.md | 62 +++++++++++------- contrib/ai_paint/model/model_conversion.sh | 32 ---------- contrib/ai_paint/python/run.sh | 34 ---------- contrib/msame/README.md | 20 +++--- ...13\345\220\216\345\244\204\347\220\206.md" | 2 +- .../InferOfflineVideo/regular/README.zh.md | 17 +++-- tutorials/DvppWrapperSample/CMakeLists.txt | 2 +- tutorials/DvppWrapperSample/README.md | 16 +++-- tutorials/samplePluginPostProc/CMakeLists.txt | 3 +- 22 files changed, 164 insertions(+), 280 deletions(-) delete mode 100644 contrib/MonocularDepthEstimation/model/model_conversion.sh delete mode 100644 contrib/ai_paint/model/model_conversion.sh delete mode 100644 contrib/ai_paint/python/run.sh diff --git a/contrib/CrowdCounting/README.md b/contrib/CrowdCounting/README.md index 11c63acdc..8cb688120 100644 --- a/contrib/CrowdCounting/README.md +++ b/contrib/CrowdCounting/README.md @@ -96,9 +96,9 @@ cd到CrowdCounting目录下,执行如下编译命令: bash build.sh ## 5 软件依赖说明 -| 依赖软件 | 版本 | 说明 | -| -------- | ----- | ------------------------------------------------------------ | -| mxVision | 5.0rc1 | 提供昇腾计算语言(AscendCL)的高级编程API,简化插件和推理应用开发。 | - +| 依赖软件 | 版本 | +| -------- | ----- | +| mxVision | 5.0rc1 +| CANN | 310使用6.3.RC1
310B使用6.2.RC1 | diff --git a/contrib/GestureKeypointDetection/README.md b/contrib/GestureKeypointDetection/README.md index e0de8eb10..6c469511e 100644 --- a/contrib/GestureKeypointDetection/README.md +++ b/contrib/GestureKeypointDetection/README.md @@ -14,8 +14,13 @@ ### 1.2 支持的版本 -支持的SDK版本为5.0rc1 -支持的cann版本为6.2 +推荐系统为ubantu 18.04。 + +| 软件名称 | 版本 | +| -------- | ------ | +| python | 3.9.2 | +| MindX SDK | 5.0RC1 | +| CANN | 310使用6.3.RC1
310B使用6.2.RC1 | ### 1.3 软件方案介绍 @@ -58,14 +63,6 @@ ## 2 环境依赖 -推荐系统为ubantu 18.04,环境依赖软件和版本如下表: - -| 软件名称 | 版本 | -| -------- | ------ | -| cmake | 3.5+ | -| mxVision | 5.0rc1 | -| python | 3.9.2 | - 确保环境中正确安装mxVision SDK。 在编译运行项目前,需要设置环境变量: diff --git a/contrib/MeterReader/README.md b/contrib/MeterReader/README.md index 835d2004d..22f6eb4ea 100644 --- a/contrib/MeterReader/README.md +++ b/contrib/MeterReader/README.md @@ -6,11 +6,16 @@ ### 1.1 支持的产品 -昇腾 310(推理) +昇腾 310B1(推理) ### 1.2 支持的版本 -本样例配套的 CANN 版本为 5.0.4,MindX SDK 版本为 2.0.4。 + +| 软件名称 | 版本 | +| -------- | ------ | +| python | 3.9.2 | +| MindX SDK | 5.0RC1 | +| CANN | 310使用6.3.RC1
310B使用6.2.RC1 | MindX SDK 安装前准备可参考[《用户指南》安装教程](https://gitee.com/ascend/docs-openmind/blob/master/guide/mindx/sdk/tutorials/quick_start/1-1%E5%AE%89%E8%A3%85SDK%E5%BC%80%E5%8F%91%E5%A5%97%E4%BB%B6.md) @@ -83,7 +88,7 @@ MindX SDK 安装前准备可参考[《用户指南》安装教程](https://gitee ### 1.5 技术实现流程图
    -
  1. 基础环境:Ascend 310、mxVision、Ascend-CANN-toolkit、Ascend Driver +
  2. 基础环境:mxVision、Ascend-CANN-toolkit
  3. 模型转换: PyTorch模型转昇腾离线模型:yolov5.onnx --> yolov5.om @@ -138,9 +143,9 @@ onnx模型转昇腾离线模型:DeepLabv3.onnx --> DeepLabv3.om | 软件名称 | 版本 | | :-----------: | :---------: | | ubuntu | 18.04.1 LTS | -| MindX SDK | 2.0.4 | +| MindX SDK | 5.0RC1 | | Python | 3.9.2 | -| CANN | 5.0.4 | +| CANN | 310使用6.3.RC1
    310B使用6.2.RC1 | | numpy | 1.23.4 | | opencv-python | 4.6.0 | @@ -149,8 +154,8 @@ MindX SDK开发套件部分可参考[MindX SDK开发套件安装指导](https:// ### 2.2 导入基础环境 ```bash -. /usr/local/Ascend/ascend-toolkit/set_env.sh -. ${SDK安装路径}/mxVision/set_env.sh +. /usr/local/Ascend/ascend-toolkit/set_env.sh #toolkit默认安装路径,根据实际安装路径修改 +. ${SDK_INSTALL_PATH}/mxVision/set_env.sh ``` ## 3 模型转换及依赖安装 @@ -175,7 +180,7 @@ MindX SDK开发套件部分可参考[MindX SDK开发套件安装指导](https:// 进入"\${MeterReader代码根目录}/models/yolov5"目录,执行以下命令将"det.onnx"模型转换成"det.om"模型: ```bash -atc --model=det.onnx --framework=5 --output=det --insert_op_conf=det_aipp.cfg --soc_version=Ascend310 +atc --model=det.onnx --framework=5 --output=det --insert_op_conf=det_aipp.cfg --soc_version=Ascend310B1 ``` 出现以下语句表示命令执行成功,会在当前目录中得到"det.om"模型文件。 @@ -209,7 +214,7 @@ pip3 install paddle2onnx 进入"\${MeterReader代码根目录}/models/deeplabv3"目录,执行以下命令将"seg.onnx"模型转换成"seg.om"模型 ```bash cd ${MeterReader代码根目录}/models/deeplabv3 - atc --model=seg.onnx --framework=5 --output=seg --insert_op_conf=seg_aipp.cfg --input_shape="image:1,3,512,512" --input_format=NCHW --soc_version=Ascend310 + atc --model=seg.onnx --framework=5 --output=seg --insert_op_conf=seg_aipp.cfg --input_shape="image:1,3,512,512" --input_format=NCHW --soc_version=Ascend310B1 ``` 出现以下语句表示命令执行成功,会在当前目录中得到seg.om模型文件。 diff --git a/contrib/MeterReader/pipeline/yolov5/det.pipeline b/contrib/MeterReader/pipeline/yolov5/det.pipeline index 9d899b019..9e3cdfd04 100644 --- a/contrib/MeterReader/pipeline/yolov5/det.pipeline +++ b/contrib/MeterReader/pipeline/yolov5/det.pipeline @@ -1,7 +1,7 @@ { "detection":{ "stream_config":{ - "deviceId":"1" + "deviceId":"0" }, "appsrc0":{ "props":{ diff --git a/contrib/MonocularDepthEstimation/README.md b/contrib/MonocularDepthEstimation/README.md index 7f804b284..1c00134f6 100644 --- a/contrib/MonocularDepthEstimation/README.md +++ b/contrib/MonocularDepthEstimation/README.md @@ -7,10 +7,15 @@ 样例输出:输入图片的深度图(灰度图形式) ### 1.1 支持的产品 -昇腾310(推理) +昇腾310B1(推理) ### 1.2 支持的版本 -本样例配套的CANN版本为 [5.0.4](https://www.hiascend.com/software/cann/commercial) ,MindX SDK版本为 [2.0.4](https://www.hiascend.com/software/Mindx-sdk) 。 + +| 软件名称 | 版本 | +| -------- | ------ | +| python | 3.9.2 | +| MindX SDK | 5.0RC1 | +| CANN | 310使用6.3.RC1
    310B使用6.2.RC1 | MindX SDK安装前准备可参考《用户指南》,[安装教程](https://gitee.com/ascend/mindxsdk-referenceapps/blob/master/docs/quickStart/1-1安装SDK开发套件.md) @@ -41,15 +46,14 @@ MindX SDK安装前准备可参考《用户指南》,[安装教程](https://git ``` ## 2 环境依赖 -### 2.1 软件版本 -| 软件 | 版本 | 说明 | 获取方式 | -| ------------------- | ------------ | ----------------------------- | ------------------------------------------------------------ | -| mxVision | 2.0.4 | mxVision软件包 | [链接](https://www.hiascend.com/software/Mindx-sdk) | -| Ascend-CANN-toolkit | 5.0.4 | Ascend-cann-toolkit开发套件包 | [链接](https://www.hiascend.com/software/cann/commercial) | -| 操作系统 | Ubuntu 18.04 | 操作系统 | Ubuntu官网获取 | +### 2.1 准备工作 +> 设置环境变量 -### 2.2 准备工作 +``` +. /usr/local/Ascend/ascend-toolkit/set_env.sh #toolkit默认安装路径,根据实际安装路径修改 +. ${SDK_INSTALL_PATH}/mxVision/set_env.sh +``` > 模型转换 @@ -60,22 +64,10 @@ MindX SDK安装前准备可参考《用户指南》,[安装教程](https://git **步骤3** 将转换或下载得到的 `AdaBins_nyu.onnx` 放在 `model` 目录下 -**步骤4** 运行模型转换脚本 `model_conversion.sh` 或在 `model` 目录下执行以下命令 +**步骤4** `model` 目录下执行以下命令 ``` -# 设置环境变量(请确认install_path路径是否正确) -# Set environment PATH (Please confirm that the install_path is correct). - -export install_path=/usr/local/Ascend/ascend-toolkit/latest -export PATH=/usr/local/python3.9.2/bin:${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATH -export PYTHONPATH=${install_path}/atc/python/site-packages:${install_path}/atc/python/site-packages/auto_tune.egg/auto_tune:${install_path}/atc/python/site-packages/schedule_search.egg -export LD_LIBRARY_PATH=${install_path}/atc/lib64:$LD_LIBRARY_PATH -export ASCEND_OPP_PATH=${install_path}/opp - -# 执行,转换AdaBins模型 -# Execute, transform AdaBins model. - -atc --model=./AdaBins_nyu.onnx --framework=5 --output=./AdaBins_nyu.om --soc_version=Ascend310 --insert_op_conf=./aipp_adabins_640_480.aippconfig --log=error +atc --model=./AdaBins_nyu.onnx --framework=5 --output=./AdaBins_nyu.om --soc_version=Ascend310B1 --insert_op_conf=./aipp_adabins_640_480.aippconfig --log=error ``` 执行完模型转换脚本后,会生成相应的.om模型文件。 @@ -132,31 +124,6 @@ model_output_width = 320 threshold_3 = 1.25 ** 3 ``` -### 2.3 配置环境变量 - -```bash -# 执行如下命令,打开.bashrc文件 -cd $HOME -vi .bashrc -# 在.bashrc文件中添加以下环境变量 -MX_SDK_HOME=${SDK安装路径} - -LD_LIBRARY_PATH=${MX_SDK_HOME}/lib:${MX_SDK_HOME}/opensource/lib:${MX_SDK_HOME}/opensource/lib64:/usr/local/Ascend/ascend-toolkit/latest/acllib/lib64:/usr/local/Ascend/driver/lib64/ - -GST_PLUGIN_SCANNER=${MX_SDK_HOME}/opensource/libexec/gstreamer-1.0/gst-plugin-scanner - -GST_PLUGIN_PATH=${MX_SDK_HOME}/opensource/lib/gstreamer-1.0:${MX_SDK_HOME}/lib/plugins - -PYTHONPATH=${MX_SDK_HOME}/python - -# 保存退出.bashrc文件 -# 执行如下命令使环境变量生效 -source ~/.bashrc - -# 查看环境变量 -env -``` - ## 3 运行 手动运行请参照 ①, 脚本运行请参照 ② > ① 手动运行前请确保每一步环境变量均配置完成,随后进入工程目录,键入执行指令 diff --git a/contrib/MonocularDepthEstimation/model/model_conversion.sh b/contrib/MonocularDepthEstimation/model/model_conversion.sh deleted file mode 100644 index 76c612802..000000000 --- a/contrib/MonocularDepthEstimation/model/model_conversion.sh +++ /dev/null @@ -1,40 +0,0 @@ -#!/bin/bash - -# Copyright(C) 2021. Huawei Technologies Co.,Ltd. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -set -e - -# 该脚本用来将onnx模型文件转换成.om模型文件 -# This is used to convert onnx model file to .om model file. - - -# 设置环境变量(请确认install_path路径是否正确) -# Set environment PATH (Please confirm that the install_path is correct). - -export install_path=/usr/local/Ascend/ascend-toolkit/latest -export PATH=/usr/local/python3.9.2/bin:${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATH -export PYTHONPATH=${install_path}/atc/python/site-packages:${install_path}/atc/python/site-packages/auto_tune.egg/auto_tune:${install_path}/atc/python/site-packages/schedule_search.egg -export LD_LIBRARY_PATH=${install_path}/atc/lib64:$LD_LIBRARY_PATH -export ASCEND_OPP_PATH=${install_path}/opp - - -# 执行,转换Adabins_nyu模型 -# Execute, transform Adabins_nyu model. - -atc --model=./AdaBins_nyu.onnx --framework=5 --output=./AdaBins_nyu.om --soc_version=Ascend310 --insert_op_conf=./aipp_adabins_640_480.aippconfig --log=error - -# 退出 -# exit -exit 0 \ No newline at end of file diff --git a/contrib/PersonCount/README.md b/contrib/PersonCount/README.md index 6b953ff71..6ba0cf8b2 100644 --- a/contrib/PersonCount/README.md +++ b/contrib/PersonCount/README.md @@ -1,8 +1,6 @@ 人群密度计数 ## 1 介绍 -(项目的概述,包含的功能) -(项目的主要流程) 项目的概述:基于MindX SDK,在昇腾平台上,开发端到端人群计数-人群密度估计,输入一幅人群图像,输出图像当中人的计数(估计)的结果。 项目的主要流程: @@ -21,7 +19,13 @@ ### 1.2 支持的版本 -支持的SDK版本:5.0rc1 +推荐系统为ubantu 18.04。 + +| 软件名称 | 版本 | +| -------- | ------ | +| python | 3.9.2 | +| MindX SDK | 5.0RC1 | +| CANN | 310使用6.3.RC1
    310B使用6.2.RC1 | ### 1.3 软件方案介绍 @@ -68,20 +72,10 @@ ### 1.5 技术实现流程图 -(可放入流程图片) ![Image text](./img/tech_arch.png) ## 2 环境依赖 -请列出环境依赖软件和版本。 - -推荐系统为ubantu 18.04。 - -| 软件名称 | 版本 | -| -------- | ------ | -| MindX SDK | 5.0RC1 | -| ascend-toolkit | 6.2 | - 在编译运行项目前,需要设置环境变量: @@ -120,13 +114,3 @@ atc --input_shape="blob1:8,3,800,1408" --weight="model/count_person.caffe.caffem 生成的热度图保存在当前目录的heat_map文件夹下,并且每张热度图的命名以原图片名称为前缀以heatmap为后缀。此外,我们还在文件夹accuracy and performance code提供了精度与性能测试代码,将test.py和test.sh拷贝到主目录中然后执行sh test.sh即可运行精度与性能测试代码。 - - - -## 5 软件依赖说明 - -如果涉及第三方软件依赖,请详细列出。 - -| 依赖软件 | 版本 | 说明 | -| -------- | ----- | ------------------------ | -| python | 3.9.2 | 用于编译用户程序如main.py | \ No newline at end of file diff --git a/contrib/PortraitSegmentation/README.md b/contrib/PortraitSegmentation/README.md index 95cd397de..c55321fc4 100644 --- a/contrib/PortraitSegmentation/README.md +++ b/contrib/PortraitSegmentation/README.md @@ -18,11 +18,15 @@ ``` ## 3 依赖 + +推荐系统为ubantu 18.04。 + | 软件名称 | 版本 | -| :--------: | :------: | -|ubantu 18.04|18.04.1 LTS | -|MindX SDK|5.0rc1 | -|Python| 3.9.2| +| -------- | ------ | +| python | 3.9.2 | +| MindX SDK | 5.0RC1 | +| CANN | 310使用6.3.RC1
    310B使用6.2.RC1 | + 请注意MindX SDK使用python版本为3.9.2,如出现无法找到python对应lib库请在root下安装python3.9开发库 `apt-get install libpython3.9` diff --git a/contrib/RemoteSensingSegmentation/README.md b/contrib/RemoteSensingSegmentation/README.md index 1307b2b51..5c5c2e50d 100644 --- a/contrib/RemoteSensingSegmentation/README.md +++ b/contrib/RemoteSensingSegmentation/README.md @@ -6,10 +6,14 @@ 样例输出:输入图片的语义分割图 ### 1.1 支持的产品 -昇腾310(推理) +昇腾310B1(推理) ### 1.2 支持的版本 -本样例配套的CANN版本为 [6.2](https://www.hiascend.com/software/cann/commercial) ,MindX SDK版本为 [5.0RC1](https://www.hiascend.com/software/Mindx-sdk) 。 +| 软件名称 | 版本 | +| -------- | ------ | +| python | 3.9.2 | +| MindX SDK | 5.0RC1 | +| CANN | 310使用6.3.RC1
    310B使用6.2.RC1 | ### 1.3 目录结构 ``` diff --git a/contrib/SentimentAnalysis/README.md b/contrib/SentimentAnalysis/README.md index 04283c1ed..cc038e6f5 100644 --- a/contrib/SentimentAnalysis/README.md +++ b/contrib/SentimentAnalysis/README.md @@ -11,8 +11,14 @@ ### 1.2 支持的版本 -支持的SDK版本为5.0rc1。 -支持的CANN版本为6.2。 +推荐系统为ubantu 18.04。 + +| 软件名称 | 版本 | +| -------- | ------ | +| python | 3.9.2 | +| MindX SDK | 5.0RC1 | +| CANN | 310使用6.3.RC1
    310B使用6.2.RC1 | + ### 1.3 软件方案介绍 @@ -94,14 +100,6 @@ ![image](sdk/flowChart.jpg) ## 2 环境依赖 - -推荐系统为ubantu 18.04,环境依赖软件和版本如下表: - -| 软件名称 | 版本 | -| -------- | ------ | -| cmake | 3.10.2 | -| python | 3.9.2 | - 确保环境中正确安装mxVision SDK。 在编译运行项目前,需要设置环境变量: diff --git a/contrib/SentimentAnalysis/mxBase/SentimentAnalysis/SentimentAnalysis.h b/contrib/SentimentAnalysis/mxBase/SentimentAnalysis/SentimentAnalysis.h index a9a1895fe..f8636d9fb 100644 --- a/contrib/SentimentAnalysis/mxBase/SentimentAnalysis/SentimentAnalysis.h +++ b/contrib/SentimentAnalysis/mxBase/SentimentAnalysis/SentimentAnalysis.h @@ -1,6 +1,7 @@ #ifndef MXBASE_SENTIMENT_ANALYSIS_H #define MXBASE_SENTIMENT_ANALYSIS_H +#include #include "MxBase/ModelInfer/ModelInferenceProcessor.h" #include "MxBase/Tensor/TensorContext/TensorContext.h" diff --git a/contrib/SuperResolution/README.md b/contrib/SuperResolution/README.md index f59d84540..422cda7e5 100644 --- a/contrib/SuperResolution/README.md +++ b/contrib/SuperResolution/README.md @@ -15,11 +15,13 @@ ### 软件版本 -| 软件 | 版本 | 说明 | 获取方式 | -| ------------------- | ------------ | ----------------------------- | ------------------------------------------------------------ | -| mxVision | 5.0 RC1 | mxVision软件包 | [链接](https://www.hiascend.com/software/Mindx-sdk) | -| Ascend-CANN-toolkit | 6.2 | Ascend-cann-toolkit开发套件包 | [链接](https://www.hiascend.com/software/cann/commercial) | -| 操作系统 | Ubuntu 18.04 | 操作系统 | Ubuntu官网获取 +推荐系统为ubantu 18.04。 + +| 软件名称 | 版本 | +| -------- | ------ | +| python | 3.9.2 | +| MindX SDK | 5.0RC1 | +| CANN | 310使用6.3.RC1
    310B使用6.2.RC1 | ### 目录结构 diff --git a/contrib/VideoGestureRecognition/README.md b/contrib/VideoGestureRecognition/README.md index b804715d6..5536301e5 100644 --- a/contrib/VideoGestureRecognition/README.md +++ b/contrib/VideoGestureRecognition/README.md @@ -45,7 +45,17 @@ ``` ### 依赖 -| 依赖软件 | 版本 | 下载地址 | 说明 | + +推荐系统为ubantu 18.04。 + +| 软件名称 | 版本 | +| -------- | ------ | +| python | 3.9.2 | +| MindX SDK | 5.0RC1 | +| CANN | 310使用6.3.RC1
    310B使用6.2.RC1 | + + +| 第三方依赖软件 | 版本 | 下载地址 | 说明 | | ------------- | ------ | ------------------------------------------------------------ | -------------------------------------------- | | ffmpeg | 4.2.1 | [Link](https://github.com/FFmpeg/FFmpeg/archive/n4.2.1.tar.gz) | 视频转码解码组件 | @@ -151,14 +161,8 @@ cmake .. make -Scanning dependencies of target sample -[ 11%] Building CXX object CMakeFiles/sample.dir/main.cpp.o -[ 22%] Building CXX object CMakeFiles/sample.dir/StreamPuller/StreamPuller.cpp.o -[ 33%] Building CXX object CMakeFiles/sample.dir/VideoDecoder/VideoDecoder.cpp.o -[ 44%] Building CXX object CMakeFiles/sample.dir/ImageResizer/ImageResizer.cpp.o -[ 66%] Building CXX object CMakeFiles/sample.dir/ResnetDetector/ResnetDetector.cpp.o -[ 77%] Building CXX object CMakeFiles/sample.dir/MultiChannelVideoReasoner/MultiChannelVideoReasoner.cpp.o -[ 88%] Building CXX object CMakeFiles/sample.dir/FrameSkippingSampling/FrameSkippingSampling.cpp.o +.... + [100%] Linking CXX executable ../sample [100%] Built target sample # sample就是CMakeLists文件中指定生成的可执行文件。 diff --git a/contrib/ai_paint/README.md b/contrib/ai_paint/README.md index 23ee6ac87..8198027e1 100644 --- a/contrib/ai_paint/README.md +++ b/contrib/ai_paint/README.md @@ -6,21 +6,45 @@ - https://www.hiascend.com/zh/developer/mindx-sdk/landscape?fromPage=1 - https://gitee.com/ascend/samples/tree/master/cplusplus/contrib/AI_painting -## 2 模型转换 - 原模型为PB模型,通过atc工具可转换为对应OM模型。 - 本样例中在model目录下已提供om模型和对应转换脚本,如仓库限制无法获取大文件,请使用以下下载地址: + + +## 2 依赖 + +|软件名称 | 版本 | +|-----------|----------| +| python | 3.9.2 | +| MindX SDK | 5.0.rc1 | +| CANN | 310使用6.3.RC1
    310B使用6.2.RC1 | + +本样例无需外部依赖,在安装完成的SDK运行环境中即可执行。 + + +## 3 环境变量 + +``` +. /usr/local/Ascend/ascend-toolkit/set_env.sh #toolkit默认安装路径,根据实际安装路径修改 +. ${SDK_INSTALL_PATH}/mxVision/set_env.sh +``` + +## 4 模型转换 + 获取原模型PB模型,通过atc工具可转换为对应OM模型。 + - https://modelzoo-train-atc.obs.cn-north-4.myhuaweicloud.com/003_Atc_Models/AE/ATC%20Model/painting/AIPainting_v2.pb - - https://modelzoo-train-atc.obs.cn-north-4.myhuaweicloud.com/003_Atc_Models/AE/ATC%20Model/painting/AIPainting_v2.om +转换命令 -## 3 目录结构 +``` +atc --output_type=FP32 --input_shape="objs:9;coarse_layout:1,256,256,17" --input_format=NHWC --output="AIPainting_v2" --soc_version=Ascend310B1 --framework=3 --model="AIPainting_v2.pb" +``` + + +## 5 目录结构 ``` . |-------- model |-------- |---- AIPainting_v2.om //转换后的OM模型 |-------- |---- AIPainting_v2.pb //原始PB模型 -|-------- |---- model_conversion.sh //模型转换脚本 |-------- pipeline | |---- ai_paint.pipeline //流水线配置文件 |-------- python @@ -31,28 +55,18 @@ |-------- README.md ``` -## 4 依赖 - -|软件名称 | 版本 | -|-----------|----------| -| python | 3.9.2 | -| MindX SDK | 2.0.4 | -| CANN | 5.0.4 | - -本样例无需外部依赖,在安装完成的SDK运行环境中即可执行。 - -## 5 运行 +## 6 运行 1. 获取om模型 -2. run.sh脚本中LD_LIBRARY_PATH设置了ACL动态库链接路径为/usr/local/Ascend/ascend-toolkit/latest/acllib/lib64,如果实际环境中路径不一致,需要替换为实际的目录。 -3. 如果环境变量中没有MX_SDK_HOME变量,则需要在run.sh脚本中设置MX_SDK_HOME变量为你实际的MX_SDK安装目录。默认配置中MX_SDK_HOME为样例位于SDK自带sample目录时的相对路径。 -4. 若要执行样例: -修改python目录下net_config.ini文件中对应的网络参数,随后执行 -```bash -bash run.sh +2. 执行样例: +进入python目录, 修改net_config.ini文件中对应的网络参数,随后执行 ``` +python3 main.py +``` + 默认输出的矢量图layoutMap.jpg和结果图像resultImg.jpg位于result目录下 -5. 性能测试:默认已包含单次生成的时间计算并在命令行输出 + +3. 性能测试:默认已包含单次生成的时间计算并在命令行输出 ```shell Time cost = 'xxx'ms ``` \ No newline at end of file diff --git a/contrib/ai_paint/model/model_conversion.sh b/contrib/ai_paint/model/model_conversion.sh deleted file mode 100644 index b35f3f954..000000000 --- a/contrib/ai_paint/model/model_conversion.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/bash - -# Copyright(C) Huawei Technologies Co.,Ltd. 2012-2021 All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -# 该脚本用来将pb模型文件转换成.om模型文件 -# This is used to convert pb model file to .om model file. - - -# 设置环境变量(请确认install_path路径是否正确) -# Set environment PATH (Please confirm that the install_path is correct). - -export install_path=/usr/local/Ascend/ascend-toolkit/latest -export PATH=/usr/local/python3.9.2/bin:${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATH -export PYTHONPATH=${install_path}/atc/python/site-packages:${install_path}/atc/python/site-packages/auto_tune.egg/auto_tune:${install_path}/atc/python/site-packages/schedule_search.egg -export LD_LIBRARY_PATH=${install_path}/atc/lib64:$LD_LIBRARY_PATH -export ASCEND_OPP_PATH=${install_path}/opp - - -atc --output_type=FP32 --input_shape="objs:9;coarse_layout:1,256,256,17" --input_format=NHWC --output="AIPainting_v2" --soc_version=Ascend310 --framework=3 --model="AIPainting_v2.pb" \ No newline at end of file diff --git a/contrib/ai_paint/python/run.sh b/contrib/ai_paint/python/run.sh deleted file mode 100644 index 83eabcf5b..000000000 --- a/contrib/ai_paint/python/run.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/bash - -# Copyright 2020 Huawei Technologies Co., Ltd -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -set -e - -CUR_PATH=$(cd "$(dirname "$0")" || { warn "Failed to check path/to/run.sh" ; exit ; } ; pwd) - -# Simple log helper functions -info() { echo -e "\033[1;34m[INFO ][MxStream] $1\033[1;37m" ; } -warn() { echo >&2 -e "\033[1;31m[WARN ][MxStream] $1\033[1;37m" ; } - -export MX_SDK_HOME=${CUR_PATH}/../../../.. -export LD_LIBRARY_PATH=${MX_SDK_HOME}/lib:${MX_SDK_HOME}/opensource/lib:${MX_SDK_HOME}/opensource/lib64:/usr/local/Ascend/ascend-toolkit/latest/acllib/lib64:${LD_LIBRARY_PATH} -export GST_PLUGIN_SCANNER=${MX_SDK_HOME}/opensource/libexec/gstreamer-1.0/gst-plugin-scanner -export GST_PLUGIN_PATH=${MX_SDK_HOME}/opensource/lib/gstreamer-1.0:${MX_SDK_HOME}/lib/plugins - -# to set PYTHONPATH, import the StreamManagerApi.py -export PYTHONPATH=$PYTHONPATH:${MX_SDK_HOME}/python - -python3 main.py -exit 0 \ No newline at end of file diff --git a/contrib/msame/README.md b/contrib/msame/README.md index 02cbc9858..a69d10ff0 100644 --- a/contrib/msame/README.md +++ b/contrib/msame/README.md @@ -8,7 +8,17 @@ 本项目以昇腾Atlas300卡为主要的硬件平台。 ### 1.2 支持的版本 -MindX SDK mxVision:5.0rc1 + +推荐系统为ubantu 18.04。 + +| 软件名称 | 版本 | +| -------- | ------ | +| python | 3.9.2 | +| MindX SDK | 5.0RC1 | +| CANN | 310使用6.3.RC1
    310B使用6.2.RC1 | + + + ### 1.3 适用场景 @@ -42,14 +52,6 @@ MindX SDK mxVision:5.0rc1 ## 2 环境依赖 -推荐系统为ubuntu 18.04,环境依赖软件和版本如下表: - -| 软件名称 | 版本 | -| -------- | ------ | -| Python | 3.9.0 | -| mxVision | 5.0RC1 | -| numpy | 1.21.2 | - 软件依赖说明: | 依赖软件 | 版本 | 说明 | diff --git "a/docs/quickStart/4-4\346\250\241\345\236\213Tensor\346\225\260\346\215\256\345\244\204\347\220\206&\350\207\252\345\256\232\344\271\211\346\250\241\345\236\213\345\220\216\345\244\204\347\220\206.md" "b/docs/quickStart/4-4\346\250\241\345\236\213Tensor\346\225\260\346\215\256\345\244\204\347\220\206&\350\207\252\345\256\232\344\271\211\346\250\241\345\236\213\345\220\216\345\244\204\347\220\206.md" index 2d705c404..aaa1117e1 100644 --- "a/docs/quickStart/4-4\346\250\241\345\236\213Tensor\346\225\260\346\215\256\345\244\204\347\220\206&\350\207\252\345\256\232\344\271\211\346\250\241\345\236\213\345\220\216\345\244\204\347\220\206.md" +++ "b/docs/quickStart/4-4\346\250\241\345\236\213Tensor\346\225\260\346\215\256\345\244\204\347\220\206&\350\207\252\345\256\232\344\271\211\346\250\241\345\236\213\345\220\216\345\244\204\347\220\206.md" @@ -95,7 +95,7 @@ enum TensorDataType { APP_ERROR CheckTensorValid() const; ``` ## 样例说明 -参考[4-1插件开发调试指导](4-1插件开发调试指导.md)部署自定义插件样例,示例使用samplePluginPostProc作为工程名,远程目录名同样为samplePluginPostProc。 +参考[4-1插件开发调试指导](4-1插件开发调试指导.md)部署自定义插件样例,示例使用[samplePluginPostProc](../../tutorials/samplePluginPostProc/)作为工程名,远程目录名同样为samplePluginPostProc。 - 更改mxVision/C++/main.cpp中94行所使用的pipeline为样例中的SamplePluginPost.pipeline - 更改mxVision/python/main.py中32行使用的pipeline为样例中的SamplePluginPost.pipeline - 相比4-1样例中的SamplePlugin.pipeline,本样例中pipeline使用新后处理框架下的模型推理插件mxpi_tensorinfer输出原始Tensor至自定义插件并完成后处理示例。 diff --git a/mxVision/InferOfflineVideo/regular/README.zh.md b/mxVision/InferOfflineVideo/regular/README.zh.md index ee629aff8..cce26e543 100644 --- a/mxVision/InferOfflineVideo/regular/README.zh.md +++ b/mxVision/InferOfflineVideo/regular/README.zh.md @@ -21,21 +21,26 @@ InferOfflineVideo基于mxVision SDK开发的参考用例,以昇腾Atlas300卡 | 软件名称 | 版本 | | -------- | ------ | -| cmake | 3.5.1+ | -| mxVision | 0.2 | +| python | 3.9.2 | +| MindX SDK | 5.0RC1 | +| CANN | 310使用6.3.RC1
    310B使用6.2.RC1 | ## 3 准备 **步骤1:** 参考安装教程《mxVision 用户指南》安装 mxVision SDK。 -**步骤2:** 配置 mxVision SDK 环境变量。 +**步骤2:** 配置环境变量。 -`export MX_SDK_HOME=${安装路径}/mxVision ` - -注:本例中mxVision SDK安装路径为 /root/MindX_SDK。 +``` +. /usr/local/Ascend/ascend-toolkit/set_env.sh #toolkit默认安装路径,根据实际安装路径修改 +. ${SDK_INSTALL_PATH}/mxVision/set_env.sh +``` **步骤3:** 在regular目录下创建目录models `mkdir models`, 根据《mxVision 用户指南》中“模型支持列表”章节获取Yolov3种类模型,并放到该目录下。 +`若在310B设备上运行该案例,模型转换命令 --soc_version 修改为310B1` + + **步骤4:** 修改regular/pipeline/regular.pipeline文件: ①:将所有“rtspUrl”字段值替换为可用的 rtsp 流源地址(目前只支持264格式的rtsp流,例:"rtsp://xxx.xxx.xxx.xxx:xxx/input.264", 其中xxx.xxx.xxx.xxx:xxx为ip和端口号); diff --git a/tutorials/DvppWrapperSample/CMakeLists.txt b/tutorials/DvppWrapperSample/CMakeLists.txt index 45ae59c98..a888755d5 100644 --- a/tutorials/DvppWrapperSample/CMakeLists.txt +++ b/tutorials/DvppWrapperSample/CMakeLists.txt @@ -15,7 +15,7 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "../") set(CMAKE_CXX_FLAGS_DEBUG "-g") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,relro,-z,now,-z,noexecstack -pie") -set(MX_SDK_HOME ${SDK安装路径}) +set(MX_SDK_HOME "$ENV{MX_SDK_HOME}") # Header path include_directories( diff --git a/tutorials/DvppWrapperSample/README.md b/tutorials/DvppWrapperSample/README.md index ce2862963..b6f991909 100644 --- a/tutorials/DvppWrapperSample/README.md +++ b/tutorials/DvppWrapperSample/README.md @@ -4,6 +4,14 @@ ## 介绍 提供DvppWrapper接口样例,对图片实现编码,解码,缩放,抠图,以及把样例图片编码为264视频文件。 +## 支持的版本 + +| 软件名称 | 版本 | +| -------- | ------ | +| python | 3.9.2 | +| MindX SDK | 5.0RC1 | +| CANN | 310使用6.3.RC1
    310B使用6.2.RC1 | + ## 准备 打开百度图片https://image.baidu.com/,输入任何关键字,然后搜索,右击任意图片,点击另存为。把图片保存在DvppWrapperSample目录下。 @@ -11,13 +19,9 @@ **步骤1** 修改CMakeLists.txt文件 将set(MX_SDK_HOME ${SDK安装路径}) 中的${SDK安装路径}替换为实际的SDK安装路径 **步骤2** 设置环境变量 -ASCEND_HOME Ascend安装的路径,一般为/usr/local/Ascend -LD_LIBRARY_PATH 指定程序运行时依赖的动态库查找路径 ``` -export ASCEND_HOME=/usr/local/Ascend -export ASCEND_VERSION=nnrt/latest -export ARCH_PATTERN=. -export LD_LIBRARY_PATH=${MX_SDK_HOME}/lib/modelpostprocessors:${MX_SDK_HOME}/lib:${MX_SDK_HOME}/opensource/lib:${MX_SDK_HOME}/opensource/lib64:/usr/local/Ascend/driver/lib64:/usr/local/Ascend/ascend-toolkit/latest/acllib/lib64:/usr/local/Ascend/ascend-toolkit/latest/acllib/lib64:${LD_LIBRARY_PATH} +. /usr/local/Ascend/ascend-toolkit/set_env.sh #toolkit默认安装路径,根据实际安装路径修改 +. ${SDK_INSTALL_PATH}/mxVision/set_env.sh ``` **步骤3** cd到DvppWrapperSample目录下,执行如下编译命令: diff --git a/tutorials/samplePluginPostProc/CMakeLists.txt b/tutorials/samplePluginPostProc/CMakeLists.txt index dee9cab53..073839c0a 100644 --- a/tutorials/samplePluginPostProc/CMakeLists.txt +++ b/tutorials/samplePluginPostProc/CMakeLists.txt @@ -1,8 +1,7 @@ cmake_minimum_required(VERSION 3.6) project(plugin_sample) -#该语句中%MX_SDK_HOME%根据实际SDK安装位置修改,可通过在终端运行env命令查看 -#set(ENV{MX_SDK_HOME} %MX_SDK_HOME%) +set(MX_SDK_HOME "$ENV{MX_SDK_HOME}") add_subdirectory(./mxVision/C++) add_subdirectory(./mindx_sdk_plugin) \ No newline at end of file -- Gitee From eba93c72e677ea79997823b2114150693137a66e Mon Sep 17 00:00:00 2001 From: DlinR Date: Wed, 29 Mar 2023 13:36:13 +0800 Subject: [PATCH 29/61] no message --- contrib/MeterReader/README.md | 17 +++++++- contrib/MonocularDepthEstimation/README.md | 5 +-- .../InferOfflineVideo/regular/README.zh.md | 42 ------------------- .../InferOfflineVideo/regular/build_zlib.sh | 39 +++++++++++++++++ 4 files changed, 55 insertions(+), 48 deletions(-) create mode 100644 mxVision/InferOfflineVideo/regular/build_zlib.sh diff --git a/contrib/MeterReader/README.md b/contrib/MeterReader/README.md index 22f6eb4ea..0e8499f78 100644 --- a/contrib/MeterReader/README.md +++ b/contrib/MeterReader/README.md @@ -320,8 +320,8 @@ python match.py * 修改main.py原第64行代码 ```python - 64 show_animation = False - 65 if not args.no_animation: + 60 show_animation = False + 61 if not args.no_animation: ``` * 在main.py原第243行添加代码 @@ -380,5 +380,18 @@ python seg_evaluate.py 在转换模型时必须要在AIPP做色域转换,要不然模型输入不正确。 +### 6.2 精度推理报错 + +若运行精度推理时出现如下报错: +``` +AttributeError: 'FigureCanvasAgg' object has no attribute 'set_window_title' +``` +原因是matplotlib版本变动,修改方式如下: +``` +原始代码:fig.canvas.set_window_title(...) + +修改后:fig.canvas.manager.set_window_title(...) +``` + diff --git a/contrib/MonocularDepthEstimation/README.md b/contrib/MonocularDepthEstimation/README.md index 1c00134f6..6a05b5ad2 100644 --- a/contrib/MonocularDepthEstimation/README.md +++ b/contrib/MonocularDepthEstimation/README.md @@ -139,11 +139,8 @@ ex: python3 main.py image/test.jpg result/result.jpg python3 evaluate.py ``` -> ② 脚本运行请先赋予可执行权限 +> ② 脚本运行前请先赋予可执行权限 ```bash -# 赋予可执行权限 -chmod +x run.sh - # 说明:-m 运行模式 {infer | evaluate} -i infer模式下输入图片的路径 -o infer模式下输出结果的路径 # 推理模式 bash run.sh -m infer -i image/test.jpg -o result/result.jpg diff --git a/mxVision/InferOfflineVideo/regular/README.zh.md b/mxVision/InferOfflineVideo/regular/README.zh.md index cce26e543..bf556b940 100644 --- a/mxVision/InferOfflineVideo/regular/README.zh.md +++ b/mxVision/InferOfflineVideo/regular/README.zh.md @@ -92,48 +92,6 @@ sudo apt-get install g++-aarch64-linux-gnu ``` bash build_zlib.sh - - build_zlib.sh脚本详情如下: - #!/bin/bash - # Simple log helper functions - info() { echo -e "\033[1;34m[INFO ][Depend ] $1\033[1;37m" ; } - warn() { echo >&2 -e "\033[1;31m[WARN ][Depend ] $1\033[1;37m" ; } - - #Build - fileName="zlib" - packageFQDN="zlib@1.2.11-h2" - packageName="zlib" - cd "$fileName" || { - warn "cd to ./opensource/$fileName failed" - exit 254 - } - - info "Building dependency $packageFQDN." - chmod u+x configure - export LDFLAGS="-Wl,-z,noexecstack,-z,relro,-z,now,-s" - export CFLAGS="-fPIE -fstack-protector-all -fPIC -Wall -D_GLIBCXX_USE_CXX11_ABI=0" - export CPPFLAGS="-fPIE -fstack-protector-all -fPIC -Wall -D_GLIBCXX_USE_CXX11_ABI=0" - export CC=aarch64-linux-gnu-gcc - ./configure \ - --prefix="$(pwd)/../tmp/$packageName" \ - --shared || { - warn "Build $packageFQDN failed during autogen" - exit 254 - } - - make -s -j || { - warn "Build $packageFQDN failed during make" - exit 254 - } - - make install -j || { - warn "Build $packageFQDN failed during install" - exit 254 - } - - cd .. - info "Build $packageFQDN done." - ``` - 编译完成后,将生成文件拷贝至sdk的opensource diff --git a/mxVision/InferOfflineVideo/regular/build_zlib.sh b/mxVision/InferOfflineVideo/regular/build_zlib.sh new file mode 100644 index 000000000..7bde2d98a --- /dev/null +++ b/mxVision/InferOfflineVideo/regular/build_zlib.sh @@ -0,0 +1,39 @@ +#!/bin/bash +# Simple log helper functions +info() { echo -e "\033[1;34m[INFO ][Depend] $1\033[1;37m" ; } +warn() { echo >&2 -e "\033[1;31m[WARN ][Depend ] $1\033[1;37m" ; } + +#Build +fileName="zlib" +packageFQDN="zlib@1.2.11-h2" +packageName="zlib" +cd "$fileName" || { + warn "cd to ./opensource/$fileName failed" + exit 254 +} + +info "Building dependency $packageFQDN." +chmod u+x configure +export LDFLAGS="-Wl,-z,noexecstack,-z,relro,-z,now,-s" +export CFLAGS="-fPIE -fstack-protector-all -fPIC -Wall -D_GLIBCXX_USE_CXX11_ABI=0" +export CPPFLAGS="-fPIE -fstack-protector-all -fPIC -Wall -D_GLIBCXX_USE_CXX11_ABI=0" +export CC=aarch64-linux-gnu-gcc +./configure \ + --prefix="$(pwd)/../tmp/$packageName" \ + --shared || { + warn "Build $packageFQDN failed during autogen" + exit 254 +} + +make -s -j || { + warn "Build $packageFQDN failed during make" + exit 254 +} + +make install -j || { + warn "Build $packageFQDN failed during install" + exit 254 +} + +cd .. +info "Build $packageFQDN done." \ No newline at end of file -- Gitee From 3f58a6221857b7ed3b906c6115ec7b57d057d7b8 Mon Sep 17 00:00:00 2001 From: DlinR Date: Wed, 29 Mar 2023 14:33:12 +0800 Subject: [PATCH 30/61] no message --- contrib/TSM/README.md | 12 +++++++----- contrib/TSM/model/onnx2om.sh | 2 +- contrib/TSM/model/onnx2om1.sh | 2 +- contrib/TSM/online_infer.py | 1 + contrib/TSM/speed.py | 1 + mxVision/InferOfflineVideo/regular/build_zlib.sh | 15 +++++++++++++++ 6 files changed, 26 insertions(+), 7 deletions(-) diff --git a/contrib/TSM/README.md b/contrib/TSM/README.md index b548db7d4..47a1f4633 100644 --- a/contrib/TSM/README.md +++ b/contrib/TSM/README.md @@ -5,13 +5,15 @@ ### 1.1 支持的产品 -以昇腾Atlas310卡为主要的硬件平台 +以昇腾Atlas310B卡为主要的硬件平台 ### 1.2 支持的版本 -CANN:5.1RC2 - -SDK:3.0RC2(可通过cat SDK目录下的version.info查看) +| 软件名称 | 版本 | +| -------- | ------ | +| python | 3.9.2 | +| MindX SDK | 5.0RC1 | +| CANN | 310使用6.3.RC1
    310B使用6.2.RC1 | ### 1.3 软件方案介绍 @@ -66,7 +68,7 @@ SDK:3.0RC2(可通过cat SDK目录下的version.info查看) | 软件名称 | 版本 | |----------|--------| | cmake | 3.5+ | -| mxVision | 5.1RC2 | +| mxVision | 5.0RC1 | | Python | 3.9 | | torch | 1.10.0 | | ffmpeg | 4.2.1 | diff --git a/contrib/TSM/model/onnx2om.sh b/contrib/TSM/model/onnx2om.sh index 0d19f13b1..8a5ea0eff 100644 --- a/contrib/TSM/model/onnx2om.sh +++ b/contrib/TSM/model/onnx2om.sh @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -atc --model=./TSM.onnx --framework=5 --output=./TSM --input_format=NCDHW --soc_version=Ascend310 --precision_mode=allow_fp32_to_fp16 --op_select_implmode=high_precision +atc --model=./TSM.onnx --framework=5 --output=./TSM --input_format=NCDHW --soc_version=Ascend310B1 --precision_mode=allow_fp32_to_fp16 --op_select_implmode=high_precision if [ -f "./TSM.om" ]; then echo "success" diff --git a/contrib/TSM/model/onnx2om1.sh b/contrib/TSM/model/onnx2om1.sh index 27fa8baa2..07d12fce3 100644 --- a/contrib/TSM/model/onnx2om1.sh +++ b/contrib/TSM/model/onnx2om1.sh @@ -13,7 +13,7 @@ # limitations under the License. #!/bin/bash -atc --model=./jester.onnx --framework=5 --output=./jester --input_format=NCDHW --soc_version=Ascend310 --precision_mode=allow_fp32_to_fp16 --op_select_implmode=high_precision +atc --model=./jester.onnx --framework=5 --output=./jester --input_format=NCDHW --soc_version=Ascend310B1 --precision_mode=allow_fp32_to_fp16 --op_select_implmode=high_precision if [ -f "./jester.om" ]; then echo "success" diff --git a/contrib/TSM/online_infer.py b/contrib/TSM/online_infer.py index 1a666251c..0a241ecba 100644 --- a/contrib/TSM/online_infer.py +++ b/contrib/TSM/online_infer.py @@ -148,6 +148,7 @@ def main(): img_tran[1] = (image[1] / 255-0.456) / 0.224 img_tran[2] = (image[2] / 255-0.406) / 0.225 img_tran = np.array(img_tran).astype(np.float32) + img_tran = np.ascontiguousarray(np.expand_dims(img_tran, axis=0)) img_tran = sdk.Tensor(img_tran) img_tran.to_device(DEVICE_ID) inputs = [img_tran, ] + buffer diff --git a/contrib/TSM/speed.py b/contrib/TSM/speed.py index 7ffb89cf2..6a6d8ddd7 100644 --- a/contrib/TSM/speed.py +++ b/contrib/TSM/speed.py @@ -147,6 +147,7 @@ def main(): this_rst_list = [] md = sdk.model(FILE_PATH, DEVICE_ID) inputs = np.array(pil_img_list).astype(np.float32) + inputs = np.ascontiguousarray(np.expand_dims(inputs, axis=0)) t = sdk.Tensor(inputs) t.to_device(0) start_time = time.time() diff --git a/mxVision/InferOfflineVideo/regular/build_zlib.sh b/mxVision/InferOfflineVideo/regular/build_zlib.sh index 7bde2d98a..330a1d130 100644 --- a/mxVision/InferOfflineVideo/regular/build_zlib.sh +++ b/mxVision/InferOfflineVideo/regular/build_zlib.sh @@ -1,4 +1,19 @@ #!/bin/bash + +# Copyright 2023 Huawei Technologies Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + # Simple log helper functions info() { echo -e "\033[1;34m[INFO ][Depend] $1\033[1;37m" ; } warn() { echo >&2 -e "\033[1;31m[WARN ][Depend ] $1\033[1;37m" ; } -- Gitee From fd771921321b2007d684eb42b4624f9525388119 Mon Sep 17 00:00:00 2001 From: xuegangxiao Date: Wed, 29 Mar 2023 16:00:53 +0800 Subject: [PATCH 31/61] =?UTF-8?q?310B=E9=80=82=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contrib/InvoiceOCR/README.md | 7 ++++--- contrib/ReIDv2/README.md | 11 +++-------- contrib/ReIDv2/mainv2.py | 4 ++-- .../src/DBPostProcess/DBPostProcess.h | 2 +- tutorials/ImageDetectionSample/cpp/main.cpp | 4 ++-- tutorials/ImageDetectionSample/python/main.py | 3 ++- 6 files changed, 14 insertions(+), 17 deletions(-) diff --git a/contrib/InvoiceOCR/README.md b/contrib/InvoiceOCR/README.md index 1c0434bb2..8a5dc802c 100644 --- a/contrib/InvoiceOCR/README.md +++ b/contrib/InvoiceOCR/README.md @@ -104,6 +104,7 @@ npu-smi info | Python | 3.9.2 | | CANN | 5.0.4 | +(如果需要在310B上运行,mxVision版本需要5.0.RC1,CANN版本需要6.2.RC1。) 在编译运行项目前,需要设置环境变量: ``` @@ -142,19 +143,19 @@ ascend-toolkit-path:CANN安装路径 此处提供训练后的中间模型供模型转换使用:[resnet50](https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/contrib/Financial_bills-OCR/resnet.air)、[db](https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/contrib/Financial_bills-OCR/db.onnx)、[crnn](https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/contrib/Financial_bills-OCR/crnn.onnx) -在`./models/resnet50`目录下执行如下命令 +在`./models/resnet50`目录下执行如下命令(若用例执行在310B上,则--soc_version=Ascend310需修改为Ascend310B1) ``` atc --model=./resnet.air --framework=1 --output=resnet50 --input_format=NCHW --input_shape="x:1,3,224,224" --enable_small_channel=1 --soc_version=Ascend310 --insert_op_conf="aipp.config" ``` -在`./models/db`目录下执行如下命令 +在`./models/db`目录下执行如下命令(若用例执行在310B上,则--soc_version=Ascend310需修改为Ascend310B1) ``` atc --model=./db.onnx --framework=5 --output_type=FP32 --output=db --input_format=NCHW --input_shape="x:1,3,-1,-1" --dynamic_image_size="1216,1280;1280,1216;1120,1280;1280,1120;1024,1280;1280,1024;928,1280;1280,928;832,1280;1280,832;736,1280;1280,736;704,1280;1280,704;672,1280;1280,672;640,1280;1280,640;608,1280;1280,608;576,1280;1280,576;544,1280;1280,544;512,1280;1280,512;480,1280;1280,480;448,1280;1280,448" --soc_version=Ascend310 --insert_op_conf=./det_aipp.cfg ``` -在`./models/crnn`目录下执行如下命令 +在`./models/crnn`目录下执行如下命令(若用例执行在310B上,则--soc_version=Ascend310需修改为Ascend310B1) ``` atc --model=./crnn.onnx --framework=5 --output_type=FP32 --output=crnn --input_format=NCHW --input_shape="x:1,3,48,320" --soc_version=Ascend310 --insert_op_conf="rec_aipp.cfg" diff --git a/contrib/ReIDv2/README.md b/contrib/ReIDv2/README.md index e0adc6818..88ec072f8 100644 --- a/contrib/ReIDv2/README.md +++ b/contrib/ReIDv2/README.md @@ -69,6 +69,8 @@ ReID |Python| 3.9.12 | |numpy | 1.23.4 | |opencv_python| 4.6.0.66 | + +(如果需要在310B上运行,mxVision版本需要5.0.RC1,CANN版本需要6.2.RC1。) ``` apt-get install libpython3.9 ``` @@ -135,7 +137,7 @@ python3 ReID_pth2onnx.py --config_file='reid-strong-baseline/configs/softmax_tri ***1*** 设置环境变量 > 请重复一次4.1中步骤3的“设置环境变量(请确认install_path路径是否正确)”操作 -***2*** 使用ATC将.onnx文件转成为.om文件 +***2*** 使用ATC将.onnx文件转成为.om文件(若用例执行在310B上,则--soc_version=Ascend310需修改为Ascend310B1) ``` atc --framework=5 --model=ReID.onnx --output=ReID --input_format=NCHW --input_shape="image:1,3,256,128" --insert_op_conf=ReID_onnx2om.cfg --log=debug --soc_version=Ascend310 ``` @@ -170,13 +172,6 @@ ATC run success, welcome to the next use. ,也可以通过[Huawei Cloud](https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/contrib/ReID/ReID%E7%9B%B8%E5%85%B3%E6%96%87%E4%BB%B6.rar) 获取,然后将获取的图片放在“项目所在目录/data/gallerySet”中 (gallery下的图片必须是1920*1080大小的jpg) -``` -python3 makeYourOwnDataset.py --imageFilePath='data/ownDataset' --outputFilePath='data/cropOwnDataset' -``` -**步骤3** 根据“项目所在目录/data/cropOwnDataset”中的结果,选择自己想要查询的行人,按照market1501的命名方式命名(请务必按照这种命名方式命名,否则行人的标识会出现问题) -> 将同一个行人的不同照片重命名成“xxxx_xx”,其中前4位是行人ID,后2位是该照片ID,例:第1个行人的第2张照片:0001_02 -> 将制作好的行人底库图片放在“项目所在目录/data/querySet”中 - 5.2 运行 ``` diff --git a/contrib/ReIDv2/mainv2.py b/contrib/ReIDv2/mainv2.py index 9ebca2c15..e218200da 100644 --- a/contrib/ReIDv2/mainv2.py +++ b/contrib/ReIDv2/mainv2.py @@ -29,7 +29,7 @@ import numpy as np from mindx.sdk import base from mindx.sdk.base import ImageProcessor from PIL import Image -from mindx.sdk.base import Tensor, Model, Size, Rect, log, ImageProcessor, post, BTensor, Point +from mindx.sdk.base import Tensor, Model, Size, Rect, log, ImageProcessor, post, Point IN_PLUGIN_ID = 0 @@ -168,7 +168,7 @@ def get_pipeline_results(filepath): for x in range(len1): yolov3_outputs[x].to_host() n = np.array(yolov3_outputs[x]) - tensor = BTensor(n) + tensor = Tensor(n) inputs.append(tensor) yolov3_post_results = yolov3_post.process(inputs, [resizeinfo]) cropresizevec = [] diff --git a/mxVision/GeneralTextRecognition/src/DBPostProcess/DBPostProcess.h b/mxVision/GeneralTextRecognition/src/DBPostProcess/DBPostProcess.h index 09c057505..ffeb725bc 100644 --- a/mxVision/GeneralTextRecognition/src/DBPostProcess/DBPostProcess.h +++ b/mxVision/GeneralTextRecognition/src/DBPostProcess/DBPostProcess.h @@ -69,7 +69,7 @@ public: const std::vector &resizedImageInfos = {}, const std::map> &configParamMap = {}); - bool IsValidTensors(const std::vector &tensors) const override; + bool IsValidTensors(const std::vector &tensors) const; uint64_t GetCurrentVersion() override { diff --git a/tutorials/ImageDetectionSample/cpp/main.cpp b/tutorials/ImageDetectionSample/cpp/main.cpp index 693e0dc84..b9e78b10d 100644 --- a/tutorials/ImageDetectionSample/cpp/main.cpp +++ b/tutorials/ImageDetectionSample/cpp/main.cpp @@ -207,7 +207,7 @@ int main(int argc, char* argv[]) // 通过SendData函数传递输入信息到指定的工作元件模块 // streamName是pipeline文件中业务流名称;inPluginId为输入端口编号,对应输入元件的编号 ret = mxStreamManager->SendData(streamName, 0, dataBuffer); - if (ret != APP_ERR_OK){ + if (ret != APP_ERR_OK) { delete dataBuffer.dataPtr; LogError << "Fail to send data to stream, ret = " << ret << "."; return ret; @@ -217,7 +217,7 @@ int main(int argc, char* argv[]) std::vector keyVec = {"mxpi_objectpostprocessor0", "mxpi_imagedecoder0"}; std::vector output = mxStreamManager->GetProtobuf(streamName, 0, keyVec); ret = PrintInfo(output); - if (ret != APP_ERR_OK){ + if (ret != APP_ERR_OK) { LogError << "Fail to print the info of output, ret = " << ret << "."; return ret; } diff --git a/tutorials/ImageDetectionSample/python/main.py b/tutorials/ImageDetectionSample/python/main.py index 9c8e59ced..e2dee911d 100644 --- a/tutorials/ImageDetectionSample/python/main.py +++ b/tutorials/ImageDetectionSample/python/main.py @@ -164,7 +164,8 @@ if __name__ == '__main__': for item in bboxes.get('text'): text += item - cv2.putText(img, text, (bboxes.get('x0') + 10, bboxes.get('y0') + 10), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (255, 0, 0), 1) + cv2.putText(img, text, (bboxes.get('x0') + 10, \ + bboxes.get('y0') + 10), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (255, 0, 0), 1) cv2.rectangle(img, (bboxes.get('x0'), bboxes.get('y0')), (bboxes.get('x1'), bboxes.get('y1')), (255, 0, 0), 2) cv2.imwrite("./result.jpg", img) -- Gitee From 64dd3bc2a293c22dda0c91979166f367efcd33b0 Mon Sep 17 00:00:00 2001 From: xuegangxiao Date: Wed, 29 Mar 2023 17:39:23 +0800 Subject: [PATCH 32/61] clean code --- tutorials/ImageDetectionSample/cpp/README.md | 3 +-- tutorials/mxBaseVideoSample/README.md | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/tutorials/ImageDetectionSample/cpp/README.md b/tutorials/ImageDetectionSample/cpp/README.md index 115f79534..ef72e2b3f 100644 --- a/tutorials/ImageDetectionSample/cpp/README.md +++ b/tutorials/ImageDetectionSample/cpp/README.md @@ -126,10 +126,9 @@ Scanning dependencies of target sample ### 执行脚本 -执行run.sh脚本前请先确认可执行文件sample已生成。 +执行run.sh脚本前请先确认可执行文件sample已生成,并通过chmod+x run.sh给脚本添加可执行权限。 ``` -chmod +x run.sh bash run.sh ``` diff --git a/tutorials/mxBaseVideoSample/README.md b/tutorials/mxBaseVideoSample/README.md index 98ccd437b..c1a2e1202 100644 --- a/tutorials/mxBaseVideoSample/README.md +++ b/tutorials/mxBaseVideoSample/README.md @@ -112,10 +112,9 @@ Scanning dependencies of target stream_pull_test ### 执行脚本 -执行run.sh脚本前请先确认可执行文件stream_pull_test已生成。 +执行run.sh脚本前请先确认可执行文件stream_pull_test已生成,并通过chmod+x run.sh给脚本添加可执行权限。 ``` -chmod +x run.sh bash run.sh ``` -- Gitee From d795d704573971c83870dda5cf62e949b78a8be4 Mon Sep 17 00:00:00 2001 From: xuegangxiao Date: Wed, 29 Mar 2023 18:10:50 +0800 Subject: [PATCH 33/61] clean code --- tutorials/ImageDetectionSample/cpp/README.md | 2 +- tutorials/SamplePostProcess/src/yolov3/Yolov3PostProcess.h | 2 +- tutorials/mxBaseVideoSample/README.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tutorials/ImageDetectionSample/cpp/README.md b/tutorials/ImageDetectionSample/cpp/README.md index ef72e2b3f..a9b57ce69 100644 --- a/tutorials/ImageDetectionSample/cpp/README.md +++ b/tutorials/ImageDetectionSample/cpp/README.md @@ -126,7 +126,7 @@ Scanning dependencies of target sample ### 执行脚本 -执行run.sh脚本前请先确认可执行文件sample已生成,并通过chmod+x run.sh给脚本添加可执行权限。 +执行run.sh脚本前请先确认可执行文件sample已生成,并通过chmod给脚本添加可执行权限。 ``` bash run.sh diff --git a/tutorials/SamplePostProcess/src/yolov3/Yolov3PostProcess.h b/tutorials/SamplePostProcess/src/yolov3/Yolov3PostProcess.h index dfbfad788..0ca4851f7 100644 --- a/tutorials/SamplePostProcess/src/yolov3/Yolov3PostProcess.h +++ b/tutorials/SamplePostProcess/src/yolov3/Yolov3PostProcess.h @@ -45,7 +45,7 @@ struct NetInfo { } namespace MxBase { - class Yolov3PostProcess: public ObjectPostProcessBase + class Yolov3PostProcess : public ObjectPostProcessBase { public: Yolov3PostProcess() = default; diff --git a/tutorials/mxBaseVideoSample/README.md b/tutorials/mxBaseVideoSample/README.md index c1a2e1202..6074b6b91 100644 --- a/tutorials/mxBaseVideoSample/README.md +++ b/tutorials/mxBaseVideoSample/README.md @@ -112,7 +112,7 @@ Scanning dependencies of target stream_pull_test ### 执行脚本 -执行run.sh脚本前请先确认可执行文件stream_pull_test已生成,并通过chmod+x run.sh给脚本添加可执行权限。 +执行run.sh脚本前请先确认可执行文件stream_pull_test已生成,并通过chmod给脚本添加可执行权限。 ``` bash run.sh -- Gitee From 3a47599cfbcbbfb5e818de185eaf801786308e31 Mon Sep 17 00:00:00 2001 From: xuegangxiao Date: Thu, 30 Mar 2023 09:26:51 +0800 Subject: [PATCH 34/61] cleancode --- tutorials/ImageDetectionSample/cpp/README.md | 2 +- tutorials/mxBaseVideoSample/README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tutorials/ImageDetectionSample/cpp/README.md b/tutorials/ImageDetectionSample/cpp/README.md index a9b57ce69..b4095637d 100644 --- a/tutorials/ImageDetectionSample/cpp/README.md +++ b/tutorials/ImageDetectionSample/cpp/README.md @@ -126,7 +126,7 @@ Scanning dependencies of target sample ### 执行脚本 -执行run.sh脚本前请先确认可执行文件sample已生成,并通过chmod给脚本添加可执行权限。 +执行run.sh脚本前请先确认可执行文件sample已生成,并给脚本添加可执行权限。 ``` bash run.sh diff --git a/tutorials/mxBaseVideoSample/README.md b/tutorials/mxBaseVideoSample/README.md index 6074b6b91..877f66eae 100644 --- a/tutorials/mxBaseVideoSample/README.md +++ b/tutorials/mxBaseVideoSample/README.md @@ -112,7 +112,7 @@ Scanning dependencies of target stream_pull_test ### 执行脚本 -执行run.sh脚本前请先确认可执行文件stream_pull_test已生成,并通过chmod给脚本添加可执行权限。 +执行run.sh脚本前请先确认可执行文件stream_pull_test已生成,并给脚本添加可执行权限。 ``` bash run.sh -- Gitee From 8c9fabe51354f1fd1960d9f2b0cc4dc05b8df748 Mon Sep 17 00:00:00 2001 From: DlinR Date: Thu, 30 Mar 2023 14:09:37 +0800 Subject: [PATCH 35/61] no message --- contrib/Colorization/README.md | 22 +++--- contrib/Colorization/scripts/atc_run.sh | 8 +-- contrib/Colorization/scripts/run.sh | 8 --- contrib/DocumentLayoutAnalysis/README.md | 31 +++----- contrib/DocumentLayoutAnalysis/model/model.sh | 18 ++++- contrib/EdgeDetectionPicture/README.md | 53 ++++---------- contrib/FastSCNN/README.md | 72 ++++--------------- contrib/FastSCNN/text.pipeline | 2 +- contrib/ReID/README.md | 62 +++++----------- contrib/mxBase_wheatDetection/README.md | 46 ++++-------- .../yolov5PostProcess/Yolov5PostProcess.h | 2 +- 11 files changed, 100 insertions(+), 224 deletions(-) diff --git a/contrib/Colorization/README.md b/contrib/Colorization/README.md index 7578f1a89..41d6f4b8a 100644 --- a/contrib/Colorization/README.md +++ b/contrib/Colorization/README.md @@ -8,7 +8,7 @@ ### 1.1 支持的产品 -Atlas300推理芯片 +Atlas310B推理芯片 ### 1.2 代码目录结构与说明 @@ -31,20 +31,24 @@ Atlas300推理芯片 ## 2 环境依赖 -### 2.1 环境变量 - -模型转换和工程运行的环境变量已写入对应的shell脚本中 - -### 2.2 软件依赖 +### 2.1 软件依赖 | 依赖软件 | 版本 | |------------------|-------| -| CANN | 20.2.rc1| -| python | 3.9.2 | -| MindX_SDK | 2.0.4 | +| python | 3.9.2 | +| MindX SDK | 5.0RC1 | +| CANN | 310使用6.3.RC1
    310B使用6.2.RC1 | | opencv-python | 4.5.3 | | numpy | 1.21.2| +### 2.2 设置环境变量 + +``` +. /usr/local/Ascend/ascend-toolkit/set_env.sh #toolkit默认安装路径,根据实际安装路径修改 +. ${SDK_INSTALL_PATH}/mxVision/set_env.sh +``` + + ## 3 运行 示例步骤如下: diff --git a/contrib/Colorization/scripts/atc_run.sh b/contrib/Colorization/scripts/atc_run.sh index 1e7ef3a5b..b1472c801 100644 --- a/contrib/Colorization/scripts/atc_run.sh +++ b/contrib/Colorization/scripts/atc_run.sh @@ -13,11 +13,5 @@ # See the License for the specific language governing permissions and # limitations under the License. -export install_path=/usr/local/Ascend/ascend-toolkit/latest -export PATH=/usr/local/python3.9.2/bin:${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATH -export PYTHONPATH=${install_path}/atc/python/site-packages:$PYTHONPATH -export LD_LIBRARY_PATH=${install_path}/atc/lib64:${install_path}/acllib/lib64:$LD_LIBRARY_PATH -export ASCEND_OPP_PATH=${install_path}/opp - cd ../model -atc --input_shape="data_l:1,1,224,224" --weight="./colorization.caffemodel" --input_format=NCHW --output="colorization" --soc_version=Ascend310 --framework=0 --model="./colorization.prototxt" +atc --input_shape="data_l:1,1,224,224" --weight="./colorization.caffemodel" --input_format=NCHW --output="colorization" --soc_version=Ascend310B1 --framework=0 --model="./colorization.prototxt" diff --git a/contrib/Colorization/scripts/run.sh b/contrib/Colorization/scripts/run.sh index 8abca1228..daee7c58d 100644 --- a/contrib/Colorization/scripts/run.sh +++ b/contrib/Colorization/scripts/run.sh @@ -17,13 +17,5 @@ set -e INPUT_PIC="../data/dog.png" -export MX_SDK_HOME="${YOUR_PATH}/MindX_SDK/mxVision" -export LD_LIBRARY_PATH=${MX_SDK_HOME}/lib:${MX_SDK_HOME}/opensource/lib:${MX_SDK_HOME}/opensource/lib64:/usr/local/Ascend/ascend-toolkit/latest/acllib/lib64:${LD_LIBRARY_PATH} -export GST_PLUGIN_SCANNER=${MX_SDK_HOME}/opensource/libexec/gstreamer-1.0/gst-plugin-scanner -export GST_PLUGIN_PATH=${MX_SDK_HOME}/opensource/lib/gstreamer-1.0:${MX_SDK_HOME}/lib/plugins - -#to set PYTHONPATH, import the StreamManagerApi.py -export PYTHONPATH=$PYTHONPATH:${MX_SDK_HOME}/python - python3 ../src/main.py $INPUT_PIC exit 0 diff --git a/contrib/DocumentLayoutAnalysis/README.md b/contrib/DocumentLayoutAnalysis/README.md index a1aa7d072..c64f9833d 100644 --- a/contrib/DocumentLayoutAnalysis/README.md +++ b/contrib/DocumentLayoutAnalysis/README.md @@ -9,19 +9,19 @@ ### 1.1 支持的产品 -支持昇腾310芯片 +支持昇腾310B1芯片 ### 1.2 支持的版本 -支持22.0.2版本 +推荐系统为ubantu 18.04。 -版本号查询方法,在Atlas产品环境下,运行命令: - -```bash - npu-smi info -``` - -可以查询支持SDK的版本号 +| 软件名称 | 版本 | +| -------- | ------ | +| python | 3.9.2 | +| MindX SDK | 5.0RC1 | +| CANN | 310使用6.3.RC1
    310B使用6.2.RC1 | +|numpy|1.21.5| +|opencv-python|4.5.5| ### 1.3 软件方案介绍 @@ -57,18 +57,7 @@ ## 2 环境依赖 -| 软件名称 | 版本 | -| :--------: | :------: | -|Ubuntu|Ubuntu/Linaro 7.3.0-16ubuntu3| -|MindX SDK|mxVision-3.0.RC2| -|Python|3.9.2| -|CANN|5.1RC2| -|numpy|1.21.5| -|opencv-python|4.5.5| - -在编译运行项目前,需要设置环境变量: - -- 环境变量介绍 +在编译运行项目前,需要设置环境变量: ```bash # 执行环境变量脚本使环境变量生效 diff --git a/contrib/DocumentLayoutAnalysis/model/model.sh b/contrib/DocumentLayoutAnalysis/model/model.sh index 9dab5d9df..1f747479c 100644 --- a/contrib/DocumentLayoutAnalysis/model/model.sh +++ b/contrib/DocumentLayoutAnalysis/model/model.sh @@ -1 +1,17 @@ -atc --model=./picodet_lcnet_x1_0_fgd_layout_cdla_infer.onnx --framework=5 --output=./layout --soc_version=Ascend310 --insert_op_conf=./layout.aippconfig +#!/bin/bash + +# Copyright(C) 2023 . Huawei Technologies Co.,Ltd. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +atc --model=./picodet_lcnet_x1_0_fgd_layout_cdla_infer.onnx --framework=5 --output=./layout --soc_version=Ascend310B1 --insert_op_conf=./layout.aippconfig diff --git a/contrib/EdgeDetectionPicture/README.md b/contrib/EdgeDetectionPicture/README.md index 4823853f6..6982fec4a 100644 --- a/contrib/EdgeDetectionPicture/README.md +++ b/contrib/EdgeDetectionPicture/README.md @@ -6,11 +6,14 @@ 其中包含Rcf模型的后处理模块开发。 主要处理流程为: Init > ReadImage >Resize > Inference >PostProcess >DeInit #### 1.1 支持的产品 -昇腾310(推理) +昇腾310B1(推理) #### 1.2 支持的版本 -本样例配套的CANN版本为5.0.4,MindX SDK版本为2.0.4 -MindX SDK安装前准备可参考《用户指南》,[安装教程](https://gitee.com/ascend/mindxsdk-referenceapps/blob/master/docs/quickStart/1-1%E5%AE%89%E8%A3%85SDK%E5%BC%80%E5%8F%91%E5%A5%97%E4%BB%B6.md) +| 软件名称 | 版本 | +| -------- | ------ | +| python | 3.9.2 | +| MindX SDK | 5.0RC1 | +| CANN | 310使用6.3.RC1
    310B使用6.2.RC1 | #### 1.3 代码目录结构与说明 本sample工程名称为EdgeDetectionPicture,工程目录如下图所示: @@ -32,30 +35,13 @@ MindX SDK安装前准备可参考《用户指南》,[安装教程](https://git └── License ``` -## 2 环境依赖 -环境依赖软件和版本如下表: - - - -| 软件 | 版本 | 说明 | 获取方式 | -| ------------------- | ------------ | ----------------------------- | ------------------------------------------------------------ | -| mxVision | 2.0.4 | mxVision软件包 | [链接](https://www.hiascend.com/software/Mindx-sdk) | -| Ascend-CANN-toolkit | 5.0.4 | Ascend-cann-toolkit开发套件包 | [链接](https://www.hiascend.com/software/cann/commercial) | -| 操作系统 | Ubuntu 18.04 | 操作系统 | Ubuntu官网获取 | +## 2 环境依赖 | 在编译运行项目前,需要设置环境变量: - -- 环境变量介绍 - - ``` - export install_path=/usr/local/Ascend/ascend-toolkit/latest - export PATH=/usr/local/python3.9.2/bin:${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATH - export PYTHONPATH=${install_path}/atc/python/site-packages:${install_path}/atc/python/site-packages/auto_tune.egg/auto_tune:${install_path}/atc/python/site-packages/schedule_search.egg:$PYTHONPATH - export LD_LIBRARY_PATH=${install_path}/atc/lib64:$LD_LIBRARY_PATH - export ASCEND_OPP_PATH=${install_path}/opp - - ``` - +``` +. /usr/local/Ascend/ascend-toolkit/set_env.sh #toolkit默认安装路径,根据实际安装路径修改 +. ${SDK_INSTALL_PATH}/mxVision/set_env.sh +``` ## 3 模型转换 @@ -69,27 +55,16 @@ MindX SDK安装前准备可参考《用户指南》,[安装教程](https://git **步骤3** 执行模型转换命令 ``` -atc --model=rcf.prototxt --weight=./rcf_bsds.caffemodel --framework=0 --output=rcf --soc_version=Ascend310 --insert_op_conf=./aipp.cfg --input_format=NCHW --output_type=FP32 +atc --model=rcf.prototxt --weight=./rcf_bsds.caffemodel --framework=0 --output=rcf --soc_version=Ascend310B1 --insert_op_conf=./aipp.cfg --input_format=NCHW --output_type=FP32 ``` ## 4 编译与运行 **步骤1** 修改CMakeLists.txt文件 将set(MX_SDK_HOME ${SDK安装路径}) 中的${SDK安装路径}替换为实际的SDK安装路径 -**步骤2** 设置环境变量 -ASCEND_HOME Ascend安装的路径,一般为/usr/local/Ascend -LD_LIBRARY_PATH 指定程序运行时依赖的动态库查找路径,包括ACL,开源软件库,libmxbase.so的路径 -``` -export MX_SDK_HOME=${MX_SDK_HOME} -export ASCEND_HOME=/usr/local/Ascend -export ASCEND_VERSION=nnrt/latest -export ARCH_PATTERN=. -export LD_LIBRARY_PATH=${MX_SDK_HOME}/lib/modelpostprocessors:${MX_SDK_HOME}/lib:${MX_SDK_HOME}/opensource/lib:${MX_SDK_HOME}/opensource/lib64:/usr/local/Ascend/driver/lib64:/usr/local/Ascend/ascend-toolkit/latest/acllib/lib64:${LD_LIBRARY_PATH} -``` - -**步骤3** 执行如下编译命令: +**步骤2** 执行如下编译命令: bash build.sh -**步骤4** 进行图像边缘检测 +**步骤3** 进行图像边缘检测 请自行准备jpg格式的测试图像保存在文件夹中(例如 data/**.jpg)进行边缘检测 ``` ./edge_detection_picture ./data diff --git a/contrib/FastSCNN/README.md b/contrib/FastSCNN/README.md index d4092f9b3..7669966f9 100644 --- a/contrib/FastSCNN/README.md +++ b/contrib/FastSCNN/README.md @@ -8,13 +8,17 @@ ### 1.1 支持的产品 -本项目以昇腾Atlas310卡为主要的硬件平台 +本项目以昇腾Atlas310B卡为主要的硬件平台 ### 1.2 支持的版本 +推荐系统为ubantu 18.04。 -CANN:5.0.2 -SDK:mxVision 2.02(可通过cat SDK目录下的version.info查看) +| 软件名称 | 版本 | +| -------- | ------ | +| python | 3.9.2 | +| MindX SDK | 5.0RC1 | +| CANN | 310使用6.3.RC1
    310B使用6.2.RC1 | ### 1.3 软件方案介绍 @@ -68,53 +72,15 @@ SDK:mxVision 2.02(可通过cat SDK目录下的version.info查看) ​ -## 2 环境依赖 - - -推荐系统为ubantu 18.04,环境依赖软件和版本如下表: - -| 软件名称 | 版本 | -| -------- | ------ | -| python | 3.9.2 | -| cv2 | 4.5.3 | -| numpy | 1.21.1 | - - - - +## 2 设置环境变量 在编译运行项目前,需要设置环境变量: -- 环境变量介绍 - - -- MX_SDK_HOME 指向SDK安装包路径 -- LD_LIBRARY_PATH 用于指定查找共享库(动态链接库)时除了默认路径之外的其他路径。 -- PYTHONPATH Python中一个重要的环境变量,用于在导入模块的时候搜索路径 -- GST_PLUGIN_SCANNER 用于查找plugin相关的依赖和库 -- GST_PLUGIN_PATH 用于查找plugin相关的依赖和库 - - - - - -具体执行命令 ``` -export MX_SDK_HOME=${自己的SDK安装包路径} - -export LD_LIBRARY_PATH=${MX_SDK_HOME}/python:${MX_SDK_HOME}/lib:${MX_SDK_HOME}/opensource/lib:${MX_SDK_HOME}/opensource/lib64:/usr/local/Ascend/ascend-toolkit/5.0.2/acllib/lib64:/usr/local/Ascend/driver/lib64 - - -export PYTHONPATH=/usr/local/Ascend/ascend-toolkit/latest/pyACL/python/site-packages/acl:${MX_SDK_HOME}/python:/usr/local/Ascend/ascend-toolkit/latest/pyACL/python/site-packages/acl:${MX_SDK_HOME}/python/usr/local/Ascend/ascend-toolkit/latest/pyACL/python/site-packages/acl - -export GST_PLUGIN_SCANNER=${MX_SDK_HOME}/opensource/libexec/gstreamer-1.0/gst-plugin-scanner -export GST_PLUGIN_PATH=${MX_SDK_HOME}/opensource/lib/gstreamer-1.0:${MX_SDK_HOME}/lib/plugins - +. /usr/local/Ascend/ascend-toolkit/set_env.sh #toolkit默认安装路径,根据实际安装路径修改 +. ${SDK_INSTALL_PATH}/mxVision/set_env.sh ``` - -注:latest是软连接,这里指向CANN5.0.2版本 - ## 3.模型转换 本项目使用的模型是FastSCNN模型。 @@ -132,25 +98,13 @@ pth权重文件和onnx文件的下载链接如下: 1. 下载上述models压缩包,获取best_model.pth和fast_scnn_bs1.onnx模型文件放置FastSCNN/model目录下。 -2. 设置环境变量用以使用atc工具: - - ``` - export install_path=/usr/local/Ascend/ascend-toolkit/latest - export PATH=/usr/local/python3.9.2/bin:${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATH - export PYTHONPATH=${install_path}/atc/python/site-packages:$PYTHONPATH - export LD_LIBRARY_PATH=${install_path}/atc/lib64:${install_path}/acllib/lib64:$LD_LIBRARY_PATH:$LD_LIBRARY_PATH - export ASCEND_OPP_PATH=${install_path}/opp - ``` - - - -3. 进入FastSCNN/model文件夹下执行命令: +2. 进入FastSCNN/model文件夹下执行命令: ``` - atc --framework=5 --model=fast_scnn_bs1.onnx --output=fast_scnn_bs1 --output_type=FP16 --input_format=NCHW --insert_op_conf=./aipp_FastSCnn.aippconfig --input_shape="image:1,3,1024,2048" --log=debug --soc_version=Ascend310 + atc --framework=5 --model=fast_scnn_bs1.onnx --output=fast_scnn_bs1 --output_type=FP16 --input_format=NCHW --insert_op_conf=./aipp_FastSCnn.aippconfig --input_shape="image:1,3,1024,2048" --log=debug --soc_version=Ascend310B1 ``` -4. 执行该命令会在当前目录下生成项目需要的模型文件fast_scnn_bs1.om。执行后终端输出为: +3. 执行该命令会在当前目录下生成项目需要的模型文件fast_scnn_bs1.om。执行后终端输出为: ``` ATC start working now, please wait for a moment. diff --git a/contrib/FastSCNN/text.pipeline b/contrib/FastSCNN/text.pipeline index fbb61cb3c..45e1c8ad3 100644 --- a/contrib/FastSCNN/text.pipeline +++ b/contrib/FastSCNN/text.pipeline @@ -29,7 +29,7 @@ "mxpi_tensorinfer0": { "props": { "dataSource": "mxpi_imageresize0", - "modelPath": "../FastScnn_python/models/fast255.om" + "modelPath": "model/fast_scnn_bs1.om" }, "factory": "mxpi_tensorinfer", "next": "mxpi_dataserialize0" diff --git a/contrib/ReID/README.md b/contrib/ReID/README.md index a8047ad8d..55a23d472 100644 --- a/contrib/ReID/README.md +++ b/contrib/ReID/README.md @@ -33,15 +33,23 @@ ReID | 软件名称 | 版本 | | :--------: | :------: | |ubantu 18.04|18.04.1 LTS | -|CANN|5.0.4| -|MindX SDK|2.0.4| +|CANN|310使用6.3.RC1
    310B使用6.2.RC1| +|MindX SDK|5.0RC1| |Python| 3.9.2| |numpy | 1.21.0 | |opencv_python|4.5.2| + 请注意MindX SDK使用python版本为3.9.2,如出现无法找到python对应lib库请在root下安装python3.9开发库 ``` apt-get install libpython3.9 ``` +### 设置环境变量 + +``` +. /usr/local/Ascend/ascend-toolkit/set_env.sh #toolkit默认安装路径,根据实际安装路径修改 +. ${SDK_INSTALL_PATH}/mxVision/set_env.sh +``` + ## 4 模型转换 行人重识别先采用了yolov3模型将图片中的行人检测出来,然后利用ReID模型获取行人的特征向量。由于yolov3模型和ReID模型分别是基于Pytorch和Tensorflow的深度模型,我们需要借助ATC工具分别将其转换成对应的.om模型。 @@ -55,21 +63,12 @@ apt-get install libpython3.9 **步骤3** .om模型转换 以下操作均在“项目所在目录/models”路径下进行: -- 设置环境变量(请确认install_path路径是否正确) -``` -export install_path=/usr/local/Ascend/ascend-toolkit/latest -export PATH=/usr/local/python3.9.2/bin:${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATH -export PYTHONPATH=${install_path}/atc/python/site-packages:$PYTHONPATH -export LD_LIBRARY_PATH=${install_path}/atc/lib64:${install_path}/acllib/lib64:$LD_LIBRARY_PATH -export ASCEND_OPP_PATH=${install_path}/opp -export ASCEND_AICPU_PATH=/usr/local/Ascend/ascend-toolkit/latest/ -``` - 使用ATC将.pb文件转成为.om文件 ``` -atc --model=yolov3_tensorflow_1.5.pb --framework=3 --output=yolov3 --output_type=FP32 --soc_version=Ascend310 --input_shape="input:1,416,416,3" --out_nodes="yolov3/yolov3_head/Conv_6/BiasAdd:0;yolov3/yolov3_head/Conv_14/BiasAdd:0;yolov3/yolov3_head/Conv_22/BiasAdd:0" --log=info --insert_op_conf=aipp_nv12.cfg +atc --model=yolov3_tensorflow_1.5.pb --framework=3 --output=yolov3 --output_type=FP32 --soc_version=Ascend310B1 --input_shape="input:1,416,416,3" --out_nodes="yolov3/yolov3_head/Conv_6/BiasAdd:0;yolov3/yolov3_head/Conv_14/BiasAdd:0;yolov3/yolov3_head/Conv_22/BiasAdd:0" --log=info --insert_op_conf=aipp_nv12.cfg ``` -- 执行完模型转换脚本后,若提示如下信息说明模型转换成功,可以在该路径下找到名为yolov3.om模型文件。 +- 执行完模型转换命令后,若提示如下信息说明模型转换成功,可以在该路径下找到名为yolov3.om模型文件。 (可以通过修改output参数来重命名这个.om文件) ``` ATC run success, welcome to the next use. @@ -112,7 +111,7 @@ git clone https://github.com/michuanhaohao/reid-strong-baseline       [Google Drive](https://drive.google.com/drive/folders/1hn0sXLZ5yJcxtmuY-ItQfYD7hBtHwt7A)       [Huawei Cloud](https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/contrib/ReID/ReID%E7%9B%B8%E5%85%B3%E6%96%87%E4%BB%B6.rar) -***3*** 获取ReID_pth2onnx.py:[获取链接](https://gitee.com/ascend/modelzoo/blob/master/contrib/ACL_PyTorch/Research/cv/classfication/ReID_for_Pytorch/ReID_pth2onnx.py) +***3*** 获取ReID_pth2onnx.py:[获取链接](https://gitee.com/ascend/ModelZoo-PyTorch/blob/master/ACL_PyTorch/contrib/cv/classfication/ReID_for_Pytorch/ReID_pth2onnx.py)   将该脚本放在“项目所在目录/models”路径下,执行下列命令,生成.onnx模型文件 ``` python3 ReID_pth2onnx.py --config_file='reid-strong-baseline/configs/softmax_triplet_with_center.yml' MODEL.PRETRAIN_CHOICE "('self')" TEST.WEIGHT "('market_resnet50_model_120_rank1_945.pth')" @@ -125,12 +124,9 @@ python3 ReID_pth2onnx.py --config_file='reid-strong-baseline/configs/softmax_tri **步骤2** .onnx模型转.om模型 -***1*** 设置环境变量 -> 请重复一次4.1中步骤3的“设置环境变量(请确认install_path路径是否正确)”操作 - -***2*** 使用ATC将.onnx文件转成为.om文件 +使用ATC将.onnx文件转成为.om文件 ``` -atc --framework=5 --model=ReID.onnx --output=ReID --input_format=NCHW --input_shape="image:1,3,256,128" --insert_op_conf=ReID_onnx2om.cfg --log=debug --soc_version=Ascend310 +atc --framework=5 --model=ReID.onnx --output=ReID --input_format=NCHW --input_shape="image:1,3,256,128" --insert_op_conf=ReID_onnx2om.cfg --log=debug --soc_version=Ascend310B1 ``` - 执行完模型转换脚本后,若提示如下信息说明模型转换成功,可以在“项目所在目录/models”路径下找到名为ReID.om模型文件。(同样的,可以通过修改output参数来重命名这个.om文件) ``` @@ -194,31 +190,7 @@ python3 makeYourOwnDataset.py --imageFilePath='data/ownDataset' --outputFilePath ``` 步骤详见5: 数据集 ``` -6.3 配置环境变量 -``` -#执行如下命令,打开.bashrc文件 -cd $home -vi .bashrc -#在.bashrc文件中添加以下环境变量: - -export MX_SDK_HOME=${SDK安装路径}/mxVision - -export LD_LIBRARY_PATH=${MX_SDK_HOME}/lib:${MX_SDK_HOME}/opensource/lib:${MX_SDK_HOME}/opensource/lib64:${MX_SDK_HOME}/opensource/lib64:/usr/local/Ascend/ascend-toolkit/latest/acllib/lib64:/usr/local/Ascend/driver/lib64/ - -export PYTHONPATH=${MX_SDK_HOME}/python - -export GST_PLUGIN_SCANNER=${MX_SDK_HOME}/opensource/libexec/gstreamer-1.0/gst-plugin-scanner - -export GST_PLUGIN_PATH=${MX_SDK_HOME}/opensource/lib/gstreamer-1.0:${MX_SDK_HOME}/lib/plugins - -#保存退出.bashrc -#执行如下命令使环境变量生效 -source ~/.bashrc - -#查看环境变量 -env -``` -6.4 配置pipeline +6.3 配置pipeline 根据所需场景,配置pipeline文件,调整路径参数等。 ``` # 配置mxpi_tensorinfer插件的yolov3.om模型加载路径(lines 26-33) @@ -264,7 +236,7 @@ env }, ``` -6.5 执行 +6.4 执行 ``` python3 main.py --queryFilePath='data/querySet' --galleryFilePath='data/gallerySet' --matchThreshold=0.3 ``` diff --git a/contrib/mxBase_wheatDetection/README.md b/contrib/mxBase_wheatDetection/README.md index bccb0c9b0..7464a5575 100644 --- a/contrib/mxBase_wheatDetection/README.md +++ b/contrib/mxBase_wheatDetection/README.md @@ -10,7 +10,7 @@ Init > ReadImage >Resize > Inference >PostProcess >DeInit ### 1.1 支持的产品 -支持昇腾310芯片 +支持昇腾310B芯片 ### 1.2 软件方案介绍 @@ -58,13 +58,13 @@ Init > ReadImage >Resize > Inference >PostProcess >DeInit ## 2 环境依赖 -推荐系统为ubantu 18.04,环境依赖软件和版本如下表: +推荐系统为ubantu 18.04。 | 软件名称 | 版本 | -| :--------: | :------: | -|Ubantu|18.04| -|MindX SDK|2.0.4| -|Python|3.9.2| +| -------- | ------ | +| python | 3.9.2 | +| MindX SDK | 5.0RC1 | +| CANN | 310使用6.3.RC1
    310B使用6.2.RC1 | ## 模型转换 @@ -88,20 +88,18 @@ python export.py --weights best_v3.pt --img 416 --batch 1 --simplify **步骤3** 执行模型转换命令 (1) 配置环境变量 -#### 设置环境变量(请确认install_path路径是否正确) +#### 设置环境变量 #### Set environment PATH (Please confirm that the install_path is correct). -```c -export install_path=/usr/local/Ascend/ascend-toolkit/latest -export PATH=/usr/local/python3.9.2/bin:${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATH -export PYTHONPATH=${install_path}/atc/python/site-packages:${install_path}/atc/python/site-packages/auto_tune.egg/auto_tune:${install_path}/atc/python/site-packages/schedule_search.egg:$PYTHONPATH -export LD_LIBRARY_PATH=${install_path}/atc/lib64:$LD_LIBRARY_PATH -export ASCEND_OPP_PATH=${install_path}/opp + +``` +. /usr/local/Ascend/ascend-toolkit/set_env.sh #toolkit默认安装路径,根据实际安装路径修改 +. ${SDK_INSTALL_PATH}/mxVision/set_env.sh ``` (2) 转换模型 ``` -atc --model=./best_v3_t.onnx --framework=5 --output=./onnx_best_v3 --soc_version=Ascend310 --insert_op_conf=./aipp.aippconfig --input_shape="images:1,3,416,416" --output_type="Conv_1228:0:FP32;Conv_1276:0:FP32;Conv_1324:0:FP32" --out_nodes="Conv_1228:0;Conv_1276:0;Conv_1324:0" +atc --model=./best_v3_t.onnx --framework=5 --output=./onnx_best_v3 --soc_version=Ascend310B1 --insert_op_conf=./aipp.aippconfig --input_shape="images:1,3,416,416" --output_type="Conv_1228:0:FP32;Conv_1276:0:FP32;Conv_1324:0:FP32" --out_nodes="Conv_1228:0;Conv_1276:0;Conv_1324:0" ``` ## 使用场景概括 @@ -132,31 +130,13 @@ atc --model=./best_v3_t.onnx --framework=5 --output=./onnx_best_v3 --soc_version **步骤1** -修改CMakeLists.txt文件 -``` -将set(MX_SDK_HOME ${SDK安装路径}) 中的${SDK安装路径}替换为实际的SDK安装路径 -``` - -**步骤2** - -ASCEND_HOME Ascend安装的路径,一般为/usr/local/Ascend -LD_LIBRARY_PATH 指定程序运行时依赖的动态库查找路径,包括ACL,开源软件库,libmxbase.so以及libyolov3postprocess.so的路径 -``` -export ASCEND_HOME=/usr/local/Ascend -export ASCEND_VERSION=nnrt/latest -export ARCH_PATTERN=. -export LD_LIBRARY_PATH=${MX_SDK_HOME}/lib/modelpostprocessors:${MX_SDK_HOME}/lib:${MX_SDK_HOME}/opensource/lib:${MX_SDK_HOME}/opensource/lib64:/usr/local/Ascend/driver/lib64:/usr/local/Ascend/ascend-toolkit/latest/acllib/lib64:${LD_LIBRARY_PATH} -``` - -**步骤3** - cd到mxBase_wheatDetection目录下,执行如下编译命令: ``` bash build.sh ``` -**步骤4** +**步骤2** 制定jpg图片进行推理,将需要进行推理的图片放入mxBase_wheatDetection目录下的新文件夹中,例如mxBase_wheatDetection/test。 eg:推理图片为xxx.jpg cd 到mxBase_wheatDetection目录下 diff --git a/contrib/mxBase_wheatDetection/yolov5PostProcess/Yolov5PostProcess.h b/contrib/mxBase_wheatDetection/yolov5PostProcess/Yolov5PostProcess.h index 0f775c352..a0894fb8e 100644 --- a/contrib/mxBase_wheatDetection/yolov5PostProcess/Yolov5PostProcess.h +++ b/contrib/mxBase_wheatDetection/yolov5PostProcess/Yolov5PostProcess.h @@ -61,7 +61,7 @@ public: const std::vector &resizedImageInfos = {}, const std::map> ¶mMap = {}) override; protected: - bool IsValidTensors(const std::vector &tensors) const override; + bool IsValidTensors(const std::vector &tensors) const; void ObjectDetectionOutput(const std::vector &tensors, std::vector> &objectInfos, -- Gitee From 29fc3ccac9e978d05a06ab68278ea1855cbc8053 Mon Sep 17 00:00:00 2001 From: DlinR Date: Thu, 30 Mar 2023 16:34:43 +0800 Subject: [PATCH 36/61] no message --- contrib/PassengerflowEstimation/README.md | 44 ++++++------------ .../PassengerflowEstimation/images/image4.png | Bin 588734 -> 0 bytes .../pipeline/passengerflowestimation.pipeline | 2 +- contrib/PersonCount/README.md | 9 +++- 4 files changed, 23 insertions(+), 32 deletions(-) delete mode 100644 contrib/PassengerflowEstimation/images/image4.png diff --git a/contrib/PassengerflowEstimation/README.md b/contrib/PassengerflowEstimation/README.md index 501641754..b604c15cc 100644 --- a/contrib/PassengerflowEstimation/README.md +++ b/contrib/PassengerflowEstimation/README.md @@ -6,11 +6,17 @@ passengerflowestimation基于MindXSDK开发,在昇腾芯片上进行客流量 ### 1.1支持的产品 -本产品以昇腾310(推理)卡为硬件平台。 +本产品以昇腾310B1(推理)卡为硬件平台。 ### 1.2支持的版本 -该项目支持的SDK版本为2.0.4,CANN版本为5.0.4。 +推荐系统为ubantu 18.04。 + +| 软件名称 | 版本 | +| -------- | ------ | +| python | 3.9.2 | +| MindX SDK | 5.0RC1 | +| CANN | 310使用6.3.RC1
    310B使用6.2.RC1 | ### 1.3软件方案介绍 @@ -70,31 +76,13 @@ passengerflowestimation基于MindXSDK开发,在昇腾芯片上进行客流量 ## 2环境依赖 -推荐系统为ubuntu 18.04,环境以来软件和版本如下: - -| 软件名称 | 版本 | 说明 | 获取方式 | -| ------------------- | ----- | ----------------------------- | --------------------------------------------------------- | -| MindX SDK | 2.0.4 | mxVision软件包 | [链接](https://www.hiascend.com/software/Mindx-sdk) | -| ubuntu | 18.04 | 操作系统 | 请上ubuntu官网获取 | -| Ascend-CANN-toolkit | 5.0.4 | Ascend-cann-toolkit开发套件包 | [链接](https://www.hiascend.com/software/cann/commercial) | - 在项目编译运行时候,需要设置环境变量: ``` . /usr/local/Ascend/ascend-toolkit/set_env.sh . ${SDK安装路径}/mxVision/set_env.sh - -export install_path=/usr/local/Ascend/ascend-toolkit/latest -export PATH=${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATH -export PYTHONPATH=${install_path}/atc/python/site-packages:${install_path}/atc/python/site-packages/auto_tune.egg/auto_tune:${install_path}/atc/python/site-packages/schedule_search.egg -export LD_LIBRARY_PATH=${install_path}/atc/lib64:$LD_LIBRARY_PATH -export ASCEND_OPP_PATH=${install_path}/opp ``` -注:其中SDK安装路径${MX_SDK_HOME}替换为用户的SDK安装路径。并且本项目用到了mxpi_opencvosd插件,使用mxpi_opencvosd插件前,需要使用osd相关的模型文件,请执行MindX SDK开发套件包安装目录下operators/opencvosd/generate_osd_om.sh脚本生成所需模型文件(在generate_osd_om.sh所在文件夹下执行`bash generate_osd_om.sh `,若这条命令执行失败,则将passengerflowestimation目录下的.om文件移动到generate_osd_om.sh所在的文件夹目录下MindXSDK安装路径/mxVision/operators/opencvosd下)。{install_path}替换为开发套件包所在路径。**(注:开头两行为每次一重新开启终端执行程序就需要输入,此外的其他为转换模型需要,若已经转换模型成功,则不需要输入这些)** - - - ## 3 软件依赖 推理中涉及到第三方软件依赖如下表所示。 @@ -108,7 +96,7 @@ export ASCEND_OPP_PATH=${install_path}/opp ## 4 模型转换 -本项目中使用的模型是yolov4模型,onnx模型可以直接[下载](https://www.hiascend.com/zh/software/modelzoo/detail/1/abb7e641964c459398173248aa5353bc)。下载后使用模型转换工具ATC将onnx模型转换为om模型,模型转换工具相关介绍参考链接:https://gitee.com/ascend/docs-openmind/blob/master/guide/mindx/sdk/tutorials/%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99.md +本项目中使用的模型是yolov4模型,onnx模型可以直接[下载](https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/contrib/PassengerflowEstimation/ATC%20Yolov4%28FP16%29%20from%20Pytorch.zip)。下载后使用模型转换工具ATC将onnx模型转换为om模型,模型转换工具相关介绍参考链接:https://gitee.com/ascend/docs-openmind/blob/master/guide/mindx/sdk/tutorials/%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99.md 模型转换步骤如下: @@ -116,7 +104,7 @@ export ASCEND_OPP_PATH=${install_path}/opp 2. 进入`passengerflowestimation/models`文件夹下面执行命令**(注:提前设置好环境变量)**: ``` -atc --model=${模型路径}/passengerflowestimation.onnx --framework=5 --output=${输出.om模型路径}/yolov4 --input_format=NCHW --output_type=FP32 --soc_version=Ascend310 --input_shape="input:1,3,608,608" --log=info --insert_op_conf=${aipp文件路径}/aipp_Passengerflowdetection.config +atc --model=${模型路径}/passengerflowestimation.onnx --framework=5 --output=${输出.om模型路径}/yolov4 --input_format=NCHW --output_type=FP32 --soc_version=Ascend310B1 --input_shape="input:1,3,608,608" --log=info --insert_op_conf=${aipp文件路径}/aipp_Passengerflowdetection.config ``` 执行该命令后会在指定输出.om模型路径生成项目指定模型文件`passengerflowestimation.om`。若模型转换成功则输出: @@ -225,12 +213,11 @@ aipp_op{ bash build.sh ``` -命令执行成功之后会在passengerflowestimation/plugins/mxpi_passengerflowestimation和passengerflowestimation/plugins/mxpi_selectobject目录下分别生成build文件夹。将build文件夹下生成的.so下载后上传到${SDK安装路径}/mxVision/lib/plugins目录下。在生成build文件夹后,进入到build目录下执行如下指令: +命令执行成功之后会在plugins/mxpi_passengerflowestimation和plugins/mxpi_selectobject目录下分别生成build文件夹 -``` -chmod 640 libmxpi_passengerflowestimation.so -chmod 640 libmxpi_selectobject.so -``` +在生成build文件夹后,进入到build目录,修改生成的so动态库权限为440 + +将修改权限的.so拷贝到${SDK安装路径}/mxVision/lib/plugins目录下 @@ -254,5 +241,4 @@ python3 main.py ![img](https://gitee.com/distancemay/mindxsdk-referenceapps/raw/master/contrib/PassengerflowEstimation/images/image5.png) ## 8适用场景 -本项目适用于俯视角度较大,并且人流量不是非常密集的视频中人流量统计。若人流非常密集,由于yolov4模型识别人体不准确,故无法准确统计客流量。并且在视频中的画线要尽量水平。待检测的视频最好如下所示: -![img](https://gitee.com/distancemay/mindxsdk-referenceapps/raw/master/contrib/PassengerflowEstimation/images/image4.png) \ No newline at end of file +本项目适用于俯视角度较大,并且人流量不是非常密集的视频中人流量统计。若人流非常密集,由于yolov4模型识别人体不准确,故无法准确统计客流量。并且在视频中的画线要尽量水平。 \ No newline at end of file diff --git a/contrib/PassengerflowEstimation/images/image4.png b/contrib/PassengerflowEstimation/images/image4.png deleted file mode 100644 index 0a74cddb050c1356fd280ae9b97cf74fc0224183..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 588734 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

    Mu*-OC1E3mV4Bv8a!xq(=AvZrH_!Ql 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 z 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

    (M+OAz`PSk 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

    )j2I>B>3G9dAEIn8y;T5F{z};(Zpe7 zp)&h=IGndWS|m336$o$9n{m6c>7rosR_awD5@5SN3Tcc%h(KzcL}Xr=g02xQ@0y5v z`z9l?MhMkvU{dx3N*b|R6a*Yu!72uP;R zN>^*syub)LxeyS(IU+>U zqxaWb6&7?(+E+#0KnjfWUt=6+^E~x4W&x$uiQAG=JAxsne$D@>cGgk`hH$}f)G~UZ zfhO|jyeHEPc2uq(*{X-HZPF%x|3IdM?in zOb2it7sVaL9qB{^=O3xlo0tpC6iO(f)^4r1Dc?rO1|&qQ)%P*pUdE55rCY<^J3kYZIt%;~4Z*KbIQ%Jq=`@xC1)B zo9B9e*Tq!?qk4}(DFl!YQO*S8_8aLW&87cCKauHLB2c`u18Uw8fPv({kQ~G32LKK! zuVcBn7lE*)jv){oH-iPzYf{yxcX@7ZA15?7eD>Q&r?6^=3n%Z4AE$2~@i)8MySo7e zt653`d_h38ahLHf5L-p$%;_wUV;(#1?YoY*`CIA{{zP3P$mzJ}nDdM|nlNzhX1 zWV7I(%W(w$k#m)I-kNd5ikK#)`Ock#60#M~`yLcoSJC2-F<4Iuqm42fvst|91bGr) zPx_qdi^ED6W;s+0adg9|?Dx}yYCwc|j3ymP;4|y{noSR?#Vb_3D?fnzTTOfZ3dR^< zZQandt32B z$NHdkwVW+4;-$cZ63Jja>@+g>5NS**j{sEZUDD2BP(oS|CKtvcb7T(ER*&vXyeYQR zjs{t;NekzL{3|cqJj+P~jm6klP5zVN?@~>iNJiq+h4oaYy@O~RO>x)(Ohs1-d%n4#^yF71nVTx&vY)F!~m*9av zo~hRuxAuNi($T*;*`LdG71!x1M|0#9E^9P)IU*j85hJLcN;#krX>Rp|gCC_deSDkRC4-Y$ef?3w1gflD>au+`)7}bm^_sm~{XOYYv@2$Q zA0c#a`57Ry&;pr^j{L}NkYc6>A)%#2^5bO9C)#SK~Ex2#YJILLjWc=&I_ia zKYWvd8!@bFTd~mp3KSTITz_c*i{`{EGPVPR%%!x!&Sj)jy|VQ->Qh^Rqs!bbr^Ox< zT}R$8RMEmg!%ZPQ58rP*^!G9#@)ffT}6 z>f)?~r+VX3kU4u?m9~ ze{qGgQ^3KNOuRCIU!O03V^EenS%C71c71k>1YMdMD=pQ__!eC1nWT-k@rujahKmIrtiq8fBlFU?Tnah zWUd0184@XLXMXH)Y8W~Uw?|SZh0eN85z0YJ$m=qgHhI;)J}K}a#hus>k`9`0k%wL0 z>WLsaPo*5k6PG>{kfrPs`Xta)LsVW@ju0Njc#rvubOzqu(OMBgY$Gk}y6>jAXD_hs z5>D0cTupXd;s|%glQV(Fn!?WuHd%u5C@Qs_>QYEx$+NA6%LSh}$&6+1`W3h@H5At_ z1`R7LTI^-B>4^7rwA47AOp3Y(8P^|dboxU3PsWSM-=HSwn;goA@u9Vhr1-du5bIc& za*uvWu?e@^gE&n2De2k|_L+vHun<8$(<1)(=dGnZwf_w&w_ zf0Jm){N7=7B$=k*hD&M3=OGYPM+RNKw?NiuD7dPsil^abZ*LEv*VrRXn%98&?z>SV z#}}=AgJ^Ojv%OvCZx^a_JOF13xZfWR%X5J*pdkhbtQ&j}zfFLD>+to`B>ZB5oVN7E zy)1z`4BHf!Kt%WlJF%kjTOjIr9_R5C$c=h(dfHq(a+~8Bgw|MMjr)sMdt_GHD5`@N zo~f%OGW?sIY?|m;KSA8&N6R_t@2H`8SI~CRHpb+F z{zBSl7V;7@g3Y#X%k@8+&N`~;_iy8)N4n7^F}kFY&LNF-BaO6lN+XPrknWTe5a~v` zI|QUb8U*QlKHuk@-{=4BoSp67{f_H;U46PU7OL>`Fx8p%T4eB}fQ)*I6x0qjZ?PqZ$+TSSBUT= zK|EY`AfqgMB`!9g^aav;!W z6$$b;p3>)$MVU-2YkQ?}biY)o350VifzdT}@`5YInIbaQ~ zk5!8l^cJjrCLmM5E*lR<5ux@CGiMb?g12TMg61pWI6prZ=Q8s5@o-6r-FE+Zo3m{Z zTb#MmC$W^E@U@U~wYc5N>pa)>)8zhs@8|xr{Fyg0fKLC_Yei*}jcru92=lvZxyIgU zfA>!jKA&Injh%Jtp1*(dqJ(G?Z-1R6=VfX1SL1&_m9KZ08giT3p7T4->6WNJiUlg( z&uS0H(c*=;Y~H?k&sx7b>V@@Trg0PHz3-%&Hx#fc-ao#}?!D^(?ojgTX^(8r0;(%P z!45Y|vHAl6KpnmasNB!r0FE_3U}mzI5OH5}8hE4X_6l%1>y4(2?99395NaDQ%mM2% zeqvS?7oI6*k*`R+uV3p{e|Yz8;lD{>$vuWj>~DWgePSTUi`@VZCg ztpzBLePqtg10crfv1^^>!*D^Uv1X#dfFwV_*LS+b5?H+&FEjvZ7%hTE0}l61cDJ$o zZ&#(_7ps1AJ$7V28yq#2pKUPYNH3Awc1ryeb1XGFU-1+56DC{t@|F9S3Zprc~w+S!{c`2K-}uwWCrP*Tc07RR3{OERRX>X9m-A|nv-TuM=4S!D!!sDf>J~KBzd^dgbDN91L(WfuUl9V>CX&hOX=ozQDf-uMeFIG+_-ZC!QkK zCUe?m4#v6>S{7ZlM6(F`DM%UHAgol0VQPpo>K@Y*Lo)IRxfVhsGtP~!<{ny*V^Gkh zboT;O$E@f?EeR(Kb7QcdS1mMhA^T(~L=}WkE*{zXveF(> z`ESTUK{%VAWVyi6H1KA|y&EkXbsfT)J2(M%7uo%vy8XwZ(aqMM9~haBb;joC(WkMVMeJ%fh>YO=H$QtCc#yvK1&h)KEFh)O+hJ6u}AlKmyoi z$v`NdZ3resPFLuJPG0Ou$xwIRbY_G4bG(+O`$aygfsb&)Lto6n_VzCGiKlzQhbl?c zO4^rvbLTqR+TK87^r>KW-#^YbDsVgnj+~Y5NmteoL{_lZ1LoTmhR4P3?EC13gpqL|x$lSq~K! zlqZ_IMv^Ru)y?#8XezBJ<728g{i2Dyiw@IS7lLS{^p~x%^4c{}f(o7MR=;y>1g3Uu zFj;jzl~4qw;0z4qg;N(TV)z9x{{t^E(BwZ77okP7zpTGbGnuYdnchX z52!`w?COnPjkG)g;;^=B)Ee?MR|9~iIrf?p*kBnawO;<|iFiSaiuvtE6Pc;aEExx- z$V22^0l_`r`Wv-gy#7(lVbMOlOOYN0vSXvyb0V1r|N@e4~RmA#O z)h3pn_j_2r1GAM~N7l7`FauMnRd3Zc^~@33=W&C&&_FTkNdCD#@AbE zV`A(g+f#x-6wxpT83G_?5TuPn96x72Lk>DIYdoYrS!kp_xmE!X8zU8SnF}LTwuKgy z8tQ}{rzcqVR}pI@{opW9pe(0~ujsaWb@iiep4pvm-6A76BSjd^QC7fb!|jmYbuIJ~1< z=Nns;yIuilMu|@zHz=`8)Ln6g3Y7RtF_YbU8*$^;iR+H26GG;?6Y0ga*0uU;*Rtw> zBA6V?|GNFpgZ6w%`p6HQQP%eDT|(~S8zz{wIo_%lFpT&H23(Y5*1W-K_>!3Rdm@)c z$L(v!SG3M+tv{;1)dLEToQY)A3J+MA+IV5(v~{hIuP>{kJ0F_3&6)ORVGqfdQ^j@2 z!d{o`+Sgx;ZGoQ|5GRdRX4~htcAZV07gexl+`8xh6nVlqdrk&^gV+TEflxEdC9?-+ zswoLPw>wkv{l!j;lt&H5$(K!9 z6-f>oF&8&6s_E)*@$aPl_A9e0xdR(k%q*E^#QE+H@)1lGi3vwNy7CO2Pm0!8;Fa2= zZ!)I-)fxCJZ2t81SVTlg#8?j0BtVCA*s2x~zLyN6eBMu3SGgG2>F`o%b*rlFCzLhA zE_`)rpn|L}83r)=BQ9YY{DXpH4+^Syj8vaPf_jIy-c$S>H8{d#NNzw?xYdUyI&RW^ zjx!ub`Kn$PMt)1BB^Cx_5gYoZelK6fm9=`Fhxw#Dl zNo`U%hH#6}tclZ=UJiFgflXAHOXw>2sOdn$jex-VHd~8tVgiTK&CeODBGw66GRQ`2 z`aT9yGW@N|wH@dXFgAvPt3uyChI^hSSkK-O`Vte~<;PjXPaHQMIIecUoTg8sOY^eK zY*T)-OazAR6QRlXs6LBQ@^>7qS8V4)PEW21*&bzN+zD5$wX)8vwWBgc9#%Jf`!4f~ zactfF53a8Vsa11{6L#Ovkav1N>3YP)l5O(R3RF60c)Y6Ev+#|VTTYFmjZsHOKGO?65b%v|r%0@uKP3r-T*Zlt-o2;FNJe=8llUhsXL<&l z-2S4aR1n!;FfvOWM_dCwymCk2uBq6tjJm3<_g}XB&0()?4~6113qWY>-h83!KyWkK zT=o|*OH%{ia=$%~0(JMyRyc~c^_Ue_&%DTj(89I<@-+tr#wSe5mJTFKT$_1rmJgom zF!YtZi}l^;{?U1ZQ(#`+(b`H^@Z$%oJ-zUNRM6P1!aasRib%~+gMk1%D6So5qz)p8uH=A+BB>&CiLdUYTO=`F)&TWtL84Ia& zf174$KGzV=QlDk4#B{K|L476O;q^^HJ%o@z+|n1jzi<}9gFi;pITEkMfyyyPb|x;V zJV|*5EA1^njVq8ul;xiFDa52~4bM(j4-KOZv{bZBxVet($=LoX&41u|^6>8e)or>K zL6Z||pbvrKl10z!g_>5@Th4}@>H$MD%Hd2bP`E<@3rA*-vsUNo$5>lZOxZuof&)1- zWk{4RL^JzYMiGUdgnI(Ai^>r1KZh@ZVlR|!PtiewOW(3^_Fm$?d)q80H){pAC{{{3 zKaQa}F5zk?(Rqhnewsyx1h4B$m`%W?VSRa?{FBx?iK(XO)9;aX(`61C~hXVMp!5_%yDF&u22tJuzLyp`ya! ziiQ|GOqc*@le^#B;HZq{CH`P8=Wv+ozjL4}xHoQHJ=*T^U-np~9u-7@!!qbe zA*l5omXvxRE-3nER+$)XNvprpfP4cu4r8N2jVl+cj_F^Su`E6#O82J?%!?t&k|4s? zX2a?~3j(BjQaC{+0jJcfVxlWzVe^fZAFdopOi#YI?i(FOl}q+^oL)CI&W|6GgZLbr z8hvJuPOa3nlI!QmL(2oc&r35ByRvKcEr!VXqfqYNC{m=mOAJjyTV>$eqeBxkJOw## z2(_-nY`@3m31t7UklF&AHph`nk#cw;Lcklie!qgC)W~hhDh|b_XeIzg#wLF z4hS}^)Ey~*1ZTn&>_;n%-d~sd#pF-;qp;wGTFOyKgks<=+Ypc23ENDfkNXu3BN|H3 zoE?AWSPb`=)4km*o4kxym8S zVuj4Ae!|x59?pr4gEuA$*&{wzJC?hDZ)?O( zJnvTB#W_a4=hhR(z7-tpS^oG|@@c?H5Ni5#bS$K2ej_yB9D*ZG7YQPD&WHEopkhj* z!XcZ1-5+BH=UD~liYe?*qYk(+YhAJHuUv6T&C!zM;h;Or;i$dg*p_a^Zzr1T@Y_@Wr=r2D$s`@4N`W@i+J{7}4fAQ0Ktzs?#wT)4ax1aEnSpz## znrsLISA8W;!k^-dWNRVA(ZiN962Hc4|JpSHV^c$|O%znX@{7iM>M4?7`Huls9t8`V z^!RKoMm-D;X&I-mK$T?UU<^W0%gxHef5RiujXDbgv{*yyK^6L%g|?T^?@z}(85F+A zaPzvwA&kc7wcE8`3?WJVl}2TTHX-MN_p5J5P2y4GN!92v+=Rqtlq%m3jq3d#yD&YW zB381_E z(?s^_A_@1d+AAZ$Oq3YJYp=$Idp7v(-whP#5kLtkt}4gUPzS2s=0XDxsPsj2~?Zjhz$hj4sP|p&2$@(ca5OD>H>=;o_*QDD3usWv(zV zf=OU)99ks4HH_MI7srp|hp?gY!=_+*R`YM6T3xfj`o6Ja@9JI}?91NLTle#h&om^G z)!(Bn|Cqp@xxHPx({#TtJAPXeBT*|BXq9qm7oqTAW+wdElK6}ji*CzI7&rF%)GO4>1!Us$X znFHkoKf|?HL#tiz%B-!xwEf#X#L}eUpt8L-8F(xN9bH)#FH2^ZQm8k6et`Nz^{Teo zy?4D!7$~9#Z|Oth*x2#$GM%68q4hsfVa#je`$x!YuM7J?kGTa8OV8vFSzxpxkZLLV zMYl00k5%w01&J5X?nN}5-gU&Or=dxH#N~DcBax-SQA4>fBzH+A35YOD z6ca!e0VX~4u$Z9OEl)|fQ0!v7@jp4l7_9AO6Iw{(6=yfE?69@cZ5A)6vAKz!<>S zs}@3yJo6SlZWMvNt@6x4sQnuX`xU*0tAMdFB|}aL{ufl(@)F!6O$;qA{}xWa^BIAt zKJ0EP`7~{D%IKRN)!feEo5h9Ah1_}bvONY?!O+{8vPJ(10m&e3!*yV>4WO_+0X8082l6xk% z%MCiZ{-S1dAa9X5v3OwL(jy7(9<&s<90*|*Tz5!ZL43B#!LtMFqEXVJbW)}flBCjF zOvKia3CT_P>I;{^)T>-r!_OCtlyKF0m>(C>gM`YDqJg7v%b32@M=k>a31TJ1^Q!v~ z^%m6I^dS|NQl%`vpWjeUK0ZRW=-dPaB}$`?y#3Uwf4V2CTl4gA(eAOh7&}yn?Mk_I z;JAM}I*PLemhWISr(2{fMb_-UHV-FkBBh_x7R3g#sFV^Ow}kCPV4d9hI3P^|Jg=Q zME>UU)7tYBfKq?-44lCTxZXJ1(fy6ic(J^4N&WOU0$?%%7FFQ!aBEz2fYU@pBRioO zFPH)PC^fFIcWQuYT@fn=H3x1yDyzRk=!8LwJDN~o)Q3U0P)V!7)SK3P(^fM8v4(sxnAn@L*t1R%SKm}zN4r?PLYZcmua|QiddpMZD zb0pbX&$7?BbGFM=xpWrf;w|X@@`A<9eP9&XfLOEOP4izGeHnU6?M+15Yo=*zZiN|1P=0S9Bi(IlmaF%v8Z z6Cl3hP?32TW}G_?vE)3&)KrmE&T;2W8;azsge+^?`0nI{AP5pE4Zil0%KT?~s_!p`dq6ew& z)sUrT&giMWO8IR}xefN^frP#j=xUBtrDkol=81eAvGWVgVtAX1XvP2`pZj=b4u3c- zA716fbj^}+MJDv~78Iq7lOrr;`?x0NVXV90;bt5G3GdKc?H78nj#ji7FK-%-MMfFf zOA7lT7^kgrzhbSsK*NphiD(@|$7`=RP#olSDvyG4^$#x~Pg%$k{hLHLV^XH+Sadj0 z(Oih71j)nz$ex}JNQ7k2{YupmpI@Xgk$^{N0zi=L1(06mIFvGAgKU}IbiP!{B;G3G zlS=1^KHtpS>PTo|`9T5TBgL>tu5u+5`+R5Wfi>gw(w>2{Qh~DvlKisjP&nLuTGd~{ zBu!RXvVahgC0N0`obrT3DcjZWf4#r8D`aba0X|;fG$o?j+);o+yMvfI zylGv$GNONQCZ{I;qo-2ypElidPTDfZsII)9)qUI1{pauIaZAp39X2btp0g@*gD>2c zn8Y4TYK;4NJG&ljlWyhCCVnhSOx-QZ+_{N!Q{+Fog;xZs8Xj9-7H?nlMiB!-LoLJn zL9;~B{*|7do(*RN_eu4K(~}cEr6M=Hwyi9TPeMd~LfNVrFD;u#?4*N_y34oo9G3z4 z62qDHm-10EC@_hiyu8a7+^PL}lSe*3d6iNc)RMyd1$dE%W;;-s{rS@`RH9B@o+xf@ zQqNwGTpn&^V^w!$S?g@6L4oZSBZC>Peqv7=KC=(Nia+G!wk;1 zT6Kcs*?nwUHEfbJD{y+!#kr$rqIXHER#N;}a<`0v^iFNUG)DQ!s;fU>ck4<{x2M@t zQk*&W|G0*XJpNFY-l#JhmfKHc6uTa#O3o)pzhEFy`Dg5$V?5ovmIzF9Z9EfP;UWC#f-oVS=u|Ep9EM@4k~=|((v&KQo67t zYKu<}kl1;#&?k1CA1H=q&X;U$q`L<e(d`*9UA>^lEEQmzUhA7y#` zyU_!vPx%O>)^b{AFeNjVwww%wNIt@gnY$?Y3+v{wdu$C~1`4GpiOc*btn72?bE>7h zI#AA?u`ZRvpx2ZdAMbvpMfKNrV%N3Y$oXqwS%e-8ryEFLCm=EwEOEuCRY7B_8b8}* zpZZ4hyON47nV!9E@$?H;kC2J(*M7o*Dx6SapTyyyDb(3uS}pG>T>McygC_s+kGYS- z|KR`*(Jw?(_}^_HlfN7@EUVh5h?%R;j*b z^JX`q;VsF#@-3M9w4*ib)83ckJdy0%9@jI$%@a z2sk?*`Hx_9btUiy7X#eG6*HXFdk}V>9I&@YUuqSrZxboAmqZfdBJUzj3t&A18kawH zU0+{=Rii`gVb-lC)`px@XXi|BH9rKtsb&B6HRp=p?sv&`_NMp0AX_0-xYqLdQC+_g zp`raLO+i)BA0ZHEm(}BTW+27V-y=h!Q-8ltd1GrSos8rA&G0)?g2|hhZ5zDyhU;3n zPnwb(-8pU@ziSGVswM?f-)S+ZcNpF{e~x1LCE2N`O=L~24w59i5n zO>~C>!x3-@6KO6ScPuZ5%K+&mjn&t9(z)c?)BChGV~-c`9d#n_j~qJZGPCC@+wC$e zA1UNtdB6<73?yqm%~52b&}49XbwxQc?4mBZUfMH8>hkv;uQTfk6ag}+>{Py5jN;UDVf>7JY4W!d%heSo0*vb zupG+`d%p4hYWYJwKEv&jP>F*uY}NnvM|nBmZvs^34aWdMN7ux^e)*VB5taA7 z4xR(G1zzCk+=>;jB(1Lg@rj_zw0g*CC6l}G$6_cu zTvH6A9Y&ZPnz3=PE8oS@ujBc*rKj4qvRKm|uco6{uU9KR5SoY0N)YMZcJrF5UL0lp zBZ5TINsR`CBJyq|g9d#%Y2!&FAigG!FNkK}!Wgj}T6D;qD%6$!yFw4U3$r}8#mp2jS-ZCd>^`I=OBCRtXM|2ry; z_IEkC#g8x;J!(e3*c&`bnZ3mKc@|u$>tJJn%D!=bcxLLGL=D!57dpEgNb1sIsJA zeK%pLt;$eY$OQ!Z={|c)W~3Rz_vL3E+SKBhwBE?r+^dtxE$av=W2T z;>dy-kJO=zLnPYqSee5#75axzfna&$)7i(>*_7Fn=MSCUhJ6(k@}L}A=YZ9P_k!EC z_vvQ}f>^vaA0fu#%~%mlrfI_k$)#(MZs5;5$#QLN?LV&KLg!Qcyz~@p`^VdJZ_z9N zKnK720Gdt4_sk3h9j5@bz5N=Ht?`X1notJ2I}uoeCBGtD-HohAZzRdUdpCb0Ee_N( zuegclH@9FFTch~Dgj(RxqH5EB5XdZE^j!H1Qhm_demF=BaH9laL$68|-obZeAdv!kPz1Fp3>Eu}RJRn`IH`fMf{$gIhF z;vu?(I9|}bs^H=;Ln z%-t*AI|xQ#*;%|ZhPhVRv7RQREjAOHppEu9#uO8M!n&7-dmOVYm`x&#A5}uaBTCe& zT$a5jSKdZ5C-EQ%$~tu*u{3G+B*a4X?7}qLcf4$l%?uTR2BK+k1%F79B&AGu+uh{x zlA5LAFs%W$$@pttW^43Gn;DF*3ldP6P~KKjW^U}?>5m*phW6h7Zu4$FI>)xN z#CrU1K_GQ+(r_>fx^?ZcqW~@lCm&nAMcmzga_^TbJeBEh_s8SMO`l6;kl@02{>jd} zLp9x+?SnxVR`tM(TleQ_wV6#4Db8hctdlTe1L3WJ4ZiX2lNQMtf z=^WlKEyn`MfB|Eh!N#_`ux)ANK{NEMZ-oSgFMV?oCqWrE0O|H@ol~~D%P%hn*6RVC zoq&p8SgirFYb(IDSl&9j`H!#)fXjdrG6H?|7Ph%EcUc{9$u?it2a4w< zl;dsFwPSD@FD>8AHnth?(z`QJu?$(o=<84ew>*}JZJzKU?7_mh*0ruT!uE! z?DOHsNYpWM(U_G}Vi$&q%w2Xo|1AxfdA-(lcTiD%a!UOo0wttY1FOKAH~pS*@k(9# zVYH!W&~rbf^IZ`a^)0HUYgrPP$Jcj68MDlOfsxP^BI{Y7w?Cq_)W3|oTAR;XSw{VXwexV|7UahPpDOH-qd1Wd4;*}%l@WbU!TS~R^;*Hgpwl;kN+Hg z=vX-xP%(~}q|U|T1~<{sffzKccnByChYtc4n@9T{%9dP(Q&Z0h9j!yjuRpypt@VB{ zbR!yc`80uh)E(q9%u3WoEp4-`Q(uB8WsIHkFf`eCPtOn-fL-&V1_P851mK`?%uMk{ zYf5pxtVZ?igjLoi+7mUR1x2TL34Frd`pJ?SiCz5fH`{l;zr1nJ?0>d8jat7u?dEV+ z|B9YdsVlnsz5BO7V_oQYx2=_O=-~2v?R`~d-&}>WpkMKCmvI-=uXJfdNPw6UUgy01 zU(E){t=jJX=-xke918FL28xxPEc*sO5BwQ|#+B0~E7~B(89r^aQ5VvVrgke$;|>QY z>X2feA}~^f6mUHot6dqlV|DlgM3ovi2^Xc zC&`BHtD9SQ$HD6KOHg6Ow1850i3ZCKlzvKH{v(iZ)YgQ_HOW$Kq#Zlc1?{{Dj6 z?&yQ$WHrDjjgHum$fl}&-?dq)k6?e(iS@{!S?#2FAutH`BaGA%G1clj5-h3eZ?eD- zK}Kv)#j7EbD4by8IEEu0aC53kIv zbaFm0c%yb$O{I=%5fk)Hya?x@U9N`<$Dh(1!M(ah&C|q|8Iqu{r;&l8u*JTbf;Rj< z$aN79oVTAkC(LNa*z=_b-~34!7~88%bfK!4;z!JPrV1L97Sc>d&-7Ren|w$~53Mh> z8Hlk*{^g*NyTopwb(cRw!0}4!_VMK4Kf`dX$#Y-TqW4?lg_YOWd(6&+c>`BSAh_n| z;k1TsVqWf^+Fh^M%%gvvB;zikxqM?}!^{-MSl{)gtb{*Q{{&fxvG|`>|0xLXQWoOS9@wkC%C?|m)^}J)%NtO;W3!uQ} z)}Dc|Ex`Emq0!K~qqFnFTmJ>T1Kj!sh4<<4WbqFl|90T?(-npgSZ@`ssjM87z1{om z8y$m;14|L+&H889Els3-F1u46lt*Tys6u7$ZL;-qe!$k2TW{!@{V_X!AA7Xt!0@}I zRfU+T=h=@xQe-25)1Ppn=A3xvoHM0TmSFftQJgOUE2Q#O}K!R_hdT2ob8LP}Y z6pTNoK88Y{Tu084oCL#ckspT!S5Nx6<25da8<~a|)5>WZ3;oHK$cnw3kDNs*q%$+8 zB}6sR<%UD@mKIhuk3Yp@4hF~9$xv9#E|Gw~FFUqfXIwk$-j{b5m!TEF@gVLlX6DdW zE@%pPI_z%3+25zS`NoBIJzh$MHJ5);3IAaX+eQ$ACc`vg`1&ti)cZrA)?iw9f1Blo zL*e=~A}3`KNFEH$k{`xgM@W8oRD%aCgnC7P{c+?H97;-u&18$9`!bun=0L%LueR`x zG%XaYyXq!@rJ0}vMq=i|q>^NMU2<}6Ehu7fAhm}Pt4SS?1AedWA9 z4rY0Y9K^akT)jiY;9y0nMCIkf%4H9p)QbX)w*7J^RbCN2z>Z_g^IuP#gg<}?SOd~V zwLRuO2|9l}P|^Nyw~lj^>*X8cg&rxbf3{w#FzgSA2Qq zL6B_7TFwG0Emve3oI&Lu*$UF+2uBM~cN}xtVOsGDNGjHu*s{}A3Yw}!bqnCUc5|{H z-}%wXMe3*iWcjD1D%(v)6+M}+ECE|B+2PfyAA{=1RSP`PXM9BWNjq?2*1l5`vZWna-a5dJD#`Vp8o>WIj_KLuSrk4Z>1T> zfN|~-sMY}3B^6%8ix=0d?WO*I06ysG&u`_5Vswg-PDE+?&VPv&XF#sxe|YQ{FJ3e@ zHrASN$Yy`^@?wGk*15^4|Nb%Dg;@w~1*5KWWY|^t8&;LhY@yK0!RqoTA-fy~eyl#4 z*z){1P~Q4NgF^0dL$=!u08{ZazFs+f_V)LO<3eRpXO`r9F3bF1%)nD)}kY9*sj!ls(o-{v4x zDPrs%godf>jSLGxiHRR))OSjeK|@v2@%COR_4QjUB#HcSGzA)8bI@?}T^P8e;O1Ik z#k2|qJIk_=sr>}F`@%vamORY4zSC*>YU4?vC#9`|t``!*#l|{myz11D(QJro!}5#v zMVtzE&?53CpMOZ7PzCb^W}IHvoN0|BIU}OAP=X{#EyUUx{=7H zh##hyUyXex{G?PrTt$&4g!4Nh|5US!n^$BP+agtio{okldRx>21T!jM`WJTlibk)A zo9o|?HoQCpJj~KnDn>raNAK;H)jaO!p0k78KLOpyAc9=s_Vt(}n+$5=g`x*CqPoDP zDb>?z@3j>5#hj@@Ro*B)P*+CVrz{}36{J?~)l3%A z|M-`Y4OVJ=#d)+_zv$EU@b}2=%k35e`u*4NYabO79olkdA?`QB&|g+!EW7@!I9@(a zKad`}XUEU6Cf=n?_e{_I<;_5oxY4sCxYsc&$5M=_pYd-dxF=2USW&2%B~Ggy7APg! zZ0rOumyI8i{cV@8ygKh+LjU^@eE!?{czX8{bMbl=aMVGjzIV2?cc@=V882j7%LH`| zV`E1!C#Xx#MQ6642fd&ce>ef&=0xH-QKku?(3N+WZR=-*uK^e^WDRb}n0pVeLwt4f zMdC+O#OyH@i0|QT&vDvf0w@3Pw(DibLIa}R?_8}tTt@$$z4AkJP@7lZM}I#*pmDjn ze{|}ca=>U&qh19h85k;CS69dPkYD${#ag}rhR8t-!UX6+Z+I+o>mEStgAr&3+#=>u z&@Pr*Y=pOTM_rRvrwlj%!@9bDQ*OA@)fRB)}UWTD>D)g`Gf zL{bPzR74Q-W4gY{acF&M3nC~c@{=sKUO$3))z3XSRtr8@bFCI#O(`;gfY!A&a>;G% zwf(aV&sZYGtWc@%Y%R~*#O=*NaidS^Z}#WFMFK$z=*%bY3JbpAeD4LVY9}wxZntAZ zQrYSmg6RfTlN1o7s1`|Ph|x!`UIGu+3c+2)b`rRII-OWUJEGTtJz6RxgM@7Eg(GP= zmvam^R&<`1stXb?*nZkrp1}nKPheD1Fw}D3BsQ|{szY@ewPujixz`<*#zk|w7*#Sr zA_T5QMRZ^Gg0uHF>~0HG=;_Y$iQ8{vr9fkL;F!_@x>#t`XRBqB-=?J&2wLpQLE z-N)Sg1+t$qa6=5!@LKUQeZmjdAq&0+Ut4{8cgx=zykM5`Hmxh@LS_4^pztT`+dn-r zv(d4WBw0iXYDz!~Wlq+=Akj6f!aP;--7beq4w0Yd)yW#xg z$kM+N^7~d29(%sxhCG22`S~;_UA1OJZ1*TN*+hB-r-j|%#wOxwk_fNZ{U+;krh1L* z)kr)RtUiNtZlxUU&%o>IdSoPMz2p6g*IHRZ5k)uPhCBnX?3t}3zNYmU{N*+ek$682 zh5L>_5tCZ7F{^14McjBlLn8i;>6&~Hpb%L!CFiv_HUG- zJ2CN`oTUbjSxUSJF91Ug+>$`h8kz)3U9O~!PMmW(JLBbBM#&Ul{lP%o;*cpdg%f~9 zsGrp8n?RIj5g-1?5FZN9MI&WNPe1aawct8^bZVS&PfGu})lwz&<0R=74=-DTx+fG0 z&?0!L@i6$iflpCsM8Ej5f>}q0q}e-m47~QfaBNOhr&@Rahq2Ggww!wDkti#6>KX;2 zFtTo=cg$|uS)!?X(KZ_2)n$FHk#v0CP;W`wA^q~y2HG@4F9ZW#niU^fe#Jr@+9w1> zcgE=s(0rX)d_@J~a-}gX2b6ZgRi@FRl8`+XSCyupdWk76mezkrr9@FQkZG)m^ML@3 zevtxF3@%q%WwMMP1bvK!UNAmT7qTe4K9`I4M`@BW*Mx(g=p|Z0AG4Gmscf&%L`X|M zx1yy68?JWYSNudmB%1Xsl(A|injuEkD6#iJrMa&fXhtqb;XNQ21p3QoS4>DQNQ%D~ z93(FvLb9dj03w4$#VFr|%;#u#rItSOSoz^tKcVpU^7V))34azO7qH%5q>6O&a@gfP z8SajR@tgvIJI6qH&9IR10)SDx@DCKE)L^%+WcXEhY<8P3OTlFCgPhJ z{jCfes_9+Vf#JV5)@x=peIwkwn{8c;gOJI=Ze6Jhfh_A1YT<>)ZWQC3Xf6*=hy9#s!cN=ZR+y z@(y&~#q`PhGKJ;cS;w$=bogSHcSfAFM%Lx@OuKb}HCfEjOB-@ohz(BD-B?*gIYHmL zZ;y)Sh>hR1&y^7scM5(U^|TWTpS!o(9;x1=TfHY`L_*JKFQmBp(v3)$K>$Bf+OWWf zfj|I(9&ou3__z@Gbl3?*;c={&99kEa*1x^%*6`KBvFGlO`dzj7@$r1*dB6I3In|_1 zZGn?tlW^)Qz1#ag70VRRDR#QPvSLZCMUv<-OWJdW0ET};upeuuChflUD^3899jVI? zQ064*&QDsRg+B%ue%uhqyaPJVlaujS-g7P-DL4RQ$BXEBe0X~SW&KstB4JmY!?ZAJuZ(;U}@e!rRZ{eRG#$OK)c11fMFz!jf^ms=RuEu z%}BplxM4K7>`Tb^Ucz;(_sH>e9ty<*ygFG{+CY_>^ zoHp~#;Z)qfSb%zVvhzl)cww4#7Ga6DRSIHO;Ih}kI+8Uz1WcobkU=XWjzW*AcUFg5hKVn&M#~X9i$H|QEi3tqv=#JZYBFYM?2!4?cIlR`AAB6p&bTt!d^h}Csc{6Y z=Jia@4(-@?w|q8W5N83aHFPHUlzD93+A0m-N5MV_42m`S>a%%#8{9{hiK|fjaDg9} zB#?<{znRq;?{3Bze%oXkDSjHgl)~qLj$#_7CqQ*8E29oqBGTi@<6R#4LQ|>g+5F{7@Z+>H=ZmM?mrD^G@zvtaCzrc{ zCy567dN2)=13*J^veF7PMkDdl@9fQTD=OGz@iGKUwWxW{im7Y9etWk(!*@^eDrb0y zY1l0N<>=z=r~RSq_SUuz(eRz15p#`k628#>#h)hQ-K$x!FnUIzfiKyQ7ty}?qY;Ss z!eWISb)Y%w;R5ih8*730tw2-N@&6i^H;3(et>b*hz33E4BE8dI*={Ej0hblk9S<6* zrOy9q6TzUklC8|w9{|Zslz$Vze0*o!K+>LfL~fUSXfs%G?g?~Ufw!rFKrGPpeZ|qD zNtw#Nw`k5%sI;xIACW-p03EN_%HPLpi7Wq#X{~atnU^CTYhHIN08cslu7et#DtzM% zSf%clRUHD8{x@woe)R7V{#S|00g7Gve9~m(iNqh~9(Y9LQeFBEOfUMRRkWUv)L3M_ z!r;b(keqTQegv=al`(fFQ+d$KaCP~M`$`h zK9{=)eRtJV_HQ%S?8}ORq~0lRin=z4m+r{!Qo?X#yhN#>R*jeN97@6bJXWX_vK9&{ z7AT%35(Gcv?iWNQ#sIIEx~i71XJkksDo9P&gYfcF5VTynX&UBqBsQAG22(2Jbya0v zq;s}PxYX#I17j&r4BCS0%dk!2V>>?Wc+1&X1lM*{e9Vw~6k0G!0o{e9d_fcDoO$v< z-VJ8t_olT`yppH3A|%tO`y#2oQ8EcZpdW7UG_Pukx_4TJKtb_XRw194NKl#YOux$P zOhBE@U^+YZWEf+r-OUzUg-yjhL@?dFnT~G0z^N10{k5w6$0}nxky&JVK%z-bt@D30 zon=^5UATsa9zqyGN@5tgyBh|iL%Ng>=|;*yY6vBzOS&7BlL zYGHz((Cy?n#-#p?Wl!5yz2$#Pr}M(M#o^Sg9)P1HR(gCjXW_}WZ5eQA2u;;YxH;;j zkQUixQB*@Ck&LL+kN)#!+ASHkR?>XuvI{|>b`!+pQsolaA!@S7xR?rni1u3qS--l| z!Lv>3=5{AL0$h}Q?nupp@f#=S)vu(SSIUX*fRO<3Kon1!s~x>-vFYrG!iqoeSi2VY zQLM0~vC{Hy<{zmoa7|1UWhEz?nTrncCC)t&3(~%z#1Wlj{x^Htp-8 z@+`Eeo}w`h(SJtyTn4vCa};|v$2ic)(V zkRqmx7nCG~4h90#e|bq1-xKd(_MAu#BDae$!k~o=a4_k+Ncz5J+RFLfI=?y^SaZ1!Zk_7Q6scEw?v|zfqmt}p~(ff#+RpVNaTia%e z$%Kot!@o=vy7xVy;9*!wy6xL4*WwQxxkhSI&9n=g%u1xs0#04sB$-85G}rD9I}8=K z>|9Oth$QwW=eIOLqsZU~wa;~)jq@8YL$pT<>x~b&ZGlO}G?`~DKVD&azGEm_l6NlY zn)&B2`R~Mzc+-=5`8mr{FR;rwJw1&Zw2H0ESMiVt^#~aY6w4Oy)R_3--~8?DU^itI zA!U`YOLVmz6Q|@Wrpt4&cyMcmuPklsrxV~~`|nRZG0z|S0gj2Y-Rlj{quy;qrp|J;(O-dA6=CY%}ZQAltn zqltS-7?mKnCxZnbeMrKjfOU0e99SjS{Z0i(l(ennSw`!_#-HzV zBM*+JOxE8>>6{h%YaEPxwppOUWc%8nyvoPtiYc1xDM0_T0oUvn2075gKsj*d3jPj) zgm4fSJtPsoah~(v@1Wlmz}n}*BOvJTbkQ+b4=BU|x=XAA5JOO4^CULnW^O3zKPCrn z)}7A1Ko~v^P26b?jj{Do%dc&QhwHM1jc@*~Suf=vgsGbrIJJZ1OBS*?0t!vH$|W$i&XX-JrJ;Dk|Zg(b6>5@BeD)y=G9&^0zMD1eQM&q8IpBABV=K z=0JFenB`<#4?zc}hqc1ziq^KuEJ4AT{u#l(M3Q`uqf_gV7#A5=o-Ugc2{0mD8l~1#O+_CyDiS_dx>QyYnN6e*Xj1}%Gk_1IVH&03aw1LZdcLwN`Z+o~Lv7`tFL%jy@I9u7O3iZf zRke^x7JNxK^P|h^zSlu72+C##&QIK7DKJPwN=QhIr6@hk6%I2pl7aSe1>>Vp;^`X% z@yi`3$C@b*SHFj|z<|*?urdH=B!iVTU;yp%mDqVr&RH9|@GWsjj2jN7vnRoU5s8kR zeCp+)ii=zT?6biSt+d9^QXGN%+b@P7-Qrt0EuXwCsKGx9|< zM!bd1<&&xYmPK-$TwG}Mgr zJTkF$L=aAAED)3hq(n|1gMf(r*%Fuwm-%!k1JB5L>-rDM7?c6YgIVAch0FgT|Jt;Y zSI~vnfFoqWFhrxlsQ#4=_{IgF(Eq%7sf1z*v6aP)`=tbi_i5^-B?1Lv)?%ny9SLHV zM^ZKAazDK6cq+kJ+%q#ci{DEb55n;9L7@6~Yd2~1W z8>0_TAi}RM#8#^=!r=;T47^^MBeGNyBgJxYyw@*JC@&z{5V}0D3eJ-}DriBMN1*^4 za1> z20L(tK;$iTmdLoX(8m*8J$wO4dtb3^4T77SDU!I$bpk4^qQfvPQ8?VzT3;QFV51{) z1S6JVk4l@qlh8-fip&j)9{CB8kF#dywSsq)O-Al{TrvKvK@~AgHzt)5w4%Tw;CjT2 zNq5mx4t3)NBbKRf4^0;fcS!_1Qhjb}oo0>Sfy!k?Mi?m%Jd#Ko0~_JUe> zB5}i*OgH^mmI)%;70hpDt9--p7&Xz%-p%S}hGD=jO%9f09AshqEIDOLcml-vwyYea z7wxEFVA!h#L4E=Y2qEM%dY5SaFN!YhrZuhd7d3vbI|d^|(yx+B?}#eA{VLu<_9K6M z7N>)GfnZ*0#wH_`vB=p8Ap0>$zOq?H{`#Qx@y+AO`;HZt+=yCcGGLF3iZ6eECL@}L zPnH1*&w=o~4as2WW$D}6#D0Ox)!^A-?Gu{2 zd|iMfC1yw-f+d8t->@}=LzIL-EZ`6;JcuC-ls}4HjRB&{gU1qDT1TN-HkZ^UGl+d2 zMp$w~1`Xd2r(1ngHqHX5P_MP~; zXI->J>Lu(0h^mboS+EHPhu-AGBN9SMoCOGZ0RpI=Lu)fWsJz^RrDSskh!p@5(8%5p zd0Kx|jpzJ=G?mpIp2Nn!yM%LAg(&D^MirxXUgB&>_>C>cYf(S_{Y^Lj$X(r8ojJa_ znJMz;-c}wCLxEdDkvZ{MPJ#0=pu{|Eg<}R9it^M}eYznR?~*@1}1b-O#&4 zHgR!1?I%B*c8%YnY=?}!-uV$Octr%e=Iu%^_BOT~6v-xLk=Ok~?>V(!Tz^q87L>lI z>8fIx{`tGSY0!4y=#Si<5U}|tgf06SYqsVq{Zkh_lD@+G&{dwmM^RK4dSh=0{iukyz z&UP7e9(+BM>)W0+ra$&nnsG>RYlh$-RM_Noa6M27Zmo+V`Nad?N#rgAlWxp}DH%#D zYjg_~a>?lwc8Pm_x-7gW^NHE*apQ?m)J3YG@zdO;RJ@Re7|&-PC!8?Nu9^RC>%Y#N zlU>%V%tyW7^$_D#98VF)laG~4|2CmfQQs5(UH91ROK7gxqn@rg9ZGSVTXil)B8Tw% zvbo3E;1t{(F2zoq7}O!Io)4K>p%B}(|IY$|;s{lUJAn|#w!Y2F&xwQ+ViBJwKmU%( zH0eLi^^w^BJOl;jD?2vI6NZ$`Xg|y`)^A<7uwthn-xfSK0Lp3Ex`dm!?_-f_vTGf> zg%%oON7d4wdHJ!#V*>fHd05xGKFZ2kI`u@2XD>sX*r4#j!k}0R{9RBjDxTatv>}?^ z7E(=S3zJI>4@?-+zFflbv=$*$n1587cHCam@pyu4rWX*my&d*!=^ps`$ zrAVg0hAlbzxkPKG{0dq|d;8T;MgGp9=E@f*_Z zw*WpKf|onY!c&L)<1|(vR5uk z^>zO#9qVF$%H-+bcL__C^)%X+XLRyp0})~*nG_scUy#vNb(ILP6Csvx$A;&RtSyQL ze0ofgifgG)Iz`Zow0Bh$tfntI8FS z=xt}`Qx|6nbMoMjdwmc_==PygyVz5EHbFYf&hQqus#HQW(*|xm6f;&FOj0QLW-16V zzSWr~o)bl2R7A_~vThkQcfVUmcJCeF{-r8EFMl~R`=_S!wUfqaEcJ5EXh?X|Tr&aL zBday}iwIeEKRQe04NEN)- zwhw{m{hK%6{m$h&Bn7KE!aKJ2mJ);!bvtUQazz7!2xZ}e+G(ZgR zy@`~$>q0e7G)5P4Zq^gPYNZDnLUt?0)GeU9nC zVDX!FLss9BJJdX|+ice$5WkU>q$U~`X2-S+^x&W}ezBtqqKCbx@Oc-OYC=L`c_csa zMVZZ!mk>K|@E5(J-zM45W0cAjs{mFwfujF=YG0B|BTz7 z-~_lg#@x?PC8k`Pa9OvDTvGE+XCK@H$g<$azmpW2xQUH_i3tVo>VNI>`SBoUIj;Pu zF2?OyBZ$sEFB3NHwW|Kk-8)3uqgJ4iyma+wrOg99E z`tCH#k(`W{$+{{}}NW-;$U7yJK3 zqCb>zZrnPD%v&rl`xbcrVR-Cf=PMw3Z)^1lYXkFHI~e z+=FL{mn7>KHo;o=k{AKTX=7PAz;stZBdbb!m&i<^+oLU7p2oh?%qfYG_5CCSp7p)> z{ZM!9^3}P#7~kR-xi-0BRz?h%S|n~ld>0}MAxDvIJOpCb_mRCn8bINTZ+;$C+q@7F zIlY3kdPRfLNjeElx9D&@NzA*zV_hN}ObD-a$jbywLOr9Jl^?!l#u$oyQj^hmiHxvU zMW1eH92&9DVyQ>-RhQBew7Qk*aF|$JqbziO;X%1>6KA0?hayS?paWl;zFBM?dGXEd zt@oFI+`RJTqV!=h1+;s~;->gV>CW&$+?3JRaWfhCd9fBLF=&%+E4IAHotm|CiT)@u zu~tGkz)r+71N?o@UGSwk5X>3JBrC&!?i#Wuj3wExfK5&~=;u}cFiS%v z?0vw3@$CG@aSWXHwP6PqydNzBv`5;in8Z1g%!R>Z`YqL82$B4=$=qI-^hRz|wJ zZ{B4-HTjx0JmrZ@V{f~;Z{6Xw2#k2B)b;scaRZ{ChL5fAB7s)tBMQPFhfs8TMA<`< z1&jAX4Km#-3#m9JXSmxt8ap<2M{P?Afs;Z=HPl)Rn}TJfK9rt2h5Z64(d%bbRM)s3 z4$NT79ko3QgoQAcs|Ln$%*1{wquI_IdsDx0fJ1_oN5~FWZuWd`jb1$|E*tZH8b3B? zaTp7I%H}z~&2coAwK`RjpH?h>mghvkMR2}vX3uVHwqc#aV(thj!w7qULW1sVIWM)L zS9H#Y>f5GNcQgBdqQKA1K?T7u1cQ#Wfa;O{%Xvr$n0``Y>!6EcZbl|ysrI}b)&*_0~%=x6hw4mdL>Vn&zn^=K!#_1V8eS~K0w>X!tMke-_wrGdv!%e}k@#}qjociE;pBgt zF7ed(3}#zap2(`^+(-5BxwoWJ)r<3(=&CmoBP^su2X=z*M4awV6c2E;(X3>^6kv)Z z2fCtgj8s$_0srFD0FvsVxqD82UwLNUztM(?M@2S<;Bb&Pmks(`C55Wt5f)LY*KnY) zt42D?CqK422(i*dQ_CSou}^;gDqDOv46;-p^VxB`d`9U&bU`9I##GYhiGdYAB~S>- zrok{+%(-rs*wvT24HekU0y4|}MnyLyd+8Wy?lr{qy1ls2m%qV1_9Fz@+qKf6f2woP zK`j2CDNOXC0YaGfX>0QoA35UshiX41FpqoTZpZjz>Q?xAdKM7H@n&&y( zXRrViRe?abUQ-IWx9auS7P%GnY9Zb>zT%Y4j*!s#^=qzQm&UKE-Z77vw=e%$NPmR& z41Eac-sGwJE);5!np8fn@qm%h8kReH!!5z869UKkDJt%6KA}yq!WWs-IpjEjmbyZO zy|?W#rW)HQCQD(GV(76%YD?p1ZY#-^!XU3$5{@oMnxD4x`>sVqI_LbGkwmT7(&$Xj z7*98)`)&I1zuO0J;kY>yL%)ICp-Q!E*s7Ax6%Vvvgh=IYnBgHkEoK) zPw;eGwRz1j5ktTDscg0=_IH03S_)d<6Q<-hlM$Xujxsm~_Hd3|qrpD%W+4xxG1C%{ z8PZk4Bob~k)|`;``9axzt+9KS*!&oDW0au0yJJ`m=m^1wcuE_Fmi3k;C0m5p{r+mVDAtoDN%&Z0)GraTkVltym*WwA%M^{w->c+q&nx zs$73m>Ln77M|U!%$>(EhBKw@|TN{BlN;C|tYx_X(<)R^YsztlNAaELpB(ANQmEl#4 zUt?kpl3s1&ZIgOb*0Z4C(1R^v2TT6`otnPszt;;EtWEul^VtH2hY6S z$@v?GgYllz1q>#)`$T)N-e8c(APN!Szk#skl-{T`XZ;@MO8s?#?g#Y))qTH{qH=p5 zVv4}^@DuK(@eyvTXr0wzm21gd!}7d2iyaGOZ1vyS+bfGAqxk*1XSESx3xX>)Au*0Y zi5ZD-QAHdQZrw3u6BgD>BFmlM@y65NHK5RO-$2n5Ts|0fI^2ERP1c@n@%$e%=raJ( zX%``!ZMQSJL!qm`^@HL31xc~ezBm4NPDymOZvd8wiYI!GNYiExPQJ{6=4j%iXDK@H z;EQO{Pssh8_G8K+0GX?a*tUqNgn}>`nNTNZ^d=KJXzh1&KL;Xoe z07WZJv2brV8$HwNH~Og)3I7PQK|n{r)!MY_y694&>xAT>*X*}Liw{Ox`j6a4(Nsx~ z%zx?Dq&4Q;E;hQ=HM^n$@^#xiWhPPGNTl06t1iyB{@70MKKgB7f#_S*-{_|3>G?J+ zRXT|63OHNSoJo8jg|T(0IaqI7#d2Zoh|3+mROWW@qotz?UKU!yRT2|S8uUR+^p`Ar zcy*1@PIeX@q}F`bBjt@T=Fi2jKdJz?{Nn@vr9#&8zVQ500uB%TuTru+4rv-iMV0e+ zi54HOfj8o3M%oQFNPyOTMgVAQEeiOKwJ%k|+c#dr=}@hH1bhlJB(q4)?(ymxEKEa% zysc-=l;YxuaT{_|~eWS?J)q{iSV{IRsyz(ExIub*xN~o z{!DRIKOZ4>&A0I0X%v4DI*~=)80$(coZ>}75r?Yd+0jwu+m*TF=d~{(ke^L-1fh&p zRg4A0O?}o&c#Pd5@wFbUw^1ryl2(7i!i>muJTy-`QZA4c4!R0onr0oiC%;M!U{lz% z=*yA3Yqq0svltsm^vw0|xr|g4^MQ!R#)T6w)%z*&iYk*6J)asrL$wT-tT@96vu9vp zTHIAQp_r89+^xppp=SM& zHI{WT;97&cYTg+_n9wacSHlpq$FRtiSp(<-CDtfJv=J3MW22Y(DOCkc|2?_gu{!W6Fh7en?8)>=@(Toy~eYllLz}iVz~>H zMw(GA+(A)kbm0kw{Api@y%;=yWQ^fDpUI&B>f5LxQGfv(;CZ9}>;lpe&dA0(tv2({ zVuzRc#YYiUhJBl2J&tF_dSd{jN=4wI#R7!gkEZkk#MY1hiV6n-0S~yAa#wp`(V&i7 z+FJb}=Txgra$*XNy^lTH|NXD(9}}V6*&hfRrZyfF1;^aN*#Q@A;A-v14W9_E|F4An z81b^k3<71v8>!@d5L09Dd%t_>wVxg$$_uUE*@o5dE448{LoBhqgLeM?%SwO$@BF2@ zNV9R(#Kc7VjbOTwAU%vTV$IuZrCEcDr*^aRSUa9N)y61=@p-Z(gsJpiK8SI>LEX(M z*r%rj%1atEU3$pWAZ$I9#-p*7{Uo!vyZo`N3I5QXc%ku33n$%}KwzoB3vd6nQ81j7 z&UiS@C`s*Y^mmdQq9e#}Co<>7leP_oQf#w-MHSUmIiE3Sa# zvH=kMswO+X?vIoH6Qqe=eOmMSyO^jM0{H?Hlvhu}-9ctie)!5!=~hc@5XUe7S9s6V zcFYinp_6V4l@xz0zz`$MW7ef_4xKo}16>_+KO!d(-U*5~-OJxi^9kj%lrON+84QAT zpPLYJ=?(@W%C}1ht=gI3Ml%6#$Op$r0_VL{L4-^E2oUO*=hh&cxo&MZ?$3DMVo=?Y z#aZWRwiW${G1vxrrLF6)4mieb7e4C0x+I=-RYTt2!^w2Sofc&5YnN-Ggy46n^vK-L?V~*o}zw=#`42Koh4j>dzmm zxvW=lm&%02&S3#h&6-5hR0L8r$_96xH$?dc=`9YFA$jerqpzB@oLBaFU&7V@6)hCk z4x||gHjrE}8uqIY=~elEp?obvIGOZT+z8hk+dUJyXz0Z8eY=BuNLOz=Y~ir!l@S4| z^1HY%xly+Qb@TunlGd|)UkWd@N_96YxWd`wQj^V+EJsoCOz$V>!fCJm`@&2 z?Ldi{MTP<4(nu+;T`87@TNS8JpYk;=as8D3*(i7${|g-4OYgA9bpOeS;Wef5<8zTu zJaHdApJHy&bdDN@gU8fj;t4|wgLvSWdB~fu<4iK2>`f*_*Mzt2-|Eh1YY zog|aC@@@pD@ZGxUru}C#VKNRMkvv~+*6BrdB^r2M2ofPd=GLDuKtmt|Ns%lHC@9v| zwPti#tc2s^>HP$`4hbn}xmn$A_`z4e7Q8iFNqjJ0 zTvNz)>hOUT-r#IvJ71(4Ju#wdwg8L*7l2Bu_d+B3w=C}Fl`2^=vz*FP{h*)Rsj4JJ z^ZyR!*g5syxx0rTfvLK{z?dz+I!3~g#QOcXtxhgSk3D}leQ;&7{rejJc0zi2h^(1& zq-;NkI<7eE^=!8%kRbqTL+T^2n~z$ry|5%0;} z+Zpd{-T_KzFQ#DaIvN6F))4g!D3t=J&#%J5!o56=;~>lUDN)k%YQT);Kv}z;g@`KU zF~@^K3CZKDU1cQlnO^!@LkK^1t2K^Jxfi0>7tmvY@ZCcwLIae%D9k1{nwdlT?CNsf zsqn5fLPT!3e)Pz{wyu52?~_CO+ne&}#e0?QF|a%88r@0wTl5N$7ac09!l>aqBd>uY4tU z#KjWQ823E44k1r*Gg2RX9z8tq7@j39n|Q{Qy=jt^mbQyqaSjN22;2)YTktk>RLpCw z9-ZbQ#jR>~_wdLUTiq7ncm5H_3UJ)GXyi@ki0>HQ(6DfDXX)p!;^Lyu zfH?{l;@BUs!0CZvJU=~{_f6omnT~~Jzi6#KT>bIf*nE|;k*SY4xv2hh1P1_wdVEVP zv*PdbBso3ZD`aX6Xx&Ht`cl0M+5-%dw$-#*oBbZV+-$0fqO(g*J6O9}p1rkM;{m7s z!llitb%TDTlAxCqh6-dbKBnUxjcxCyh@xic9x8=hvZx=sB=5hgL;U0}I6n1b`&HG% zqi5Pp<^agS?d3=d5Ont&OZf+eyW)}I;bB07Gg=P-c5GIfNpw(HH(%?0F5cDutL%Xr z$nmvSy2;F+#1;-m6zWF?cG?&LVx87?nhs8R zuZ@pC;|D5lfH`t)i3GS#m+I&>I@TVqiC5Lym*4LfnJwkv!$7^(DE(b=SS4s48=o=) zQiQ+Q5(UAXGJwkJ+a}|vv;KaJIuxyy3SrWbbWZk_Qp!XQ`yM(F+Fm=f$C8(LPu*>o z5X6L*!<$!C$2!OYwxXaedMiqW35`dG+#c4hm}s4b4D7$dN3-oj9)?(CaZaQia5LM)_8;1yNY6R992zAIF^vw7)fZ9FUiXN`mr99E= zlzN#dY8*+={2*;Q`umnfYe|}L-`_*gO>_Ukz2Maj03z<+*y;|&(##dAnA$Npgr=Dm)@{j(%Q+f3SBy_#1BMJ_Syu6VlV_Qv#RwQ~u`C}BX=eaed zR9Hfs5hHVN=C59-?}iL{F9~b(DD=FBTV!Bop)bFbv(ZSkmsXTJWcV~x;c@Qr|0D?d zS+j81d1&kX&c9wn+RTvX{Gkc&sGDfq)?1szMlZ7-@at9r+N(xn0~UqKivyz~{|p*p z;xhK{C6(f!r=$n<_ZPnoT4^G>#mf%L8!=GF$VOvkl6+Ra1*c_mOmcH+6`lr2f1{0X z+;((~UvCR0U+#Rdn%8Jfj!Bb+WXZuI1ZAShh)vwbH^1lqnLR92Bpug6=Qf{6f|9^Z zMrbyDn=hnW8f8l!kA%tO{&Hu0ZH*cxl{QIsWm#vqy1p)SSX}nPx-zDf>%fA1 z_Afx5_U||eG{|_xQS>+5>h+(~nNJoD69+v-xD*8q&?--(l*`*deSHOsAglo_vWaHRllJCZ)_Hr1L*x`A^ZbaT3KU_W}hQ5WSWXm z#7NE`pc18l$L-Jp1)_SGNX2o%%hao}G273au|r)O_|7^4){*c)+0=qI5Qu1L71H8? ztkt*ivl*u2Xdl3Tvt=S-#E}|ikD1>qi&WZj@$x&*~08=7o zOc|R!IhkHE z9u`KmzkBxe8Y>++|9JT=bA;)sF(ErhLMSnmYJJl6zJt+A+M?zrH;~x?r>!k-LF&eH zyv*EE%I99SQjM!4){kFBBu$wQCSJYtE%Oy@-W8!Gc8``yEckoq*HjFm_7bV&{;!Z} z-fcP_J;LmklhZhdEt>B%gNo=EB<&$#MYiW@A|>?jz6+Zw@{DS#LsL45)ZA~Zw}Pzj z9T`9(Hshp`4j#jk{&#-~X!@L2aPm1-WmkQwkXhN;Sy{Py4HU+kVcE5Px*p^m2&T%F zmmJHyf%t8eyhCUoQ(xfT=lpZQ11GB|Z|3(4f zQ4NV=g4PcYe@iQpe8el{h>_u_;51^|jymo~e8dD6Bj|tqEU{taOxDt zbE;{VJD-mBHXNZ-dPv|G-_|o~!K_aOkUWgH8;E{iDo%%PABRRb$gfRUuUk1_XKz4O> z`Lr+0%*p0D_vn7yCXw|YCY5nAA{m1Gz$k0jcpN*Ttc_|7xVHSU*sMe&pSdAF+nP zF~eo8oAy5{R2UPSA&E?9Izaq}p?Z3NNXxP6G@D7C6cY|dB^;a%I7g^yfe|X&mYhWN z??6)T-E37^RUJ9}$zp5U0t7ZX@iJHkU3je-3HB8F;hk&; z+4TDmibJ$#%OAO@k4aO)&Lz=Gt)g^(c}u0fhab0oU?S)bo&^!Za42IHX$QOTc)xQE zXa=eHr)J)61p{rUZpiuyG7tX(}nTBm?RMalqw$;>}XBjct_@xss< z6C@>M?B}YOWWkInM!Cb}_StptC68U%HpP-Jk3*jht1X^S@K)4s#v`j&Vhl2t5ql2= z?fe=N9uKlrJc`+}f25gZ;J-w+*0A7&NPhzOQ3I9!J85iL9WSn_4h^=+EV{?V?nhP= zSim0|lx1Z{OS^VGxh8ev=Jxs)gN7(qit{@7>H5oyh_H+qYHdW4uIAETUr6y< zQ-=(^_U)e`UPV8emjf&d5h7$B#?c^8l}N7eelMNCZy*qVxvX!-XXAPX-KY?$Rw>>R z{bl%J^+4AYbKYL*Z; z@t^E?F|@qoq&@x?W&AsL#vmmjM_!+`K2j=yhWv|TG9B*)^C03F+UDxqvQ#;tsj+n7 z(_xg8^ZvHq?)yW@`*ok=UujFK3#(NIW($PBErn>`qJi+tNAoi#X`}-2>~Ty0%#R`* zEy9VAO#~Oz)n&0w{3i4Cu}-@vmx!w&F9guT4RJj-d4mbpOz0=9JY!PGVCgR0OA&`yCd< z?GC_b5`=~+3+#>PE#z|Q_OKP<>NDzU7Rw9+FN-omPGLgeUvw&hvXdfSRel}kH)Y8Y>FX#;TaY_=S4m9j!<{{5O3T=r`8@Llwm56io~4!vLs0C@q42}y?y;9 zn-B7aiLsXuMZL5_)>Z^nrjrkXtH0x@1b>tU=Ju#BXa)XKQ4(|_%L8xY-6OmNc)AB> zn~wvVIdE2l0CJX%QPAV8^qw0p$^ZPw>heL(fNFPe zD<`4d^Ca^8HYfk>6Z^h#oJ`LPTHe?|3F+Od$^ruZmED*~0e=^}0wTSy`_%FuV#xz1 zpReSB)3tKPw`eXw=Jb!6N5ye^g3w+%>^Z+N7e(!t@J0``qm|cAN?bi-A*U3JEi{&v zjbINHpIyOj>jA389Jn0iJwzaq z6j0VsZPp|=H@D5A_zjHv)}P)MkaMomb|3(8364UP}dEY+YRZ zwybM^Jbj`Lr6CQcbBNM$nG6~b4z1J1D3jLEh=&(VOHE7pv<7j|6a}hg@ENJChng)^ z>sJ8oLQl^IK)7Dngu}*@J2_fE%k!t%*~&c)01Xy9l$RTGr4rCc_+1|@ISB;-LqC8C zGFlJNcZ_ZuXGap=_x)bW-LJcEwP*Wkub~CkC8)L_M=x1k6v(k4|L5{9U@Vb!_aCQC zdLI7-v%RJss)tg>0wvZn5ZSf`Z6oCk)xI z>@d784(rTf_lc<3vKMJ3gn@fD8 z!4L3#$Z_$hyul*Z?y|smxB95f$0P?)dDmY5Emh>Eqqmg)3~zs!`qOX2o<1vqd+?PC zgY-)(5Hv%>guN9Jw!G)gkSNRF6|}guczN)vZIYQ<{7hsAl2k`LCW%g$>doA-O-A*= z=h+vXzH8ViavN^_OiG)nFO)u(I70*L+Jp2MZM|Fb=+aPJD9dSB6jrb{BWxQRZ`N;! zn$wuJ9LTW%IgmY{K$CtG%leUXC>~Ugu=5rtoBa(=h{ zMtw7**xd#4gJIvYN)HAUd%h-V9|si&PA=lpRJ8X#D5Pynj-e-f_v0wp$StQ{QON?k zx(~upvGwF6P?ZPh9CSDci&85iI;2|KjEGH6CX`7C2_q?HHbv{+bP`-;Gfk^%Po#-5 zT2Axhw`HcGDQhn#4~(?Dc3f84g70454iDE?A9~?v;J~q|UQmF}QCT(=B#^+WO9z7U zBEw}hp-1J@Qo;XzgaQfe)wL%3XHX)Fddx3*00jsU%d0T_xdz@RI>-@as~`le05OI6 zkw1E0B~qp7cLlIU=O2o}j5$aFKJx)t!%NLv-OD9l;|BD#=KMLqa~>{L)M4Kr4=S!~ zFE7Rq0Y$)}uxs{>jS>Dju;FD`q3n}|Z77?m{GpuIBGwb8LjOKoTu7W8Og;SLL~~F^ zY@ud9X5M%=K=AtYn>SAn0Q=2J$fTy(b-f)WubzWYec@Rv{Ht(9rxATVuWj2Jn`>n{ zbJFwb^74j;24H|O=Y8Dqrs)tpmnz2gQEj~cQBJnFj~Qn;3;0+l2V?Wz*&jOU=z{X_ zu`MM!`m(HUH)2cp6pu@?Rbptf3qSBUu;{j=JE0FkDaPQG6GS{3voix}w}G989F3H5 zOegH4_1jIzzw3hP4X<4@i#;b===MkgYh?-ZQ3QNC*318teUqJvG`@W3>gl|p(FU2F zE_Zt)LIrhGpMPdy!b?_&?at>w!EyTpPWT)n(irn)U1DpL6jQ$z1Y|UW|b=FAzC>jaGN)%`MX4ux@u>DJUvbV*W8Z@Lv*I*-ex$a_NzOzr>9sj&Ee^Kh!N)&A+?P={O@(;QeHG4RWXx_PRcnu>j6Pk=gY!lZZ2Y)kvw`4*gUT zI|^y*HqXsgKigN`A{A=|TVUwW%CXwVVy!mnMVn*}S*wIxib2b$hjE zwAk@CZskH@NOUN4TD4kGHBHAy9^(7MRhN$OU!^nc&jSH&e zV{(*l&L%v%$$)gt*eZUAWy6xD{4EnqVL!WJJ;3Zs<06vv%fxJzdA&;+&>zEBzFLo-)eF4@@gsGg9X&S;|{;zM9#M z5`nufx3}rXp%Pvl2j$5(W;xtxEr+dF{#8^Bd=F*|$MP9SklOH4SVvCYhSe^6iQqft z^)>*k*qSrB>-w|vVJFiSiTn{g#8cYeRj86If2sMBm zX}z7Douvjl;L*&HsGEOnW_B(V=C^+~JNu8&aBuPYR=Xk%gQJhW7`t=!B;i8GN+9vC zVYZz5yA~?(TPmAvViZNqQLpHxXm;ylfm1E&YZB0(H{+vrvF@Ro4~4wMQ%g%r`}_N$ zSOh7fHo)-3h>J94$!UIs8sv5C<_l~d=YT*!=udAmH7T`LROmo;b8quzaq2su ze`S1=Phl#WTUBEa^i$kI2m0mIbfu*UxInt?Z%-pr>N6$LS}?DC5ivnhOiQ`lLXC?{ zr#BG;aB!{izgB=h(8B=OkFd4iC?k#O_)DYCFv>O-3T7f_*ag%pn3vU`g1b^B@!Mj&?!gVa~Nts9R+@thU zxND19Kzl)878#^rM!GM@2N_cIaFo?wCI&=&@dy+l5Gg{=A=X#RP?N?4gnLtPfoz?d)oz5=v6&jZ)-kcn% zo>pqT4?Po=P4+U>&yYXJLz5x(Y+t91h;!u_c`IK{V4#M{ybSqeqcTNJ}Fi-96IX zp@4KFC?MS}-67p0-SVF2UF$y|{ODTDI&+_W@BQ1?B@_B(&YHy|XEffWE@3MDD;mgI zY>h6>GI+*neNZo`hB+$jZgFP^@TKoX)R#ZBH(DmZI+F&63fh19nL5CgJ;uM*^>C%k zCgm)zR5>`NUG!D0I5myAdMjBi`XKt2`;cRr(YspzG?a7%-2SCgTD|mN|8rP<^VUQn z2L-BRTgua9X-x}~?XF78k|qwWcJxKGfeN@mhrPkHc3n`ZuX<{1mDCZv=qSD}(s^x*zPom%7iBxPpE9kvLRXWrpC;DOt z`V{<+n0AwjHmPxr7;2-%DpoJ%^=)A@EZ1VsXfGmITt;5uSa$ZO85y>rr2qM)ZpZyB zFfDOyMh&Vy%5gjX;q*6pv7nq)ue%{qJ>co8rv2$3K$|}G1inx4)&ePz&2lVhb<}X$ zx7iqM7;|@)oEce8l)07u%PmN_zojSh>la~^7wz#`LGUuhr5M`P-giSd%%6RfM!156cz{s4d~I)4f$WbpYeZfLrhj z#*In5T_s-$Xi`x#_)*a$7&X@RT)EO#BEEzm)L*%s`bDyDSso4YX%G1J$sU4Zmc9(J z7DZm@ZfnrC!%a&mBz8lyKJmZ(z116V?zgaf8wHP<1ekv`k_}WxTz8>r)XNfzE+C+7yue~&;=c5Z)fzqq?`&iFNHjy_8p|5<^! zSZ+G@LxBBV_b!N5{+*Su(Kj`T6IejNa%9>Q#;a-do2}gU9&heMnBw(e?*_y{?~4Bd zZ@ByW`<;>W0Ua+gbkN6k=Pc`n#nHV+R$}!EE4T?eFbXJVJy2-LH@)gBYjp_7U5~lk zq|)Y`&cBfw6gN$N<`X_o9*_{WyZ_x3|6Q&@t?ek)@`M=Dty!%c&*<8)?%~jK$Vr1Qj}E=9Do-$+ zRix#FYdhL}d_C?>r$6oOH8cV5aEZ1Ipn0CAjkvo%yau|RjjMdCAN}2KwhtPBE=-zs z-=wd;7(EMTQJmN}?n!BUEGgrNkV`^)x#NT?%gmuF!{+`cCx0O74_qSu-tFZFK3&ZN zS9*Xc11MSkX-IvE}5ct zwk4oyWW=Ke0Zexnq;g$i3>m28^YZ3h`HGPS{Vo#ufmgth5^!g=Ebt%V7wE+vwdlM| zX)oB>YeZ$T?CMF%4PQ+}sBmFS3dJODBI2=mv(Zr_NX{LCS(jn&>DGd=U(i35emtwg zrt=6JN zrDQNmk5Q9eT4+pD?BopumOe!5qg}tvt*80)29{D3#`mf>v3c~X06|sqs3=;MgrcSv zbE`g@=l&1OVp5i3Q7+8VMpx6z?00GSpy7IC4IC7-&oXi6*r3r(zS2Y)W0l!+Gm1Qh zMg8V}E?s(Q)zrPpZz!%klgy*5wFzw6OI;E5h3D%w56C`{8y>Dl*yUOLP#PdQUM>UR$0hRcLS@%FJC>ThVpZ0 z0evn5ryfYEP*_lIM&0;o%%^>m1?7^G{$$O*yCVqo=d?GWf>?t!b+nE{53$x)9ItCy zHuC}{nI8ejX@rfnTj;S_q$;?0#|KLT(UK5lZ^`dH#0b^qHV3qTGnd^`A?+twz&xG1 zRctG8WZh;`!K&MP>P7%=WY3!Ve$>*${vx#Mk-e1ksz5^gzmIfp2yTI5#MI1JIOd5B z(s};W504sxjb*H*p?PxruW>hGkcS-A!#h%OE$`O7jJ*cst>*X97`_bIvckbGq<<6s zy>9fUX^^^!X9Fw=bz*{C5P*QY4aYpiwc>GpiK zLU4Y$_@*5aR8Z-l&2gVxUJV$ifWtgS^VM()BSFu`J9`eo1pm7k)S>$>+mJ*HLsf z9J2^0hTv4pDn+9L1^bw_MU2b1cR(?J)^NQ81t6rj^Nl0ve%eX{u?&$3PpV*wE#Jrn zMOKa%ecmI^w@;QmWBx`8pZq&s$dS#}iZ6=PZ{hQHj&6e-7(Nff7%kLB7)OSiASb;fYMtBv1DENWlKExW}faTD_10lKEU|q44Y=; zjlwHe*|aWUdA)lkEA~MD{LyF?r(eF2EP0cjC&^kp z-%3>bGrx=)h$>KT@CuK{niu{0@owX4SA58lAn*#Mq(j!~GgmKn{f)^M4?^Imb@|G! zaf$-%k9XBz-XgTT92K4W$5G>{>2#X$ye;x{!zM$!GSmcBYh%okhA2H@ zq*OR60YwKn$hb1Z7kN~k^WfiKTCMs3=D(d2=<}f{%bAEe;`1#HO~rBxF5_8+J!|@u~Wib(UtjR%#qsFWK}> z+ZW-$kAK=$)*R6>vK`;2Tm&T4i|FSW%|&ZT2bp{PXu1E>cl1N>N8Z;D!s6m>Ep3L5 z*}ysP|F4e}NL#@o%)XGhmu7w(sgDUmL4pNARJK2+s3$mxh!Qq(_uq#6MhRPCfE68# z{Bp~_y6?N#Q=PW?`Udgj+H8r)K50UTpi1=~9Ua{{c>DS;yXSIX_Wec2qk#4HnRDk) z$iZT{CV=}qAj=7Su6ahdHUrGe+53pe$v5u=slYtQpoBW%(me)enk5ML_W2s!e!aS< zYXDLqw=^uKD}__neQ{iPE=w3(Pf=`3BF8nVIVdE!vby>N_!PV@_a~E?;`u$Ek1gu} za;7uTQaW36ZUqQ5bMD5(;W1^RLZXbaGMo_hibPXXQ%B1B_mtJi$(P4iKja_3@We~J zIH33jgJ%#)fN06S_5Qk7iX&jsG)#g(?~3R){UibbPGMhPpM!w%R~u{s zARtf?-tK*2O@{vBxutqK;~P+Y1YFdUCUWCNp6)6CohWlx zQvAB=QubeUSRD;5@_C*6?lXPWgKVj50{hrB;b^T$q-aNYyTAl!AlETKvv4q<0`Z zb_)Mw?zKXB*Lx>Bnx#|WV~mL_36^{M@2HWmFxatNp~0!n5%7XCah@OZXmA3yd1jrD z&=*~FaH(w47$A^0Tz`s+n6<5)nsSSU>*s*qM?o(Ya(y9m5n_Dlncw#Vrqq$lN_GAB zr62Us`)?|x@0H2U_rWoIX0DG5OWr;&`afVy>q$-4s-uH>RehR$l*UoPGDA%M%l`6V}A0yfYOc z%`aaLQ`JpDPPi5fG3N%`SGnnY2ZbdZ`B>m$;W~OQdt{FlI~zp5BaXn>Ygsceq$?|sz+eIxi~xlre^4x(&oMoW zd!VPFTfE&TwTi^$UFuf#`Mi@`wC0gG{RvYy{Z@iyEJ|e*%JP?l!8T; zR{b#$sM9Z-LxKKmZ~ylvk|yI0cu{FAzF1%ext9)HKNzXpJKyI&~0 z5eH}y3YI(Xh@=kNdEKddVf@- z-JMuTUHt-mZ$X$OT26EB>R0vNazQYXbm3&%y!b2Geq!Ro*WOS#4jl}YcwgL2C4JZ3 zqQ6wf@orprz<)hjrwxg-+nh8_K<*8M@VB3ra0YHv{;yw9AB1 zIp+6JYSO+xU_m#@inFhd#3Iv&!OU4u0UJ07FR9d;#|M6BQQ>8hUcYhc zojY+i;=eA2WeUr@KO8#@s+yLs$Ch8eu<$|nr5(9? zHZnQ_39DDL7WhLSq+n46=WD#82>*tYwwsa?CdcI^^E?_(tE*=nz@USURbRoLUS^{cK!XI$^WFT`DErDuP~G#1}hdRlAaH_dUQ1 zEv)GPwai4&v)Cx5VOrV;(%js9*F(T*vRc{HW+96T@G!3m2hs!2@}D0CJMMszSK_km z@Rwlhp*b1X4BJh>$8kkWkNIbo!4s{$Tz3T)#dEP{cVUa&>VpRl<`Gv3Ln8?wU}_mrOL9-)F$8&*G%dLO}=Y*f3-2SxiaZ3WSg zf0ME*5BBWBA3#BavTxAd3D?Y1=#)&ejkuCU-1&Va09xXJh)59+(|@A-x z31dV672=E*e*G=lqGquy#UpBPyu-<9C6cKtw|+3zGJPRbqPhgl9H*;s$_{Y*{!Wn^ zRg-Ol_4+=!$)kZx!Kxp1u-~JCusjto`*TW@kt$MLJv^>~ZWW-5WM!&}d>5VuOo#wi z-Tm3tfV=VYqH{nYa_wQm;Gw`IFgOB88Fzr}(U#(km1G+sG?Stk;8ZJyJD0{~+>L(o0RZ_HJfW333AXMaIx$P>@|^t6ZH*g`qj|;W6Ss4hnTXVBU{QGwu_F#n)}!UE-TV_>ciB2T zDizYn*8R#{8<|#miXxYsG?49-Q4$?11~q;Mz%P;^4Hk`YQ*Q*MiOY)+Axk1zsr=cf zbwj>bvz&Kxcn*H7`*jgoxI{D5rN%`>u$KJZZz7`gjrM}9%D}(yHm%xcTS%AZtFO!U z4>%l9$K_WO+_2tv4+0Hh`@3ohGZ_9ydxC{5aUPO?; zz6MF-p_5!u_0c<0P9Aim67tTFm^UYTPhke+a1yW{ypQXh%|e3LEBlzPt`UcJqrAMv z(1(8mG=e9!856q~R-&~R*2_P;zH+|aTe;A6ZhyMT&sxj28;9Z=kz7v%JY_%McRWsz ze%Ldf&q%4!H=5>yqCiuuRAK(>M2)Pz7Q19L8DL8VKLTXSosn}HnsTjiFM*s1phxrX z4sa7_YNsyY0qX~D)wWqc_5x^F{JY(X2ZUNQ|EAwRrbkEPSZx9{9~#MkO3Lk%ld66u zBO@c5$v0!qmw+vaRL+d8IP9GW;aEma>&k#5UWS0K3Vnf+6Xi%mjC(-D${#soj7XN8 zh)ixmM;^a&Ikb2d0h-x-%v_J`w)D9X8~S1u&9rtW(C_;~wx zG>s7jyt$FnILGa2JdYR35=EYPuNbk4w@j+g>Dp|>k*=+6Yl50v?>X$-VPOQX#yFHsZ@~g`T80EW1i_gS<(qg#$uaF)$oY zsClQ{C>Z%->k|}zD!V&K0U0x-(mO(KwV%r--Xr1gfkZ8U$xT>Tl6*SNWYoti{S@4g z_HTt|6e5zlo^!rmKhU_Y{+@|oZ%-hQP26v^l;v~ zS9^Wpwg(;j0}4djk@VLxcTqLT)j;g9@(KUbgWAG_F#8uOsa`M(DSn~iwky#(^K;yiD7ejU zVA9GB)eiIHR<+E=`!X_H8CpnzZNW}hS9^g*o0Qu9$ynYr=y!Df7>Ty{d*{}QZ2m$k zo{{P3VmB3!MyKq#7w+PM3T4|b3 zRX@#t9fdYTrw>L7;}JP zD}7|g6M)kFr?WEf*qZFKn&w+R(Xj|y`{j4_bV0Ls(VUk5d{qLnbCSzIGIS0D(?H$6ORgE8G+>j<|rohyh)C+& z-n)}H_}<6Vmu4!kYI(%rLEW4gXKe7-991cKeeqv0uXAWmwvDaO0dE zGH$BOY$g$;wb~aroqqtmS-=D~W=#(beE1RQ>+OBF(S>56GR+5$awU-h;y+Wuhw>*L zt!=HX%MKIiyo3-me(0xM!x=Zklbt)Db}09*Gva`kR>m}@VdflR=;~!4eO$k3VuSx~ z{%V_L_P3uHx|ySX+(AgTL-|SN^C7H>Mdv_AE;r2uO`}%L$Q0RWwFGsYP|BbWedyQV z$G``cFf(sN8#V1`Mx|Fa2Ff!wd+-bua>Ar1Zb($AIZ6!o+*?gDdzRg`3kvcKN>Ogw zkA$=U?-_&|Lk$l5RZELavC}OD!a@rMlamMiRY0GxI3fEpS|&sZMHg)+%Gk^+X*+>5 z^pM0{eh@9SnEFYfn28EfL<@zNp4Vo&@?v~QxhPIf+|T#MPd;|r_esz1e>y|t%x+zo z#Q9|Psl7Y+c5MUCY`rPz)Ncy?+-DIOKXvi2H4(kLyTwFtB_jM@9oBx+!^IWRP-YS5 zM7EW5`hIUL5d~DAks^EeG8es=%D@7tQ@F(YiJ&?|#Jm1uH=*6M=Q!RP7INsN6Br_} zzu-AWa-TL_P^whl&+Chz3OkInUAX@+?@r;c)Kqm3`eYml?~nM>33G`wD=lYz@t9P( zS>h@((4Q~6glgXwI5IEkEKIKK!(%N%q-QEyw+`JIfa4(&m+Yyakkh`Lz9^x_0g|IRA) zG3xcW1#-}%`$Au2GAR>*%2IDKgYz9NK~m^rNp1suQbu#-Gm26v<)LfmvNKEj%D~(8 zIRmripFj0#=HYreRwAp1m)xJ8%mp|{>K&J-^sEJfQ1_Rr*ZF>n8j}6hAVZn^gjTIv zQJxiCH~-`4`6}?CfNJ~4^SNY`;~wha-MQq`p5*gxb|4C0bTTiewa)l^zZ=B!zn%W4o>P9+Os!pjaKV7Yd|g%WAD%oA2g2VV;aj1%o`3BP(b5Y zzBH=_h4_M8r(193-KE$JVLAj~?xp_=Rg#jD{-+NCO6;0ca^N@p&_4g3DBPfCetg5D zmA~KN$8z9pWFS|6DT!a33DG1MF0knfEnu>5SVYwsZVgb;JjraXwuhWaR4g&!f~?H2 z5<+~k<@gjyUs=E@uorw)=eqTi6s-sWcG`@FXwqH>&r^xs=30ad?wwyliOskpksqE{)y-&By=MV5mM#1a^_+^6$@3A-H zp}j`wsEq)Zr9LPD$TEd;p@0%b&9koPe!9MpLn6x|gvcXe-i2X6v#W0SQ-CM6s=O?l z9~fCl2CTTR0v>6@wlWDFV4e)p(AHk|REqn|^*MUYx3SoO$A;bZ3~DiGP@kq@6V#4q z1q|%Q1IHkx7gca0DK~Ir|4Ye4b&yZ76oOG!TTT zunfK6_V1Qfv1tIZbOanDOwPhjK#2EXp7NnHBqhg{s~k+0mQUtEUc_vU%#U5^X-1n84{&9Qp0PzwH{A zwiAQ$o*6wu+q+%(s=WlLthvb00y`2aSwsve{o0Q`zH zeYxo>CQk167nT^8rpm*X_SV*iKaqPtG%%KBVWjwo%&c8c%;&r^k28rshm@vQ)xi1Lc*tZ-}GN?!*I~lEAU+bJ}oSk&-t=qkB zZQ8{&$9`D+=@KTP!TCn2ed5o_O{?k>?dH_FN+MTp5QbEG$ROlX$J1yw%YA=z8j=GF z!WJIhGSe}j7e2R-BpTD)#}H=uo;=4{oP=HC`w_)j^~D%8Z}4rY$O1}GfLul5?z>k{ z%kIW`wMueb z?)Np#TvKL*M7SM9@lEsb>q1aZWsup7ZYkSH_3GQoU@dL!`cO!$3tPtBRX8H4NJcNq zgbhEKNVFvMEK4Fdp%O_3oz9-`vX2+V7u^iZ$%dJQtxx|4qDkMSU~xllE6`s{%J|wt zqGm6;g)JBpl!=>w+JwB)5 za?SU=?Aun(#LWW!>ogU&`0w%}f9G1R1adBPpC@2j$$6ZTl*5?`0fb zGv7)jTTao-RU9Y2xV88WuBw}7wkF<4VG`LGozzKQ$U?QaGlE)D|2vhQ^EgM03&npb zn!E-{5jRX57!m`&ZPTUC|Bx*Nw1;%_KD!zs@!&MjM$w!k!(gMo-B*3uoR;I@N^Dw{ z&vpJQ15p?ddOy3-j}xY*x<0}}85W%F7uJV+8zdcj$Mw2XEwRsQ&j+5@IdgY~qC?r6 zoy3T`=hs*tN3(GUkxdh0z6fEo(GPU4tUCs&XwI6t=!`*rBjvEE$!!Bc2Vg^8CkPcZ zHd~HQFQ@tI?qI;V7EH?X=T&fQAte?(>tN ziJ;R*A!byXk!MmDi-RZ~8Z;SkM4D-ci}Y`16)NLkytI}n(!|8-ItxA_gy8Rs&nkwg zM5!&jk}eLA>BI@kP`6NE--B7=lE{5MK$STUXQueZ2ePZ6laWOOl?F|^o0Tf6P@tiq z0>%=2&5$2zxRI};x^IAW_C8l2i6Gn|HV=(~(cV6D-xP}{Q4W3mlG!|vn(2PY?<|xv zPyB(8kj|{G!3#Mo@~O3TLGo)LEs}wB_q4+H$B3T7>{a7gZT(F0$kyx=fXa0FtGptc z-IfZ*EyB~?L*Uj*K(aB%=QzL6ucIB#@Io7{Ockp-qv5X(M+jVFJBp>@Jf%Bqc%Z4L zSY<_7BJZ^6P1r7{B6P|ol~@q$|0 zCpQ$qTT!zq#WJ{axiXsb*gY7e8Ho>6+5rLWHWZl2T)t4LFfb(qcltMhz4d$TV%v)1 zvcvuv?b)U);G{_dqg71`eSLK=bdTy*(0(4?BUaFY)SneE181!(8XDj`X)%D8>U1Re z62W&G=;}>mYUNcM>a5g135TRyP17;XkG!s-fxov@C>V+342JV4b9<=?{w$BJQuu+3 zrL8CfBJ_)5Qat!J9q5uOm7$5MpR3bnK8l9}9~{cy81xdunIA72#t}X{@^GYnQ#}jMf+exg;>{M6G?NMwg2(Nr817T z%i=})$RG_W-gvESS$Olkj4h-0L8RjceskHT7OdW13O2Ku{<(Up>Bb=VIj5fm-BVq$ zzcnv_yn15+TP#6eJZ$Qbbls|gEtrmgC;sm5iem@b*Wa>zUSf;bVxq-NP#Fdofz&i# z)u{lG!U7fe#W?YmDuCo8*oPn>4@LJp3*jeEwL2TpD?e|sk;sNWbw&lA0fIGu*39$n zPuIpJiuSa&)?fY+-OF}PAsy&{)({qcHaOK)V!_J1>p>2nYuLUFr{%^l00jHIponL+;DQ}9Q{?63e8+N>fPtS&943%ru8%jsObuCP(u(A`D$ zOUO_x;Bx=*afOW6VQyU5J#Tw^4AQtV{9WO4b`qwNSvOat1T8R8x5ZKr75V0Q-(-ZOsLrBxB7aaPIdfjXK9 zJP<&R(C*hOWu5*HMyy(qXQ86acgJu1@&;6uwQyaWdqBd#7%ZbJ&2&ARLmsYJPgYE| zDkF@Tk&!57UUi=vwhMB6W|5~(CqF&UgP%efSCb~Ee_o(zDo39O_EyHdmNBT=F%D+M zg<>HvEkMMmNT_rSDX1i_-G{C}&1;oi>NM^UlgIR=%LcV_`82W^9zLB`dp{-1<1cr# zaE*312;N+sEz7p7@@i}oUD66%d^ur%MS@MBcsKm%o@M%n8M7_f?b9b>NW6&^ z%2O&_gZewZ#4YZR%stax7fSI++G8QyEtm&Ye zAJyqSwZeydf+#wtSodz`Ax@)@zIrm4{_DWvAb^PJGdHV53j+5V)X%AjoqW<=5IL7r z&VIT1z`msJ;JX~gbZmX|3+Lcd-~wnrti=2c?RlaKw4|Nz#en>uKS)}lc5L5xTBMq& zq7*EXm^p;FQAtqXY&yR|1vp$PztyGCJ0q(5b-b{V^u$k7h09{hpdg)>GJ^J%U8)^E zcRe@9#Z6^W8M%n8T|bvOcdB|Dn6D`pH2Dp$mdeK{8z}{<@zkxHG2n?P8|^$s!c+vS zuvKDEI1;kgb!X(V%7vkXZOr~#RWID?q|J6ATX{EswX?J1Cjq=&DKQ4RT5Yi<>;}RY zn~i?DjdXweKKTx|Vl@;6cSvJ_<{Nl5+9v`o!un<%ss{gWZ+HVEEpR<)$ zVv7#~3^kLX#;F=6;x7ystVO?A z1|Rdeh2FH=R}xAz`dV6N51w)-GomYu6H8Rhrsa+^@ttz^VKY)RzAe5VHGi82r+%Y= zYGD7C9ojj$5{~@n>n(9mb zTxDcvnkI==*6Hw&`7#O^dr7VFnJ*j(N|>26%lw1YkZS}Z>X_&qCic*R>*yi0tlUP7 zfRIW=+vju7h)D!8TuPI^!lK6r2jK0QQEn@|!i1rQ(~yGb6*r@kPULWHGsh8$Rt;y!-f1vb>eAz6H2h%mcjqB03NPMIKn>peS3_YlIa`)Gwv z&Dti07auV{kCH9C4;JHOlw)iyR8PI6waB|M2#a4(s|xH7qeC?|Tx~2@Yw7PbwA_wq zW$)_u*Ak6_eoPNA%z{xdyAe*Z$_pUX&X01`}2kAt6hwxJ3*ZWD*ON`6kC@wYBVW^WCA?{>??dIOZCYHouE= z#?NFHIWJKnDePd!hyA_;gvE+mZ)T42KI29m!@NJACz|8t<>un`)SBFkH<#O`%&$10 z!{IowFAOel^>d3lUKqP_ZPZz4bN{-6YYTO#@NS;fi$Pe^zI zKEfh{_@_xVlvR8W+y{T7uyERkUqw3Pgi6oi3$e*8OnNOA zJE7k?tmCT7aW$*ncA3v@Z-W!wl2V?^QR`KoX6HU??F|bcelbIFL*~5xEYGf<96GtU zIAv2nj4>_o47MV;&^W{3DZ(F>4v_c`=7r*b?saalFN;3^(aQD{@fWm>>eE|?H9owC zn}G8*oUn4cqa_Muk(KiD!BVpkdT0h2(=hFpklHk{4BJfZcg#rTT6Uoz#owdw2%DF+ z+K0jCyC>w+^wP`mr=`TQ)9JMF2_F=jOuHv>tWk%(*w)}Jfk=V2grl;GD}gYYMw@<=J!_!}LW;IW|Kv1I~{BTDz=HbTsave^Eyra$(Oxb-l0UIYNb;s?&u0o z5p$Hhu6mi>&^qIuJ7TnrK5+gSVAr)p%QE{9DzbPsJi?mVez}1T^10Ql<0~VRfj7|brOa6}6h&}$J z8x~<)%{|=9OJ*Pd7pyI+sfxAkY&#!>Q%K>yOSH9sK#*Z+EoBsj!8lxZ*k$N4q__rW zT|v^abf~g3O^#N!yeit$v`Qb7x%q%RjqU9;O?$iH8YTv9LT4%+7TwRfBLjQKzrbh& zBvTAkkw|DA6_Kj^iWvkX?#LqAY50XR8r{bMi1p-H68GVISfAHfT-(i7DN$~JXFsr$ z%;&zq8E_U2e9Xw!+Wn*9Kzzk+c}}=Qn;*K4F+;gnAe``B;Ak(rkj+0nJAEJs_4z zk6kQYYA_@zgO)E0^DdJVkB(1uY;;`sY9_1rV0ZTogIM4{qq7S>JP=o$e+*l}7IBl< z`&Kf7>%93Raq>c1mlnt}99Nq(3=FoYMvggTN2*14RBHo3Oi1DI!&HrGzb-Fl3r1Mj zVtPr{MslbEm~O1!!`=M~7@kg8H;jxZtL9dU^5X)F@Q42Zib+mA8v5r(>5jWyAbVS= znB0h-JIj}~_5e1gjNpz~tneidvH_H%C_so9J}$wLBV9%Z|zeu98O2xo#dbdONqNeBz4q2vF!j^mGyO0}jw@uypw~J;BgQ;lh zJcDoUu0-~SO5#?|j;LhTUh2d#@J3hSY^);o)`!|VPQQ~E{ga|8uYP3R(A?6}(%#+< z{M%*-Kpx!WEW4xHaPl(!--5B}z{s>k?i}n0@0<)6sra!kgBfDz#yB#5O3i=Xpu+CI zj=|B9y=s~|tf>HyE?g5w3D|7Y{r2vc$oyIhS<4E`gGf$6F{SV&m~?M4GqS z-|;|DzF6Sl&`CXMaT0Lmmzxrb)AoFSWx{+(Iz;aOp8U~dE6{6snRIO|EDk|vsswJ^ zt83#-<6K*R&dd4}aEwnrLG24>7o5>P}&PQoqlE|FQ@?@b;x);-pGDe-?!* z=6I4ck}`UwT%)T^00cAh28wK9(`e-X{B$$T2Z1#FKvgx4w?O0o>jGs*vH5&fzplZJ zOvL1$`AivP-1`8)z>!ESRrv}>TP&9uVfH&iYD_qV5e)iW>y`VH=Svj) z(<7agKxD`a$<&Bqq!gRO>dxB9NxB{R%z;fjtefN8w5OKdh`_g^`$a%5ZBF(^Rn10K zwah6}BJG$L6%_1d&?l4&4yjj!|6FuvskUF9)8pyC)Z!%kb+cO8*3#nYgbHH!ILHBV z+Lv2uyDo}3CuYUIF|PoOukf+?sw>2@;?wIQQr4qq%58MhIZR(3258X`K6q?ygu{_C z6z=tdzGc6lA7_;Mji_kp&l^C?3#_*SXT+2_XU^N%vN73UA}#6lraO@3>H4j!MBf@$!c>P3;Gv%?Yk^HMY~9`a`e+R`9f@PrKdOd&Qq z5fXO;&8nR^UZ_?TYc$GP{~UCT`XK5%9mxl2R8(oR-=&RUc7hk6Qk-^gNEzIYhhKAS0~J7~B|tKN>s7-*vg{#ipYk%>+_XLh=YkDokVz@O zKu}?CAIPP`k>Rpf1Cb8WcdvuaUF_aXJ~ud6?PKQtoc>zef(}Za(9`_=lyFT`BOly~ zK6Y}N?MHFtc19CUT#kW0!)H21!hJIOI#6L~ua!`I@3vGA3cR&bM5pSo2`RL)&Wny` za%ekz9mYIzW~huKSG>2&e>{=Nk%H`UW_wxc%pG#LHR5)mg@#R9O)<>H#`9B^K_NwN zIngUqvM@krlrkSFGZveJY~XBYX4au3SV**gG11gD$_cJ1E1)emAecEB7%4_?8$@Z^ zY$SMP&KoBA%WrY+$~?g7KX6XP%drBj!dD4Xm2k|%SFMW`LnRe!aK_cP>6vlX`P%eb0EZ`$Q@V*(23pEGglcA@=N?8E7C_0DPoG$JJjYp( zqiao?GPr{);Jch9DA#A@vINuaw&F&p~ygqxFTp zgpdd-TY*9*Sg*|tDFdw~ApwOXE8W>Wn@s-~?#7EPzSxl+*Y^Fxeh*_^?P5p!0eqZ0 z)Tot34NKQ#hSTzafVBZs>4f=>kLz-qED=?H@W@Z%ZS58@!!~XN32Rsakq+;@1!&GU zSrnK9#r^u1azhjR%RSwCQ$N`W=Dr>X%<7FHN$vd9rQYvP)%L!>y(bMD-Jr2%WJEvc9>UOxWu}y#8_-Z zrnL0X%Cb1UkVX%Qd`=P^{*KYT55QFN#6d?}HELBJ?8>2%OiCtR=)RSqTHm=A=F@y^|RBLIJc%c=t)H?S?guaMC1^ zo64p)R*RO-(z3)_3AMI=!8QvM56~3utrElQzLjI|3v2~N99H}L`(JSasWHmP_s{q9 zK(yqE%Lvd?J)Z6O><3lgGLmRGZ`6* z-}A;?wPEV^bEGS)l9ks*yn3}(mE*>tGWyG?Mvn~H7ZG~HR{9V3#S-DTo0uW}Hx+TMkwyS3rRdy`@^$$#XR7KeW3AH&lL=f#pe(St5LssI4 zL{*FuH5>G#M?Hh6bG6B#gR3s+blfp3mD&4%g!1xVk!EB807V?}1cXJY#alE&wY^EM zBmBJ#ZeDrWJp@20?%>S(xil>_=>eedRo@+yzkhxG&)Sy$v{OD&mh-BhD|Opu@R^fA zy67>zNiuWJMuRREGx_*=F@XOaHP#KE?6ZwTzWQ3n?Vkr4lgHmT{{!cKa2&Zi$>RK_)kpMZ=(Bf z3-(eOyMgV!6V|hzKXRYu1G2h9K!DM#>Iq0wb=*w@&^0Nn%p*7nfs{pz8$R;hM-RDM z)#(_gAO%_}1|3g9sWo4BkGC|MR9w7~lexLZ-%oJE(nhYbfv5V(YxbtlTBA^pfC+ss zD1loP49r?I#G}4d#DpsL`ge1Uu=Q6Kcx(}lNJyk&xn;sPsX`O%XPnffl}Cr-q) z5KpVCtH4?wXah)50~)7^Jn?B84#oSLkv4YK(K=1y_Eb;u}xWOnk*6FU%e%Ki)Z?g0niDd)fK zNT&hcT-mYgF6qrc^3IT#i#a2gF1b?Z5S!LGE4=ReS7A2R`vebc34*!_O=7K&Kgc3; zcxqWjx68>M-i~nu1p9iIW%!?OXp~-8hvAiER%&#RiE2vZj1+ zA(MCQT8>RqkRdd+CQj(=_wne;VDZawcxjeQ+sAS4hw^fg4;OvruZHYW%Cn!D?z&SyiO7<^I$)#; zdpHmzc7Va?y`S`zQW7#q1m-9#`d$1UuGv8VS`*2LQmr{GZ1gN8<0E27c2qwE=1ukk z^V#_5@h=lFzfw}9SyO9ELZLp_jca$mooqX!Jb6ax*KcoKP2a3Uh^Jk#8E%Kd;Z5b% z7joj+&1RP|?*!eKxlFm-!L{yNgOv{^WTbl^vI2qIGW_Ut_cYu2-|g*x#iM9B| znK|d&&%XD*_QuXdc9z`NrsfEpU)7&*%)`K-VsAZcEm?@_V@*jPHB3UrUMs2dgD-jE zXtYRO9f%YU%4Vk&aUV}DUF9CoNR6sO1es$C1{;7rWTw15g~Bw-MHob6E9@p8O9WX; zvgk2Ig#l=@oC#rCwqD@SZ9D(N4z)L6sV3SrQF00q;bS5PxmWqQh&@u;-AnA|LZlsX zEr6uS9WthLRQho`h78S~MKrqqpzqdt!Ih$$7OjUhJPw3pH&2FK{civLDOOC#F3p;- zMNrIV!bgEC1w@5_wK$MeNWn^(6$~3uD`IW}9&aALjo!EYMwK@u#k#F-R=mlN@daN=su_N1)YMn8YI>dXs1m z^AC*Xf&_YtF1o(!>7~chg}%e4>4E%79DEmIsaBn<&tq;U&jWvuhOat{(S4teInC;d z)M)PemFmvp^>7~$AIETktP;t5HNXF(I!{l9e99Zn^bvqErv4&oL3i9(z7FH4^ZEUe3ksXcNtHm(DMg}E<;h=^({4b(ZnIpPuH_IJqmV(`# zHnyRu?$BtkOrfazXJ<#;y&)}L!t|!UOq|#6CPk6vud@en=QwC$Xs#5#n7_5K3v|CC z75lk};`}2)c}jR3p|mYNBz!E=r1~YVn;dy*%N zr=@7VNj|{%Tj2ziTfcm^09f8l*LmLr^;xck&-Kg8%O-ujyaRS1KK^BcJq;rGFbDq1 zu0`c<`OyDz&D$Swvpy&^D@T)GNXCX5SL=^$?>o672#d4zwPBpH{fkZ)02pN<@a$P2 zkg+oZ{T7J_f;FMpnw^(s{^vl?ht&OPMmKiQfTgReE5gNRfMv9_vOYtnMXveGoGh-Y z`N&USFRfaMbW%{guWnkCA#N?;=E7M|Z$=Pk4FJ#$>P`n+K+GIYs6uM#SBi=jbY&oI zFJ0T|v?V3AX2RG7vZZ;aU-|^m3gf;~;yLO%25U9#F89C6q_8Sn)?5a^yq@2LAbYH4 z?H#3emQqM~KIjPwrpXfQJ*zNLW+VT6(tUSfOf*r8-akBa%2wE=3-XD@YGmvOslrb2 zKFhO`t{2l>6@4nW!l>qkrsWt0ZT#FQ{&XBfsC8vTZFK{pt|p-!{|XHf%({w*ntLU zI%71AsS*Um%CbUHjR0FhV%sxqqLhv%Ls&4Bq>InV3@CJDgCaLByF9_gk!4CPuVl_iKEm!j)dK&a2UypNt?W7u(Ov zp)G7(@)P}$UxNHFCEfEmpMtPiSuHA2cTtA9n8OSu=EA9(K7;ioaau z%ACa?8bAaAbtjl^2qVs9V!Ieu{EI8i-Q6?oT{!+y8vWUNL%)popL@8cIj&lS%x=iF z45=2GO}aE^1W7ngE0Z&X?7=r=-2KkvSUtDK5I;ctBVH8FPF zXuCaNTX_31M^fP-0aK)L%O%TUjdk0!ugJxk;h~A&$_2*XpTS3aKReIJFBu{Kpyr$( z;$_j-Aoc>!Z9?~d~@HX;@IfDdTjG5iuUY#vk-j^)^0&?X- z>ocrJ>YsD?^mCG&2F8Pd?to^*dv`A@&Gyot@CK4YIq4}$16gds$=YrHGoh6ELGRnMxy`mQi1uEH)HI|Pf~qmaWN}Gx_qgl=Af}r z;KKoP6BwpSAUs9ylRadneFBtgi6ip96?M>f{Hi5s<3tY}>Cj z^IqJff7U|J5TSyJUSDL!!BxtJV8SHQFh~gP%Dzh|iYW|`4##a9fdRfnv~j+uNuxmW z?(nJ>^7-a;{o$=R;I^#cTJ|UfoQU-_m@KfFt>R7cAa%Sf(tbSTERD6{7bcjUo%4Ea z;B8XnQf@&3Z78ss_dZi#nQeCNC`A)u;5TFstE`%Nt6jwRU9eA|(wh88Art!+qa3st z_}sfAb?NF)A9o{y_w@{tm7Jy^P?pA|g`}#5y2$uy*>{BLh}G=zaO~;@}1=*l*7!$a5;m&7IkxF6r zE7YR1qeGx{{)%nrt!`R2Ejx@6c98pI$bu%gE^ngjT)TU(>oUcPArS|p#uXaF^Hc7- zivNv)_;EvA^El!vejiJ;EN+yyZN~`TNqk5#zHe?iPSWS$zU9G>%UqtKIJdfaP}hN5 zuAgVhS}1ce9#v%f0ZzCkka_w1Us?WC!<)&!!}3nb^n<>xb7DjvNpT4oQk%ZL-lr0s z;}`R(Ih!7yA0VSmO-TFxi~iOfjDM0lwsG!TJt%$?$mjD1;?wT+kUveIw>teN71X9E zB55w+OVuWLv+><+l=03WUh;|Jv-tR6%H7>3S;vRpTHMP!3hw-bX?+Exyii_!Up?{w zG{%C*s_najIqmNqaJ>kLQwQ&5S;d4QS|9b&;UjL0ADs`oaC`6;Dq#ovg9Fq z^*Lv1SL$YQ3W%3cR6bMR?CJotu4;XUH^Dtw3XDbiHL1Fctn8A({WkFjLNJ;fxpzi! zy0bz16Sn6UN5*+zMq|gaX|L7U7G6?sTt^2FSa$PS?j0efT=d`2R5>0ok*qDBq26&a zS-k~7FTXwlZ10DQjsI~O*Sqg$z(4&zbsThGZT^?awam^PRR!=(x3`COPT+!ORX|ix}~;*7PZ5BfACzfS4J#b$+#w zoqD)OooXc!%OY%qFJ!5pS$|!GI>d+j`i~;!#!Vk0?SAk59!*!@)8@!gd0YoGJr{1O z*4zH@wBp`oVwAC{vW!y6LtT*U;P)0*r9YazO_q`E?t^o7sk5>B-U@b^4E;>X;tFQ7<@G$|!fPBV>YV|{{~;%&o}DGOAGSN>v5Y_9iL!Kp|qRonY% ztzR}IV2qwjuB#R<9t_KsKb@jv({m3jkHrBE!gnOaFjK;BlL0J;8>s6lF-=D-D)oIfB2PiTEhW zAQbARSM{m5?d=2NhJjTg(TuL1-fGL{GWRRBDH%>jow<3VAsN~6?#c0KTluY!$X?=n zDmoqRH~T+bp691D=~Ip@8taJ?OkAG-41+R@)bChZJPSic$&vuf zrSO%h%-a2?k@9ah!QII7Vypp>;&&5qpLgahW!#tsGm`1* zD4>w_kQ<*aggPx_?3K43-F`;R>dWK%(U_zHP^*Bu1G5gjha-m1rl#F_*F?o2 z+%VA3VS5R8IyqrDR#1KYMbYKj5DP4eTN?Jw-WbP^0UIPz4zdDxr)+^5yaT$g26Y3kG6Jup9(EtDfce@%$M*!1>j@hJ)0tE+5}h% zq!&1XyK4dglb4bW&c-&{oVcH3BsWF=`qv88Vwel(*tDc&$^BmZ6H6EdnXfdR!7X5uYya z^Ua42z!uGP{RFTY+8(z*HD<{!6$RER=;*~-{mNJY=EsoqOizfQBP&b+%>#pZRT?|; zX1PEkASSN>`e{n=_Ni@`%bbLVr*QYDPoFwFo%WyVr>yLFPc-G8E9fqiK3Yk33`LEa zVoLKEG;sIy9A}BK7)0VRIZBP;#nY=DRgX_LUlLdc64?SAC?ljAdAKob^d7uFREZQ; zoJPJX%=}s6)I~2c_kP-6_j}`H!cqk-JFj00{WSzLSzeG46R9+qNifV0iR9^qG(b>~ zB)o}Yr%`80j5tB^YBF7;uPZw)EZphd(fHJD^kDJvZBH*~G#?!gez@9OWgAx}dgA?) zH;s#8e4J4URfGeA5UEN_!==lO!0;egmGXj)6c~(|OVJb&+#FKQ2ugx8fr`O(PBFf0 zHL`9cpK-^ebw|2Mo-AQC;7NAlO^{rDHC<*lqQ;FM&H!n0oSvO28dl03KNJ(5Y^V*6 z1l>#2RbxY^+(!tHEV5Qk)sfG;Vi9juq%v^E${%TdpFMc4&slMKAz*0N!bdE?^aQ4D zo0;q{OlA<3=Ao*2ajKd3)X7An17IU9)zgR&&p#Sok`h%K3{aPm4u zFHdJ%j&OYxV^JT_nXJdw6~T>U$iiC=}!rSsxNu*9c2v9qK?$*XQQ2<}&$#D7hm84|nvV~}G zS5hGSUUW{9|2xI1PzSk3+7aV4{{T`4-zL<0jHvRWgm&zb&>4R)IeqxYC zrk4OFL5kIv=0|<|#BW^GXLydUhoJisF(4AkJu!RCnT18vUUjxt>bKMsP zwey4D=NyFMH_vtpZZBH9?<%{mD*>BHjUy7N>Y&8WFTT4!=psyu{JZ9TGBq_-i3ZYg zYw|X2G#)}mMo3^H|6Hl&ph8YYG6^Tle(RK73duzmp*W0twYYtli`Of5daN*YQ|C^&9S6G*BILx#nn{ zgs^Qk@;<3n_?s{Tj|Tv!$XPW%q&1hgdP+{OpX7)UrAXf$5Gu1QS|ZQYDA4Y?pEg zI#8I5VL|8w3VyAqCpr>x4d25OEwOc7n6Q~FWVRrX9)qel8A{3o@HhrWRLEO3236ds z*tgQsAU7tcxm-U+=cNv#zPd1z06_>s&ru1^HeNQ)pd!*Uvg`>gVVK_5K6x&xNOiUs z^2SUGkv}ePlPQu*>h;uiG*x6@COA_uBNjqU_KG?;z$V+_5LC=}OVG^+g2G_ZLy8_Lth2e zJ9h%y0B1WE$Cyc0E)|ez$ zu}u*&!)=MqM|9Z8JCfp&VNt4(vHUmLw`CGf&@5u-t2b@m8yLDimoX5H=9c1xY?s9CFg3|n~7D2uFjn2 zzFeSrqhGfE>o2XpESVKnzK0C_q7M@i%u=nxK@^*`D|TXzG*%~0#5~k zT_d8m^#*$w03CuxLVys!LLYlQ{MC49GI@G1D6F1x)Ea#}IW=`NXVfa4B?tOlA=qJL z)wCA#)K^dM@YVXIl1RZ+*Ch=`5gRd5_hU5D?zI+gn@boKpRxoLqaUw&Qh5;QWFzi- z>*`u>z;l1NP~aGE0yC=CudQ7xr^8`5uW1>fgH~BKL2w?dRG}Y;Is{*t0M89LTkWrT4TZNPHwYHwa zj+#m?ZWvXD-S~>&{sb**81M4>Jgps&Ku(orXt%0$aSVl@e>q;<%^WqJbHN0Wff9B8 zDW;#bmUCXpaemm|^PWyWH`C0eu${lMtt$VnafR_Bm?N_(IEgLWzU6c+r5O;|0)UQ@ zqibUA2p8pitHI0(TL7|$IRXqsd{3VONnAeJ)D#8CyK9Ln(J^B6n) z=@T4TnNim62x)X~9WD_@p+d>qq;>bml_P_BPnuA02vQvEH1ndHopRgX#&^Y5b=Y1; z)+UG$g1$m(262>%O-7rpT=5_nF%gNx$v9Xc-~rh@6i-lQx)Jl6B81GbJ{iFR0MwT?q;ycaQBd$fHgo=noqyc?A2kq%S0d7cz8GBrYBu>^QC2X?y zU8YmE&dza{0Z^cwRpNAaP}3`*=F8qeK;xoQ>5r%$-IfA{-P~PB7*?Zne_iqNl5bRU zSqq}r>sr(*wxX)Ep9v<{)GUc%uKnzIPIfXbX>?#5q1vg zXQ6cv`pjERSrMfa9wvC0>F8+pTOR$hV2%Ep2Cm1etAw%b-BLHzbW_QztzF=|0C0S1 z#?ds6LLV%WJO%7FB!tkh$;5ByO&|WUF)U}MblmY>9R~)8H}fUcun4&izQpW-frGFk zl0-qOtOi*BCTxYm19EXs=tyUq4VHM`oU{+Vm~f+eY1K`m;Q85^rkftTHNEX^Y#~LY zlc|v3`MZt)8O9>n{F+8^pziVo5k*phU=Rx#*3);tjqy{$1&-%(=9gNWb4s-w1xdGy zatAYA-!9@i&oR3m!&HRG!--m_vtsIoFuwm>*ZNU(@`BDhR1Bz{6C^f$kY zKdaFn1A>LXnbrZ2&!&WFbru0-kFly^j_srm9#*~*>${NO{~<}P{O$oz)?fcA&g)JWhpk~hITaFBBu`PY^}@hktbJ|a0e0=V?T@+7a2yAJ{=R96{N;)}hcda`Kk8SfCU!c(r%lbCxb01!qgJnH1 z^#B^i?X5P}!?{Gzd>cE9aZ2?U16)E(n7t*8#~hdRBEQS-xs>vG^QIFGW3S_+a0zFs6#Ho1JLzBnD_jW!8gi&J!lY&u{#hu(prC97iqn5Dr zuta&xWDqDBteRWN@A?{s%5+SCyGxG^hj6uj0Q2`(;gjJ-bB2f;y%}|-qfN#d$0}o=R0h z3&;?pF)y4J$=KV@>%pswbl7ipxK!tI6T`rAT%i{bzyyxgI^;>%_GnLN#6&3xldkm& zT;H?C;&OlbizFOV6-3P86#KfvNaD&hH)7&wxl*->5EF2;eNkr$L)Rk#yFLwJG$te{ zCDNtk3ju5?^*xtyA7fkO!0$zfESEha%;&AfdqwS>TBYs_I~eZyupE84~O(mJ6~)3 zJN9kXu?iKe>ocV53UnX{|7mG_5s!j01wl|SU^_(oxVIBsbv9#5AgLR6)Y*78DJ4e~{0^zf(+$^Crt8850bPIgh2uXz; z79;J`XQg*HKgohph~@Fj^yVzmka^_Fi7VFgOwAW!sd;dk0c)c0t=!H=jH#pf9@~41FufE z;e;QtKSe^%>vXc@As~h?F?zYrC@OcZM8hyL*`!`f;u$YAi$RF` zC}cD9c<*n{b^$eRe_zFJh;us|V*RlLJ&RHDdcWoXm@=qh!lR$I2W^T(KxSuXK@c#u zs8U3qn&0`0^q6DkCL4hkA)(YloA1wivko{kR7ObX8s@hHp4^?&-%2-avNDf&w0RZF z3MsIUd@!%F86|jG^MeHe^K@oFKyuM|T#jG1)X3x7fq?_xhHxi^jw28XAQFuds zb`>)zMbb5iZfFw7p1g2od@t0r8qJIGbZl1Ntpm8h9HcY(=~h*sY@4HEYxoBqKB zqQplL_QHbt!CW{lADu8j=DOnVzn*4!i=E^yV8!=qIFw0FbOfXu8a#h2+%QGXA=9N8 zAtK|b@npF8GU1ft1T)#IcK4|t0SryXefBl_E=wS?Yp#|S4I$;E37_lJN*;MElXCA` zN2e;cdb-tR%;!&HMr}D%K?>KdfrN&t6!!F0+K|%kpwXyFJ#^)e|b1dfwQunpOJ#L{3u}K{@nx@;^I0!2I6^ zWOf8$&VNLyo15;38vs|}Bb8TBaKP=5PC+{N8CdsXum@h)1zzk;7q>VAgXnB9P%@Ba z9Ekbs7-GM;Un_dhMq#G)gtx%Hhml{=N>xWb!H}FY9^_{JnRXuL)@r)cK?4$W4yvw1 z*Gt1FoluI#Ll$71Ofc#L`e49tSx{a4+mSPX51Nbvg(z_;v^ZbJnBD#aWc9|ys%JTb z!Hol*W^ZB|P$Tx#TKJDfKe}cgsMRtCHACcRr7+A4gcyA625-=pP2dh~_N%V7;`jqb$OZj)CP zFL}e!9NKTUh+i6=at}ul3U;{#kri7(DZh6-*ku!Z3(#h$^iRK{t;qMDbK(T8(;0W zg-ju2tYkPAu%`L>AmXo(ap&;KoRP7;;SP8_bHqqyL|E+aPx)a(z&%|Xaqj&4o8f8i zS{qz6sYgK~0`Z<|#Sm}wIudf{D_@e+{G^F%%KAYM<~FHk^c<3vg%k4A2n42^bqdpB z;zlayuy_0WK0>?`V56Z{ER&6~{sz zx3@gzWLt4EIP(JA8=ED) z$RkmBl}~Y0F8TD^OeV2!wQ+&0ffaT!Sq52VLLL#%Z{d$sCBB-Uw^0|@qNDpP5}vnE z+mL*Lh*gbVT{k|dvahBKamRULwi%x9mAQHWo+t+JNaT^75!}ZqeI`WUNH@g8Dy&{i zY>8-oIr8e48+Wr>B?%K4Mr(!1;YdulXV57PnoW*RY;-Tuk7we5`H&_hpURbKJ+(A7 ze8r$PPoNw)cJ%$H%J(}9J0bb*$S@dBP!Xpk14KdV*q;VdMx~?_PkT{?rHar<76u`P zncj`Uvxt!ITTR+WIlx872|Pg|J@P1G=_cuI>#=OgxMIm)cc+(U_(3-Yf@FVEk3AD& zo$J42UGvNrXwYXSTOY6ToTL&`(kuBZ4!Nf~DtC3c{}bP=Juo7f6^W;*NSE7aKJt!d zD&cv=VI-%H#0KiF%5(I$pKBCjHQUF$e2xv=6ye7H36YjUr;$A;Q>rP8)K)FwNJFH% zA{I3$)Ov)Yg^20>2E>3W39)lH7IR2V@ET7!Xc$*lL#V29AHeNu&_Az1mjXelw%Ws! zw9TqG9LKCsgp!dJx`J+O1c&^1%8TGe__GkwEDaeW&}%G z#oy$|HH(kplSOrn6;i{rudC4dYE}lSpGK)--+`Sj&7`&#R;pfO1X(@D8&0mv>GYYx z`U+R;gIgQb%=~J1sW-6i@lkFf>y>cH_O%n|$~}BV$A3x9^B}de=Dg_4B1$naj>ha+ zZdY-ru#2?wjeoMy>P~!bc;}I5em=EFYsp6sW_-+Y^!Qm~xg{w}M#*tL zd53I0GDN!YsiAjw=i7!CeDc?x_Y&z&2ll=gK^D;b{Cs)_hRP)eCwp+8PuH5WS9{RD zW8%jQD>^qfO4bS=Z*#NEmw!|xONKrjEVQPWr*DsJUIuW#62T+kJ6xbr^d+k=@O|rc z2bxWY$oAgz8xWvHp7)|n*gas8Pp3Y16|A6zQI0@Li1@C6Cu zW>IU(f{k!#wX>>Sc*`6Jw zi~Nm33R${QR^Qx7r)f^d4;Qh5S;@m0Vf@UND(MM=(NJF-AL;*Yo_e;2~Z0B_z!WPrcg8PzY%hw|MvnMFc&%QfAmn{ z?=*A#5Mx9r$WeaKesd%459iCftat8+yivq%7@XL3w<07Pgo?(Gd}LV&fPgS0G=(+_ zaTGwHFwiA2#b~3(q%8gs^*;f!9J&-W3Vu`GJWSJc(;x-;GJBjNL}<$v1*ZemG?8AY zTDl1TBQ4`%PdJY3W4FIMbUhW8Z3tVz?Mmxkk@adC)|1*{m_*D$i84L9Pn&W#ly%cG zaajqAk9j+WGgkC`{AvrO7IvqZ`7B1PZMQq^kQCi4U250tp^O~8K_FS>Vc;D&Z18A4 zx!zvs?ro7i6?-qZYWs|>SPz;uJ;AV8{*OIZM$d*e{3~{StV6m*^#bClFTTcZ#U>To zZR=~+IH?`Nc-peexL<{0n-2P(0d>Tj6V_jHnSx3O>1VJr7zQ(AN)Rfm(Ukj=bDw`S zNKtp!>mz=+wEFt^0LlZCl-H-R<+-Ao&7{6Ie%|?`ecNO(Zh(8v;DtFlZ$Fykrf&gpx>+BZb zH+<^z6-z{gvrcZ9dTt!zztdY=TN`B$^cbnOE5J?v_fsA&!_eRV!*QrPU-jwb-IgHJ z#zwN^t#jMi?V5JPbZgbZ0l=4q#sJBTAN$r_rbAHRTirCvNH-759N#u5%2eX({`}+- zSzwGO=DUX})O*pzQx_ErywJW-_fs*O$Kyh>THs?k!{eI8$pe%Bz%;RnrYUifLSf2q6N@LZ0sz3c1 z!Nwmo3@3cGz;(b18^`E@3*aFJ8I@xZ{XKNLKJ}CDPX@{->B%D~WlVS|0VEFz3CXM0 z$$r*v_FUb`@7ZI1|l*V&%VkR%F6=GcKpH zWQaVx`_PBm_)>zYXofC1Z7wcz!bDFCER9<^+D;G|Y-m8$eXxA7`2hnuDQfc}${rel zM*B&jh5=Jv<;z;2eEz0x`KV?2g;(Q$SQ%FUR|}x*ZSTj-R(!fXcXz)u`!enctmY1- zEAzFyiP(Ah%w4%IeyV->7k8egD71H_?Xe44Xp7kfy@(dGVTOI^s+OJ5gnhfJ?@eF} z9?lJu{OHO@lV0(4PNWiM7OT}q8iznXAJ4PvTipvT`(Q3@-7@!n6C6zu;EzY2R`~8NnMk3^8(ErzLVc# zY`8z|inE5FRPHBOJcu=S-@p$IA9_8Lo>%r;+9ILmB$q zy&LcI{ua#D%)r@MqyDgd*N$6T6L$#HB7ZBwGq^)@rWN6Sy?0!5?a zE#)#v41Omz%^En>v{mJpFG&ehBZC?Wrl*hX9sQtJUF)5+$D z8+7F9SY2JI;{C@0%5?x-~!-!LR-du85D%GZSd2%V5ytj@Y9=Dl2E=s0&}f|F1WQC$zM zH}WY|^EZ?wg>i`s+U6)pZltboE{1lUlj}u0O67_kl^QmO>5}tw6dDUsmkl>(Iz=FV@^aj4|LK%zjd8Y3O_D z58isUlyP6adhyno87R7ZwWeTn3JQy2YCsCo%tl&su~2nI4ND96gd~M$4*IQy>=C_3 z&Kl6k$S^Wd)PZ^s2}h9R$)1`*gqUCQnX{k-rE~#_+=xeo3?*ooCGHX3ZNhtVfkgr9 zNR<%XRvh`sy-f15ydgO8c&=zl%Kh2jm;=1H7nhsKt!zWnp^k#``6F?ZlUdj#tyX+V zgN)-5=7=}8>S;q+=YiyVdOAvNC7D$%;VCbWy$~c-|gm5;O((cOD3`ud@sqc;HM@rp0qV@4O*`%~^P!h(^RvhGC8 z@o4Vct#w&aN@~)!@k=ZB0#AAxV#~k#ptDG5F4d8(uWDZwS*H&Q0b7SLf_^&N`2U7Y z3saIZ`;s!LGKQv)W41`6a798AWI);8tYo_jk4}8+{#+kDo=tkT;`u68E!}rr2HVm3 zJ5etptmR;--Bo=%k(H4Zw>SCiz}xLbI=Kw5*5f?f(N#79PFNV&a{pF39p`VX52%VSaxzq<1m zE_tBTvfz!^M_4EA8$c`vSUY$$0#}>W9FOnv@{%W_rvZtiDs~cfo)N5!`AD+*Lwr~5 zhiO~Gw5!E9ivp(~c^JrvprEH+#KJ6iV_v67WR5rqR>NgtdOyf~_cy6_=O% z{nslSg7@8ygDZ_elW|4)4f{>Otx-Vc@4%(g9|E#!U>~C|?Cz25H`I+_I-(IHN8U_- zOrlV0BCY-)4l6Q{RyraCP6kF&VA4s?K2riQv;3+ILuXKJEHt_I^L4XoJZw4KMqp(& zjToESk_IeCL@tG|UvzoAiWz2k^H}ZET#;)7lSaU|>!>Bcj>>!;30AkjiG6=oWSX{q zfU2bUl?Qe1sOU}ttSDl$9z+={ymq)7q-?J%9xEoGn>K*;B=(pXp$aBdPP~gjNDdh-_3RR@#(y>z+a#*+VwOC1uwUM&>ihGwiRI72N6p5iNpxL%S zkREu=!3lv0;oq3qebHm6r2lo4PP0{4Av$kgsClnB8^h`^`pf8^(QHfZQrjU7`|_in z7CiiwKzTYG8y?+QpFam?*}@0?%*+Q=n{Yx8@Dz>CM6UQPR$rLdig&7u3AlQ z_eU9v+;%WmQ!jhThs`y%XMx+v0i@_aZi(B00OF)URioXJyP<`ygz*pdCClfp7S6i> z#=_tzUV522j+{=qdzi@5TZeQq$=kk3=c3gEjLF6cC*3CL@wfux}nu zFleOb@CJtYkha#XT)@jGYUGqc5ky4oh7AeA4l zK?W{B*y|(a;-yE|8hVTfRB5lj+l?_pI=F|qTaVMsly-CexPF%r>w{ef7{TrFr! z3+r0v8qsyOa@3ZTpnN1q$*`^qjLm0rxC1wKbMY?((fT}87Uvoh5 zC&E0!LbFwH;!(!4qFKf*GTL`s;?s}HivLRIAFhs6_v=XcKd&G2a+q{c8xd&y*Yhbd zWlQF5kEyLRjXx|J8@Kqpsyrr61idAwG=e6lpN686_c_9~2Zy;~uokrLL3)}3ECg&w zokgPHJy-`Z|LZ7>r9OXIvTho+SjO-zhQEEP+jhFhvY~w^nQs`B)pImPL?VRA=cI4@^PCqk@Fle}TdUtfDq7G$=x-m~ z;9%CprTU!WzxclZiZKOYO~j~R%g_grFr>g1WC171gG}@$c2rN~h<}Y0H&hgLK0QQ$ zq{VJvH(Me2q#s!ljO5u_*%Pf%IrbG(&G;)X;x#^-x-A~WP$}zxZTWpYGH1Sy?XLDD}ov3z^oz|V8U&SOGo}P><3~lSL=kBGzvfidg$qS zym}Tc|Myeg?XT9Kzc%U)2`TpeLL(C7Ge*9TDt=Z5z4wmqc55(O)Q~K>lDpnk6WSuD zdm`SSPgy49vZ0Gad$7&oLOC5#WMfZARU!VnY__JS@Wh1H6Sarc4Am%&7f zsQ!|M;k~92lL{!EbSmrI0#Tp&NMgMbIH;FQ)|xcBWbwQFrvtHrz5Dz7vt5nJHj6!w zxkvq{wzlbTd?q+$G}+3~F8pLFU}PU!JP@+M{Y6FiQCv(QQWy+#i;{dH)z!K7{wc0LdoI%MuXn{gp+X~+tcf9nllJdX) z`|sUDXTTPC-m?#`1QEKomqync=+!uLISOrM7UZ{wy0YzLin73CvVz%)_ROI^WOebt z4Q&-I)7sMN`MLAv&a2Bl&zT8Z0msVKmI1jFN0oXt=jF*=ccQ4Pe}6WC^TJxE z_u2j3jk7o=2vmNuI5RWj*^xK33p~TxOn@!Dl%%ACG%4u)$qjv!(%B_Ml!GuKt4<|p z^(M25t{`K?Hm&@_ip)`=Ul{RatL{b~dG0A_bO!x`LB&r%9v4(?*OLpdUbIzhNHUFB zeFH>N+?3}@l|8NIJeErCbw3Vd&T6D=?+V3Lgpdi)x^5e@A87Myv%;P(JemBk>MG>z zV{>SCLY5lvSi0ZpA;_SXudF@S%ZY5LxGh*F#WCqK4U#CUeNR$u)La z_v`m{1zMspw~t94A=M~Z-caX;7>k4z>A>MCI4Bjw`jcF1> zfNz|&e|_EJ85btfV3I9}0}a9$@~L%Dr54$NUh;&%U`aj*(nmVqzInd71ds@T5japm z`)OtCd<0x%7i3oPJTclNX|q%5w8ge3N2HDe^it2m+q-S`P%tIG8Q{QKUEmm0H;-+f z0vNP?ADdWwrm6);-nY4O#PNSbbFt35{w6}QAqV~iqaddJI4<}-G*AA)67sZ2HZeHs8#DATn&zu+kt!>?$ zQ8?=D-ZR~&ZpsY_8ZxgNdA;D`z8OCRneJG*ICv@X1hvf73fV#YJE^dqB|Vi)ko4jG z9|!$3bgP=0JMk3$k$r4RuK+v{fJH6ZL`bNt3M zwgCSUPf!qzQ|>*+9t$f~E`>#AE`bf3dHetIbk^~7|M4C_`iN}~#$hIo7-pJb+F`o8 zySuyN=-%q?>ujiB40TC6~8T$ndH^AX} z-6u|uRU*YTGgyH*^ek^T>s=JsO9bTc`<;e4!!{xV2O12gz!gIe#zBQee*;nAq8K4n z5xzl%2*<(c!a}L>Fp?$kGXBz$BBetVilDF3FDP4mdxuNp!nae2zNK@46ULD23LZsL zj{30tB^ia`sAKnZ@lzvy{?{4uKP`2&)DGlf@PG&|q_1CE}M~b~ezq5)fBRkdA zDMGjupHlif)BbFwS7 IN$g9)>ocJ0A|H#rX800j0&RcdtfqqDPR>sSD*=qIZO0a z0kcV3ZQCgn11|`uM)BQwtwE(-b%F45gCId44(DuRU!WNyog_1u1;4RGC;LGd08UcB z){R9>9wv|AzrMMt)Z)6{=^wr?ILwYyEy+3HnC6J7Euk(ZX~4mhlo?ROyPO$Yt+Al7 z{XiURJYb4!|89`W&^p%sQ`pLI_^^!sPO^WcpWIayIW0ShS53qXK*GX}0RxOP|GSIw z;|Jghc%$9h-T8dP`}tg+JfiH_8^PuxFiU{mX_dL;zVRVG?{E>r)sG|&M2TfaV-Kdp zwL+GJllE>Q8FH-D@hTu0{TUF6KM+P8QdLz=@%8Z`h{$|V!% zx$({W$k#s)UQNZ<&#$kxd0qdzFR2jp{h?jcMEG-iJBbs>`pI@;A6^c;nwm`SVJJl& zwa}Rhy)$fG`+sHRzvHKWGiz~(`^hcGNjPxU0oX2ETS17~#ks~01ldhqv8?RUj8n&` zZSORgj-|sgd}>!4oQ~Pd(m`{l34-CaXZ^82kXgG-K$Nc?MK+)+w1 zaIAZ_w_?6<{<@59ex~N*vH5xs%0(WXsN@GhlirL^BKI_W*od5dXVSVFinHE~Bs8Cr ziqh4S^L^}VI{&wKCl5VUwZG^`vnD3oA2_N0{53&C8&Qt!*1Es=E*F=F7#OJ^LOiZC zt{pXIPL1+bydmoQ3=Tj?Dnu1QMrNaRa8V&PkEstBf@R`=$;KY*ARof`X;{!`G_i#P z$pBLXg!F+Si=-#!Fv(W!9{H!L(X5zdW6&SN>aTd;r3{jkqm7%#z3K;k59R-1(~}G% z0!{ktCr)=9cBMD3{rgU`JTt>9w)dtu)N(9esJaLOU-uTOod?c{jR3Iqps|$Lo`YJF zhaCbLKpvn)9oJ}xfq{8q$Sh*MU1;qv_ae0$rN z-+2fW-Ky))!#>&~d@KsaLk8oQVeH?;L1;`{vG}}VA?4cPkc6QG8U$RN)lwV3#{>ow zWgYlgVr&MRwEEzxYyN}(B3qEcga&Vby36DPdx9>bxw<;h`R&8$X?X>M_50(wy7suV z8E7=%CtR|r+k2C}mDssR&>}TX8N!k^5zXpK)4CQb9Ni6E?=L5$tU2q?$<_nE%}m6- zq4it!l$?nyC{1+9D^WNl8!}}q@BDXEWDqpbf8>u*X-AFCR3swRv8Z+##D4yD1u|8Y ztFNb1LkOI;&$oMdJ%kg(?_GCNiAJN;o1lDl+w;xKeOjf3-kGx+6hXbX(Nk7ao420l zx97cr550oG`Sm{-k{Jr9nXjxttq_+es^6(u#nG{8r5~E(%ELMI!;Ufgz=g5^Cc6Bt zk~^>7fjZ`Qef-2FcF{xn>x^H4+ve=QOs&$HjUbt9UnbbeRi&6su3nqriKHemPb2mH zSh!QfLWuQ|8mBh!8DrH0o$)!V%iY$6v4@L`BCZ;f@aJrRjCpV|O{6o&#>sTm8p zRq48L#B=&k(a?~iIl~LUQHDxppafy41TNC*X4~|)VizcTk|S9YCf668FCaUf?lwDO zjGVuFI`7HDl|NfgkN65M%q_5EBsHbkvgOvl#XArTN&b$)8v6bb-L@w*nSn`$A;ii3 zJI809P(Eck6^fCsVtXof*WaJKrnn+_k>dLPf- z&Y$*PW$9Yy(6IEf{B`>z$;#03GJe&NQu9^ay>jg@2I?YTo<3BneF;g3OY8vD^a7Zf z4f_VNJ7itEoGCxOm!x6++G#RDJ_6)qaq|%t!qb50lX1bVb?wM2MlqRH#uK%kv=*gs zve-k%{8y||gHf##!1*AI1tiT_?#C`?7;gsylH(Rn>8W75D8y7D6vJ&g zJ)4UwY2$AR&lEiA-~+gg5v5|WvreH&y>V?*6(WH_^2a2gpEcV1_wNu@ z)4VQG_{{etSiIEeA=LmBMjDoHt1WBsb+vlnz#)P5_wSMu=qa~|m|W5LnD53X3}EBD z*6L0!;B$Ao_X^PaiihcWaJ=+51|l4D{o;j=KZZVMBJJY{s)^)P;^Y;vN0$+tw6>djUXVPfM4qD~NQOf2Ce8w+F}hZ&ts!lL4}rp| z2}DfbhyasZNQ_r3B@}`Ri64SSvj(7lsEre$DAK#PH+aQs>1IHUba6Ww7p&%lx5F!e zgqkGwNhj4;&>^HJ*8aZ#2yK7ox3|CPJxQ#IlVBTIx6=Sb!?A0dso@tFdONJ&fLT_R z*t<=UFpVjGb64wo3gHJ=v?v?9%k-z5Q})!JASw?@0yur%pKl<*xRq8{H#a`OeIn4I zQ33c*Yeuy#fMWLhVdDx`9STtfng`eq8rIcE(N6w!FYj-(`+VK`oRtAMH8Evz+N@O% zo39@%Gs7mKB=x(87_^wR%zKHOlmiHk9)Ci5$P`a$$Y-Keo^V9{63)v&=Q@``7PW%2 z;meC!5Qs9+S4A&kQq>rcsa8mTJOoycw_)AT%B2vaXoUD0B4cTp!If7;C7J^7pap%v z=1zeQXxea90!T=g`>F;|-(Ru5^a{kU=Q@xxpYUoF$G!fH5;X$LO7~+2O*`v16UawnF$gOf?K>DM z=QUdio&%Q0Iy?It7FAWqha~j;DT&uV;jcgnU~7DwUI2MKJL~{Ok2!1k@xu%F=3idA zsy1JG85`jQ8WW)68{>3)AG^2agymMUeYzx;Qb-fEyIH;4yLV;Dj${MQ3)KTqV}f7( zMyGd|t}C460#6zr?HaVImxHqs(H6V5SJz+2TW#F|81=&gpG&V>{mRkZtq)J7dHZ3o zc?xyP^p0yhj6ru)*6Vnq)Bm{@Xoo&O`9A>yyZy~gVfgp&QR_83MNSD)FKS1-$>LRP z2B4{;H^jbsa!GNRHZt)jMK(e^5kuaYmO7qRMP;j6Zr)>Wtiwa#`#A3jw2ZS^@u=_u z&kkUDjdlU)b+Z)t;%NckZ@6SK3W;p6fp~qb67a}*P>^O_g|{{%A+SpU; z(=Y(4CD1|JCv)sbF3QF5=>;BA5A=Lsj4x|0$vGVzL&0PGH#_LN;H#Y){0%Y*^reyF zNe)6(N|JDb2fx=UNx4T7$oB}u>hlj+D6|+M*z=<^42SBo8eyr^I1(m^WSiS*(g|xI zq8Xo3=>67rE@WhIo$3s`fq{W6BOJX;$OM%`$eWrD6=b{v5IynDoz>C}Kkx`v_)usL z+N8{XzCt$4+~l4xQol+Ptko~oiuDMziJocboeHB1&j{Mi00!z>aVN>E^TtqG>W3R# zWSNN7WGe0ruwo%o9>K$wrevNBwKkj8-W?Irhs1(eSX>)lOt`=DNGwd3c~C?14Te4s zQ8yJfeBHKjUJKFYtM^6-Wk_IFl?GNPZJi5M<(3vAQ(dds03sJW^3(C|Ljq>S=0SZHlZuL1I8)&w}JIW8_fiKzVZRg#( zy|KD#irNZCst6dE-MQ*ozu3O@$sP6OlHJZ`x6sukHeazTMUI|dIeHYDkLSeV!|CY> zDm5w%ZrHt~4oKR$nSO3kyn#`rdsp zsM=$fqOf}WZ(b92>9yvX!~5>S_c&bfVQB6{3@Z;dUkS(vB&4E01GLm7FZ&07wM?a` zq}0Guhe(Wpb1j@2wTc0NJAv=506~jqQU>9`QSck1XiaKmlpNN9`@qRa3Ec%%)ms*& zN8F%lIrZnFtv2I=M-c9|hIf{-)|(xu&Q9C4?!uhw97oK2`NO}~V<0>hG1LOFarhnd z^5z#uEy|G@4?Vq3mwcV?PR?B*cA6u7HWOR8B8lZ`m!?7F7#o$6U0^m_o5YBo!>ZnH z00pLbmIobX&FXH1Qc407)RGvM6$Yx*3cE$Ywu-i zF~dF!g%Kz-!BTCm1b+64_u=;J>;Q;)^#jd5QqDJI@2Y8Fshs5O8zqV2w6Fu5a!Isf zK-9v_{CrCOTmv-4gi(!f`^p;6m*?k~_x9dZr{`nn4@fkZXY1Q_H?IwAl3xpmz(IhL zv$r>x)lA@vAi$LHw%$KDsCfJaM1YC2Zrhq$Tb*A6*J8W9;a`Av2A-$_Yrd$g^BlOW z;;aLpg4A^wjB(L1Tv$Fvi>HbcG~gXafKwiZY;<8|YiA~hYZMRQ*s`+J{cmUd?Q`d? z1e-PV_yqrZ)ey?pdjWegH``8Y@_K%N*tfT8)gaRMU(a<4$O*CyEM7m_Z~=B)@^v5g zTcFYa+?)e<9F}~W|0{&HUvCqJzYU|tB!rmP@1CCKDycD9f1n6wA@F#Eg^sAh?#d;W z0LDD^z{t@vx-BlLn)LLF_)d%-%cVek%2d5BOxK-nSpbI!+)8ADHw&q7b!8f()(V&?SHyv-=5V7+U}3&O!)cx zeT1f+W`9F*r= ztjQumKO` z&#@2%R2x-Qi9FArnxa!7nnt@e@Jkxl$SX=%*HfDbiB1qwt`&akRkJU%e-G7F6DX(s zv$X&fYorvT?Fvw>?>L^LCKEwWPVDHQE)~U?;X}r*@C^fkOpjasot`Qd`X#-1xBoX3 z&z?HzBw$(87Um>5QHNJKbE#ef20MTHoSgIMn5 zdCk!`o*oR(PiH1%XLNLQ%5Y}**X+r^__kUDq2;pm1Hdp?L>(A6d`F-k!<*pz)z%X0 zcKf$Iy-Ro66|9D3t2?+>;!=)4tjIDGm_Z8&)-+}1l;8@HO52pf(|iNY3m$_~VV2h{ zRoms+`}a@4cp7HJsH>;tpY>wp!6p1g-AjQ2fA1}Jnny|@RW z=>tQG3Lf#@nIm~~wmM8qTMd15`Q$)w;CpI%FN+J%pI{o;Ry^kT(nyt7d-p& z>Vv4GI$zlZ!0?o;Q!aAEvvFw(hOEzrX3#TtZhjHV!9-zt_1B{%!Rw zS@`ZF1GjQ~Pan_9n_L^_E4Ry1>)k^+6E9sUkDwvsops!nJlo7-{KslYC+IVSOiV2_ z#rP9!EJ?eELn2)m5eH640HFoa`K7_ru)0nVS0R+h>{v!72B_#%Y9U5EvP*lVB-Zbc zWR{ZIjgMRG*n}Ug4-YO-HWtVC)AcRzwTkuS&9K5mi>V0x?7;fP+Yd&c!b{lSX}#PI zRU^K;%R&-z<>4`+K9)=6dY5Cu6QV?bQTDrPX#h7u;!ve*O$c8a}KWDCyOQ(03^aRB%P*C}o5vjVg8-RMcG!n=39#G)N=^KS{6LPq3&2I}t^4?jAb{ zBdCrdvelVE{FtATu8}zSQn^o>aFb0@U7(O4@3U4^%Q*G7iKgCilRzsgy4yPQt0n^4 zSD;^qsOk8!BhIpQX?f8lA8!C6=**1rg6n|?3)a_r2JP}Jf{CP7RT~=b0i#)6WCOV= z6nf5TyX@3LKY-;_f-_ASV-&Y+bArve8#k=s==;i2OHT&%6B!7^FhNFFFG^rU? zzOx%wR<+vu9ktH~qQ#BYt9Q=2Z|m1O^GqpUyySVpsl~T(_~+W0$iuxfw{UUW<3XGL z`-eO|znNoAI|I4Gn*>rW3CDn>sODa!Ph9^@`F<5BC4;RTU(e}#cY6E1w7s{9&WQL% zo*jy=`*z6#9uy=-smdROi)_WvkBf{G%&Y&p6+j8WBx(AR_~gvC;GfHg4W+nOEH%ft`#w2CI<;dYRXS*af%u7S({5W_za7PVUQu4|1) zX6FyLn@j@|78$}&@_*z=rU1?)O&vJjHncqWxRdvk+RY3u;xFfuBW%FqQ2Sw%oP>i@ zP&{JJMG7wQJ3ETiivK-aaehv#Vo^_DkI4)OThF?Kl7`e<2QsCGWo_4f?!3nIy*W{i zo`O~}e8LI7eza=%(cbPjUev-bl`cW;wc&qrB21GCfC(ROC;ZKJfr3_LWo3yaDDU{b z(YC>_SfmP%k@GoF_shTbkp8ATvhMe8Qnz#&A%1lCQq@(* zzZNd>I6An3>O7Aqs+KRFc>CWUf0vwP;0Aq9C9AchV@ZZ_iT&itMqk?2h#U1m=}D_6 zexHiQ3U#N+3Ul0boBY=K1o&$E(jyJce@7rp-NNxGk1^B#DkCBdMohzbeoA^lg;|^= zrs<~yx=GA7d{L444&^YzTdtfmjiRweN$Rrka)eJ9VGQAw7f!Khcl}1eT1gcnK;FaG zw|aT9Ncmw|j&`s#d;eoYw4MVq=UW-Im$D@r%g;@XD48BNnnly7UGgfKe!u9{z? zl;yfoD?ueb=^S)?^R&n^vG+avpIBl`D}XARlgbLPcz8IeELp{>d@gT^O{ynEjzNC- zBV=gUXO^2$e}p!G5`3@1jMyfT+3yKF5t}z3g$aq(kxx&J##zYSP%B6a0avFNlFgLE&wjVzLbbq6h@5c4xI5Zpq z=rYR>m$rLne!0g1myk{EKQ#QV0hq5@vktGe=F05VHgH4PsEa}+B6I;aiH~NjaI`R^ z9SA@SWG=~wh8ckc2Eecbx6t`KPLR<2yn?>2E->5j^IJb^3_*m!QPEw`CdpWf){`tQ6`sO*#K%{cz=xXrG`hVkk>pz@BoHaeQ19u$B$`B-aC4!tD>N%OP zhR)5&0VkCx-VIk?qn=zd-gn&J^X6U7o}6V-6GCy`R9+H-aH|4`gpei5QKJKh&)eg` zk@?8b_D)odLn|y|LnAKa*FDi)p4S_nYkG`xD|^xh)Bq3h z5&jjwe9L?5l_soDW^v`41m(GI{&E$9P0V%gTATME_bhL$ktn?60gZ$Y+mHQ#Ut)J@ z%L|I-K0*UvpTKBhNT9`oRkV0$aKkuH=gRB*;vI_%SFq5ZY@AcUr)|LyBqP#KtlN)v z4ViOxtd%*=xDX^sAu6Bve!64QEsBl`hB}M)#-#Zebrz)i>agDw6|zJs_Eqf* ztFNeNU#rk=YAioS%ADTj;>m7%nwR47y)+Qj)9@d8i!P{DOyRkjQZU-Q*9@M4&;Dtl zQ$t+2qYg*!ChjLqqq7qOHz0qug_?J=Ue% zP6#8C(o(0T>BFhzteIER$j|o9u(tky`Tkiep-^u5tW(q4PcHWK7tm&A*r~rU)}**G z{L|-+6&w{fyRQ|Gmae$17(M@nAY!;swN@0dfdj?g7t<5LzBg65DBeXDlbVM>YEh4e zy~%r+1~irbs|S*ie<35!b#En8;!AIse^s0O#lQBJX5Vh0#+w6y4#_IHTRUEFZn*`{ zQjOYxxR5ROYYlTu@%{bhWAEeQ6|~ql@vmI@wX2!->Vd|?#s~A!>p7s|uzvk%?w?pH zLa1vh52?!!7vebnK^@oyN`nBEl>jmC<1U=KnfDnf5LnD=rnz5cOV3f?M+z zQSQ%eWGNTPln9vlMhX=fO4w+GHr6}#>9Ik+8`hyC03^wtE9-Jbd2TGsFr7^lfuIW= zuOZ+YcbY&0SlwX}89QULd%3a5g^t%gr5J*JX@2~Uf|yP?3gRzzCJKdUJSl|O&|5%7 zU11L!xhO86gg`22I)wmIfQBDZ0BRoubfa>C*X6l+vij)1O}n@5U81$a`t7LZa8I$2 z5re36ae_!YH8n2w-~P%rc(0iDs5teWzAYN}v`U3Nvh}kk7#O$EM!oPB6cHh$?)aL| z|JI%3?F5-$EHBX#N=hUX2sh}tXQVy^6o9u)_X{@=JZ^@E9Fq4?OyVr{g^BaVWSyoj z7aYxsC|Do9lb0S0B5CAFi;WGJiF;Zry`J-{Thm}ptunEr@9|DHkCoM)aTP!=Rs5B4 zP{8KPc5nrfbWv2+Ms$#hv!*$T%2oNaNML@6r>!B9-AzJGkFS6ab}=xU`sOCeU#bkh z?GVzDqOCLOb8Qv@lf=Xe#F^9pB3-?h$oXXt`0Y2o8~rsGmh)Sm1}&=`Zi!73n6VTo z)cs_1dbB1%d*qaKRAgski2cT-ldGH8f!0R@PiB{%>Acj}WI z2@0}a==HSm&e*~j`@5CS2pK?0l)Ls!Ol%=hx19AaRHWsWz%^{3=h0?P8wD;VF3+z3 zZ%pqu!Py<&G_PxCkH36^Tw;mKan5!pfREB~yxsd+ccsx6P@+avlvi`MuDPxK(?B<* zaG@O9-lm!|YhTyXUt3-8=xA<+pj%g7``^|o@QDQu;bE2^VuGTpb?0V(CT1j{BS{ay zuM$w;KiO(t7F?YwT{A}Yap5iqZHi~+V8N?!sa-h&^2;lYS^~AU+T%|X$Ol82QL=&HE`dd) zyrNHq(FxfG*Q`JRT$d)5G{x&IKqjw@&w}u}q6H66N&%2*;dn1mDefCTsbc-TL+1Mu zTv^j;m*af!L2co(^I^0T=xYMA(Y?LTFC2iaE1|q>>Gz6V4en@D{$jo1s4U`_>M2@Z z`IEmy6)H^B4lDH}{1k2n_9VV1_bCi+rff%#uX&(uPZ1N}0tjtQnDK_eA|OOcZ$+c3 zDU0npnm5=WurCS!U{_GOqe$7ZSXN_V`)$slYc~R!KwGG1qR3E8(k+n z-bROx++Uidz&LObi1#G~7^SV0IaZ)2sZtj&Eq#; zYM!(U&YhBP>({p3fibcG;>Z!%;Ybij!GcFX-#~ZRCXJDo?117-QoWoliYfl))<<;s zv+sYK_c-1N|G!oZ2lpKn6@#VWf`A+r00zteYo~i_HEo18<3Q;6*bBu_dJ9Hn7x*m9 zqUBU`83O5|OnN?hVuRfp2>tk&ol>bO#Vln#2kAV&k8bgFET(&d8V+90#ER-uLrdlB zT}wRAH-8xtO%M}!JNA<(rU9KhqJ5Gi{jk*+ivF*oYH{bXp=vojN)XL zZc@|nk|L>kY}wg=_aELzi$4{)BY`Z?n}4&T1LsuGrb6V6QIe7#LrL}{aYziWkG`JX z{H4vp)w;JV8sU~fHNd-tbPi*R2Ek$IfD*cfELB|`7%zU3fg(gV)PwTd+;xR%qYEgV%z*jKxtg;rlET36;@qb+N#>HW_ey?$+_h6mzJGuCujc*(=-?zY z+iHXSTrVSe{r?W&O9U)Bp(U(Ayvum?aI+n^0!*ma z2B7udd&hofSFBVuz%?>EfBhWM(diLC{AEu^(yXz+rn2S z=BkEFP*$LhD&-b#5IaZZd$aX2rzo@3cub5~I-BZ-@%>XmI4dp40WlEZ{FQ}=l#vu$ znPFM!p9LcqH~5+rhZQvzC5knq@FO^ZGQtsxUUKS^QdiE(g@+4hUW`Fd)R52&V&{&M z;BO)@)Tkj49#R3T60yx#EL{+002u{HTwKjpZ*3v*ia9b4hDU(bx+?8 z;S}JMda4GBWF&N9$TXYB5ICR@+4tr--Ft?qIfhD+1IC6lJHKXY!cj*6DXwLCdIi$MAr)PmreFPife20@qKQ1$Pnc(08Om^@golqEZhcWRT&tG zF7Nz`1c&Ki65ITS#0oa%awn36hP0}g8jY)TmANQ%~_Q!4K`9x^Coa*UV$Q}=F~prL*;XlZLv ze&@q;AaXO7L`5N^a;j3A_(V_9H|-gV-A5e5C{&YFLjDm{Oq+myXUF z4G9VDEdFkr{zbcqcwe=H*{;AQ%VfN#iQHlsZ5&E}7|UKZO>qEyDIeRlAvWu8>dDd+ zfVBhSM<<3515E-PYJxfiLIRR4(|sDuJ-*xlN=$abikOg@GiwutE+Z)>ICcDapfuH2 zwMrpbIYxl420vI1bKdAXT03gxnD+DM&XFsSYmP^&3)998ENNK4N!5AeX`hyD_?t>5 z3!fdYX%$TCC`Pf24Zle1e2``Dbl1J!{_?c#*7UeAAy~}Efk*b`>P1tH{#rP0Q1UNV zv)yE%{6%1_!n_8YN18UCPd!$jFJ|OBAI_vlP{gc$6=fmUk>9bt`@6hQ^KV}EcfLQ# zy(qpGWdBvT>qM5CSqr0L2LVjrNY_HP8sR)tF)L80RPR4}l~s1GEE+=#i`(vMMV9EyYK# z?g2a5tjZ)VtFxS?$`SSJ4{z9CF|m^^d>?Hl6jV?%PZk(}8leh1V~XPRvbySG1U+he z*9uD3kbBgl=tmc&fWKglCXmFXL#H4JNv1YO7sj;! z-NG=elN;Bhne8}ckAri>Zd=V|cI&pojVu7DUcpnrj4JK~Pm^t>*UN^yx3O`QA#+v@ zYj$%wg#|@XN(>rb4Zi5$`0rYL?bKr3w>tlz2{)d}B_E&H2I;SVH)tf>3L?-Tz`+-Df^X&aHkKkhO4iAnWUqC5-{@==(Ks( z;%95czaYL%GCH(*szH9L<|+D_dN}$jX#QErr3CTAGV|-1|VO+g!NTwk+Yq)%Byyh-B?F(>3ZVotV|g$JK6S5Ct?@8cInwG?*kZNkh|9Lsc& zVUZyAN_jqr2 z%0Z~ekF6xYXCIaLNzuV!sr;eI32_mK7VW z7BKCLx=|u4f{K8z!RGzbBX?HI^3NJP6_g@kVIvd3*5BJ3dk)WTPddYAP4fdeW2l|l zE^%aM3!V-C_#(8jn0zRETLX=c-J-I&O6hB`VGHz2V$zuz3^I|-6v5bWc)oi{(ipf&@SA3i37)V0PRX-0jnypjE*& z%r*C1k;4fQ}IWq`BGxY3<7O!krhVd3T={Y?Nw z70*y7%o$%a!ZAJ;Eg4TNCNh_+8z=CrBRV)FW&_6 zKLFKzb9FpbEsWj#^g`B~Y&Ng>;pdK#TY=uwWO9e!Zc0tgP?dbUF?=Yv{WFH2_M-<5 zp9#am&AT+0p=F%y#qhSura|TsDTAgnQ0OnscVwcP@1A;C7Hs%3Kk&}NW-6Gbeoxh( z{?XSz?7CJ~xZ-&`A5wPjznpLy+$2ZG@zgpxQ+RiE*VSMuFrmJmq|Vt*aM0n&-j?Z1 z*uA5r`E$g{x0$Gd!9xWb2~@_l1|amSUU*Hz6TBfs;vHMegFM)3Oq zsx$d&JXX71@UsB3&Z1!OYb3=DIXWIRK|FM7_L9&OGiQ9BxRSm%^>I1&XXA92q!lRoBp&FJ zxvs^A3(%||$Mt&D*}Y&Lze^Z_cqT>Z(YdLnbQU129juuv617lc2Mg!%X2_j2W^dy@Uz(^<3iJ0x11rh0-gCL+3b0OjJ1;O$9cA1T3r2rcjA>?3P-I$L z8Ek_(lOzcfs3isKEw-+I;E4`G1d=rT#!Ue4>R8|!D*V+AU5wCFRN=%rhg73j;i@$A*8inygh6bned*eyQv@FIn$?@I4 z>d)6(%Xm2r)?q&pK{`Rh4>4Oy$YQAI-xzJt+M^J!t5C~CMlYvP*}J~csuB&1(Z8Zk zXvz6gQIf1g)(C_|yenPR-;T)`+%LD(I&Y{~3P4`;<~@n2%zVhU)ePZI+1qrEe(G0q zCw@4bQJfgGj0#TKizm{%*)r5<{c*EUa@phlV%_X;`**L@pz z5j}tPbJcQZ@mW`B*fB9v1$>hVR5cadrSVs6UOWz*3bDIomd47Dold5{p*J$A9Gf z)l4dNhWG#nt|wfR5m z9lbiLz?L0L1b^G#GHX%`ndJC+ba=E|;(fFCE^yUNu~Zoer9xWKV4N`;K|(|huBnE@`iFqVfzol2lkcjAen?Iy6%UaO@*!qv!fD8=JxSYFY0PwS5&9Pm;%K8fj zvj>erFt?`BZ+wZw$3?}^&VzYGmD%~m=32-6(9FxSKPalWrVVhD#eEKSH36!T2mczh zsyXysA=?^^dK)Ydh;5TL{?9>2j!M!l+K{}hR+W5*REOb01BY6Sr&5*oPm?NbhSd1K z{z_Dm+LWX5HNO4)VQ9-4P0Pa7VGc(@@Fg9RWITcu)hZL$Sct?lK{7RcyqFzRaSRbG zp;(ms%6%n(&E4c?+RS4^U&i(in){wlY zEr!thjF<3g@|Te!Aegolm+3L9&pD1L_02zW#10i|RJ~YL%T$@KqE2il=pmLa@JEh5 z302;@kkJ-Gx!hZw8Kin?#?dhtF*~fl%u9hiGu3bA*8&Gly{x}y-MpaMzL@*D3kl!c z9?3CAYWI`a=MLsCg`Z6IFCNUzFKF~HsEA5a&l=(0+dJK3Le^o9kLrJoJXuVqx<0)8 z5p0i_YYu-XA}n)dn4ZP1Sn~BroL(9lb(~jD)kH<0p#_03LD+Q^AUqg~`EWc^C5a#p}6z|N&eJX*OV_~)08LLoC1cDAac5Y0_tUkpXr3}lyFY?0rV1w6F zaV(vhCiJs+b8~;c+;+u~G@oS#r@t~6Odm(TmmPMRcKW5a-2eLD8UQo?r{8Wl|4H`p z^yX&qx;^L>tPjeS<+@TqSzP2~INs}EmFeK_p5#0~hDGu;$q_?yWw2XfIe!R*>nVw} z=K+R3W!X)#(sTr#qJ;!hmU^*jzD2=m3HT}>UbYf1Y&n=x6oRRtAvjv1g7tMom&}TtojBNz|gKj_x%&AxNE+0Cv&+7BIB(6 zrO-$ER+ojlr1b@MA?&mttTBzAywp*WnXJx@bRY_mOlU`mFgwSAv=osp7?N)yTm+&t zK!6#=c!d?wvZuc)G$B=dC_ykG_E76^1L6ZT3Vir!dZV1ML6mju^PU4ly5504Ohbzg ztwhJ2CnM?&m4_!r*V4#svyONB_pegs9HwKBPnJE*uFbK%%XRS;YA*ffvF=Z2I7%_N zgEq}uNJ}r(Xd5QI?jkxT&HkvS5dCda>5k9<KL=c`7>-Lt0 zKwO0DhmbruO*NUvQKa4)t~nzqdU}7&yg&rO9EWWF+f86}G{`Q%(ORsD`K@kLGHOxH z1bc>;%wZ=4W`y6GO^wQ`PbD@5oQ#cExDF`1cwa6Lvs7RPiJ?-WVi5?D$JQd@nt6IH zzrRmbiu{;${CxA+O1=(I)PVH(&EQ}hc{pE{!CY15WLS2+5WN_3!Wa3tOd7_4hH(@K zP_WI6&4?Rh^i@Nuu{4?iQri??;?B+LZ=denVP_{N4t!*)+v*oo%?hc#n+9$Sm!rHn zatMGS^Nm&$AdmvDjUzYKff7u58cGUAOHjI|l$L|>e4rQ`3;600EChp!&?yO9EE9@w z|2d1y+m$m2Oa38`;gCG)@d&)(p4@pvc`YUC7>&HpH>($jA6nG}#T>HcbQ}XYA!;)DDBZt9<90lqED)U@f zF$dh2mh3>?^aV(0-x|yiudpKS-a@-i&_5^1;@e679Z~jr!i2GG+3syHf0gnGPigXz z%l`MnugRbkVs=B`*}KxgOc*#<~T`k`d7rW%gZ94=U(u-7E{nn+zaa=aE`z;?ebL zjNc8NJ%OF1!ES08eZI6bb~Mm)l5^H@bD1TSiQeVm?*zXnS|f?V+u`VxkKR>s@bRw| z_%@?sTO*X-W##V!E~}NebxH)JpFH~`E8ufBsP!0nizWJNP9N}-odt5_!XFi>qDoAe zy5Ck=PyaB~a+&acwHw{QrnRg1{)c6Wu%KoqW1|$akmV8@G|6-7$0{UDAz|G}0g)A|NeY(hc|h?p^o!17^*7pEsU!&fdQbiR3); zXdkx#V4t9LI1fs~57h~Q90{DDRsJIkewZ$!M0zG87o3SeBf*3lb1u zzz~8!w1d(G1sqULqY1?9M2NCfN>3mNY$dHHt|i8wFKtFkRFEi|E>nh9IF`Z9!2wQ; z!<8Oq$Ch3w5dS)+0r5Z17;#Xjw)Ysv7LX&4GBNXYozroy&>q>Oh#5D+!;XBN^j)B7mdAJavV3R`9 zcZigJ|LH!hyG3eF9UTCxo}=UGT8D`YmC1wvUnouJ0iVISI6@Eqbv;I^Izl0s%9Zrv zc$q(0co6NodX@Q+@-N|}G)5yp3Mg>K1B!lGF>&-h4vsfkIlOd6{It5F1BGpYmGh%E z7z|P~hUU^GeiB1TB%GOfwZ0R?7G0?D@5{%H6cn6EuD`s!2dNkk$$(-5lL#)uvMvl>S&njGoxw zrPuB{JniW3_6@o;M;lF+vX^^p8Cif$(5W!?x&7!OEI^$1fk8N|qQYp0$$gA)W|OOM zOv>C6A)CX3`GZ7?aa=i1a!yo{UYSJm*`lp?q z9cP#i4Hzf5yuUgGjk(5ahF@2RoX ztM^!hq2PK3TuNs8!E6LkZbR#i2b(5A^7wjd=AbF>6q@2*TxV36f+r#5%llMJU1`Ta(V&e6cA8b;^G8T;1%1vv?cXL08v>`8|QZIewdW5p%`uL zk5|E2RdXM+Xqc`tk!6YbUEV2H@*D(ma&_HGb|I;o7jmDlCN`NWOHWdal{SBaT`)pM z-uFx+F^UJ``Z9wKFGKY};_FtHtE&%MOpF*!YhdnTod5ZCR0m&}@A>hkhz8gGLo!ok zU_yiM&C?AFV(8&9T_v+Qwy7er)jmN=gw?X<$SWw5fzi(Feo=(le4%>m?I!`M=(+-46oj0K(U<>Tftw`-DNVPId$1>1nSZ}#G^LWw}B`s*e8QHq!_;Rja#! z^U3nv>f~UyN>5&@A`2IaAr)8TmDN>MWf%_J=)*7h?!&BwaUaiFtCjMBaF9{UvXF=f z^B0LwXv`-9_fh-XS(~4{x`Jf}mL7vZnDX)Q@xGf*wT|DB=Z7Ug7n3L-*Lsy!`**lv zAM>%w>#j&zp(=ouepwaGT0Z=ri)HNmm!e!iE{KIzmscvBjduJe}H%W7;bOD@n8oMtamp zPQFUTkZsk8gp2%9%OYt}7;>ApHVhd7F&r$8ADM~Fu>)BKf0t8=?@Q+l2Lt%Ew~|n3 z^+s}rKBD;wOM`s|6?FHHdya+Il0(aAnBgC{S07Nt1(*vqDx#TRSp^Bh=0Gvcsm-xt z#n3va{IWO7hw+*sSem{~@zxoG8tPa`2E{9gbt>L0EfwtPg*fZ;sRtA8!0(E{B2_b? zEr<%MAvWl+X8glW_D~8}{oVD=1K^N%9xk2T2bwQUIzUyIHn20|87;$t=MLsBZD-zDtYRw`^Ou8(IdSDBLTlLtB(tRAui#r|`)19b)cfo;8zh4=Ih;O8B?i!4 zq8}A+zCQR6s-VJs_lsDWi;yBHkFo`axy&wX_R9AVjD!vQ$6zhaIx- z`$L@0jK?2)v5`Rxftupj(xSfg&KAx1Qn1V>L?-XEsN6+Cy}p@syf7kR1@zF%#J1)t zbIbW?#$s3GoU07mO1|vYB$PkKa{&`DqOBv>of_St-v{H_+`z_YE+1=Vc>WBcL!{yv zd>@&fRJf;&P95HpbZ`?1Pe?AxzBlH_HeGI^;#0s!Jo%O7O!n!gGv;4ovR0AfSNbtj z$QD-1uCk>nNe2i`Gto+UV9t^h+=!5g>2Duwhohv`FcejUU`G}{X3Q2bp=?#pnOr{p zsLUU|$K9K)%u&*5i?KPlh&Usq-Oci4vCS>3^XrdGzNs>Sl$)UG#-hbe8P zjxiOQ^3x3Qf%emY+mkN=oiDfhcXyl=XcmKNFV9aA*AEtCF0)0X!c3vR`{Dc_3E02t zDGiB4Gku*KEw|w&8LGEm{y*g&RqE!PI5fDYjnSJ4-neNoZOcVZh~z?UNwXG?s}WTv z`pMa&7-Yia8lY#n<&o~l=9s=SLhbgx@>w49E8{$@u7>!&@fTcYnW3K{5j_%tSVsEO z;ulZ?q+n?x6fF66)y=Iyun5BvPd%@mGSIUoN?GdrA1%FqUkuOj`O^lXz~lKFq@Yft zqi6j$Y*jcGq~H3TsY09WHC*c!?Fcpmd2qNtsj^tZtu4@|4rz$oK>SUA3%3gG7R?|J zU4Kv@cU7!E*E`m~5!v&u!=vUpbSvj&FGM`_OUo+wDU@h={Br&Uv-Pk6z)E_oG4iPZ zCYMjETKkf)s*=<=9YW8gGE#{#Q8)Y1O}x!{Dg}NT(@$SW4{49lET8JYL{2m1x~tqf z#%v=GPst~#L^G(Fx24ntMC4K|C9kSC%Ci5;|NH)3nY+Wd?SSNiVJWg;h2COfl8??> zp~<2Ygdqr1t7QH2kmKx}>JNj!a`ld}O6yEOoF!7M%>4DorFt)I)pkJPL9FSb2@KiV z#e-7bW#B$KK)0dqO1JCqJ;d@b3;dluL8rPCoknX-NA~Sr5u|%~J0st;`9<~!JVO?K zWoz&d0yo^WR6s=Uaj@n_w?rLD*XFXEz>q|zLbYaP3qFigQvMTwHR>lreIF z_Pk)4ur~%{)u@(#dayu^}VrOcX-DqKrVp)b{M-)W~nnJelyLs=!9|P`MJIIlf1*Ha3 z-xA>$WD>9qRUYWVKb3L&eCXQUS86P3;|^ff7a{Vz{}iEAI&0m%hA;gpfr0`kO?lyR zE~5hYlz2dLd`aY|G-4(H5H!cRKg&#C;7atG@pHTloY6{WW`a*vq;?ctppIl`F*4L!}(B^psQ{oiCE07>MwMQGXk3Dk)Ep zZz~Q*Pe9=+q(oQ!p@tp|27@Dc!dx{+ViPLu>393Fdo47E3QwGGe^aN>E^M}}O;?{6 zjy;tBN&nfsx$uwl`{QcpBZ|YAMfJBvZyHru&EL4Tv{A;yh?qL*G$d{tpMKJCW1&~# z*z72q@pWcjczR@}^Mp`z6G8D1*@i@X#$GN=9+BkL(tR2UH@C0erR+NA!Lt?V-8pCQ zEq9E@nN23!HM+>K6tR@#?45sL?1y=S-k9aK;5Cr5xkk)WmH9R;+KurXm2Y9=Vdv~C z9U(Rz)eg}wOi^e?6zZsvG+lH2^5iH^Jg}-L>A2Eqn60A-saD!)AnsGN^*Ng*IyJO~ z7Vc@)mqjU!VS{V@Ozv1Efcu*(bF~;qHf1)+YkiN~cD`3C-JKM+jZV5x z=ZV95Q4ekP;|x{$@=kGYIA${#bak)SMeom51Vuz1#O58*;R$ljjhHXJP?l_NC&Z0F z0h2#=M=@pfDrlrxI(bo;m@~fyuZ9H%8T>HEg9tD<@B+(nLXc(K%t0AF>HgxDRjCUA zds>9db%OIXrXjAfe^4a6~_;|(g-|YAy(+PR?QK2v}WjzQ^z!G8kQ8bbOPHI73K$Hlt$B5mb zdkw)Gl^~C!C&w>rjH(5pP*cWlG014zNBa)G%0%%bOIq@)lq`;}=N(%5Kp=AUB)}A@ORI8Bk>_u7}z!UQD{C$0##j>dVMdxiLWfutZ@XL4?egI z7{o*eGC{&fujo_2u_6s zfGhZ@!oj3(Kg^}@8k#zu{l1k`Hs^VZJ|Nm#Z~tp~yz*gzSeESzvG{B=Jl!>ol)+Kg z1WnXFxYeT0xnio7$ID{w^*#$k<+Z>!`EZ0GqRdOgjU)O9wMZ1A540dBwydJe)Nk0s ze;?a=Gm?*kABo`viO**w*4$0A;7*MsSn^`2x1C6E4iH05#Tb?R9d zo=N}e`aR(KN3JIF$l~M5*ZAmUF7B`VK|`RcCFX|Kg@IPGJR{<93PB-r`(=j~-3$x- z8hIz}3+}I!XC^QBc!#8e7Z?6Q!13Bn`-2Zzv7vsDGfYYd z3mchBkf4DrEM;i=0hM@xcZ<$4PYTvgsoK%_;Qs+Djneb@pbfM=O4A?x6q8W*7FkJyLxJ(YoI6|L)Tf?pk?ueIYd8e zP)!hPsW8bIff{|+w(+6h{*Z`q_H_;(qDstMbG>yaxAcxQIyziD6eJ-FhdNUNSGkJxawsa4Xdsa0{DN9ZQ{mOu=f>_2 zHzaF2pob;z*QaJ6WlPCalbU^DOZi9{ZBj!|S67LN3_{S{%<&p4j;8;jkc&1SNIF_z zbncqV$G~RZ!}JpbvL2)AZq)qIe3qNT|*4L&U zi~Qy2J&s$G<=*(+F<*_K474VxP0Y15NM7tZ$aJT9qLx%uJZ+bMNzs>frwuOuw*Cmj zr3Dt&h$CW~@Ni;TZj5E~V?}{w@zD$H-{_-bf=X11xwd~RzbV{BqxlL44}wLy0$#}1 zji~AM-@pFBrQT1O&3wStM^{L^zq2ECm$%q2q}&mxTXZfLB>29RDm%?gQ;Y*51JJMH!5Z&u~7>P+i*6CHU4b&_rR!(c3^?UpJ+|WG>H(H z3YyKAeZxrrERC6jq&n7y4W>O&3qCz!OkVWlXKPDfj&o1W*2G?2{B)SP(ax>u(i1pu zWn?*n2ex*I1z3>a-j$V{?e}P37|B5Bg+xj7I@PTx<#e?ie2H)#&gj@7mSMUyUGaDl zT(0l)0c>9yoqQGq6n%{DuYTrQG~}|bf86?{-fe#1Q9eV&AF5G5Z=TvL5)Odnr?kTT zF(O>*#W0k3G&Nu#r-sEqIVPj1SGEmdnN(}yb7klYs4xCPmS4G=Mfb%P+z;IsZaQtA z-H4%uJw~l26Bp?YY2`-$vh6z(R++P4?&T^PShV@CYh5CavM20Ed+|ZK!LxQ0rn5%o zXhMPdx1AozLc@vw)^D&LsHv3 z(vptq%F>Yc6mtVb!zp)?+)v*&Oso&yn6T$XV+#f3>~gRWonj}un4`n^QGG&`7K z7Y4%#1OHrPFV9FmpB>+KE1aU4V90c;M<%eT>jHsL!(Htvt3!GZJlc6pETc)pMLR%L z%@eso9J%uz^r1$rt#F22GE;%usKfiNm*zFqCehBb$@=IGQK)L&rq?8emcB9!7E*CDZ1x=$hm^g z4VNXZXA_J>fHB)qKve37*#zc>6WSy(HTo3sLn#q}*ZjX=&|To{_k#PvnjLz_bNTS( zKMyocOe)#z(fL32*7c~=iOw1RE)*O@0O6JStO2|#!X~(tUY8$xXhQf8{#VOMM>AxM z)aJUwp2DwkA9Y=^TLNv^4%qG+F?KfIE&J!%I9Iv)7@>-i!i3((hKpf49Faf~>y4&p z7(t@w-fRT6)=w_+DdkcHIotRaulXDFgiHRJw9|DGM`?3?TD{)H#~uQ$%k+ma<}ck;*vK8(D&7^ zLT1&rhPJYB30{k$^XjMb>Q0V@IMge7&?7ofwuNuS9(OQK{5l+_SzC~Wd%_tAZcC)ohTx+D!kq%@t#aDA<*ssJP4 z0Ku#Z5MLo?To6w7Mf*`;I>j02E{W8jUsD{sCE_&q^m^=CCOp=yKgrdF! z4gxjho>xIidBWu#p&G4qu;(Tvr2V85bp5y$lP{pWld6~kE2dXZ9`BoZX8NJJvaq`= z0du`YezmQ^B*J5Hp~meX?%=~FYg8mE-bK`J$X_1Uf!05za zXTLY~{Q7|wb&(L$(Bm5Xkv`8d-Qo=Kd?m!xN$Flc(nRHCrM%e%YSDZ!(yu?tsm2PR z7zQ1vdMX^0AH(QMKEwk;87TaOA6E~mOQ{nQYC*gw7R3ge=ruvV?PfE?f%q*V-TJV< z?pRs{DSwO6R!l-qRBl+nKt~&I0=6DUm3~T^E_R0=8iQ}=@czRV6~d^XGyg?-)i$yE zj2vbrvAAi>SLZi|iZh|?yHn}Tubx3~MkQb=c!G%8a+s3jL6hcLOE^Qs3x^&}Hm(y} zo}!V5^Z#+-0m8C3(7fc2`wXnLfbNx~VRT4+Bn-~!c-nTl`LyBW`N6k`I#bpN2weWc z1i`p?{`Y6jtSICd~*CnS}Gm-^0XFk`0#wZ+yV$dmyh`< zu_aUkKGD!bQ5k{95;6onE~f_TMs2LhenTviV5U^YuQkswu@I*bY#%j~7AS2#?%1g9;$MeBNq)f|QbF3LAezZr^t)Q!2@sYLjt$S82la|Q8)_{P;7{iKX z{HSe*+PK6-LkYw1xunI1DP=s1Sa86U&K6Y2FexKrGpdCATzvvCCnjn*OIh;Up}FQp zo6IRtxC;J2Q8pZ%vEuW4qu&ngTW4jh9h#M|D_xKF-S!^*Tb5(3r;uMz!W+OLW`FyM z%P^|d)_5qhzhyc^krf+U<<9M)a91wL=rM9q!Z0X%v{T8;4!>{@{q|S^^5X}8=f)vH zP?<`6=iSN#1=?AuL5i&ffuPbp=a$v~jHBN%0lkyRoRTW6BmPekITNO;SELPZMz7v=T99w{Gt*UA#2l^lcAZ=OlWUFXe$RKu}1Th@|n`N^vwKlnrEfHUozAi144POb@b;MxO2sSTj!xFE_5s&F%9Pu)k+# zoW=d}uu8Bv>G_88aFE5X6^E9y_pMoDK-eX zY|+^+L>!%%8Vbmr6?Wh@0cx5!oLb%rl5@y^$Fj9p5zt4`vxB%njG=0?_ogNU?;f&? zk>QjHY7@IO1sC|+a6yonrZ81XCOOGDI!L7x`Fx6(bBH6(&yHbmK4He&l^XoMphJY$ z{=()#(Bz@??R*S(T|9{y>kUGPUQ;M{&kO)LlX ztJhsiVeGzrRJCgTbsYBI^A`^fjw9cj*bTP#{``-C-BBm}d_3#jsG)~GJyc+~Mwb!a z;{&-;X)>uRWSZ+6bs;S;eIcNlCyW2cyS_)sTOsyztMCx_x;_5v`dahi4zMlC2er?-qJY@-D}7*@OWO-jQg8G%nsG9 zp&>XQ(ySm+sCB*C! z&wydIYkFZ5_io_zP&KPcOd_~-{P4=VePy-N@9Ob(jzS6GB4>g%SXxVdG%?@n^`Hp*;7w0YekC9K9wz(I_ zHp690Q1uXp>%ZCDVk#O|+9JI1zcfB>w<##dg@t_iKL{;IR{$S0q|FMU<&@D9>5%l-A@sGzcT6-8-UvpZx9S=Y z@N%*OIPh-}Yg9gRu-B&}Zx#~?aYK9i=|XQCocYOkt}`>L`NGiDDxM|R1J9w?8D~36*4#+*G2a zbfO>{Q7E#8_sGJQyv0ZLEW!`dw5q4L-$QebXMYNRd14o+(B|$kmU^@E7BgEb|JiIu z1%z%qmD#0=QU{Ey^Zf7k+fTdHv^f0+%wh_ZBKoFnxR{XIbgB)yytj zI__CD`rNKRa!Wa5vBg7aeaqc&wTUD50Jt-73Sg|ygtgZ!+j*oqOU2lQioxzTz5$2o zIhVwzsQon(zQ%}JsvMHj!`y86nLh{l?QtomA$d3JEjE(@zw?&`;_exJGf1%Z1z7sZpN>83OSE{aZetSdb;Fkrc-|oZX-4kg=nTOH9Vyd5du_sj8ONSX*b7N1YK$4fi|Mi zJl*w&(`mCMi-v}hxDwT$e95jW;cYA2BahJM?1J|h_t*hmS)J}@x-Uvia%EfRrbMSN z2jwH;8|T%eibC54t0&+cXXX13(|=lgBm2J0PIudEOI!OI8;BS0MT@sY;T&Eq`Sc=z zT&4Q;>f*-oFT|=nmxE>_rYFrz7BvS_QER7<6C8; z!(Qenvq$N2aMnK!(7UtF>WSUUPh@zh^L>H=3Az8pbw2qU&c2f0Yk~wXD!j0UkaU;I zrGZLGUmq%$5XwI4b|o|R`-dk!^bU@RW=6z*nvhTxtn_JHbvQXa?Or>5HMCo*^eR3+ zkEe722m&G>`s`?6$*Q}LXH>{TN*SJM>Pyw5XG=6G-qGGZ8|%1y4LmY{qX+0&x*OIY zLQ(lY>c1HesX*o>Eaz;u89B2HG6>aqJ@|*DSaVISIMahr5AXNll%=SVVWRapL;ATq zbP=5&v4AirElB}Rn}?ugHmkZk&`jH(*kF_pn0Z3dl$#3Y$OloQqcol7Y4f9w^+3Vm zeRyFQVD0KIm}vjPPl=`UCxd?C@i)jIFl)}R!0s6D^N1n4b0}0+BGldXmT7q7)YiZWHFPvPLAm>STkz;94TAGcHfL@ARsyR zc#pFO_^yDO<@5n~(Z_6A;V*2J7Fa6)O#AoqO+d|(GLa!_1m(+Hk?Sf-b!089X!Kf+ z?hc4Gxl{CY+~h|>NQmnEor4%JGj#YbT+#Vz(aR6RoNykI#V84cLC2wX@5X*G0P}`G z62XN@2jF1YQcY6njiCf3eO*q0kBl{{P0F@?UKQLA_h!&9&K2hr{->nzsN#G(3}VpXDD*q>wmJGjA=5C5 zB-yRruafch)d(!`j&8*;?FaT6TV6L^XBm@gbE;gUodPXb5;00fu{7wl3fXSSY8^`x z4@q^KLyP`9s$A!MX|~jcfub+$f6(K<%%$o$9yD17T?&>Ow0u1jw7{j>OSWm8rk@W{ ze=t0!_aOf-E}m-e7Kj#k{MYwNV7L4Esuo%p^aW}nWXqAO<<+NMxy|z)OV#S;IN0Xy ztq6P7optPYTeh_I8N|hkBrM+j2ZML@ip{VZ0CE8Q3b0AtkK61o7a}iTvCOG6>~Y%Q z@0YPIM84sii_&6|4E|co7TLfq#NW9y$K8N>K1R_&Kkdj-n#alVn8uVA1OSMxcO`&R z?&WqXFHcw~TQQPtvNF_lJTnUEhkLopGUzGRVVWK5J;i%x`-J|wit{UCsR zy(kD~%J(^2u&||1W{!hGk#}pxhm$f$Y*4MAz$mz4;siT19C%SX)I@+E2i6Ns%0QDs zT^FT6FXO`g3U>-0EA+2pV3UFPL9E8pdS&Mi&VKT0wba;Z=gGY;U0nNF_TqgZII%bo zL&MT-qAL$O7CgY>9P}p^_I;Fw1>9fcNyIQ(Ug1de11Kt~7A4?Spf3}1w)5YTs-6L2 zbk+cSI|R5Uw#Iq$432N))P}y>D249MKOdd{nN7wO9IQ^98k}LPxfpPj#do6Q>RGH)>tfoN!=YTc<&{Ca=zrewQX{jNCPedS=b zbSN+2dHebK*ro}iU_{%78Z7MT)i>|!qCF4QgVAixf!VX4^e0JC+AhI;pRr~gPqmck?9P)TDT)T581 z3_)db=IlwOIwNg6|8lnZ-a7{9&#kVmLQP^+HV{CMiCK_0PEJRY)r+MTGOQiMrZZUL ztUg#qyl)f3!mzAfV`)j5q-A>|nav>i55x)hD`Sj?0n%^^mCgF|to9CcgV_(*(WvLWN-cLi^dVRCe| zQI?6}<wqnq?Ft z7pP=$m`RJ3a4sk>G@-eoMFk-=W$&-kyNg>MYpuub(+niEelh;A`Hf6?GyP441lMDN zEqQ75?ZxJ;A^+zE|8E5cn^~JjHyCg3uIzvO@wF%gvwK$bAUcRFr(IV1KUKEf`DQ6t zG8VH~uMH5{|7NdE3Qjv|xAAYa==gry@k`o>@L)FR@f9_nB_vHR}lZzp{opy}| zoq}_NK`jtN0xWV03P~7uptC}yd1Ob*%$;%NZm=x-;1cJ;y}qJ16%@x-W&5538|d(p za&ldM;PYYJYs_ zTz^$b1~FrH8rbtOZ?h!KYcvfO_#fr|zqa9sqZNPv(Py+GLTfo^fvA0UJzD8!6lB1kel zjKl?xhR}!xBP2ht%O~~M2JPFB+z8-WTpuq3t&O$Q49N@I?W26(%mbo7cQ>Vbn||N- z3|)jy22lChukErCWYERT)Fr>KYFBHHJ?_uayYEcvMMQlNWiL?(Vdi5zuS^5SvFkPC@x# z8+X>`al}uHbd)~`A>Lf}es<2^z2)wY(}8K9t_iaN$9NaTn-1e+TW5A?p`6+8UtK1y z8RMHeYSp9KRTXGzu#OGd9_<&dAM2iX_|JzPgY${!`}>gDU>~8Jw{t<=6F0AInOV zxh)*Jtk@!u^`>V7WU`JE4|mrr7jJt#A_wk1^Jt@Utko?BPu?Q*k0^25T)nv7lqe)^ z4Hx9MBhgSpxexaaT6w+bp(Dge+t{3Vh_U?Tlejq%2u~l4W9OIg3T^2Aar?ggkmvF>|mXoF@|Ok%J6dN z_9n9#;;DKGFD+po@aT>I`^YBSY8{+$XIeyzL79HlYHvDG-9lN`Y|4YFKO-GOBR*zL zJi+MBIk-|YzK@;X0UR8rxawe2JUSZ~ETSKO_AT{WWvm-RDN@x*GLkAS13ewg6N5JY z%4^ib=%sr}H<+l`D2KF*?Rx@Zd*GPzvTgW0z{4}Em6QIr`8TaF!=r*8ry+jo_g~qT z(i1*=NtR4Is%N;T89~+5C9%&(LH{)Iv>ZMH*+1uz@OmoV7mOJov_j;+M)>Jkz$3-W zRzP-~lBozyPxjx#g@~uFWeN|dsv9wj%sChl!O0r)X8chy2>f63wj^b#S>tpFVDf^> zAU{o}(0>h*Y;Q?WX4}wbP>7~N#8VR$x6w&q0abaiiw4OA zBDscB!bC;K=*X1Avn4Ogm5I~EkUtS~aua9`v|z*L#(}oJ5XA5K5v7Emq?UE;ja^a2 z(npcB=Ah`kO%Zjw_N6c5Z;T85I0w@*AblH74`*AYLqkLCh9@F^_XMWs1(3w-ZC`SN zFY42lJI2JomgeQ=!eEnuf=W}Z=^8XBpr7#D%l+hE;?sIkDCl1-!W3p>B!u5Sl$L%C zA35=82a~c!*i<}UQb@J_DH$qaIP<9swKNYY7j2}o$#N_&)9{EzMK-GdKHovGPv|6K zFQs3mG+$GK%20lE^nIbL%k|}ze$9VeEKq4KhIly+7wOdhtfx;a>!B(OXdYz0%@J-{ zzat==kWQA0(>C6;?&%S z3o7}iTyA0$kogv0pR3sgxg8|`k2QAZJ8~-{8ju1#hf%4Z7D=VIGm)!$Cyl0~x!Gh) zSZGdSZUg^Ibi(bX{;V3dDUR_yzzHaG$ zdYqli3%D=;NHPIPbSVqBF3KbA@pWOCL33<+ak)&{UU8PKzL$JnR=zLKozELVHA#Q& z2}pDp4&)elQ9%_&-pozHQ5R-6v|7)^ayTSxC__gAT~T=id65c(*FDj6e0Rz^xEiYP z-C$EiQUwC~Xlg`JP)~`Rbs#n@h^mwY1XS|Nbj4y;R=R(h^eHD~1g*sYc2=e$EF5_& zJuDqv)#9~LT7Lpwk;+W^tn?Is=9V0035Louz=FT;Ran4%!lGlgZfBK5tVbi@q2P(# zi}CRs2eAnfP++Mk3& zMX4_PKnEtcK^bblM%kub^_{u3bq62^me@L;IJDQ;F6U5EPIHXuxJ?uWnMlwUTK zpLm_58JSsm)TVBghkFFh*eumZ_E(5VG@%f-U%8e^8Q^MTTprTyp{%MP72mNDyzLQL zvu}g{3}`?uvQm5;0|i4QVI|GTuKNdG@;|f5D~B>NNES&WudUT}>eo&mx?b*f^MHri z1=vs--OPi&avr9YCKZXcRE@Pif2_I~xdQ+P%$~5#Hh*6_} zA!_+oJ(2>Z9_?ln^DVY-*ws9+;F%XJh-u6sZG&@tcih(Ra1TWExm^{QXvx?xMZhEA zp94lJ0nZP8?_;efF7!f=>()ea;?&yzh!W82(na=|rOJ=B{#)=pQCcF?+>+{Gy->v| z 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%0AZjk){)Mkx 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使用6.2.RC1 | ### 1.3 软件方案介绍 @@ -70,30 +72,13 @@ MindX SDK安装前准备可参考《用户指南》,[安装教程](https://git ## 2 环境依赖 -推荐系统为ubantu 18.04,环境依赖软件和版本如下表: - -| 软件名称 | 版本 | 说明 | 获取方式 | -| ------------------- | ----------- | ----------------------------- | ------------------------------------------------------------ | -| MindX SDK | 2.0.4 | mxVision软件包 | [链接](https://www.hiascend.com/software/Mindx-sdk) | -| ubuntu | 18.04.1 LTS | 操作系统 | Ubuntu官网获取 | -| Ascend-CANN-toolkit | 5.0.4 | Ascend-cann-toolkit开发套件包 | [链接](https://www.hiascend.com/software/cann/commercial) | - 在编译运行项目前,需要设置环境变量: ``` -export MX_SDK_HOME=${SDK安装路径}/mxVision -export install_path=/usr/local/Ascend/ascend-toolkit/latest -export PATH=/usr/local/python3.9.2/bin:${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATH -export ASCEND_OPP_PATH=${install_path}/opp -export ASCEND_AICPU_PATH=${install_path} -export LD_LIBRARY_PATH=${install_path}/atc/lib64:${MX_SDK_HOME}/lib:${MX_SDK_HOME}/opensource/lib:$LD_LIBRARY_PATH -export GST_PLUGIN_SCANNER=${MX_SDK_HOME}/opensource/libexec/gstreamer-1.0/gst-plugin-scanner -export GST_PLUGIN_PATH=${MX_SDK_HOME}/opensource/lib/gstreamer-1.0:${MX_SDK_HOME}/lib/plugins +. /usr/local/Ascend/ascend-toolkit/set_env.sh #toolkit默认安装路径,根据实际安装路径修改 +. ${SDK_INSTALL_PATH}/mxVision/set_env.sh ``` -注:其中SDK安装路径${MX_SDK_HOME}替换为用户的SDK安装路径;install_path替换为开发套件包所在路径。LD_LIBRARY_PATH用以加载开发套件包中lib库。 - - ## 3 软件依赖 @@ -109,7 +94,7 @@ export GST_PLUGIN_PATH=${MX_SDK_HOME}/opensource/lib/gstreamer-1.0:${MX_SDK_HOME ## 4 模型转换 **步骤1** 模型获取 -在ModelZoo上下载[YOLOv4模型](https://www.hiascend.com/zh/software/modelzoo/detail/1/abb7e641964c459398173248aa5353bc) +下载[YOLOv4模型](https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/contrib/VehicleRetrogradeRecognition/models.zip) **步骤2** 模型存放 将获取到的YOLOv4模型onnx文件存放至:"样例项目所在目录/models/"。 @@ -118,23 +103,14 @@ export GST_PLUGIN_PATH=${MX_SDK_HOME}/opensource/lib/gstreamer-1.0:${MX_SDK_HOME 在onnx文件所在目录下执行一下命令 ``` -# 设置环境变量(请确认install_path路径是否正确) -# Set environment PATH (Please confirm that the install_path is correct). - -export install_path=/usr/local/Ascend/ascend-toolkit/latest -export PATH=/usr/local/python3.9.2/bin:${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATH -export PYTHONPATH=${install_path}/atc/python/site-packages:${install_path}/atc/python/site-packages/auto_tune.egg/auto_tune:${install_path}/atc/python/site-packages/schedule_search.egg -export LD_LIBRARY_PATH=${install_path}/atc/lib64:$LD_LIBRARY_PATH -export ASCEND_OPP_PATH=${install_path}/opp - # 执行,转换YOLOv4模型 # Execute, transform YOLOv4 model. YOLOv4: -atc --model=./yolov4_dynamic_bs.onnx --framework=5 --output=yolov4_bs --input_format=NCHW --soc_version=Ascend310 --insert_op_conf=./aipp_yolov4_576_576.config --input_shape="input:1,3,576,576" --out_nodes="Conv_434:0;Conv_418:0;Conv_402:0" +atc --model=./yolov4_dynamic_bs.onnx --framework=5 --output=yolov4_bs --input_format=NCHW --soc_version=Ascend310B1 --insert_op_conf=./aipp_yolov4_576_576.config --input_shape="input:1,3,576,576" --out_nodes="Conv_434:0;Conv_418:0;Conv_402:0" ``` -执行完模型转换脚本后,会生成相应的.om模型文件。我们也提供了原模型以及已经转换好的YOLOv4 om模型:[链接](https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/contrib/VehicleRetrogradeRecognition/models.zip) +执行完模型转换脚本后,会生成相应的.om模型文件。 模型转换使用了ATC工具,如需更多信息请参考: @@ -229,7 +205,7 @@ bash build.sh bash run.sh ``` -命令执行成功后会在当前目录下生成检测结果视频文件out.h264,然后执行命令: +命令执行成功后会在当前目录下生成检测结果视频文件out.h264,然后在pc端ffmpeg软件执行命令: ``` ffmpeg -f h264 -i out.h264 -vcodec copy out.mp4 diff --git a/contrib/human_segmentation/README.md b/contrib/human_segmentation/README.md index 2e4816761..26cb9506c 100644 --- a/contrib/human_segmentation/README.md +++ b/contrib/human_segmentation/README.md @@ -18,12 +18,17 @@ ## 3 依赖 | 软件名称 | 版本 | -| :--------: | :------: | -|ubantu 18.04|18.04.1 LTS | -|MindX SDK|2.0.4| -|C++| 11.0| -|opencv2| | +| -------- | ------ | +| python | 3.9.2 | +| MindX SDK | 5.0RC1 | +| CANN | 310使用6.3.RC1
    310B使用6.2.RC1 | +> 设置环境变量 + +``` +. /usr/local/Ascend/ascend-toolkit/set_env.sh +. ${SDK安装路径}/mxVision/set_env.sh +``` ## 4 模型转换 人体语义分割采用提供的human_segmentation.pb模型。由于原模型是基于tensorflow的人体语义分割模型,因此我们需要借助于ATC工具将其转化为对应的om模型。 @@ -35,22 +40,10 @@ 在pb文件所在目录下执行以下命令 ``` -#设置环境变量(请确认install_path路径是否正确) -#Set environment PATH (Please confirm that the install_path is correct). - -export install_path=/usr/local/Ascend/ascend-toolkit/latest - -export PATH=/usr/local/python3.9.2/bin:${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATH - -export PYTHONPATH=${install_path}/atc/python/site-packages:${install_path}/atc/python/site-packages/auto_tune.egg/auto_tune:${install_path}/atc/python/site-packages/schedule_search.egg - -export LD_LIBRARY_PATH=${install_path}/atc/lib64:$LD_LIBRARY_PATH -export ASCEND_OPP_PATH=${install_path}/opp - #执行,转换human_segmentation.pb模型 #Execute, transform 转换human_segmentation.pb model. -atc --input_shape="input_rgb:1,512,512,3" --input_format=NHWC --output=human_segmentation --soc_version=Ascend310 --insert_op_conf=./insert_op.cfg --framework=3 --model=./human_segmentation.pb +atc --input_shape="input_rgb:1,512,512,3" --input_format=NHWC --output=human_segmentation --soc_version=Ascend310B1 --insert_op_conf=./insert_op.cfg --framework=3 --model=./human_segmentation.pb ``` 执行完模型转换脚本后,若提示如下信息说明模型转换成功,会在output参数指定的路径下生成human_segmentation.om模型文件。 ``` @@ -66,34 +59,7 @@ https://gitee.com/ascend/docs-openmind/blob/master/guide/mindx/sdk/tutorials/%E5 ``` 见4: 模型转换 ``` -2. 配置 - -``` -# 执行如下命令,打开.bashrc文件 -vi .bashrc -# 在.bashrc文件中添加以下环境变量 -MX_SDK_HOME=${SDK安装路径} - -LD_LIBRARY_PATH=${MX_SDK_HOME}/lib:${MX_SDK_HOME}/opensource/lib:${MX_SDK_HOME}/opensource/lib64:${FFMPEG_HOME}/lib:/usr/local/Ascend/ascend-toolkit/latest/acllib/lib64:/usr/local/Ascend/driver/lib64/ - -GST_PLUGIN_SCANNER=${MX_SDK_HOME}/opensource/libexec/gstreamer-1.0/gst-plugin-scanner - -GST_PLUGIN_PATH=${MX_SDK_HOME}/opensource/lib/gstreamer-1.0:${MX_SDK_HOME}/lib/plugins - -# 保存退出.bashrc文件 -# 执行如下命令使环境变量生效 -source ~/.bashrc - -#查看环境变量 -env -``` -3. 配置SDK路径 - -配置CMakeLists.txt文件中的`MX_SDK_HOME`环境变量 -``` -set(MX_SDK_HOME ${SDK安装路径}/mxVision) -``` -4. 配置pipeline +2. 配置pipeline 根据所需场景,配置pipeline文件,调整路径参数等。 ``` #配置mxpi_tensorinfer插件的模型加载路径: modelPath @@ -106,25 +72,23 @@ set(MX_SDK_HOME ${SDK安装路径}/mxVision) "next": "appsink0" }, ``` -5. 获取测试需要的测试图片 +3. 获取测试需要的测试图片 进入工程文件的data目录下,下载mp4格式的测试短视频,任意截取一张命名为test.jpg作为测试图片。 ``` wget https://c7xcode.obs.cn-north-4.myhuaweicloud.com/models/human_segmentation/person.mp4 ``` -注:若想测试自己的.jpg图片可将其放如data目录下并修改main.cpp中int main函数的第一行std::string inputPicname = "test.jpg";将右边替换成自己图片的名称即可。 -编译项目文件 - - 新建立build目录,进入build执行cmake ..(..代表包含CMakeLists.txt的源文件父目录),在build目录下生成了编译需要的Makefile和中间文件。执行make构建工程,构建成功后就会生成可执行文件。 - 再执行make命令生成的smple就是CMakeLists文件中指定生成的可执行文件 - +注:若想测试自己的.jpg图片可将其放在data目录下并修改main.cpp中int main函数的第一行std::string inputPicname = "test.jpg";将右边替换成自己图片的名称即可。 +4. 编译项目文件 -5. 运行可执行文件 ``` - -切换至工程主目录,执行以下命令运行样例。 -执行run.sh文件 +切换至工程主目录,执行以下命令执行编译 +bash build.sh +``` +5. 运行 +``` +bash run.sh ``` 6. 查看结果 diff --git a/contrib/human_segmentation/main.cpp b/contrib/human_segmentation/main.cpp index d0812567b..82a2737bf 100644 --- a/contrib/human_segmentation/main.cpp +++ b/contrib/human_segmentation/main.cpp @@ -19,12 +19,16 @@ #include "MxBase/MemoryHelper/MemoryHelper.h" #include "MxStream/StreamManager/MxStreamManager.h" #include "MxBase/Tensor/TensorBase/TensorBase.h" -#include "MxBase/CV/Segmentation/DrawPixels.h" #include "MxBase/PostProcessBases/SemanticSegPostProcessBase.h" -#define INPUT_MODEL_HEIGHT 512 -#define INPUT_MODEL_WIDTH 512 -#define OUTPUT_MODEL_WIDTH 512 +namespace { + const uint32_t INPUT_MODEL_HEIGHT=512; + const uint32_t INPUT_MODEL_WIDTH=512; + const uint32_t OUTPUT_MODEL_HEIGHT=512; + const uint32_t OUTPUT_MODEL_WIDTH=512; + const uint32_t OBJECT_VALUE=2; + const uint32_t PIXEL=255; +} // Read the information in the file static APP_ERROR readfile(const std::string& filePath, MxStream::MxstDataInput& dataBuffer) { @@ -96,8 +100,8 @@ static std::string readpipelineconfig(const std::string &pipelineConfigPath) return pipelineConfig; } -// Gets the amount of tension -void gettensors(const MxTools::MxpiTensorPackageList tensorPackageList,std::vector &tensors) { +// Gets the amount of tensor +void GetTensors(const MxTools::MxpiTensorPackageList tensorPackageList,std::vector &tensors) { for (int i = 0; i < tensorPackageList.tensorpackagevec_size(); ++i) { for (int j = 0; j < tensorPackageList.tensorpackagevec(i).tensorvec_size(); j++) { MxBase::MemoryData memoryData = {}; @@ -122,7 +126,7 @@ void gettensors(const MxTools::MxpiTensorPackageList tensorPackageList,std::vect } } -void semanticsegoutput(const std::vector& tensors, +void SemanticsegOutput(const std::vector& tensors, const std::vector& resizedImageInfos, std::vector &semanticSegInfos) { @@ -152,42 +156,72 @@ void semanticsegoutput(const std::vector& tensors, } } -// Mask diagram generation -APP_ERROR draw(const std::vector& tensors, - std::vector& semanticSegInfos, - const std::vector& resizedImageInfos, - std::string & inputPicname) +APP_ERROR DrawPixels(const std::vector> pixels, const cv::Size size, cv::Mat &mask) { - int dumpImage_ = 1; - auto inputs = tensors; - semanticsegoutput(inputs, resizedImageInfos, semanticSegInfos); - if (dumpImage_) { - for (uint32_t i = 0; i < semanticSegInfos.size(); i++) { - std::ostringstream outputPath; - outputPath << "./data/mask_" << inputPicname; - MxBase::DrawPixelsRGB(semanticSegInfos[i].pixels, outputPath.str()); + if (pixels.size() == 0) { + LogError << "Infer result error"; + return APP_ERR_COMMANDER_INFER_RESULT_ERROR; + } + if (pixels[0].size() == 0) { + LogError << "Infer result error"; + return APP_ERR_COMMANDER_INFER_RESULT_ERROR; + } + + cv::Mat maskTmp = cv::Mat(size, CV_32FC1); + for (uint32_t i = 0; i < size.height; i++) { + for (uint32_t j = 0; j < size.width; i++) { + if (pixels[i][j] == OBJECT_VALUE) { + maskTmp.at(i, j) = PIXEL; + } else { + maskTmp.at(i, j) = pixels[i][j]; + } } } + cv.cvtColor(maskTmp, mask, cv::COLOR_GRAY2RGB); + mask.cv::Mat::convertTo(mask, CV_8UC3); return APP_ERR_OK; } -// Mask chart zoom -void zoom(std::string filename,int height,int width){ - cv::Mat src = cv::imread("./"+filename,cv::IMREAD_UNCHANGED); - cv::Mat dst; - resize(src, dst, cv::Size(width, height)); - cv::imwrite(filename,dst); -} +APP_ERROR SaveResult(const std::shared-ptr mxpiVisionList, + const std::vector semanticSegInfos, + const std::string inputPicname) +{ + APP_ERROR ret; + auto& visionInfo = mxpiVisionList->visionvec(0).visioninfo(); + auto& visionData = mxpiVisionList->visionvec(0).visiondata(); + MxBase::MemoryData memorySrc = {}; + memorySrc.deviceId = visionData.deviceid(); + memorySrc.type = (MxBase::MemoryData::MemoryType) visionData.memtype(); + memorySrc.size = visionData.datasize(); + memorySrc.ptrData = (void*)visionData.dataptr(); + MxBase::MemoryData memoryDst(visionData.datasize(), MxBase::MemoryData::MEMORY_HOST_NEW); + ret = MxBase::MemoryHelper::MxbsMallocAndCopy(memoryDst, memorySrc); + if(ret != APP_ERR_OK){ + LogError << "Fail to malloc and copy host memory."; + return ret; + } + cv::Mat imgBgr = cv::Mat(visionInfo.heightaligned(), visionInfo.widthaligned(), CV_8UC3, memoryDst.ptrData); + + cv::Size size = {OUTPUT_MODEL_HEIGHT, OUTPUT_MODEL_WIDTH}; + //Mask diagram genertion + for (uint32_t i = 0; i < semanticSegInfos.size(); i++) { + cv::Mat maskRGB = CV::Mat(size, CV_8UC3); + ret = DrawPixels(semanticSegInfos[i].pixels, size, maskRGB); + if(ret != APP_ERR_OK) { + LogError << "Draw mask failed"; + return ret; + } + std::ostringstream outputPath; + outputPath << "./result/mask_" << inputPicname; + cv::Mat oriMask, dst; + cv::resize(maskRGB, oriMask, cv::Size(visionInfo.widthaligned(), visionInfo.heightaligned())); + cv::imwrite(outputPath.str(), oriMask); -// Picture fusion -void image_fusion(std::string filename,std::string maskname,std::string &inputPicname){ - cv::Mat img1 = cv::imread(filename); - cv::Mat img2 = cv::imread(maskname); - cv::Mat dst; - // 1 and 0.5 are the transparency of array - // 0 means offset added to weighted sum - cv::addWeighted(img1,1,img2,0.5,0,dst); - cv::imwrite("./result/result_"+inputPicname,dst); + //Picture fusion + cv::addWeighted(imgBgr, 1, oriMask, 0.5, 0, dst); + cv::imwrite("./result/result_" + inputPicname, dst); + } + return APP_ERR_OK; } int main(int argc, char* argv[]) @@ -243,28 +277,23 @@ int main(int argc, char* argv[]) std::vector keyVec = {"mxpi_tensorinfer0", "mxpi_imagedecoder0"}; std::vector output = mxStreamManager->GetProtobuf(streamName, 0, keyVec); - // Mxpi_tensorinfer0 model post-processing plug-in output information - auto objectList = std::static_pointer_cast(output[0].messagePtr); - // mxpi_imagedecoder0 the image decoding plug-in output information - auto mxpiVision = std::static_pointer_cast(output[1].messagePtr); + auto mxpiVisionList = std::static_pointer_cast(output[1].messagePtr); auto tensorPackageList = google::protobuf::DynamicCastToGenerated (output[0].messagePtr.get()); - int Pre_Height = mxpiVision.get()->visionvec(0).visioninfo().height(); - int Pre_Width = mxpiVision.get()->visionvec(0).visioninfo().width(); MxTools::MxpiTensorPackage tensorPackage = tensorPackageList->tensorpackagevec(0); MxTools::MxpiTensor tensor = tensorPackage.tensorvec(0); std::vector tensors; - gettensors(*tensorPackageList,tensors); + GetTensors(*tensorPackageList,tensors); std::vector ResizedImageInfos; std::vector semanticSegInfos; MxBase::ResizedImageInfo resizedImageInfo; resizedImageInfo.heightResize = INPUT_MODEL_HEIGHT; resizedImageInfo.widthResize = INPUT_MODEL_WIDTH; ResizedImageInfos.push_back(resizedImageInfo); - draw(tensors,semanticSegInfos,ResizedImageInfos,inputPicname); - zoom("./data/mask_"+inputPicname,Pre_Height,Pre_Width); - image_fusion(inputPicPath,"./data/mask_"+inputPicname,inputPicname); + + SemanticsegOutput(tensor, ResizedImageInfos, semanticSegInfos); + SaveResult(mxpiVisionList, semanticSegInfos, inputPicname); mxStreamManager->DestroyAllStreams(); return 0; -- Gitee From ff2633de27ad77364ad06edeb8aab7a6bac5fc9c Mon Sep 17 00:00:00 2001 From: DlinR Date: Thu, 30 Mar 2023 20:14:05 +0800 Subject: [PATCH 38/61] no message --- contrib/human_segmentation/main.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/contrib/human_segmentation/main.cpp b/contrib/human_segmentation/main.cpp index 82a2737bf..bf3eec223 100644 --- a/contrib/human_segmentation/main.cpp +++ b/contrib/human_segmentation/main.cpp @@ -169,7 +169,7 @@ APP_ERROR DrawPixels(const std::vector> pixels, const cv::Size cv::Mat maskTmp = cv::Mat(size, CV_32FC1); for (uint32_t i = 0; i < size.height; i++) { - for (uint32_t j = 0; j < size.width; i++) { + for (uint32_t j = 0; j < size.width; j++) { if (pixels[i][j] == OBJECT_VALUE) { maskTmp.at(i, j) = PIXEL; } else { @@ -177,12 +177,12 @@ APP_ERROR DrawPixels(const std::vector> pixels, const cv::Size } } } - cv.cvtColor(maskTmp, mask, cv::COLOR_GRAY2RGB); + cv::cvtColor(maskTmp, mask, cv::COLOR_GRAY2RGB); mask.cv::Mat::convertTo(mask, CV_8UC3); return APP_ERR_OK; } -APP_ERROR SaveResult(const std::shared-ptr mxpiVisionList, +APP_ERROR SaveResult(const std::shared_ptr mxpiVisionList, const std::vector semanticSegInfos, const std::string inputPicname) { @@ -205,7 +205,7 @@ APP_ERROR SaveResult(const std::shared-ptr mxpiVisionLi cv::Size size = {OUTPUT_MODEL_HEIGHT, OUTPUT_MODEL_WIDTH}; //Mask diagram genertion for (uint32_t i = 0; i < semanticSegInfos.size(); i++) { - cv::Mat maskRGB = CV::Mat(size, CV_8UC3); + cv::Mat maskRGB = cv::Mat(size, CV_8UC3); ret = DrawPixels(semanticSegInfos[i].pixels, size, maskRGB); if(ret != APP_ERR_OK) { LogError << "Draw mask failed"; @@ -227,7 +227,7 @@ APP_ERROR SaveResult(const std::shared-ptr mxpiVisionLi int main(int argc, char* argv[]) { // Enter the image name, path - std::string inputPicname = "test.jpeg"; + std::string inputPicname = "test.jpg"; std::string inputPicPath = "./data/"+inputPicname; unsigned long idx = inputPicname.find(".jpg"); @@ -292,7 +292,7 @@ int main(int argc, char* argv[]) resizedImageInfo.widthResize = INPUT_MODEL_WIDTH; ResizedImageInfos.push_back(resizedImageInfo); - SemanticsegOutput(tensor, ResizedImageInfos, semanticSegInfos); + SemanticsegOutput(tensors, ResizedImageInfos, semanticSegInfos); SaveResult(mxpiVisionList, semanticSegInfos, inputPicname); mxStreamManager->DestroyAllStreams(); -- Gitee From b750086a20cb718ab4657088d77fe161c6b2d840 Mon Sep 17 00:00:00 2001 From: DlinR Date: Thu, 30 Mar 2023 20:40:35 +0800 Subject: [PATCH 39/61] no message --- contrib/PassengerflowEstimation/README.md | 2 +- contrib/VideoGestureRecognition/README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contrib/PassengerflowEstimation/README.md b/contrib/PassengerflowEstimation/README.md index f631eb7bc..e11fdf6df 100644 --- a/contrib/PassengerflowEstimation/README.md +++ b/contrib/PassengerflowEstimation/README.md @@ -102,7 +102,7 @@ passengerflowestimation基于MindXSDK开发,在昇腾芯片上进行客流量 2. 进入`passengerflowestimation/models`文件夹下面执行命令**(注:提前设置好环境变量)**: ``` -atc --model=${模型路径}/passengerflowestimation.onnx --framework=5 --output=${输出.om模型路径}/yolov4 --input_format=NCHW --output_type=FP32 --soc_version=Ascend310B1 --input_shape="input:1,3,608,608" --log=info --insert_op_conf=${aipp文件路径}/aipp_Passengerflowdetection.config +atc --model=passengerflowestimation.onnx --framework=5 --output=yolov4 --input_format=NCHW --output_type=FP32 --soc_version=Ascend310B1 --input_shape="input:1,3,608,608" --log=info --insert_op_conf=aipp_Passengerflowdetection.config ``` 执行该命令后会在指定输出.om模型路径生成项目指定模型文件`passengerflowestimation.om`。若模型转换成功则输出: diff --git a/contrib/VideoGestureRecognition/README.md b/contrib/VideoGestureRecognition/README.md index 5536301e5..a05505eb1 100644 --- a/contrib/VideoGestureRecognition/README.md +++ b/contrib/VideoGestureRecognition/README.md @@ -65,7 +65,7 @@ ```bash export PATH=/usr/local/ffmpeg/bin:$PATH export LD_LIBRARY_PATH=/usr/local/ffmpeg/lib:$LD_LIBRARY_PATH -export FFMPEG_path=/usr/local/ffmpeg/ +export FFMPEG_PATH=/usr/local/ffmpeg/ ``` #### FFmpeg -- Gitee From a4cafddfffb3058ce62b58f562b96769d3e1f43e Mon Sep 17 00:00:00 2001 From: DlinR Date: Thu, 30 Mar 2023 20:54:15 +0800 Subject: [PATCH 40/61] no message --- contrib/human_segmentation/main.cpp | 39 +++++++++++++---------------- 1 file changed, 17 insertions(+), 22 deletions(-) diff --git a/contrib/human_segmentation/main.cpp b/contrib/human_segmentation/main.cpp index bf3eec223..72457d516 100644 --- a/contrib/human_segmentation/main.cpp +++ b/contrib/human_segmentation/main.cpp @@ -22,12 +22,15 @@ #include "MxBase/PostProcessBases/SemanticSegPostProcessBase.h" namespace { - const uint32_t INPUT_MODEL_HEIGHT=512; - const uint32_t INPUT_MODEL_WIDTH=512; - const uint32_t OUTPUT_MODEL_HEIGHT=512; - const uint32_t OUTPUT_MODEL_WIDTH=512; - const uint32_t OBJECT_VALUE=2; - const uint32_t PIXEL=255; + const uint32_t INPUT_MODEL_HEIGHT = 512; + const uint32_t INPUT_MODEL_WIDTH = 512; + const uint32_t OUTPUT_MODEL_HEIGHT = 512; + const uint32_t OUTPUT_MODEL_WIDTH = 512; + const uint32_t OBJECT_VALUE = 2; + const uint32_t PIXEL = 255; + const double ALPHA = 1.0; + const double BETA = 0.5; + const double GAMMA = 0.0; } // Read the information in the file static APP_ERROR readfile(const std::string& filePath, MxStream::MxstDataInput& dataBuffer) @@ -101,7 +104,7 @@ static std::string readpipelineconfig(const std::string &pipelineConfigPath) } // Gets the amount of tensor -void GetTensors(const MxTools::MxpiTensorPackageList tensorPackageList,std::vector &tensors) { +void GetTensors(const MxTools::MxpiTensorPackageList tensorPackageList, std::vector &tensors) { for (int i = 0; i < tensorPackageList.tensorpackagevec_size(); ++i) { for (int j = 0; j < tensorPackageList.tensorpackagevec(i).tensorvec_size(); j++) { MxBase::MemoryData memoryData = {}; @@ -183,8 +186,8 @@ APP_ERROR DrawPixels(const std::vector> pixels, const cv::Size } APP_ERROR SaveResult(const std::shared_ptr mxpiVisionList, - const std::vector semanticSegInfos, - const std::string inputPicname) + const std::vector semanticSegInfos, + const std::string inputPicname) { APP_ERROR ret; auto& visionInfo = mxpiVisionList->visionvec(0).visioninfo(); @@ -203,7 +206,7 @@ APP_ERROR SaveResult(const std::shared_ptr mxpiVisionLi cv::Mat imgBgr = cv::Mat(visionInfo.heightaligned(), visionInfo.widthaligned(), CV_8UC3, memoryDst.ptrData); cv::Size size = {OUTPUT_MODEL_HEIGHT, OUTPUT_MODEL_WIDTH}; - //Mask diagram genertion + // Mask diagram genertion for (uint32_t i = 0; i < semanticSegInfos.size(); i++) { cv::Mat maskRGB = cv::Mat(size, CV_8UC3); ret = DrawPixels(semanticSegInfos[i].pixels, size, maskRGB); @@ -217,8 +220,8 @@ APP_ERROR SaveResult(const std::shared_ptr mxpiVisionLi cv::resize(maskRGB, oriMask, cv::Size(visionInfo.widthaligned(), visionInfo.heightaligned())); cv::imwrite(outputPath.str(), oriMask); - //Picture fusion - cv::addWeighted(imgBgr, 1, oriMask, 0.5, 0, dst); + // Picture fusion + cv::addWeighted(imgBgr, ALPHA, oriMask, BETA, GAMMA, dst); cv::imwrite("./result/result_" + inputPicname, dst); } return APP_ERR_OK; @@ -284,7 +287,7 @@ int main(int argc, char* argv[]) MxTools::MxpiTensor tensor = tensorPackage.tensorvec(0); std::vector tensors; - GetTensors(*tensorPackageList,tensors); + GetTensors(*tensorPackageList, tensors); std::vector ResizedImageInfos; std::vector semanticSegInfos; MxBase::ResizedImageInfo resizedImageInfo; @@ -297,12 +300,4 @@ int main(int argc, char* argv[]) mxStreamManager->DestroyAllStreams(); return 0; -} - - - - - - - - +} \ No newline at end of file -- Gitee From b5843cb87a927657c92a7c67f4c998683a5224d3 Mon Sep 17 00:00:00 2001 From: DlinR Date: Fri, 31 Mar 2023 09:28:30 +0800 Subject: [PATCH 41/61] =?UTF-8?q?=E9=97=A8=E7=A6=81=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contrib/SuperResolution/evaluate.py | 68 ++++++++++++++--------------- contrib/human_segmentation/main.cpp | 4 +- 2 files changed, 36 insertions(+), 36 deletions(-) diff --git a/contrib/SuperResolution/evaluate.py b/contrib/SuperResolution/evaluate.py index c6887acd5..1801e53e2 100644 --- a/contrib/SuperResolution/evaluate.py +++ b/contrib/SuperResolution/evaluate.py @@ -26,11 +26,11 @@ OFFSET_5 = 5 OFFSET_20 = 20 -def infer(input_image_path, streamManagerapi): +def infer(input_image_path, stream_manager_api): """ image super-resolution inference :param input_image_path: input image path - :param streamManagerapi: streamManagerapi + :param stream_manager_api: stream_manager_api :return: no return """ if os.path.exists(input_image_path) != 1: @@ -48,49 +48,49 @@ def infer(input_image_path, streamManagerapi): ilr_image_bytes = io.BytesIO() ilr.save(ilr_image_bytes, format='JPEG') input_image_data = ilr_image_bytes.getvalue() - dataInput = MxDataInput() - dataInput.data = input_image_data + data_input = MxDataInput() + data_input.data = input_image_data - # inputs data to a specified stream based on streamName - streamName = b'superResolution' - inPluginId = 0 - uniqueId = streamManagerapi.SendData(streamName, inPluginId, dataInput) - if uniqueId < 0: + # inputs data to a specified stream based on stream_name + stream_name = b'superResolution' + in_plugin_id = 0 + unique_id = stream_manager_api.SendData(stream_name, in_plugin_id, data_input) + if unique_id < 0: print("Failed to send data to stream.") exit() # Obtain the inference result key = b"mxpi_tensorinfer0" - keyVec = StringVector() - keyVec.push_back(key) - inferResult = streamManagerapi.GetProtobuf(streamName, inPluginId, keyVec) - if inferResult.size() == 0: - print("inferResult is null") + key_vec = StringVector() + key_vec.push_back(key) + infer_result = stream_manager_api.GetProtobuf(stream_name, in_plugin_id, key_vec) + if infer_result.size() == 0: + print("infer_result is null") exit() - if inferResult[0].errorCode != 0: + if infer_result[0].errorCode != 0: print("GetProtobuf error. errorCode=%d, errorMsg=%s" % ( - inferResult[0].errorCode, inferResult[0].messageName.decode())) + infer_result[0].errorCode, infer_result[0].messageName.decode())) exit() # get the infer result - inferList0 = MxpiDataType.MxpiTensorPackageList() - inferList0.ParseFromString(inferResult[0].messageBuf) - inferVisionData = inferList0.tensorPackageVec[0].tensorVec[0].dataStr + infer_list = MxpiDataType.MxpiTensorPackageList() + infer_list.ParseFromString(infer_result[0].messageBuf) + vision_data = infer_list.tensorPackageVec[0].tensorVec[0].dataStr - output_img_data = np.frombuffer(inferVisionData, dtype=np.float32) + output_img_data = np.frombuffer(vision_data, dtype=np.float32) output_y = colorize(output_img_data, value_min=None, value_max=None) output_y = output_y.reshape(DEFAULT_IMAGE_WIDTH, DEFAULT_IMAGE_HEIGHT) sr_img_y = Image.fromarray(np.uint8(output_y), mode="L") hr_img_y, _, _ = hr.convert("YCbCr").split() # calculate peak signal-to-noise ratio - PSNR = calc_psnr(sr_img_y, hr_img_y) - psnr_all.append(PSNR) - print('PSNR: {:.2f}'.format(PSNR)) + psnr = calc_psnr(sr_img_y, hr_img_y) + psnr_all.append(psnr) + print('PSNR: {:.2f}'.format(psnr)) if __name__ == '__main__': # init stream manager - streamManagerApi = StreamManagerApi() - ret = streamManagerApi.InitManager() + stream_manager_api = StreamManagerApi() + ret = stream_manager_api.InitManager() if ret != 0: print("Failed to init Stream manager, ret=%s" % str(ret)) exit() @@ -137,24 +137,24 @@ if __name__ == '__main__': } } pipelineStr = json.dumps(pipeline).encode() - ret = streamManagerApi.CreateMultipleStreams(pipelineStr) + ret = stream_manager_api.CreateMultipleStreams(pipelineStr) if ret != 0: print("Failed to create Stream, ret=%s" % str(ret)) exit() # test image set path - test_image_set_path = "testSet/91-images-jpg" + TEST_IMAGE_SET_PATH = "testSet/91-images-jpg" # parse command arguments if len(sys.argv) == 2: if sys.argv[1] == '': print('test image set path is not valid, use default config.') else: - test_image_set_path = sys.argv[1] + TEST_IMAGE_SET_PATH = sys.argv[1] # check input paths - if os.path.exists(test_image_set_path) != 1: - print('The image set path {} does not exist.'.format(test_image_set_path)) + if os.path.exists(TEST_IMAGE_SET_PATH) != 1: + print('The image set path {} does not exist.'.format(TEST_IMAGE_SET_PATH)) exit() # get all image files - image_files = os.listdir(test_image_set_path) + image_files = os.listdir(TEST_IMAGE_SET_PATH) # sort by file name image_files.sort(key=lambda x: str(x[:-4])) print(image_files) @@ -162,9 +162,9 @@ if __name__ == '__main__': # save the peak signal-to-noise ratio of each image in the test set psnr_all = [] for test_image_path in image_files: - image_file = test_image_set_path + "/" + test_image_path - infer(image_file, streamManagerApi) + image_file = TEST_IMAGE_SET_PATH + "/" + test_image_path + infer(image_file, stream_manager_api) print("average psnr = " + str(sum(psnr_all)/len(psnr_all))) print(psnr_all) # destroy streams - streamManagerApi.DestroyAllStreams() \ No newline at end of file + stream_manager_api.DestroyAllStreams() \ No newline at end of file diff --git a/contrib/human_segmentation/main.cpp b/contrib/human_segmentation/main.cpp index 72457d516..e77499ec1 100644 --- a/contrib/human_segmentation/main.cpp +++ b/contrib/human_segmentation/main.cpp @@ -255,7 +255,7 @@ int main(int argc, char* argv[]) } // Load the information that pipeline gets to create a new stream business flow ret = mxStreamManager->CreateMultipleStreams(pipelineConfig); // The incoming profile - if(ret != APP_ERR_OK){ + if (ret != APP_ERR_OK) { LogError << GetError(ret) << "Fail to creat Stream."; return ret; } @@ -263,7 +263,7 @@ int main(int argc, char* argv[]) // Read the information of the picture into dataBuffer MxStream::MxstDataInput dataBuffer; ret = readfile(inputPicPath, dataBuffer); - if(ret != APP_ERR_OK){ + if (ret != APP_ERR_OK) { LogError << "Fail to read image file, ret = " << ret << "."; return ret; } -- Gitee From 76d4b6b0c4f822787c7d6a033df22fe89ffe84d0 Mon Sep 17 00:00:00 2001 From: DlinR Date: Fri, 31 Mar 2023 10:05:41 +0800 Subject: [PATCH 42/61] no message --- contrib/SuperResolution/evaluate.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/contrib/SuperResolution/evaluate.py b/contrib/SuperResolution/evaluate.py index 1801e53e2..403ae8ec5 100644 --- a/contrib/SuperResolution/evaluate.py +++ b/contrib/SuperResolution/evaluate.py @@ -26,11 +26,11 @@ OFFSET_5 = 5 OFFSET_20 = 20 -def infer(input_image_path, stream_manager_api): +def infer(input_image_path, stream_manager): """ image super-resolution inference :param input_image_path: input image path - :param stream_manager_api: stream_manager_api + :param stream_manager: stream_manager :return: no return """ if os.path.exists(input_image_path) != 1: @@ -54,7 +54,7 @@ def infer(input_image_path, stream_manager_api): # inputs data to a specified stream based on stream_name stream_name = b'superResolution' in_plugin_id = 0 - unique_id = stream_manager_api.SendData(stream_name, in_plugin_id, data_input) + unique_id = stream_manager.SendData(stream_name, in_plugin_id, data_input) if unique_id < 0: print("Failed to send data to stream.") exit() @@ -62,7 +62,7 @@ def infer(input_image_path, stream_manager_api): key = b"mxpi_tensorinfer0" key_vec = StringVector() key_vec.push_back(key) - infer_result = stream_manager_api.GetProtobuf(stream_name, in_plugin_id, key_vec) + infer_result = stream_manager.GetProtobuf(stream_name, in_plugin_id, key_vec) if infer_result.size() == 0: print("infer_result is null") exit() -- Gitee From e4fa12ac91030e426a99642f98769a016ab42b79 Mon Sep 17 00:00:00 2001 From: DlinR Date: Fri, 31 Mar 2023 11:00:27 +0800 Subject: [PATCH 43/61] no message --- tutorials/DvppWrapperSample/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorials/DvppWrapperSample/main.cpp b/tutorials/DvppWrapperSample/main.cpp index 6fa02aab3..0f54a5d32 100644 --- a/tutorials/DvppWrapperSample/main.cpp +++ b/tutorials/DvppWrapperSample/main.cpp @@ -23,7 +23,7 @@ using namespace std; namespace { using namespace MxBase; - const uint32_t ENCODE_TEST_DEVICE_ID = 1; + const uint32_t ENCODE_TEST_DEVICE_ID = 0; const uint32_t ENCODE_IMAGE_HEIGHT = 1080; const uint32_t ENCODE_IMAGE_WIDTH = 1920; const uint32_t ENCODE_FRAME_INTERVAL = 25; -- Gitee From 8abfe1269e7cda7ddfe6f6a0288c264702274f8e Mon Sep 17 00:00:00 2001 From: xuegangxiao Date: Fri, 31 Mar 2023 11:10:47 +0800 Subject: [PATCH 44/61] =?UTF-8?q?OsdSample=20CMakeLists=E4=B8=8Ebuild.sh?= =?UTF-8?q?=E8=84=9A=E6=9C=AC=E8=A1=A5=E5=85=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tutorials/OsdSample/C++/CMakeLists.txt | 50 ++++++++++++++++++++++++++ tutorials/OsdSample/C++/run.sh | 36 +++++++++++++++++++ tutorials/OsdSample/README.md | 40 ++++++++++++++++++++- 3 files changed, 125 insertions(+), 1 deletion(-) create mode 100644 tutorials/OsdSample/C++/CMakeLists.txt create mode 100644 tutorials/OsdSample/C++/run.sh diff --git a/tutorials/OsdSample/C++/CMakeLists.txt b/tutorials/OsdSample/C++/CMakeLists.txt new file mode 100644 index 000000000..30320d7ed --- /dev/null +++ b/tutorials/OsdSample/C++/CMakeLists.txt @@ -0,0 +1,50 @@ +# Copyright (c) Huawei Technologies Co., Ltd. 2019-2023. All rights reserved. + +# CMake lowest version requirement +cmake_minimum_required(VERSION 3.5.0) + +# project information +project(OsdSample) + +set(MX_SDK_HOME "$ENV{MX_SDK_HOME}") + +if (NOT DEFINED ENV{MX_SDK_HOME}) + string(REGEX REPLACE "(.*)/(.*)/(.*)/(.*)" "\\1" MX_SDK_HOME ${CMAKE_CURRENT_SOURCE_DIR}) + message(STATUS "set default MX_SDK_HOME: ${MX_SDK_HOME}") +else () + message(STATUS "env MX_SDK_HOME: ${MX_SDK_HOME}") +endif() + +# Compile options +add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0) +add_definitions(-Dgoogle=mindxsdk_private) +add_compile_options(-std=c++11 -fPIC -fstack-protector-all -Wall) + +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) +set(CMAKE_CXX_FLAGS_DEBUG "-g") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,relro,-z,now,-z,noexecstack -pie") + +# Header path +include_directories( + ${MX_SDK_HOME}/include/ + ${MX_SDK_HOME}/opensource/include/ +) + +# add host lib path +link_directories( + ${MX_SDK_HOME}/lib/ + ${MX_SDK_HOME}/lib/modelpostprocessors + ${MX_SDK_HOME}/opensource/lib/ + ${MX_SDK_HOME}/opensource/lib64/ +) + +add_executable(main main.cpp) + +target_link_libraries(main glog mxbase plugintoolkit mxpidatatype streammanager cpprest mindxsdk_protobuf) + +install(TARGETS main DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) + + + + + diff --git a/tutorials/OsdSample/C++/run.sh b/tutorials/OsdSample/C++/run.sh new file mode 100644 index 000000000..f1e9844bb --- /dev/null +++ b/tutorials/OsdSample/C++/run.sh @@ -0,0 +1,36 @@ +#!/bin/bash +# Copyright 2023 Huawei Technologies Co., Ltd +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License.mitations under the License. + +set -e + +current_folder="$( cd "$(dirname "$0")" ;pwd -P )" + +function build() { + build_path=$current_folder/build + if [ -d "$build_path" ]; then + rm -rf "$build_path" + else + echo "file $build_path is not exist." + fi + mkdir -p "$build_path" + cd "$build_path" + cmake .. + make -j + cd .. + exit 0 +} + +build +exit 0 \ No newline at end of file diff --git a/tutorials/OsdSample/README.md b/tutorials/OsdSample/README.md index f8326c0ed..89f27eb9c 100644 --- a/tutorials/OsdSample/README.md +++ b/tutorials/OsdSample/README.md @@ -1,4 +1,42 @@ # SampleOsd 样例说明 + +## 1 介绍 * 本样例从ExternalOsdInstances.json构建一个绘图单元集合(MxpiOsdInstancesList)的元数据(metadata)并送入stream * 上传一张jpg格式图片并重命名为test.jpg,在运行目录下执行run.sh。请勿使用大分辨率图片 -* 如构建的proto数据正确则可在程序运行结束后在运行目录找到图片testout.jpg,此图片为test.jpg经过缩放后加上绘图单元集合后的输出结果。 \ No newline at end of file +* 如构建的proto数据正确则可在程序运行结束后在运行目录找到图片testout.jpg,此图片为test.jpg经过缩放后加上绘图单元集合后的输出结果。 + +### 1.1 支持的产品 +本项目以昇腾Atlas310、Atlas310B卡为主要硬件平台。 + +### 1.2 支持的版本 +支持的SDK版本为 5.0.RC1, CANN 版本为 6.0.RC1。 + + +## 2 环境依赖 +在编译和运行项目需要的环境变量如下。 + + ``` + export MX_SDK_path=""# mxVision 安装路径 + export Ascend_toolkit_path=""#CANN 安装路径 + + # MindXSDK 环境变量: + . /${MX_SDK_path}/set_env.sh + + # CANN 环境变量: + . /${Ascend_toolkit_path}/set_env.sh + ``` + +## 3 OSD模型转换 +使用mxpi_opencvosd插件前,需要使用osd相关的模型文件,请执行mxVision安装目录下operators/opencvosd/generate_osd_om.sh脚本并生成所需的模型文件。 + +## 4 编译与运行 +### 4.1 编译 + +``` +bash build.sh +``` + +### 4.2运行 +``` +./main test.jpg +``` \ No newline at end of file -- Gitee From 7fd84c10c557003894bf71bbd3d1536b9afb9493 Mon Sep 17 00:00:00 2001 From: xuegangxiao Date: Fri, 31 Mar 2023 11:26:45 +0800 Subject: [PATCH 45/61] =?UTF-8?q?readme=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tutorials/mxBaseVideoSample/README.md | 33 +++++++++++++-------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/tutorials/mxBaseVideoSample/README.md b/tutorials/mxBaseVideoSample/README.md index 877f66eae..59bbe8991 100644 --- a/tutorials/mxBaseVideoSample/README.md +++ b/tutorials/mxBaseVideoSample/README.md @@ -1,12 +1,12 @@ # 基于MxBase 的yolov3视频流推理样例 -## 介绍 +## 1 介绍 本开发样例是基于mxBase开发的端到端推理的C++应用程序,可在昇腾芯片上实现视频流的目标检测,并把可视化结果保存到本地。 -### 准备工作 +## 2 准备工作 -> 模型转换 +### 2.1 模型转换 **步骤1** 在ModelZoo上下载YOLOv3模型。[下载地址](https://www.hiascend.com/zh/software/modelzoo/detail/1/ba2a4c054a094ef595da288ecbc7d7b4) @@ -25,14 +25,14 @@ ``` -# 执行,转换YOLOv3模型 -# Execute, transform YOLOv3 model. - +### 2.2 执行转换YOLOv3模型 +``` atc --model=./yolov3_tf.pb --framework=3 --output=./yolov3_tf_bs1_fp16 --soc_version=Ascend310 --insert_op_conf=./aipp_yolov3_416_416.aippconfig --input_shape="input:1,416,416,3" --out_nodes="yolov3/yolov3_head/Conv_6/BiasAdd:0;yolov3/yolov3_head/Conv_14/BiasAdd:0;yolov3/yolov3_head/Conv_22/BiasAdd:0" -# 说明1:out_nodes制定了输出节点的顺序,需要与模型后处理适配。 -# 说明2:若用例执行在310B上,则--soc_version=Ascend310需修改为Ascend310B1 - ``` +> 说明1:out_nodes制定了输出节点的顺序,需要与模型后处理适配。 + +> 说明2:若用例执行在310B上,则--soc_version=Ascend310需修改为Ascend310B1 + 执行完模型转换脚本后,会生成相应的.om模型文件。 执行完模型转换脚本后,会生成相应的.om模型文件。 @@ -40,7 +40,7 @@ atc --model=./yolov3_tf.pb --framework=3 --output=./yolov3_tf_bs1_fp16 --soc_ver https://gitee.com/ascend/docs-openmind/blob/master/guide/mindx/sdk/tutorials/%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99.md -> 相关参数修改 +### 2.3 相关参数修改 main.cpp文件中,添加模型路径与 rtsp 流源地址(需要自行准备可用的视频流,视频流格式为H264) @@ -60,7 +60,7 @@ const uint32_t VIDEO_WIDTH = {视频宽度}; const uint32_t VIDEO_HEIGHT = {视频高度}; ``` -### 配置环境变量 +### 2.4 配置环境变量 ``` # 执行如下命令,打开.bashrc文件 @@ -79,7 +79,7 @@ source ~/.bashrc env ``` -### 配置CMakeLists +### 2.5 配置CMakeLists 配置CMakeLists.txt文件中的`MX_SDK_HOME`与`FFMPEG_PATH`环境变量 @@ -88,8 +88,8 @@ set(MX_SDK_HOME {SDK实际安装路径}) set(FFMPEG_PATH {ffmpeg安装路径}) ``` -### 编译项目文件 - +## 3. 编译与运行 +### 3.1编译 新建立build目录,进入build执行cmake ..(..代表包含CMakeLists.txt的源文件父目录),在build目录下生成了编译需要的Makefile和中间文件。执行make构建工程,构建成功后就会生成可执行文件。 ``` @@ -110,9 +110,8 @@ Scanning dependencies of target stream_pull_test # stream_pull_test就是CMakeLists文件中指定生成的可执行文件。 ``` -### 执行脚本 - -执行run.sh脚本前请先确认可执行文件stream_pull_test已生成,并给脚本添加可执行权限。 +### 3.2 运行 +在当前目录创建result目录并执行run.sh脚本前请先确认可执行文件stream_pull_test已生成,并给脚本添加可执行权限。 ``` bash run.sh -- Gitee From 895153a652879affa29c43fe3651df3c9d1545c0 Mon Sep 17 00:00:00 2001 From: DlinR Date: Fri, 31 Mar 2023 11:27:28 +0800 Subject: [PATCH 46/61] no message --- contrib/human_segmentation/main.cpp | 20 ++++++++++---------- tutorials/DvppWrapperSample/main.cpp | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/contrib/human_segmentation/main.cpp b/contrib/human_segmentation/main.cpp index e77499ec1..770d2bf58 100644 --- a/contrib/human_segmentation/main.cpp +++ b/contrib/human_segmentation/main.cpp @@ -37,19 +37,19 @@ static APP_ERROR readfile(const std::string& filePath, MxStream::MxstDataInput& { char c[PATH_MAX + 1] = {0x00}; size_t count = filePath.copy(c, PATH_MAX +1); - if(count != filePath.length()){ + if (count != filePath.length()) { LogError << "Failed to copy file path(" << c << ")."; return APP_ERR_COMM_FAILURE; } // Gets the absolute path to the file char path[PATH_MAX + 1] = { 0x00 }; - if((strlen(c) > PATH_MAX) || (realpath(c,path) == nullptr)){ + if ((strlen(c) > PATH_MAX) || (realpath(c,path) == nullptr)) { LogError << "Failed to get image, the image path is (" << filePath << ")."; return APP_ERR_COMM_NO_EXIST; } // Open the file FILE *fp = fopen(path, "rb"); - if(fp == nullptr){ + if (fp == nullptr) { LogError << "Failed to open file (" << path << ")."; return APP_ERR_COMM_OPEN_FAIL; } @@ -58,16 +58,16 @@ static APP_ERROR readfile(const std::string& filePath, MxStream::MxstDataInput& long fileSize = ftell(fp); fseek(fp, 0, SEEK_SET); // If the contents of the file are not empty, write the contents of the file to dataBuffer - if(fileSize > 0){ + if (fileSize > 0) { dataBuffer.dataSize = fileSize; dataBuffer.dataPtr = new (std::nothrow) uint32_t[fileSize]; // Memory is allocated based on file length - if(dataBuffer.dataPtr == nullptr){ + if (dataBuffer.dataPtr == nullptr) { LogError << "allocate memory with \"new uint32_t\" failed."; fclose(fp); return APP_ERR_COMM_FAILURE; } uint32_t readRet = fread(dataBuffer.dataPtr, 1, fileSize, fp); - if(readRet <= 0){ + if (readRet <= 0) { fclose(fp); return APP_ERR_COMM_READ_FAIL; } @@ -83,7 +83,7 @@ static std::string readpipelineconfig(const std::string &pipelineConfigPath) { // Open the file in binary mode std::ifstream file(pipelineConfigPath.c_str(), std::ifstream::binary); - if(!file){ + if (!file) { LogError << pipelineConfigPath << " file is not exists"; return ""; } @@ -150,7 +150,7 @@ void SemanticsegOutput(const std::vector& tensors, for (uint32_t y = 0; y < inputModelHeight; y++) { for (uint32_t x = 0; x < inputModelWidth; x++) { float* begin = tensorPtr + y * outputModelWidth * classNum_ + x * classNum_; - results[y][x] = (*begin)*2; + results[y][x] = (*begin) * OBJECT_VALUE; count++; } } @@ -234,7 +234,7 @@ int main(int argc, char* argv[]) std::string inputPicPath = "./data/"+inputPicname; unsigned long idx = inputPicname.find(".jpg"); - if(idx == std::string::npos ){ + if (idx == std::string::npos) { LogError << "The input is incorrect\n"; return 0; } @@ -242,7 +242,7 @@ int main(int argc, char* argv[]) // Read the test.pipeline file information std::string pipelineConfigPath = "./test.pipeline"; std::string pipelineConfig = readpipelineconfig(pipelineConfigPath); - if(pipelineConfig == ""){ + if (pipelineConfig == "") { return APP_ERR_COMM_INIT_FAIL; } std::string streamName = "detection"; diff --git a/tutorials/DvppWrapperSample/main.cpp b/tutorials/DvppWrapperSample/main.cpp index 0f54a5d32..0e1daa12b 100644 --- a/tutorials/DvppWrapperSample/main.cpp +++ b/tutorials/DvppWrapperSample/main.cpp @@ -173,7 +173,7 @@ namespace { uint32_t x1 = (uint32_t)input.width * THREE_QUARTER; uint32_t y1 = (uint32_t)input.height * THREE_QUARTER; uint32_t y0 = (uint32_t)input.height * ONE_QUARTER; - CropRoiConfig config{x0, x1, y1, y0}; + CropRoiConfig config {x0, x1, y1, y0}; ret = g_dvppCommon->VpcCrop(input, output, config); if (ret != APP_ERR_OK) { LogError << "Failed to crop file: " << filepath; -- Gitee From bbf0ae937f7407378d0d511b1d5e3b10a5848bf9 Mon Sep 17 00:00:00 2001 From: DlinR Date: Fri, 31 Mar 2023 13:34:56 +0800 Subject: [PATCH 47/61] no message --- contrib/human_segmentation/main.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/contrib/human_segmentation/main.cpp b/contrib/human_segmentation/main.cpp index 770d2bf58..1ca62edee 100644 --- a/contrib/human_segmentation/main.cpp +++ b/contrib/human_segmentation/main.cpp @@ -43,7 +43,7 @@ static APP_ERROR readfile(const std::string& filePath, MxStream::MxstDataInput& } // Gets the absolute path to the file char path[PATH_MAX + 1] = { 0x00 }; - if ((strlen(c) > PATH_MAX) || (realpath(c,path) == nullptr)) { + if ((strlen(c) > PATH_MAX) || (realpath(c, path) == nullptr)) { LogError << "Failed to get image, the image path is (" << filePath << ")."; return APP_ERR_COMM_NO_EXIST; } @@ -199,7 +199,7 @@ APP_ERROR SaveResult(const std::shared_ptr mxpiVisionLi memorySrc.ptrData = (void*)visionData.dataptr(); MxBase::MemoryData memoryDst(visionData.datasize(), MxBase::MemoryData::MEMORY_HOST_NEW); ret = MxBase::MemoryHelper::MxbsMallocAndCopy(memoryDst, memorySrc); - if(ret != APP_ERR_OK){ + if (ret != APP_ERR_OK) { LogError << "Fail to malloc and copy host memory."; return ret; } @@ -210,7 +210,7 @@ APP_ERROR SaveResult(const std::shared_ptr mxpiVisionLi for (uint32_t i = 0; i < semanticSegInfos.size(); i++) { cv::Mat maskRGB = cv::Mat(size, CV_8UC3); ret = DrawPixels(semanticSegInfos[i].pixels, size, maskRGB); - if(ret != APP_ERR_OK) { + if (ret != APP_ERR_OK) { LogError << "Draw mask failed"; return ret; } @@ -233,7 +233,6 @@ int main(int argc, char* argv[]) std::string inputPicname = "test.jpg"; std::string inputPicPath = "./data/"+inputPicname; unsigned long idx = inputPicname.find(".jpg"); - if (idx == std::string::npos) { LogError << "The input is incorrect\n"; return 0; @@ -249,7 +248,7 @@ int main(int argc, char* argv[]) // Create a new stream management MxStreamManager object and initialize it auto mxStreamManager = std::make_shared(); APP_ERROR ret = mxStreamManager->InitManager(); // Initialize the flow management tool - if(ret != APP_ERR_OK){ + if (ret != APP_ERR_OK) { LogError << GetError(ret) << "Fail to init Stream manager."; return ret; } @@ -270,7 +269,7 @@ int main(int argc, char* argv[]) // The input information is passed through the SendData function to the specified working element module // StreamName is the name of the business flow in the pipeline file ret = mxStreamManager->SendData(streamName, 0, dataBuffer); - if(ret != APP_ERR_OK){ + if (ret != APP_ERR_OK) { delete dataBuffer.dataPtr; LogError << "Fail to send data to stream, ret = " << ret << "."; return ret; -- Gitee From acb7605578dcbd51d19a80f20c12162b28697faf Mon Sep 17 00:00:00 2001 From: zhangdingwen Date: Fri, 31 Mar 2023 14:55:17 +0800 Subject: [PATCH 48/61] =?UTF-8?q?310B=E9=80=82=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contrib/BertTextClassification/README.md | 75 +- .../BertClassification/BertClassification.cpp | 290 - .../BertClassification/BertClassification.h | 40 - .../mxBase/CMakeLists.txt | 35 - .../BertTextClassification/mxBase/build.sh | 54 - .../mxBase/data/vocab.txt | 21128 ---------------- .../BertTextClassification/mxBase/main.cpp | 94 - .../bert_text_classification_labels.names | 5 - .../mxBase/out/prediction_label.txt | 0 .../mxBase/test/Test.cpp | 151 - .../BertTextClassification/mxBase/test/Test.h | 19 - .../pipeline/BertTextClassification.pipeline | 2 +- contrib/Collision/README.md | 66 +- contrib/MMNET/README.md | 18 +- .../PedestrianAttributeRecognition/README.md | 36 +- .../pipeline/test.pipeline | 2 +- contrib/PixelLink/README.md | 32 +- 17 files changed, 68 insertions(+), 21979 deletions(-) delete mode 100644 contrib/BertTextClassification/mxBase/BertClassification/BertClassification.cpp delete mode 100644 contrib/BertTextClassification/mxBase/BertClassification/BertClassification.h delete mode 100644 contrib/BertTextClassification/mxBase/CMakeLists.txt delete mode 100644 contrib/BertTextClassification/mxBase/build.sh delete mode 100644 contrib/BertTextClassification/mxBase/data/vocab.txt delete mode 100644 contrib/BertTextClassification/mxBase/main.cpp delete mode 100644 contrib/BertTextClassification/mxBase/model/bert_text_classification_labels.names delete mode 100644 contrib/BertTextClassification/mxBase/out/prediction_label.txt delete mode 100644 contrib/BertTextClassification/mxBase/test/Test.cpp delete mode 100644 contrib/BertTextClassification/mxBase/test/Test.h diff --git a/contrib/BertTextClassification/README.md b/contrib/BertTextClassification/README.md index 877a73156..23a88a785 100644 --- a/contrib/BertTextClassification/README.md +++ b/contrib/BertTextClassification/README.md @@ -11,8 +11,10 @@ ### 1.2 支持的版本 -支持的SDK版本为2.0.4。 -支持的CANN版本为5.0.4。 +| 软件名称 | 版本 | +| -------- | ------ | +| MindX SDK | 5.0RC1 | +| CANN | 310使用6.3.RC1
    310B使用6.2.RC1 | ### 1.3 软件方案介绍 @@ -38,28 +40,6 @@ │ build.sh │ README.md │ tree.txt -│ -├─mxBase -│ │ build.sh -│ │ CMakeLists.txt -│ │ main.cpp -│ │ -│ ├─BertClassification -│ │ BertClassification.cpp -│ │ BertClassification.h -│ │ -│ ├─data -│ │ vocab.txt -│ │ -│ ├─model -│ │ bert_text_classification_labels.names -│ │ -│ ├─out -│ │ prediction_label.txt -│ │ -│ └─test -│ Test.cpp -│ Test.h │ └─sdk │ build.sh @@ -103,7 +83,6 @@ | 软件名称 | 版本 | | -------- | ------ | | cmake | 3.10.2 | -| mxVision | 2.0.4 | | python | 3.9.2 | 确保环境中正确安装mxVision SDK。 @@ -111,25 +90,14 @@ 在编译运行项目前,需要设置环境变量: ``` -export MX_SDK_HOME=${SDK安装路径}/mxVision -export LD_LIBRARY_PATH=${MX_SDK_HOME}/lib:${MX_SDK_HOME}/opensource/lib:${MX_SDK_HOME}/opensource/lib64:/usr/local/Ascend/ascend-toolkit/latest/acllib/lib64:/usr/local/Ascend/driver/lib64:${LD_LIBRARY_PATH} -export PYTHONPATH=${MX_SDK_HOME}/python:${PYTHONPATH} - -export install_path=/usr/local/Ascend/ascend-toolkit/latest -export PATH=/usr/local/python3.9.2/bin:${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATH -export LD_LIBRARY_PATH=${install_path}/atc/lib64:$LD_LIBRARY_PATH -export ASCEND_OPP_PATH=${install_path}/opp +. /usr/local/Ascend/ascend-toolkit/set_env.sh #toolkit默认安装路径,根据实际安装路径修改 +. ${SDK_INSTALL_PATH}/mxVision/set_env.sh ``` - 环境变量介绍 ``` -MX_SDK_HOME:MindX SDK mxVision的根安装路径,用于包含MindX SDK提供的所有库和头文件。 -LD_LIBRARY_PATH:提供了MindX SDK已开发的插件和相关的库信息。 -install_path:ascend-toolkit的安装路径。 -PATH:添加python的执行路径和atc转换工具的执行路径。 -LD_LIBRARY_PATH:添加ascend-toolkit和MindX SDK提供的库目录路径。 -ASCEND_OPP_PATH:atc转换工具需要的目录。 +SDK_INSTALL_PATH:MindX SDK mxVision的根安装路径,用于包含MindX SDK提供的所有库和头文件。 ``` ## 3 模型转换 @@ -141,13 +109,13 @@ ASCEND_OPP_PATH:atc转换工具需要的目录。 cd $HOME/models/bert_text_classification -atc --model=bert_text_classification.pb --framework=3 --input_format="ND" --output=bert_text_classification --input_shape="input_1:1,300;input_2:1,300" --out_nodes=dense_1/Softmax:0 --soc_version=Ascend310 --op_select_implmode="high_precision" +atc --model=bert_text_classification.pb --framework=3 --input_format="ND" --output=bert_text_classification --input_shape="input_1:1,300;input_2:1,300" --out_nodes=dense_1/Softmax:0 --soc_version=Ascend310B1 --op_select_implmode="high_precision" +此命令适用于310B1硬件,使用310时指定soc_version=Ascend310 **步骤3** 执行以下命令将转换好的模型复制到项目中model文件夹中: ``` cp ./bert_text_classification.om $HOME/sdk/model/ -cp ./bert_text_classification.om $HOME/mxBase/model/ ``` **步骤4** 执行成功后终端输出为: @@ -168,9 +136,6 @@ ATC run success, welcome to the next use. **步骤4** 将本项目代码的文件路径中出现的 ${SDK目录} 替换成自己SDK的存放目录,下面是需要替换的代码。 ``` -mxBase目录下的CMakeList.txt中的第13行代码: -set(MX_SDK_HOME ${SDK目录}) - sdk/pipeline目录下BertTextClassification.pipeline文件中的第26行: "postProcessLibPath": "${SDK目录}/lib/modelpostprocessors/libresnet50postprocess.so" ``` @@ -183,22 +148,6 @@ python3 main.py 命令执行成功后在out目录下生成分类结果文件 prediction_label.txt,查看结果文件验证分类结果。 -**步骤6** mxBase项目在mxBase目录中,执行以下代码进行编译。 - -``` -mkdir build -cd build -cmake .. -make -``` - -编译完成后,将可执行文件 mxBase_text_classification 移动到mxBase目录下,执行下面代码运行 - -``` -./mxBase_text_classification ./data/sample.txt -``` - -执行成功后在服务器的mxBase/out目录下生成分类结果文件 prediction_label.txt,查看结果文件验证分类结果。 ## 5 精度测试 @@ -212,11 +161,5 @@ make python3 test.py ``` -**步骤4** mxBase项目中,将mxBase目录下main.cpp中main方法的全部代码注释,替换为下面代码后执行(即main函数中仅包含以下代码),得到mxBase的精度测试结果。 - -``` -Test::test_accuracy(); -``` - ## 6 其他问题 1.本项目的设计为限制输入样例为txt文件,其他文件如图片、音频输入则会报错。 \ No newline at end of file diff --git a/contrib/BertTextClassification/mxBase/BertClassification/BertClassification.cpp b/contrib/BertTextClassification/mxBase/BertClassification/BertClassification.cpp deleted file mode 100644 index 2e4671c6c..000000000 --- a/contrib/BertTextClassification/mxBase/BertClassification/BertClassification.cpp +++ /dev/null @@ -1,290 +0,0 @@ -/* - * Copyright(C) 2021. Huawei Technologies Co.,Ltd. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "BertClassification.h" -#include "MxBase/DeviceManager/DeviceManager.h" -#include -#include - -namespace { - const float TEXT_START_CODE = 101.0; - const float TEXT_END_CODE = 102.0; - const float TEXT_NOT_FOUND_CODE = 100.0; - const int FLOAT32_BYTES = 4; -} - -// Initialize the dictionary of character encoding. -APP_ERROR BertClassification::InitTokenMap(const std::string &vocabTextPath, std::map &tokenMap) { - const std::string text; - std::ifstream infile; - // Open label file. - infile.open(vocabTextPath, std::ios_base::in); - if(!infile.is_open ()) { - std::cout << "Open " << vocabTextPath << " file failure!" << std::endl; - return APP_ERR_COMM_OPEN_FAIL; - } - - std::string s; - int count = 0; - while (std::getline(infile, s)) { - tokenMap.insert(std::pair(s, count)); - count++; - } - infile.close(); - return APP_ERR_OK; -} - -// Load the label file. -APP_ERROR BertClassification::LoadLabels(const std::string &labelPath, std::map &labelMap) { - std::ifstream infile; - // Open label file. - infile.open(labelPath, std::ios_base::in); - std::string s; - // Check label file validity. - if (infile.fail()) { - LogError << "Failed to open label file: " << labelPath << "."; - return APP_ERR_COMM_OPEN_FAIL; - } - labelMap.clear(); - // Construct label map. - int count = 0; - while (std::getline(infile, s)) { - size_t eraseIndex = s.find_last_not_of("\r\n\t"); - if (eraseIndex != std::string::npos) { - s.erase(eraseIndex + 1, s.size() - eraseIndex); - } - labelMap.insert(std::pair(count, s)); - count++; - } - infile.close(); - return APP_ERR_OK; -} - -APP_ERROR BertClassification::Init(const InitParam &initParam) { - deviceId_ = initParam.deviceId; - maxLength_ = initParam.maxLength; - labelNumber_ = initParam.labelNumber; - APP_ERROR ret = MxBase::DeviceManager::GetInstance()->InitDevices(); - if (ret != APP_ERR_OK) { - LogError << "Init devices failed, ret=" << ret << "."; - return ret; - } - ret = MxBase::TensorContext::GetInstance()->SetContext(initParam.deviceId); - if (ret != APP_ERR_OK) { - LogError << "Set context failed, ret=" << ret << "."; - return ret; - } - // Load TokenMap. - ret = InitTokenMap(initParam.vocabTextPath, tokenMap_); - if (ret != APP_ERR_OK) { - LogError << "Failed to load tokenMap, ret=" << ret << "."; - return ret; - } - model_ = std::make_shared(); - ret = model_->Init(initParam.modelPath, modelDesc_); - if (ret != APP_ERR_OK) { - LogError << "ModelInferenceProcessor init failed, ret=" << ret << "."; - return ret; - } - - // Load labels from file. - ret = LoadLabels(initParam.labelPath, labelMap_); - if (ret != APP_ERR_OK) { - LogError << "Failed to load labels, ret=" << ret << "."; - return ret; - } - return APP_ERR_OK; -} - -APP_ERROR BertClassification::DeInit() { - model_->DeInit(); - MxBase::DeviceManager::GetInstance()->DestroyDevices(); - return APP_ERR_OK; -} - -std::vector split_chinese(std::string s) { - std::vector words; - for (size_t i = 0; i < s.length();) { - int cplen = 1; - // The following if-statements are referred to https://en.wikipedia.org/wiki/UTF-8#Description. - if ((s[i] & 0xf8) == 0xf0) - cplen = 4; - else if ((s[i] & 0xf0) == 0xe0) - cplen = 3; - else if ((s[i] & 0xe0) == 0xc0) - cplen = 2; - if ((i + cplen) > s.length()) - cplen = 1; - words.push_back(s.substr(i, cplen)); - i += cplen; - } - return words; -} - -APP_ERROR BertClassification::TextToTensor(const std::string &text, std::vector &inputs) { - MxBase::TensorBase tensor1, tensor2; - std::vector shape = {1, maxLength_}; - std::map::iterator iter; - uint32_t i, value, size, end_index; - std::vector words = split_chinese(text); - - float* tensor1Data = new float [maxLength_]; - // Init data. - for (i = 0;i < maxLength_; i++) { - tensor1Data[i] = 0.0; - } - - size = words.size(); - if (size > maxLength_) { - // Remove start and end characters, length is 2. - size = maxLength_ - 2; - end_index = maxLength_ - 1; - } else { - end_index = size - 1; - } - - tensor1Data[0] = TEXT_START_CODE; - // Text decode. - for (i = 0;i < size; i++) { - iter = tokenMap_.find(words[i]); - if (iter != tokenMap_.end()) { - value = iter->second; - tensor1Data[i+1] = float(value); - } else { - tensor1Data[i+1] = TEXT_NOT_FOUND_CODE; - } - } - tensor1Data[end_index] = TEXT_END_CODE; - - MxBase::MemoryData memoryData1((void*)tensor1Data, maxLength_ * FLOAT32_BYTES, - MxBase::MemoryData::MemoryType::MEMORY_HOST_NEW, deviceId_); - MxBase::MemoryData deviceData1(maxLength_ * FLOAT32_BYTES,MxBase::MemoryData::MEMORY_DEVICE, deviceId_); - // Move data from Host to Device. - APP_ERROR ret = MxBase::MemoryHelper::MxbsMallocAndCopy(deviceData1, memoryData1); - if (ret != APP_ERR_OK) { - LogError << "Failed to MxbsMallocAndCopy"; - return ret; - } - tensor1 = MxBase::TensorBase(deviceData1, false, shape, MxBase::TENSOR_DTYPE_FLOAT32); - inputs.push_back(tensor1); - - // Init second tensor. - float* tensor2Data = new float [maxLength_]; - for (i = 0;i < maxLength_; i++) { - tensor2Data[i] = 0.0; - } - MxBase::MemoryData memoryData2((void*)tensor2Data, maxLength_ * FLOAT32_BYTES, - MxBase::MemoryData::MemoryType::MEMORY_HOST_NEW, deviceId_); - MxBase::MemoryData deviceData2(maxLength_ * FLOAT32_BYTES,MxBase::MemoryData::MEMORY_DEVICE, deviceId_); - ret = MxBase::MemoryHelper::MxbsMallocAndCopy(deviceData2, memoryData2); - if (ret != APP_ERR_OK) { - LogError << "Failed to MxbsMallocAndCopy"; - return ret; - } - tensor2 = MxBase::TensorBase(deviceData2, false, shape, MxBase::TENSOR_DTYPE_FLOAT32); - inputs.push_back(tensor2); - // Release memory. - delete[] tensor1Data; - delete[] tensor2Data; - return APP_ERR_OK; -} - -APP_ERROR BertClassification::Inference(const std::vector &inputs, - std::vector &outputs) { - auto dtypes = model_->GetOutputDataType(); - std::vector shape = {1, labelNumber_}; - - MxBase::TensorBase tensor(shape, dtypes[0], MxBase::MemoryData::MemoryType::MEMORY_DEVICE, - deviceId_); - APP_ERROR ret = MxBase::TensorBase::TensorBaseMalloc(tensor); - if (ret != APP_ERR_OK) { - LogError << "TensorBaseMalloc failed, ret=" << ret << "."; - return ret; - } - // Put tensor into outputs. - outputs.push_back(tensor); - - MxBase::DynamicInfo dynamicInfo = {}; - // Set type STATIC_BATCH - dynamicInfo.dynamicType = MxBase::DynamicType::STATIC_BATCH; - ret = model_->ModelInference(inputs, outputs, dynamicInfo); - - if (ret != APP_ERR_OK) { - LogError << "ModelInference failed, ret=" << ret << "."; - return ret; - } - return APP_ERR_OK; -} - -APP_ERROR BertClassification::PostProcess(const std::vector &outputs, std::string &label) { - uint32_t i; - uint32_t maxIndex = 0; - float maxValue = 0; - MxBase::TensorBase outTensor = outputs[0]; - outTensor.ToHost(); - // Inference result is tensor(1*5). - float* inferResult = (float *)outTensor.GetBuffer(); - // Find the category with the highest probability. - for (i = 0;i < labelNumber_;i++) { - if (inferResult[i] > maxValue) { - maxValue = inferResult[i]; - maxIndex = i; - } - } - // Get label. - label = labelMap_.at(maxIndex); - return APP_ERR_OK; -} - -APP_ERROR BertClassification::WriteResult(std::string &label) { - std::ofstream ofs; - ofs.open("out/prediction_label.txt", std::ios::out); - ofs << label; - ofs.close(); - return APP_ERR_OK; -} - -APP_ERROR BertClassification::Process(const std::string &text, std::string &label) { - std::vector inputs = {}; - std::vector outputs = {}; - // Convert text to tensor. - APP_ERROR ret = TextToTensor(text, inputs); - if (ret != APP_ERR_OK) { - LogError << "ReadText failed, ret=" << ret << "."; - return ret; - } - - ret = Inference(inputs, outputs); - if (ret != APP_ERR_OK) { - LogError << "Inference failed, ret=" << ret << "."; - return ret; - } - - // Get classification results. - ret = PostProcess(outputs, label); - if (ret != APP_ERR_OK) { - LogError << "PostProcess failed, ret=" << ret << "."; - return ret; - } - - // Write results to file. - ret = WriteResult(label); - if (ret != APP_ERR_OK) { - LogError << "Save result failed, ret=" << ret << "."; - return ret; - } - return APP_ERR_OK; -} diff --git a/contrib/BertTextClassification/mxBase/BertClassification/BertClassification.h b/contrib/BertTextClassification/mxBase/BertClassification/BertClassification.h deleted file mode 100644 index e1fa8df71..000000000 --- a/contrib/BertTextClassification/mxBase/BertClassification/BertClassification.h +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef MXBASE_TEXT_CLASSIFICATION_BERTCLASSIFICATION_H -#define MXBASE_TEXT_CLASSIFICATION_BERTCLASSIFICATION_H - -#include "MxBase/ModelInfer/ModelInferenceProcessor.h" -#include "MxBase/Tensor/TensorContext/TensorContext.h" - -struct InitParam { - uint32_t deviceId; - std::string labelPath; - std::string modelPath; - std::string vocabTextPath; - uint32_t maxLength; - uint32_t labelNumber; -}; - -class BertClassification { -public: - APP_ERROR InitTokenMap(const std::string &vocabTextPath, std::map &tokenMap); - APP_ERROR LoadLabels(const std::string &labelPath, std::map &labelMap); - APP_ERROR Init(const InitParam &initParam); - APP_ERROR DeInit(); - APP_ERROR Inference(const std::vector &inputs, std::vector &outputs); - APP_ERROR PostProcess(const std::vector &outputs, std::string &label); - APP_ERROR Process(const std::string &textPath, std::string &label); - APP_ERROR TextToTensor(const std::string &text, std::vector &inputs); - APP_ERROR WriteResult(std::string &label); -private: - std::shared_ptr model_; - MxBase::ModelDesc modelDesc_ = {}; - std::map labelMap_ = {}; - std::map tokenMap_ = {}; - uint32_t deviceId_ = 0; - // Maximum length of input sentence. - uint32_t maxLength_ = 300; - // Number of tags for inference results. - uint32_t labelNumber_ = 5; -}; - - -#endif // MXBASE_TEXT_CLASSIFICATION_BERTCLASSIFICATION_H diff --git a/contrib/BertTextClassification/mxBase/CMakeLists.txt b/contrib/BertTextClassification/mxBase/CMakeLists.txt deleted file mode 100644 index 44d276ad6..000000000 --- a/contrib/BertTextClassification/mxBase/CMakeLists.txt +++ /dev/null @@ -1,35 +0,0 @@ -cmake_minimum_required(VERSION 3.10) -project(mxBase_text_classification) - -set(CMAKE_CXX_STANDARD 14) -include_directories(./BertClassification) -file(GLOB_RECURSE BertClassification ${PROJECT_SOURCE_DIR}/BertClassification/*cpp) -include_directories(./test) -file(GLOB_RECURSE Test ${PROJECT_SOURCE_DIR}/test/*cpp) -set(TARGET mxBase_text_classification) -add_compile_options(-std=c++11 -fPIE -fstack-protector-all -fPIC -Wl,-z,relro,-z,now,-z,noexecstack -s -pie -Wall) -add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0 -Dgoogle=mindxsdk_private) - -set(MX_SDK_HOME ${SDK目录}) -include_directories( - ${MX_SDK_HOME}/include - ${MX_SDK_HOME}/opensource/include - ${MX_SDK_HOME}/opensource/include/opencv4 -) - -link_directories( - ${MX_SDK_HOME}/lib - ${MX_SDK_HOME}/opensource/lib - ${MX_SDK_HOME}/lib/modelpostprocessors - /usr/local/Ascend/ascend-toolkit/latest/acllib/lib64 - /usr/local/Ascend/driver/lib64/ -) - -add_executable(mxBase_text_classification main.cpp ${BertClassification} ${Test}) - -target_link_libraries(mxBase_text_classification - glog - mxbase - cpprest - opencv_world - ) \ No newline at end of file diff --git a/contrib/BertTextClassification/mxBase/build.sh b/contrib/BertTextClassification/mxBase/build.sh deleted file mode 100644 index 1fc7c0e4e..000000000 --- a/contrib/BertTextClassification/mxBase/build.sh +++ /dev/null @@ -1,54 +0,0 @@ -#!/bin/bash - -# Copyright(C) 2021. Huawei Technologies Co.,Ltd. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -path_cur="$(dirname "$0")" - -function check_env() -{ - # set ASCEND_VERSION to ascend-toolkit/latest when it was not specified by user - if [ ! "${ASCEND_VERSION}" ]; then - export ASCEND_VERSION=ascend-toolkit/latest - echo "Set ASCEND_VERSION to the default value: ${ASCEND_VERSION}" - else - echo "ASCEND_VERSION is set to ${ASCEND_VERSION} by user" - fi - - if [ ! "${ARCH_PATTERN}" ]; then - # set ARCH_PATTERN to ./ when it was not specified by user - export ARCH_PATTERN=./ - echo "ARCH_PATTERN is set to the default value: ${ARCH_PATTERN}" - else - echo "ARCH_PATTERN is set to ${ARCH_PATTERN} by user" - fi -} - -function build_bert_text_classification() -{ - cd "$path_cur" || exit - rm -rf build - mkdir -p build - cd build || exit - cmake .. - make - ret=$? - if [ ${ret} -ne 0 ]; then - echo "Failed to build mxBase_text_classification." - exit ${ret} - fi -} - -check_env -build_bert_text_classification \ No newline at end of file diff --git a/contrib/BertTextClassification/mxBase/data/vocab.txt b/contrib/BertTextClassification/mxBase/data/vocab.txt deleted file mode 100644 index ca4f97810..000000000 --- a/contrib/BertTextClassification/mxBase/data/vocab.txt +++ /dev/null @@ -1,21128 +0,0 @@ -[PAD] -[unused1] -[unused2] -[unused3] -[unused4] -[unused5] -[unused6] -[unused7] -[unused8] -[unused9] -[unused10] -[unused11] -[unused12] -[unused13] -[unused14] -[unused15] -[unused16] -[unused17] -[unused18] -[unused19] -[unused20] -[unused21] -[unused22] -[unused23] -[unused24] -[unused25] -[unused26] -[unused27] -[unused28] -[unused29] -[unused30] -[unused31] -[unused32] -[unused33] -[unused34] -[unused35] -[unused36] -[unused37] -[unused38] -[unused39] -[unused40] -[unused41] -[unused42] -[unused43] -[unused44] -[unused45] -[unused46] -[unused47] -[unused48] -[unused49] -[unused50] -[unused51] -[unused52] -[unused53] -[unused54] -[unused55] -[unused56] -[unused57] -[unused58] -[unused59] -[unused60] -[unused61] -[unused62] -[unused63] -[unused64] -[unused65] -[unused66] -[unused67] -[unused68] -[unused69] -[unused70] -[unused71] -[unused72] -[unused73] -[unused74] -[unused75] -[unused76] -[unused77] -[unused78] -[unused79] -[unused80] -[unused81] -[unused82] -[unused83] -[unused84] -[unused85] -[unused86] -[unused87] -[unused88] -[unused89] -[unused90] -[unused91] -[unused92] -[unused93] -[unused94] -[unused95] -[unused96] -[unused97] -[unused98] -[unused99] -[UNK] -[CLS] -[SEP] -[MASK] - - -! -" -# -$ -% -& -' -( -) -* -+ -, -- -. -/ -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -: -; -< -= -> -? -@ -[ -\ -] -^ -_ -a -b -c -d -e -f -g -h -i -j -k -l -m -n -o -p -q -r -s -t -u -v -w -x -y -z -{ -| -} -~ -£ -¤ -¥ -§ -© -« -® -° -± -² -³ -µ -· -¹ -º -» -¼ -× -ß -æ -÷ -ø -đ -ŋ -ɔ -ə -ɡ -ʰ -ˇ -ˈ -ˊ -ˋ -ˍ -ː -˙ -˚ -ˢ -α -β -γ -δ -ε -η -θ -ι -κ -λ -μ -ν -ο -π -ρ -ς -σ -τ -υ -φ -χ -ψ -ω -а -б -в -г -д -е -ж -з -и -к -л -м -н -о -п -р -с -т -у -ф -х -ц -ч -ш -ы -ь -я -і -ا -ب -ة -ت -د -ر -س -ع -ل -م -ن -ه -و -ي -۩ -ก -ง -น -ม -ย -ร -อ -า -เ -๑ -་ -ღ -ᄀ -ᄁ -ᄂ -ᄃ -ᄅ -ᄆ -ᄇ -ᄈ -ᄉ -ᄋ -ᄌ -ᄎ -ᄏ -ᄐ -ᄑ -ᄒ -ᅡ -ᅢ -ᅣ -ᅥ -ᅦ -ᅧ -ᅨ -ᅩ -ᅪ -ᅬ -ᅭ -ᅮ -ᅯ -ᅲ -ᅳ -ᅴ -ᅵ -ᆨ -ᆫ -ᆯ -ᆷ -ᆸ -ᆺ -ᆻ -ᆼ -ᗜ -ᵃ -ᵉ -ᵍ -ᵏ -ᵐ -ᵒ -ᵘ -‖ -„ -† -• -‥ -‧ -
 -‰ -′ -″ -‹ -› -※ -‿ -⁄ -ⁱ -⁺ -ⁿ -₁ -₂ -₃ -₄ -€ -℃ -№ -™ -ⅰ -ⅱ -ⅲ -ⅳ -ⅴ -← -↑ -→ -↓ -↔ -↗ -↘ -⇒ -∀ -− -∕ -∙ -√ -∞ -∟ -∠ -∣ -∥ -∩ -∮ -∶ -∼ -∽ -≈ -≒ -≡ -≤ -≥ -≦ -≧ -≪ -≫ -⊙ -⋅ -⋈ -⋯ -⌒ -① -② -③ -④ -⑤ -⑥ -⑦ -⑧ -⑨ -⑩ -⑴ -⑵ -⑶ -⑷ -⑸ -⒈ -⒉ -⒊ -⒋ -ⓒ -ⓔ -ⓘ -─ -━ -│ -┃ -┅ -┆ -┊ -┌ -└ -├ -┣ -═ -║ -╚ -╞ -╠ -╭ -╮ -╯ -╰ -╱ -╳ -▂ -▃ -▅ -▇ -█ -▉ -▋ -▌ -▍ -▎ -■ -□ -▪ -▫ -▬ -▲ -△ -▶ -► -▼ -▽ -◆ -◇ -○ -◎ -● -◕ -◠ -◢ -◤ -☀ -★ -☆ -☕ -☞ -☺ -☼ -♀ -♂ -♠ -♡ -♣ -♥ -♦ -♪ -♫ -♬ -✈ -✔ -✕ -✖ -✦ -✨ -✪ -✰ -✿ -❀ -❤ -➜ -➤ -⦿ -、 -。 -〃 -々 -〇 -〈 -〉 -《 -》 -「 -」 -『 -』 -【 -】 -〓 -〔 -〕 -〖 -〗 -〜 -〝 -〞 -ぁ -あ -ぃ -い -う -ぇ -え -お -か -き -く -け -こ -さ -し -す -せ -そ -た -ち -っ -つ -て -と -な -に -ぬ -ね -の -は -ひ -ふ -へ -ほ -ま -み -む -め -も -ゃ -や -ゅ -ゆ -ょ -よ -ら -り -る -れ -ろ -わ -を -ん -゜ -ゝ -ァ -ア -ィ -イ -ゥ -ウ -ェ -エ -ォ -オ -カ -キ -ク -ケ -コ -サ -シ -ス -セ -ソ -タ -チ -ッ -ツ -テ -ト -ナ -ニ -ヌ -ネ -ノ -ハ -ヒ -フ -ヘ -ホ -マ -ミ -ム -メ -モ -ャ -ヤ -ュ -ユ -ョ -ヨ -ラ -リ -ル -レ -ロ -ワ -ヲ -ン -ヶ -・ -ー -ヽ -ㄅ -ㄆ -ㄇ -ㄉ -ㄋ -ㄌ -ㄍ -ㄎ -ㄏ -ㄒ -ㄚ -ㄛ -ㄞ -ㄟ -ㄢ -ㄤ -ㄥ -ㄧ -ㄨ -ㆍ -㈦ -㊣ -㎡ -㗎 -一 -丁 -七 -万 -丈 -三 -上 -下 -不 -与 -丐 -丑 -专 -且 -丕 -世 -丘 -丙 -业 -丛 -东 -丝 -丞 -丟 -両 -丢 -两 -严 -並 -丧 -丨 -个 -丫 -中 -丰 -串 -临 -丶 -丸 -丹 -为 -主 -丼 -丽 -举 -丿 -乂 -乃 -久 -么 -义 -之 -乌 -乍 -乎 -乏 -乐 -乒 -乓 -乔 -乖 -乗 -乘 -乙 -乜 -九 -乞 -也 -习 -乡 -书 -乩 -买 -乱 -乳 -乾 -亀 -亂 -了 -予 -争 -事 -二 -于 -亏 -云 -互 -五 -井 -亘 -亙 -亚 -些 -亜 -亞 -亟 -亡 -亢 -交 -亥 -亦 -产 -亨 -亩 -享 -京 -亭 -亮 -亲 -亳 -亵 -人 -亿 -什 -仁 -仃 -仄 -仅 -仆 -仇 -今 -介 -仍 -从 -仏 -仑 -仓 -仔 -仕 -他 -仗 -付 -仙 -仝 -仞 -仟 -代 -令 -以 -仨 -仪 -们 -仮 -仰 -仲 -件 -价 -任 -份 -仿 -企 -伉 -伊 -伍 -伎 -伏 -伐 -休 -伕 -众 -优 -伙 -会 -伝 -伞 -伟 -传 -伢 -伤 -伦 -伪 -伫 -伯 -估 -伴 -伶 -伸 -伺 -似 -伽 -佃 -但 -佇 -佈 -位 -低 -住 -佐 -佑 -体 -佔 -何 -佗 -佘 -余 -佚 -佛 -作 -佝 -佞 -佟 -你 -佢 -佣 -佤 -佥 -佩 -佬 -佯 -佰 -佳 -併 -佶 -佻 -佼 -使 -侃 -侄 -來 -侈 -例 -侍 -侏 -侑 -侖 -侗 -供 -依 -侠 -価 -侣 -侥 -侦 -侧 -侨 -侬 -侮 -侯 -侵 -侶 -侷 -便 -係 -促 -俄 -俊 -俎 -俏 -俐 -俑 -俗 -俘 -俚 -保 -俞 -俟 -俠 -信 -俨 -俩 -俪 -俬 -俭 -修 -俯 -俱 -俳 -俸 -俺 -俾 -倆 -倉 -個 -倌 -倍 -倏 -們 -倒 -倔 -倖 -倘 -候 -倚 -倜 -借 -倡 -値 -倦 -倩 -倪 -倫 -倬 -倭 -倶 -债 -值 -倾 -偃 -假 -偈 -偉 -偌 -偎 -偏 -偕 -做 -停 -健 -側 -偵 -偶 -偷 -偻 -偽 -偿 -傀 -傅 -傍 -傑 -傘 -備 -傚 -傢 -傣 -傥 -储 -傩 -催 -傭 -傲 -傳 -債 -傷 -傻 -傾 -僅 -働 -像 -僑 -僕 -僖 -僚 -僥 -僧 -僭 -僮 -僱 -僵 -價 -僻 -儀 -儂 -億 -儆 -儉 -儋 -儒 -儕 -儘 -償 -儡 -優 -儲 -儷 -儼 -儿 -兀 -允 -元 -兄 -充 -兆 -兇 -先 -光 -克 -兌 -免 -児 -兑 -兒 -兔 -兖 -党 -兜 -兢 -入 -內 -全 -兩 -八 -公 -六 -兮 -兰 -共 -兲 -关 -兴 -兵 -其 -具 -典 -兹 -养 -兼 -兽 -冀 -内 -円 -冇 -冈 -冉 -冊 -册 -再 -冏 -冒 -冕 -冗 -写 -军 -农 -冠 -冢 -冤 -冥 -冨 -冪 -冬 -冯 -冰 -冲 -决 -况 -冶 -冷 -冻 -冼 -冽 -冾 -净 -凄 -准 -凇 -凈 -凉 -凋 -凌 -凍 -减 -凑 -凛 -凜 -凝 -几 -凡 -凤 -処 -凪 -凭 -凯 -凰 -凱 -凳 -凶 -凸 -凹 -出 -击 -函 -凿 -刀 -刁 -刃 -分 -切 -刈 -刊 -刍 -刎 -刑 -划 -列 -刘 -则 -刚 -创 -初 -删 -判 -別 -刨 -利 -刪 -别 -刮 -到 -制 -刷 -券 -刹 -刺 -刻 -刽 -剁 -剂 -剃 -則 -剉 -削 -剋 -剌 -前 -剎 -剐 -剑 -剔 -剖 -剛 -剜 -剝 -剣 -剤 -剥 -剧 -剩 -剪 -副 -割 -創 -剷 -剽 -剿 -劃 -劇 -劈 -劉 -劊 -劍 -劏 -劑 -力 -劝 -办 -功 -加 -务 -劣 -动 -助 -努 -劫 -劭 -励 -劲 -劳 -労 -劵 -効 -劾 -势 -勁 -勃 -勇 -勉 -勋 -勐 -勒 -動 -勖 -勘 -務 -勛 -勝 -勞 -募 -勢 -勤 -勧 -勳 -勵 -勸 -勺 -勻 -勾 -勿 -匀 -包 -匆 -匈 -匍 -匐 -匕 -化 -北 -匙 -匝 -匠 -匡 -匣 -匪 -匮 -匯 -匱 -匹 -区 -医 -匾 -匿 -區 -十 -千 -卅 -升 -午 -卉 -半 -卍 -华 -协 -卑 -卒 -卓 -協 -单 -卖 -南 -単 -博 -卜 -卞 -卟 -占 -卡 -卢 -卤 -卦 -卧 -卫 -卮 -卯 -印 -危 -即 -却 -卵 -卷 -卸 -卻 -卿 -厂 -厄 -厅 -历 -厉 -压 -厌 -厕 -厘 -厚 -厝 -原 -厢 -厥 -厦 -厨 -厩 -厭 -厮 -厲 -厳 -去 -县 -叁 -参 -參 -又 -叉 -及 -友 -双 -反 -収 -发 -叔 -取 -受 -变 -叙 -叛 -叟 -叠 -叡 -叢 -口 -古 -句 -另 -叨 -叩 -只 -叫 -召 -叭 -叮 -可 -台 -叱 -史 -右 -叵 -叶 -号 -司 -叹 -叻 -叼 -叽 -吁 -吃 -各 -吆 -合 -吉 -吊 -吋 -同 -名 -后 -吏 -吐 -向 -吒 -吓 -吕 -吖 -吗 -君 -吝 -吞 -吟 -吠 -吡 -否 -吧 -吨 -吩 -含 -听 -吭 -吮 -启 -吱 -吳 -吴 -吵 -吶 -吸 -吹 -吻 -吼 -吽 -吾 -呀 -呂 -呃 -呆 -呈 -告 -呋 -呎 -呐 -呓 -呕 -呗 -员 -呛 -呜 -呢 -呤 -呦 -周 -呱 -呲 -味 -呵 -呷 -呸 -呻 -呼 -命 -咀 -咁 -咂 -咄 -咆 -咋 -和 -咎 -咏 -咐 -咒 -咔 -咕 -咖 -咗 -咘 -咙 -咚 -咛 -咣 -咤 -咦 -咧 -咨 -咩 -咪 -咫 -咬 -咭 -咯 -咱 -咲 -咳 -咸 -咻 -咽 -咿 -哀 -品 -哂 -哄 -哆 -哇 -哈 -哉 -哋 -哌 -响 -哎 -哏 -哐 -哑 -哒 -哔 -哗 -哟 -員 -哥 -哦 -哧 -哨 -哩 -哪 -哭 -哮 -哲 -哺 -哼 -哽 -唁 -唄 -唆 -唇 -唉 -唏 -唐 -唑 -唔 -唠 -唤 -唧 -唬 -售 -唯 -唰 -唱 -唳 -唷 -唸 -唾 -啃 -啄 -商 -啉 -啊 -問 -啓 -啕 -啖 -啜 -啞 -啟 -啡 -啤 -啥 -啦 -啧 -啪 -啫 -啬 -啮 -啰 -啱 -啲 -啵 -啶 -啷 -啸 -啻 -啼 -啾 -喀 -喂 -喃 -善 -喆 -喇 -喉 -喊 -喋 -喎 -喏 -喔 -喘 -喙 -喚 -喜 -喝 -喟 -喧 -喪 -喫 -喬 -單 -喰 -喱 -喲 -喳 -喵 -営 -喷 -喹 -喺 -喻 -喽 -嗅 -嗆 -嗇 -嗎 -嗑 -嗒 -嗓 -嗔 -嗖 -嗚 -嗜 -嗝 -嗟 -嗡 -嗣 -嗤 -嗦 -嗨 -嗪 -嗬 -嗯 -嗰 -嗲 -嗳 -嗶 -嗷 -嗽 -嘀 -嘅 -嘆 -嘈 -嘉 -嘌 -嘍 -嘎 -嘔 -嘖 -嘗 -嘘 -嘚 -嘛 -嘜 -嘞 -嘟 -嘢 -嘣 -嘤 -嘧 -嘩 -嘭 -嘮 -嘯 -嘰 -嘱 -嘲 -嘴 -嘶 -嘸 -嘹 -嘻 -嘿 -噁 -噌 -噎 -噓 -噔 -噗 -噙 -噜 -噠 -噢 -噤 -器 -噩 -噪 -噬 -噱 -噴 -噶 -噸 -噹 -噻 -噼 -嚀 -嚇 -嚎 -嚏 -嚐 -嚓 -嚕 -嚟 -嚣 -嚥 -嚨 -嚮 -嚴 -嚷 -嚼 -囂 -囉 -囊 -囍 -囑 -囔 -囗 -囚 -四 -囝 -回 -囟 -因 -囡 -团 -団 -囤 -囧 -囪 -囫 -园 -困 -囱 -囲 -図 -围 -囹 -固 -国 -图 -囿 -圃 -圄 -圆 -圈 -國 -圍 -圏 -園 -圓 -圖 -團 -圜 -土 -圣 -圧 -在 -圩 -圭 -地 -圳 -场 -圻 -圾 -址 -坂 -均 -坊 -坍 -坎 -坏 -坐 -坑 -块 -坚 -坛 -坝 -坞 -坟 -坠 -坡 -坤 -坦 -坨 -坪 -坯 -坳 -坵 -坷 -垂 -垃 -垄 -型 -垒 -垚 -垛 -垠 -垢 -垣 -垦 -垩 -垫 -垭 -垮 -垵 -埂 -埃 -埋 -城 -埔 -埕 -埗 -域 -埠 -埤 -埵 -執 -埸 -培 -基 -埼 -堀 -堂 -堃 -堅 -堆 -堇 -堑 -堕 -堙 -堡 -堤 -堪 -堯 -堰 -報 -場 -堵 -堺 -堿 -塊 -塌 -塑 -塔 -塗 -塘 -塚 -塞 -塢 -塩 -填 -塬 -塭 -塵 -塾 -墀 -境 -墅 -墉 -墊 -墒 -墓 -増 -墘 -墙 -墜 -增 -墟 -墨 -墩 -墮 -墳 -墻 -墾 -壁 -壅 -壆 -壇 -壊 -壑 -壓 -壕 -壘 -壞 -壟 -壢 -壤 -壩 -士 -壬 -壮 -壯 -声 -売 -壳 -壶 -壹 -壺 -壽 -处 -备 -変 -复 -夏 -夔 -夕 -外 -夙 -多 -夜 -够 -夠 -夢 -夥 -大 -天 -太 -夫 -夭 -央 -夯 -失 -头 -夷 -夸 -夹 -夺 -夾 -奂 -奄 -奇 -奈 -奉 -奋 -奎 -奏 -奐 -契 -奔 -奕 -奖 -套 -奘 -奚 -奠 -奢 -奥 -奧 -奪 -奬 -奮 -女 -奴 -奶 -奸 -她 -好 -如 -妃 -妄 -妆 -妇 -妈 -妊 -妍 -妒 -妓 -妖 -妘 -妙 -妝 -妞 -妣 -妤 -妥 -妨 -妩 -妪 -妮 -妲 -妳 -妹 -妻 -妾 -姆 -姉 -姊 -始 -姍 -姐 -姑 -姒 -姓 -委 -姗 -姚 -姜 -姝 -姣 -姥 -姦 -姨 -姪 -姫 -姬 -姹 -姻 -姿 -威 -娃 -娄 -娅 -娆 -娇 -娉 -娑 -娓 -娘 -娛 -娜 -娟 -娠 -娣 -娥 -娩 -娱 -娲 -娴 -娶 -娼 -婀 -婁 -婆 -婉 -婊 -婕 -婚 -婢 -婦 -婧 -婪 -婭 -婴 -婵 -婶 -婷 -婺 -婿 -媒 -媚 -媛 -媞 -媧 -媲 -媳 -媽 -媾 -嫁 -嫂 -嫉 -嫌 -嫑 -嫔 -嫖 -嫘 -嫚 -嫡 -嫣 -嫦 -嫩 -嫲 -嫵 -嫻 -嬅 -嬉 -嬌 -嬗 -嬛 -嬢 -嬤 -嬪 -嬰 -嬴 -嬷 -嬸 -嬿 -孀 -孃 -子 -孑 -孔 -孕 -孖 -字 -存 -孙 -孚 -孛 -孜 -孝 -孟 -孢 -季 -孤 -学 -孩 -孪 -孫 -孬 -孰 -孱 -孳 -孵 -學 -孺 -孽 -孿 -宁 -它 -宅 -宇 -守 -安 -宋 -完 -宏 -宓 -宕 -宗 -官 -宙 -定 -宛 -宜 -宝 -实 -実 -宠 -审 -客 -宣 -室 -宥 -宦 -宪 -宫 -宮 -宰 -害 -宴 -宵 -家 -宸 -容 -宽 -宾 -宿 -寂 -寄 -寅 -密 -寇 -富 -寐 -寒 -寓 -寛 -寝 -寞 -察 -寡 -寢 -寥 -實 -寧 -寨 -審 -寫 -寬 -寮 -寰 -寵 -寶 -寸 -对 -寺 -寻 -导 -対 -寿 -封 -専 -射 -将 -將 -專 -尉 -尊 -尋 -對 -導 -小 -少 -尔 -尕 -尖 -尘 -尚 -尝 -尤 -尧 -尬 -就 -尴 -尷 -尸 -尹 -尺 -尻 -尼 -尽 -尾 -尿 -局 -屁 -层 -屄 -居 -屆 -屈 -屉 -届 -屋 -屌 -屍 -屎 -屏 -屐 -屑 -展 -屜 -属 -屠 -屡 -屢 -層 -履 -屬 -屯 -山 -屹 -屿 -岀 -岁 -岂 -岌 -岐 -岑 -岔 -岖 -岗 -岘 -岙 -岚 -岛 -岡 -岩 -岫 -岬 -岭 -岱 -岳 -岷 -岸 -峇 -峋 -峒 -峙 -峡 -峤 -峥 -峦 -峨 -峪 -峭 -峯 -峰 -峴 -島 -峻 -峽 -崁 -崂 -崆 -崇 -崎 -崑 -崔 -崖 -崗 -崙 -崛 -崧 -崩 -崭 -崴 -崽 -嵇 -嵊 -嵋 -嵌 -嵐 -嵘 -嵩 -嵬 -嵯 -嶂 -嶄 -嶇 -嶋 -嶙 -嶺 -嶼 -嶽 -巅 -巍 -巒 -巔 -巖 -川 -州 -巡 -巢 -工 -左 -巧 -巨 -巩 -巫 -差 -己 -已 -巳 -巴 -巷 -巻 -巽 -巾 -巿 -币 -市 -布 -帅 -帆 -师 -希 -帐 -帑 -帕 -帖 -帘 -帚 -帛 -帜 -帝 -帥 -带 -帧 -師 -席 -帮 -帯 -帰 -帳 -帶 -帷 -常 -帼 -帽 -幀 -幂 -幄 -幅 -幌 -幔 -幕 -幟 -幡 -幢 -幣 -幫 -干 -平 -年 -并 -幸 -幹 -幺 -幻 -幼 -幽 -幾 -广 -庁 -広 -庄 -庆 -庇 -床 -序 -庐 -库 -应 -底 -庖 -店 -庙 -庚 -府 -庞 -废 -庠 -度 -座 -庫 -庭 -庵 -庶 -康 -庸 -庹 -庾 -廁 -廂 -廃 -廈 -廉 -廊 -廓 -廖 -廚 -廝 -廟 -廠 -廢 -廣 -廬 -廳 -延 -廷 -建 -廿 -开 -弁 -异 -弃 -弄 -弈 -弊 -弋 -式 -弑 -弒 -弓 -弔 -引 -弗 -弘 -弛 -弟 -张 -弥 -弦 -弧 -弩 -弭 -弯 -弱 -張 -強 -弹 -强 -弼 -弾 -彅 -彆 -彈 -彌 -彎 -归 -当 -录 -彗 -彙 -彝 -形 -彤 -彥 -彦 -彧 -彩 -彪 -彫 -彬 -彭 -彰 -影 -彷 -役 -彻 -彼 -彿 -往 -征 -径 -待 -徇 -很 -徉 -徊 -律 -後 -徐 -徑 -徒 -従 -徕 -得 -徘 -徙 -徜 -從 -徠 -御 -徨 -復 -循 -徬 -微 -徳 -徴 -徵 -德 -徹 -徼 -徽 -心 -必 -忆 -忌 -忍 -忏 -忐 -忑 -忒 -忖 -志 -忘 -忙 -応 -忠 -忡 -忤 -忧 -忪 -快 -忱 -念 -忻 -忽 -忿 -怀 -态 -怂 -怅 -怆 -怎 -怏 -怒 -怔 -怕 -怖 -怙 -怜 -思 -怠 -怡 -急 -怦 -性 -怨 -怪 -怯 -怵 -总 -怼 -恁 -恃 -恆 -恋 -恍 -恐 -恒 -恕 -恙 -恚 -恢 -恣 -恤 -恥 -恨 -恩 -恪 -恫 -恬 -恭 -息 -恰 -恳 -恵 -恶 -恸 -恺 -恻 -恼 -恿 -悄 -悅 -悉 -悌 -悍 -悔 -悖 -悚 -悟 -悠 -患 -悦 -您 -悩 -悪 -悬 -悯 -悱 -悲 -悴 -悵 -悶 -悸 -悻 -悼 -悽 -情 -惆 -惇 -惊 -惋 -惑 -惕 -惘 -惚 -惜 -惟 -惠 -惡 -惦 -惧 -惨 -惩 -惫 -惬 -惭 -惮 -惯 -惰 -惱 -想 -惴 -惶 -惹 -惺 -愁 -愆 -愈 -愉 -愍 -意 -愕 -愚 -愛 -愜 -感 -愣 -愤 -愧 -愫 -愷 -愿 -慄 -慈 -態 -慌 -慎 -慑 -慕 -慘 -慚 -慟 -慢 -慣 -慧 -慨 -慫 -慮 -慰 -慳 -慵 -慶 -慷 -慾 -憂 -憊 -憋 -憎 -憐 -憑 -憔 -憚 -憤 -憧 -憨 -憩 -憫 -憬 -憲 -憶 -憾 -懂 -懇 -懈 -應 -懊 -懋 -懑 -懒 -懦 -懲 -懵 -懶 -懷 -懸 -懺 -懼 -懾 -懿 -戀 -戈 -戊 -戌 -戍 -戎 -戏 -成 -我 -戒 -戕 -或 -战 -戚 -戛 -戟 -戡 -戦 -截 -戬 -戮 -戰 -戲 -戳 -戴 -戶 -户 -戸 -戻 -戾 -房 -所 -扁 -扇 -扈 -扉 -手 -才 -扎 -扑 -扒 -打 -扔 -払 -托 -扛 -扣 -扦 -执 -扩 -扪 -扫 -扬 -扭 -扮 -扯 -扰 -扱 -扳 -扶 -批 -扼 -找 -承 -技 -抄 -抉 -把 -抑 -抒 -抓 -投 -抖 -抗 -折 -抚 -抛 -抜 -択 -抟 -抠 -抡 -抢 -护 -报 -抨 -披 -抬 -抱 -抵 -抹 -押 -抽 -抿 -拂 -拄 -担 -拆 -拇 -拈 -拉 -拋 -拌 -拍 -拎 -拐 -拒 -拓 -拔 -拖 -拗 -拘 -拙 -拚 -招 -拜 -拟 -拡 -拢 -拣 -拥 -拦 -拧 -拨 -择 -括 -拭 -拮 -拯 -拱 -拳 -拴 -拷 -拼 -拽 -拾 -拿 -持 -挂 -指 -挈 -按 -挎 -挑 -挖 -挙 -挚 -挛 -挝 -挞 -挟 -挠 -挡 -挣 -挤 -挥 -挨 -挪 -挫 -振 -挲 -挹 -挺 -挽 -挾 -捂 -捅 -捆 -捉 -捋 -捌 -捍 -捎 -捏 -捐 -捕 -捞 -损 -捡 -换 -捣 -捧 -捨 -捩 -据 -捱 -捲 -捶 -捷 -捺 -捻 -掀 -掂 -掃 -掇 -授 -掉 -掌 -掏 -掐 -排 -掖 -掘 -掙 -掛 -掠 -採 -探 -掣 -接 -控 -推 -掩 -措 -掬 -掰 -掲 -掳 -掴 -掷 -掸 -掺 -揀 -揃 -揄 -揆 -揉 -揍 -描 -提 -插 -揖 -揚 -換 -握 -揣 -揩 -揪 -揭 -揮 -援 -揶 -揸 -揹 -揽 -搀 -搁 -搂 -搅 -損 -搏 -搐 -搓 -搔 -搖 -搗 -搜 -搞 -搡 -搪 -搬 -搭 -搵 -搶 -携 -搽 -摀 -摁 -摄 -摆 -摇 -摈 -摊 -摒 -摔 -摘 -摞 -摟 -摧 -摩 -摯 -摳 -摸 -摹 -摺 -摻 -撂 -撃 -撅 -撇 -撈 -撐 -撑 -撒 -撓 -撕 -撚 -撞 -撤 -撥 -撩 -撫 -撬 -播 -撮 -撰 -撲 -撵 -撷 -撸 -撻 -撼 -撿 -擀 -擁 -擂 -擄 -擅 -擇 -擊 -擋 -操 -擎 -擒 -擔 -擘 -據 -擞 -擠 -擡 -擢 -擦 -擬 -擰 -擱 -擲 -擴 -擷 -擺 -擼 -擾 -攀 -攏 -攒 -攔 -攘 -攙 -攜 -攝 -攞 -攢 -攣 -攤 -攥 -攪 -攫 -攬 -支 -收 -攸 -改 -攻 -放 -政 -故 -效 -敌 -敍 -敎 -敏 -救 -敕 -敖 -敗 -敘 -教 -敛 -敝 -敞 -敢 -散 -敦 -敬 -数 -敲 -整 -敵 -敷 -數 -斂 -斃 -文 -斋 -斌 -斎 -斐 -斑 -斓 -斗 -料 -斛 -斜 -斟 -斡 -斤 -斥 -斧 -斩 -斫 -斬 -断 -斯 -新 -斷 -方 -於 -施 -旁 -旃 -旅 -旋 -旌 -旎 -族 -旖 -旗 -无 -既 -日 -旦 -旧 -旨 -早 -旬 -旭 -旮 -旱 -时 -旷 -旺 -旻 -昀 -昂 -昆 -昇 -昉 -昊 -昌 -明 -昏 -易 -昔 -昕 -昙 -星 -映 -春 -昧 -昨 -昭 -是 -昱 -昴 -昵 -昶 -昼 -显 -晁 -時 -晃 -晉 -晋 -晌 -晏 -晒 -晓 -晔 -晕 -晖 -晗 -晚 -晝 -晞 -晟 -晤 -晦 -晨 -晩 -普 -景 -晰 -晴 -晶 -晷 -智 -晾 -暂 -暄 -暇 -暈 -暉 -暌 -暐 -暑 -暖 -暗 -暝 -暢 -暧 -暨 -暫 -暮 -暱 -暴 -暸 -暹 -曄 -曆 -曇 -曉 -曖 -曙 -曜 -曝 -曠 -曦 -曬 -曰 -曲 -曳 -更 -書 -曹 -曼 -曾 -替 -最 -會 -月 -有 -朋 -服 -朐 -朔 -朕 -朗 -望 -朝 -期 -朦 -朧 -木 -未 -末 -本 -札 -朮 -术 -朱 -朴 -朵 -机 -朽 -杀 -杂 -权 -杆 -杈 -杉 -李 -杏 -材 -村 -杓 -杖 -杜 -杞 -束 -杠 -条 -来 -杨 -杭 -杯 -杰 -東 -杳 -杵 -杷 -杼 -松 -板 -极 -构 -枇 -枉 -枋 -析 -枕 -林 -枚 -果 -枝 -枢 -枣 -枪 -枫 -枭 -枯 -枰 -枱 -枳 -架 -枷 -枸 -柄 -柏 -某 -柑 -柒 -染 -柔 -柘 -柚 -柜 -柞 -柠 -柢 -查 -柩 -柬 -柯 -柱 -柳 -柴 -柵 -査 -柿 -栀 -栃 -栄 -栅 -标 -栈 -栉 -栋 -栎 -栏 -树 -栓 -栖 -栗 -校 -栩 -株 -样 -核 -根 -格 -栽 -栾 -桀 -桁 -桂 -桃 -桅 -框 -案 -桉 -桌 -桎 -桐 -桑 -桓 -桔 -桜 -桠 -桡 -桢 -档 -桥 -桦 -桧 -桨 -桩 -桶 -桿 -梁 -梅 -梆 -梏 -梓 -梗 -條 -梟 -梢 -梦 -梧 -梨 -梭 -梯 -械 -梳 -梵 -梶 -检 -棂 -棄 -棉 -棋 -棍 -棒 -棕 -棗 -棘 -棚 -棟 -棠 -棣 -棧 -森 -棱 -棲 -棵 -棹 -棺 -椁 -椅 -椋 -植 -椎 -椒 -検 -椪 -椭 -椰 -椹 -椽 -椿 -楂 -楊 -楓 -楔 -楚 -楝 -楞 -楠 -楣 -楨 -楫 -業 -楮 -極 -楷 -楸 -楹 -楼 -楽 -概 -榄 -榆 -榈 -榉 -榔 -榕 -榖 -榛 -榜 -榨 -榫 -榭 -榮 -榱 -榴 -榷 -榻 -槁 -槃 -構 -槌 -槍 -槎 -槐 -槓 -様 -槛 -槟 -槤 -槭 -槲 -槳 -槻 -槽 -槿 -樁 -樂 -樊 -樑 -樓 -標 -樞 -樟 -模 -樣 -権 -横 -樫 -樯 -樱 -樵 -樸 -樹 -樺 -樽 -樾 -橄 -橇 -橋 -橐 -橘 -橙 -機 -橡 -橢 -橫 -橱 -橹 -橼 -檀 -檄 -檎 -檐 -檔 -檗 -檜 -檢 -檬 -檯 -檳 -檸 -檻 -櫃 -櫚 -櫛 -櫥 -櫸 -櫻 -欄 -權 -欒 -欖 -欠 -次 -欢 -欣 -欧 -欲 -欸 -欺 -欽 -款 -歆 -歇 -歉 -歌 -歎 -歐 -歓 -歙 -歛 -歡 -止 -正 -此 -步 -武 -歧 -歩 -歪 -歯 -歲 -歳 -歴 -歷 -歸 -歹 -死 -歼 -殁 -殃 -殆 -殇 -殉 -殊 -残 -殒 -殓 -殖 -殘 -殞 -殡 -殤 -殭 -殯 -殲 -殴 -段 -殷 -殺 -殼 -殿 -毀 -毁 -毂 -毅 -毆 -毋 -母 -毎 -每 -毒 -毓 -比 -毕 -毗 -毘 -毙 -毛 -毡 -毫 -毯 -毽 -氈 -氏 -氐 -民 -氓 -气 -氖 -気 -氙 -氛 -氟 -氡 -氢 -氣 -氤 -氦 -氧 -氨 -氪 -氫 -氮 -氯 -氰 -氲 -水 -氷 -永 -氹 -氾 -汀 -汁 -求 -汆 -汇 -汉 -汎 -汐 -汕 -汗 -汙 -汛 -汝 -汞 -江 -池 -污 -汤 -汨 -汩 -汪 -汰 -汲 -汴 -汶 -汹 -決 -汽 -汾 -沁 -沂 -沃 -沅 -沈 -沉 -沌 -沏 -沐 -沒 -沓 -沖 -沙 -沛 -沟 -没 -沢 -沣 -沥 -沦 -沧 -沪 -沫 -沭 -沮 -沱 -河 -沸 -油 -治 -沼 -沽 -沾 -沿 -況 -泄 -泉 -泊 -泌 -泓 -法 -泗 -泛 -泞 -泠 -泡 -波 -泣 -泥 -注 -泪 -泫 -泮 -泯 -泰 -泱 -泳 -泵 -泷 -泸 -泻 -泼 -泽 -泾 -洁 -洄 -洋 -洒 -洗 -洙 -洛 -洞 -津 -洩 -洪 -洮 -洱 -洲 -洵 -洶 -洸 -洹 -活 -洼 -洽 -派 -流 -浃 -浄 -浅 -浆 -浇 -浊 -测 -济 -浏 -浑 -浒 -浓 -浔 -浙 -浚 -浜 -浣 -浦 -浩 -浪 -浬 -浮 -浯 -浴 -海 -浸 -涂 -涅 -涇 -消 -涉 -涌 -涎 -涓 -涔 -涕 -涙 -涛 -涝 -涞 -涟 -涠 -涡 -涣 -涤 -润 -涧 -涨 -涩 -涪 -涮 -涯 -液 -涵 -涸 -涼 -涿 -淀 -淄 -淅 -淆 -淇 -淋 -淌 -淑 -淒 -淖 -淘 -淙 -淚 -淞 -淡 -淤 -淦 -淨 -淩 -淪 -淫 -淬 -淮 -深 -淳 -淵 -混 -淹 -淺 -添 -淼 -清 -済 -渉 -渊 -渋 -渍 -渎 -渐 -渔 -渗 -渙 -渚 -減 -渝 -渠 -渡 -渣 -渤 -渥 -渦 -温 -測 -渭 -港 -渲 -渴 -游 -渺 -渾 -湃 -湄 -湊 -湍 -湖 -湘 -湛 -湟 -湧 -湫 -湮 -湯 -湳 -湾 -湿 -満 -溃 -溅 -溉 -溏 -源 -準 -溜 -溝 -溟 -溢 -溥 -溧 -溪 -溫 -溯 -溱 -溴 -溶 -溺 -溼 -滁 -滂 -滄 -滅 -滇 -滋 -滌 -滑 -滓 -滔 -滕 -滙 -滚 -滝 -滞 -滟 -满 -滢 -滤 -滥 -滦 -滨 -滩 -滬 -滯 -滲 -滴 -滷 -滸 -滾 -滿 -漁 -漂 -漆 -漉 -漏 -漓 -演 -漕 -漠 -漢 -漣 -漩 -漪 -漫 -漬 -漯 -漱 -漲 -漳 -漸 -漾 -漿 -潆 -潇 -潋 -潍 -潑 -潔 -潘 -潛 -潜 -潞 -潟 -潢 -潤 -潦 -潧 -潭 -潮 -潰 -潴 -潸 -潺 -潼 -澀 -澄 -澆 -澈 -澍 -澎 -澗 -澜 -澡 -澤 -澧 -澱 -澳 -澹 -激 -濁 -濂 -濃 -濑 -濒 -濕 -濘 -濛 -濟 -濠 -濡 -濤 -濫 -濬 -濮 -濯 -濱 -濺 -濾 -瀅 -瀆 -瀉 -瀋 -瀏 -瀑 -瀕 -瀘 -瀚 -瀛 -瀝 -瀞 -瀟 -瀧 -瀨 -瀬 -瀰 -瀾 -灌 -灏 -灑 -灘 -灝 -灞 -灣 -火 -灬 -灭 -灯 -灰 -灵 -灶 -灸 -灼 -災 -灾 -灿 -炀 -炁 -炅 -炉 -炊 -炎 -炒 -炔 -炕 -炖 -炙 -炜 -炫 -炬 -炭 -炮 -炯 -炳 -炷 -炸 -点 -為 -炼 -炽 -烁 -烂 -烃 -烈 -烊 -烏 -烘 -烙 -烛 -烟 -烤 -烦 -烧 -烨 -烩 -烫 -烬 -热 -烯 -烷 -烹 -烽 -焉 -焊 -焕 -焖 -焗 -焘 -焙 -焚 -焜 -無 -焦 -焯 -焰 -焱 -然 -焼 -煅 -煉 -煊 -煌 -煎 -煒 -煖 -煙 -煜 -煞 -煤 -煥 -煦 -照 -煨 -煩 -煮 -煲 -煸 -煽 -熄 -熊 -熏 -熒 -熔 -熙 -熟 -熠 -熨 -熬 -熱 -熵 -熹 -熾 -燁 -燃 -燄 -燈 -燉 -燊 -燎 -燒 -燔 -燕 -燙 -燜 -營 -燥 -燦 -燧 -燭 -燮 -燴 -燻 -燼 -燿 -爆 -爍 -爐 -爛 -爪 -爬 -爭 -爰 -爱 -爲 -爵 -父 -爷 -爸 -爹 -爺 -爻 -爽 -爾 -牆 -片 -版 -牌 -牍 -牒 -牙 -牛 -牝 -牟 -牠 -牡 -牢 -牦 -牧 -物 -牯 -牲 -牴 -牵 -特 -牺 -牽 -犀 -犁 -犄 -犊 -犍 -犒 -犢 -犧 -犬 -犯 -状 -犷 -犸 -犹 -狀 -狂 -狄 -狈 -狎 -狐 -狒 -狗 -狙 -狞 -狠 -狡 -狩 -独 -狭 -狮 -狰 -狱 -狸 -狹 -狼 -狽 -猎 -猕 -猖 -猗 -猙 -猛 -猜 -猝 -猥 -猩 -猪 -猫 -猬 -献 -猴 -猶 -猷 -猾 -猿 -獄 -獅 -獎 -獐 -獒 -獗 -獠 -獣 -獨 -獭 -獰 -獲 -獵 -獷 -獸 -獺 -獻 -獼 -獾 -玄 -率 -玉 -王 -玑 -玖 -玛 -玟 -玠 -玥 -玩 -玫 -玮 -环 -现 -玲 -玳 -玷 -玺 -玻 -珀 -珂 -珅 -珈 -珉 -珊 -珍 -珏 -珐 -珑 -珙 -珞 -珠 -珣 -珥 -珩 -珪 -班 -珮 -珲 -珺 -現 -球 -琅 -理 -琇 -琉 -琊 -琍 -琏 -琐 -琛 -琢 -琥 -琦 -琨 -琪 -琬 -琮 -琰 -琲 -琳 -琴 -琵 -琶 -琺 -琼 -瑀 -瑁 -瑄 -瑋 -瑕 -瑗 -瑙 -瑚 -瑛 -瑜 -瑞 -瑟 -瑠 -瑣 -瑤 -瑩 -瑪 -瑯 -瑰 -瑶 -瑾 -璀 -璁 -璃 -璇 -璉 -璋 -璎 -璐 -璜 -璞 -璟 -璧 -璨 -環 -璽 -璿 -瓊 -瓏 -瓒 -瓜 -瓢 -瓣 -瓤 -瓦 -瓮 -瓯 -瓴 -瓶 -瓷 -甄 -甌 -甕 -甘 -甙 -甚 -甜 -生 -產 -産 -甥 -甦 -用 -甩 -甫 -甬 -甭 -甯 -田 -由 -甲 -申 -电 -男 -甸 -町 -画 -甾 -畀 -畅 -界 -畏 -畑 -畔 -留 -畜 -畝 -畢 -略 -畦 -番 -畫 -異 -畲 -畳 -畴 -當 -畸 -畹 -畿 -疆 -疇 -疊 -疏 -疑 -疔 -疖 -疗 -疙 -疚 -疝 -疟 -疡 -疣 -疤 -疥 -疫 -疮 -疯 -疱 -疲 -疳 -疵 -疸 -疹 -疼 -疽 -疾 -痂 -病 -症 -痈 -痉 -痊 -痍 -痒 -痔 -痕 -痘 -痙 -痛 -痞 -痠 -痢 -痣 -痤 -痧 -痨 -痪 -痫 -痰 -痱 -痴 -痹 -痺 -痼 -痿 -瘀 -瘁 -瘋 -瘍 -瘓 -瘘 -瘙 -瘟 -瘠 -瘡 -瘢 -瘤 -瘦 -瘧 -瘩 -瘪 -瘫 -瘴 -瘸 -瘾 -療 -癇 -癌 -癒 -癖 -癜 -癞 -癡 -癢 -癣 -癥 -癫 -癬 -癮 -癱 -癲 -癸 -発 -登 -發 -白 -百 -皂 -的 -皆 -皇 -皈 -皋 -皎 -皑 -皓 -皖 -皙 -皚 -皮 -皰 -皱 -皴 -皺 -皿 -盂 -盃 -盅 -盆 -盈 -益 -盎 -盏 -盐 -监 -盒 -盔 -盖 -盗 -盘 -盛 -盜 -盞 -盟 -盡 -監 -盤 -盥 -盧 -盪 -目 -盯 -盱 -盲 -直 -相 -盹 -盼 -盾 -省 -眈 -眉 -看 -県 -眙 -眞 -真 -眠 -眦 -眨 -眩 -眯 -眶 -眷 -眸 -眺 -眼 -眾 -着 -睁 -睇 -睏 -睐 -睑 -睛 -睜 -睞 -睡 -睢 -督 -睥 -睦 -睨 -睪 -睫 -睬 -睹 -睽 -睾 -睿 -瞄 -瞅 -瞇 -瞋 -瞌 -瞎 -瞑 -瞒 -瞓 -瞞 -瞟 -瞠 -瞥 -瞧 -瞩 -瞪 -瞬 -瞭 -瞰 -瞳 -瞻 -瞼 -瞿 -矇 -矍 -矗 -矚 -矛 -矜 -矢 -矣 -知 -矩 -矫 -短 -矮 -矯 -石 -矶 -矽 -矾 -矿 -码 -砂 -砌 -砍 -砒 -研 -砖 -砗 -砚 -砝 -砣 -砥 -砧 -砭 -砰 -砲 -破 -砷 -砸 -砺 -砼 -砾 -础 -硅 -硐 -硒 -硕 -硝 -硫 -硬 -确 -硯 -硼 -碁 -碇 -碉 -碌 -碍 -碎 -碑 -碓 -碗 -碘 -碚 -碛 -碟 -碣 -碧 -碩 -碰 -碱 -碳 -碴 -確 -碼 -碾 -磁 -磅 -磊 -磋 -磐 -磕 -磚 -磡 -磨 -磬 -磯 -磲 -磷 -磺 -礁 -礎 -礙 -礡 -礦 -礪 -礫 -礴 -示 -礼 -社 -祀 -祁 -祂 -祇 -祈 -祉 -祎 -祐 -祕 -祖 -祗 -祚 -祛 -祜 -祝 -神 -祟 -祠 -祢 -祥 -票 -祭 -祯 -祷 -祸 -祺 -祿 -禀 -禁 -禄 -禅 -禍 -禎 -福 -禛 -禦 -禧 -禪 -禮 -禱 -禹 -禺 -离 -禽 -禾 -禿 -秀 -私 -秃 -秆 -秉 -秋 -种 -科 -秒 -秘 -租 -秣 -秤 -秦 -秧 -秩 -秭 -积 -称 -秸 -移 -秽 -稀 -稅 -程 -稍 -税 -稔 -稗 -稚 -稜 -稞 -稟 -稠 -稣 -種 -稱 -稲 -稳 -稷 -稹 -稻 -稼 -稽 -稿 -穀 -穂 -穆 -穌 -積 -穎 -穗 -穢 -穩 -穫 -穴 -究 -穷 -穹 -空 -穿 -突 -窃 -窄 -窈 -窍 -窑 -窒 -窓 -窕 -窖 -窗 -窘 -窜 -窝 -窟 -窠 -窥 -窦 -窨 -窩 -窪 -窮 -窯 -窺 -窿 -竄 -竅 -竇 -竊 -立 -竖 -站 -竜 -竞 -竟 -章 -竣 -童 -竭 -端 -競 -竹 -竺 -竽 -竿 -笃 -笆 -笈 -笋 -笏 -笑 -笔 -笙 -笛 -笞 -笠 -符 -笨 -第 -笹 -笺 -笼 -筆 -等 -筊 -筋 -筍 -筏 -筐 -筑 -筒 -答 -策 -筛 -筝 -筠 -筱 -筲 -筵 -筷 -筹 -签 -简 -箇 -箋 -箍 -箏 -箐 -箔 -箕 -算 -箝 -管 -箩 -箫 -箭 -箱 -箴 -箸 -節 -篁 -範 -篆 -篇 -築 -篑 -篓 -篙 -篝 -篠 -篡 -篤 -篩 -篪 -篮 -篱 -篷 -簇 -簌 -簍 -簡 -簦 -簧 -簪 -簫 -簷 -簸 -簽 -簾 -簿 -籁 -籃 -籌 -籍 -籐 -籟 -籠 -籤 -籬 -籮 -籲 -米 -类 -籼 -籽 -粄 -粉 -粑 -粒 -粕 -粗 -粘 -粟 -粤 -粥 -粧 -粪 -粮 -粱 -粲 -粳 -粵 -粹 -粼 -粽 -精 -粿 -糅 -糊 -糍 -糕 -糖 -糗 -糙 -糜 -糞 -糟 -糠 -糧 -糬 -糯 -糰 -糸 -系 -糾 -紀 -紂 -約 -紅 -紉 -紊 -紋 -納 -紐 -紓 -純 -紗 -紘 -紙 -級 -紛 -紜 -素 -紡 -索 -紧 -紫 -紮 -累 -細 -紳 -紹 -紺 -終 -絃 -組 -絆 -経 -結 -絕 -絞 -絡 -絢 -給 -絨 -絮 -統 -絲 -絳 -絵 -絶 -絹 -綁 -綏 -綑 -經 -継 -続 -綜 -綠 -綢 -綦 -綫 -綬 -維 -綱 -網 -綴 -綵 -綸 -綺 -綻 -綽 -綾 -綿 -緊 -緋 -総 -緑 -緒 -緘 -線 -緝 -緞 -締 -緣 -編 -緩 -緬 -緯 -練 -緹 -緻 -縁 -縄 -縈 -縛 -縝 -縣 -縫 -縮 -縱 -縴 -縷 -總 -績 -繁 -繃 -繆 -繇 -繋 -織 -繕 -繚 -繞 -繡 -繩 -繪 -繫 -繭 -繳 -繹 -繼 -繽 -纂 -續 -纍 -纏 -纓 -纔 -纖 -纜 -纠 -红 -纣 -纤 -约 -级 -纨 -纪 -纫 -纬 -纭 -纯 -纰 -纱 -纲 -纳 -纵 -纶 -纷 -纸 -纹 -纺 -纽 -纾 -线 -绀 -练 -组 -绅 -细 -织 -终 -绊 -绍 -绎 -经 -绑 -绒 -结 -绔 -绕 -绘 -给 -绚 -绛 -络 -绝 -绞 -统 -绡 -绢 -绣 -绥 -绦 -继 -绩 -绪 -绫 -续 -绮 -绯 -绰 -绳 -维 -绵 -绶 -绷 -绸 -绻 -综 -绽 -绾 -绿 -缀 -缄 -缅 -缆 -缇 -缈 -缉 -缎 -缓 -缔 -缕 -编 -缘 -缙 -缚 -缜 -缝 -缠 -缢 -缤 -缥 -缨 -缩 -缪 -缭 -缮 -缰 -缱 -缴 -缸 -缺 -缽 -罂 -罄 -罌 -罐 -网 -罔 -罕 -罗 -罚 -罡 -罢 -罩 -罪 -置 -罰 -署 -罵 -罷 -罹 -羁 -羅 -羈 -羊 -羌 -美 -羔 -羚 -羞 -羟 -羡 -羣 -群 -羥 -羧 -羨 -義 -羯 -羲 -羸 -羹 -羽 -羿 -翁 -翅 -翊 -翌 -翎 -習 -翔 -翘 -翟 -翠 -翡 -翦 -翩 -翰 -翱 -翳 -翹 -翻 -翼 -耀 -老 -考 -耄 -者 -耆 -耋 -而 -耍 -耐 -耒 -耕 -耗 -耘 -耙 -耦 -耨 -耳 -耶 -耷 -耸 -耻 -耽 -耿 -聂 -聆 -聊 -聋 -职 -聒 -联 -聖 -聘 -聚 -聞 -聪 -聯 -聰 -聲 -聳 -聴 -聶 -職 -聽 -聾 -聿 -肃 -肄 -肅 -肆 -肇 -肉 -肋 -肌 -肏 -肓 -肖 -肘 -肚 -肛 -肝 -肠 -股 -肢 -肤 -肥 -肩 -肪 -肮 -肯 -肱 -育 -肴 -肺 -肽 -肾 -肿 -胀 -胁 -胃 -胄 -胆 -背 -胍 -胎 -胖 -胚 -胛 -胜 -胝 -胞 -胡 -胤 -胥 -胧 -胫 -胭 -胯 -胰 -胱 -胳 -胴 -胶 -胸 -胺 -能 -脂 -脅 -脆 -脇 -脈 -脉 -脊 -脍 -脏 -脐 -脑 -脓 -脖 -脘 -脚 -脛 -脣 -脩 -脫 -脯 -脱 -脲 -脳 -脸 -脹 -脾 -腆 -腈 -腊 -腋 -腌 -腎 -腐 -腑 -腓 -腔 -腕 -腥 -腦 -腩 -腫 -腭 -腮 -腰 -腱 -腳 -腴 -腸 -腹 -腺 -腻 -腼 -腾 -腿 -膀 -膈 -膊 -膏 -膑 -膘 -膚 -膛 -膜 -膝 -膠 -膦 -膨 -膩 -膳 -膺 -膻 -膽 -膾 -膿 -臀 -臂 -臃 -臆 -臉 -臊 -臍 -臓 -臘 -臟 -臣 -臥 -臧 -臨 -自 -臬 -臭 -至 -致 -臺 -臻 -臼 -臾 -舀 -舂 -舅 -舆 -與 -興 -舉 -舊 -舌 -舍 -舎 -舐 -舒 -舔 -舖 -舗 -舛 -舜 -舞 -舟 -航 -舫 -般 -舰 -舱 -舵 -舶 -舷 -舸 -船 -舺 -舾 -艇 -艋 -艘 -艙 -艦 -艮 -良 -艰 -艱 -色 -艳 -艷 -艹 -艺 -艾 -节 -芃 -芈 -芊 -芋 -芍 -芎 -芒 -芙 -芜 -芝 -芡 -芥 -芦 -芩 -芪 -芫 -芬 -芭 -芮 -芯 -花 -芳 -芷 -芸 -芹 -芻 -芽 -芾 -苁 -苄 -苇 -苋 -苍 -苏 -苑 -苒 -苓 -苔 -苕 -苗 -苛 -苜 -苞 -苟 -苡 -苣 -若 -苦 -苫 -苯 -英 -苷 -苹 -苻 -茁 -茂 -范 -茄 -茅 -茉 -茎 -茏 -茗 -茜 -茧 -茨 -茫 -茬 -茭 -茯 -茱 -茲 -茴 -茵 -茶 -茸 -茹 -茼 -荀 -荃 -荆 -草 -荊 -荏 -荐 -荒 -荔 -荖 -荘 -荚 -荞 -荟 -荠 -荡 -荣 -荤 -荥 -荧 -荨 -荪 -荫 -药 -荳 -荷 -荸 -荻 -荼 -荽 -莅 -莆 -莉 -莊 -莎 -莒 -莓 -莖 -莘 -莞 -莠 -莢 -莧 -莪 -莫 -莱 -莲 -莴 -获 -莹 -莺 -莽 -莿 -菀 -菁 -菅 -菇 -菈 -菊 -菌 -菏 -菓 -菖 -菘 -菜 -菟 -菠 -菡 -菩 -華 -菱 -菲 -菸 -菽 -萁 -萃 -萄 -萊 -萋 -萌 -萍 -萎 -萘 -萝 -萤 -营 -萦 -萧 -萨 -萩 -萬 -萱 -萵 -萸 -萼 -落 -葆 -葉 -著 -葚 -葛 -葡 -董 -葦 -葩 -葫 -葬 -葭 -葯 -葱 -葳 -葵 -葷 -葺 -蒂 -蒋 -蒐 -蒔 -蒙 -蒜 -蒞 -蒟 -蒡 -蒨 -蒲 -蒸 -蒹 -蒻 -蒼 -蒿 -蓁 -蓄 -蓆 -蓉 -蓋 -蓑 -蓓 -蓖 -蓝 -蓟 -蓦 -蓬 -蓮 -蓼 -蓿 -蔑 -蔓 -蔔 -蔗 -蔘 -蔚 -蔡 -蔣 -蔥 -蔫 -蔬 -蔭 -蔵 -蔷 -蔺 -蔻 -蔼 -蔽 -蕁 -蕃 -蕈 -蕉 -蕊 -蕎 -蕙 -蕤 -蕨 -蕩 -蕪 -蕭 -蕲 -蕴 -蕻 -蕾 -薄 -薅 -薇 -薈 -薊 -薏 -薑 -薔 -薙 -薛 -薦 -薨 -薩 -薪 -薬 -薯 -薰 -薹 -藉 -藍 -藏 -藐 -藓 -藕 -藜 -藝 -藤 -藥 -藩 -藹 -藻 -藿 -蘆 -蘇 -蘊 -蘋 -蘑 -蘚 -蘭 -蘸 -蘼 -蘿 -虎 -虏 -虐 -虑 -虔 -處 -虚 -虛 -虜 -虞 -號 -虢 -虧 -虫 -虬 -虱 -虹 -虻 -虽 -虾 -蚀 -蚁 -蚂 -蚊 -蚌 -蚓 -蚕 -蚜 -蚝 -蚣 -蚤 -蚩 -蚪 -蚯 -蚱 -蚵 -蛀 -蛆 -蛇 -蛊 -蛋 -蛎 -蛐 -蛔 -蛙 -蛛 -蛟 -蛤 -蛭 -蛮 -蛰 -蛳 -蛹 -蛻 -蛾 -蜀 -蜂 -蜃 -蜆 -蜇 -蜈 -蜊 -蜍 -蜒 -蜓 -蜕 -蜗 -蜘 -蜚 -蜜 -蜡 -蜢 -蜥 -蜱 -蜴 -蜷 -蜻 -蜿 -蝇 -蝈 -蝉 -蝌 -蝎 -蝕 -蝗 -蝙 -蝟 -蝠 -蝦 -蝨 -蝴 -蝶 -蝸 -蝼 -螂 -螃 -融 -螞 -螢 -螨 -螯 -螳 -螺 -蟀 -蟄 -蟆 -蟋 -蟎 -蟑 -蟒 -蟠 -蟬 -蟲 -蟹 -蟻 -蟾 -蠅 -蠍 -蠔 -蠕 -蠛 -蠟 -蠡 -蠢 -蠣 -蠱 -蠶 -蠹 -蠻 -血 -衄 -衅 -衆 -行 -衍 -術 -衔 -街 -衙 -衛 -衝 -衞 -衡 -衢 -衣 -补 -表 -衩 -衫 -衬 -衮 -衰 -衲 -衷 -衹 -衾 -衿 -袁 -袂 -袄 -袅 -袈 -袋 -袍 -袒 -袖 -袜 -袞 -袤 -袪 -被 -袭 -袱 -裁 -裂 -装 -裆 -裊 -裏 -裔 -裕 -裘 -裙 -補 -裝 -裟 -裡 -裤 -裨 -裱 -裳 -裴 -裸 -裹 -製 -裾 -褂 -複 -褐 -褒 -褓 -褔 -褚 -褥 -褪 -褫 -褲 -褶 -褻 -襁 -襄 -襟 -襠 -襪 -襬 -襯 -襲 -西 -要 -覃 -覆 -覇 -見 -規 -覓 -視 -覚 -覦 -覧 -親 -覬 -観 -覷 -覺 -覽 -觀 -见 -观 -规 -觅 -视 -览 -觉 -觊 -觎 -觐 -觑 -角 -觞 -解 -觥 -触 -觸 -言 -訂 -計 -訊 -討 -訓 -訕 -訖 -託 -記 -訛 -訝 -訟 -訣 -訥 -訪 -設 -許 -訳 -訴 -訶 -診 -註 -証 -詆 -詐 -詔 -評 -詛 -詞 -詠 -詡 -詢 -詣 -試 -詩 -詫 -詬 -詭 -詮 -詰 -話 -該 -詳 -詹 -詼 -誅 -誇 -誉 -誌 -認 -誓 -誕 -誘 -語 -誠 -誡 -誣 -誤 -誥 -誦 -誨 -說 -説 -読 -誰 -課 -誹 -誼 -調 -諄 -談 -請 -諏 -諒 -論 -諗 -諜 -諡 -諦 -諧 -諫 -諭 -諮 -諱 -諳 -諷 -諸 -諺 -諾 -謀 -謁 -謂 -謄 -謊 -謎 -謐 -謔 -謗 -謙 -講 -謝 -謠 -謨 -謬 -謹 -謾 -譁 -證 -譎 -譏 -識 -譙 -譚 -譜 -警 -譬 -譯 -議 -譲 -譴 -護 -譽 -讀 -變 -讓 -讚 -讞 -计 -订 -认 -讥 -讧 -讨 -让 -讪 -讫 -训 -议 -讯 -记 -讲 -讳 -讴 -讶 -讷 -许 -讹 -论 -讼 -讽 -设 -访 -诀 -证 -诃 -评 -诅 -识 -诈 -诉 -诊 -诋 -词 -诏 -译 -试 -诗 -诘 -诙 -诚 -诛 -话 -诞 -诟 -诠 -诡 -询 -诣 -诤 -该 -详 -诧 -诩 -诫 -诬 -语 -误 -诰 -诱 -诲 -说 -诵 -诶 -请 -诸 -诺 -读 -诽 -课 -诿 -谀 -谁 -调 -谄 -谅 -谆 -谈 -谊 -谋 -谌 -谍 -谎 -谏 -谐 -谑 -谒 -谓 -谔 -谕 -谗 -谘 -谙 -谚 -谛 -谜 -谟 -谢 -谣 -谤 -谥 -谦 -谧 -谨 -谩 -谪 -谬 -谭 -谯 -谱 -谲 -谴 -谶 -谷 -豁 -豆 -豇 -豈 -豉 -豊 -豌 -豎 -豐 -豔 -豚 -象 -豢 -豪 -豫 -豬 -豹 -豺 -貂 -貅 -貌 -貓 -貔 -貘 -貝 -貞 -負 -財 -貢 -貧 -貨 -販 -貪 -貫 -責 -貯 -貰 -貳 -貴 -貶 -買 -貸 -費 -貼 -貽 -貿 -賀 -賁 -賂 -賃 -賄 -資 -賈 -賊 -賑 -賓 -賜 -賞 -賠 -賡 -賢 -賣 -賤 -賦 -質 -賬 -賭 -賴 -賺 -購 -賽 -贅 -贈 -贊 -贍 -贏 -贓 -贖 -贛 -贝 -贞 -负 -贡 -财 -责 -贤 -败 -账 -货 -质 -贩 -贪 -贫 -贬 -购 -贮 -贯 -贰 -贱 -贲 -贴 -贵 -贷 -贸 -费 -贺 -贻 -贼 -贾 -贿 -赁 -赂 -赃 -资 -赅 -赈 -赊 -赋 -赌 -赎 -赏 -赐 -赓 -赔 -赖 -赘 -赚 -赛 -赝 -赞 -赠 -赡 -赢 -赣 -赤 -赦 -赧 -赫 -赭 -走 -赳 -赴 -赵 -赶 -起 -趁 -超 -越 -趋 -趕 -趙 -趟 -趣 -趨 -足 -趴 -趵 -趸 -趺 -趾 -跃 -跄 -跆 -跋 -跌 -跎 -跑 -跖 -跚 -跛 -距 -跟 -跡 -跤 -跨 -跩 -跪 -路 -跳 -践 -跷 -跹 -跺 -跻 -踉 -踊 -踌 -踏 -踐 -踝 -踞 -踟 -踢 -踩 -踪 -踮 -踱 -踴 -踵 -踹 -蹂 -蹄 -蹇 -蹈 -蹉 -蹊 -蹋 -蹑 -蹒 -蹙 -蹟 -蹣 -蹤 -蹦 -蹩 -蹬 -蹭 -蹲 -蹴 -蹶 -蹺 -蹼 -蹿 -躁 -躇 -躉 -躊 -躋 -躍 -躏 -躪 -身 -躬 -躯 -躲 -躺 -軀 -車 -軋 -軌 -軍 -軒 -軟 -転 -軸 -軼 -軽 -軾 -較 -載 -輒 -輓 -輔 -輕 -輛 -輝 -輟 -輩 -輪 -輯 -輸 -輻 -輾 -輿 -轄 -轅 -轆 -轉 -轍 -轎 -轟 -车 -轧 -轨 -轩 -转 -轭 -轮 -软 -轰 -轲 -轴 -轶 -轻 -轼 -载 -轿 -较 -辄 -辅 -辆 -辇 -辈 -辉 -辊 -辍 -辐 -辑 -输 -辕 -辖 -辗 -辘 -辙 -辛 -辜 -辞 -辟 -辣 -辦 -辨 -辩 -辫 -辭 -辮 -辯 -辰 -辱 -農 -边 -辺 -辻 -込 -辽 -达 -迁 -迂 -迄 -迅 -过 -迈 -迎 -运 -近 -返 -还 -这 -进 -远 -违 -连 -迟 -迢 -迤 -迥 -迦 -迩 -迪 -迫 -迭 -述 -迴 -迷 -迸 -迹 -迺 -追 -退 -送 -适 -逃 -逅 -逆 -选 -逊 -逍 -透 -逐 -递 -途 -逕 -逗 -這 -通 -逛 -逝 -逞 -速 -造 -逢 -連 -逮 -週 -進 -逵 -逶 -逸 -逻 -逼 -逾 -遁 -遂 -遅 -遇 -遊 -運 -遍 -過 -遏 -遐 -遑 -遒 -道 -達 -違 -遗 -遙 -遛 -遜 -遞 -遠 -遢 -遣 -遥 -遨 -適 -遭 -遮 -遲 -遴 -遵 -遶 -遷 -選 -遺 -遼 -遽 -避 -邀 -邁 -邂 -邃 -還 -邇 -邈 -邊 -邋 -邏 -邑 -邓 -邕 -邛 -邝 -邢 -那 -邦 -邨 -邪 -邬 -邮 -邯 -邰 -邱 -邳 -邵 -邸 -邹 -邺 -邻 -郁 -郅 -郊 -郎 -郑 -郜 -郝 -郡 -郢 -郤 -郦 -郧 -部 -郫 -郭 -郴 -郵 -郷 -郸 -都 -鄂 -鄉 -鄒 -鄔 -鄙 -鄞 -鄢 -鄧 -鄭 -鄰 -鄱 -鄲 -鄺 -酉 -酊 -酋 -酌 -配 -酐 -酒 -酗 -酚 -酝 -酢 -酣 -酥 -酩 -酪 -酬 -酮 -酯 -酰 -酱 -酵 -酶 -酷 -酸 -酿 -醃 -醇 -醉 -醋 -醍 -醐 -醒 -醚 -醛 -醜 -醞 -醣 -醪 -醫 -醬 -醮 -醯 -醴 -醺 -釀 -釁 -采 -釉 -释 -釋 -里 -重 -野 -量 -釐 -金 -釗 -釘 -釜 -針 -釣 -釦 -釧 -釵 -鈀 -鈉 -鈍 -鈎 -鈔 -鈕 -鈞 -鈣 -鈦 -鈪 -鈴 -鈺 -鈾 -鉀 -鉄 -鉅 -鉉 -鉑 -鉗 -鉚 -鉛 -鉤 -鉴 -鉻 -銀 -銃 -銅 -銑 -銓 -銖 -銘 -銜 -銬 -銭 -銮 -銳 -銷 -銹 -鋁 -鋅 -鋒 -鋤 -鋪 -鋰 -鋸 -鋼 -錄 -錐 -錘 -錚 -錠 -錢 -錦 -錨 -錫 -錮 -錯 -録 -錳 -錶 -鍊 -鍋 -鍍 -鍛 -鍥 -鍰 -鍵 -鍺 -鍾 -鎂 -鎊 -鎌 -鎏 -鎔 -鎖 -鎗 -鎚 -鎧 -鎬 -鎮 -鎳 -鏈 -鏖 -鏗 -鏘 -鏞 -鏟 -鏡 -鏢 -鏤 -鏽 -鐘 -鐮 -鐲 -鐳 -鐵 -鐸 -鐺 -鑄 -鑊 -鑑 -鑒 -鑣 -鑫 -鑰 -鑲 -鑼 -鑽 -鑾 -鑿 -针 -钉 -钊 -钎 -钏 -钒 -钓 -钗 -钙 -钛 -钜 -钝 -钞 -钟 -钠 -钡 -钢 -钣 -钤 -钥 -钦 -钧 -钨 -钩 -钮 -钯 -钰 -钱 -钳 -钴 -钵 -钺 -钻 -钼 -钾 -钿 -铀 -铁 -铂 -铃 -铄 -铅 -铆 -铉 -铎 -铐 -铛 -铜 -铝 -铠 -铡 -铢 -铣 -铤 -铨 -铩 -铬 -铭 -铮 -铰 -铲 -铵 -银 -铸 -铺 -链 -铿 -销 -锁 -锂 -锄 -锅 -锆 -锈 -锉 -锋 -锌 -锏 -锐 -锑 -错 -锚 -锟 -锡 -锢 -锣 -锤 -锥 -锦 -锭 -键 -锯 -锰 -锲 -锵 -锹 -锺 -锻 -镀 -镁 -镂 -镇 -镉 -镌 -镍 -镐 -镑 -镕 -镖 -镗 -镛 -镜 -镣 -镭 -镯 -镰 -镳 -镶 -長 -长 -門 -閃 -閉 -開 -閎 -閏 -閑 -閒 -間 -閔 -閘 -閡 -関 -閣 -閥 -閨 -閩 -閱 -閲 -閹 -閻 -閾 -闆 -闇 -闊 -闌 -闍 -闔 -闕 -闖 -闘 -關 -闡 -闢 -门 -闪 -闫 -闭 -问 -闯 -闰 -闲 -间 -闵 -闷 -闸 -闹 -闺 -闻 -闽 -闾 -阀 -阁 -阂 -阅 -阆 -阇 -阈 -阉 -阎 -阐 -阑 -阔 -阕 -阖 -阙 -阚 -阜 -队 -阡 -阪 -阮 -阱 -防 -阳 -阴 -阵 -阶 -阻 -阿 -陀 -陂 -附 -际 -陆 -陇 -陈 -陋 -陌 -降 -限 -陕 -陛 -陝 -陞 -陟 -陡 -院 -陣 -除 -陨 -险 -陪 -陰 -陲 -陳 -陵 -陶 -陷 -陸 -険 -陽 -隅 -隆 -隈 -隊 -隋 -隍 -階 -随 -隐 -隔 -隕 -隘 -隙 -際 -障 -隠 -隣 -隧 -隨 -險 -隱 -隴 -隶 -隸 -隻 -隼 -隽 -难 -雀 -雁 -雄 -雅 -集 -雇 -雉 -雋 -雌 -雍 -雎 -雏 -雑 -雒 -雕 -雖 -雙 -雛 -雜 -雞 -離 -難 -雨 -雪 -雯 -雰 -雲 -雳 -零 -雷 -雹 -電 -雾 -需 -霁 -霄 -霆 -震 -霈 -霉 -霊 -霍 -霎 -霏 -霑 -霓 -霖 -霜 -霞 -霧 -霭 -霰 -露 -霸 -霹 -霽 -霾 -靂 -靄 -靈 -青 -靓 -靖 -静 -靚 -靛 -靜 -非 -靠 -靡 -面 -靥 -靦 -革 -靳 -靴 -靶 -靼 -鞅 -鞋 -鞍 -鞏 -鞑 -鞘 -鞠 -鞣 -鞦 -鞭 -韆 -韋 -韌 -韓 -韜 -韦 -韧 -韩 -韬 -韭 -音 -韵 -韶 -韻 -響 -頁 -頂 -頃 -項 -順 -須 -頌 -預 -頑 -頒 -頓 -頗 -領 -頜 -頡 -頤 -頫 -頭 -頰 -頷 -頸 -頹 -頻 -頼 -顆 -題 -額 -顎 -顏 -顔 -願 -顛 -類 -顧 -顫 -顯 -顱 -顴 -页 -顶 -顷 -项 -顺 -须 -顼 -顽 -顾 -顿 -颁 -颂 -预 -颅 -领 -颇 -颈 -颉 -颊 -颌 -颍 -颐 -频 -颓 -颔 -颖 -颗 -题 -颚 -颛 -颜 -额 -颞 -颠 -颡 -颢 -颤 -颦 -颧 -風 -颯 -颱 -颳 -颶 -颼 -飄 -飆 -风 -飒 -飓 -飕 -飘 -飙 -飚 -飛 -飞 -食 -飢 -飨 -飩 -飪 -飯 -飲 -飼 -飽 -飾 -餃 -餅 -餉 -養 -餌 -餐 -餒 -餓 -餘 -餚 -餛 -餞 -餡 -館 -餮 -餵 -餾 -饅 -饈 -饋 -饌 -饍 -饑 -饒 -饕 -饗 -饞 -饥 -饨 -饪 -饬 -饭 -饮 -饯 -饰 -饱 -饲 -饴 -饵 -饶 -饷 -饺 -饼 -饽 -饿 -馀 -馁 -馄 -馅 -馆 -馈 -馋 -馍 -馏 -馒 -馔 -首 -馗 -香 -馥 -馨 -馬 -馭 -馮 -馳 -馴 -駁 -駄 -駅 -駆 -駐 -駒 -駕 -駛 -駝 -駭 -駱 -駿 -騁 -騎 -騏 -験 -騙 -騨 -騰 -騷 -驀 -驅 -驊 -驍 -驒 -驕 -驗 -驚 -驛 -驟 -驢 -驥 -马 -驭 -驮 -驯 -驰 -驱 -驳 -驴 -驶 -驷 -驸 -驹 -驻 -驼 -驾 -驿 -骁 -骂 -骄 -骅 -骆 -骇 -骈 -骊 -骋 -验 -骏 -骐 -骑 -骗 -骚 -骛 -骜 -骞 -骠 -骡 -骤 -骥 -骧 -骨 -骯 -骰 -骶 -骷 -骸 -骼 -髂 -髅 -髋 -髏 -髒 -髓 -體 -髖 -高 -髦 -髪 -髮 -髯 -髻 -鬃 -鬆 -鬍 -鬓 -鬚 -鬟 -鬢 -鬣 -鬥 -鬧 -鬱 -鬼 -魁 -魂 -魄 -魅 -魇 -魍 -魏 -魔 -魘 -魚 -魯 -魷 -鮑 -鮨 -鮪 -鮭 -鮮 -鯉 -鯊 -鯖 -鯛 -鯨 -鯰 -鯽 -鰍 -鰓 -鰭 -鰲 -鰻 -鰾 -鱈 -鱉 -鱔 -鱗 -鱷 -鱸 -鱼 -鱿 -鲁 -鲈 -鲍 -鲑 -鲛 -鲜 -鲟 -鲢 -鲤 -鲨 -鲫 -鲱 -鲲 -鲶 -鲷 -鲸 -鳃 -鳄 -鳅 -鳌 -鳍 -鳕 -鳖 -鳗 -鳝 -鳞 -鳥 -鳩 -鳳 -鳴 -鳶 -鴉 -鴕 -鴛 -鴦 -鴨 -鴻 -鴿 -鵑 -鵜 -鵝 -鵡 -鵬 -鵰 -鵲 -鶘 -鶩 -鶯 -鶴 -鷗 -鷲 -鷹 -鷺 -鸚 -鸞 -鸟 -鸠 -鸡 -鸢 -鸣 -鸥 -鸦 -鸨 -鸪 -鸭 -鸯 -鸳 -鸵 -鸽 -鸾 -鸿 -鹂 -鹃 -鹄 -鹅 -鹈 -鹉 -鹊 -鹌 -鹏 -鹑 -鹕 -鹘 -鹜 -鹞 -鹤 -鹦 -鹧 -鹫 -鹭 -鹰 -鹳 -鹵 -鹹 -鹼 -鹽 -鹿 -麂 -麋 -麒 -麓 -麗 -麝 -麟 -麥 -麦 -麩 -麴 -麵 -麸 -麺 -麻 -麼 -麽 -麾 -黃 -黄 -黍 -黎 -黏 -黑 -黒 -黔 -默 -黛 -黜 -黝 -點 -黠 -黨 -黯 -黴 -鼋 -鼎 -鼐 -鼓 -鼠 -鼬 -鼹 -鼻 -鼾 -齁 -齊 -齋 -齐 -齒 -齡 -齢 -齣 -齦 -齿 -龄 -龅 -龈 -龊 -龋 -龌 -龍 -龐 -龔 -龕 -龙 -龚 -龛 -龜 -龟 -︰ -︱ -︶ -︿ -﹁ -﹂ -﹍ -﹏ -﹐ -﹑ -﹒ -﹔ -﹕ -﹖ -﹗ -﹙ -﹚ -﹝ -﹞ -﹡ -﹣ -! -" -# -$ -% -& -' -( -) -* -+ -, -- -. -/ -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -: -; -< -= -> -? -@ -[ -\ -] -^ -_ -` -a -b -c -d -e -f -g -h -i -j -k -l -m -n -o -p -q -r -s -t -u -v -w -x -y -z -{ -| -} -~ -。 -「 -」 -、 -・ -ッ -ー -イ -ク -シ -ス -ト -ノ -フ -ラ -ル -ン -゙ -゚ - ̄ -¥ -👍 -🔥 -😂 -😎 -... -yam -10 -2017 -12 -11 -2016 -20 -30 -15 -06 -lofter -##s -2015 -by -16 -14 -18 -13 -24 -17 -2014 -21 -##0 -22 -19 -25 -23 -com -100 -00 -05 -2013 -##a -03 -09 -08 -28 -##2 -50 -01 -04 -##1 -27 -02 -2012 -##3 -26 -##e -07 -##8 -##5 -##6 -##4 -##9 -##7 -29 -2011 -40 -##t -2010 -##o -##d -##i -2009 -##n -app -www -the -##m -31 -##c -##l -##y -##r -##g -2008 -60 -http -200 -qq -##p -80 -##f -google -pixnet -90 -cookies -tripadvisor -500 -##er -##k -35 -##h -facebook -2007 -2000 -70 -##b -of -##x -##u -45 -300 -iphone -32 -1000 -2006 -48 -ip -36 -in -38 -3d -##w -##ing -55 -ctrip -##on -##v -33 -##の -to -34 -400 -id -2005 -it -37 -windows -llc -top -99 -42 -39 -000 -led -at -##an -41 -51 -52 -46 -49 -43 -53 -44 -##z -android -58 -and -59 -2004 -56 -vr -##か -5000 -2003 -47 -blogthis -twitter -54 -##le -150 -ok -2018 -57 -75 -cn -no -ios -##in -##mm -##00 -800 -on -te -3000 -65 -2001 -360 -95 -ig -lv -120 -##ng -##を -##us -##に -pc -てす -── -600 -##te -85 -2002 -88 -##ed -html -ncc -wifi -email -64 -blog -is -##10 -##て -mail -online -##al -dvd -##ic -studio -##は -##℃ -##ia -##と -line -vip -72 -##q -98 -##ce -##en -for -##is -##ra -##es -##j -usb -net -cp -1999 -asia -4g -##cm -diy -new -3c -##お -ta -66 -language -vs -apple -tw -86 -web -##ne -ipad -62 -you -##re -101 -68 -##tion -ps -de -bt -pony -atm -##2017 -1998 -67 -##ch -ceo -##or -go -##na -av -pro -cafe -96 -pinterest -97 -63 -pixstyleme3c -##ta -more -said -##2016 -1997 -mp3 -700 -##ll -nba -jun -##20 -92 -tv -1995 -pm -61 -76 -nbsp -250 -##ie -linux -##ma -cd -110 -hd -##17 -78 -##ion -77 -6000 -am -##th -##st -94 -##se -##et -69 -180 -gdp -my -105 -81 -abc -89 -flash -79 -one -93 -1990 -1996 -##ck -gps -##も -##ly -web885 -106 -2020 -91 -##ge -4000 -1500 -xd -boss -isbn -1994 -org -##ry -me -love -##11 -0fork -73 -##12 -3g -##ter -##ar -71 -82 -##la -hotel -130 -1970 -pk -83 -87 -140 -ie -##os -##30 -##el -74 -##50 -seo -cpu -##ml -p2p -84 -may -##る -sun -tue -internet -cc -posted -youtube -##at -##ン -##man -ii -##ル -##15 -abs -nt -pdf -yahoo -ago -1980 -##it -news -mac -104 -##てす -##me -##り -java -1992 -spa -##de -##nt -hk -all -plus -la -1993 -##mb -##16 -##ve -west -##da -160 -air -##い -##ps -から -##to -1989 -logo -htc -php -https -fi -momo -##son -sat -##ke -##80 -ebd -suv -wi -day -apk -##88 -##um -mv -galaxy -wiki -or -brake -##ス -1200 -する -this -1991 -mon -##こ -❤2017 -po -##ない -javascript -life -home -june -##ss -system -900 -##ー -##0 -pp -1988 -world -fb -4k -br -##as -ic -ai -leonardo -safari -##60 -live -free -xx -wed -win7 -kiehl -##co -lg -o2o -##go -us -235 -1949 -mm -しい -vfm -kanye -##90 -##2015 -##id -jr -##ey -123 -rss -##sa -##ro -##am -##no -thu -fri -350 -##sh -##ki -103 -comments -name -##のて -##pe -##ine -max -1987 -8000 -uber -##mi -##ton -wordpress -office -1986 -1985 -##ment -107 -bd -win10 -##ld -##li -gmail -bb -dior -##rs -##ri -##rd -##ます -up -cad -##® -dr -して -read -##21 -をお -##io -##99 -url -1984 -pvc -paypal -show -policy -##40 -##ty -##18 -with -##★ -##01 -txt -102 -##ba -dna -from -post -mini -ar -taiwan -john -##ga -privacy -agoda -##13 -##ny -word -##24 -##22 -##by -##ur -##hz -1982 -##ang -265 -cookie -netscape -108 -##ka -##~ -##ad -house -share -note -ibm -code -hello -nike -sim -survey -##016 -1979 -1950 -wikia -##32 -##017 -5g -cbc -##tor -##kg -1983 -##rt -##14 -campaign -store -2500 -os -##ct -##ts -##° -170 -api -##ns -365 -excel -##な -##ao -##ら -##し -~~ -##nd -university -163 -には -518 -##70 -##ya -##il -##25 -pierre -ipo -0020 -897 -##23 -hotels -##ian -のお -125 -years -6606 -##ers -##26 -high -##day -time -##ay -bug -##line -##く -##す -##be -xp -talk2yam -yamservice -10000 -coco -##dy -sony -##ies -1978 -microsoft -david -people -##ha -1960 -instagram -intel -その -##ot -iso -1981 -##va -115 -##mo -##land -xxx -man -co -ltxsw -##ation -baby -220 -##pa -##ol -1945 -7000 -tag -450 -##ue -msn -##31 -oppo -##ト -##ca -control -##om -st -chrome -##ure -##ん -be -##き -lol -##19 -した -##bo -240 -lady -##100 -##way -##から -4600 -##ko -##do -##un -4s -corporation -168 -##ni -herme -##28 -cp -978 -##up -##06 -ui -##ds -ppt -admin -three -します -bbc -re -128 -##48 -ca -##015 -##35 -hp -##ee -tpp -##た -##ive -×× -root -##cc -##ました -##ble -##ity -adobe -park -114 -et -oled -city -##ex -##ler -##ap -china -##book -20000 -view -##ice -global -##km -your -hong -##mg -out -##ms -ng -ebay -##29 -menu -ubuntu -##cy -rom -##view -open -ktv -do -server -##lo -if -english -##ね -##5 -##oo -1600 -##02 -step1 -kong -club -135 -july -inc -1976 -mr -hi -##net -touch -##ls -##ii -michael -lcd -##05 -##33 -phone -james -step2 -1300 -ios9 -##box -dc -##2 -##ley -samsung -111 -280 -pokemon -css -##ent -##les -いいえ -##1 -s8 -atom -play -bmw -##said -sa -etf -ctrl -♥yoyo♥ -##55 -2025 -##2014 -##66 -adidas -amazon -1958 -##ber -##ner -visa -##77 -##der -1800 -connectivity -##hi -firefox -109 -118 -hr -so -style -mark -pop -ol -skip -1975 -as -##27 -##ir -##61 -190 -mba -##う -##ai -le -##ver -1900 -cafe2017 -lte -super -113 -129 -##ron -amd -like -##☆ -are -##ster -we -##sk -paul -data -international -##ft -longchamp -ssd -good -##ート -##ti -reply -##my -↓↓↓ -apr -star -##ker -source -136 -js -112 -get -force -photo -##one -126 -##2013 -##ow -link -bbs -1972 -goods -##lin -python -119 -##ip -game -##ics -##ません -blue -##● -520 -##45 -page -itunes -##03 -1955 -260 -1968 -gt -gif -618 -##ff -##47 -group -くたさい -about -bar -ganji -##nce -music -lee -not -1977 -1971 -1973 -##per -an -faq -comment -##って -days -##ock -116 -##bs -1974 -1969 -v1 -player -1956 -xbox -sql -fm -f1 -139 -##ah -210 -##lv -##mp -##000 -melody -1957 -##3 -550 -17life -199 -1966 -xml -market -##au -##71 -999 -##04 -what -gl -##95 -##age -tips -##68 -book -##ting -mysql -can -1959 -230 -##ung -wonderland -watch -10℃ -##ction -9000 -mar -mobile -1946 -1962 -article -##db -part -▲top -party -って -1967 -1964 -1948 -##07 -##ore -##op -この -dj -##78 -##38 -010 -main -225 -1965 -##ong -art -320 -ad -134 -020 -##73 -117 -pm2 -japan -228 -##08 -ts -1963 -##ica -der -sm -##36 -2019 -##wa -ct -##7 -##や -##64 -1937 -homemesh -search -##85 -##れは -##tv -##di -macbook -##9 -##くたさい -service -##♥ -type -った -750 -##ier -##si -##75 -##います -##ok -best -##ット -goris -lock -##った -cf -3m -big -##ut -ftp -carol -##vi -10 -1961 -happy -sd -##ac -122 -anti -pe -cnn -iii -1920 -138 -##ラ -1940 -esp -jan -tags -##98 -##51 -august -vol -##86 -154 -##™ -##fs -##れ -##sion -design -ac -##ム -press -jordan -ppp -that -key -check -##6 -##tt -##㎡ -1080p -##lt -power -##42 -1952 -##bc -vivi -##ック -he -133 -121 -jpg -##rry -201 -175 -3500 -1947 -nb -##ted -##rn -しています -1954 -usd -##t00 -master -##ンク -001 -model -##58 -al -##09 -1953 -##34 -ram -goo -ても -##ui -127 -1930 -red -##ary -rpg -item -##pm -##41 -270 -##za -project -##2012 -hot -td -blogabstract -##ger -##62 -650 -##44 -gr2 -##します -##m -black -electronic -nfc -year -asus -また -html5 -cindy -##hd -m3 -132 -esc -##od -booking -##53 -fed -tvb -##81 -##ina -mit -165 -##いる -chan -192 -distribution -next -になる -peter -bios -steam -cm -1941 -にも -pk10 -##ix -##65 -##91 -dec -nasa -##ana -icecat -00z -b1 -will -##46 -li -se -##ji -##み -##ard -oct -##ain -jp -##ze -##bi -cio -##56 -smart -h5 -##39 -##port -curve -vpn -##nm -##dia -utc -##あり -12345678910 -##52 -rmvb -chanel -a4 -miss -##and -##im -media -who -##63 -she -girl -5s -124 -vera -##して -class -vivo -king -##フ -##ei -national -ab -1951 -5cm -888 -145 -ipod -ap -1100 -5mm -211 -ms -2756 -##69 -mp4 -msci -##po -##89 -131 -mg -index -380 -##bit -##out -##zz -##97 -##67 -158 -apec -##8 -photoshop -opec -¥799 -ては -##96 -##tes -##ast -2g -○○ -##ール -¥2899 -##ling -##よ -##ory -1938 -##ical -kitty -content -##43 -step3 -##cn -win8 -155 -vc -1400 -iphone7 -robert -##した -tcl -137 -beauty -##87 -en -dollars -##ys -##oc -step -pay -yy -a1 -##2011 -##lly -##ks -##♪ -1939 -188 -download -1944 -sep -exe -ph -います -school -gb -center -pr -street -##board -uv -##37 -##lan -winrar -##que -##ua -##com -1942 -1936 -480 -gpu -##4 -ettoday -fu -tom -##54 -##ren -##via -149 -##72 -b2b -144 -##79 -##tch -rose -arm -mb -##49 -##ial -##nn -nvidia -step4 -mvp -00㎡ -york -156 -##イ -how -cpi -591 -2765 -gov -kg -joe -##xx -mandy -pa -##ser -copyright -fashion -1935 -don -##け -ecu -##ist -##art -erp -wap -have -##lm -talk -##ek -##ning -##if -ch -##ite -video -1943 -cs -san -iot -look -##84 -##2010 -##ku -october -##ux -trump -##hs -##ide -box -141 -first -##ins -april -##ight -##83 -185 -angel -protected -aa -151 -162 -x1 -m2 -##fe -##× -##ho -size -143 -min -ofo -fun -gomaji -ex -hdmi -food -dns -march -chris -kevin -##のか -##lla -##pp -##ec -ag -ems -6s -720p -##rm -##ham -off -##92 -asp -team -fandom -ed -299 -▌♥ -##ell -info -されています -##82 -sina -4066 -161 -##able -##ctor -330 -399 -315 -dll -rights -ltd -idc -jul -3kg -1927 -142 -ma -surface -##76 -##ク -~~~ -304 -mall -eps -146 -green -##59 -map -space -donald -v2 -sodu -##light -1931 -148 -1700 -まて -310 -reserved -htm -##han -##57 -2d -178 -mod -##ise -##tions -152 -ti -##shi -doc -1933 -icp -055 -wang -##ram -shopping -aug -##pi -##well -now -wam -b2 -からお -##hu -236 -1928 -##gb -266 -f2 -##93 -153 -mix -##ef -##uan -bwl -##plus -##res -core -##ess -tea -5℃ -hktvmall -nhk -##ate -list -##ese -301 -feb -4m -inn -ての -nov -159 -12345 -daniel -##ci -pass -##bet -##nk -coffee -202 -ssl -airbnb -##ute -fbi -woshipm -skype -ea -cg -sp -##fc -##www -yes -edge -alt -007 -##94 -fpga -##ght -##gs -iso9001 -さい -##ile -##wood -##uo -image -lin -icon -american -##em -1932 -set -says -##king -##tive -blogger -##74 -なと -256 -147 -##ox -##zy -##red -##ium -##lf -nokia -claire -##リ -##ding -november -lohas -##500 -##tic -##マ -##cs -##ある -##che -##ire -##gy -##ult -db -january -win -##カ -166 -road -ptt -##ま -##つ -198 -##fa -##mer -anna -pchome -はい -udn -ef -420 -##time -##tte -2030 -##ア -g20 -white -かかります -1929 -308 -garden -eleven -di -##おります -chen -309b -777 -172 -young -cosplay -ちてない -4500 -bat -##123 -##tra -##ては -kindle -npc -steve -etc -##ern -##| -call -xperia -ces -travel -sk -s7 -##ous -1934 -##int -みいたたけます -183 -edu -file -cho -qr -##car -##our -186 -##ant -##d -eric -1914 -rends -##jo -##する -mastercard -##2000 -kb -##min -290 -##ino -vista -##ris -##ud -jack -2400 -##set -169 -pos -1912 -##her -##ou -taipei -しく -205 -beta -##ませんか -232 -##fi -express -255 -body -##ill -aphojoy -user -december -meiki -##ick -tweet -richard -##av -##ᆫ -iphone6 -##dd -ちてすか -views -##mark -321 -pd -##00 -times -##▲ -level -##ash -10g -point -5l -##ome -208 -koreanmall -##ak -george -q2 -206 -wma -tcp -##200 -スタッフ -full -mlb -##lle -##watch -tm -run -179 -911 -smith -business -##und -1919 -color -##tal -222 -171 -##less -moon -4399 -##rl -update -pcb -shop -499 -157 -little -なし -end -##mhz -van -dsp -easy -660 -##house -##key -history -##o -oh -##001 -##hy -##web -oem -let -was -##2009 -##gg -review -##wan -182 -##°c -203 -uc -title -##val -united -233 -2021 -##ons -doi -trivago -overdope -sbs -##ance -##ち -grand -special -573032185 -imf -216 -wx17house -##so -##ーム -audi -##he -london -william -##rp -##ake -science -beach -cfa -amp -ps4 -880 -##800 -##link -##hp -crm -ferragamo -bell -make -##eng -195 -under -zh -photos -2300 -##style -##ント -via -176 -da -##gi -company -i7 -##ray -thomas -370 -ufo -i5 -##max -plc -ben -back -research -8g -173 -mike -##pc -##ッフ -september -189 -##ace -vps -february -167 -pantos -wp -lisa -1921 -★★ -jquery -night -long -offer -##berg -##news -1911 -##いて -ray -fks -wto -せます -over -164 -340 -##all -##rus -1924 -##888 -##works -blogtitle -loftpermalink -##→ -187 -martin -test -ling -km -##め -15000 -fda -v3 -##ja -##ロ -wedding -かある -outlet -family -##ea -をこ -##top -story -##ness -salvatore -##lu -204 -swift -215 -room -している -oracle -##ul -1925 -sam -b2c -week -pi -rock -##のは -##a -##けと -##ean -##300 -##gle -cctv -after -chinese -##back -powered -x2 -##tan -1918 -##nes -##イン -canon -only -181 -##zi -##las -say -##oe -184 -##sd -221 -##bot -##world -##zo -sky -made -top100 -just -1926 -pmi -802 -234 -gap -##vr -177 -les -174 -▲topoct -ball -vogue -vi -ing -ofweek -cos -##list -##ort -▲topmay -##なら -##lon -として -last -##tc -##of -##bus -##gen -real -eva -##コ -a3 -nas -##lie -##ria -##coin -##bt -▲topapr -his -212 -cat -nata -vive -health -⋯⋯ -drive -sir -▲topmar -du -cup -##カー -##ook -##よう -##sy -alex -msg -tour -しました -3ce -##word -193 -ebooks -r8 -block -318 -##より -2200 -nice -pvp -207 -months -1905 -rewards -##ther -1917 -0800 -##xi -##チ -##sc -micro -850 -gg -blogfp -op -1922 -daily -m1 -264 -true -##bb -ml -##tar -##のお -##ky -anthony -196 -253 -##yo -state -218 -##ara -##aa -##rc -##tz -##ston -より -gear -##eo -##ade -ge -see -1923 -##win -##ura -ss -heart -##den -##ita -down -##sm -el -png -2100 -610 -rakuten -whatsapp -bay -dream -add -##use -680 -311 -pad -gucci -mpv -##ode -##fo -island -▲topjun -##▼ -223 -jason -214 -chicago -##❤ -しの -##hone -io -##れる -##ことか -sogo -be2 -##ology -990 -cloud -vcd -##con -2~3 -##ford -##joy -##kb -##こさいます -##rade -but -##ach -docker -##ful -rfid -ul -##ase -hit -ford -##star -580 -##○ -11 -a2 -sdk -reading -edited -##are -cmos -##mc -238 -siri -light -##ella -##ため -bloomberg -##read -pizza -##ison -jimmy -##vm -college -node -journal -ba -18k -##play -245 -##cer -20 -magic -##yu -191 -jump -288 -tt -##ings -asr -##lia -3200 -step5 -network -##cd -mc -いします -1234 -pixstyleme -273 -##600 -2800 -money -★★★★★ -1280 -12 -430 -bl -みの -act -##tus -tokyo -##rial -##life -emba -##ae -saas -tcs -##rk -##wang -summer -##sp -ko -##ving -390 -premium -##その -netflix -##ヒ -uk -mt -##lton -right -frank -two -209 -える -##ple -##cal -021 -##んな -##sen -##ville -hold -nexus -dd -##ius -てお -##mah -##なく -tila -zero -820 -ce -##tin -resort -##ws -charles -old -p10 -5d -report -##360 -##ru -##には -bus -vans -lt -##est -pv -##レ -links -rebecca -##ツ -##dm -azure -##365 -きな -limited -bit -4gb -##mon -1910 -moto -##eam -213 -1913 -var -eos -なとの -226 -blogspot -された -699 -e3 -dos -dm -fc -##ments -##ik -##kw -boy -##bin -##ata -960 -er -##せ -219 -##vin -##tu -##ula -194 -##∥ -station -##ろ -##ature -835 -files -zara -hdr -top10 -nature -950 -magazine -s6 -marriott -##シ -avira -case -##っと -tab -##ran -tony -##home -oculus -im -##ral -jean -saint -cry -307 -rosie -##force -##ini -ice -##bert -のある -##nder -##mber -pet -2600 -##◆ -plurk -▲topdec -##sis -00kg -▲topnov -720 -##ence -tim -##ω -##nc -##ても -##name -log -ips -great -ikea -malaysia -unix -##イト -3600 -##ncy -##nie -12000 -akb48 -##ye -##oid -404 -##chi -##いた -oa -xuehai -##1000 -##orm -##rf -275 -さん -##ware -##リー -980 -ho -##pro -text -##era -560 -bob -227 -##ub -##2008 -8891 -scp -avi -##zen -2022 -mi -wu -museum -qvod -apache -lake -jcb -▲topaug -★★★ -ni -##hr -hill -302 -ne -weibo -490 -ruby -##ーシ -##ヶ -##row -4d -▲topjul -iv -##ish -github -306 -mate -312 -##スト -##lot -##ane -andrew -のハイト -##tina -t1 -rf -ed2k -##vel -##900 -way -final -りの -ns -5a -705 -197 -##メ -sweet -bytes -##ene -▲topjan -231 -##cker -##2007 -##px -100g -topapp -229 -helpapp -rs -low -14k -g4g -care -630 -ldquo -あり -##fork -leave -rm -edition -##gan -##zon -##qq -▲topsep -##google -##ism -gold -224 -explorer -##zer -toyota -category -select -visual -##labels -restaurant -##md -posts -s1 -##ico -もっと -angelababy -123456 -217 -sports -s3 -mbc -1915 -してくたさい -shell -x86 -candy -##new -kbs -face -xl -470 -##here -4a -swissinfo -v8 -▲topfeb -dram -##ual -##vice -3a -##wer -sport -q1 -ios10 -public -int -card -##c -ep -au -rt -##れた -1080 -bill -##mll -kim -30 -460 -wan -##uk -##ミ -x3 -298 -0t -scott -##ming -239 -e5 -##3d -h7n9 -worldcat -brown -##あります -##vo -##led -##580 -##ax -249 -410 -##ert -paris -##~6 -polo -925 -##lr -599 -##ナ -capital -##hing -bank -cv -1g -##chat -##s -##たい -adc -##ule -2m -##e -digital -hotmail -268 -##pad -870 -bbq -quot -##ring -before -wali -##まて -mcu -2k -2b -という -costco -316 -north -333 -switch -##city -##p -philips -##mann -management -panasonic -##cl -##vd -##ping -##rge -alice -##lk -##ましょう -css3 -##ney -vision -alpha -##ular -##400 -##tter -lz -にお -##ありません -mode -gre -1916 -pci -##tm -237 -1~2 -##yan -##そ -について -##let -##キ -work -war -coach -ah -mary -##ᅵ -huang -##pt -a8 -pt -follow -##berry -1895 -##ew -a5 -ghost -##ション -##wn -##og -south -##code -girls -##rid -action -villa -git -r11 -table -games -##cket -error -##anonymoussaid -##ag -here -##ame -##gc -qa -##■ -##lis -gmp -##gin -vmalife -##cher -yu -wedding -##tis -demo -dragon -530 -soho -social -bye -##rant -river -orz -acer -325 -##↑ -##ース -##ats -261 -del -##ven -440 -ups -##ように -##ター -305 -value -macd -yougou -##dn -661 -##ano -ll -##urt -##rent -continue -script -##wen -##ect -paper -263 -319 -shift -##chel -##フト -##cat -258 -x5 -fox -243 -##さん -car -aaa -##blog -loading -##yn -##tp -kuso -799 -si -sns -イカせるテンマ -ヒンクテンマ3 -rmb -vdc -forest -central -prime -help -ultra -##rmb -##ような -241 -square -688 -##しい -のないフロクに -##field -##reen -##ors -##ju -c1 -start -510 -##air -##map -cdn -##wo -cba -stephen -m8 -100km -##get -opera -##base -##ood -vsa -com™ -##aw -##ail -251 -なのて -count -t2 -##ᅡ -##een -2700 -hop -##gp -vsc -tree -##eg -##ose -816 -285 -##ories -##shop -alphago -v4 -1909 -simon -##ᆼ -fluke62max -zip -スホンサー -##sta -louis -cr -bas -##~10 -bc -##yer -hadoop -##ube -##wi -1906 -0755 -hola -##low -place -centre -5v -d3 -##fer -252 -##750 -##media -281 -540 -0l -exchange -262 -series -##ハー -##san -eb -##bank -##k -q3 -##nge -##mail -take -##lp -259 -1888 -client -east -cache -event -vincent -##ールを -きを -##nse -sui -855 -adchoice -##и -##stry -##なたの -246 -##zone -ga -apps -sea -##ab -248 -cisco -##タ -##rner -kymco -##care -dha -##pu -##yi -minkoff -royal -p1 -への -annie -269 -collection -kpi -playstation -257 -になります -866 -bh -##bar -queen -505 -radio -1904 -andy -armani -##xy -manager -iherb -##ery -##share -spring -raid -johnson -1908 -##ob -volvo -hall -##ball -v6 -our -taylor -##hk -bi -242 -##cp -kate -bo -water -technology -##rie -サイトは -277 -##ona -##sl -hpv -303 -gtx -hip -rdquo -jayz -stone -##lex -##rum -namespace -##やり -620 -##ale -##atic -des -##erson -##ql -##ves -##type -enter -##この -##てきます -d2 -##168 -##mix -##bian -との -a9 -jj -ky -##lc -access -movie -##hc -リストに -tower -##ration -##mit -ます -##nch -ua -tel -prefix -##o2 -1907 -##point -1901 -ott -~10 -##http -##ury -baidu -##ink -member -##logy -bigbang -nownews -##js -##shot -##tb -##こと -247 -eba -##tics -##lus -ける -v5 -spark -##ama -there -##ions -god -##lls -##down -hiv -##ress -burberry -day2 -##kv -◆◆ -jeff -related -film -edit -joseph -283 -##ark -cx -32gb -order -g9 -30000 -##ans -##tty -s5 -##bee -かあります -thread -xr -buy -sh -005 -land -spotify -mx -##ari -276 -##verse -×email -sf -why -##ことて -244 -7headlines -nego -sunny -dom -exo -401 -666 -positioning -fit -rgb -##tton -278 -kiss -alexa -adam -lp -みリストを -##g -mp -##ties -##llow -amy -##du -np -002 -institute -271 -##rth -##lar -2345 -590 -##des -sidebar -15 -imax -site -##cky -##kit -##ime -##009 -season -323 -##fun -##ンター -##ひ -gogoro -a7 -pu -lily -fire -twd600 -##ッセーシを -いて -##vis -30ml -##cture -##をお -information -##オ -close -friday -##くれる -yi -nick -てすか -##tta -##tel -6500 -##lock -cbd -economy -254 -かお -267 -tinker -double -375 -8gb -voice -##app -oops -channel -today -985 -##right -raw -xyz -##+ -jim -edm -##cent -7500 -supreme -814 -ds -##its -##asia -dropbox -##てすか -##tti -books -272 -100ml -##tle -##ller -##ken -##more -##boy -sex -309 -##dom -t3 -##ider -##なります -##unch -1903 -810 -feel -5500 -##かった -##put -により -s2 -mo -##gh -men -ka -amoled -div -##tr -##n1 -port -howard -##tags -ken -dnf -##nus -adsense -##а -ide -##へ -buff -thunder -##town -##ique -has -##body -auto -pin -##erry -tee -てした -295 -number -##the -##013 -object -psp -cool -udnbkk -16gb -##mic -miui -##tro -most -r2 -##alk -##nity -1880 -±0 -##いました -428 -s4 -law -version -##oa -n1 -sgs -docomo -##tf -##ack -henry -fc2 -##ded -##sco -##014 -##rite -286 -0mm -linkedin -##ada -##now -wii -##ndy -ucbug -##◎ -sputniknews -legalminer -##ika -##xp -2gb -##bu -q10 -oo -b6 -come -##rman -cheese -ming -maker -##gm -nikon -##fig -ppi -kelly -##ります -jchere -てきます -ted -md -003 -fgo -tech -##tto -dan -soc -##gl -##len -hair -earth -640 -521 -img -##pper -##a1 -##てきる -##ロク -acca -##ition -##ference -suite -##ig -outlook -##mond -##cation -398 -##pr -279 -101vip -358 -##999 -282 -64gb -3800 -345 -airport -##over -284 -##おり -jones -##ith -lab -##su -##いるのて -co2 -town -piece -##llo -no1 -vmware -24h -##qi -focus -reader -##admin -##ora -tb -false -##log -1898 -know -lan -838 -##ces -f4 -##ume -motel -stop -##oper -na -flickr -netcomponents -##af -##─ -pose -williams -local -##ound -##cg -##site -##iko -いお -274 -5m -gsm -con -##ath -1902 -friends -##hip -cell -317 -##rey -780 -cream -##cks -012 -##dp -facebooktwitterpinterestgoogle -sso -324 -shtml -song -swiss -##mw -##キンク -lumia -xdd -string -tiffany -522 -marc -られた -insee -russell -sc -dell -##ations -ok -camera -289 -##vs -##flow -##late -classic -287 -##nter -stay -g1 -mtv -512 -##ever -##lab -##nger -qe -sata -ryan -d1 -50ml -cms -##cing -su -292 -3300 -editor -296 -##nap -security -sunday -association -##ens -##700 -##bra -acg -##かり -sofascore -とは -mkv -##ign -jonathan -gary -build -labels -##oto -tesla -moba -qi -gohappy -general -ajax -1024 -##かる -サイト -society -##test -##urs -wps -fedora -##ich -mozilla -328 -##480 -##dr -usa -urn -##lina -##r -grace -##die -##try -##ader -1250 -##なり -elle -570 -##chen -##ᆯ -price -##ten -uhz -##ough -eq -##hen -states -push -session -balance -wow -506 -##cus -##py -when -##ward -##ep -34e -wong -library -prada -##サイト -##cle -running -##ree -313 -ck -date -q4 -##ctive -##ool -##> -mk -##ira -##163 -388 -die -secret -rq -dota -buffet -は1ヶ -e6 -##ez -pan -368 -ha -##card -##cha -2a -##さ -alan -day3 -eye -f3 -##end -france -keep -adi -rna -tvbs -##ala -solo -nova -##え -##tail -##ょう -support -##ries -##なる -##ved -base -copy -iis -fps -##ways -hero -hgih -profile -fish -mu -ssh -entertainment -chang -##wd -click -cake -##ond -pre -##tom -kic -pixel -##ov -##fl -product -6a -##pd -dear -##gate -es -yumi -audio -##² -##sky -echo -bin -where -##ture -329 -##ape -find -sap -isis -##なと -nand -##101 -##load -##ream -band -a6 -525 -never -##post -festival -50cm -##we -555 -guide -314 -zenfone -##ike -335 -gd -forum -jessica -strong -alexander -##ould -software -allen -##ious -program -360° -else -lohasthree -##gar -することかてきます -please -##れます -rc -##ggle -##ric -bim -50000 -##own -eclipse -355 -brian -3ds -##side -061 -361 -##other -##ける -##tech -##ator -485 -engine -##ged -##t -plaza -##fit -cia -ngo -westbrook -shi -tbs -50mm -##みませんか -sci -291 -reuters -##ily -contextlink -##hn -af -##cil -bridge -very -##cel -1890 -cambridge -##ize -15g -##aid -##data -790 -frm -##head -award -butler -##sun -meta -##mar -america -ps3 -puma -pmid -##すか -lc -670 -kitchen -##lic -オーフン5 -きなしソフトサーヒス -そして -day1 -future -★★★★ -##text -##page -##rris -pm1 -##ket -fans -##っています -1001 -christian -bot -kids -trackback -##hai -c3 -display -##hl -n2 -1896 -idea -さんも -##sent -airmail -##ug -##men -pwm -けます -028 -##lution -369 -852 -awards -schemas -354 -asics -wikipedia -font -##tional -##vy -c2 -293 -##れている -##dget -##ein -っている -contact -pepper -スキル -339 -##~5 -294 -##uel -##ument -730 -##hang -みてす -q5 -##sue -rain -##ndi -wei -swatch -##cept -わせ -331 -popular -##ste -##tag -p2 -501 -trc -1899 -##west -##live -justin -honda -ping -messenger -##rap -v9 -543 -##とは -unity -appqq -はすへて -025 -leo -##tone -##テ -##ass -uniqlo -##010 -502 -her -jane -memory -moneydj -##tical -human -12306 -していると -##m2 -coc -miacare -##mn -tmt -##core -vim -kk -##may -fan -target -use -too -338 -435 -2050 -867 -737 -fast -##2c -services -##ope -omega -energy -##わ -pinkoi -1a -##なから -##rain -jackson -##ement -##シャンルの -374 -366 -そんな -p9 -rd -##ᆨ -1111 -##tier -##vic -zone -##│ -385 -690 -dl -isofix -cpa -m4 -322 -kimi -めて -davis -##lay -lulu -##uck -050 -weeks -qs -##hop -920 -##n -ae -##ear -~5 -eia -405 -##fly -korea -jpeg -boost -##ship -small -##リア -1860 -eur -297 -425 -valley -##iel -simple -##ude -rn -k2 -##ena -されます -non -patrick -しているから -##ナー -feed -5757 -30g -process -well -qqmei -##thing -they -aws -lu -pink -##ters -##kin -または -board -##vertisement -wine -##ien -unicode -##dge -r1 -359 -##tant -いを -##twitter -##3c -cool1 -される -##れて -##l -isp -##012 -standard -45㎡2 -402 -##150 -matt -##fu -326 -##iner -googlemsn -pixnetfacebookyahoo -##ラン -x7 -886 -##uce -メーカー -sao -##ev -##きました -##file -9678 -403 -xddd -shirt -6l -##rio -##hat -3mm -givenchy -ya -bang -##lio -monday -crystal -ロクイン -##abc -336 -head -890 -ubuntuforumwikilinuxpastechat -##vc -##~20 -##rity -cnc -7866 -ipv6 -null -1897 -##ost -yang -imsean -tiger -##fet -##ンス -352 -##= -dji -327 -ji -maria -##come -##んて -foundation -3100 -##beth -##なった -1m -601 -active -##aft -##don -3p -sr -349 -emma -##khz -living -415 -353 -1889 -341 -709 -457 -sas -x6 -##face -pptv -x4 -##mate -han -sophie -##jing -337 -fifa -##mand -other -sale -inwedding -##gn -てきちゃいます -##mmy -##pmlast -bad -nana -nbc -してみてくたさいね -なとはお -##wu -##かあります -##あ -note7 -single -##340 -せからこ -してくたさい♪この -しにはとんとんワークケートを -するとあなたにもっとマッチした -ならワークケートへ -もみつかっちゃうかも -ワークケートの -##bel -window -##dio -##ht -union -age -382 -14 -##ivity -##y -コメント -domain -neo -##isa -##lter -5k -f5 -steven -##cts -powerpoint -tft -self -g2 -ft -##テル -zol -##act -mwc -381 -343 -もう -nbapop -408 -てある -eds -ace -##room -previous -author -tomtom -il -##ets -hu -financial -☆☆☆ -っています -bp -5t -chi -1gb -##hg -fairmont -cross -008 -gay -h2 -function -##けて -356 -also -1b -625 -##ータ -##raph -1894 -3~5 -##ils -i3 -334 -avenue -##host -による -##bon -##tsu -message -navigation -50g -fintech -h6 -##ことを -8cm -##ject -##vas -##firm -credit -##wf -xxxx -form -##nor -##space -huawei -plan -json -sbl -##dc -machine -921 -392 -wish -##120 -##sol -windows7 -edward -##ために -development -washington -##nsis -lo -818 -##sio -##ym -##bor -planet -##~8 -##wt -ieee -gpa -##めて -camp -ann -gm -##tw -##oka -connect -##rss -##work -##atus -wall -chicken -soul -2mm -##times -fa -##ather -##cord -009 -##eep -hitachi -gui -harry -##pan -e1 -disney -##press -##ーション -wind -386 -frigidaire -##tl -liu -hsu -332 -basic -von -ev -いた -てきる -スホンサーサイト -learning -##ull -expedia -archives -change -##wei -santa -cut -ins -6gb -turbo -brand -cf1 -508 -004 -return -747 -##rip -h1 -##nis -##をこ -128gb -##にお -3t -application -しており -emc -rx -##oon -384 -quick -412 -15058 -wilson -wing -chapter -##bug -beyond -##cms -##dar -##oh -zoom -e2 -trip -sb -##nba -rcep -342 -aspx -ci -080 -gc -gnu -める -##count -advanced -dance -dv -##url -##ging -367 -8591 -am09 -shadow -battle -346 -##i -##cia -##という -emily -##のてす -##tation -host -ff -techorz -sars -##mini -##mporary -##ering -nc -4200 -798 -##next -cma -##mbps -##gas -##ift -##dot -##ィ -455 -##~17 -amana -##りの -426 -##ros -ir -00㎡1 -##eet -##ible -##↓ -710 -ˋ▽ˊ -##aka -dcs -iq -##v -l1 -##lor -maggie -##011 -##iu -588 -##~1 -830 -##gt -1tb -articles -create -##burg -##iki -database -fantasy -##rex -##cam -dlc -dean -##you -hard -path -gaming -victoria -maps -cb -##lee -##itor -overchicstoretvhome -systems -##xt -416 -p3 -sarah -760 -##nan -407 -486 -x9 -install -second -626 -##ann -##ph -##rcle -##nic -860 -##nar -ec -##とう -768 -metro -chocolate -##rian -~4 -##table -##しています -skin -##sn -395 -mountain -##0mm -inparadise -6m -7x24 -ib -4800 -##jia -eeworld -creative -g5 -g3 -357 -parker -ecfa -village -からの -18000 -sylvia -サーヒス -hbl -##ques -##onsored -##x2 -##きます -##v4 -##tein -ie6 -383 -##stack -389 -ver -##ads -##baby -sound -bbe -##110 -##lone -##uid -ads -022 -gundam -351 -thinkpad -006 -scrum -match -##ave -mems -##470 -##oy -##なりました -##talk -glass -lamigo -span -##eme -job -##a5 -jay -wade -kde -498 -##lace -ocean -tvg -##covery -##r3 -##ners -##rea -junior -think -##aine -cover -##ision -##sia -↓↓ -##bow -msi -413 -458 -406 -##love -711 -801 -soft -z2 -##pl -456 -1840 -mobil -mind -##uy -427 -nginx -##oi -めた -##rr -6221 -##mple -##sson -##ーシてす -371 -##nts -91tv -comhd -crv3000 -##uard -1868 -397 -deep -lost -field -gallery -##bia -rate -spf -redis -traction -930 -icloud -011 -なら -fe -jose -372 -##tory -into -sohu -fx -899 -379 -kicstart2 -##hia -すく -##~3 -##sit -ra -24 -##walk -##xure -500g -##pact -pacific -xa -natural -carlo -##250 -##walker -1850 -##can -cto -gigi -516 -##サー -pen -##hoo -ob -matlab -##b -##yy -13913459 -##iti -mango -##bbs -sense -c5 -oxford -##ニア -walker -jennifer -##ola -course -##bre -701 -##pus -##rder -lucky -075 -##ぁ -ivy -なお -##nia -sotheby -side -##ugh -joy -##orage -##ush -##bat -##dt -364 -r9 -##2d -##gio -511 -country -wear -##lax -##~7 -##moon -393 -seven -study -411 -348 -lonzo -8k -##ェ -evolution -##イフ -##kk -gs -kd -##レス -arduino -344 -b12 -##lux -arpg -##rdon -cook -##x5 -dark -five -##als -##ida -とても -sign -362 -##ちの -something -20mm -##nda -387 -##posted -fresh -tf -1870 -422 -cam -##mine -##skip -##form -##ssion -education -394 -##tee -dyson -stage -##jie -want -##night -epson -pack -あります -##ppy -テリヘル -##█ -wd -##eh -##rence -left -##lvin -golden -mhz -discovery -##trix -##n2 -loft -##uch -##dra -##sse -speed -~1 -1mdb -sorry -welcome -##urn -wave -gaga -##lmer -teddy -##160 -トラックハック -せよ -611 -##f2016 -378 -rp -##sha -rar -##あなたに -##きた -840 -holiday -##ュー -373 -074 -##vg -##nos -##rail -gartner -gi -6p -##dium -kit -488 -b3 -eco -##ろう -20g -sean -##stone -autocad -nu -##np -f16 -write -029 -m5 -##ias -images -atp -##dk -fsm -504 -1350 -ve -52kb -##xxx -##のに -##cake -414 -unit -lim -ru -1v -##ification -published -angela -16g -analytics -ak -##q -##nel -gmt -##icon -again -##₂ -##bby -ios11 -445 -かこさいます -waze -いてす -##ハ -9985 -##ust -##ティー -framework -##007 -iptv -delete -52sykb -cl -wwdc -027 -30cm -##fw -##ての -1389 -##xon -brandt -##ses -##dragon -tc -vetements -anne -monte -modern -official -##へて -##ere -##nne -##oud -もちろん -50 -etnews -##a2 -##graphy -421 -863 -##ちゃん -444 -##rtex -##てお -l2 -##gma -mount -ccd -たと -archive -morning -tan -ddos -e7 -##ホ -day4 -##ウ -gis -453 -its -495 -factory -bruce -pg -##ito -ってくたさい -guest -cdma -##lling -536 -n3 -しかし -3~4 -mega -eyes -ro -13 -women -dac -church -##jun -singapore -##facebook -6991 -starbucks -##tos -##stin -##shine -zen -##mu -tina -20℃ -1893 -##たけて -503 -465 -request -##gence -qt -##っ -1886 -347 -363 -q7 -##zzi -diary -##tore -409 -##ead -468 -cst -##osa -canada -agent -va -##jiang -##ちは -##ーク -##lam -sg -##nix -##sday -##よって -g6 -##master -bing -##zl -charlie -16 -8mm -nb40 -##ーン -thai -##ルフ -ln284ct -##itz -##2f -bonnie -##food -##lent -originals -##stro -##lts -418 -∟∣ -##bscribe -children -ntd -yesstyle -##かも -hmv -##tment -d5 -2cm -arts -sms -##pn -##я -##いい -topios9 -539 -lifestyle -virtual -##ague -xz -##deo -muji -024 -unt -##nnis -##ᅩ -faq1 -1884 -396 -##ette -fly -64㎡ -はしめまして -441 -curry -##pop -のこ -release -##← -##◆◆ -##cast -073 -ありな -500ml -##ews -5c -##stle -ios7 -##ima -787 -dog -lenovo -##r4 -roger -013 -cbs -vornado -100m -417 -##desk -##クok -##ald -1867 -9595 -2900 -##van -oil -##x -some -break -common -##jy -##lines -g7 -twice -419 -ella -nano -belle -にこ -##mes -##self -##note -jb -##ことかてきます -benz -##との -##ova -451 -save -##wing -##ますのて -kai -りは -##hua -##rect -rainer -##unge -448 -##0m -adsl -##かな -guestname -##uma -##kins -##zu -tokichoi -##price -county -##med -##mus -rmk -391 -address -vm -えて -openload -##group -##hin -##iginal -amg -urban -##oz -jobs -emi -##public -beautiful -##sch -album -##dden -##bell -jerry -works -hostel -miller -##drive -##rmin -##10 -376 -boot -828 -##370 -##fx -##cm~ -1885 -##nome -##ctionary -##oman -##lish -##cr -##hm -433 -##how -432 -francis -xi -c919 -b5 -evernote -##uc -vga -##3000 -coupe -##urg -##cca -##uality -019 -6g -れる -multi -##また -##ett -em -hey -##ani -##tax -##rma -inside -than -740 -leonnhurt -##jin -ict -れた -bird -notes -200mm -くの -##dical -##lli -result -442 -iu -ee -438 -smap -gopro -##last -yin -pure -998 -32g -けた -5kg -##dan -##rame -mama -##oot -bean -marketing -##hur -2l -bella -sync -xuite -##ground -515 -discuz -##getrelax -##ince -##bay -##5s -cj -##イス -gmat -apt -##pass -jing -##rix -c4 -rich -##とても -niusnews -##ello -bag -770 -##eting -##mobile -18 -culture -015 -##のてすか -377 -1020 -area -##ience -616 -details -gp -universal -silver -dit -はお -private -ddd -u11 -kanshu -##ified -fung -##nny -dx -##520 -tai -475 -023 -##fr -##lean -3s -##pin -429 -##rin -25000 -ly -rick -##bility -usb3 -banner -##baru -##gion -metal -dt -vdf -1871 -karl -qualcomm -bear -1010 -oldid -ian -jo -##tors -population -##ernel -1882 -mmorpg -##mv -##bike -603 -##© -ww -friend -##ager -exhibition -##del -##pods -fpx -structure -##free -##tings -kl -##rley -##copyright -##mma -california -3400 -orange -yoga -4l -canmake -honey -##anda -##コメント -595 -nikkie -##ルハイト -dhl -publishing -##mall -##gnet -20cm -513 -##クセス -##┅ -e88 -970 -##dog -fishbase -##! -##" -### -##$ -##% -##& -##' -##( -##) -##* -##+ -##, -##- -##. -##/ -##: -##; -##< -##= -##> -##? -##@ -##[ -##\ -##] -##^ -##_ -##{ -##| -##} -##~ -##£ -##¤ -##¥ -##§ -##« -##± -##³ -##µ -##· -##¹ -##º -##» -##¼ -##ß -##æ -##÷ -##ø -##đ -##ŋ -##ɔ -##ə -##ɡ -##ʰ -##ˇ -##ˈ -##ˊ -##ˋ -##ˍ -##ː -##˙ -##˚ -##ˢ -##α -##β -##γ -##δ -##ε -##η -##θ -##ι -##κ -##λ -##μ -##ν -##ο -##π -##ρ -##ς -##σ -##τ -##υ -##φ -##χ -##ψ -##б -##в -##г -##д -##е -##ж -##з -##к -##л -##м -##н -##о -##п -##р -##с -##т -##у -##ф -##х -##ц -##ч -##ш -##ы -##ь -##і -##ا -##ب -##ة -##ت -##د -##ر -##س -##ع -##ل -##م -##ن -##ه -##و -##ي -##۩ -##ก -##ง -##น -##ม -##ย -##ร -##อ -##า -##เ -##๑ -##་ -##ღ -##ᄀ -##ᄁ -##ᄂ -##ᄃ -##ᄅ -##ᄆ -##ᄇ -##ᄈ -##ᄉ -##ᄋ -##ᄌ -##ᄎ -##ᄏ -##ᄐ -##ᄑ -##ᄒ -##ᅢ -##ᅣ -##ᅥ -##ᅦ -##ᅧ -##ᅨ -##ᅪ -##ᅬ -##ᅭ -##ᅮ -##ᅯ -##ᅲ -##ᅳ -##ᅴ -##ᆷ -##ᆸ -##ᆺ -##ᆻ -##ᗜ -##ᵃ -##ᵉ -##ᵍ -##ᵏ -##ᵐ -##ᵒ -##ᵘ -##‖ -##„ -##† -##• -##‥ -##‧ -##
 -##‰ -##′ -##″ -##‹ -##› -##※ -##‿ -##⁄ -##ⁱ -##⁺ -##ⁿ -##₁ -##₃ -##₄ -##€ -##№ -##ⅰ -##ⅱ -##ⅲ -##ⅳ -##ⅴ -##↔ -##↗ -##↘ -##⇒ -##∀ -##− -##∕ -##∙ -##√ -##∞ -##∟ -##∠ -##∣ -##∩ -##∮ -##∶ -##∼ -##∽ -##≈ -##≒ -##≡ -##≤ -##≥ -##≦ -##≧ -##≪ -##≫ -##⊙ -##⋅ -##⋈ -##⋯ -##⌒ -##① -##② -##③ -##④ -##⑤ -##⑥ -##⑦ -##⑧ -##⑨ -##⑩ -##⑴ -##⑵ -##⑶ -##⑷ -##⑸ -##⒈ -##⒉ -##⒊ -##⒋ -##ⓒ -##ⓔ -##ⓘ -##━ -##┃ -##┆ -##┊ -##┌ -##└ -##├ -##┣ -##═ -##║ -##╚ -##╞ -##╠ -##╭ -##╮ -##╯ -##╰ -##╱ -##╳ -##▂ -##▃ -##▅ -##▇ -##▉ -##▋ -##▌ -##▍ -##▎ -##□ -##▪ -##▫ -##▬ -##△ -##▶ -##► -##▽ -##◇ -##◕ -##◠ -##◢ -##◤ -##☀ -##☕ -##☞ -##☺ -##☼ -##♀ -##♂ -##♠ -##♡ -##♣ -##♦ -##♫ -##♬ -##✈ -##✔ -##✕ -##✖ -##✦ -##✨ -##✪ -##✰ -##✿ -##❀ -##➜ -##➤ -##⦿ -##、 -##。 -##〃 -##々 -##〇 -##〈 -##〉 -##《 -##》 -##「 -##」 -##『 -##』 -##【 -##】 -##〓 -##〔 -##〕 -##〖 -##〗 -##〜 -##〝 -##〞 -##ぃ -##ぇ -##ぬ -##ふ -##ほ -##む -##ゃ -##ゅ -##ゆ -##ょ -##゜ -##ゝ -##ァ -##ゥ -##エ -##ォ -##ケ -##サ -##セ -##ソ -##ッ -##ニ -##ヌ -##ネ -##ノ -##ヘ -##モ -##ャ -##ヤ -##ュ -##ユ -##ョ -##ヨ -##ワ -##ヲ -##・ -##ヽ -##ㄅ -##ㄆ -##ㄇ -##ㄉ -##ㄋ -##ㄌ -##ㄍ -##ㄎ -##ㄏ -##ㄒ -##ㄚ -##ㄛ -##ㄞ -##ㄟ -##ㄢ -##ㄤ -##ㄥ -##ㄧ -##ㄨ -##ㆍ -##㈦ -##㊣ -##㗎 -##一 -##丁 -##七 -##万 -##丈 -##三 -##上 -##下 -##不 -##与 -##丐 -##丑 -##专 -##且 -##丕 -##世 -##丘 -##丙 -##业 -##丛 -##东 -##丝 -##丞 -##丟 -##両 -##丢 -##两 -##严 -##並 -##丧 -##丨 -##个 -##丫 -##中 -##丰 -##串 -##临 -##丶 -##丸 -##丹 -##为 -##主 -##丼 -##丽 -##举 -##丿 -##乂 -##乃 -##久 -##么 -##义 -##之 -##乌 -##乍 -##乎 -##乏 -##乐 -##乒 -##乓 -##乔 -##乖 -##乗 -##乘 -##乙 -##乜 -##九 -##乞 -##也 -##习 -##乡 -##书 -##乩 -##买 -##乱 -##乳 -##乾 -##亀 -##亂 -##了 -##予 -##争 -##事 -##二 -##于 -##亏 -##云 -##互 -##五 -##井 -##亘 -##亙 -##亚 -##些 -##亜 -##亞 -##亟 -##亡 -##亢 -##交 -##亥 -##亦 -##产 -##亨 -##亩 -##享 -##京 -##亭 -##亮 -##亲 -##亳 -##亵 -##人 -##亿 -##什 -##仁 -##仃 -##仄 -##仅 -##仆 -##仇 -##今 -##介 -##仍 -##从 -##仏 -##仑 -##仓 -##仔 -##仕 -##他 -##仗 -##付 -##仙 -##仝 -##仞 -##仟 -##代 -##令 -##以 -##仨 -##仪 -##们 -##仮 -##仰 -##仲 -##件 -##价 -##任 -##份 -##仿 -##企 -##伉 -##伊 -##伍 -##伎 -##伏 -##伐 -##休 -##伕 -##众 -##优 -##伙 -##会 -##伝 -##伞 -##伟 -##传 -##伢 -##伤 -##伦 -##伪 -##伫 -##伯 -##估 -##伴 -##伶 -##伸 -##伺 -##似 -##伽 -##佃 -##但 -##佇 -##佈 -##位 -##低 -##住 -##佐 -##佑 -##体 -##佔 -##何 -##佗 -##佘 -##余 -##佚 -##佛 -##作 -##佝 -##佞 -##佟 -##你 -##佢 -##佣 -##佤 -##佥 -##佩 -##佬 -##佯 -##佰 -##佳 -##併 -##佶 -##佻 -##佼 -##使 -##侃 -##侄 -##來 -##侈 -##例 -##侍 -##侏 -##侑 -##侖 -##侗 -##供 -##依 -##侠 -##価 -##侣 -##侥 -##侦 -##侧 -##侨 -##侬 -##侮 -##侯 -##侵 -##侶 -##侷 -##便 -##係 -##促 -##俄 -##俊 -##俎 -##俏 -##俐 -##俑 -##俗 -##俘 -##俚 -##保 -##俞 -##俟 -##俠 -##信 -##俨 -##俩 -##俪 -##俬 -##俭 -##修 -##俯 -##俱 -##俳 -##俸 -##俺 -##俾 -##倆 -##倉 -##個 -##倌 -##倍 -##倏 -##們 -##倒 -##倔 -##倖 -##倘 -##候 -##倚 -##倜 -##借 -##倡 -##値 -##倦 -##倩 -##倪 -##倫 -##倬 -##倭 -##倶 -##债 -##值 -##倾 -##偃 -##假 -##偈 -##偉 -##偌 -##偎 -##偏 -##偕 -##做 -##停 -##健 -##側 -##偵 -##偶 -##偷 -##偻 -##偽 -##偿 -##傀 -##傅 -##傍 -##傑 -##傘 -##備 -##傚 -##傢 -##傣 -##傥 -##储 -##傩 -##催 -##傭 -##傲 -##傳 -##債 -##傷 -##傻 -##傾 -##僅 -##働 -##像 -##僑 -##僕 -##僖 -##僚 -##僥 -##僧 -##僭 -##僮 -##僱 -##僵 -##價 -##僻 -##儀 -##儂 -##億 -##儆 -##儉 -##儋 -##儒 -##儕 -##儘 -##償 -##儡 -##優 -##儲 -##儷 -##儼 -##儿 -##兀 -##允 -##元 -##兄 -##充 -##兆 -##兇 -##先 -##光 -##克 -##兌 -##免 -##児 -##兑 -##兒 -##兔 -##兖 -##党 -##兜 -##兢 -##入 -##內 -##全 -##兩 -##八 -##公 -##六 -##兮 -##兰 -##共 -##兲 -##关 -##兴 -##兵 -##其 -##具 -##典 -##兹 -##养 -##兼 -##兽 -##冀 -##内 -##円 -##冇 -##冈 -##冉 -##冊 -##册 -##再 -##冏 -##冒 -##冕 -##冗 -##写 -##军 -##农 -##冠 -##冢 -##冤 -##冥 -##冨 -##冪 -##冬 -##冯 -##冰 -##冲 -##决 -##况 -##冶 -##冷 -##冻 -##冼 -##冽 -##冾 -##净 -##凄 -##准 -##凇 -##凈 -##凉 -##凋 -##凌 -##凍 -##减 -##凑 -##凛 -##凜 -##凝 -##几 -##凡 -##凤 -##処 -##凪 -##凭 -##凯 -##凰 -##凱 -##凳 -##凶 -##凸 -##凹 -##出 -##击 -##函 -##凿 -##刀 -##刁 -##刃 -##分 -##切 -##刈 -##刊 -##刍 -##刎 -##刑 -##划 -##列 -##刘 -##则 -##刚 -##创 -##初 -##删 -##判 -##別 -##刨 -##利 -##刪 -##别 -##刮 -##到 -##制 -##刷 -##券 -##刹 -##刺 -##刻 -##刽 -##剁 -##剂 -##剃 -##則 -##剉 -##削 -##剋 -##剌 -##前 -##剎 -##剐 -##剑 -##剔 -##剖 -##剛 -##剜 -##剝 -##剣 -##剤 -##剥 -##剧 -##剩 -##剪 -##副 -##割 -##創 -##剷 -##剽 -##剿 -##劃 -##劇 -##劈 -##劉 -##劊 -##劍 -##劏 -##劑 -##力 -##劝 -##办 -##功 -##加 -##务 -##劣 -##动 -##助 -##努 -##劫 -##劭 -##励 -##劲 -##劳 -##労 -##劵 -##効 -##劾 -##势 -##勁 -##勃 -##勇 -##勉 -##勋 -##勐 -##勒 -##動 -##勖 -##勘 -##務 -##勛 -##勝 -##勞 -##募 -##勢 -##勤 -##勧 -##勳 -##勵 -##勸 -##勺 -##勻 -##勾 -##勿 -##匀 -##包 -##匆 -##匈 -##匍 -##匐 -##匕 -##化 -##北 -##匙 -##匝 -##匠 -##匡 -##匣 -##匪 -##匮 -##匯 -##匱 -##匹 -##区 -##医 -##匾 -##匿 -##區 -##十 -##千 -##卅 -##升 -##午 -##卉 -##半 -##卍 -##华 -##协 -##卑 -##卒 -##卓 -##協 -##单 -##卖 -##南 -##単 -##博 -##卜 -##卞 -##卟 -##占 -##卡 -##卢 -##卤 -##卦 -##卧 -##卫 -##卮 -##卯 -##印 -##危 -##即 -##却 -##卵 -##卷 -##卸 -##卻 -##卿 -##厂 -##厄 -##厅 -##历 -##厉 -##压 -##厌 -##厕 -##厘 -##厚 -##厝 -##原 -##厢 -##厥 -##厦 -##厨 -##厩 -##厭 -##厮 -##厲 -##厳 -##去 -##县 -##叁 -##参 -##參 -##又 -##叉 -##及 -##友 -##双 -##反 -##収 -##发 -##叔 -##取 -##受 -##变 -##叙 -##叛 -##叟 -##叠 -##叡 -##叢 -##口 -##古 -##句 -##另 -##叨 -##叩 -##只 -##叫 -##召 -##叭 -##叮 -##可 -##台 -##叱 -##史 -##右 -##叵 -##叶 -##号 -##司 -##叹 -##叻 -##叼 -##叽 -##吁 -##吃 -##各 -##吆 -##合 -##吉 -##吊 -##吋 -##同 -##名 -##后 -##吏 -##吐 -##向 -##吒 -##吓 -##吕 -##吖 -##吗 -##君 -##吝 -##吞 -##吟 -##吠 -##吡 -##否 -##吧 -##吨 -##吩 -##含 -##听 -##吭 -##吮 -##启 -##吱 -##吳 -##吴 -##吵 -##吶 -##吸 -##吹 -##吻 -##吼 -##吽 -##吾 -##呀 -##呂 -##呃 -##呆 -##呈 -##告 -##呋 -##呎 -##呐 -##呓 -##呕 -##呗 -##员 -##呛 -##呜 -##呢 -##呤 -##呦 -##周 -##呱 -##呲 -##味 -##呵 -##呷 -##呸 -##呻 -##呼 -##命 -##咀 -##咁 -##咂 -##咄 -##咆 -##咋 -##和 -##咎 -##咏 -##咐 -##咒 -##咔 -##咕 -##咖 -##咗 -##咘 -##咙 -##咚 -##咛 -##咣 -##咤 -##咦 -##咧 -##咨 -##咩 -##咪 -##咫 -##咬 -##咭 -##咯 -##咱 -##咲 -##咳 -##咸 -##咻 -##咽 -##咿 -##哀 -##品 -##哂 -##哄 -##哆 -##哇 -##哈 -##哉 -##哋 -##哌 -##响 -##哎 -##哏 -##哐 -##哑 -##哒 -##哔 -##哗 -##哟 -##員 -##哥 -##哦 -##哧 -##哨 -##哩 -##哪 -##哭 -##哮 -##哲 -##哺 -##哼 -##哽 -##唁 -##唄 -##唆 -##唇 -##唉 -##唏 -##唐 -##唑 -##唔 -##唠 -##唤 -##唧 -##唬 -##售 -##唯 -##唰 -##唱 -##唳 -##唷 -##唸 -##唾 -##啃 -##啄 -##商 -##啉 -##啊 -##問 -##啓 -##啕 -##啖 -##啜 -##啞 -##啟 -##啡 -##啤 -##啥 -##啦 -##啧 -##啪 -##啫 -##啬 -##啮 -##啰 -##啱 -##啲 -##啵 -##啶 -##啷 -##啸 -##啻 -##啼 -##啾 -##喀 -##喂 -##喃 -##善 -##喆 -##喇 -##喉 -##喊 -##喋 -##喎 -##喏 -##喔 -##喘 -##喙 -##喚 -##喜 -##喝 -##喟 -##喧 -##喪 -##喫 -##喬 -##單 -##喰 -##喱 -##喲 -##喳 -##喵 -##営 -##喷 -##喹 -##喺 -##喻 -##喽 -##嗅 -##嗆 -##嗇 -##嗎 -##嗑 -##嗒 -##嗓 -##嗔 -##嗖 -##嗚 -##嗜 -##嗝 -##嗟 -##嗡 -##嗣 -##嗤 -##嗦 -##嗨 -##嗪 -##嗬 -##嗯 -##嗰 -##嗲 -##嗳 -##嗶 -##嗷 -##嗽 -##嘀 -##嘅 -##嘆 -##嘈 -##嘉 -##嘌 -##嘍 -##嘎 -##嘔 -##嘖 -##嘗 -##嘘 -##嘚 -##嘛 -##嘜 -##嘞 -##嘟 -##嘢 -##嘣 -##嘤 -##嘧 -##嘩 -##嘭 -##嘮 -##嘯 -##嘰 -##嘱 -##嘲 -##嘴 -##嘶 -##嘸 -##嘹 -##嘻 -##嘿 -##噁 -##噌 -##噎 -##噓 -##噔 -##噗 -##噙 -##噜 -##噠 -##噢 -##噤 -##器 -##噩 -##噪 -##噬 -##噱 -##噴 -##噶 -##噸 -##噹 -##噻 -##噼 -##嚀 -##嚇 -##嚎 -##嚏 -##嚐 -##嚓 -##嚕 -##嚟 -##嚣 -##嚥 -##嚨 -##嚮 -##嚴 -##嚷 -##嚼 -##囂 -##囉 -##囊 -##囍 -##囑 -##囔 -##囗 -##囚 -##四 -##囝 -##回 -##囟 -##因 -##囡 -##团 -##団 -##囤 -##囧 -##囪 -##囫 -##园 -##困 -##囱 -##囲 -##図 -##围 -##囹 -##固 -##国 -##图 -##囿 -##圃 -##圄 -##圆 -##圈 -##國 -##圍 -##圏 -##園 -##圓 -##圖 -##團 -##圜 -##土 -##圣 -##圧 -##在 -##圩 -##圭 -##地 -##圳 -##场 -##圻 -##圾 -##址 -##坂 -##均 -##坊 -##坍 -##坎 -##坏 -##坐 -##坑 -##块 -##坚 -##坛 -##坝 -##坞 -##坟 -##坠 -##坡 -##坤 -##坦 -##坨 -##坪 -##坯 -##坳 -##坵 -##坷 -##垂 -##垃 -##垄 -##型 -##垒 -##垚 -##垛 -##垠 -##垢 -##垣 -##垦 -##垩 -##垫 -##垭 -##垮 -##垵 -##埂 -##埃 -##埋 -##城 -##埔 -##埕 -##埗 -##域 -##埠 -##埤 -##埵 -##執 -##埸 -##培 -##基 -##埼 -##堀 -##堂 -##堃 -##堅 -##堆 -##堇 -##堑 -##堕 -##堙 -##堡 -##堤 -##堪 -##堯 -##堰 -##報 -##場 -##堵 -##堺 -##堿 -##塊 -##塌 -##塑 -##塔 -##塗 -##塘 -##塚 -##塞 -##塢 -##塩 -##填 -##塬 -##塭 -##塵 -##塾 -##墀 -##境 -##墅 -##墉 -##墊 -##墒 -##墓 -##増 -##墘 -##墙 -##墜 -##增 -##墟 -##墨 -##墩 -##墮 -##墳 -##墻 -##墾 -##壁 -##壅 -##壆 -##壇 -##壊 -##壑 -##壓 -##壕 -##壘 -##壞 -##壟 -##壢 -##壤 -##壩 -##士 -##壬 -##壮 -##壯 -##声 -##売 -##壳 -##壶 -##壹 -##壺 -##壽 -##处 -##备 -##変 -##复 -##夏 -##夔 -##夕 -##外 -##夙 -##多 -##夜 -##够 -##夠 -##夢 -##夥 -##大 -##天 -##太 -##夫 -##夭 -##央 -##夯 -##失 -##头 -##夷 -##夸 -##夹 -##夺 -##夾 -##奂 -##奄 -##奇 -##奈 -##奉 -##奋 -##奎 -##奏 -##奐 -##契 -##奔 -##奕 -##奖 -##套 -##奘 -##奚 -##奠 -##奢 -##奥 -##奧 -##奪 -##奬 -##奮 -##女 -##奴 -##奶 -##奸 -##她 -##好 -##如 -##妃 -##妄 -##妆 -##妇 -##妈 -##妊 -##妍 -##妒 -##妓 -##妖 -##妘 -##妙 -##妝 -##妞 -##妣 -##妤 -##妥 -##妨 -##妩 -##妪 -##妮 -##妲 -##妳 -##妹 -##妻 -##妾 -##姆 -##姉 -##姊 -##始 -##姍 -##姐 -##姑 -##姒 -##姓 -##委 -##姗 -##姚 -##姜 -##姝 -##姣 -##姥 -##姦 -##姨 -##姪 -##姫 -##姬 -##姹 -##姻 -##姿 -##威 -##娃 -##娄 -##娅 -##娆 -##娇 -##娉 -##娑 -##娓 -##娘 -##娛 -##娜 -##娟 -##娠 -##娣 -##娥 -##娩 -##娱 -##娲 -##娴 -##娶 -##娼 -##婀 -##婁 -##婆 -##婉 -##婊 -##婕 -##婚 -##婢 -##婦 -##婧 -##婪 -##婭 -##婴 -##婵 -##婶 -##婷 -##婺 -##婿 -##媒 -##媚 -##媛 -##媞 -##媧 -##媲 -##媳 -##媽 -##媾 -##嫁 -##嫂 -##嫉 -##嫌 -##嫑 -##嫔 -##嫖 -##嫘 -##嫚 -##嫡 -##嫣 -##嫦 -##嫩 -##嫲 -##嫵 -##嫻 -##嬅 -##嬉 -##嬌 -##嬗 -##嬛 -##嬢 -##嬤 -##嬪 -##嬰 -##嬴 -##嬷 -##嬸 -##嬿 -##孀 -##孃 -##子 -##孑 -##孔 -##孕 -##孖 -##字 -##存 -##孙 -##孚 -##孛 -##孜 -##孝 -##孟 -##孢 -##季 -##孤 -##学 -##孩 -##孪 -##孫 -##孬 -##孰 -##孱 -##孳 -##孵 -##學 -##孺 -##孽 -##孿 -##宁 -##它 -##宅 -##宇 -##守 -##安 -##宋 -##完 -##宏 -##宓 -##宕 -##宗 -##官 -##宙 -##定 -##宛 -##宜 -##宝 -##实 -##実 -##宠 -##审 -##客 -##宣 -##室 -##宥 -##宦 -##宪 -##宫 -##宮 -##宰 -##害 -##宴 -##宵 -##家 -##宸 -##容 -##宽 -##宾 -##宿 -##寂 -##寄 -##寅 -##密 -##寇 -##富 -##寐 -##寒 -##寓 -##寛 -##寝 -##寞 -##察 -##寡 -##寢 -##寥 -##實 -##寧 -##寨 -##審 -##寫 -##寬 -##寮 -##寰 -##寵 -##寶 -##寸 -##对 -##寺 -##寻 -##导 -##対 -##寿 -##封 -##専 -##射 -##将 -##將 -##專 -##尉 -##尊 -##尋 -##對 -##導 -##小 -##少 -##尔 -##尕 -##尖 -##尘 -##尚 -##尝 -##尤 -##尧 -##尬 -##就 -##尴 -##尷 -##尸 -##尹 -##尺 -##尻 -##尼 -##尽 -##尾 -##尿 -##局 -##屁 -##层 -##屄 -##居 -##屆 -##屈 -##屉 -##届 -##屋 -##屌 -##屍 -##屎 -##屏 -##屐 -##屑 -##展 -##屜 -##属 -##屠 -##屡 -##屢 -##層 -##履 -##屬 -##屯 -##山 -##屹 -##屿 -##岀 -##岁 -##岂 -##岌 -##岐 -##岑 -##岔 -##岖 -##岗 -##岘 -##岙 -##岚 -##岛 -##岡 -##岩 -##岫 -##岬 -##岭 -##岱 -##岳 -##岷 -##岸 -##峇 -##峋 -##峒 -##峙 -##峡 -##峤 -##峥 -##峦 -##峨 -##峪 -##峭 -##峯 -##峰 -##峴 -##島 -##峻 -##峽 -##崁 -##崂 -##崆 -##崇 -##崎 -##崑 -##崔 -##崖 -##崗 -##崙 -##崛 -##崧 -##崩 -##崭 -##崴 -##崽 -##嵇 -##嵊 -##嵋 -##嵌 -##嵐 -##嵘 -##嵩 -##嵬 -##嵯 -##嶂 -##嶄 -##嶇 -##嶋 -##嶙 -##嶺 -##嶼 -##嶽 -##巅 -##巍 -##巒 -##巔 -##巖 -##川 -##州 -##巡 -##巢 -##工 -##左 -##巧 -##巨 -##巩 -##巫 -##差 -##己 -##已 -##巳 -##巴 -##巷 -##巻 -##巽 -##巾 -##巿 -##币 -##市 -##布 -##帅 -##帆 -##师 -##希 -##帐 -##帑 -##帕 -##帖 -##帘 -##帚 -##帛 -##帜 -##帝 -##帥 -##带 -##帧 -##師 -##席 -##帮 -##帯 -##帰 -##帳 -##帶 -##帷 -##常 -##帼 -##帽 -##幀 -##幂 -##幄 -##幅 -##幌 -##幔 -##幕 -##幟 -##幡 -##幢 -##幣 -##幫 -##干 -##平 -##年 -##并 -##幸 -##幹 -##幺 -##幻 -##幼 -##幽 -##幾 -##广 -##庁 -##広 -##庄 -##庆 -##庇 -##床 -##序 -##庐 -##库 -##应 -##底 -##庖 -##店 -##庙 -##庚 -##府 -##庞 -##废 -##庠 -##度 -##座 -##庫 -##庭 -##庵 -##庶 -##康 -##庸 -##庹 -##庾 -##廁 -##廂 -##廃 -##廈 -##廉 -##廊 -##廓 -##廖 -##廚 -##廝 -##廟 -##廠 -##廢 -##廣 -##廬 -##廳 -##延 -##廷 -##建 -##廿 -##开 -##弁 -##异 -##弃 -##弄 -##弈 -##弊 -##弋 -##式 -##弑 -##弒 -##弓 -##弔 -##引 -##弗 -##弘 -##弛 -##弟 -##张 -##弥 -##弦 -##弧 -##弩 -##弭 -##弯 -##弱 -##張 -##強 -##弹 -##强 -##弼 -##弾 -##彅 -##彆 -##彈 -##彌 -##彎 -##归 -##当 -##录 -##彗 -##彙 -##彝 -##形 -##彤 -##彥 -##彦 -##彧 -##彩 -##彪 -##彫 -##彬 -##彭 -##彰 -##影 -##彷 -##役 -##彻 -##彼 -##彿 -##往 -##征 -##径 -##待 -##徇 -##很 -##徉 -##徊 -##律 -##後 -##徐 -##徑 -##徒 -##従 -##徕 -##得 -##徘 -##徙 -##徜 -##從 -##徠 -##御 -##徨 -##復 -##循 -##徬 -##微 -##徳 -##徴 -##徵 -##德 -##徹 -##徼 -##徽 -##心 -##必 -##忆 -##忌 -##忍 -##忏 -##忐 -##忑 -##忒 -##忖 -##志 -##忘 -##忙 -##応 -##忠 -##忡 -##忤 -##忧 -##忪 -##快 -##忱 -##念 -##忻 -##忽 -##忿 -##怀 -##态 -##怂 -##怅 -##怆 -##怎 -##怏 -##怒 -##怔 -##怕 -##怖 -##怙 -##怜 -##思 -##怠 -##怡 -##急 -##怦 -##性 -##怨 -##怪 -##怯 -##怵 -##总 -##怼 -##恁 -##恃 -##恆 -##恋 -##恍 -##恐 -##恒 -##恕 -##恙 -##恚 -##恢 -##恣 -##恤 -##恥 -##恨 -##恩 -##恪 -##恫 -##恬 -##恭 -##息 -##恰 -##恳 -##恵 -##恶 -##恸 -##恺 -##恻 -##恼 -##恿 -##悄 -##悅 -##悉 -##悌 -##悍 -##悔 -##悖 -##悚 -##悟 -##悠 -##患 -##悦 -##您 -##悩 -##悪 -##悬 -##悯 -##悱 -##悲 -##悴 -##悵 -##悶 -##悸 -##悻 -##悼 -##悽 -##情 -##惆 -##惇 -##惊 -##惋 -##惑 -##惕 -##惘 -##惚 -##惜 -##惟 -##惠 -##惡 -##惦 -##惧 -##惨 -##惩 -##惫 -##惬 -##惭 -##惮 -##惯 -##惰 -##惱 -##想 -##惴 -##惶 -##惹 -##惺 -##愁 -##愆 -##愈 -##愉 -##愍 -##意 -##愕 -##愚 -##愛 -##愜 -##感 -##愣 -##愤 -##愧 -##愫 -##愷 -##愿 -##慄 -##慈 -##態 -##慌 -##慎 -##慑 -##慕 -##慘 -##慚 -##慟 -##慢 -##慣 -##慧 -##慨 -##慫 -##慮 -##慰 -##慳 -##慵 -##慶 -##慷 -##慾 -##憂 -##憊 -##憋 -##憎 -##憐 -##憑 -##憔 -##憚 -##憤 -##憧 -##憨 -##憩 -##憫 -##憬 -##憲 -##憶 -##憾 -##懂 -##懇 -##懈 -##應 -##懊 -##懋 -##懑 -##懒 -##懦 -##懲 -##懵 -##懶 -##懷 -##懸 -##懺 -##懼 -##懾 -##懿 -##戀 -##戈 -##戊 -##戌 -##戍 -##戎 -##戏 -##成 -##我 -##戒 -##戕 -##或 -##战 -##戚 -##戛 -##戟 -##戡 -##戦 -##截 -##戬 -##戮 -##戰 -##戲 -##戳 -##戴 -##戶 -##户 -##戸 -##戻 -##戾 -##房 -##所 -##扁 -##扇 -##扈 -##扉 -##手 -##才 -##扎 -##扑 -##扒 -##打 -##扔 -##払 -##托 -##扛 -##扣 -##扦 -##执 -##扩 -##扪 -##扫 -##扬 -##扭 -##扮 -##扯 -##扰 -##扱 -##扳 -##扶 -##批 -##扼 -##找 -##承 -##技 -##抄 -##抉 -##把 -##抑 -##抒 -##抓 -##投 -##抖 -##抗 -##折 -##抚 -##抛 -##抜 -##択 -##抟 -##抠 -##抡 -##抢 -##护 -##报 -##抨 -##披 -##抬 -##抱 -##抵 -##抹 -##押 -##抽 -##抿 -##拂 -##拄 -##担 -##拆 -##拇 -##拈 -##拉 -##拋 -##拌 -##拍 -##拎 -##拐 -##拒 -##拓 -##拔 -##拖 -##拗 -##拘 -##拙 -##拚 -##招 -##拜 -##拟 -##拡 -##拢 -##拣 -##拥 -##拦 -##拧 -##拨 -##择 -##括 -##拭 -##拮 -##拯 -##拱 -##拳 -##拴 -##拷 -##拼 -##拽 -##拾 -##拿 -##持 -##挂 -##指 -##挈 -##按 -##挎 -##挑 -##挖 -##挙 -##挚 -##挛 -##挝 -##挞 -##挟 -##挠 -##挡 -##挣 -##挤 -##挥 -##挨 -##挪 -##挫 -##振 -##挲 -##挹 -##挺 -##挽 -##挾 -##捂 -##捅 -##捆 -##捉 -##捋 -##捌 -##捍 -##捎 -##捏 -##捐 -##捕 -##捞 -##损 -##捡 -##换 -##捣 -##捧 -##捨 -##捩 -##据 -##捱 -##捲 -##捶 -##捷 -##捺 -##捻 -##掀 -##掂 -##掃 -##掇 -##授 -##掉 -##掌 -##掏 -##掐 -##排 -##掖 -##掘 -##掙 -##掛 -##掠 -##採 -##探 -##掣 -##接 -##控 -##推 -##掩 -##措 -##掬 -##掰 -##掲 -##掳 -##掴 -##掷 -##掸 -##掺 -##揀 -##揃 -##揄 -##揆 -##揉 -##揍 -##描 -##提 -##插 -##揖 -##揚 -##換 -##握 -##揣 -##揩 -##揪 -##揭 -##揮 -##援 -##揶 -##揸 -##揹 -##揽 -##搀 -##搁 -##搂 -##搅 -##損 -##搏 -##搐 -##搓 -##搔 -##搖 -##搗 -##搜 -##搞 -##搡 -##搪 -##搬 -##搭 -##搵 -##搶 -##携 -##搽 -##摀 -##摁 -##摄 -##摆 -##摇 -##摈 -##摊 -##摒 -##摔 -##摘 -##摞 -##摟 -##摧 -##摩 -##摯 -##摳 -##摸 -##摹 -##摺 -##摻 -##撂 -##撃 -##撅 -##撇 -##撈 -##撐 -##撑 -##撒 -##撓 -##撕 -##撚 -##撞 -##撤 -##撥 -##撩 -##撫 -##撬 -##播 -##撮 -##撰 -##撲 -##撵 -##撷 -##撸 -##撻 -##撼 -##撿 -##擀 -##擁 -##擂 -##擄 -##擅 -##擇 -##擊 -##擋 -##操 -##擎 -##擒 -##擔 -##擘 -##據 -##擞 -##擠 -##擡 -##擢 -##擦 -##擬 -##擰 -##擱 -##擲 -##擴 -##擷 -##擺 -##擼 -##擾 -##攀 -##攏 -##攒 -##攔 -##攘 -##攙 -##攜 -##攝 -##攞 -##攢 -##攣 -##攤 -##攥 -##攪 -##攫 -##攬 -##支 -##收 -##攸 -##改 -##攻 -##放 -##政 -##故 -##效 -##敌 -##敍 -##敎 -##敏 -##救 -##敕 -##敖 -##敗 -##敘 -##教 -##敛 -##敝 -##敞 -##敢 -##散 -##敦 -##敬 -##数 -##敲 -##整 -##敵 -##敷 -##數 -##斂 -##斃 -##文 -##斋 -##斌 -##斎 -##斐 -##斑 -##斓 -##斗 -##料 -##斛 -##斜 -##斟 -##斡 -##斤 -##斥 -##斧 -##斩 -##斫 -##斬 -##断 -##斯 -##新 -##斷 -##方 -##於 -##施 -##旁 -##旃 -##旅 -##旋 -##旌 -##旎 -##族 -##旖 -##旗 -##无 -##既 -##日 -##旦 -##旧 -##旨 -##早 -##旬 -##旭 -##旮 -##旱 -##时 -##旷 -##旺 -##旻 -##昀 -##昂 -##昆 -##昇 -##昉 -##昊 -##昌 -##明 -##昏 -##易 -##昔 -##昕 -##昙 -##星 -##映 -##春 -##昧 -##昨 -##昭 -##是 -##昱 -##昴 -##昵 -##昶 -##昼 -##显 -##晁 -##時 -##晃 -##晉 -##晋 -##晌 -##晏 -##晒 -##晓 -##晔 -##晕 -##晖 -##晗 -##晚 -##晝 -##晞 -##晟 -##晤 -##晦 -##晨 -##晩 -##普 -##景 -##晰 -##晴 -##晶 -##晷 -##智 -##晾 -##暂 -##暄 -##暇 -##暈 -##暉 -##暌 -##暐 -##暑 -##暖 -##暗 -##暝 -##暢 -##暧 -##暨 -##暫 -##暮 -##暱 -##暴 -##暸 -##暹 -##曄 -##曆 -##曇 -##曉 -##曖 -##曙 -##曜 -##曝 -##曠 -##曦 -##曬 -##曰 -##曲 -##曳 -##更 -##書 -##曹 -##曼 -##曾 -##替 -##最 -##會 -##月 -##有 -##朋 -##服 -##朐 -##朔 -##朕 -##朗 -##望 -##朝 -##期 -##朦 -##朧 -##木 -##未 -##末 -##本 -##札 -##朮 -##术 -##朱 -##朴 -##朵 -##机 -##朽 -##杀 -##杂 -##权 -##杆 -##杈 -##杉 -##李 -##杏 -##材 -##村 -##杓 -##杖 -##杜 -##杞 -##束 -##杠 -##条 -##来 -##杨 -##杭 -##杯 -##杰 -##東 -##杳 -##杵 -##杷 -##杼 -##松 -##板 -##极 -##构 -##枇 -##枉 -##枋 -##析 -##枕 -##林 -##枚 -##果 -##枝 -##枢 -##枣 -##枪 -##枫 -##枭 -##枯 -##枰 -##枱 -##枳 -##架 -##枷 -##枸 -##柄 -##柏 -##某 -##柑 -##柒 -##染 -##柔 -##柘 -##柚 -##柜 -##柞 -##柠 -##柢 -##查 -##柩 -##柬 -##柯 -##柱 -##柳 -##柴 -##柵 -##査 -##柿 -##栀 -##栃 -##栄 -##栅 -##标 -##栈 -##栉 -##栋 -##栎 -##栏 -##树 -##栓 -##栖 -##栗 -##校 -##栩 -##株 -##样 -##核 -##根 -##格 -##栽 -##栾 -##桀 -##桁 -##桂 -##桃 -##桅 -##框 -##案 -##桉 -##桌 -##桎 -##桐 -##桑 -##桓 -##桔 -##桜 -##桠 -##桡 -##桢 -##档 -##桥 -##桦 -##桧 -##桨 -##桩 -##桶 -##桿 -##梁 -##梅 -##梆 -##梏 -##梓 -##梗 -##條 -##梟 -##梢 -##梦 -##梧 -##梨 -##梭 -##梯 -##械 -##梳 -##梵 -##梶 -##检 -##棂 -##棄 -##棉 -##棋 -##棍 -##棒 -##棕 -##棗 -##棘 -##棚 -##棟 -##棠 -##棣 -##棧 -##森 -##棱 -##棲 -##棵 -##棹 -##棺 -##椁 -##椅 -##椋 -##植 -##椎 -##椒 -##検 -##椪 -##椭 -##椰 -##椹 -##椽 -##椿 -##楂 -##楊 -##楓 -##楔 -##楚 -##楝 -##楞 -##楠 -##楣 -##楨 -##楫 -##業 -##楮 -##極 -##楷 -##楸 -##楹 -##楼 -##楽 -##概 -##榄 -##榆 -##榈 -##榉 -##榔 -##榕 -##榖 -##榛 -##榜 -##榨 -##榫 -##榭 -##榮 -##榱 -##榴 -##榷 -##榻 -##槁 -##槃 -##構 -##槌 -##槍 -##槎 -##槐 -##槓 -##様 -##槛 -##槟 -##槤 -##槭 -##槲 -##槳 -##槻 -##槽 -##槿 -##樁 -##樂 -##樊 -##樑 -##樓 -##標 -##樞 -##樟 -##模 -##樣 -##権 -##横 -##樫 -##樯 -##樱 -##樵 -##樸 -##樹 -##樺 -##樽 -##樾 -##橄 -##橇 -##橋 -##橐 -##橘 -##橙 -##機 -##橡 -##橢 -##橫 -##橱 -##橹 -##橼 -##檀 -##檄 -##檎 -##檐 -##檔 -##檗 -##檜 -##檢 -##檬 -##檯 -##檳 -##檸 -##檻 -##櫃 -##櫚 -##櫛 -##櫥 -##櫸 -##櫻 -##欄 -##權 -##欒 -##欖 -##欠 -##次 -##欢 -##欣 -##欧 -##欲 -##欸 -##欺 -##欽 -##款 -##歆 -##歇 -##歉 -##歌 -##歎 -##歐 -##歓 -##歙 -##歛 -##歡 -##止 -##正 -##此 -##步 -##武 -##歧 -##歩 -##歪 -##歯 -##歲 -##歳 -##歴 -##歷 -##歸 -##歹 -##死 -##歼 -##殁 -##殃 -##殆 -##殇 -##殉 -##殊 -##残 -##殒 -##殓 -##殖 -##殘 -##殞 -##殡 -##殤 -##殭 -##殯 -##殲 -##殴 -##段 -##殷 -##殺 -##殼 -##殿 -##毀 -##毁 -##毂 -##毅 -##毆 -##毋 -##母 -##毎 -##每 -##毒 -##毓 -##比 -##毕 -##毗 -##毘 -##毙 -##毛 -##毡 -##毫 -##毯 -##毽 -##氈 -##氏 -##氐 -##民 -##氓 -##气 -##氖 -##気 -##氙 -##氛 -##氟 -##氡 -##氢 -##氣 -##氤 -##氦 -##氧 -##氨 -##氪 -##氫 -##氮 -##氯 -##氰 -##氲 -##水 -##氷 -##永 -##氹 -##氾 -##汀 -##汁 -##求 -##汆 -##汇 -##汉 -##汎 -##汐 -##汕 -##汗 -##汙 -##汛 -##汝 -##汞 -##江 -##池 -##污 -##汤 -##汨 -##汩 -##汪 -##汰 -##汲 -##汴 -##汶 -##汹 -##決 -##汽 -##汾 -##沁 -##沂 -##沃 -##沅 -##沈 -##沉 -##沌 -##沏 -##沐 -##沒 -##沓 -##沖 -##沙 -##沛 -##沟 -##没 -##沢 -##沣 -##沥 -##沦 -##沧 -##沪 -##沫 -##沭 -##沮 -##沱 -##河 -##沸 -##油 -##治 -##沼 -##沽 -##沾 -##沿 -##況 -##泄 -##泉 -##泊 -##泌 -##泓 -##法 -##泗 -##泛 -##泞 -##泠 -##泡 -##波 -##泣 -##泥 -##注 -##泪 -##泫 -##泮 -##泯 -##泰 -##泱 -##泳 -##泵 -##泷 -##泸 -##泻 -##泼 -##泽 -##泾 -##洁 -##洄 -##洋 -##洒 -##洗 -##洙 -##洛 -##洞 -##津 -##洩 -##洪 -##洮 -##洱 -##洲 -##洵 -##洶 -##洸 -##洹 -##活 -##洼 -##洽 -##派 -##流 -##浃 -##浄 -##浅 -##浆 -##浇 -##浊 -##测 -##济 -##浏 -##浑 -##浒 -##浓 -##浔 -##浙 -##浚 -##浜 -##浣 -##浦 -##浩 -##浪 -##浬 -##浮 -##浯 -##浴 -##海 -##浸 -##涂 -##涅 -##涇 -##消 -##涉 -##涌 -##涎 -##涓 -##涔 -##涕 -##涙 -##涛 -##涝 -##涞 -##涟 -##涠 -##涡 -##涣 -##涤 -##润 -##涧 -##涨 -##涩 -##涪 -##涮 -##涯 -##液 -##涵 -##涸 -##涼 -##涿 -##淀 -##淄 -##淅 -##淆 -##淇 -##淋 -##淌 -##淑 -##淒 -##淖 -##淘 -##淙 -##淚 -##淞 -##淡 -##淤 -##淦 -##淨 -##淩 -##淪 -##淫 -##淬 -##淮 -##深 -##淳 -##淵 -##混 -##淹 -##淺 -##添 -##淼 -##清 -##済 -##渉 -##渊 -##渋 -##渍 -##渎 -##渐 -##渔 -##渗 -##渙 -##渚 -##減 -##渝 -##渠 -##渡 -##渣 -##渤 -##渥 -##渦 -##温 -##測 -##渭 -##港 -##渲 -##渴 -##游 -##渺 -##渾 -##湃 -##湄 -##湊 -##湍 -##湖 -##湘 -##湛 -##湟 -##湧 -##湫 -##湮 -##湯 -##湳 -##湾 -##湿 -##満 -##溃 -##溅 -##溉 -##溏 -##源 -##準 -##溜 -##溝 -##溟 -##溢 -##溥 -##溧 -##溪 -##溫 -##溯 -##溱 -##溴 -##溶 -##溺 -##溼 -##滁 -##滂 -##滄 -##滅 -##滇 -##滋 -##滌 -##滑 -##滓 -##滔 -##滕 -##滙 -##滚 -##滝 -##滞 -##滟 -##满 -##滢 -##滤 -##滥 -##滦 -##滨 -##滩 -##滬 -##滯 -##滲 -##滴 -##滷 -##滸 -##滾 -##滿 -##漁 -##漂 -##漆 -##漉 -##漏 -##漓 -##演 -##漕 -##漠 -##漢 -##漣 -##漩 -##漪 -##漫 -##漬 -##漯 -##漱 -##漲 -##漳 -##漸 -##漾 -##漿 -##潆 -##潇 -##潋 -##潍 -##潑 -##潔 -##潘 -##潛 -##潜 -##潞 -##潟 -##潢 -##潤 -##潦 -##潧 -##潭 -##潮 -##潰 -##潴 -##潸 -##潺 -##潼 -##澀 -##澄 -##澆 -##澈 -##澍 -##澎 -##澗 -##澜 -##澡 -##澤 -##澧 -##澱 -##澳 -##澹 -##激 -##濁 -##濂 -##濃 -##濑 -##濒 -##濕 -##濘 -##濛 -##濟 -##濠 -##濡 -##濤 -##濫 -##濬 -##濮 -##濯 -##濱 -##濺 -##濾 -##瀅 -##瀆 -##瀉 -##瀋 -##瀏 -##瀑 -##瀕 -##瀘 -##瀚 -##瀛 -##瀝 -##瀞 -##瀟 -##瀧 -##瀨 -##瀬 -##瀰 -##瀾 -##灌 -##灏 -##灑 -##灘 -##灝 -##灞 -##灣 -##火 -##灬 -##灭 -##灯 -##灰 -##灵 -##灶 -##灸 -##灼 -##災 -##灾 -##灿 -##炀 -##炁 -##炅 -##炉 -##炊 -##炎 -##炒 -##炔 -##炕 -##炖 -##炙 -##炜 -##炫 -##炬 -##炭 -##炮 -##炯 -##炳 -##炷 -##炸 -##点 -##為 -##炼 -##炽 -##烁 -##烂 -##烃 -##烈 -##烊 -##烏 -##烘 -##烙 -##烛 -##烟 -##烤 -##烦 -##烧 -##烨 -##烩 -##烫 -##烬 -##热 -##烯 -##烷 -##烹 -##烽 -##焉 -##焊 -##焕 -##焖 -##焗 -##焘 -##焙 -##焚 -##焜 -##無 -##焦 -##焯 -##焰 -##焱 -##然 -##焼 -##煅 -##煉 -##煊 -##煌 -##煎 -##煒 -##煖 -##煙 -##煜 -##煞 -##煤 -##煥 -##煦 -##照 -##煨 -##煩 -##煮 -##煲 -##煸 -##煽 -##熄 -##熊 -##熏 -##熒 -##熔 -##熙 -##熟 -##熠 -##熨 -##熬 -##熱 -##熵 -##熹 -##熾 -##燁 -##燃 -##燄 -##燈 -##燉 -##燊 -##燎 -##燒 -##燔 -##燕 -##燙 -##燜 -##營 -##燥 -##燦 -##燧 -##燭 -##燮 -##燴 -##燻 -##燼 -##燿 -##爆 -##爍 -##爐 -##爛 -##爪 -##爬 -##爭 -##爰 -##爱 -##爲 -##爵 -##父 -##爷 -##爸 -##爹 -##爺 -##爻 -##爽 -##爾 -##牆 -##片 -##版 -##牌 -##牍 -##牒 -##牙 -##牛 -##牝 -##牟 -##牠 -##牡 -##牢 -##牦 -##牧 -##物 -##牯 -##牲 -##牴 -##牵 -##特 -##牺 -##牽 -##犀 -##犁 -##犄 -##犊 -##犍 -##犒 -##犢 -##犧 -##犬 -##犯 -##状 -##犷 -##犸 -##犹 -##狀 -##狂 -##狄 -##狈 -##狎 -##狐 -##狒 -##狗 -##狙 -##狞 -##狠 -##狡 -##狩 -##独 -##狭 -##狮 -##狰 -##狱 -##狸 -##狹 -##狼 -##狽 -##猎 -##猕 -##猖 -##猗 -##猙 -##猛 -##猜 -##猝 -##猥 -##猩 -##猪 -##猫 -##猬 -##献 -##猴 -##猶 -##猷 -##猾 -##猿 -##獄 -##獅 -##獎 -##獐 -##獒 -##獗 -##獠 -##獣 -##獨 -##獭 -##獰 -##獲 -##獵 -##獷 -##獸 -##獺 -##獻 -##獼 -##獾 -##玄 -##率 -##玉 -##王 -##玑 -##玖 -##玛 -##玟 -##玠 -##玥 -##玩 -##玫 -##玮 -##环 -##现 -##玲 -##玳 -##玷 -##玺 -##玻 -##珀 -##珂 -##珅 -##珈 -##珉 -##珊 -##珍 -##珏 -##珐 -##珑 -##珙 -##珞 -##珠 -##珣 -##珥 -##珩 -##珪 -##班 -##珮 -##珲 -##珺 -##現 -##球 -##琅 -##理 -##琇 -##琉 -##琊 -##琍 -##琏 -##琐 -##琛 -##琢 -##琥 -##琦 -##琨 -##琪 -##琬 -##琮 -##琰 -##琲 -##琳 -##琴 -##琵 -##琶 -##琺 -##琼 -##瑀 -##瑁 -##瑄 -##瑋 -##瑕 -##瑗 -##瑙 -##瑚 -##瑛 -##瑜 -##瑞 -##瑟 -##瑠 -##瑣 -##瑤 -##瑩 -##瑪 -##瑯 -##瑰 -##瑶 -##瑾 -##璀 -##璁 -##璃 -##璇 -##璉 -##璋 -##璎 -##璐 -##璜 -##璞 -##璟 -##璧 -##璨 -##環 -##璽 -##璿 -##瓊 -##瓏 -##瓒 -##瓜 -##瓢 -##瓣 -##瓤 -##瓦 -##瓮 -##瓯 -##瓴 -##瓶 -##瓷 -##甄 -##甌 -##甕 -##甘 -##甙 -##甚 -##甜 -##生 -##產 -##産 -##甥 -##甦 -##用 -##甩 -##甫 -##甬 -##甭 -##甯 -##田 -##由 -##甲 -##申 -##电 -##男 -##甸 -##町 -##画 -##甾 -##畀 -##畅 -##界 -##畏 -##畑 -##畔 -##留 -##畜 -##畝 -##畢 -##略 -##畦 -##番 -##畫 -##異 -##畲 -##畳 -##畴 -##當 -##畸 -##畹 -##畿 -##疆 -##疇 -##疊 -##疏 -##疑 -##疔 -##疖 -##疗 -##疙 -##疚 -##疝 -##疟 -##疡 -##疣 -##疤 -##疥 -##疫 -##疮 -##疯 -##疱 -##疲 -##疳 -##疵 -##疸 -##疹 -##疼 -##疽 -##疾 -##痂 -##病 -##症 -##痈 -##痉 -##痊 -##痍 -##痒 -##痔 -##痕 -##痘 -##痙 -##痛 -##痞 -##痠 -##痢 -##痣 -##痤 -##痧 -##痨 -##痪 -##痫 -##痰 -##痱 -##痴 -##痹 -##痺 -##痼 -##痿 -##瘀 -##瘁 -##瘋 -##瘍 -##瘓 -##瘘 -##瘙 -##瘟 -##瘠 -##瘡 -##瘢 -##瘤 -##瘦 -##瘧 -##瘩 -##瘪 -##瘫 -##瘴 -##瘸 -##瘾 -##療 -##癇 -##癌 -##癒 -##癖 -##癜 -##癞 -##癡 -##癢 -##癣 -##癥 -##癫 -##癬 -##癮 -##癱 -##癲 -##癸 -##発 -##登 -##發 -##白 -##百 -##皂 -##的 -##皆 -##皇 -##皈 -##皋 -##皎 -##皑 -##皓 -##皖 -##皙 -##皚 -##皮 -##皰 -##皱 -##皴 -##皺 -##皿 -##盂 -##盃 -##盅 -##盆 -##盈 -##益 -##盎 -##盏 -##盐 -##监 -##盒 -##盔 -##盖 -##盗 -##盘 -##盛 -##盜 -##盞 -##盟 -##盡 -##監 -##盤 -##盥 -##盧 -##盪 -##目 -##盯 -##盱 -##盲 -##直 -##相 -##盹 -##盼 -##盾 -##省 -##眈 -##眉 -##看 -##県 -##眙 -##眞 -##真 -##眠 -##眦 -##眨 -##眩 -##眯 -##眶 -##眷 -##眸 -##眺 -##眼 -##眾 -##着 -##睁 -##睇 -##睏 -##睐 -##睑 -##睛 -##睜 -##睞 -##睡 -##睢 -##督 -##睥 -##睦 -##睨 -##睪 -##睫 -##睬 -##睹 -##睽 -##睾 -##睿 -##瞄 -##瞅 -##瞇 -##瞋 -##瞌 -##瞎 -##瞑 -##瞒 -##瞓 -##瞞 -##瞟 -##瞠 -##瞥 -##瞧 -##瞩 -##瞪 -##瞬 -##瞭 -##瞰 -##瞳 -##瞻 -##瞼 -##瞿 -##矇 -##矍 -##矗 -##矚 -##矛 -##矜 -##矢 -##矣 -##知 -##矩 -##矫 -##短 -##矮 -##矯 -##石 -##矶 -##矽 -##矾 -##矿 -##码 -##砂 -##砌 -##砍 -##砒 -##研 -##砖 -##砗 -##砚 -##砝 -##砣 -##砥 -##砧 -##砭 -##砰 -##砲 -##破 -##砷 -##砸 -##砺 -##砼 -##砾 -##础 -##硅 -##硐 -##硒 -##硕 -##硝 -##硫 -##硬 -##确 -##硯 -##硼 -##碁 -##碇 -##碉 -##碌 -##碍 -##碎 -##碑 -##碓 -##碗 -##碘 -##碚 -##碛 -##碟 -##碣 -##碧 -##碩 -##碰 -##碱 -##碳 -##碴 -##確 -##碼 -##碾 -##磁 -##磅 -##磊 -##磋 -##磐 -##磕 -##磚 -##磡 -##磨 -##磬 -##磯 -##磲 -##磷 -##磺 -##礁 -##礎 -##礙 -##礡 -##礦 -##礪 -##礫 -##礴 -##示 -##礼 -##社 -##祀 -##祁 -##祂 -##祇 -##祈 -##祉 -##祎 -##祐 -##祕 -##祖 -##祗 -##祚 -##祛 -##祜 -##祝 -##神 -##祟 -##祠 -##祢 -##祥 -##票 -##祭 -##祯 -##祷 -##祸 -##祺 -##祿 -##禀 -##禁 -##禄 -##禅 -##禍 -##禎 -##福 -##禛 -##禦 -##禧 -##禪 -##禮 -##禱 -##禹 -##禺 -##离 -##禽 -##禾 -##禿 -##秀 -##私 -##秃 -##秆 -##秉 -##秋 -##种 -##科 -##秒 -##秘 -##租 -##秣 -##秤 -##秦 -##秧 -##秩 -##秭 -##积 -##称 -##秸 -##移 -##秽 -##稀 -##稅 -##程 -##稍 -##税 -##稔 -##稗 -##稚 -##稜 -##稞 -##稟 -##稠 -##稣 -##種 -##稱 -##稲 -##稳 -##稷 -##稹 -##稻 -##稼 -##稽 -##稿 -##穀 -##穂 -##穆 -##穌 -##積 -##穎 -##穗 -##穢 -##穩 -##穫 -##穴 -##究 -##穷 -##穹 -##空 -##穿 -##突 -##窃 -##窄 -##窈 -##窍 -##窑 -##窒 -##窓 -##窕 -##窖 -##窗 -##窘 -##窜 -##窝 -##窟 -##窠 -##窥 -##窦 -##窨 -##窩 -##窪 -##窮 -##窯 -##窺 -##窿 -##竄 -##竅 -##竇 -##竊 -##立 -##竖 -##站 -##竜 -##竞 -##竟 -##章 -##竣 -##童 -##竭 -##端 -##競 -##竹 -##竺 -##竽 -##竿 -##笃 -##笆 -##笈 -##笋 -##笏 -##笑 -##笔 -##笙 -##笛 -##笞 -##笠 -##符 -##笨 -##第 -##笹 -##笺 -##笼 -##筆 -##等 -##筊 -##筋 -##筍 -##筏 -##筐 -##筑 -##筒 -##答 -##策 -##筛 -##筝 -##筠 -##筱 -##筲 -##筵 -##筷 -##筹 -##签 -##简 -##箇 -##箋 -##箍 -##箏 -##箐 -##箔 -##箕 -##算 -##箝 -##管 -##箩 -##箫 -##箭 -##箱 -##箴 -##箸 -##節 -##篁 -##範 -##篆 -##篇 -##築 -##篑 -##篓 -##篙 -##篝 -##篠 -##篡 -##篤 -##篩 -##篪 -##篮 -##篱 -##篷 -##簇 -##簌 -##簍 -##簡 -##簦 -##簧 -##簪 -##簫 -##簷 -##簸 -##簽 -##簾 -##簿 -##籁 -##籃 -##籌 -##籍 -##籐 -##籟 -##籠 -##籤 -##籬 -##籮 -##籲 -##米 -##类 -##籼 -##籽 -##粄 -##粉 -##粑 -##粒 -##粕 -##粗 -##粘 -##粟 -##粤 -##粥 -##粧 -##粪 -##粮 -##粱 -##粲 -##粳 -##粵 -##粹 -##粼 -##粽 -##精 -##粿 -##糅 -##糊 -##糍 -##糕 -##糖 -##糗 -##糙 -##糜 -##糞 -##糟 -##糠 -##糧 -##糬 -##糯 -##糰 -##糸 -##系 -##糾 -##紀 -##紂 -##約 -##紅 -##紉 -##紊 -##紋 -##納 -##紐 -##紓 -##純 -##紗 -##紘 -##紙 -##級 -##紛 -##紜 -##素 -##紡 -##索 -##紧 -##紫 -##紮 -##累 -##細 -##紳 -##紹 -##紺 -##終 -##絃 -##組 -##絆 -##経 -##結 -##絕 -##絞 -##絡 -##絢 -##給 -##絨 -##絮 -##統 -##絲 -##絳 -##絵 -##絶 -##絹 -##綁 -##綏 -##綑 -##經 -##継 -##続 -##綜 -##綠 -##綢 -##綦 -##綫 -##綬 -##維 -##綱 -##網 -##綴 -##綵 -##綸 -##綺 -##綻 -##綽 -##綾 -##綿 -##緊 -##緋 -##総 -##緑 -##緒 -##緘 -##線 -##緝 -##緞 -##締 -##緣 -##編 -##緩 -##緬 -##緯 -##練 -##緹 -##緻 -##縁 -##縄 -##縈 -##縛 -##縝 -##縣 -##縫 -##縮 -##縱 -##縴 -##縷 -##總 -##績 -##繁 -##繃 -##繆 -##繇 -##繋 -##織 -##繕 -##繚 -##繞 -##繡 -##繩 -##繪 -##繫 -##繭 -##繳 -##繹 -##繼 -##繽 -##纂 -##續 -##纍 -##纏 -##纓 -##纔 -##纖 -##纜 -##纠 -##红 -##纣 -##纤 -##约 -##级 -##纨 -##纪 -##纫 -##纬 -##纭 -##纯 -##纰 -##纱 -##纲 -##纳 -##纵 -##纶 -##纷 -##纸 -##纹 -##纺 -##纽 -##纾 -##线 -##绀 -##练 -##组 -##绅 -##细 -##织 -##终 -##绊 -##绍 -##绎 -##经 -##绑 -##绒 -##结 -##绔 -##绕 -##绘 -##给 -##绚 -##绛 -##络 -##绝 -##绞 -##统 -##绡 -##绢 -##绣 -##绥 -##绦 -##继 -##绩 -##绪 -##绫 -##续 -##绮 -##绯 -##绰 -##绳 -##维 -##绵 -##绶 -##绷 -##绸 -##绻 -##综 -##绽 -##绾 -##绿 -##缀 -##缄 -##缅 -##缆 -##缇 -##缈 -##缉 -##缎 -##缓 -##缔 -##缕 -##编 -##缘 -##缙 -##缚 -##缜 -##缝 -##缠 -##缢 -##缤 -##缥 -##缨 -##缩 -##缪 -##缭 -##缮 -##缰 -##缱 -##缴 -##缸 -##缺 -##缽 -##罂 -##罄 -##罌 -##罐 -##网 -##罔 -##罕 -##罗 -##罚 -##罡 -##罢 -##罩 -##罪 -##置 -##罰 -##署 -##罵 -##罷 -##罹 -##羁 -##羅 -##羈 -##羊 -##羌 -##美 -##羔 -##羚 -##羞 -##羟 -##羡 -##羣 -##群 -##羥 -##羧 -##羨 -##義 -##羯 -##羲 -##羸 -##羹 -##羽 -##羿 -##翁 -##翅 -##翊 -##翌 -##翎 -##習 -##翔 -##翘 -##翟 -##翠 -##翡 -##翦 -##翩 -##翰 -##翱 -##翳 -##翹 -##翻 -##翼 -##耀 -##老 -##考 -##耄 -##者 -##耆 -##耋 -##而 -##耍 -##耐 -##耒 -##耕 -##耗 -##耘 -##耙 -##耦 -##耨 -##耳 -##耶 -##耷 -##耸 -##耻 -##耽 -##耿 -##聂 -##聆 -##聊 -##聋 -##职 -##聒 -##联 -##聖 -##聘 -##聚 -##聞 -##聪 -##聯 -##聰 -##聲 -##聳 -##聴 -##聶 -##職 -##聽 -##聾 -##聿 -##肃 -##肄 -##肅 -##肆 -##肇 -##肉 -##肋 -##肌 -##肏 -##肓 -##肖 -##肘 -##肚 -##肛 -##肝 -##肠 -##股 -##肢 -##肤 -##肥 -##肩 -##肪 -##肮 -##肯 -##肱 -##育 -##肴 -##肺 -##肽 -##肾 -##肿 -##胀 -##胁 -##胃 -##胄 -##胆 -##背 -##胍 -##胎 -##胖 -##胚 -##胛 -##胜 -##胝 -##胞 -##胡 -##胤 -##胥 -##胧 -##胫 -##胭 -##胯 -##胰 -##胱 -##胳 -##胴 -##胶 -##胸 -##胺 -##能 -##脂 -##脅 -##脆 -##脇 -##脈 -##脉 -##脊 -##脍 -##脏 -##脐 -##脑 -##脓 -##脖 -##脘 -##脚 -##脛 -##脣 -##脩 -##脫 -##脯 -##脱 -##脲 -##脳 -##脸 -##脹 -##脾 -##腆 -##腈 -##腊 -##腋 -##腌 -##腎 -##腐 -##腑 -##腓 -##腔 -##腕 -##腥 -##腦 -##腩 -##腫 -##腭 -##腮 -##腰 -##腱 -##腳 -##腴 -##腸 -##腹 -##腺 -##腻 -##腼 -##腾 -##腿 -##膀 -##膈 -##膊 -##膏 -##膑 -##膘 -##膚 -##膛 -##膜 -##膝 -##膠 -##膦 -##膨 -##膩 -##膳 -##膺 -##膻 -##膽 -##膾 -##膿 -##臀 -##臂 -##臃 -##臆 -##臉 -##臊 -##臍 -##臓 -##臘 -##臟 -##臣 -##臥 -##臧 -##臨 -##自 -##臬 -##臭 -##至 -##致 -##臺 -##臻 -##臼 -##臾 -##舀 -##舂 -##舅 -##舆 -##與 -##興 -##舉 -##舊 -##舌 -##舍 -##舎 -##舐 -##舒 -##舔 -##舖 -##舗 -##舛 -##舜 -##舞 -##舟 -##航 -##舫 -##般 -##舰 -##舱 -##舵 -##舶 -##舷 -##舸 -##船 -##舺 -##舾 -##艇 -##艋 -##艘 -##艙 -##艦 -##艮 -##良 -##艰 -##艱 -##色 -##艳 -##艷 -##艹 -##艺 -##艾 -##节 -##芃 -##芈 -##芊 -##芋 -##芍 -##芎 -##芒 -##芙 -##芜 -##芝 -##芡 -##芥 -##芦 -##芩 -##芪 -##芫 -##芬 -##芭 -##芮 -##芯 -##花 -##芳 -##芷 -##芸 -##芹 -##芻 -##芽 -##芾 -##苁 -##苄 -##苇 -##苋 -##苍 -##苏 -##苑 -##苒 -##苓 -##苔 -##苕 -##苗 -##苛 -##苜 -##苞 -##苟 -##苡 -##苣 -##若 -##苦 -##苫 -##苯 -##英 -##苷 -##苹 -##苻 -##茁 -##茂 -##范 -##茄 -##茅 -##茉 -##茎 -##茏 -##茗 -##茜 -##茧 -##茨 -##茫 -##茬 -##茭 -##茯 -##茱 -##茲 -##茴 -##茵 -##茶 -##茸 -##茹 -##茼 -##荀 -##荃 -##荆 -##草 -##荊 -##荏 -##荐 -##荒 -##荔 -##荖 -##荘 -##荚 -##荞 -##荟 -##荠 -##荡 -##荣 -##荤 -##荥 -##荧 -##荨 -##荪 -##荫 -##药 -##荳 -##荷 -##荸 -##荻 -##荼 -##荽 -##莅 -##莆 -##莉 -##莊 -##莎 -##莒 -##莓 -##莖 -##莘 -##莞 -##莠 -##莢 -##莧 -##莪 -##莫 -##莱 -##莲 -##莴 -##获 -##莹 -##莺 -##莽 -##莿 -##菀 -##菁 -##菅 -##菇 -##菈 -##菊 -##菌 -##菏 -##菓 -##菖 -##菘 -##菜 -##菟 -##菠 -##菡 -##菩 -##華 -##菱 -##菲 -##菸 -##菽 -##萁 -##萃 -##萄 -##萊 -##萋 -##萌 -##萍 -##萎 -##萘 -##萝 -##萤 -##营 -##萦 -##萧 -##萨 -##萩 -##萬 -##萱 -##萵 -##萸 -##萼 -##落 -##葆 -##葉 -##著 -##葚 -##葛 -##葡 -##董 -##葦 -##葩 -##葫 -##葬 -##葭 -##葯 -##葱 -##葳 -##葵 -##葷 -##葺 -##蒂 -##蒋 -##蒐 -##蒔 -##蒙 -##蒜 -##蒞 -##蒟 -##蒡 -##蒨 -##蒲 -##蒸 -##蒹 -##蒻 -##蒼 -##蒿 -##蓁 -##蓄 -##蓆 -##蓉 -##蓋 -##蓑 -##蓓 -##蓖 -##蓝 -##蓟 -##蓦 -##蓬 -##蓮 -##蓼 -##蓿 -##蔑 -##蔓 -##蔔 -##蔗 -##蔘 -##蔚 -##蔡 -##蔣 -##蔥 -##蔫 -##蔬 -##蔭 -##蔵 -##蔷 -##蔺 -##蔻 -##蔼 -##蔽 -##蕁 -##蕃 -##蕈 -##蕉 -##蕊 -##蕎 -##蕙 -##蕤 -##蕨 -##蕩 -##蕪 -##蕭 -##蕲 -##蕴 -##蕻 -##蕾 -##薄 -##薅 -##薇 -##薈 -##薊 -##薏 -##薑 -##薔 -##薙 -##薛 -##薦 -##薨 -##薩 -##薪 -##薬 -##薯 -##薰 -##薹 -##藉 -##藍 -##藏 -##藐 -##藓 -##藕 -##藜 -##藝 -##藤 -##藥 -##藩 -##藹 -##藻 -##藿 -##蘆 -##蘇 -##蘊 -##蘋 -##蘑 -##蘚 -##蘭 -##蘸 -##蘼 -##蘿 -##虎 -##虏 -##虐 -##虑 -##虔 -##處 -##虚 -##虛 -##虜 -##虞 -##號 -##虢 -##虧 -##虫 -##虬 -##虱 -##虹 -##虻 -##虽 -##虾 -##蚀 -##蚁 -##蚂 -##蚊 -##蚌 -##蚓 -##蚕 -##蚜 -##蚝 -##蚣 -##蚤 -##蚩 -##蚪 -##蚯 -##蚱 -##蚵 -##蛀 -##蛆 -##蛇 -##蛊 -##蛋 -##蛎 -##蛐 -##蛔 -##蛙 -##蛛 -##蛟 -##蛤 -##蛭 -##蛮 -##蛰 -##蛳 -##蛹 -##蛻 -##蛾 -##蜀 -##蜂 -##蜃 -##蜆 -##蜇 -##蜈 -##蜊 -##蜍 -##蜒 -##蜓 -##蜕 -##蜗 -##蜘 -##蜚 -##蜜 -##蜡 -##蜢 -##蜥 -##蜱 -##蜴 -##蜷 -##蜻 -##蜿 -##蝇 -##蝈 -##蝉 -##蝌 -##蝎 -##蝕 -##蝗 -##蝙 -##蝟 -##蝠 -##蝦 -##蝨 -##蝴 -##蝶 -##蝸 -##蝼 -##螂 -##螃 -##融 -##螞 -##螢 -##螨 -##螯 -##螳 -##螺 -##蟀 -##蟄 -##蟆 -##蟋 -##蟎 -##蟑 -##蟒 -##蟠 -##蟬 -##蟲 -##蟹 -##蟻 -##蟾 -##蠅 -##蠍 -##蠔 -##蠕 -##蠛 -##蠟 -##蠡 -##蠢 -##蠣 -##蠱 -##蠶 -##蠹 -##蠻 -##血 -##衄 -##衅 -##衆 -##行 -##衍 -##術 -##衔 -##街 -##衙 -##衛 -##衝 -##衞 -##衡 -##衢 -##衣 -##补 -##表 -##衩 -##衫 -##衬 -##衮 -##衰 -##衲 -##衷 -##衹 -##衾 -##衿 -##袁 -##袂 -##袄 -##袅 -##袈 -##袋 -##袍 -##袒 -##袖 -##袜 -##袞 -##袤 -##袪 -##被 -##袭 -##袱 -##裁 -##裂 -##装 -##裆 -##裊 -##裏 -##裔 -##裕 -##裘 -##裙 -##補 -##裝 -##裟 -##裡 -##裤 -##裨 -##裱 -##裳 -##裴 -##裸 -##裹 -##製 -##裾 -##褂 -##複 -##褐 -##褒 -##褓 -##褔 -##褚 -##褥 -##褪 -##褫 -##褲 -##褶 -##褻 -##襁 -##襄 -##襟 -##襠 -##襪 -##襬 -##襯 -##襲 -##西 -##要 -##覃 -##覆 -##覇 -##見 -##規 -##覓 -##視 -##覚 -##覦 -##覧 -##親 -##覬 -##観 -##覷 -##覺 -##覽 -##觀 -##见 -##观 -##规 -##觅 -##视 -##览 -##觉 -##觊 -##觎 -##觐 -##觑 -##角 -##觞 -##解 -##觥 -##触 -##觸 -##言 -##訂 -##計 -##訊 -##討 -##訓 -##訕 -##訖 -##託 -##記 -##訛 -##訝 -##訟 -##訣 -##訥 -##訪 -##設 -##許 -##訳 -##訴 -##訶 -##診 -##註 -##証 -##詆 -##詐 -##詔 -##評 -##詛 -##詞 -##詠 -##詡 -##詢 -##詣 -##試 -##詩 -##詫 -##詬 -##詭 -##詮 -##詰 -##話 -##該 -##詳 -##詹 -##詼 -##誅 -##誇 -##誉 -##誌 -##認 -##誓 -##誕 -##誘 -##語 -##誠 -##誡 -##誣 -##誤 -##誥 -##誦 -##誨 -##說 -##説 -##読 -##誰 -##課 -##誹 -##誼 -##調 -##諄 -##談 -##請 -##諏 -##諒 -##論 -##諗 -##諜 -##諡 -##諦 -##諧 -##諫 -##諭 -##諮 -##諱 -##諳 -##諷 -##諸 -##諺 -##諾 -##謀 -##謁 -##謂 -##謄 -##謊 -##謎 -##謐 -##謔 -##謗 -##謙 -##講 -##謝 -##謠 -##謨 -##謬 -##謹 -##謾 -##譁 -##證 -##譎 -##譏 -##識 -##譙 -##譚 -##譜 -##警 -##譬 -##譯 -##議 -##譲 -##譴 -##護 -##譽 -##讀 -##變 -##讓 -##讚 -##讞 -##计 -##订 -##认 -##讥 -##讧 -##讨 -##让 -##讪 -##讫 -##训 -##议 -##讯 -##记 -##讲 -##讳 -##讴 -##讶 -##讷 -##许 -##讹 -##论 -##讼 -##讽 -##设 -##访 -##诀 -##证 -##诃 -##评 -##诅 -##识 -##诈 -##诉 -##诊 -##诋 -##词 -##诏 -##译 -##试 -##诗 -##诘 -##诙 -##诚 -##诛 -##话 -##诞 -##诟 -##诠 -##诡 -##询 -##诣 -##诤 -##该 -##详 -##诧 -##诩 -##诫 -##诬 -##语 -##误 -##诰 -##诱 -##诲 -##说 -##诵 -##诶 -##请 -##诸 -##诺 -##读 -##诽 -##课 -##诿 -##谀 -##谁 -##调 -##谄 -##谅 -##谆 -##谈 -##谊 -##谋 -##谌 -##谍 -##谎 -##谏 -##谐 -##谑 -##谒 -##谓 -##谔 -##谕 -##谗 -##谘 -##谙 -##谚 -##谛 -##谜 -##谟 -##谢 -##谣 -##谤 -##谥 -##谦 -##谧 -##谨 -##谩 -##谪 -##谬 -##谭 -##谯 -##谱 -##谲 -##谴 -##谶 -##谷 -##豁 -##豆 -##豇 -##豈 -##豉 -##豊 -##豌 -##豎 -##豐 -##豔 -##豚 -##象 -##豢 -##豪 -##豫 -##豬 -##豹 -##豺 -##貂 -##貅 -##貌 -##貓 -##貔 -##貘 -##貝 -##貞 -##負 -##財 -##貢 -##貧 -##貨 -##販 -##貪 -##貫 -##責 -##貯 -##貰 -##貳 -##貴 -##貶 -##買 -##貸 -##費 -##貼 -##貽 -##貿 -##賀 -##賁 -##賂 -##賃 -##賄 -##資 -##賈 -##賊 -##賑 -##賓 -##賜 -##賞 -##賠 -##賡 -##賢 -##賣 -##賤 -##賦 -##質 -##賬 -##賭 -##賴 -##賺 -##購 -##賽 -##贅 -##贈 -##贊 -##贍 -##贏 -##贓 -##贖 -##贛 -##贝 -##贞 -##负 -##贡 -##财 -##责 -##贤 -##败 -##账 -##货 -##质 -##贩 -##贪 -##贫 -##贬 -##购 -##贮 -##贯 -##贰 -##贱 -##贲 -##贴 -##贵 -##贷 -##贸 -##费 -##贺 -##贻 -##贼 -##贾 -##贿 -##赁 -##赂 -##赃 -##资 -##赅 -##赈 -##赊 -##赋 -##赌 -##赎 -##赏 -##赐 -##赓 -##赔 -##赖 -##赘 -##赚 -##赛 -##赝 -##赞 -##赠 -##赡 -##赢 -##赣 -##赤 -##赦 -##赧 -##赫 -##赭 -##走 -##赳 -##赴 -##赵 -##赶 -##起 -##趁 -##超 -##越 -##趋 -##趕 -##趙 -##趟 -##趣 -##趨 -##足 -##趴 -##趵 -##趸 -##趺 -##趾 -##跃 -##跄 -##跆 -##跋 -##跌 -##跎 -##跑 -##跖 -##跚 -##跛 -##距 -##跟 -##跡 -##跤 -##跨 -##跩 -##跪 -##路 -##跳 -##践 -##跷 -##跹 -##跺 -##跻 -##踉 -##踊 -##踌 -##踏 -##踐 -##踝 -##踞 -##踟 -##踢 -##踩 -##踪 -##踮 -##踱 -##踴 -##踵 -##踹 -##蹂 -##蹄 -##蹇 -##蹈 -##蹉 -##蹊 -##蹋 -##蹑 -##蹒 -##蹙 -##蹟 -##蹣 -##蹤 -##蹦 -##蹩 -##蹬 -##蹭 -##蹲 -##蹴 -##蹶 -##蹺 -##蹼 -##蹿 -##躁 -##躇 -##躉 -##躊 -##躋 -##躍 -##躏 -##躪 -##身 -##躬 -##躯 -##躲 -##躺 -##軀 -##車 -##軋 -##軌 -##軍 -##軒 -##軟 -##転 -##軸 -##軼 -##軽 -##軾 -##較 -##載 -##輒 -##輓 -##輔 -##輕 -##輛 -##輝 -##輟 -##輩 -##輪 -##輯 -##輸 -##輻 -##輾 -##輿 -##轄 -##轅 -##轆 -##轉 -##轍 -##轎 -##轟 -##车 -##轧 -##轨 -##轩 -##转 -##轭 -##轮 -##软 -##轰 -##轲 -##轴 -##轶 -##轻 -##轼 -##载 -##轿 -##较 -##辄 -##辅 -##辆 -##辇 -##辈 -##辉 -##辊 -##辍 -##辐 -##辑 -##输 -##辕 -##辖 -##辗 -##辘 -##辙 -##辛 -##辜 -##辞 -##辟 -##辣 -##辦 -##辨 -##辩 -##辫 -##辭 -##辮 -##辯 -##辰 -##辱 -##農 -##边 -##辺 -##辻 -##込 -##辽 -##达 -##迁 -##迂 -##迄 -##迅 -##过 -##迈 -##迎 -##运 -##近 -##返 -##还 -##这 -##进 -##远 -##违 -##连 -##迟 -##迢 -##迤 -##迥 -##迦 -##迩 -##迪 -##迫 -##迭 -##述 -##迴 -##迷 -##迸 -##迹 -##迺 -##追 -##退 -##送 -##适 -##逃 -##逅 -##逆 -##选 -##逊 -##逍 -##透 -##逐 -##递 -##途 -##逕 -##逗 -##這 -##通 -##逛 -##逝 -##逞 -##速 -##造 -##逢 -##連 -##逮 -##週 -##進 -##逵 -##逶 -##逸 -##逻 -##逼 -##逾 -##遁 -##遂 -##遅 -##遇 -##遊 -##運 -##遍 -##過 -##遏 -##遐 -##遑 -##遒 -##道 -##達 -##違 -##遗 -##遙 -##遛 -##遜 -##遞 -##遠 -##遢 -##遣 -##遥 -##遨 -##適 -##遭 -##遮 -##遲 -##遴 -##遵 -##遶 -##遷 -##選 -##遺 -##遼 -##遽 -##避 -##邀 -##邁 -##邂 -##邃 -##還 -##邇 -##邈 -##邊 -##邋 -##邏 -##邑 -##邓 -##邕 -##邛 -##邝 -##邢 -##那 -##邦 -##邨 -##邪 -##邬 -##邮 -##邯 -##邰 -##邱 -##邳 -##邵 -##邸 -##邹 -##邺 -##邻 -##郁 -##郅 -##郊 -##郎 -##郑 -##郜 -##郝 -##郡 -##郢 -##郤 -##郦 -##郧 -##部 -##郫 -##郭 -##郴 -##郵 -##郷 -##郸 -##都 -##鄂 -##鄉 -##鄒 -##鄔 -##鄙 -##鄞 -##鄢 -##鄧 -##鄭 -##鄰 -##鄱 -##鄲 -##鄺 -##酉 -##酊 -##酋 -##酌 -##配 -##酐 -##酒 -##酗 -##酚 -##酝 -##酢 -##酣 -##酥 -##酩 -##酪 -##酬 -##酮 -##酯 -##酰 -##酱 -##酵 -##酶 -##酷 -##酸 -##酿 -##醃 -##醇 -##醉 -##醋 -##醍 -##醐 -##醒 -##醚 -##醛 -##醜 -##醞 -##醣 -##醪 -##醫 -##醬 -##醮 -##醯 -##醴 -##醺 -##釀 -##釁 -##采 -##釉 -##释 -##釋 -##里 -##重 -##野 -##量 -##釐 -##金 -##釗 -##釘 -##釜 -##針 -##釣 -##釦 -##釧 -##釵 -##鈀 -##鈉 -##鈍 -##鈎 -##鈔 -##鈕 -##鈞 -##鈣 -##鈦 -##鈪 -##鈴 -##鈺 -##鈾 -##鉀 -##鉄 -##鉅 -##鉉 -##鉑 -##鉗 -##鉚 -##鉛 -##鉤 -##鉴 -##鉻 -##銀 -##銃 -##銅 -##銑 -##銓 -##銖 -##銘 -##銜 -##銬 -##銭 -##銮 -##銳 -##銷 -##銹 -##鋁 -##鋅 -##鋒 -##鋤 -##鋪 -##鋰 -##鋸 -##鋼 -##錄 -##錐 -##錘 -##錚 -##錠 -##錢 -##錦 -##錨 -##錫 -##錮 -##錯 -##録 -##錳 -##錶 -##鍊 -##鍋 -##鍍 -##鍛 -##鍥 -##鍰 -##鍵 -##鍺 -##鍾 -##鎂 -##鎊 -##鎌 -##鎏 -##鎔 -##鎖 -##鎗 -##鎚 -##鎧 -##鎬 -##鎮 -##鎳 -##鏈 -##鏖 -##鏗 -##鏘 -##鏞 -##鏟 -##鏡 -##鏢 -##鏤 -##鏽 -##鐘 -##鐮 -##鐲 -##鐳 -##鐵 -##鐸 -##鐺 -##鑄 -##鑊 -##鑑 -##鑒 -##鑣 -##鑫 -##鑰 -##鑲 -##鑼 -##鑽 -##鑾 -##鑿 -##针 -##钉 -##钊 -##钎 -##钏 -##钒 -##钓 -##钗 -##钙 -##钛 -##钜 -##钝 -##钞 -##钟 -##钠 -##钡 -##钢 -##钣 -##钤 -##钥 -##钦 -##钧 -##钨 -##钩 -##钮 -##钯 -##钰 -##钱 -##钳 -##钴 -##钵 -##钺 -##钻 -##钼 -##钾 -##钿 -##铀 -##铁 -##铂 -##铃 -##铄 -##铅 -##铆 -##铉 -##铎 -##铐 -##铛 -##铜 -##铝 -##铠 -##铡 -##铢 -##铣 -##铤 -##铨 -##铩 -##铬 -##铭 -##铮 -##铰 -##铲 -##铵 -##银 -##铸 -##铺 -##链 -##铿 -##销 -##锁 -##锂 -##锄 -##锅 -##锆 -##锈 -##锉 -##锋 -##锌 -##锏 -##锐 -##锑 -##错 -##锚 -##锟 -##锡 -##锢 -##锣 -##锤 -##锥 -##锦 -##锭 -##键 -##锯 -##锰 -##锲 -##锵 -##锹 -##锺 -##锻 -##镀 -##镁 -##镂 -##镇 -##镉 -##镌 -##镍 -##镐 -##镑 -##镕 -##镖 -##镗 -##镛 -##镜 -##镣 -##镭 -##镯 -##镰 -##镳 -##镶 -##長 -##长 -##門 -##閃 -##閉 -##開 -##閎 -##閏 -##閑 -##閒 -##間 -##閔 -##閘 -##閡 -##関 -##閣 -##閥 -##閨 -##閩 -##閱 -##閲 -##閹 -##閻 -##閾 -##闆 -##闇 -##闊 -##闌 -##闍 -##闔 -##闕 -##闖 -##闘 -##關 -##闡 -##闢 -##门 -##闪 -##闫 -##闭 -##问 -##闯 -##闰 -##闲 -##间 -##闵 -##闷 -##闸 -##闹 -##闺 -##闻 -##闽 -##闾 -##阀 -##阁 -##阂 -##阅 -##阆 -##阇 -##阈 -##阉 -##阎 -##阐 -##阑 -##阔 -##阕 -##阖 -##阙 -##阚 -##阜 -##队 -##阡 -##阪 -##阮 -##阱 -##防 -##阳 -##阴 -##阵 -##阶 -##阻 -##阿 -##陀 -##陂 -##附 -##际 -##陆 -##陇 -##陈 -##陋 -##陌 -##降 -##限 -##陕 -##陛 -##陝 -##陞 -##陟 -##陡 -##院 -##陣 -##除 -##陨 -##险 -##陪 -##陰 -##陲 -##陳 -##陵 -##陶 -##陷 -##陸 -##険 -##陽 -##隅 -##隆 -##隈 -##隊 -##隋 -##隍 -##階 -##随 -##隐 -##隔 -##隕 -##隘 -##隙 -##際 -##障 -##隠 -##隣 -##隧 -##隨 -##險 -##隱 -##隴 -##隶 -##隸 -##隻 -##隼 -##隽 -##难 -##雀 -##雁 -##雄 -##雅 -##集 -##雇 -##雉 -##雋 -##雌 -##雍 -##雎 -##雏 -##雑 -##雒 -##雕 -##雖 -##雙 -##雛 -##雜 -##雞 -##離 -##難 -##雨 -##雪 -##雯 -##雰 -##雲 -##雳 -##零 -##雷 -##雹 -##電 -##雾 -##需 -##霁 -##霄 -##霆 -##震 -##霈 -##霉 -##霊 -##霍 -##霎 -##霏 -##霑 -##霓 -##霖 -##霜 -##霞 -##霧 -##霭 -##霰 -##露 -##霸 -##霹 -##霽 -##霾 -##靂 -##靄 -##靈 -##青 -##靓 -##靖 -##静 -##靚 -##靛 -##靜 -##非 -##靠 -##靡 -##面 -##靥 -##靦 -##革 -##靳 -##靴 -##靶 -##靼 -##鞅 -##鞋 -##鞍 -##鞏 -##鞑 -##鞘 -##鞠 -##鞣 -##鞦 -##鞭 -##韆 -##韋 -##韌 -##韓 -##韜 -##韦 -##韧 -##韩 -##韬 -##韭 -##音 -##韵 -##韶 -##韻 -##響 -##頁 -##頂 -##頃 -##項 -##順 -##須 -##頌 -##預 -##頑 -##頒 -##頓 -##頗 -##領 -##頜 -##頡 -##頤 -##頫 -##頭 -##頰 -##頷 -##頸 -##頹 -##頻 -##頼 -##顆 -##題 -##額 -##顎 -##顏 -##顔 -##願 -##顛 -##類 -##顧 -##顫 -##顯 -##顱 -##顴 -##页 -##顶 -##顷 -##项 -##顺 -##须 -##顼 -##顽 -##顾 -##顿 -##颁 -##颂 -##预 -##颅 -##领 -##颇 -##颈 -##颉 -##颊 -##颌 -##颍 -##颐 -##频 -##颓 -##颔 -##颖 -##颗 -##题 -##颚 -##颛 -##颜 -##额 -##颞 -##颠 -##颡 -##颢 -##颤 -##颦 -##颧 -##風 -##颯 -##颱 -##颳 -##颶 -##颼 -##飄 -##飆 -##风 -##飒 -##飓 -##飕 -##飘 -##飙 -##飚 -##飛 -##飞 -##食 -##飢 -##飨 -##飩 -##飪 -##飯 -##飲 -##飼 -##飽 -##飾 -##餃 -##餅 -##餉 -##養 -##餌 -##餐 -##餒 -##餓 -##餘 -##餚 -##餛 -##餞 -##餡 -##館 -##餮 -##餵 -##餾 -##饅 -##饈 -##饋 -##饌 -##饍 -##饑 -##饒 -##饕 -##饗 -##饞 -##饥 -##饨 -##饪 -##饬 -##饭 -##饮 -##饯 -##饰 -##饱 -##饲 -##饴 -##饵 -##饶 -##饷 -##饺 -##饼 -##饽 -##饿 -##馀 -##馁 -##馄 -##馅 -##馆 -##馈 -##馋 -##馍 -##馏 -##馒 -##馔 -##首 -##馗 -##香 -##馥 -##馨 -##馬 -##馭 -##馮 -##馳 -##馴 -##駁 -##駄 -##駅 -##駆 -##駐 -##駒 -##駕 -##駛 -##駝 -##駭 -##駱 -##駿 -##騁 -##騎 -##騏 -##験 -##騙 -##騨 -##騰 -##騷 -##驀 -##驅 -##驊 -##驍 -##驒 -##驕 -##驗 -##驚 -##驛 -##驟 -##驢 -##驥 -##马 -##驭 -##驮 -##驯 -##驰 -##驱 -##驳 -##驴 -##驶 -##驷 -##驸 -##驹 -##驻 -##驼 -##驾 -##驿 -##骁 -##骂 -##骄 -##骅 -##骆 -##骇 -##骈 -##骊 -##骋 -##验 -##骏 -##骐 -##骑 -##骗 -##骚 -##骛 -##骜 -##骞 -##骠 -##骡 -##骤 -##骥 -##骧 -##骨 -##骯 -##骰 -##骶 -##骷 -##骸 -##骼 -##髂 -##髅 -##髋 -##髏 -##髒 -##髓 -##體 -##髖 -##高 -##髦 -##髪 -##髮 -##髯 -##髻 -##鬃 -##鬆 -##鬍 -##鬓 -##鬚 -##鬟 -##鬢 -##鬣 -##鬥 -##鬧 -##鬱 -##鬼 -##魁 -##魂 -##魄 -##魅 -##魇 -##魍 -##魏 -##魔 -##魘 -##魚 -##魯 -##魷 -##鮑 -##鮨 -##鮪 -##鮭 -##鮮 -##鯉 -##鯊 -##鯖 -##鯛 -##鯨 -##鯰 -##鯽 -##鰍 -##鰓 -##鰭 -##鰲 -##鰻 -##鰾 -##鱈 -##鱉 -##鱔 -##鱗 -##鱷 -##鱸 -##鱼 -##鱿 -##鲁 -##鲈 -##鲍 -##鲑 -##鲛 -##鲜 -##鲟 -##鲢 -##鲤 -##鲨 -##鲫 -##鲱 -##鲲 -##鲶 -##鲷 -##鲸 -##鳃 -##鳄 -##鳅 -##鳌 -##鳍 -##鳕 -##鳖 -##鳗 -##鳝 -##鳞 -##鳥 -##鳩 -##鳳 -##鳴 -##鳶 -##鴉 -##鴕 -##鴛 -##鴦 -##鴨 -##鴻 -##鴿 -##鵑 -##鵜 -##鵝 -##鵡 -##鵬 -##鵰 -##鵲 -##鶘 -##鶩 -##鶯 -##鶴 -##鷗 -##鷲 -##鷹 -##鷺 -##鸚 -##鸞 -##鸟 -##鸠 -##鸡 -##鸢 -##鸣 -##鸥 -##鸦 -##鸨 -##鸪 -##鸭 -##鸯 -##鸳 -##鸵 -##鸽 -##鸾 -##鸿 -##鹂 -##鹃 -##鹄 -##鹅 -##鹈 -##鹉 -##鹊 -##鹌 -##鹏 -##鹑 -##鹕 -##鹘 -##鹜 -##鹞 -##鹤 -##鹦 -##鹧 -##鹫 -##鹭 -##鹰 -##鹳 -##鹵 -##鹹 -##鹼 -##鹽 -##鹿 -##麂 -##麋 -##麒 -##麓 -##麗 -##麝 -##麟 -##麥 -##麦 -##麩 -##麴 -##麵 -##麸 -##麺 -##麻 -##麼 -##麽 -##麾 -##黃 -##黄 -##黍 -##黎 -##黏 -##黑 -##黒 -##黔 -##默 -##黛 -##黜 -##黝 -##點 -##黠 -##黨 -##黯 -##黴 -##鼋 -##鼎 -##鼐 -##鼓 -##鼠 -##鼬 -##鼹 -##鼻 -##鼾 -##齁 -##齊 -##齋 -##齐 -##齒 -##齡 -##齢 -##齣 -##齦 -##齿 -##龄 -##龅 -##龈 -##龊 -##龋 -##龌 -##龍 -##龐 -##龔 -##龕 -##龙 -##龚 -##龛 -##龜 -##龟 -##︰ -##︱ -##︶ -##︿ -##﹁ -##﹂ -##﹍ -##﹏ -##﹐ -##﹑ -##﹒ -##﹔ -##﹕ -##﹖ -##﹗ -##﹙ -##﹚ -##﹝ -##﹞ -##﹡ -##﹣ -##! -##" -### -##$ -##% -##& -##' -##( -##) -##* -##, -##- -##. -##/ -##: -##; -##< -##? -##@ -##[ -##\ -##] -##^ -##_ -##` -##f -##h -##j -##u -##w -##z -##{ -##} -##。 -##「 -##」 -##、 -##・ -##ッ -##ー -##イ -##ク -##シ -##ス -##ト -##ノ -##フ -##ラ -##ル -##ン -##゙ -##゚ -## ̄ -##¥ -##👍 -##🔥 -##😂 -##😎 diff --git a/contrib/BertTextClassification/mxBase/main.cpp b/contrib/BertTextClassification/mxBase/main.cpp deleted file mode 100644 index c37b87b5e..000000000 --- a/contrib/BertTextClassification/mxBase/main.cpp +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright(C) 2021. Huawei Technologies Co.,Ltd. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include -#include "BertClassification.h" -#include "test/Test.h" - -namespace { - const uint32_t MAX_LENGTH = 300; - const uint32_t LABEL_NUMBER = 5; - const uint32_t SAMPLE_NUMBER = 99; - const std::string LABEL_LIST[LABEL_NUMBER] = {"体育", "健康", "军事", "教育", "汽车"}; -} - -void InitBertParam(InitParam &initParam) { - initParam.deviceId = 0; - initParam.labelPath = "./model/bert_text_classification_labels.names"; - initParam.modelPath = "./model/bert_text_classification.om"; - initParam.vocabTextPath = "data/vocab.txt"; - initParam.maxLength = MAX_LENGTH; - initParam.labelNumber = LABEL_NUMBER; -} - -int main(int argc, char* argv[]) { - if (argc <= 1) { - LogWarn << "Please input text path, such as './mxBase_text_classification ./data/sample.txt'."; - return APP_ERR_OK; - } - - InitParam initParam; - InitBertParam(initParam); - auto bert = std::make_shared(); - // Initialize the configuration information required for model inference. - APP_ERROR ret = bert->Init(initParam); - if (ret != APP_ERR_OK) { - LogError << "BertClassification init failed, ret=" << ret << "."; - bert->DeInit(); - return ret; - } - - std::string textPath = argv[1]; - std::string aa = textPath.substr(textPath.find_last_of(".")); - if (textPath.substr(textPath.find_last_of(".")) != ".txt") { - LogError << "please input the txt file!"; - bert->DeInit(); - return APP_ERR_COMM_FAILURE; - } - std::string text; - std::ifstream infile; - // Open text file. - infile.open(textPath, std::ios_base::in); - // Check text file validity. - if (infile.fail()) { - LogError << "Failed to open textPath file: " << textPath << "."; - bert->DeInit(); - return APP_ERR_COMM_OPEN_FAIL; - } - - while (std::getline(infile, text)) { - std::string label; - // Inference begin. - ret = bert->Process(text, label); - std::cout << "origin text:" << text <DeInit(); - return ret; - } - } - - if (text == "") { - LogError << "The sample.txt text is null, please input right text!"; - bert->DeInit(); - return APP_ERR_COMM_FAILURE; - } - // Destroy. - bert->DeInit(); - return APP_ERR_OK; -} diff --git a/contrib/BertTextClassification/mxBase/model/bert_text_classification_labels.names b/contrib/BertTextClassification/mxBase/model/bert_text_classification_labels.names deleted file mode 100644 index 9dd5a8216..000000000 --- a/contrib/BertTextClassification/mxBase/model/bert_text_classification_labels.names +++ /dev/null @@ -1,5 +0,0 @@ -体育 -健康 -军事 -教育 -汽车 \ No newline at end of file diff --git a/contrib/BertTextClassification/mxBase/out/prediction_label.txt b/contrib/BertTextClassification/mxBase/out/prediction_label.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/contrib/BertTextClassification/mxBase/test/Test.cpp b/contrib/BertTextClassification/mxBase/test/Test.cpp deleted file mode 100644 index e52f79342..000000000 --- a/contrib/BertTextClassification/mxBase/test/Test.cpp +++ /dev/null @@ -1,151 +0,0 @@ -// -// Created by 13352 on 2021/10/19. -// - -#include "Test.h" -#include -#include - -namespace { - const uint32_t MAX_LENGTH = 300; - const uint32_t LABEL_NUMBER = 5; - const uint32_t SAMPLE_NUMBER = 99; - const std::string LABEL_LIST[LABEL_NUMBER] = {"体育", "健康", "军事", "教育", "汽车"}; -} - -void Test::InitBertParam(InitParam &initParam) { - initParam.deviceId = 0; - initParam.labelPath = "./model/bert_text_classification_labels.names"; - initParam.modelPath = "./model/bert_text_classification.om"; - initParam.vocabTextPath = "data/vocab.txt"; - initParam.maxLength = MAX_LENGTH; - initParam.labelNumber = LABEL_NUMBER; -} - -APP_ERROR Test::test_accuracy() { - InitParam initParam; - InitBertParam(initParam); - auto bert = std::make_shared(); - - // Initialize the configuration information required for model inference. - APP_ERROR ret = bert->Init(initParam); - if (ret != APP_ERR_OK) { - LogError << "BertClassification init failed, ret=" << ret << "."; - bert->DeInit(); - return ret; - } - - // Open test file. - std::ifstream fin("data/test.csv"); - std::string line, prediction_label; - std::vector> prediction_label_lists; - - // Init prediction_label_lists. - for (int i = 0;i < LABEL_NUMBER;i++) { - std::vector temp; - prediction_label_lists.push_back(temp); - } - int index = 0, count = 0; - clock_t startTime,endTime; - startTime = clock(); - while (getline(fin, line)) { - std::istringstream sin(line); - std::string label, text; - std::string field; - while (getline(sin, field, ',')) { - label = field; - break; - } - text = line.substr(line.find_first_of(',') + 1); - // Remove the start and end ". - if (text.find("\"") == 0) { - text = text.replace(text.find("\""),1,""); - text = text.replace(text.find_last_of("\""),1,""); - } - // Start inference. - ret = bert->Process(text, prediction_label); - - if (count != 0 && count % SAMPLE_NUMBER == 0) { - index++; - } - - // Determine whether the prediction result is correct. - if (prediction_label == label){ - prediction_label_lists[index].push_back("true"); - } - else{ - prediction_label_lists[index].push_back("false"); - } - - count++; - if (ret != APP_ERR_OK) { - LogError << "BertClassification process failed, ret=" << ret << "."; - bert->DeInit(); - return ret; - } - } - endTime = clock(); - std::cout << "The average time is: " <<(double)(endTime - startTime) / CLOCKS_PER_SEC / SAMPLE_NUMBER / LABEL_NUMBER - << "s" << std::endl; - bert->DeInit(); - - // Calculate accuracy. - int all_count = 0; - index = 0; - double accuracy; - for (auto label_list : prediction_label_lists) { - count = 0; - for (auto label : label_list) { - if (label == "true") { - count++; - all_count++; - } - } - accuracy = static_cast(count) / SAMPLE_NUMBER; - std::cout << LABEL_LIST[index] << "类的精确度为:" << accuracy << std::endl; - index++; - } - accuracy = static_cast(all_count) / SAMPLE_NUMBER / LABEL_NUMBER; - std::cout << "全部类的精确度为:" << accuracy << std::endl; - return APP_ERR_OK; -} - -APP_ERROR Test::test_input() { - std::vector input_text; - InitParam initParam; - InitBertParam(initParam); - auto bert = std::make_shared(); - // Initialize the configuration information required for model inference. - APP_ERROR ret = bert->Init(initParam); - if (ret != APP_ERR_OK) { - LogError << "BertClassification init failed, ret=" << ret << "."; - bert->DeInit(); - return ret; - } - std::string text; - std::ifstream infile; - // Open text file. - infile.open("data/test.txt", std::ios_base::in); - // Check text file validity. - if (infile.fail()) { - LogError << "Failed to open textPath file: test.txt."; - bert->DeInit(); - return APP_ERR_COMM_OPEN_FAIL; - } - while (std::getline(infile, text)) { - std::string label; - // Inference begin. - ret = bert->Process(text, label); - std::cout << "origin text:" << text <DeInit(); - return ret; - } - } - - // Destroy. - bert->DeInit(); - return APP_ERR_OK; -} \ No newline at end of file diff --git a/contrib/BertTextClassification/mxBase/test/Test.h b/contrib/BertTextClassification/mxBase/test/Test.h deleted file mode 100644 index c4acc3456..000000000 --- a/contrib/BertTextClassification/mxBase/test/Test.h +++ /dev/null @@ -1,19 +0,0 @@ -// -// Created by 13352 on 2021/10/19. -// - -#ifndef MXBASE_TEXT_CLASSIFICATION_TEST_H -#define MXBASE_TEXT_CLASSIFICATION_TEST_H - - -#include - -class Test { -public: - static void InitBertParam(InitParam &initParam); - static APP_ERROR test_accuracy(); - static APP_ERROR test_input(); -}; - - -#endif // MXBASE_TEXT_CLASSIFICATION_TEST_H diff --git a/contrib/BertTextClassification/sdk/pipeline/BertTextClassification.pipeline b/contrib/BertTextClassification/sdk/pipeline/BertTextClassification.pipeline index f99a9a17c..3279ed1dc 100644 --- a/contrib/BertTextClassification/sdk/pipeline/BertTextClassification.pipeline +++ b/contrib/BertTextClassification/sdk/pipeline/BertTextClassification.pipeline @@ -1,7 +1,7 @@ { "classification": { "stream_config": { - "deviceId": "1" + "deviceId": "0" }, "appsrc0": { "props": { diff --git a/contrib/Collision/README.md b/contrib/Collision/README.md index 0ab72b54a..c2abeaf41 100644 --- a/contrib/Collision/README.md +++ b/contrib/Collision/README.md @@ -11,9 +11,10 @@ ### 1.2 支持的版本 -本样例配套的CANN版本为[5.0.4](https://gitee.com/link?target=https%3A%2F%2Fwww.hiascend.com%2Fsoftware%2Fcann%2Fcommercial)。支持的SDK版本为[2.0.4](https://gitee.com/link?target=https%3A%2F%2Fwww.hiascend.com%2Fsoftware%2FMindx-sdk)。 - -MindX SDK安装前准备可参考《用户指南》,[安装教程](https://gitee.com/ascend/mindxsdk-referenceapps/blob/master/docs/quickStart/1-1安装SDK开发套件.md) +| 软件名称 | 版本 | +| -------- | ------ | +| MindX SDK | 5.0RC1 | +| CANN | 310使用6.3.RC1
    310B使用6.2.RC1 | ### 1.3 特性及适用场景 @@ -79,42 +80,9 @@ MindX SDK安装前准备可参考《用户指南》,[安装教程](https://git 注:红色为本项目开发插件 蓝色为沿用其他项目开发插件 其余为SDK内置插件 -## 2 环境依赖 - -推荐系统为ubuntu 18.04,环境依赖软件和版本如下表: - -| 软件名称 | 版本 | 说明 | 获取方式 | -| ------------------- | ----------- | ----------------------------- | ------------------------------------------------------------ | -| MindX SDK | 2.0.4 | mxVision软件包 | [链接](https://gitee.com/link?target=https%3A%2F%2Fwww.hiascend.com%2Fsoftware%2FMindx-sdk) | -| ubuntu | 18.04.1 LTS | 操作系统 | Ubuntu官网获取 | -| Ascend-CANN-toolkit | 5.0.4 | Ascend-cann-toolkit开发套件包 | [链接](https://gitee.com/link?target=https%3A%2F%2Fwww.hiascend.com%2Fsoftware%2Fcann%2Fcommercial) | - -在编译运行项目前,需要设置环境变量: - -- 环境变量介绍 - -``` -export MX_SDK_HOME=${SDK安装路径}/mxVision -export install_path=/usr/local/Ascend/ascend-toolkit/latest -export PATH=/usr/local/python3.9.2/bin:${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATH -export ASCEND_OPP_PATH=${install_path}/opp -export ASCEND_AICPU_PATH=${install_path} -export LD_LIBRARY_PATH=${install_path}/atc/lib64:${MX_SDK_HOME}/lib:${MX_SDK_HOME}/opensource/lib:$LD_LIBRARY_PATH -export GST_PLUGIN_SCANNER=${MX_SDK_HOME}/opensource/libexec/gstreamer-1.0/gst-plugin-scanner -export GST_PLUGIN_PATH=${MX_SDK_HOME}/opensource/lib/gstreamer-1.0:${MX_SDK_HOME}/lib/plugins -#用于设置python3.9.2库文件路径 -export LD_LIBRARY_PATH=/usr/local/python3.9.2/lib:$LD_LIBRARY_PATH -#如果用户环境存在多个python3版本,则指定使用python3.9.2版本 -export PATH=/usr/local/python3.9.2/bin:$PATH -``` - -注:其中SDK安装路径${MX_SDK_HOME}替换为用户的SDK安装路径;install_path替换为开发套件包所在路径。LD_LIBRARY_PATH用以加载开发套件包中lib库。 - - +## 1 环境依赖 -## 3 依赖安装 - -推理中涉及到第三方软件依赖如下表所示。 +推荐系统为ubantu 18.04,环境依赖软件和版本如下表: | 依赖软件 | 版本 | 说明 | 使用教程 | | -------- | ---------- | ------------------------------ | -----------------------------------------------------------: | @@ -122,9 +90,15 @@ export PATH=/usr/local/python3.9.2/bin:$PATH | ffmpeg | 2021-07-21 | 实现mp4格式视频转为264格式视频 | [链接]([guide/mindx/sdk/tutorials/reference_material/pc端ffmpeg安装教程.md · Ascend/docs-openmind - Gitee.com](https://gitee.com/ascend/docs-openmind/blob/master/guide/mindx/sdk/tutorials/reference_material/pc端ffmpeg安装教程.md)) | | python | 3.9.2 | 与SDK配套 | [链接]([Linux(Ubuntu)系统安装Python (biancheng.net)](http://c.biancheng.net/view/4162.html)) | +在编译运行项目前,需要设置环境变量: +将${SDK_INSTALL_PATH}替换为自己的SDK安装路径; +```shell +. /usr/local/Ascend/ascend-toolkit/set_env.sh #toolkit默认安装路径,根据实际安装路径修改 +. ${SDK_INSTALL_PATH}/mxVision/set_env.sh +``` -## 4 模型转换 +## 2 模型转换 本项目中适用的模型是yolov3模型,yolov3模型可以在昇腾官网ModelZoo直接下载:[YOLOv3-昇腾社区 (hiascend.com)]([ATC YOLOv3(FP16)-昇腾社区 (hiascend.com)](https://www.hiascend.com/zh/software/modelzoo/detail/1/ba2a4c054a094ef595da288ecbc7d7b4))。下载后使用模型转换工具 ATC 将 pb 模型转换为 om 模型,模型转换工具相关介绍参考链接:[https://gitee.com/ascend/docs-openmind/blob/master/guide/mindx/sdk/tutorials/%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99.md](https://gitee.com/ascend/docs-openmind/blob/master/guide/mindx/sdk/tutorials/%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99.md) 。 @@ -133,9 +107,9 @@ export PATH=/usr/local/python3.9.2/bin:$PATH 从上述下载链接中下载yolov3模型解压缩文件yolov3_tf.pb至 ./model 文件夹下,进入 `./models` 文件夹下执行命令: ``` -atc --model=./yolov3_tf.pb --framework=3 --output=./yolov3 --soc_version=Ascend310 --insert_op_conf=./aipp_yolov3_416_416.aippconfig --input_shape="input:1,416,416,3" --out_nodes="yolov3/yolov3_head/Conv_6/BiasAdd:0;yolov3/yolov3_head/Conv_14/BiasAdd:0;yolov3/yolov3_head/Conv_22/BiasAdd:0" +atc --model=./yolov3_tf.pb --framework=3 --output=./yolov3 --soc_version=Ascend310B1 --insert_op_conf=./aipp_yolov3_416_416.aippconfig --input_shape="input:1,416,416,3" --out_nodes="yolov3/yolov3_head/Conv_6/BiasAdd:0;yolov3/yolov3_head/Conv_14/BiasAdd:0;yolov3/yolov3_head/Conv_22/BiasAdd:0" ``` - +此命令适用于310B1硬件,使用310时指定soc_version=Ascend310 执行该命令后会在当前文件夹下生成项目需要的模型文件 yolov3.om。执行后终端输出为: ``` @@ -147,7 +121,7 @@ ATC run success, welcome to the next use. -## 5 准备 +## 3 准备 按照第3小结**软件依赖**安装live555和ffmpeg,按照 [Live555离线视频转RTSP说明文档]([guide/mindx/sdk/tutorials/reference_material/Live555离线视频转RTSP说明文档.md · Ascend/docs-openmind - Gitee.com](https://gitee.com/ascend/docs-openmind/blob/master/guide/mindx/sdk/tutorials/reference_material/Live555离线视频转RTSP说明文档.md))将mp4视频转换为h264格式。并将生成的264格式的视频上传到`live/mediaServer`目录下,然后修改collision.pipeline文件中mxpi_rtspsrc0的内容。 @@ -176,7 +150,7 @@ ATC run success, welcome to the next use. "factory": "mxpi_videoencoder", "next": "queue7" }, -## 6 编译与运行 +## 4 编译与运行 **步骤1** 按照第2小结**环境依赖**中的步骤设置环境变量。 @@ -195,14 +169,14 @@ bash build.sh **步骤5** 运行。回到主目录下,在主目录下执行命令: ``` -python3.9.2 collision.py +python3 collision.py ``` 命令执行成功后会在当前目录下生成检测结果视频文件out_collision.h264,查看文件验证目标跟踪结果。 -## 7 结果展示(部分截图) +## 5 结果展示(部分截图) 生成的out_collision.h264文件在本地我们可以用适配.h264文件格式的视频播放软件进行播放。也可以使用ffmpeg转换成.mp4格式进行本地播放。 @@ -214,7 +188,7 @@ ffmpeg -i out_collision.h264 -vcodec h264 out_collision.mp4 -## 8 常见问题 +## 6 常见问题 视频编码参数配置错误 diff --git a/contrib/MMNET/README.md b/contrib/MMNET/README.md index abb6ba2c5..88bfd8a3c 100644 --- a/contrib/MMNET/README.md +++ b/contrib/MMNET/README.md @@ -15,7 +15,10 @@ MMNet致力于解决移动设备上人像抠图的问题,旨在以最小的模 ### 1.2 支持的版本 -支持的SDK版本为 2.0.4,CANN版本为 20.2.0 +| 软件名称 | 版本 | +| -------- | ------ | +| MindX SDK | 5.0RC1 | +| CANN | 310使用6.3.RC1
    310B使用6.2.RC1 | ### 1.3 代码目录结构与说明 @@ -47,11 +50,10 @@ MMNet致力于解决移动设备上人像抠图的问题,旨在以最小的模 ## 2 环境依赖 -| 软件名称 | 版本 | -| --------- | ----- | -| MindX SDK | 2.0.4 | -| python | 3.9.2 | -| CANN | 5.0.4 | +| 软件名称 | 版本 | +| -------- | ------ | +| cmake | 3.10.2 | +| python | 3.9.2 | | opencv2 | | | numpy | | @@ -106,9 +108,9 @@ aipp_op { 在确保环境变量设置正确后,在pb文件所在目录下执行以下命令: ``` -atc --model=mmnet.pb --framework=3 --output=mmnet --soc_version=Ascend310 --insert_op_conf=mmnet.aippconf --input_shape="input_x:1,256,256,3" +atc --model=mmnet.pb --framework=3 --output=mmnet --soc_version=Ascend310B1 --insert_op_conf=mmnet.aippconf --input_shape="input_x:1,256,256,3" ``` - +此命令适用于310B1硬件,使用310时指定soc_version=Ascend310 执行完模型转换脚本后,若提示如下信息说明模型转换成功,会在output参数指定的路径下生成mmnet.om模型文件。 ```python diff --git a/contrib/PedestrianAttributeRecognition/README.md b/contrib/PedestrianAttributeRecognition/README.md index f1d6619ec..3c9ea409a 100644 --- a/contrib/PedestrianAttributeRecognition/README.md +++ b/contrib/PedestrianAttributeRecognition/README.md @@ -9,9 +9,10 @@ ### 1.2 支持的版本 -支持的SDK版本为2.0.4.b011。 - -MindX SDK安装前准备可参考《用户指南》,[安装教程](https://gitee.com/ascend/mindxsdk-referenceapps/blob/master/docs/quickStart/1-1安装SDK开发套件.md) +| 软件名称 | 版本 | +| -------- | ------ | +| MindX SDK | 5.0RC1 | +| CANN | 310使用6.3.RC1
    310B使用6.2.RC1 | ### 1.3 软件方案介绍 @@ -78,7 +79,6 @@ MindX SDK安装前准备可参考《用户指南》,[安装教程](https://git | 软件名称 | 版本 | | ----------- | ------ | | python | 3.9.2 | -| mxVision | 2.0.4 | | pillow | 8.0.1 | | pickle5 | 0.0.11 | @@ -88,15 +88,10 @@ MindX SDK安装前准备可参考《用户指南》,[安装教程](https://git 在编译运行项目前,需要设置环境变量: -- 环境变量介绍 -将${SDK安装路径}替换为自己的SDK安装路径; -```python -export MX_SDK_HOME=${SDK安装路径}/mxVision -export install_path=/usr/local/Ascend/ascend-toolkit/latest -export PATH=/usr/local/python3.9.2/bin:${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATH -export PYTHONPATH=${install_path}/atc/python/site-packages:${install_path}/atc/python/site-packages/auto_tune.egg/auto_tune:${install_path}/atc/python/site-packages/schedule_search.egg:$PYTHONPATH -export LD_LIBRARY_PATH=${install_path}/atc/lib64:$LD_LIBRARY_PATH -export ASCEND_OPP_PATH=${install_path}/opp +将${SDK_INSTALL_PATH}替换为自己的SDK安装路径; +```shell +. /usr/local/Ascend/ascend-toolkit/set_env.sh #toolkit默认安装路径,根据实际安装路径修改 +. ${SDK_INSTALL_PATH}/mxVision/set_env.sh ``` ## 3 模型转换 @@ -105,9 +100,10 @@ export ASCEND_OPP_PATH=${install_path}/opp 获取yolov3_tf.pb文件,将yolov3的pb文件下载到本地,并将其放在“/model/yolov3”路径下,在终端移至该路径下,执行下面命令:。 -```python -atc --model=./yolov3_tf.pb --framework=3 --output=./yolov3_tf_bs1_fp16 --soc_version=Ascend310 --insert_op_conf=./aipp_yolov3_416_416.aippconfig --input_shape="input:1,416,416,3" --out_nodes="yolov3/yolov3_head/Conv_6/BiasAdd:0;yolov3/yolov3_head/Conv_14/BiasAdd:0;yolov3/yolov3_head/Conv_22/BiasAdd:0" +```shell +atc --model=./yolov3_tf.pb --framework=3 --output=./yolov3_tf_bs1_fp16 --soc_version=Ascend310B1 --insert_op_conf=./aipp_yolov3_416_416.aippconfig --input_shape="input/input_data:1,416,416,3" --out_nodes="conv_lbbox/BiasAdd:0;conv_mbbox/BiasAdd:0;conv_sbbox/BiasAdd:0" ``` +此命令适用于310B1硬件,使用310时指定soc_version=Ascend310 更多的atc模型转换信息可以参考此链接样例:https://gitee.com/ascend/docs-openmind/blob/master/guide/mindx/sdk/tutorials/%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99.md deepmar模型,对于无aipp设置的离线模型的转换,只需将atc转换时的 --insert_op_conf参数删除即可。 @@ -157,14 +153,14 @@ aipp_op{ 下载好deepmar之后,将Deepmar_bs1.onnx文件拷贝到本样例的“model/deepmar”路径下,并在终端中移至该路径下,执行下面命令进行将onnx模型转om模型: ```python -atc --model=./Deepmar_bs1.onnx --framework=5 --output=./deepmar_bs1_aipp_1 --input_format=NCHW --input_shape="actual_input_1:1,3,224,224" --enable_small_channel=1 --log=error --soc_version=Ascend310 --insert_op_conf=aipp_deepmar.config +atc --model=./Deepmar_bs1.onnx --framework=5 --output=./deepmar_bs1_aipp_1 --input_format=NCHW --input_shape="actual_input_1:1,3,224,224" --enable_small_channel=1 --log=error --soc_version=Ascend310B1 --insert_op_conf=aipp_deepmar.config ``` 对于无aipp设置的离线模型,可执行下面命令得到: ```python -atc --model=./Deepmar_bs1.onnx --framework=5 --output=./deepmar_bs1_unaipp --input_format=NCHW --input_shape="actual_input_1:1,3,224,224" --enable_small_channel=1 --log=error --soc_version=Ascend310 +atc --model=./Deepmar_bs1.onnx --framework=5 --output=./deepmar_bs1_unaipp --input_format=NCHW --input_shape="actual_input_1:1,3,224,224" --enable_small_channel=1 --log=error --soc_version=Ascend310B1 ``` - +此命令适用于310B1硬件,使用310时指定soc_version=Ascend310 @@ -184,7 +180,7 @@ atc --model=./Deepmar_bs1.onnx --framework=5 --output=./deepmar_bs1_unaipp --inp 下载开源数据集Peta,[下载地址](https://mindx.sdk.obs.myhuaweicloud.com/mindxsdk-referenceapps%20/contrib/PedestrianAttributeRecognition/data.zip), -(1)将下载好的文件夹中”./dataset/peta/images/*.png“中的images文件夹放入样例代码中的dataset/image文件夹下;将PETA.mat文件放在样例代码的dataset文件夹下。 +(1)将下载好的文件夹中”./dataset/peta/images/*.png“中的images文件夹放入样例代码中的dataset/image文件夹下;将PETA.mat文件放在样例代码的dataset文件夹下,peta_dataset.pkl文件放在dataset目录下。 (2)将Peta数据集中的png格式图片转为jpg格式图片 @@ -204,7 +200,7 @@ python dataset/transform_peta.py (4)精度测试 -修改下面代码: +修改evaluate_for_deepmar.py下面的代码,LINE 39: ```python for idx in partition['test'][0]: diff --git a/contrib/PedestrianAttributeRecognition/pipeline/test.pipeline b/contrib/PedestrianAttributeRecognition/pipeline/test.pipeline index 49709b469..519f43ffb 100644 --- a/contrib/PedestrianAttributeRecognition/pipeline/test.pipeline +++ b/contrib/PedestrianAttributeRecognition/pipeline/test.pipeline @@ -1,7 +1,7 @@ { "detection": { "stream_config": { - "deviceId": "3" + "deviceId": "0" }, "appsrc0": { "props": { diff --git a/contrib/PixelLink/README.md b/contrib/PixelLink/README.md index 8ff9cb7dd..9d1a6c912 100644 --- a/contrib/PixelLink/README.md +++ b/contrib/PixelLink/README.md @@ -11,11 +11,10 @@ ### 1.2 支持的版本 -支持的SDK版本,列出版本号查询方式。 - -支持的SDK版本为2.0.4。 - -版本号查询方法,在Atlas产品环境下,运行命令:npu-smi info进行查看。 +| 软件名称 | 版本 | +| -------- | ------ | +| MindX SDK | 5.0RC1 | +| CANN | 310使用6.3.RC1
    310B使用6.2.RC1 | ### 1.3 软件方案介绍 @@ -65,9 +64,7 @@ | 软件名称 | 版本 | | -------- | ------ | | cmake | 3.5+ | -| mxVision | 2.0.4 | | python | 3.9.2 | -| CANN | 5.0.4 | | Polygon3 | 3.0.9.1| @@ -81,20 +78,13 @@ 在编译运行项目前,需要设置环境变量: 步骤1:安装mxVision SDK。 -步骤2:配置mxVision SDK环境变量、lib库环境变量以及python环境变量。 +步骤2:配置mxVision SDK环境变量 +将${SDK_INSTALL_PATH}替换为自己的SDK安装路径; +```shell +. /usr/local/Ascend/ascend-toolkit/set_env.sh #toolkit默认安装路径,根据实际安装路径修改 +. ${SDK_INSTALL_PATH}/mxVision/set_env.sh ``` -export MX_SDK_HOME=${安装路径}/mxVision -export LD_LIBRARY_PATH="${MX_SDK_HOME}/lib:${MX_SDK_HOME}/opensource/lib:${LD_LIBRARY_PATH}" -export PYTHONPATH="${MX_SDK_HOME}/python:${PYTHONPATH}" -export GST_PLUGIN_SCANNER="${MX_SDK_HOME}/opensource/libexec/gstreamer-1.0/gst-plugin-scanner" -export GST_PLUGIN_PATH="${MX_SDK_HOME}/opensource/lib/gstreamer-1.0:${MX_SDK_HOME}/lib/plugins" -``` - -- 环境变量介绍 -- MX_SDK_HOME为SDK安装路径 -- LD_LIBRARY_PATH为lib库路径 -- PYTHONPATH为python环境路径 ## 3 模型转换 @@ -107,10 +97,10 @@ pb模型提供在链接:https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/min 首先需要配置ATC环境,下载pb模型,放到相应的路径后,修改模型转换的cfg配置文件,配置文件已经上传至项目目录model下。使用命令 ``` -atc --model=pixellink_tf.pb --framework=3 --output=pixellink --output_type=FP32 --soc_version=Ascend310 --input_shape="Placeholder:1,768,1280,3" +atc --model=pixellink_tf.pb --framework=3 --output=pixellink --output_type=FP32 --soc_version=Ascend310B1 --input_shape="Placeholder:1,768,1280,3" --insert_op_conf=convert.cfg --log=info ``` -转化项目模型。 +此命令适用于310B1硬件,使用310时指定soc_version=Ascend310 注意:转化时,可根据需要修改输出的模型名称。注意模型以及转化所需文件的路径,防止atc命令找不到相关文件。 -- Gitee From 843301cd7c99ecc309c9ac8d23ce0ca823f72980 Mon Sep 17 00:00:00 2001 From: xuegangxiao Date: Mon, 3 Apr 2023 14:35:08 +0800 Subject: [PATCH 49/61] =?UTF-8?q?=E5=9B=BE=E5=83=8F=E7=9B=AE=E6=A0=87?= =?UTF-8?q?=E6=A3=80=E6=B5=8Bdoc=E4=BB=A5=E5=8F=8Atutorial=20310B=E9=80=82?= =?UTF-8?q?=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\265\213sample\346\240\267\344\276\213.md" | 26 +++++-------------- tutorials/ImageDetectionSample/cpp/README.md | 20 +++++--------- .../ImageDetectionSample/python/README.md | 9 ++++--- .../python/models/model_conversion.sh | 13 +++------- 4 files changed, 21 insertions(+), 47 deletions(-) diff --git "a/docs/quickStart/2-1\345\233\276\345\203\217\346\243\200\346\265\213sample\346\240\267\344\276\213.md" "b/docs/quickStart/2-1\345\233\276\345\203\217\346\243\200\346\265\213sample\346\240\267\344\276\213.md" index 19c363400..75c228cd9 100644 --- "a/docs/quickStart/2-1\345\233\276\345\203\217\346\243\200\346\265\213sample\346\240\267\344\276\213.md" +++ "b/docs/quickStart/2-1\345\233\276\345\203\217\346\243\200\346\265\213sample\346\240\267\344\276\213.md" @@ -3,7 +3,7 @@ ## 2.1.1 样例介绍 提供了一个图像检测sample样例,实现对本地图片进行YOLOv3目标检测,并把可视化结果保存到本地。 -[样例获取](https://gitee.com/ascend/mindxsdk-referenceapps/tree/master/tutorials/ImageDetectionSample) +[样例获取](https://gitee.com/ascend/mindxsdk-referenceapps/tree/310B/tutorials/ImageDetectionSample) ## 2.1.2 运行前准备 参考[IDE开发环境搭建](./1-2IDE开发环境搭建.md)章节搭建好项目运行环境。 @@ -87,26 +87,14 @@ python pipeline在脚本main.py内部,其中模型路径和工程中model文 ![image.png](img/1623835106290.png 'image.png') ## 2.3 yolov3模型转换脚本 以下为yolov3模型转换脚本示例,使用时请确认参数中的路径是实际的相关路径。 -``` -#!/bin/bash - -# 该脚本用来将pb模型文件转换成.om模型文件 -# This is used to convert pb model file to .om model file. - - -# 设置环境变量(请确认install_path路径是否正确) -# Set environment PATH (Please confirm that the install_path is correct). - -export install_path=/usr/local/Ascend/ascend-toolkit/latest -export PATH=/usr/local/python3.9.2/bin:${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATH -export PYTHONPATH=${install_path}/atc/python/site-packages:${install_path}/atc/python/site-packages/auto_tune.egg/auto_tune:${install_path}/atc/python/site-packages/schedule_search.egg -export LD_LIBRARY_PATH=${install_path}/atc/lib64:$LD_LIBRARY_PATH -export ASCEND_OPP_PATH=${install_path}/opp +设置环境变量(请确认ascend_toolkit_path路径是否正确) +``` +. ${ascend_toolkit_path}/set_env.sh +``` -# 执行,转换YOLOv3模型 -# Execute, transform YOLOv3 model. - +执行atc命令,转换YOLOv3模型 +``` atc --model=./yolov3_tf.pb --framework=3 --output=./yolov3_tf_bs1_fp16 --soc_version=Ascend310 --insert_op_conf=./aipp_yolov3_416_416.aippconfig --input_shape="input:1,416,416,3" --out_nodes="yolov3/yolov3_head/Conv_6/BiasAdd:0;yolov3/yolov3_head/Conv_14/BiasAdd:0;yolov3/yolov3_head/Conv_22/BiasAdd:0" # 说明:out_nodes制定了输出节点的顺序,需要与模型后处理适配。 ``` diff --git a/tutorials/ImageDetectionSample/cpp/README.md b/tutorials/ImageDetectionSample/cpp/README.md index b4095637d..92bae9573 100644 --- a/tutorials/ImageDetectionSample/cpp/README.md +++ b/tutorials/ImageDetectionSample/cpp/README.md @@ -12,29 +12,21 @@ **步骤1** 在ModelZoo上下载YOLOv3模型。[下载地址](https://www.hiascend.com/zh/software/modelzoo/detail/1/ba2a4c054a094ef595da288ecbc7d7b4) -**步骤2** 将获取到的YOLOv3模型pb文件存放至:"样例项目所在目录/model/"。 +**步骤2** 将获取到的YOLOv3模型pb文件和coco.names存放至拷贝到model目录下。 **步骤3** 模型转换 - -在pb文件所在目录下执行一下命令 +设置环境变量(请确认ascend_toolkit_path路径是否正确) ``` -# 设置环境变量(请确认install_path路径是否正确) -# Set environment PATH (Please confirm that the install_path is correct). - -```c -. /usr/local/Ascend/ascend-toolkit/set_env.sh # Ascend-cann-toolkit开发套件包默认安装路径,请根据实际安装路径修改。 - +. ${ascend_toolkit_path}/set_env.sh ``` -# 执行,转换YOLOv3模型 -# Execute, transform YOLOv3 model. - +执行atc命令,转换YOLOv3模型 +``` atc --model=./yolov3_tf.pb --framework=3 --output=./yolov3_tf_bs1_fp16 --soc_version=Ascend310 --insert_op_conf=./aipp_yolov3_416_416.aippconfig --input_shape="input:1,416,416,3" --out_nodes="yolov3/yolov3_head/Conv_6/BiasAdd:0;yolov3/yolov3_head/Conv_14/BiasAdd:0;yolov3/yolov3_head/Conv_22/BiasAdd:0" # 说明1:out_nodes制定了输出节点的顺序,需要与模型后处理适配。 # 说明2:若用例执行在310B上,则--soc_version=Ascend310需修改为Ascend310B1 - ``` 执行完模型转换脚本后,会生成相应的.om模型文件。 执行完模型转换脚本后,会生成相应的.om模型文件。 @@ -125,7 +117,7 @@ Scanning dependencies of target sample ``` ### 执行脚本 - +准备一张待检测图片,放到项目目录下命名为test.jpg 执行run.sh脚本前请先确认可执行文件sample已生成,并给脚本添加可执行权限。 ``` diff --git a/tutorials/ImageDetectionSample/python/README.md b/tutorials/ImageDetectionSample/python/README.md index 357cbd240..6e1babcb6 100644 --- a/tutorials/ImageDetectionSample/python/README.md +++ b/tutorials/ImageDetectionSample/python/README.md @@ -20,12 +20,13 @@ bash model_conversion.sh 将main.py 文件中 mxpi_objectpostprocessor0插件中的postProcessLibPath路径中的${SDK安装路径} 替换为自己的SDK安装路径 ### 配置环境变量 -将${SDK安装路径}替换为自己的SDK安装路径; 将${MX_SDK_HOME}替换成对应路径 - ``` -export MX_SDK_HOME=${SDK安装路径}/mxVision +. ${ascend_toolkit_path}/set_env.sh +. ${SDK-path}/set_env.sh -export LD_LIBRARY_PATH=${MX_SDK_HOME}/lib:${MX_SDK_HOME}/opensource/lib:${MX_SDK_HOME}/opensource/lib64 +# 环境变量介绍 +SDK-path: SDK mxVision 安装路径 +ascend-toolkit-path: CANN 安装路径 ``` ### 运行 diff --git a/tutorials/ImageDetectionSample/python/models/model_conversion.sh b/tutorials/ImageDetectionSample/python/models/model_conversion.sh index deb96e420..176cc1430 100644 --- a/tutorials/ImageDetectionSample/python/models/model_conversion.sh +++ b/tutorials/ImageDetectionSample/python/models/model_conversion.sh @@ -19,18 +19,11 @@ # This is used to convert pb model file to .om model file. -# 设置环境变量(请确认install_path路径是否正确) -# Set environment PATH (Please confirm that the install_path is correct). - -export install_path=/usr/local/Ascend/ascend-toolkit/latest -export PATH=/usr/local/python3.9.2/bin:${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATH -export PYTHONPATH=${install_path}/atc/python/site-packages:${install_path}/atc/python/site-packages/auto_tune.egg/auto_tune:${install_path}/atc/python/site-packages/schedule_search.egg -export LD_LIBRARY_PATH=${install_path}/atc/lib64:$LD_LIBRARY_PATH -export ASCEND_OPP_PATH=${install_path}/opp - +source ${ascend_toolkit_path}/set_env.sh # 执行,转换YOLOv3模型 # Execute, transform YOLOv3 model. atc --model=./yolov3_tf.pb --framework=3 --output=./yolov3_tf_bs1_fp16 --soc_version=Ascend310 --insert_op_conf=./aipp_yolov3_416_416.aippconfig --input_shape="input:1,416,416,3" --out_nodes="yolov3/yolov3_head/Conv_6/BiasAdd:0;yolov3/yolov3_head/Conv_14/BiasAdd:0;yolov3/yolov3_head/Conv_22/BiasAdd:0" -# 说明:out_nodes制定了输出节点的顺序,需要与模型后处理适配。 \ No newline at end of file +# 说明1:out_nodes制定了输出节点的顺序,需要与模型后处理适配。 +# 说明2:若用例执行在310B上,则--soc_version=Ascend310需修改为Ascend310B1 \ No newline at end of file -- Gitee From e9f7c97f19c7a0344896e2eb3601c2254a41a8d2 Mon Sep 17 00:00:00 2001 From: xuegangxiao Date: Mon, 3 Apr 2023 14:44:51 +0800 Subject: [PATCH 50/61] =?UTF-8?q?=E8=A7=86=E9=A2=91=E8=BD=AC=E7=A0=81310B?= =?UTF-8?q?=E9=80=82=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mxVision/MediaCodec/Ascend310/README.zh.md | 3 ++- mxVision/MediaCodec/Ascend310/pipeline/test.pipeline | 4 +--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/mxVision/MediaCodec/Ascend310/README.zh.md b/mxVision/MediaCodec/Ascend310/README.zh.md index bd9d3656a..95f6b25aa 100644 --- a/mxVision/MediaCodec/Ascend310/README.zh.md +++ b/mxVision/MediaCodec/Ascend310/README.zh.md @@ -25,7 +25,8 @@ | 软件名称 | 版本 | | -------- | ------ | | cmake | 3.5.1+ | -| mxVision | 0.2 | + +支持的SDK版本为 5.0.RC1, CANN 版本为 6.0.RC1。 ## 3.预准备 diff --git a/mxVision/MediaCodec/Ascend310/pipeline/test.pipeline b/mxVision/MediaCodec/Ascend310/pipeline/test.pipeline index a2e139f3a..cfb0c762e 100644 --- a/mxVision/MediaCodec/Ascend310/pipeline/test.pipeline +++ b/mxVision/MediaCodec/Ascend310/pipeline/test.pipeline @@ -28,7 +28,6 @@ "deviceId": "xxx", "vdecChannelId": "xxx" }, - "former": "mxpi_rtspsrcxxx", "next": "queue1" }, @@ -83,8 +82,7 @@ }, "fakesinkxxx": { - "factory": "fakesink", - "former": "mxpi_videoencoderxxx" + "factory": "fakesink" } } } \ No newline at end of file -- Gitee From 42367d4b6fc12ab25e48c49a9a2facbfb0027d84 Mon Sep 17 00:00:00 2001 From: xuegangxiao Date: Mon, 3 Apr 2023 15:51:29 +0800 Subject: [PATCH 51/61] =?UTF-8?q?=E5=A4=9A=E7=BA=BF=E7=A8=8B=E8=B0=83?= =?UTF-8?q?=E7=94=A8310B=E9=80=82=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mxVision/MultiThread/C++/README.zh.md | 10 ++++++++++ mxVision/MultiThread/python/README.zh.md | 16 +++++++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/mxVision/MultiThread/C++/README.zh.md b/mxVision/MultiThread/C++/README.zh.md index bf748e800..246fbfc09 100644 --- a/mxVision/MultiThread/C++/README.zh.md +++ b/mxVision/MultiThread/C++/README.zh.md @@ -55,6 +55,16 @@ sed -i 's/\r$//' ./*.sh chmod +x ./*.sh ``` +### 3.4 模型转换 +yolov3模型下载参考华为昇腾社区[ModelZoo](https://www.hiascend.com/zh/software/modelzoo/detail/1/ba2a4c054a094ef595da288ecbc7d7b4) +使用以下命令进行转换,请注意aipp配置文件名,此处使用的为自带sample中的相关文件({Mind_SDK安装路径}/mxVision/samples/mxVision/models/yolov3/) + +``` +atc --model=./yolov3_tf.pb --framework=3 --output=./yolov3_tf_bs1_fp16 --soc_version=Ascend310 --insert_op_conf=./aipp_yolov3_416_416.aippconfig --input_shape="input:1,416,416,3" --out_nodes="yolov3/yolov3_head/Conv_6/BiasAdd:0;yolov3/yolov3_head/Conv_14/BiasAdd:0;yolov3/yolov3_head/Conv_22/BiasAdd:0" + +# 说明:若用例执行在310B上,则--soc_version=Ascend310需修改为Ascend310B1 +``` + ## 4.编译 - 配置环境变量 diff --git a/mxVision/MultiThread/python/README.zh.md b/mxVision/MultiThread/python/README.zh.md index baee4c318..b49b5c55e 100644 --- a/mxVision/MultiThread/python/README.zh.md +++ b/mxVision/MultiThread/python/README.zh.md @@ -20,10 +20,12 @@ | 软件名称 | 版本 | | -------- | ------ | | cmake | 3.5.1+ | -| mxVision | 0.2 | | Python | 3.9.2 | | opencv-python | 3.4+ | | mmcv | - | + +支持的SDK版本为 5.0.RC1, CANN 版本为 6.0.RC1。 + ## 3.预准备 脚本转换为unix格式以及添加脚本执行权限 @@ -39,6 +41,18 @@ chmod +x ./*.sh export MX_SDK_HOME=${安装路径}/mxVision ``` +## 4 模型转换 + +yolov3模型下载参考华为昇腾社区[ModelZoo](https://www.hiascend.com/zh/software/modelzoo/detail/1/ba2a4c054a094ef595da288ecbc7d7b4) +使用以下命令进行转换,请注意aipp配置文件名,此处使用的为自带sample中的相关文件({Mind_SDK安装路径}/mxVision/samples/mxVision/models/yolov3/) + +``` +atc --model=./yolov3_tf.pb --framework=3 --output=./yolov3_tf_bs1_fp16 --soc_version=Ascend310 --insert_op_conf=./aipp_yolov3_416_416.aippconfig --input_shape="input:1,416,416,3" --out_nodes="yolov3/yolov3_head/Conv_6/BiasAdd:0;yolov3/yolov3_head/Conv_14/BiasAdd:0;yolov3/yolov3_head/Conv_22/BiasAdd:0" + +# 说明:若用例执行在310B上,则--soc_version=Ascend310需修改为Ascend310B1 +``` + + ## 5.运行 ### 5.1 运行前配置 -- Gitee From da62ac3ecba552b41a1a8d0f5b6a59a83fe666a5 Mon Sep 17 00:00:00 2001 From: xuegangxiao Date: Mon, 3 Apr 2023 17:03:58 +0800 Subject: [PATCH 52/61] =?UTF-8?q?Retinaface310B=E9=80=82=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contrib/Retinaface/README.md | 10 +++++----- contrib/Retinaface/model/run.sh | 3 ++- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/contrib/Retinaface/README.md b/contrib/Retinaface/README.md index 28a7c5d0c..b626bf73a 100644 --- a/contrib/Retinaface/README.md +++ b/contrib/Retinaface/README.md @@ -6,11 +6,11 @@ Retinaface基于MindX_SDK开发,在昇腾芯片上进行目标检测,并实 ### 1.1 支持的产品 -本产品以昇腾310(推理)卡为硬件平台。 +本项目以昇腾Atlas310、Atlas310B卡为主要硬件平台。 ### 1.2 支持的版本 -该项目支持的SDK版本为2.0.4,CANN版本为5.0.4。 +支持的SDK版本为 5.0.RC1, CANN 版本为 6.0.RC1。 ### 1.3 软件方案介绍 @@ -77,9 +77,9 @@ Retinaface基于MindX_SDK开发,在昇腾芯片上进行目标检测,并实 | 软件名称 | 版本 | 说明 | 获取方式 | | ------------------- | ----- | ----------------------------- | :-------------------------------------------------------- | -| MindX SDK | 2.0.4 | mxVision软件包 | [链接](https://www.hiascend.com/software/Mindx-sdk) | +| MindX SDK | 5.0.RC1 | mxVision软件包 | [链接](https://www.hiascend.com/software/Mindx-sdk) | | ubuntu | 18.04 | 操作系统 | 请上ubuntu官网获取 | -| Ascend-CANN-toolkit | 5.0.4 | Ascend-cann-toolkit开发套件包 | [链接](https://www.hiascend.com/software/cann/commercial) | +| Ascend-CANN-toolkit | 6.0.RC1 | Ascend-cann-toolkit开发套件包 | [链接](https://www.hiascend.com/software/cann/commercial) | @@ -165,7 +165,7 @@ git clone https://github.com/biubug6/Pytorch_Retinaface.git 模型转换步骤如下: 1、`cd`到`model`文件夹,运行 - +若用例执行在310B上,则--soc_version=Ascend310需修改为Ascend310B1 ```` bash run.sh ```` diff --git a/contrib/Retinaface/model/run.sh b/contrib/Retinaface/model/run.sh index 16fddd791..bf257c73c 100644 --- a/contrib/Retinaface/model/run.sh +++ b/contrib/Retinaface/model/run.sh @@ -5,4 +5,5 @@ # Execute, transform Retinaface model. atc --framework=5 --model=retinaface.onnx --output=newRetinaface --input_format=NCHW --input_shape="image:1,3,1000,1000" --log=debug --soc_version=Ascend310 --insert_op_conf=../config/aipp.cfg -# 说明:out_nodes制定了输出节点的顺序,需要与模型后处理适配。 +# 说明1:out_nodes制定了输出节点的顺序,需要与模型后处理适配。 +# 说明2:若用例执行在310B上,则--soc_version=Ascend310需修改为Ascend310B1 \ No newline at end of file -- Gitee From 2b357a77ffc4884f16402df07cfef9eb4c4f772a Mon Sep 17 00:00:00 2001 From: xuegangxiao Date: Mon, 3 Apr 2023 17:19:35 +0800 Subject: [PATCH 53/61] =?UTF-8?q?Pipeline=E8=BE=93=E5=85=A5=E8=BE=93?= =?UTF-8?q?=E5=87=BA=E6=A0=B7=E4=BE=8B310B=E9=80=82=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tutorials/PipelineInputOutputSample/C++/README.md | 13 +++---------- .../PipelineInputOutputSample/python/README.md | 8 ++++---- tutorials/PipelineInputOutputSample/python/main.py | 2 +- 3 files changed, 8 insertions(+), 15 deletions(-) diff --git a/tutorials/PipelineInputOutputSample/C++/README.md b/tutorials/PipelineInputOutputSample/C++/README.md index b6362a95e..83979132b 100644 --- a/tutorials/PipelineInputOutputSample/C++/README.md +++ b/tutorials/PipelineInputOutputSample/C++/README.md @@ -8,19 +8,12 @@ 将项目目录从mindxsdk-referenceapps\tutorials\PipelineInputOutputSample\C++移动到运行样例的目录下 -### 配置SDK路径 -配置CMakeLists.txt 中的'MX_SDK_HOME'环境变量,配置为MindX SDK的安装路径; ${SDK安装路径}替换为用户环境SDK安装路径。 -set(MX_SDK_HOME /usr/local/Ascend/mxVision) -/usr/local/Ascend/mxVision 需要替换为自己的SDK安装路径 - -``` -set(MX_SDK_HOME ${SDK安装路径}/mxVision) -``` ### 配置环境变量 执行以下命令: ``` -. ${MX_SDK_HOME}/set_env.sh # ${MX_SDK_HOME}替换为用户的SDK安装路径 +. ${MX_SDK_HOME}/set_env.sh +# ${MX_SDK_HOME}替换为用户的SDK安装路径 ``` ### 编译运行 @@ -31,7 +24,7 @@ set(MX_SDK_HOME ${SDK安装路径}/mxVision) 返回上级目录 cd .. -执行 ./sample 或者执行 ./sample 参数 +执行 ./IOsample 或者执行 ./IOsample 参数 其中参数为 0,1,2 参数对应的调用插件可以参考快速指导 ### 查看结果 diff --git a/tutorials/PipelineInputOutputSample/python/README.md b/tutorials/PipelineInputOutputSample/python/README.md index 368aa00b7..619f22478 100644 --- a/tutorials/PipelineInputOutputSample/python/README.md +++ b/tutorials/PipelineInputOutputSample/python/README.md @@ -12,14 +12,14 @@ 进入到移动后的工程路径下 ### 配置环境变量 -将${SDK安装路径}替换为自己的SDK安装路径; 将${MX_SDK_HOME}替换成对应路径 +执行以下命令: ``` -export MX_SDK_HOME=${SDK安装路径}/mxVision - -export LD_LIBRARY_PATH=${MX_SDK_HOME}/lib:${MX_SDK_HOME}/opensource/lib:${MX_SDK_HOME}/opensource/lib64 +. ${MX_SDK_HOME}/set_env.sh +# ${MX_SDK_HOME}替换为用户的SDK安装路径 ``` + ### 运行 python3 main.py 参数 diff --git a/tutorials/PipelineInputOutputSample/python/main.py b/tutorials/PipelineInputOutputSample/python/main.py index 050bd0cf1..3d7f71e96 100644 --- a/tutorials/PipelineInputOutputSample/python/main.py +++ b/tutorials/PipelineInputOutputSample/python/main.py @@ -147,7 +147,7 @@ if __name__ == '__main__': infer_result.errorCode, infer_result.data.decode())) exit() # 打印推理结果 - print("result1: {}".format(infer_result.data.decode())) + print("result: {}".format(infer_result.data.decode())) elif INTERFACE_TYPE == 2: # 执行SendData - GetResult 样例 -- Gitee From 79b8a141269a0e94931dccc21b0f9085075802d4 Mon Sep 17 00:00:00 2001 From: dailinrui <602182685@qq.com> Date: Mon, 3 Apr 2023 09:35:47 +0000 Subject: [PATCH 54/61] =?UTF-8?q?!337=20310B=E9=80=82=E9=85=8D=20*=20no=20?= =?UTF-8?q?message=20*=20no=20message=20*=20no=20message=20*=20310B?= =?UTF-8?q?=E9=80=82=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contrib/ErfnetSegmentation/README.md | 29 ++++++++------ contrib/ErfnetSegmentation/model/onnx2om.sh | 2 +- .../plugin/postprocess/Postprocess.cpp | 4 +- contrib/GestureKeypointDetection/README.md | 2 +- contrib/PersonCount/README.md | 2 +- contrib/PortraitSegmentation/README.md | 2 +- contrib/SentimentAnalysis/README.md | 2 +- contrib/SuperResolution/README.md | 2 +- contrib/SuperRetina/README.md | 40 +++++++------------ contrib/SuperRetina/onnx2om.sh | 2 +- contrib/VCOD_SLTNet/README.md | 25 ++++++------ contrib/VideoGestureRecognition/README.md | 2 +- contrib/msame/README.md | 2 +- ...03\350\257\225\346\214\207\345\257\274.md" | 1 + ...13\345\220\216\345\244\204\347\220\206.md" | 4 +- .../InferOfflineVideo/regular/README.zh.md | 15 +++++-- .../models/aipp_yolov3_416_416.aippconfig | 25 ++++++++++++ .../regular/models/yolov3_tf_bs1_fp16.cfg | 10 +++++ .../regular/pipeline/regular.pipeline | 6 +-- 19 files changed, 106 insertions(+), 71 deletions(-) create mode 100644 mxVision/InferOfflineVideo/regular/models/aipp_yolov3_416_416.aippconfig create mode 100644 mxVision/InferOfflineVideo/regular/models/yolov3_tf_bs1_fp16.cfg diff --git a/contrib/ErfnetSegmentation/README.md b/contrib/ErfnetSegmentation/README.md index fe57f9545..00c3ab9e3 100644 --- a/contrib/ErfnetSegmentation/README.md +++ b/contrib/ErfnetSegmentation/README.md @@ -8,13 +8,15 @@ ErfNet是一个语义分割网络,ERFNet可以看作是对ResNet结构的又 ### 1.1 支持的产品 -Ascend 310 +Ascend 310B ### 1.2 支持的版本 -CANN:5.0.4(通过cat /usr/local/Ascend/ascend-toolkit/latest/acllib/version.info,获取版本信息) - -SDK:2.0.4(可通过cat SDK目录下的version.info查看信息) +| 软件名称 | 版本 | +| -------- | ------ | +| python | 3.9.2 | +| MindX SDK | 5.0RC1 | +| CANN | 310使用6.3.RC1
    310B使用6.2.RC1 | ### 1.3 代码目录结构与说明 @@ -54,24 +56,27 @@ ErfNet原论文使用街景图片来进行语义分割任务的测试,ErfNet ## 2 环境依赖 -推荐系统为ubuntu 18.04,环境依赖软件和版本如下表: +推荐系统为ubuntu 18.04 | 软件名称 | 版本 | 说明 | 获取方式 | -| ------------------- | ----------- | ----------------------------- | ------------------------------------------------------------ | -| MindX SDK | 2.0.4 | mxVision软件包 | [链接](https://gitee.com/link?target=https%3A%2F%2Fwww.hiascend.com%2Fsoftware%2FMindx-sdk) | -| ubuntu | 18.04.1 LTS | 操作系统 | Ubuntu官网获取 | -| Ascend-CANN-toolkit | 5.0.4 | Ascend-cann-toolkit开发套件包 | [链接](https://gitee.com/link?target=https%3A%2F%2Fwww.hiascend.com%2Fsoftware%2Fcann%2Fcommercial) | -| python | 3.9.2 | | | +| ------------------- | ----------- | ----------------------------- | ------------------------------------------------------------ | numpy | 1.22.4 | 维度数组运算依赖库 | 服务器中使用pip或conda安装 | | PIL | 9.0.1 | 图像处理依赖库 | 服务器中使用pip或conda安装 | | opencv-python | 4.6.0 | 图像处理依赖库 | 服务器中使用pip或conda安装 | | pyquaternion | | |服务器中使用pip或conda安装 | +> 配置环境变量。 + +``` +. /usr/local/Ascend/ascend-toolkit/set_env.sh #toolkit默认安装路径,根据实际安装路径修改 +. ${SDK_INSTALL_PATH}/mxVision/set_env.sh +``` + ## 3 准备 ### 3.1 获取OM模型文件 -OM权重文件获取参考华为昇腾社区[ModelZoo](https://www.hiascend.com/zh/software/modelzoo/models/detail/1/a552b9d78220425f9a59f0ffdb083dfa)。 +OM权重文件获取参考华为昇腾社区[ModelZoo](https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/contrib/ErfnetSegementation/ATC%20ErfNet%28FP16%29%20from%20Pytorch%20-%20Ascend310.zip)。 获取到```ErfNet.onnx```模型后,将其放在model目录下。在model目录键入以下命令 ``` @@ -80,7 +85,7 @@ bash onnx2om.sh 能获得```ErfNet_bs1.om```模型文件。 -注: [ModelZoo](https://www.hiascend.com/zh/software/modelzoo/models/detail/1/a552b9d78220425f9a59f0ffdb083dfa) +注: [ModelZoo](https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/contrib/ErfnetSegementation/ATC%20ErfNet%28FP16%29%20from%20Pytorch%20-%20Ascend310.zip) 中的模型文件```ErfNet_bs1.om```不能用于本项目。 ### 3.2 编译插件 diff --git a/contrib/ErfnetSegmentation/model/onnx2om.sh b/contrib/ErfnetSegmentation/model/onnx2om.sh index 693764943..597b7168f 100644 --- a/contrib/ErfnetSegmentation/model/onnx2om.sh +++ b/contrib/ErfnetSegmentation/model/onnx2om.sh @@ -1,7 +1,7 @@ #! /bin/bash atc --model=ErfNet.onnx --output=./ErfNet_bs1 --framework=5 \ --input_shape="actual_input_1:1,3,512,1024" \ - --soc_version=Ascend310 \ + --soc_version=Ascend310B1 \ --input_format=NCHW \ --output_type=FP32 \ --insert_op_conf=./erfnet.aippconfig \ No newline at end of file diff --git a/contrib/ErfnetSegmentation/plugin/postprocess/Postprocess.cpp b/contrib/ErfnetSegmentation/plugin/postprocess/Postprocess.cpp index 03d296645..eb2e4fde1 100644 --- a/contrib/ErfnetSegmentation/plugin/postprocess/Postprocess.cpp +++ b/contrib/ErfnetSegmentation/plugin/postprocess/Postprocess.cpp @@ -180,9 +180,7 @@ APP_ERROR MxpiPostProcess::Init(std::map>& co { LogInfo << "MxpiPostProcess::Init start."; APP_ERROR ret = APP_ERR_OK; - // Get the property values by key 插件对应的属性值将通过“configParamMap”入参传入,可通过属性名称获取。 - std::shared_ptr parentNamePropSptr = std::static_pointer_cast(configParamMap["dataSource"]); - parentName_ = *parentNamePropSptr.get(); + parentName_ = dataSource_; this->index = 0; return APP_ERR_OK; } diff --git a/contrib/GestureKeypointDetection/README.md b/contrib/GestureKeypointDetection/README.md index 6c469511e..db9b97a1d 100644 --- a/contrib/GestureKeypointDetection/README.md +++ b/contrib/GestureKeypointDetection/README.md @@ -14,7 +14,7 @@ ### 1.2 支持的版本 -推荐系统为ubantu 18.04。 +推荐系统为ubuntu 18.04。 | 软件名称 | 版本 | | -------- | ------ | diff --git a/contrib/PersonCount/README.md b/contrib/PersonCount/README.md index 2d778b840..7d3a59b5e 100644 --- a/contrib/PersonCount/README.md +++ b/contrib/PersonCount/README.md @@ -19,7 +19,7 @@ ### 1.2 支持的版本 -推荐系统为ubantu 18.04。 +推荐系统为ubuntu 18.04。 | 软件名称 | 版本 | | -------- | ------ | diff --git a/contrib/PortraitSegmentation/README.md b/contrib/PortraitSegmentation/README.md index c55321fc4..e31a0e880 100644 --- a/contrib/PortraitSegmentation/README.md +++ b/contrib/PortraitSegmentation/README.md @@ -19,7 +19,7 @@ ## 3 依赖 -推荐系统为ubantu 18.04。 +推荐系统为ubuntu 18.04。 | 软件名称 | 版本 | | -------- | ------ | diff --git a/contrib/SentimentAnalysis/README.md b/contrib/SentimentAnalysis/README.md index cc038e6f5..b47c1cd0b 100644 --- a/contrib/SentimentAnalysis/README.md +++ b/contrib/SentimentAnalysis/README.md @@ -11,7 +11,7 @@ ### 1.2 支持的版本 -推荐系统为ubantu 18.04。 +推荐系统为ubuntu 18.04。 | 软件名称 | 版本 | | -------- | ------ | diff --git a/contrib/SuperResolution/README.md b/contrib/SuperResolution/README.md index 422cda7e5..c7cfbfc69 100644 --- a/contrib/SuperResolution/README.md +++ b/contrib/SuperResolution/README.md @@ -15,7 +15,7 @@ ### 软件版本 -推荐系统为ubantu 18.04。 +推荐系统为ubuntu 18.04。 | 软件名称 | 版本 | | -------- | ------ | diff --git a/contrib/SuperRetina/README.md b/contrib/SuperRetina/README.md index e3aa27607..92b36c6b9 100644 --- a/contrib/SuperRetina/README.md +++ b/contrib/SuperRetina/README.md @@ -6,13 +6,15 @@ ### 1.1 支持的产品 -本项目以昇腾Atlas310卡为主要的硬件平台。 +本项目以昇腾Atlas310B卡为主要的硬件平台。 ### 1.2 支持的版本 -本样例配套的CANN版本为[5.0.4](https://gitee.com/link?target=https%3A%2F%2Fwww.hiascend.com%2Fsoftware%2Fcann%2Fcommercial),MindX SDK版本为[2.0.4](https://gitee.com/link?target=https%3A%2F%2Fwww.hiascend.com%2Fsoftware%2FMindx-sdk)。 - -MindX SDK安装前准备可参考[《用户指南》](https://gitee.com/ascend/mindxsdk-referenceapps/blob/master/docs/quickStart/1-1安装SDK开发套件.md)。 +| 软件名称 | 版本 | +| -------- | ------ | +| python | 3.9.2 | +| MindX SDK | 5.0RC1 | +| CANN | 310使用6.3.RC1
    310B使用6.2.RC1 | ### 1.3 软件方案介绍 @@ -64,34 +66,20 @@ MindX SDK安装前准备可参考[《用户指南》](https://gitee.com/ascend/m 环境依赖软件和版本如下表: -| 软件 | 版本 | 说明 | -| ------------------- | ------------------------------------------------------------ | ----------------------------- | -| mxVision | [mxVision 3.0.RC2](https://gitee.com/link?target=https%3A%2F%2Fwww.hiascend.com%2Fsoftware%2FMindx-sdk) | mxVision软件包 | -| Ascend-CANN-toolkit | [CANN 5.1.RC2](https://gitee.com/link?target=https%3A%2F%2Fwww.hiascend.com%2Fsoftware%2Fcann%2Fcommercial) | Ascend-cann-toolkit开发套件包 | -| 操作系统 | [Ubuntu 18.04](https://gitee.com/link?target=https%3A%2F%2Fubuntu.com%2F) | Linux操作系统 | -| OpenCV | 4.6.0 | 用于结果可视化 | +| 软件 | 版本 | +| --------| ----------| +|Pytorch | 1.7.0| +| OpenCV | 4.6.0 | 在编译运行项目前,需要设置环境变量: 在进行模型转换和编译运行前,需设置如下的环境变量: ```bash -export PYTHONPATH=${MX_SDK_HOME}/python/:$PYTHONPATH -export install_path=${install_path} -. ${MX_SDK_HOME}/set_env.sh -. ${install_path}/set_env.sh +. /usr/local/Ascend/ascend-toolkit/set_env.sh #toolkit默认安装路径,根据实际安装路径修改 +. ${SDK_INSTALL_PATH}/mxVision/set_env.sh ``` -注:**${MX_SDK_HOME}** 替换为用户自己的MindX_SDK安装路径(例如:"/home/xxx/MindX_SDK/mxVision"); - - **${install_path}** 替换为开发套件包所在路径(例如:/usr/local/Ascend/ascend-toolkit/latest)。 - -*版本要求:* - -*Python = 3.9.2 - -*Pytorch = 1.7.0* - ### 3. 模型转换 模型转换使用的是ATC工具,具体使用教程可参考[《ATC工具使用指南》](https://gitee.com/ascend/docs-openmind/blob/master/guide/mindx/sdk/tutorials/%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99.md)。 @@ -139,8 +127,8 @@ bash onnx2om.sh ./SuperRetina.onnx ./SuperRetina **步骤4** 在./python目录下运行predictor.py,首先按需求修改路径: ```bash - f1 = './data/samples/query.jpg' # image path - f2 = './data/samples/refer.jpg' # image path + F1 = './data/samples/query.jpg' # image path + F2 = './data/samples/refer.jpg' # image path merged = align_image_pair(f1, f2, model, show=True) ``` diff --git a/contrib/SuperRetina/onnx2om.sh b/contrib/SuperRetina/onnx2om.sh index 827ea4da1..4afee26a8 100644 --- a/contrib/SuperRetina/onnx2om.sh +++ b/contrib/SuperRetina/onnx2om.sh @@ -30,5 +30,5 @@ echo "Output OM file path: ${om_path}" atc --framework=5 --model="${onnx_path}" \ --output="${om_path}" \ - --soc_version=Ascend310 \ + --soc_version=Ascend310B1 \ --output_type="FP32" diff --git a/contrib/VCOD_SLTNet/README.md b/contrib/VCOD_SLTNet/README.md index 9bf7f6114..985f62752 100644 --- a/contrib/VCOD_SLTNet/README.md +++ b/contrib/VCOD_SLTNet/README.md @@ -7,18 +7,16 @@ ### 1.1 支持的产品 -支持昇腾310芯片 +支持昇腾310B芯片 ### 1.2 支持的版本 -支持的SDK版本:SDK3.0 RC2 - -版本号查询方法,在Atlas产品环境下,运行命令: - -``` -npu-smi info -``` +| 软件名称 | 版本 | +| -------- | ------ | +| python | 3.9.2 | +| MindX SDK | 5.0RC1 | +| CANN | 310使用6.3.RC1
    310B使用6.2.RC1 | ### 1.3 软件方案介绍 @@ -73,9 +71,6 @@ npu-smi info | 软件名称 | 版本 | | -------- | ------ | -| MindX SDK | mxVision-3.0.RC2 | -| Python | 3.9.2 | -| CANN | 5.1RC2 | | PyTorch | 1.12.1 | | numpy | 1.21.5 | | imageio | 2.22.3| @@ -84,6 +79,12 @@ npu-smi info | timm | 0.4.12 | | tqdm | 4.64.1 | +> 配置环境变量 + +``` +. /usr/local/Ascend/ascend-toolkit/set_env.sh #toolkit默认安装路径,根据实际安装路径修改 +. ${SDK_INSTALL_PATH}/mxVision/set_env.sh +``` ## 3. 数据准备 @@ -209,7 +210,7 @@ python -m onnxsim --input-shape="1,9,352,352" --dynamic-input-shape sltnet.onnx 步骤三、onnx模型转om模型 ``` -atc --framework=5 --model=sltnet.onnx --output=sltnet --input_shape="image:1,9,352,352" --soc_version=Ascend310 --log=error +atc --framework=5 --model=sltnet.onnx --output=sltnet --input_shape="image:1,9,352,352" --soc_version=Ascend310B1 --log=error ``` 注意: diff --git a/contrib/VideoGestureRecognition/README.md b/contrib/VideoGestureRecognition/README.md index a05505eb1..2c7226a87 100644 --- a/contrib/VideoGestureRecognition/README.md +++ b/contrib/VideoGestureRecognition/README.md @@ -46,7 +46,7 @@ ### 依赖 -推荐系统为ubantu 18.04。 +推荐系统为ubuntu 18.04。 | 软件名称 | 版本 | | -------- | ------ | diff --git a/contrib/msame/README.md b/contrib/msame/README.md index a69d10ff0..db4d3d7b6 100644 --- a/contrib/msame/README.md +++ b/contrib/msame/README.md @@ -9,7 +9,7 @@ ### 1.2 支持的版本 -推荐系统为ubantu 18.04。 +推荐系统为ubuntu 18.04。 | 软件名称 | 版本 | | -------- | ------ | diff --git "a/docs/quickStart/4-1\346\217\222\344\273\266\345\274\200\345\217\221\350\260\203\350\257\225\346\214\207\345\257\274.md" "b/docs/quickStart/4-1\346\217\222\344\273\266\345\274\200\345\217\221\350\260\203\350\257\225\346\214\207\345\257\274.md" index d7bb9a70a..a062aa080 100644 --- "a/docs/quickStart/4-1\346\217\222\344\273\266\345\274\200\345\217\221\350\260\203\350\257\225\346\214\207\345\257\274.md" +++ "b/docs/quickStart/4-1\346\217\222\344\273\266\345\274\200\345\217\221\350\260\203\350\257\225\346\214\207\345\257\274.md" @@ -58,6 +58,7 @@ add_subdirectory(./mindx_sdk_plugin) ![image.png](img/1623401675765.png 'image.png') 成功后生成so文件`/mindx_sdk_plugin/lib/plugins/libmxpi_sampleplugin.so`,也可通过IDE操作下载到本地方便查看 +> 生成的插件需自己手动在服务器上修改权限为440,避免运行失败 ![image.png](img/1623401832093.png 'image.png') 目录结构为 ![image.png](img/1623401950254.png 'image.png') diff --git "a/docs/quickStart/4-4\346\250\241\345\236\213Tensor\346\225\260\346\215\256\345\244\204\347\220\206&\350\207\252\345\256\232\344\271\211\346\250\241\345\236\213\345\220\216\345\244\204\347\220\206.md" "b/docs/quickStart/4-4\346\250\241\345\236\213Tensor\346\225\260\346\215\256\345\244\204\347\220\206&\350\207\252\345\256\232\344\271\211\346\250\241\345\236\213\345\220\216\345\244\204\347\220\206.md" index aaa1117e1..13e8da68c 100644 --- "a/docs/quickStart/4-4\346\250\241\345\236\213Tensor\346\225\260\346\215\256\345\244\204\347\220\206&\350\207\252\345\256\232\344\271\211\346\250\241\345\236\213\345\220\216\345\244\204\347\220\206.md" +++ "b/docs/quickStart/4-4\346\250\241\345\236\213Tensor\346\225\260\346\215\256\345\244\204\347\220\206&\350\207\252\345\256\232\344\271\211\346\250\241\345\236\213\345\220\216\345\244\204\347\220\206.md" @@ -96,8 +96,8 @@ enum TensorDataType { ``` ## 样例说明 参考[4-1插件开发调试指导](4-1插件开发调试指导.md)部署自定义插件样例,示例使用[samplePluginPostProc](../../tutorials/samplePluginPostProc/)作为工程名,远程目录名同样为samplePluginPostProc。 -- 更改mxVision/C++/main.cpp中94行所使用的pipeline为样例中的SamplePluginPost.pipeline -- 更改mxVision/python/main.py中32行使用的pipeline为样例中的SamplePluginPost.pipeline +- 更改mxVision/C++/main.cpp中所使用的pipeline为样例中的SamplePluginPost.pipeline +- 更改mxVision/python/main.py中使用的pipeline为样例中的SamplePluginPost.pipeline - 相比4-1样例中的SamplePlugin.pipeline,本样例中pipeline使用新后处理框架下的模型推理插件mxpi_tensorinfer输出原始Tensor至自定义插件并完成后处理示例。 >该文件位于样例根目录,但代码中实际指向mxVision/pipeline文件夹下,这是为了与使用原有Sample.pipeline的样例统一目录。实际使用时复制pipeline文件或更改代码中的路径均可 diff --git a/mxVision/InferOfflineVideo/regular/README.zh.md b/mxVision/InferOfflineVideo/regular/README.zh.md index bf556b940..8cf18dd89 100644 --- a/mxVision/InferOfflineVideo/regular/README.zh.md +++ b/mxVision/InferOfflineVideo/regular/README.zh.md @@ -4,7 +4,7 @@ ## 1 简介 -InferOfflineVideo基于mxVision SDK开发的参考用例,以昇腾Atlas300卡为主要的硬件平台,用于在视频流中检测出目标。 +InferOfflineVideo基于mxVision SDK开发的参考用例,以昇腾Atlas310B卡为主要的硬件平台,用于在视频流中检测出目标。 ## 2 环境依赖 @@ -36,10 +36,15 @@ InferOfflineVideo基于mxVision SDK开发的参考用例,以昇腾Atlas300卡 . ${SDK_INSTALL_PATH}/mxVision/set_env.sh ``` -**步骤3:** 在regular目录下创建目录models `mkdir models`, 根据《mxVision 用户指南》中“模型支持列表”章节获取Yolov3种类模型,并放到该目录下。 - -`若在310B设备上运行该案例,模型转换命令 --soc_version 修改为310B1` +**步骤3:** 转换模型 +进入models目录,下载YOLOv3模型。[下载地址](https://www.hiascend.com/zh/software/modelzoo/detail/1/ba2a4c054a094ef595da288ecbc7d7b4), 将下载的模型放入models文件夹中 +执行转换命令 +``` +atc --model=./yolov3_tf.pb --framework=3 --output=./yolov3_tf_bs1_fp16 --soc_version=Ascend310B1 --insert_op_conf=./aipp_yolov3_416_416.aippconfig --input_shape="input:1,416,416,3" --out_nodes="yolov3/yolov3_head/Conv_6/BiasAdd:0;yolov3/yolov3_head/Conv_14/BiasAdd:0;yolov3/yolov3_head/Conv_22/BiasAdd:0" +# 说明:out_nodes制定了输出节点的顺序,需要与模型后处理适配。 +``` +执行完模型转换脚本后,会生成相应的.om模型文件。 **步骤4:** 修改regular/pipeline/regular.pipeline文件: @@ -51,6 +56,8 @@ InferOfflineVideo基于mxVision SDK开发的参考用例,以昇腾Atlas300卡 ## 4 运行 +下载coco.names文件[链接](https://gitee.com/ascend/mindxsdk-referenceapps/blob/master/contrib/Collision/model/coco.names), 放在models目录下。 + 运行 `bash run.sh` diff --git a/mxVision/InferOfflineVideo/regular/models/aipp_yolov3_416_416.aippconfig b/mxVision/InferOfflineVideo/regular/models/aipp_yolov3_416_416.aippconfig new file mode 100644 index 000000000..94efa1fdc --- /dev/null +++ b/mxVision/InferOfflineVideo/regular/models/aipp_yolov3_416_416.aippconfig @@ -0,0 +1,25 @@ +aipp_op { +aipp_mode : static +related_input_rank : 0 +input_format : YUV420SP_U8 +src_image_size_w : 416 +src_image_size_h : 416 +crop : false +csc_switch : true +rbuv_swap_switch : false +matrix_r0c0 : 256 +matrix_r0c1 : 0 +matrix_r0c2 : 359 +matrix_r1c0 : 256 +matrix_r1c1 : -88 +matrix_r1c2 : -183 +matrix_r2c0 : 256 +matrix_r2c1 : 454 +matrix_r2c2 : 0 +input_bias_0 : 0 +input_bias_1 : 128 +input_bias_2 : 128 +var_reci_chn_0 : 0.0039216 +var_reci_chn_1 : 0.0039216 +var_reci_chn_2 : 0.0039216 +} diff --git a/mxVision/InferOfflineVideo/regular/models/yolov3_tf_bs1_fp16.cfg b/mxVision/InferOfflineVideo/regular/models/yolov3_tf_bs1_fp16.cfg new file mode 100644 index 000000000..e7da9ec45 --- /dev/null +++ b/mxVision/InferOfflineVideo/regular/models/yolov3_tf_bs1_fp16.cfg @@ -0,0 +1,10 @@ +CLASS_NUM=80 +BIASES_NUM=18 +BIASES=10,13,16,30,33,23,30,61,62,45,59,119,116,90,156,198,373,326 +SCORE_THRESH=0.3 +OBJECTNESS_THRESH=0.3 +IOU_THRESH=0.45 +YOLO_TYPE=3 +ANCHOR_DIM=3 +MODEL_TYPE=0 +RESIZE_FLAG=0 diff --git a/mxVision/InferOfflineVideo/regular/pipeline/regular.pipeline b/mxVision/InferOfflineVideo/regular/pipeline/regular.pipeline index 5c50515f0..f17c80396 100644 --- a/mxVision/InferOfflineVideo/regular/pipeline/regular.pipeline +++ b/mxVision/InferOfflineVideo/regular/pipeline/regular.pipeline @@ -34,9 +34,9 @@ "mxpi_modelinfer0": { "props": { "dataSource": "mxpi_imageresize0", - "modelPath": "./models/yolov3/yolov3_tf_bs1_fp16.om", - "postProcessConfigPath": "./models/yolov3/yolov3_tf_bs1_fp16.cfg", - "labelPath": "./models/yolov3/coco.names", + "modelPath": "./models/yolov3_tf_bs1_fp16.om", + "postProcessConfigPath": "./models/yolov3_tf_bs1_fp16.cfg", + "labelPath": "./models/coco.names", "postProcessLibPath": "libMpYOLOv3PostProcessor.so", "deviceId": "0" }, -- Gitee From b2de7fe9a036a2fab8e6fe5e6848fc8f4f4cd3a2 Mon Sep 17 00:00:00 2001 From: zhangdingwen Date: Mon, 3 Apr 2023 17:53:36 +0800 Subject: [PATCH 55/61] =?UTF-8?q?=E9=A3=8E=E6=A0=BC=E8=BD=AC=E6=8D=A2?= =?UTF-8?q?=E9=80=82=E9=85=8D310B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contrib/StyleTransfer/README.md | 36 ++++++++++++--------------------- 1 file changed, 13 insertions(+), 23 deletions(-) diff --git a/contrib/StyleTransfer/README.md b/contrib/StyleTransfer/README.md index 8e6cb414c..3918ec231 100644 --- a/contrib/StyleTransfer/README.md +++ b/contrib/StyleTransfer/README.md @@ -26,15 +26,12 @@ ### 支持的产品以及环境依赖 -支持 Atlas 200dk开发者套件、Ascend 310推理芯片。 - -``` -| 软件名称 | 版本 | -| :-----------: | :---------: | -| ubuntu | 18.04.5 LTS | -| MindX SDK | 2.0.4 | +推荐系统为ubantu 18.04,环境依赖软件和版本如下表: +| 软件名称 | 版本 | +| -------- | ------ | +| MindX SDK | 5.0RC1 | +| CANN | 310使用6.3.RC1
    310B使用6.2.RC1 | | Python | 3.9.2 | -| CANN | 5.0.4 | | numpy | 1.22.3 | | opencv-python | 4.5.5 | ``` @@ -90,12 +87,8 @@ StyleTransfer ### python第三方库 ``` -numpy == 1.16.6 - Pillow == 8.2.0 -opencv-python == 4.5.2 - sympy == 1.4 decorator == 4.4.2 @@ -113,21 +106,18 @@ PyYAML == 5.4.1 **步骤1** 将pth模型转换为onnx模型 -首先在ModelZoo下载CycleGAN模型。 +下载CycleGAN模型相关文件。 -下载地址:https://www.hiascend.com/zh/software/modelzoo/detail/1/3ba3b04fd4964d9b81974381b73f491d +下载地址:https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/contrib/StyleTransfer/ATC%20CycleGAN%20%28FP16%29%20from%20Pytorch%20-%20Ascend310.zip 模型获取解压后,将CycleGAN文件夹下的所有文件及文件夹全部都放在StyleTransfer/models文件夹中 **步骤2** 设置环境变量 -运行MindXSDK与ascend-toolkit下的set_env.sh设置环境变量 -MindXSDK:${MX_SDK_HOME}/set_env.sh - -ascend-toolkit:/usr/local/Ascend/ascend-toolkit/set_env.sh -``` -bash set_env.sh - +将${SDK_INSTALL_PATH}替换为自己的SDK安装路径; +```shell +. /usr/local/Ascend/ascend-toolkit/set_env.sh #toolkit默认安装路径,根据实际安装路径修改 +. ${SDK_INSTALL_PATH}/mxVision/set_env.sh ``` **步骤3** 将原始pth模型转化为onnx模型 @@ -175,9 +165,9 @@ aipp_op{ 仍然在/models目录中操作 ``` -atc --framework=5 --model=./onnxmodel/model_Ga.onnx --output=sat2map --input_format=NCHW --input_shape="img_sat_maps:1,3,256,256" --out_nodes="maps" --log=debug --soc_version=Ascend310 --insert_op_conf=aipp_CycleGAN_pth.config +atc --framework=5 --model=./onnxmodel/model_Ga.onnx --output=sat2map --input_format=NCHW --input_shape="img_sat_maps:1,3,256,256" --out_nodes="maps" --log=debug --soc_version=Ascend310B1 --insert_op_conf=aipp_CycleGAN_pth.config ``` - +此命令适用于310B1硬件,使用310时指定soc_version=Ascend310 转换完成后存放在/models中。 **步骤6** 下载测试集 -- Gitee From 3fd9bc6f3bfdd14d79632d2dcd2581213056d032 Mon Sep 17 00:00:00 2001 From: bling728 Date: Tue, 4 Apr 2023 01:36:58 +0000 Subject: [PATCH 56/61] =?UTF-8?q?!341=20=E9=80=82=E9=85=8D310B=20*=20Modif?= =?UTF-8?q?y.=20*=20Modify.=20*=20Modify.=20*=20Modify.=20*=20Modify.=20*?= =?UTF-8?q?=20Modify=20the=20STGCN.=20*=20Modify=20the=20STGCN.=20*=20Modi?= =?UTF-8?q?fy=20the=20CamouflagedObjectDetection.=20*=20Modify=20the=20fac?= =?UTF-8?q?eswap.=20*=20Modify=20the=20PoseEsNet.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contrib/CamouflagedObjectDetection/README.md | 9 +++-- contrib/FaceBoxes/README.md | 24 ++++-------- .../plugin/FaceBoxesPostProcess/build.sh | 1 + contrib/FireDetection/README.md | 13 ++----- contrib/FireDetection/envs/env.sh | 17 -------- contrib/PicoDet/README.md | 13 ++++--- contrib/PoseEstNet/README.md | 14 +++---- contrib/STGCN/README.md | 8 ++-- contrib/faceswap/README.md | 39 +++++-------------- 9 files changed, 43 insertions(+), 95 deletions(-) delete mode 100644 contrib/FireDetection/envs/env.sh diff --git a/contrib/CamouflagedObjectDetection/README.md b/contrib/CamouflagedObjectDetection/README.md index a5a99f56a..958590283 100644 --- a/contrib/CamouflagedObjectDetection/README.md +++ b/contrib/CamouflagedObjectDetection/README.md @@ -20,7 +20,7 @@ ### 1.3 实现流程 -- 基础环境:Ascend 310、mxVision、Ascend-CANN-toolkit、Ascend Driver +- 基础环境:Ascend 310 / Ascend 310B、mxVision、Ascend-CANN-toolkit、Ascend Driver - 模型转换:将ONNX模型(.onnx)转换为昇腾离线模型(.om) - 昇腾离线模型推理流程代码开发 @@ -78,9 +78,9 @@ | 软件名称 | 版本 | | :-----------: | :---------: | | ubantu | 18.04.1 LTS | -| MindX SDK | 2.0.4 | +| MindX SDK | 5.0.RC1 | | Python | 3.9.2 | -| CANN | 5.0.4 | +| CANN | 310使用6.3.RC1,310B使用6.2.RC1 | | numpy | 1.21.2 | | opencv-python | 4.5.3.56 | | mindspore (cpu) | 1.9.0 | @@ -112,7 +112,8 @@ ascend-toolkit-path: CANN 安装路径 ```bash # 进入对应目录 cd ./snapshots/DGNet/ -# 执行以下命令将ONNX模型(.onnx)转换为昇腾离线模型(.om) +# 执行以下命令将ONNX模型(.onnx)转换为昇腾离线模型(.om),注意若推理芯片为310B,需将命令中的soc_version参数设置为Ascend310B1。 + atc --framework=5 --model=DGNet.onnx --output=DGNet --input_shape="image:1,3,352,352" --log=debug --soc_version=Ascend310 ``` diff --git a/contrib/FaceBoxes/README.md b/contrib/FaceBoxes/README.md index 6a13cbd41..49ca5398d 100644 --- a/contrib/FaceBoxes/README.md +++ b/contrib/FaceBoxes/README.md @@ -2,7 +2,7 @@ ## 1 介绍 -本开发项目演示Faceboxes模型实现目标检测。本系统基于mxVision SDK进行开发,以昇腾Atlas300卡为主要的硬件平台,主要应用于在CPU上实现实时的目标检测,检测图像中的场景中目标不能被遮挡严重且亮度过低,并且不能有与目标形态相似的动物出现。项目的主要流程为: +本开发项目演示Faceboxes模型实现目标检测。本系统基于mxVision SDK进行开发,以昇腾Atlas300卡、昇腾Atlas310B卡为主要的硬件平台,主要应用于在CPU上实现实时的目标检测,检测图像中的场景中目标不能被遮挡严重且亮度过低,并且不能有与目标形态相似的动物出现。项目的主要流程为: 1.环境搭建; 2.模型转换; @@ -27,10 +27,10 @@ | 软件名称 | 版本 | | -------- | ----- | | cmake | 3.5.+ | - | mxVision | 2.0.4 | + | mxVision | 5.0.RC1 | | Python | 3.9.2 | | Pytorch | 1.9.0 | - | CANN | 5.0.4 | + | CANN | 310使用6.3.RC1,310B使用6.2.RC1 | | OpenCV | 4.5.3 | | gcc | 7.5.0 | | ffmpeg | 3.4.8 | @@ -196,19 +196,12 @@ git clone https://github.com/zisianw/FaceBoxes.PyTorch.git ### 6.2 onnx转om模型 -1.设置环境变量 +1.执行如下两个环境配置脚本设置环境变量,运行命令: ``` -export install_path=/usr/local/Ascend/ascend-toolkit/latest - -export PATH=/usr/local/python3.9.2/bin:${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATH - -export PYTHONPATH=${install_path}/atc/python/site-packages:$PYTHONPATH - -export LD_LIBRARY_PATH=${install_path}/atc/lib64:${install_path}/acllib/lib64:$LD_LIBRARY_PATH - -export ASCEND_OPP_PATH=${install_path}/opp +. /usr/local/Ascend/ascend-toolkit/set_env.sh # Ascend-cann-toolkit开发套件包默认安装路径,根据实际安装路径修改 +. ${MX_SDK_HOME}/mxVision/set_env.sh # ${MX_SDK_HOME}替换为用户的SDK安装路径 ``` -2.在models目录下,使用atc将onnx模型转换为om模型文件,加入--insert_op_conf参数使用AIPP,放到models目录下,工具使用方法可以参考CANN 5.0.2 开发辅助工具指南 (推理) 01 +2.在models目录下,使用atc将onnx模型转换为om模型文件,加入--insert_op_conf参数使用AIPP,放到models目录下,工具使用方法可以参考CANN 5.0.2 开发辅助工具指南 (推理) 。注意若推理芯片为310B,需将模型转换atc命令中的soc_version参数设置为Ascend310B1。 ``` atc --framework=5 --model=faceboxes-b0_bs1.onnx --output=faceboxes-b0_bs1 --input_format=NCHW --input_shape="image:1,3,1024,1024" --log=debug --soc_version=Ascend310 --insert_op_conf=../config/FaceBoxes.aippconfig @@ -220,10 +213,9 @@ atc --framework=5 --model=faceboxes-b0_bs1.onnx --output=faceboxes-b0_bs1 --inpu export MX_SDK_HOME=${CUR_PATH}/../../.. ## 注意当前目录CUR_PATH与MX_SDK_HOME环境目录的相对位置 ``` -直接运行 +为run.sh添加可执行权限,直接运行 ```bash -chmod +x run.sh bash run.sh ``` diff --git a/contrib/FaceBoxes/plugin/FaceBoxesPostProcess/build.sh b/contrib/FaceBoxes/plugin/FaceBoxesPostProcess/build.sh index 006f86ba8..ac161d690 100644 --- a/contrib/FaceBoxes/plugin/FaceBoxesPostProcess/build.sh +++ b/contrib/FaceBoxes/plugin/FaceBoxesPostProcess/build.sh @@ -28,6 +28,7 @@ function build_plugin() { cd "$build_path" cmake .. make -j + make install cd .. exit 0 } diff --git a/contrib/FireDetection/README.md b/contrib/FireDetection/README.md index 4bcce8cfa..aefdd7bab 100644 --- a/contrib/FireDetection/README.md +++ b/contrib/FireDetection/README.md @@ -1,3 +1,4 @@ + # 高速公路车辆火灾识别 ## 1 介绍 @@ -23,8 +24,6 @@ MindX SDK 安装前准备可参考《用户指南》,[安装教程](https://gi 本 Sample 工程名称为 **FireDetection**,工程目录如下图所示: ``` -├── envs -│   └── env.sh //基础环境变量 ├── images //ReadMe图片资源 │   └── image-flow.png ├── model @@ -58,18 +57,12 @@ MindX SDK 安装前准备可参考《用户指南》,[安装教程](https://gi | ubuntu | 18.04.1 LTS | 操作系统 | Ubuntu官网获取 | | Ascend-CANN-toolkit | 310使用6.3.RC1,310B使用6.2.RC1 | Ascend-cann-toolkit开发套件包 | [链接](https://gitee.com/link?target=https%3A%2F%2Fwww.hiascend.com%2Fsoftware%2Fcann%2Fcommercial) | -在运行项目需要的环境变量如下,运行前不需要特别设置,环境依赖已经写入脚本中,脚本在`FireDetection/envs`目录下: +在运行项目需要执行如下命令配置MindX SDK的环境变量: ```bash -# 基础环境变量——env.sh -export MX_SDK_HOME="${SDK安装路径}/mxVision" -export LD_LIBRARY_PATH="${MX_SDK_HOME}/lib:${MX_SDK_HOME}/opensource/lib:${LD_LIBRARY_PATH}" -export PYTHONPATH="${MX_SDK_HOME}/python:${PYTHONPATH}" - +. ${MX_SDK_HOME}/mxVision/set_env.sh # ${MX_SDK_HOME}替换为用户的SDK安装路径 ``` -注:其中`${SDK安装路径}`替换为用户的SDK安装路径;`install_path`替换为ascend-toolkit开发套件包所在路径。`LD_LIBRARY_PATH`用以加载开发套件包中lib库。 - ## 3 模型转换以及依赖安装 本项目使用的模型是火灾识别的模型。模型文件可以直接下载。 diff --git a/contrib/FireDetection/envs/env.sh b/contrib/FireDetection/envs/env.sh deleted file mode 100644 index c5b583f7a..000000000 --- a/contrib/FireDetection/envs/env.sh +++ /dev/null @@ -1,17 +0,0 @@ -# Copyright(C) 2021. Huawei Technologies Co.,Ltd. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -export MX_SDK_HOME="${SDK安装路径}/mxVision" -export LD_LIBRARY_PATH="${MX_SDK_HOME}/lib:${MX_SDK_HOME}/opensource/lib:${LD_LIBRARY_PATH}" -export PYTHONPATH="${MX_SDK_HOME}/python:${PYTHONPATH}" diff --git a/contrib/PicoDet/README.md b/contrib/PicoDet/README.md index 491d2f06a..4948494c3 100644 --- a/contrib/PicoDet/README.md +++ b/contrib/PicoDet/README.md @@ -5,11 +5,11 @@ ### 1.1 支持的产品 -支持昇腾310芯片 +支持昇腾310芯片、昇腾310B芯片 ### 1.2 支持的版本 -支持的SDK版本为2.0.4。 +支持的SDK版本为5.0.RC1。 eg:版本号查询方法,在Atlas产品环境下,运行命令: @@ -73,8 +73,8 @@ npu-smi info | 软件名称 | 版本 | | -------------- | ----- | -| ascend-toolkit | 5.0.4 | -| mxVision | 2.0.4 | +| ascend-toolkit | 310使用6.3.RC1,310B使用6.2.RC1 | +| mxVision | 5.0.RC1 | | python | 3.9.2 | 在编译运行项目前,需要设置环境变量: @@ -92,7 +92,8 @@ npu-smi info ### 3.2 模型转换 -将下载好的onnx模型放入models目录下,执行转换命令: +将下载好的onnx模型放入models目录下,执行转换命令,注意若推理芯片为310B,需如下命令中的soc_version参数设置为Ascend310B1。 +: ``` atc --model=picodet_s_320_coco.onnx --output=picodet --output_type=FP32 --soc_version=Ascend310 --input_shape="image:1,3,320,320" --insert_op_conf=picodet.aippconfig --input_format=NCHW --framework=5 @@ -109,7 +110,7 @@ bash build.sh 下载文件[coco2014.names](../Collision/model/coco.names),将下载的标签文件放入models目录中并修改文件名为**coco.names** -**步骤3** 执行推理 +**步骤3** 执行推理。注意推理图片文件夹和结果保存文件夹需要手动创建,同时,picodet.pipeline文件第4行的deviceId需根据实际使用的芯片Id进行修改。 ``` python3.9 main.py ${推理图片文件夹} ${结果保存文件夹} diff --git a/contrib/PoseEstNet/README.md b/contrib/PoseEstNet/README.md index 6a9db44e3..a336a5d77 100644 --- a/contrib/PoseEstNet/README.md +++ b/contrib/PoseEstNet/README.md @@ -49,8 +49,8 @@ PoseEstNet | 软件名称 | 版本 | | :--------: | :------: | |cmake | 3.5+ | -|mxVision | 2.0.4 | -|CANN | 5.0.4 | +|mxVision | 5.0.RC | +|CANN | 310使用6.3.RC1,310B使用6.2.RC1 | |Python | 3.9.12 | 注:MindX SDK使用python版本为3.9.12,如出现无法找到python对应lib库请在root下安装python3.9开发库 @@ -86,7 +86,7 @@ apt-get install libpython3.9 **步骤3** .om模型转换 以下操作均在“项目所在目录/models”路径下进行: -***1*** 使用ATC将.pb文件转成为.om文件 +***1*** 使用ATC将.pb文件转成为.om文件,注意若推理芯片为310B,需将模型转换atc命令中的soc_version参数设置为Ascend310B1。 ``` atc --model=yolov3_tensorflow_1.5.pb --framework=3 --output=yolov3 --output_type=FP32 --soc_version=Ascend310 --input_shape="input:1,416,416,3" --out_nodes="yolov3/yolov3_head/Conv_6/BiasAdd:0;yolov3/yolov3_head/Conv_14/BiasAdd:0;yolov3/yolov3_head/Conv_22/BiasAdd:0" --log=info --insert_op_conf=aipp_nv12.cfg ``` @@ -129,7 +129,7 @@ python3 tools/pth2onnx.py --cfg experiments/veri/hrnet/w32_256x256_adam_lr1e-3.y **步骤2** .onnx模型转.om模型 -***1*** 进入.onnx文件所在目录,使用ATC将.onnx文件转成为.om文件(aipp_hrnet_256_256.aippconfig在本项目models目录下,需要自行复制到转模型环境的目录,注意文件路径) +***1*** 进入.onnx文件所在目录,使用ATC将.onnx文件转成为.om文件(aipp_hrnet_256_256.aippconfig在本项目models目录下,需要自行复制到转模型环境的目录,注意文件路径),注意若推理芯片为310B,需将模型转换atc命令中的soc_version参数设置为Ascend310B1。 ``` atc --framework=5 --model=PoseEstNet.onnx --output=PoseEstNet --input_format=NCHW --input_shape="image:1,3,256,256" --insert_op_conf=aipp_hrnet_256_256.aippconfig --log=debug --soc_version=Ascend310 ``` @@ -185,10 +185,8 @@ ATC run success, welcome to the next use. ``` 步骤详见5: 数据集 ``` -### 7.4 安装插件编译所需要的NumCpp库 +### 7.4 安装插件编译所需要的NumCpp库,[Github官网链接](https://github.com/dpilger26/NumCpp),注意下载Version_2.8.0版本。下载后,进入plugins目录,将NumCpp解压至该目录。 ``` -cd plugins -git clone https://github.com/dpilger26/NumCpp mkdir include cp -r NumCpp/include/NumCpp ./include/ ``` @@ -224,7 +222,7 @@ PoseEstNet.pipeline: "factory": "mxpi_objectpostprocessor", "next": "mxpi_imagecrop0" }, - # 配置mxpi_tensorinfer插件的PoseEstNet.om模型加载路径(lines 68-75 以及 92-99) + # 配置mxpi_tensorinfer插件的PoseEstNet.om模型加载路径(lines 68-75) lines 68-75: "mxpi_tensorinfer2":{ "props": { diff --git a/contrib/STGCN/README.md b/contrib/STGCN/README.md index f723a090c..f393a79fe 100644 --- a/contrib/STGCN/README.md +++ b/contrib/STGCN/README.md @@ -13,7 +13,7 @@ SZ-Taxi数据集:https://github.com/lehaifeng/T-GCN/tree/master/data SZ-Taxi数据集包含深圳市的出租车动向,包括道路邻接矩阵和道路交通速度信息。 ### 1.1 支持的产品 -本项目以昇腾Atlas310卡为主要的硬件平台。 +本项目以昇腾Atlas310卡、昇腾310B卡为主要的硬件平台。 ### 1.2 软件方案介绍 @@ -55,9 +55,9 @@ eg:推荐系统为ubuntu 18.04,环境依赖软件和版本如下表: | 软件名称 | 版本 | | -------- | ------ | -| mxVision | 2.0.4 | +| mxVision | 5.0.RC1 | | Python | 3.9 | -| CANN | 5.1.RC1 | +| CANN | 310使用6.3.RC1,310B使用6.2.RC1 | - 环境变量介绍 在编译运行项目前,需要设置环境变量: @@ -136,7 +136,7 @@ https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/con ``` 2、onnx转化为om -根据实际路径修改convert_om.sh +根据实际路径修改convert_om.sh,注意若推理芯片为310B,需将convert_om.sh脚本中模型转换atc命令中的soc_version参数设置为Ascend310B1。 ``` bash convert_om.sh [model_path] stgcn10 参数说明: diff --git a/contrib/faceswap/README.md b/contrib/faceswap/README.md index 48d9774b3..31a77a22d 100644 --- a/contrib/faceswap/README.md +++ b/contrib/faceswap/README.md @@ -10,12 +10,12 @@ faceswap应用基于MindX SDK开发,在昇腾芯片上进行目标检测,脸 ``` ### 1.1 支持的产品 -本项目以昇腾Atlas310卡为主要的硬件平台。 +本项目以昇腾Atlas310、昇腾Atlas310B卡为主要的硬件平台。 ### 1.2 支持的版本 -本样例配套的CANN版本为[5.0.4](https://www.hiascend.com/software/cann/commercial) -支持的SDK版本为[2.0.4](https://www.hiascend.com/software/Mindx-sdk) +本样例配套的CANN版本为[昇腾Atlas310卡使用6.3.RC1,Atlas310B卡使用6.2.RC1](https://www.hiascend.com/software/cann/commercial) +支持的SDK版本为[5.0.RC1](https://www.hiascend.com/software/Mindx-sdk) MindX SDK安装前准备可参考《用户指南》,[安装教程](https://gitee.com/ascend/mindxsdk-referenceapps/blob/master/docs/quickStart/1-1安装SDK开发套件.md) ### 1.3 技术实现流程图
    本项目的主要工作流程为,初始输入目标图像和原图像,第一阶段采用yolov4模型进行目标检测,接着利用后处理插件、抠图插件对检测结果进行处理,得到目标区域部分; @@ -47,7 +47,7 @@ MindX SDK安装前准备可参考《用户指南》,[安装教程](https://git | 软件名称 | 版本 | | :--------: | :------: | |操作系统|18.04.1 | -|MindX SDK|2.0.4| +|MindX SDK|5.0.RC1| |Python| 3.9.2| |numpy | 1.21.0 | |opencv-python|4.5.2| @@ -69,13 +69,9 @@ MindX SDK安装前准备可参考《用户指南》,[安装教程](https://git # 设置环境变量(请确认install_path路径是否正确) # Set environment PATH (Please confirm that the install_path is correct). -export install_path=/usr/local/Ascend/ascend-toolkit/latest -export PATH=/usr/local/python3.9.2/bin:${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATH -export PYTHONPATH=${install_path}/atc/python/site-packages:${install_path}/atc/python/site-packages/auto_tune.egg/auto_tune:${install_path}/atc/python/site-packages/schedule_search.egg -export LD_LIBRARY_PATH=${install_path}/atc/lib64:$LD_LIBRARY_PATH -export ASCEND_OPP_PATH=${install_path}/opp +. /usr/local/Ascend/ascend-toolkit/set_env.sh # Ascend-cann-toolkit开发套件包默认安装路径,根据实际安装路径修改 -# 执行,转换v3.onnx模型 +# 执行如下命令,转换v3.onnx模型。注意若推理芯片为310B,需将命令中的soc_version参数设置为Ascend310B1。 # Execute, transform v3.onnx model. atc --model=v3.onnx --framework=5 --output=V3ONNXX --soc_version=Ascend310 --insert_op_conf=V3ONNX.cfg --out_nodes="Gemm_169:0" ``` @@ -94,26 +90,9 @@ ATC run success, welcome to the next use. ``` 2. 配置 ``` -#执行如下命令,打开.bashrc文件 -cd $home -vi .bashrc -#在.bashrc文件中添加以下环境变量: - -export MX_SDK_HOME=${SDK安装路径}/mxVision - -export LD_LIBRARY_PATH=${MX_SDK_HOME}/lib:${MX_SDK_HOME}/opensource/lib:${MX_SDK_HOME}/opensource/lib64:${MX_SDK_HOME}/opensource/lib64:/usr/local/Ascend/ascend-toolkit/latest/acllib/lib64:/usr/local/Ascend/driver/lib64/ - -export PYTHONPATH=${MX_SDK_HOME}/python - -export GST_PLUGIN_SCANNER=${MX_SDK_HOME}/opensource/libexec/gstreamer-1.0/gst-plugin-scanner - -export GST_PLUGIN_PATH=${MX_SDK_HOME}/opensource/lib/gstreamer-1.0:${MX_SDK_HOME}/lib/plugins - -#保存退出.bashrc -wq -#执行如下命令使环境变量生效 -source ~/.bashrc - +#执行如下两个环境配置脚本设置环境变量,运行命令: +. /usr/local/Ascend/ascend-toolkit/set_env.sh # Ascend-cann-toolkit开发套件包默认安装路径,根据实际安装路径修改 +. ${MX_SDK_HOME}/mxVision/set_env.sh # ${MX_SDK_HOME}替换为用户的SDK安装路径 ``` 3. 配置pipeline -- Gitee From 533b908826cf620c5df4ba7e681a06b28b7e8132 Mon Sep 17 00:00:00 2001 From: xuegangxiao Date: Tue, 4 Apr 2023 10:05:05 +0800 Subject: [PATCH 57/61] =?UTF-8?q?310B=E9=80=82=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contrib/CenterNet/README.md | 6 +++--- contrib/IAT/README.md | 7 +++---- tutorials/sampleCustomProto/Sample_proto.pipeline | 4 ++-- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/contrib/CenterNet/README.md b/contrib/CenterNet/README.md index 0db07c8ed..535e9b765 100644 --- a/contrib/CenterNet/README.md +++ b/contrib/CenterNet/README.md @@ -5,12 +5,12 @@ CenterNet 目标检测后处理插件基于 MindX SDK 开发,对图片中的 ### 1.1 支持的产品 -本项目以昇腾Atlas310卡为主要的硬件平台。 +本项目以昇腾Atlas310、Atlas310B卡为主要硬件平台。 ### 1.2 支持的版本 -支持的SDK版本为 2.0.4, CANN 版本为 5.0.4。 +支持的SDK版本为 5.0.RC1, CANN 版本为 6.0.RC1。 ### 1.3 软件方案介绍 @@ -106,7 +106,6 @@ CenterNet 的后处理插件接收模型推理插件输出的特征图。本项 | 软件名称 | 版本 | | -------- | ----- | | cmake | 3.5+ | -| mxVision | 2.0.4 | | python | 3.9.2 | 确保环境中正确安装mxVision SDK。 @@ -156,6 +155,7 @@ cp -r NumCpp/include/NumCpp ./include/ ``` atc --framework=5 --model=CenterNet.onnx --output=CenterNet_pre_post --input_format=NCHW --input_shape="actual_input:1,3,512,512" --out_nodes="Conv_949:0;Conv_952:0;Conv_955:0" --log=info --soc_version=Ascend310 --insert_op_conf=./aipp-configs/aipp_bgr.config ``` +(若用例执行在310B上,则--soc_version=Ascend310需修改为Ascend310B1) 若终端输出: ``` diff --git a/contrib/IAT/README.md b/contrib/IAT/README.md index efb46e807..15e05404a 100644 --- a/contrib/IAT/README.md +++ b/contrib/IAT/README.md @@ -5,7 +5,7 @@ ### 1.1 支持的产品 -支持昇腾310芯片 +本项目以昇腾Atlas310、Atlas310B卡为主要硬件平台。 ### 1.2 支持的版本 @@ -17,7 +17,6 @@ eg:版本号查询方法,在Atlas产品环境下,运行命令: npu-smi info ``` -版本号为Mind SDK 3.0RC3 ### 1.3 软件方案介绍 @@ -60,12 +59,11 @@ eg:推荐系统为ubuntu 18.04或centos 7.6,环境依赖软件和版本如 | 软件名称 | 版本 | | ------------- | ---------------- | | ubuntu | 18.04.1 LTS | -| MindX SDK | mxVision-3.0.RC3 | | Python | 3.9.2 | -| CANN | 5.1.RC2.alpha008 | | numpy | 1.22.3 | | opencv-python | 4.5.5 | | onnxsim | 0.4.10 | +支持的SDK版本为 5.0.RC1, CANN 版本为 6.0.RC1。 在编译运行项目前,需要设置环境变量: @@ -136,6 +134,7 @@ onnxsim IAT_lol.onnx IAT_lol-sim.onnx ``` atc --framework=5 --model=./IAT_lol-sim.onnx --input_shape="input_1:1,3,400,600" --output=IAT_lol-sim --soc_version=Ascend310 ``` +(若用例执行在310B上,则--soc_version=Ascend310需修改为Ascend310B1) **步骤4** (运行及输出结果) diff --git a/tutorials/sampleCustomProto/Sample_proto.pipeline b/tutorials/sampleCustomProto/Sample_proto.pipeline index 61b962303..d7d1076a3 100644 --- a/tutorials/sampleCustomProto/Sample_proto.pipeline +++ b/tutorials/sampleCustomProto/Sample_proto.pipeline @@ -15,7 +15,7 @@ "props": { "modelPath": "../models/yolov3/yolov3_tf_bs1_fp16.om", "postProcessConfigPath": "../models/yolov3/yolov3_tf_bs1_fp16.cfg", - "labelPath": "../models/yolov3/coco.names", + "labelPath": "../models/yolov3/yolov3.names", "postProcessLibPath": "libMpYOLOv3PostProcessor.so" }, "factory": "mxpi_modelinfer", @@ -33,7 +33,7 @@ "props": { "modelPath": "../models/resnet50/resnet50_aipp_tf.om", "postProcessConfigPath": "../models/resnet50/resnet50_aipp_tf.cfg", - "labelPath": "../models/resnet50/imagenet1000_clsidx_to_labels.names", + "labelPath": "../models/resnet50/resnet50_clsidx_to_labels.names", "postProcessLibPath": "libresnet50postprocessor.so" }, "factory": "mxpi_modelinfer", -- Gitee From 3a75dae8c8138b1bc0a2b3c21a2b3ad7b01e0a04 Mon Sep 17 00:00:00 2001 From: xuegangxiao Date: Tue, 4 Apr 2023 10:07:43 +0800 Subject: [PATCH 58/61] cleancode --- mxVision/MediaCodec/Ascend310/README.zh.md | 5 +++-- mxVision/MultiThread/C++/README.zh.md | 5 ++--- mxVision/MultiThread/python/README.zh.md | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/mxVision/MediaCodec/Ascend310/README.zh.md b/mxVision/MediaCodec/Ascend310/README.zh.md index 95f6b25aa..9fadf4a86 100644 --- a/mxVision/MediaCodec/Ascend310/README.zh.md +++ b/mxVision/MediaCodec/Ascend310/README.zh.md @@ -30,13 +30,14 @@ ## 3.预准备 -脚本转换为unix格式以及添加脚本执行权限 +脚本转换为unix格式 ```bash sed -i 's/\r$//' ./script/*.sh -chmod +x ./script/*.sh ``` +给script目录下的脚本添加执行权限 + ## 4.编译 - 配置环境变量 diff --git a/mxVision/MultiThread/C++/README.zh.md b/mxVision/MultiThread/C++/README.zh.md index 246fbfc09..307a9fa05 100644 --- a/mxVision/MultiThread/C++/README.zh.md +++ b/mxVision/MultiThread/C++/README.zh.md @@ -48,12 +48,11 @@ ### 3.3 预准备 -脚本转换为unix格式以及添加脚本执行权限 - +脚本转换为unix格式 ```bash sed -i 's/\r$//' ./*.sh -chmod +x ./*.sh ``` +给script目录下的脚本添加执行权限 ### 3.4 模型转换 yolov3模型下载参考华为昇腾社区[ModelZoo](https://www.hiascend.com/zh/software/modelzoo/detail/1/ba2a4c054a094ef595da288ecbc7d7b4) diff --git a/mxVision/MultiThread/python/README.zh.md b/mxVision/MultiThread/python/README.zh.md index b49b5c55e..24bb5e902 100644 --- a/mxVision/MultiThread/python/README.zh.md +++ b/mxVision/MultiThread/python/README.zh.md @@ -28,12 +28,12 @@ ## 3.预准备 -脚本转换为unix格式以及添加脚本执行权限 +脚本转换为unix格式 ```bash sed -i 's/\r$//' ./*.sh -chmod +x ./*.sh ``` +给script目录下的脚本添加执行权限 配置环境变量 -- Gitee From 917ed37c7691ae721f1189d99b9bd2d28e91c990 Mon Sep 17 00:00:00 2001 From: xuegangxiao Date: Tue, 4 Apr 2023 02:21:34 +0000 Subject: [PATCH 59/61] =?UTF-8?q?!339=20310B=E9=80=82=E9=85=8D=20*=20clean?= =?UTF-8?q?code=20*=20310B=E9=80=82=E9=85=8D=20*=20Pipeline=E8=BE=93?= =?UTF-8?q?=E5=85=A5=E8=BE=93=E5=87=BA=E6=A0=B7=E4=BE=8B310B=E9=80=82?= =?UTF-8?q?=E9=85=8D=20*=20Retinaface310B=E9=80=82=E9=85=8D=20*=20?= =?UTF-8?q?=E5=A4=9A=E7=BA=BF=E7=A8=8B=E8=B0=83=E7=94=A8310B=E9=80=82?= =?UTF-8?q?=E9=85=8D=20*=20=E8=A7=86=E9=A2=91=E8=BD=AC=E7=A0=81310B?= =?UTF-8?q?=E9=80=82=E9=85=8D=20*=20=E5=9B=BE=E5=83=8F=E7=9B=AE=E6=A0=87?= =?UTF-8?q?=E6=A3=80=E6=B5=8Bdoc=E4=BB=A5=E5=8F=8Atutorial=20310B=E9=80=82?= =?UTF-8?q?=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contrib/CenterNet/README.md | 6 ++--- contrib/IAT/README.md | 7 +++-- contrib/Retinaface/README.md | 10 +++---- contrib/Retinaface/model/run.sh | 3 ++- ...\265\213sample\346\240\267\344\276\213.md" | 26 +++++-------------- mxVision/MediaCodec/Ascend310/README.zh.md | 8 +++--- .../Ascend310/pipeline/test.pipeline | 4 +-- mxVision/MultiThread/C++/README.zh.md | 15 ++++++++--- mxVision/MultiThread/python/README.zh.md | 20 +++++++++++--- tutorials/ImageDetectionSample/cpp/README.md | 20 +++++--------- .../ImageDetectionSample/python/README.md | 9 ++++--- .../python/models/model_conversion.sh | 13 +++------- .../PipelineInputOutputSample/C++/README.md | 13 +++------- .../python/README.md | 8 +++--- .../PipelineInputOutputSample/python/main.py | 2 +- .../sampleCustomProto/Sample_proto.pipeline | 4 +-- 16 files changed, 79 insertions(+), 89 deletions(-) diff --git a/contrib/CenterNet/README.md b/contrib/CenterNet/README.md index 0db07c8ed..535e9b765 100644 --- a/contrib/CenterNet/README.md +++ b/contrib/CenterNet/README.md @@ -5,12 +5,12 @@ CenterNet 目标检测后处理插件基于 MindX SDK 开发,对图片中的 ### 1.1 支持的产品 -本项目以昇腾Atlas310卡为主要的硬件平台。 +本项目以昇腾Atlas310、Atlas310B卡为主要硬件平台。 ### 1.2 支持的版本 -支持的SDK版本为 2.0.4, CANN 版本为 5.0.4。 +支持的SDK版本为 5.0.RC1, CANN 版本为 6.0.RC1。 ### 1.3 软件方案介绍 @@ -106,7 +106,6 @@ CenterNet 的后处理插件接收模型推理插件输出的特征图。本项 | 软件名称 | 版本 | | -------- | ----- | | cmake | 3.5+ | -| mxVision | 2.0.4 | | python | 3.9.2 | 确保环境中正确安装mxVision SDK。 @@ -156,6 +155,7 @@ cp -r NumCpp/include/NumCpp ./include/ ``` atc --framework=5 --model=CenterNet.onnx --output=CenterNet_pre_post --input_format=NCHW --input_shape="actual_input:1,3,512,512" --out_nodes="Conv_949:0;Conv_952:0;Conv_955:0" --log=info --soc_version=Ascend310 --insert_op_conf=./aipp-configs/aipp_bgr.config ``` +(若用例执行在310B上,则--soc_version=Ascend310需修改为Ascend310B1) 若终端输出: ``` diff --git a/contrib/IAT/README.md b/contrib/IAT/README.md index efb46e807..15e05404a 100644 --- a/contrib/IAT/README.md +++ b/contrib/IAT/README.md @@ -5,7 +5,7 @@ ### 1.1 支持的产品 -支持昇腾310芯片 +本项目以昇腾Atlas310、Atlas310B卡为主要硬件平台。 ### 1.2 支持的版本 @@ -17,7 +17,6 @@ eg:版本号查询方法,在Atlas产品环境下,运行命令: npu-smi info ``` -版本号为Mind SDK 3.0RC3 ### 1.3 软件方案介绍 @@ -60,12 +59,11 @@ eg:推荐系统为ubuntu 18.04或centos 7.6,环境依赖软件和版本如 | 软件名称 | 版本 | | ------------- | ---------------- | | ubuntu | 18.04.1 LTS | -| MindX SDK | mxVision-3.0.RC3 | | Python | 3.9.2 | -| CANN | 5.1.RC2.alpha008 | | numpy | 1.22.3 | | opencv-python | 4.5.5 | | onnxsim | 0.4.10 | +支持的SDK版本为 5.0.RC1, CANN 版本为 6.0.RC1。 在编译运行项目前,需要设置环境变量: @@ -136,6 +134,7 @@ onnxsim IAT_lol.onnx IAT_lol-sim.onnx ``` atc --framework=5 --model=./IAT_lol-sim.onnx --input_shape="input_1:1,3,400,600" --output=IAT_lol-sim --soc_version=Ascend310 ``` +(若用例执行在310B上,则--soc_version=Ascend310需修改为Ascend310B1) **步骤4** (运行及输出结果) diff --git a/contrib/Retinaface/README.md b/contrib/Retinaface/README.md index 28a7c5d0c..b626bf73a 100644 --- a/contrib/Retinaface/README.md +++ b/contrib/Retinaface/README.md @@ -6,11 +6,11 @@ Retinaface基于MindX_SDK开发,在昇腾芯片上进行目标检测,并实 ### 1.1 支持的产品 -本产品以昇腾310(推理)卡为硬件平台。 +本项目以昇腾Atlas310、Atlas310B卡为主要硬件平台。 ### 1.2 支持的版本 -该项目支持的SDK版本为2.0.4,CANN版本为5.0.4。 +支持的SDK版本为 5.0.RC1, CANN 版本为 6.0.RC1。 ### 1.3 软件方案介绍 @@ -77,9 +77,9 @@ Retinaface基于MindX_SDK开发,在昇腾芯片上进行目标检测,并实 | 软件名称 | 版本 | 说明 | 获取方式 | | ------------------- | ----- | ----------------------------- | :-------------------------------------------------------- | -| MindX SDK | 2.0.4 | mxVision软件包 | [链接](https://www.hiascend.com/software/Mindx-sdk) | +| MindX SDK | 5.0.RC1 | mxVision软件包 | [链接](https://www.hiascend.com/software/Mindx-sdk) | | ubuntu | 18.04 | 操作系统 | 请上ubuntu官网获取 | -| Ascend-CANN-toolkit | 5.0.4 | Ascend-cann-toolkit开发套件包 | [链接](https://www.hiascend.com/software/cann/commercial) | +| Ascend-CANN-toolkit | 6.0.RC1 | Ascend-cann-toolkit开发套件包 | [链接](https://www.hiascend.com/software/cann/commercial) | @@ -165,7 +165,7 @@ git clone https://github.com/biubug6/Pytorch_Retinaface.git 模型转换步骤如下: 1、`cd`到`model`文件夹,运行 - +若用例执行在310B上,则--soc_version=Ascend310需修改为Ascend310B1 ```` bash run.sh ```` diff --git a/contrib/Retinaface/model/run.sh b/contrib/Retinaface/model/run.sh index 16fddd791..bf257c73c 100644 --- a/contrib/Retinaface/model/run.sh +++ b/contrib/Retinaface/model/run.sh @@ -5,4 +5,5 @@ # Execute, transform Retinaface model. atc --framework=5 --model=retinaface.onnx --output=newRetinaface --input_format=NCHW --input_shape="image:1,3,1000,1000" --log=debug --soc_version=Ascend310 --insert_op_conf=../config/aipp.cfg -# 说明:out_nodes制定了输出节点的顺序,需要与模型后处理适配。 +# 说明1:out_nodes制定了输出节点的顺序,需要与模型后处理适配。 +# 说明2:若用例执行在310B上,则--soc_version=Ascend310需修改为Ascend310B1 \ No newline at end of file diff --git "a/docs/quickStart/2-1\345\233\276\345\203\217\346\243\200\346\265\213sample\346\240\267\344\276\213.md" "b/docs/quickStart/2-1\345\233\276\345\203\217\346\243\200\346\265\213sample\346\240\267\344\276\213.md" index 19c363400..75c228cd9 100644 --- "a/docs/quickStart/2-1\345\233\276\345\203\217\346\243\200\346\265\213sample\346\240\267\344\276\213.md" +++ "b/docs/quickStart/2-1\345\233\276\345\203\217\346\243\200\346\265\213sample\346\240\267\344\276\213.md" @@ -3,7 +3,7 @@ ## 2.1.1 样例介绍 提供了一个图像检测sample样例,实现对本地图片进行YOLOv3目标检测,并把可视化结果保存到本地。 -[样例获取](https://gitee.com/ascend/mindxsdk-referenceapps/tree/master/tutorials/ImageDetectionSample) +[样例获取](https://gitee.com/ascend/mindxsdk-referenceapps/tree/310B/tutorials/ImageDetectionSample) ## 2.1.2 运行前准备 参考[IDE开发环境搭建](./1-2IDE开发环境搭建.md)章节搭建好项目运行环境。 @@ -87,26 +87,14 @@ python pipeline在脚本main.py内部,其中模型路径和工程中model文 ![image.png](img/1623835106290.png 'image.png') ## 2.3 yolov3模型转换脚本 以下为yolov3模型转换脚本示例,使用时请确认参数中的路径是实际的相关路径。 -``` -#!/bin/bash - -# 该脚本用来将pb模型文件转换成.om模型文件 -# This is used to convert pb model file to .om model file. - - -# 设置环境变量(请确认install_path路径是否正确) -# Set environment PATH (Please confirm that the install_path is correct). - -export install_path=/usr/local/Ascend/ascend-toolkit/latest -export PATH=/usr/local/python3.9.2/bin:${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATH -export PYTHONPATH=${install_path}/atc/python/site-packages:${install_path}/atc/python/site-packages/auto_tune.egg/auto_tune:${install_path}/atc/python/site-packages/schedule_search.egg -export LD_LIBRARY_PATH=${install_path}/atc/lib64:$LD_LIBRARY_PATH -export ASCEND_OPP_PATH=${install_path}/opp +设置环境变量(请确认ascend_toolkit_path路径是否正确) +``` +. ${ascend_toolkit_path}/set_env.sh +``` -# 执行,转换YOLOv3模型 -# Execute, transform YOLOv3 model. - +执行atc命令,转换YOLOv3模型 +``` atc --model=./yolov3_tf.pb --framework=3 --output=./yolov3_tf_bs1_fp16 --soc_version=Ascend310 --insert_op_conf=./aipp_yolov3_416_416.aippconfig --input_shape="input:1,416,416,3" --out_nodes="yolov3/yolov3_head/Conv_6/BiasAdd:0;yolov3/yolov3_head/Conv_14/BiasAdd:0;yolov3/yolov3_head/Conv_22/BiasAdd:0" # 说明:out_nodes制定了输出节点的顺序,需要与模型后处理适配。 ``` diff --git a/mxVision/MediaCodec/Ascend310/README.zh.md b/mxVision/MediaCodec/Ascend310/README.zh.md index bd9d3656a..9fadf4a86 100644 --- a/mxVision/MediaCodec/Ascend310/README.zh.md +++ b/mxVision/MediaCodec/Ascend310/README.zh.md @@ -25,17 +25,19 @@ | 软件名称 | 版本 | | -------- | ------ | | cmake | 3.5.1+ | -| mxVision | 0.2 | + +支持的SDK版本为 5.0.RC1, CANN 版本为 6.0.RC1。 ## 3.预准备 -脚本转换为unix格式以及添加脚本执行权限 +脚本转换为unix格式 ```bash sed -i 's/\r$//' ./script/*.sh -chmod +x ./script/*.sh ``` +给script目录下的脚本添加执行权限 + ## 4.编译 - 配置环境变量 diff --git a/mxVision/MediaCodec/Ascend310/pipeline/test.pipeline b/mxVision/MediaCodec/Ascend310/pipeline/test.pipeline index a2e139f3a..cfb0c762e 100644 --- a/mxVision/MediaCodec/Ascend310/pipeline/test.pipeline +++ b/mxVision/MediaCodec/Ascend310/pipeline/test.pipeline @@ -28,7 +28,6 @@ "deviceId": "xxx", "vdecChannelId": "xxx" }, - "former": "mxpi_rtspsrcxxx", "next": "queue1" }, @@ -83,8 +82,7 @@ }, "fakesinkxxx": { - "factory": "fakesink", - "former": "mxpi_videoencoderxxx" + "factory": "fakesink" } } } \ No newline at end of file diff --git a/mxVision/MultiThread/C++/README.zh.md b/mxVision/MultiThread/C++/README.zh.md index bf748e800..307a9fa05 100644 --- a/mxVision/MultiThread/C++/README.zh.md +++ b/mxVision/MultiThread/C++/README.zh.md @@ -48,11 +48,20 @@ ### 3.3 预准备 -脚本转换为unix格式以及添加脚本执行权限 - +脚本转换为unix格式 ```bash sed -i 's/\r$//' ./*.sh -chmod +x ./*.sh +``` +给script目录下的脚本添加执行权限 + +### 3.4 模型转换 +yolov3模型下载参考华为昇腾社区[ModelZoo](https://www.hiascend.com/zh/software/modelzoo/detail/1/ba2a4c054a094ef595da288ecbc7d7b4) +使用以下命令进行转换,请注意aipp配置文件名,此处使用的为自带sample中的相关文件({Mind_SDK安装路径}/mxVision/samples/mxVision/models/yolov3/) + +``` +atc --model=./yolov3_tf.pb --framework=3 --output=./yolov3_tf_bs1_fp16 --soc_version=Ascend310 --insert_op_conf=./aipp_yolov3_416_416.aippconfig --input_shape="input:1,416,416,3" --out_nodes="yolov3/yolov3_head/Conv_6/BiasAdd:0;yolov3/yolov3_head/Conv_14/BiasAdd:0;yolov3/yolov3_head/Conv_22/BiasAdd:0" + +# 说明:若用例执行在310B上,则--soc_version=Ascend310需修改为Ascend310B1 ``` ## 4.编译 diff --git a/mxVision/MultiThread/python/README.zh.md b/mxVision/MultiThread/python/README.zh.md index baee4c318..24bb5e902 100644 --- a/mxVision/MultiThread/python/README.zh.md +++ b/mxVision/MultiThread/python/README.zh.md @@ -20,18 +20,20 @@ | 软件名称 | 版本 | | -------- | ------ | | cmake | 3.5.1+ | -| mxVision | 0.2 | | Python | 3.9.2 | | opencv-python | 3.4+ | | mmcv | - | + +支持的SDK版本为 5.0.RC1, CANN 版本为 6.0.RC1。 + ## 3.预准备 -脚本转换为unix格式以及添加脚本执行权限 +脚本转换为unix格式 ```bash sed -i 's/\r$//' ./*.sh -chmod +x ./*.sh ``` +给script目录下的脚本添加执行权限 配置环境变量 @@ -39,6 +41,18 @@ chmod +x ./*.sh export MX_SDK_HOME=${安装路径}/mxVision ``` +## 4 模型转换 + +yolov3模型下载参考华为昇腾社区[ModelZoo](https://www.hiascend.com/zh/software/modelzoo/detail/1/ba2a4c054a094ef595da288ecbc7d7b4) +使用以下命令进行转换,请注意aipp配置文件名,此处使用的为自带sample中的相关文件({Mind_SDK安装路径}/mxVision/samples/mxVision/models/yolov3/) + +``` +atc --model=./yolov3_tf.pb --framework=3 --output=./yolov3_tf_bs1_fp16 --soc_version=Ascend310 --insert_op_conf=./aipp_yolov3_416_416.aippconfig --input_shape="input:1,416,416,3" --out_nodes="yolov3/yolov3_head/Conv_6/BiasAdd:0;yolov3/yolov3_head/Conv_14/BiasAdd:0;yolov3/yolov3_head/Conv_22/BiasAdd:0" + +# 说明:若用例执行在310B上,则--soc_version=Ascend310需修改为Ascend310B1 +``` + + ## 5.运行 ### 5.1 运行前配置 diff --git a/tutorials/ImageDetectionSample/cpp/README.md b/tutorials/ImageDetectionSample/cpp/README.md index b4095637d..92bae9573 100644 --- a/tutorials/ImageDetectionSample/cpp/README.md +++ b/tutorials/ImageDetectionSample/cpp/README.md @@ -12,29 +12,21 @@ **步骤1** 在ModelZoo上下载YOLOv3模型。[下载地址](https://www.hiascend.com/zh/software/modelzoo/detail/1/ba2a4c054a094ef595da288ecbc7d7b4) -**步骤2** 将获取到的YOLOv3模型pb文件存放至:"样例项目所在目录/model/"。 +**步骤2** 将获取到的YOLOv3模型pb文件和coco.names存放至拷贝到model目录下。 **步骤3** 模型转换 - -在pb文件所在目录下执行一下命令 +设置环境变量(请确认ascend_toolkit_path路径是否正确) ``` -# 设置环境变量(请确认install_path路径是否正确) -# Set environment PATH (Please confirm that the install_path is correct). - -```c -. /usr/local/Ascend/ascend-toolkit/set_env.sh # Ascend-cann-toolkit开发套件包默认安装路径,请根据实际安装路径修改。 - +. ${ascend_toolkit_path}/set_env.sh ``` -# 执行,转换YOLOv3模型 -# Execute, transform YOLOv3 model. - +执行atc命令,转换YOLOv3模型 +``` atc --model=./yolov3_tf.pb --framework=3 --output=./yolov3_tf_bs1_fp16 --soc_version=Ascend310 --insert_op_conf=./aipp_yolov3_416_416.aippconfig --input_shape="input:1,416,416,3" --out_nodes="yolov3/yolov3_head/Conv_6/BiasAdd:0;yolov3/yolov3_head/Conv_14/BiasAdd:0;yolov3/yolov3_head/Conv_22/BiasAdd:0" # 说明1:out_nodes制定了输出节点的顺序,需要与模型后处理适配。 # 说明2:若用例执行在310B上,则--soc_version=Ascend310需修改为Ascend310B1 - ``` 执行完模型转换脚本后,会生成相应的.om模型文件。 执行完模型转换脚本后,会生成相应的.om模型文件。 @@ -125,7 +117,7 @@ Scanning dependencies of target sample ``` ### 执行脚本 - +准备一张待检测图片,放到项目目录下命名为test.jpg 执行run.sh脚本前请先确认可执行文件sample已生成,并给脚本添加可执行权限。 ``` diff --git a/tutorials/ImageDetectionSample/python/README.md b/tutorials/ImageDetectionSample/python/README.md index 357cbd240..6e1babcb6 100644 --- a/tutorials/ImageDetectionSample/python/README.md +++ b/tutorials/ImageDetectionSample/python/README.md @@ -20,12 +20,13 @@ bash model_conversion.sh 将main.py 文件中 mxpi_objectpostprocessor0插件中的postProcessLibPath路径中的${SDK安装路径} 替换为自己的SDK安装路径 ### 配置环境变量 -将${SDK安装路径}替换为自己的SDK安装路径; 将${MX_SDK_HOME}替换成对应路径 - ``` -export MX_SDK_HOME=${SDK安装路径}/mxVision +. ${ascend_toolkit_path}/set_env.sh +. ${SDK-path}/set_env.sh -export LD_LIBRARY_PATH=${MX_SDK_HOME}/lib:${MX_SDK_HOME}/opensource/lib:${MX_SDK_HOME}/opensource/lib64 +# 环境变量介绍 +SDK-path: SDK mxVision 安装路径 +ascend-toolkit-path: CANN 安装路径 ``` ### 运行 diff --git a/tutorials/ImageDetectionSample/python/models/model_conversion.sh b/tutorials/ImageDetectionSample/python/models/model_conversion.sh index deb96e420..176cc1430 100644 --- a/tutorials/ImageDetectionSample/python/models/model_conversion.sh +++ b/tutorials/ImageDetectionSample/python/models/model_conversion.sh @@ -19,18 +19,11 @@ # This is used to convert pb model file to .om model file. -# 设置环境变量(请确认install_path路径是否正确) -# Set environment PATH (Please confirm that the install_path is correct). - -export install_path=/usr/local/Ascend/ascend-toolkit/latest -export PATH=/usr/local/python3.9.2/bin:${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATH -export PYTHONPATH=${install_path}/atc/python/site-packages:${install_path}/atc/python/site-packages/auto_tune.egg/auto_tune:${install_path}/atc/python/site-packages/schedule_search.egg -export LD_LIBRARY_PATH=${install_path}/atc/lib64:$LD_LIBRARY_PATH -export ASCEND_OPP_PATH=${install_path}/opp - +source ${ascend_toolkit_path}/set_env.sh # 执行,转换YOLOv3模型 # Execute, transform YOLOv3 model. atc --model=./yolov3_tf.pb --framework=3 --output=./yolov3_tf_bs1_fp16 --soc_version=Ascend310 --insert_op_conf=./aipp_yolov3_416_416.aippconfig --input_shape="input:1,416,416,3" --out_nodes="yolov3/yolov3_head/Conv_6/BiasAdd:0;yolov3/yolov3_head/Conv_14/BiasAdd:0;yolov3/yolov3_head/Conv_22/BiasAdd:0" -# 说明:out_nodes制定了输出节点的顺序,需要与模型后处理适配。 \ No newline at end of file +# 说明1:out_nodes制定了输出节点的顺序,需要与模型后处理适配。 +# 说明2:若用例执行在310B上,则--soc_version=Ascend310需修改为Ascend310B1 \ No newline at end of file diff --git a/tutorials/PipelineInputOutputSample/C++/README.md b/tutorials/PipelineInputOutputSample/C++/README.md index b6362a95e..83979132b 100644 --- a/tutorials/PipelineInputOutputSample/C++/README.md +++ b/tutorials/PipelineInputOutputSample/C++/README.md @@ -8,19 +8,12 @@ 将项目目录从mindxsdk-referenceapps\tutorials\PipelineInputOutputSample\C++移动到运行样例的目录下 -### 配置SDK路径 -配置CMakeLists.txt 中的'MX_SDK_HOME'环境变量,配置为MindX SDK的安装路径; ${SDK安装路径}替换为用户环境SDK安装路径。 -set(MX_SDK_HOME /usr/local/Ascend/mxVision) -/usr/local/Ascend/mxVision 需要替换为自己的SDK安装路径 - -``` -set(MX_SDK_HOME ${SDK安装路径}/mxVision) -``` ### 配置环境变量 执行以下命令: ``` -. ${MX_SDK_HOME}/set_env.sh # ${MX_SDK_HOME}替换为用户的SDK安装路径 +. ${MX_SDK_HOME}/set_env.sh +# ${MX_SDK_HOME}替换为用户的SDK安装路径 ``` ### 编译运行 @@ -31,7 +24,7 @@ set(MX_SDK_HOME ${SDK安装路径}/mxVision) 返回上级目录 cd .. -执行 ./sample 或者执行 ./sample 参数 +执行 ./IOsample 或者执行 ./IOsample 参数 其中参数为 0,1,2 参数对应的调用插件可以参考快速指导 ### 查看结果 diff --git a/tutorials/PipelineInputOutputSample/python/README.md b/tutorials/PipelineInputOutputSample/python/README.md index 368aa00b7..619f22478 100644 --- a/tutorials/PipelineInputOutputSample/python/README.md +++ b/tutorials/PipelineInputOutputSample/python/README.md @@ -12,14 +12,14 @@ 进入到移动后的工程路径下 ### 配置环境变量 -将${SDK安装路径}替换为自己的SDK安装路径; 将${MX_SDK_HOME}替换成对应路径 +执行以下命令: ``` -export MX_SDK_HOME=${SDK安装路径}/mxVision - -export LD_LIBRARY_PATH=${MX_SDK_HOME}/lib:${MX_SDK_HOME}/opensource/lib:${MX_SDK_HOME}/opensource/lib64 +. ${MX_SDK_HOME}/set_env.sh +# ${MX_SDK_HOME}替换为用户的SDK安装路径 ``` + ### 运行 python3 main.py 参数 diff --git a/tutorials/PipelineInputOutputSample/python/main.py b/tutorials/PipelineInputOutputSample/python/main.py index 050bd0cf1..3d7f71e96 100644 --- a/tutorials/PipelineInputOutputSample/python/main.py +++ b/tutorials/PipelineInputOutputSample/python/main.py @@ -147,7 +147,7 @@ if __name__ == '__main__': infer_result.errorCode, infer_result.data.decode())) exit() # 打印推理结果 - print("result1: {}".format(infer_result.data.decode())) + print("result: {}".format(infer_result.data.decode())) elif INTERFACE_TYPE == 2: # 执行SendData - GetResult 样例 diff --git a/tutorials/sampleCustomProto/Sample_proto.pipeline b/tutorials/sampleCustomProto/Sample_proto.pipeline index 61b962303..d7d1076a3 100644 --- a/tutorials/sampleCustomProto/Sample_proto.pipeline +++ b/tutorials/sampleCustomProto/Sample_proto.pipeline @@ -15,7 +15,7 @@ "props": { "modelPath": "../models/yolov3/yolov3_tf_bs1_fp16.om", "postProcessConfigPath": "../models/yolov3/yolov3_tf_bs1_fp16.cfg", - "labelPath": "../models/yolov3/coco.names", + "labelPath": "../models/yolov3/yolov3.names", "postProcessLibPath": "libMpYOLOv3PostProcessor.so" }, "factory": "mxpi_modelinfer", @@ -33,7 +33,7 @@ "props": { "modelPath": "../models/resnet50/resnet50_aipp_tf.om", "postProcessConfigPath": "../models/resnet50/resnet50_aipp_tf.cfg", - "labelPath": "../models/resnet50/imagenet1000_clsidx_to_labels.names", + "labelPath": "../models/resnet50/resnet50_clsidx_to_labels.names", "postProcessLibPath": "libresnet50postprocessor.so" }, "factory": "mxpi_modelinfer", -- Gitee From e5b0b4d92ae6f5553a946e936aafbbfc983724c6 Mon Sep 17 00:00:00 2001 From: xuegangxiao Date: Tue, 4 Apr 2023 12:41:41 +0800 Subject: [PATCH 60/61] =?UTF-8?q?310=E9=80=82=E9=85=8D=EF=BC=8Ccann?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=8F=B7=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contrib/CenterNet/README.md | 2 +- contrib/IAT/README.md | 2 +- contrib/Retinaface/README.md | 2 +- mxVision/MediaCodec/Ascend310/README.zh.md | 2 +- mxVision/MultiThread/python/README.zh.md | 2 +- mxVision/PPYOLOEPlusDetection/README.md | 2 +- mxVision/YOLOv7Detection/README.md | 2 +- tutorials/OsdSample/README.md | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/contrib/CenterNet/README.md b/contrib/CenterNet/README.md index 535e9b765..03a78b500 100644 --- a/contrib/CenterNet/README.md +++ b/contrib/CenterNet/README.md @@ -10,7 +10,7 @@ CenterNet 目标检测后处理插件基于 MindX SDK 开发,对图片中的 ### 1.2 支持的版本 -支持的SDK版本为 5.0.RC1, CANN 版本为 6.0.RC1。 +支持的SDK版本为 5.0.RC1, CANN 版本310使用6.3.RC1,310B使用6.2.RC1。 ### 1.3 软件方案介绍 diff --git a/contrib/IAT/README.md b/contrib/IAT/README.md index 15e05404a..a527e9c70 100644 --- a/contrib/IAT/README.md +++ b/contrib/IAT/README.md @@ -63,7 +63,7 @@ eg:推荐系统为ubuntu 18.04或centos 7.6,环境依赖软件和版本如 | numpy | 1.22.3 | | opencv-python | 4.5.5 | | onnxsim | 0.4.10 | -支持的SDK版本为 5.0.RC1, CANN 版本为 6.0.RC1。 +支持的SDK版本为 5.0.RC1, CANN 版本310使用6.3.RC1,310B使用6.2.RC1。 在编译运行项目前,需要设置环境变量: diff --git a/contrib/Retinaface/README.md b/contrib/Retinaface/README.md index b626bf73a..fb5b130a4 100644 --- a/contrib/Retinaface/README.md +++ b/contrib/Retinaface/README.md @@ -10,7 +10,7 @@ Retinaface基于MindX_SDK开发,在昇腾芯片上进行目标检测,并实 ### 1.2 支持的版本 -支持的SDK版本为 5.0.RC1, CANN 版本为 6.0.RC1。 +支持的SDK版本为 5.0.RC1, CANN 版本310使用6.3.RC1,310B使用6.2.RC1。 ### 1.3 软件方案介绍 diff --git a/mxVision/MediaCodec/Ascend310/README.zh.md b/mxVision/MediaCodec/Ascend310/README.zh.md index 9fadf4a86..43d6ae60d 100644 --- a/mxVision/MediaCodec/Ascend310/README.zh.md +++ b/mxVision/MediaCodec/Ascend310/README.zh.md @@ -26,7 +26,7 @@ | -------- | ------ | | cmake | 3.5.1+ | -支持的SDK版本为 5.0.RC1, CANN 版本为 6.0.RC1。 +支持的SDK版本为 5.0.RC1, CANN 版本310使用6.3.RC1,310B使用6.2.RC1。 ## 3.预准备 diff --git a/mxVision/MultiThread/python/README.zh.md b/mxVision/MultiThread/python/README.zh.md index 24bb5e902..db43efab9 100644 --- a/mxVision/MultiThread/python/README.zh.md +++ b/mxVision/MultiThread/python/README.zh.md @@ -24,7 +24,7 @@ | opencv-python | 3.4+ | | mmcv | - | -支持的SDK版本为 5.0.RC1, CANN 版本为 6.0.RC1。 +支持的SDK版本为 5.0.RC1, CANN 版本310使用6.3.RC1,310B使用6.2.RC1。 ## 3.预准备 diff --git a/mxVision/PPYOLOEPlusDetection/README.md b/mxVision/PPYOLOEPlusDetection/README.md index 918d4df78..ba1c5e372 100644 --- a/mxVision/PPYOLOEPlusDetection/README.md +++ b/mxVision/PPYOLOEPlusDetection/README.md @@ -10,7 +10,7 @@ PPYOLOE+ 目标检测后处理插件基于 MindX SDK 开发,对图片中的不 ### 1.2 支持的版本 -支持的SDK版本为 5.0.RC1, CANN 版本为 6.0.RC1。 +支持的SDK版本为 5.0.RC1, CANN 版本310使用6.3.RC1,310B使用6.2.RC1。 ### 1.3 软件方案介绍 diff --git a/mxVision/YOLOv7Detection/README.md b/mxVision/YOLOv7Detection/README.md index 8e7db4854..090d9ec28 100644 --- a/mxVision/YOLOv7Detection/README.md +++ b/mxVision/YOLOv7Detection/README.md @@ -10,7 +10,7 @@ YOLOv7 目标检测后处理插件基于 MindX SDK 开发,对图片中的不 ### 1.2 支持的版本 -支持的SDK版本为 5.0.RC1, CANN 版本为 6.0.RC1。 +支持的SDK版本为 5.0.RC1, CANN 版本310使用6.3.RC1,310B使用6.2.RC1。 ### 1.3 软件方案介绍 diff --git a/tutorials/OsdSample/README.md b/tutorials/OsdSample/README.md index 89f27eb9c..29b0a7408 100644 --- a/tutorials/OsdSample/README.md +++ b/tutorials/OsdSample/README.md @@ -9,7 +9,7 @@ 本项目以昇腾Atlas310、Atlas310B卡为主要硬件平台。 ### 1.2 支持的版本 -支持的SDK版本为 5.0.RC1, CANN 版本为 6.0.RC1。 +支持的SDK版本为 5.0.RC1, CANN 版本310使用6.3.RC1,310B使用6.2.RC1。 ## 2 环境依赖 -- Gitee From 2b40397336a7576bf42d9002d88d1ad4f620262c Mon Sep 17 00:00:00 2001 From: xuegangxiao Date: Wed, 12 Apr 2023 10:47:38 +0800 Subject: [PATCH 61/61] =?UTF-8?q?=E5=A2=9E=E5=8A=A0200dk=E6=A8=A1=E5=9E=8B?= =?UTF-8?q?=E8=BD=AC=E6=8D=A2=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contrib/Burpee_Detection/README.md | 2 ++ contrib/CenterNet/README.md | 3 +++ contrib/IAT/README.md | 2 ++ contrib/InvoiceOCR/README.md | 3 +++ contrib/RTMHumanKeypointsDetection/README.md | 5 +++-- contrib/ReIDv2/README.md | 3 +++ contrib/Retinaface/README.md | 2 ++ ...346\243\200\346\265\213sample\346\240\267\344\276\213.md" | 3 +++ ...5\213\346\240\267\344\276\213\350\277\220\350\241\214.md" | 3 +++ tutorials/mxBaseVideoSample/README.md | 2 ++ 10 files changed, 26 insertions(+), 2 deletions(-) diff --git a/contrib/Burpee_Detection/README.md b/contrib/Burpee_Detection/README.md index c5acbd070..55cfe75f2 100644 --- a/contrib/Burpee_Detection/README.md +++ b/contrib/Burpee_Detection/README.md @@ -112,6 +112,8 @@ MindX SDK 安装前准备可参考《用户指南》,[安装教程](https://gi ### 3.1 模型转换 +若使用A200I DK A2运行,推荐使用PC转换模型,具体方法可参考A200I DK A2资料。 + 使用模型转换工具 ATC 将 onnx 模型转换为 om 模型,模型转换工具相关介绍参考链接:[ATC模型转换工具指南](https://gitee.com/ascend/docs-openmind/blob/master/guide/mindx/sdk/tutorials/%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99.md) 。 步骤如下: diff --git a/contrib/CenterNet/README.md b/contrib/CenterNet/README.md index 03a78b500..37cace1bc 100644 --- a/contrib/CenterNet/README.md +++ b/contrib/CenterNet/README.md @@ -141,6 +141,9 @@ cp -r NumCpp/include/NumCpp ./include/ ## 3. 模型转换 + +若使用A200I DK A2运行,推荐使用PC转换模型,具体方法可参考A200I DK A2资料。 + 本项目中采用的模型是 CenterNet 模型,参考实现代码:https://github.com/xingyizhou/CenterNet ,模型下载链接:https://www.hiascend.com/zh/software/modelzoo/models/detail/1/0699d3e48ff1447cafc85c2c9f007130 。 本项目使用模型转换工具 ATC 将 onnx 模型转换为 om 模型,模型转换工具相关介绍参考链接:https://gitee.com/ascend/docs-openmind/blob/master/guide/mindx/sdk/tutorials/%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99.md 。 diff --git a/contrib/IAT/README.md b/contrib/IAT/README.md index a527e9c70..4d96a4466 100644 --- a/contrib/IAT/README.md +++ b/contrib/IAT/README.md @@ -129,6 +129,8 @@ onnxsim IAT_lol.onnx IAT_lol-sim.onnx ​ 3.onnx 文件转换 om 文件 + 若使用A200I DK A2运行,推荐使用PC转换模型,具体方法可参考A200I DK A2资料。 + ​ 将环境从原模型环境切换到当前项目环境,然后运行: ``` diff --git a/contrib/InvoiceOCR/README.md b/contrib/InvoiceOCR/README.md index 8a5dc802c..4464da012 100644 --- a/contrib/InvoiceOCR/README.md +++ b/contrib/InvoiceOCR/README.md @@ -141,6 +141,9 @@ ascend-toolkit-path:CANN安装路径 ### 3.2 模型转换 + +若使用A200I DK A2运行,推荐使用PC转换模型,具体方法可参考A200I DK A2资料。 + 此处提供训练后的中间模型供模型转换使用:[resnet50](https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/contrib/Financial_bills-OCR/resnet.air)、[db](https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/contrib/Financial_bills-OCR/db.onnx)、[crnn](https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/contrib/Financial_bills-OCR/crnn.onnx) 在`./models/resnet50`目录下执行如下命令(若用例执行在310B上,则--soc_version=Ascend310需修改为Ascend310B1) diff --git a/contrib/RTMHumanKeypointsDetection/README.md b/contrib/RTMHumanKeypointsDetection/README.md index 1fa146d70..f8325e1cd 100644 --- a/contrib/RTMHumanKeypointsDetection/README.md +++ b/contrib/RTMHumanKeypointsDetection/README.md @@ -9,8 +9,7 @@ 昇腾310(推理) ### 1.2 支持的版本 - -本样例配套的CANN版本为[5.0.5.alpha001](https://www.hiascend.com/software/cann)。支持的SDK版本为[3.0.RC2](https://www.hiascend.com/software/Mindx-sdk)。 +支持的SDK版本为 5.0.RC1, CANN 版本310使用6.3.RC1,310B使用6.2.RC1。 MindX SDK安装前准备可参考《用户指南》,[安装教程](https://gitee.com/ascend/mindxsdk-referenceapps/blob/master/docs/quickStart/1-1安装SDK开发套件.md) @@ -120,6 +119,8 @@ ascend-toolkit-path: CANN 安装路径 ## 3 模型转换 +若使用A200I DK A2运行,推荐使用PC转换模型,具体方法可参考A200I DK A2资料。 + 本项目主要用到了用于人体关键点检测的OpenPose模型,OpenPose模型相关文件可以[点击此处](https://github.com/Daniil-Osokin/lightweight-human-pose-estimation.pytorch)下载。本项目在MindX SDK中需要使用om模型,我们需要对模型进行转换。首先需要将pytorch模型转换为onnx模型,然后使用ATC模型转换工具将onnx模型转换为om模型。 本项目提供了输入尺寸为(512,512)的onnx模型,[点击此处下载](https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/mindxsdk-referenceapps%20/contrib/RTMHumanKeypointsDetection/human-pose-estimation512.onnx),如不需要修改模型输入尺寸,可直接执行步骤二。 diff --git a/contrib/ReIDv2/README.md b/contrib/ReIDv2/README.md index 88ec072f8..390181e54 100644 --- a/contrib/ReIDv2/README.md +++ b/contrib/ReIDv2/README.md @@ -75,6 +75,9 @@ ReID apt-get install libpython3.9 ``` ## 4 模型转换 + +若使用A200I DK A2运行,推荐使用PC转换模型,具体方法可参考A200I DK A2资料。 + 行人重识别先采用了yolov3模型将图片中的行人检测出来,然后利用ReID模型获取行人的特征向量。由于yolov3模型和ReID模型分别是基于Pytorch和Tensorflow的深度模型,我们需要借助ATC工具分别将其转换成对应的.om模型。 4.1 yolov3的模型转换: diff --git a/contrib/Retinaface/README.md b/contrib/Retinaface/README.md index fb5b130a4..7211ef856 100644 --- a/contrib/Retinaface/README.md +++ b/contrib/Retinaface/README.md @@ -160,6 +160,8 @@ git clone https://github.com/biubug6/Pytorch_Retinaface.git ## 4 模型转化 +若使用A200I DK A2运行,推荐使用PC转换模型,具体方法可参考A200I DK A2资料。 + 下载后解包,得到`Retinaface.onnx`,使用模型转换工具ATC将onnx模型转换为om模型,模型转换工具相关介绍参考[链接](https://gitee.com/ascend/docs-openmind/blob/master/guide/mindx/sdk/tutorials/%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99.md) 模型转换步骤如下: diff --git "a/docs/quickStart/2-1\345\233\276\345\203\217\346\243\200\346\265\213sample\346\240\267\344\276\213.md" "b/docs/quickStart/2-1\345\233\276\345\203\217\346\243\200\346\265\213sample\346\240\267\344\276\213.md" index 75c228cd9..399a1501b 100644 --- "a/docs/quickStart/2-1\345\233\276\345\203\217\346\243\200\346\265\213sample\346\240\267\344\276\213.md" +++ "b/docs/quickStart/2-1\345\233\276\345\203\217\346\243\200\346\265\213sample\346\240\267\344\276\213.md" @@ -10,6 +10,9 @@ 参考[Cmake介绍](./Cmake介绍.md)修改CMakeLists.txt文件。 ### 2.1.2.1 模型转换 + +若使用A200I DK A2运行,推荐使用PC转换模型,具体方法可参考A200I DK A2资料。 + **步骤1** 在ModelZoo上下载YOLOv3模型。[下载地址](https://www.hiascend.com/zh/software/modelzoo/detail/1/ba2a4c054a094ef595da288ecbc7d7b4) **步骤2** 将获取到的YOLOv3模型pb文件存放至:"样例项目所在目录/model/",如: diff --git "a/docs/quickStart/mxBase\345\233\276\345\203\217\346\243\200\346\265\213\346\240\267\344\276\213\350\277\220\350\241\214.md" "b/docs/quickStart/mxBase\345\233\276\345\203\217\346\243\200\346\265\213\346\240\267\344\276\213\350\277\220\350\241\214.md" index 7bdb4f1ec..b665e7238 100644 --- "a/docs/quickStart/mxBase\345\233\276\345\203\217\346\243\200\346\265\213\346\240\267\344\276\213\350\277\220\350\241\214.md" +++ "b/docs/quickStart/mxBase\345\233\276\345\203\217\346\243\200\346\265\213\346\240\267\344\276\213\350\277\220\350\241\214.md" @@ -11,6 +11,9 @@ Init > ReadImage >Resize > Inference >PostProcess >DeInit set(MX_SDK_HOME ${SDK安装路径})需要将${SDK安装路径}替换为具体的SDK安装路径 ``` ### 2.1.2.1 模型转换 + +若使用A200I DK A2运行,推荐使用PC转换模型,具体方法可参考A200I DK A2资料。 + **步骤1** 在ModelZoo上下载YOLOv3模型。[下载地址](https://www.hiascend.com/zh/software/modelzoo/detail/1/ba2a4c054a094ef595da288ecbc7d7b4) **步骤2** 将获取到的YOLOv3模型pb文件存放至:"项目目录中的models文件夹中"。 diff --git a/tutorials/mxBaseVideoSample/README.md b/tutorials/mxBaseVideoSample/README.md index 59bbe8991..861860da2 100644 --- a/tutorials/mxBaseVideoSample/README.md +++ b/tutorials/mxBaseVideoSample/README.md @@ -8,6 +8,8 @@ ### 2.1 模型转换 +若使用A200I DK A2运行,推荐使用PC转换模型,具体方法可参考A200I DK A2资料。 + **步骤1** 在ModelZoo上下载YOLOv3模型。[下载地址](https://www.hiascend.com/zh/software/modelzoo/detail/1/ba2a4c054a094ef595da288ecbc7d7b4) **步骤2** 将获取到的YOLOv3模型pb文件存放至:"样例项目所在目录/model/"。 -- Gitee