• [其他] 浅谈深度学习Backbone
    深度学习中常用的backbone有resnet系列(resnet的各种变体)、NAS网络系列(RegNet)、Mobilenet系列、Darknet系列、HRNet系列、Transformer系列和ConvNeXt。Backbone结构分类主要分成三类:CNNs结构, Transformer结构(如ViT及衍生算法,比如PVT),CNNs+Transformer结构Backbone:翻译为骨干网络的意思,既然说是主干网络,就代表其是网络的一部分,那么是哪部分呢?这个主干网络大多时候指的是提取特征的网络,其作用就是提取图片中的信息,共后面的网络使用。这些网络经常使用的是resnet VGG等,而不是我们自己设计的网络,因为这些网络已经证明了在分类等问题上的特征提取能力是很强的。在用这些网络作为backbone的时候,都是直接加载官方已经训练好的模型参数,后面接着我们自己的网络。让网络的这两个部分同时进行训练,因为加载的backbone模型已经具有提取特征的能力了,在我们的训练过程中,会对他进行微调,使得其更适合于我们自己的任务。Neck:是放在backbone和head之间的,是为了更好的利用backbone提取的特征。Bottleneck:瓶颈的意思,通常指的是网网络输入的数据维度和输出的维度不同,输出的维度比输入的小了许多,就像脖子一样,变细了。经常设置的参数 bottle_num=256,指的是网络输出的数据的维度是256 ,可是输入进来的可能是1024维度的。Head:head是获取网络输出内容的网络,利用之前提取的特征,head利用这些特征,做出预测。neck:是放在backbone和head之间的,是为了更好的利用backbone提取的特征bottleneck:瓶颈的意思,通常指的是网网络输入的数据维度和输出的维度不同,输出的维度比输入的小了许多,就像脖子一样,变细了。经常设置的参数 bottle_num=256,指的是网络输出的数据的维度是256 ,可是输入进来的可能是1024维度的。GAP:在设计的网络中经常能够看到gap这个层,我之前不知道是干啥的,后了解了,就是Global Average Pool全局平均池化,就是将某个通道的特征取平均值,经常使用AdaptativeAvgpoold(1),在pytorch中,这个代表自适应性全局平均池化,说人话就是将某个通道的特征取平均值self.gap = nn.AdaptiveAvgPool2d(1)Embedding: 深度学习方法都是利用使用线性和非线性转换对复杂的数据进行自动特征抽取,并将特征表示为“向量”(vector),这一过程一般也称为“嵌入”(embedding)用于预训练的任务被称为前置/代理任务(pretext task),用于微调的任务被称为下游任务(downstream task)temperature parameters 在论文中经常能看到这个温度参数的身影。
  • [基础知识] YoLo家族简介
    你以为YoLo的意思是You only live once?其实不对的。但是你如果把live改为look,这就接近于YoLo算法的精髓了。在目标检测的算法中,有 单阶段 目标检测的算法,也有两阶段 目标检测的算法,单阶段的意思是,只要一次性提取目标特征,就可以算出结果,而两阶段指的是顾名思义就是要提取多次才行。一般来说,单阶段的算法,速度快,但是精度相比两阶段的要差一点。但是你要知道,快就是王道,检测得慢了还不如不检测。这也许是YoLo家族的算法这么流行的原因。2016年,Joseph Redmon , Santosh Divvala, Ross Girshick , Ali Farhadi等人发布了YoLo的论文。其网络结构如下所示:采用了一个全连接层实现分类和回归。YoLo paper:https://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/Redmon_You_Only_Look_CVPR_2016_paper.pdfYoLoV2其实人家本来没起V2这个名字,而是叫做YoLo9000——起名起得非常大气,作者仍然是Joseph Redmon和Ali Farhadi。它对YoLo进行了优化,所以论文标题为 Better、Faster、Stronger,这个跟奥林匹克精神的 更快、更高、更强有点像了。在V2中比较典型的改进是引入了BN,也就是Batch Normalization,它对每一层特性进行归一化,可以使得隐藏层的输出分布一致。另外,既然它起名叫做9000,它就比原来能够检测更多的分类目标。它提出了一种结合目标检测和分类的层级预测——WordTree:YoLoV2 paper:cid:link_4YoLoV3的作者依然是Joseph Redmon和Ali Farhadi,这也是为啥Joseph Redmon被称为 YoLo之父的原因了。张小白虽然不大懂YoLoV3的原理,但是确实写了不少YoLoV3实践的文章:比如在200DK上用YoLoV3进行推理:cid:link_1或者在 ModelArts上进行YoLoV3的训练:cid:link_2以及使用MindStudio开发YoLoV3应用:cid:link_3YoLoV3 paper:cid:link_5YoLoV3 code:(这里放出的是MindSpore仓库的地址)cid:link_0不过,2020年2月,YOLO之父Joseph Redmon突然宣布退出计算机视觉研究领域。他“坦言无法忽视自己工作带来的负面影响“。这个基于道德上的考量确实发人深思,但是YoLo的发展似乎并没有停止。(未完待续)
  • [技术干货] 知识蒸馏相关技术【模型蒸馏、数据蒸馏】以ERNIE-Tiny为例
    1.任务简介基于ERNIE预训练模型效果上达到业界领先,但是由于模型比较大,预测性能可能无法满足上线需求。 直接使用ERNIE-Tiny系列轻量模型fine-tune,效果可能不够理想。如果采用数据蒸馏策略,又需要提供海量未标注数据,可能并不具备客观条件。 因此,本专题采用主流的知识蒸馏的方案来压缩模型,在满足用户预测性能、预测效果的需求同时,不依赖海量未标注数据,提升开发效率。 文心提供多种不同大小的基于字粒度的ERNIE-Tiny学生模型,满足不同用户的需求。注:知识蒸馏(KD)是将复杂模型(teacher)中的dark knowledge迁移到简单模型(student)中去,teacher具有强大的能力和表现,而student则更为紧凑。通过知识蒸馏,希望student能尽可能逼近亦或是超过teacher,从而用更少的复杂度来获得类似的预测效果。1.1 模型蒸馏原理知识蒸馏是一种模型压缩常见方法,指的是在teacher-student框架中,将复杂、学习能力强的网络(teacher)学到的特征表示"知识"蒸馏出来,传递给参数量小、学习能力弱的网络(student)。 在训练过程中,往往以最优化训练集的准确率作为训练目标,但真实目标其实应该是最优化模型的泛化能力。显然如果能直接以提升模型的泛化能力为目标进行训练是最好的,但这需要正确的关于泛化能力的信息,而这些信息通常不可用。如果我们使用由大型模型产生的所有类概率作为训练小模型的目标,就可以让小模型得到不输大模型的性能。这种把大模型的知识迁移到小模型的方式就是蒸馏。基本原理可参考Hinton经典论文:cid:link_11.2 ERNIE-Tiny 模型蒸馏模型蒸馏原理可参考论文 ERNIE-Tiny : A Progressive Distillation Framework for Pretrained Transformer Compression 2021。不同于原论文的实现,为了和开发套件中的通用蒸馏学生模型保持一致,我们将蒸馏loss替换为Attention矩阵的KQ loss和 VV loss,原理可参考论文 MiniLM: Deep Self-Attention Distillation for Task-Agnostic Compression of Pre-Trained Transformers 2020 和 MiniLMv2: Multi-Head Self-Attention Relation Distillation for Compressing Pretrained Transformers 2021。实验表明通用蒸馏阶段和任务蒸馏阶段的蒸馏loss不匹配时,学生模型的效果会受到影响。BERT 等预训练语言模型 (PLM) 采用了一种训练范式,首先在一般数据中预训练模型,然后在特定任务数据上微调模型,最近取得了巨大成功。然而,PLM 因其庞大的参数而臭名昭著,并且难以部署在现实生活中的应用程序中。知识蒸馏通过在一组数据上将知识从大老师转移到小得多的学生来解决这个问题。我们认为选择三个关键组成部分,即教师、训练数据和学习目标,对于蒸馏的有效性至关重要。因此,我们提出了一个四阶段渐进式蒸馏框架 ERNIE-Tiny 来压缩 PLM,它将三个组件从一般级别逐渐变化到特定任务级别。具体来说,第一阶段,General Distillation,在预训练的老师、一般数据和潜在蒸馏损失的指导下进行蒸馏。然后,General-Enhanced Distillation 将教师模型从预训练教师转变为微调教师。之后,Task-Adaptive Distillation 将训练数据从一般数据转移到特定于任务的数据。最后,Task-Specific Distillation 在最后阶段增加了两个额外的损失,即 Soft-Label 和 Hard-Label 损失。实证结果证明了我们的框架的有效性和所带来的泛化增益 。实验表明 4 层 ERNIE-Tiny 在 GLUE 基准测试的基础上保持其 12 层教师 BERT 的 98.0% 以上的性能,超过最先进的 (SOTA) 1.0% 的 GLUE 分数相同数量的参数。此外,ERNIE-Tiny 在五个中文 NLP 任务上实现了新的压缩 SOTA,比 BERT 基础的精度高 0.4%,参数减少 7.5 倍,推理速度加快 9.4 倍。预训练的语言模型(例如,BERT (Devlin et al., 2018) 及其变体)在各种 NLP 任务中取得了显着的成功。然而,这些模型通常包含数亿个参数,由于延迟和容量限制,这给现实应用中的微调和在线服务带来了挑战。在这项工作中,我们提出了一种简单有效的方法来压缩基于大型 Transformer (Vaswani et al., 2017) 的预训练模型,称为深度自注意力蒸馏。小模型(学生)通过深度模仿大模型(老师)的自注意力模块进行训练,该模块在 Transformer 网络中起着至关重要的作用。具体来说,我们建议提炼出教师最后一个 Transformer 层的自注意力模块,这对学生来说既有效又灵活。此外,除了现有作品中使用的注意力分布(即查询和键的缩放点积)之外,我们还引入了自我注意模块中值之间的缩放点积作为新的深度自我注意知识. 此外,我们表明,引入教师助理(Mirzadeh 等人,2019 年)也有助于提炼大型预训练 Transformer 模型。实验结果表明,我们的单语模型在不同参数大小的学生模型中优于最先进的基线。特别是,它使用 50% 的 Transformer 参数和教师模型的计算在 SQuAD 2.0 和几个 GLUE 基准测试任务上保持了 99% 以上的准确率。我们还在将深度自注意力蒸馏应用于多语言预训练模型方面获得了竞争性结果。我们仅使用自注意力关系蒸馏来对预训练的 Transformer 进行任务不可知的压缩,从而在 MiniLM (Wang et al., 2020) 中推广深度自注意力蒸馏。特别是,我们将多头自注意力关系定义为每个自注意力模块内的查询、键和值向量对之间的缩放点积。然后我们利用上述关系知识来训练学生模型。除了简单统一的原则外,更有利的是,学生的注意力头数没有限制,而之前的大多数工作都必须保证教师和学生之间的头数相同。此外,细粒度的自注意力关系倾向于充分利用 Transformer 学习到的交互知识。此外,我们彻底检查了教师模型的层选择策略,而不是像 MiniLM 中那样仅仅依赖最后一层。我们对压缩单语和多语预训练模型进行了广泛的实验。实验结果表明,我们从基础规模和大型教师(BERT、RoBERTa 和 XLM-R)中提取的模型优于最先进的模型。二阶段蒸馏:通用蒸馏(General Distillation,GD):在预训练阶段训练,使用大规模无监督的数据, 帮助学生网络学习到尚未微调的教师网络中的知识,有利于提高泛化能力。为方便用户使用,我们提供了多种尺寸的通用蒸馏学生模型,可用的通用蒸馏学生模型可参考文档:通用模型 - ERNIE3.0 Tiny。任务蒸馏(Task-specific Distillation,TD):使用具体任务的数据,学习到更多任务相关的具体知识。如果已提供的通用蒸馏学生模型尺寸符合需求,用户可以主要关注接下来的任务蒸馏过程。1.3任务蒸馏步骤FT阶段:基于ERNIE 3.0 Large蒸馏模型fine-tune得到教师模型,注意这里用到的教师模型和ERNIE 3.0 Large是两个不同的模型;GED阶段(可选):使用fine-tuned教师模型和通用数据继续用通用蒸馏的方式蒸馏学生模型,进一步提升学生模型的效果;a. 热启动fine-tuned的教师模型和通用学生模型。其中,通用的学生模型由文心平台提供,从bos上下载。TD1阶段:蒸馏中间层a.只对学生模型的最后一层进行蒸馏,将学生模型transformer的attention层的k-q矩阵和v-v矩阵与教师模型的对应矩阵做KLloss,可参考 :MiniLMV2。b.热启动fine-tuned的教师模型和GED阶段得到的学生模型。其中,通用的学生模型由文心平台提供,从bos上下载,下载链接所在文档:通用模型ERNIE3.0 Tiny,或参考预置的下载脚本:c. 反向传播阶段只更新学生模型参数,教师模型参数不更新;TD2阶段:蒸馏预测层,产出最终的学生模型。a. 热启动fine-tuned的教师模型和TD1阶段训练的学生模型;b. loss包括两部分: 1) pred_loss:软标签,学生模型的预测层输出与教师模型的预测层输出的交叉熵; 2) student_ce_loss:硬标签,学生模型的预测层输出与真实label的交叉熵;c. pred_loss与student_ce_loss之和作为最终loss,进行反向传播;d. 反向传播阶段只更新学生模型参数,教师模型参数不更新;注:关于GED阶段使用的通用数据:开发套件中的通用数据是由开源项目 cid:link_0 中的中文维基百科语料(wiki2019zh)经过预处理得到。该数据只用于demo展示,实际使用时替换为业务无标注数据效果提升更明显。2. 常见问题问题1:怎么修改学生模型的层数?上面提供了多种不同的学生模型,但每个学生模型的层数、hidden size等都是固定的,如果想更改,需要在哪些地方更改?文心提供了三种不同结构的预训练学生模型,如果修改层数、hidden size等,会导致预训练学生模型参数无法加载,在此情况下,蒸馏出来的学生模型效果无法保证,建议用户还是使用文心提供的预训练模型,不更改模型结构;如果用户认为更改学生模型的结构非常有必要,需要对文心做以下改动:修改TD1阶段json配置文件的pre_train_model配置项,删除预训练学生模型的加载,只保留微调后的教师模型"pre_train_model": [ # 热启动fine-tune的teacher模型 { "name": "finetuned_teacher_model", "params_path": "./output/cls_ernie_3.0_large_ft/save_checkpoints/checkpoints_step_6000" } ]将json文件中的"student_embedding"替换为自定义的学生模型"student_embedding": { "config_path": "../../models_hub/ernie_3.0_tiny_ch_dir/ernie_config.json" },再次强调,上述修改后,由于无法加载预训练学生模型,蒸馏出来的学生模型效果无法保证。(用户训练数据量到百万样本以上可以考虑尝试一下)3.数据蒸馏任务3.1 简介在ERNIE强大的语义理解能力背后,是需要同样强大的算力才能支撑起如此大规模模型的训练和预测。很多工业应用场景对性能要求较高,若不能有效压缩则无法实际应用。因此,我们基于数据蒸馏技术构建了数据蒸馏系统。其原理是通过数据作为桥梁,将ERNIE模型的知识迁移至小模型,以达到损失很小的效果却能达到上千倍的预测速度提升的效果。目录结构 数据蒸馏任务位于 wenxin_appzoo/tasks/data_distillation├── data │ ├── dev_data │ ├── dict │ ├── download_data.sh │ ├── predict_data │ ├── test_data │ └── train_data ├── distill │ └── chnsenticorp │ ├── student │ └── teacher ├── examples │ ├── cls_bow_ch.json │ ├── cls_cnn_ch.json │ ├── cls_ernie_fc_ch_infer.json │ └── cls_ernie_fc_ch.json ├── inference │ ├── custom_inference.py │ ├── __init__.py ├── model │ ├── base_cls.py │ ├── bow_classification.py │ ├── cnn_classification.py │ ├── ernie_classification.py │ ├── __init__.py ├── run_distill.sh ├── run_infer.py ├── run_trainer.py └── trainer ├── custom_dynamic_trainer.py ├── __init__.py3.2 数据准备目前采用三种数据增强策略策略,对于不用的任务可以特定的比例混合。三种数据增强策略包括:(1)添加噪声:对原始样本中的词,以一定的概率(如0.1)替换为”UNK”标签(2)同词性词替换:对原始样本中的所有词,以一定的概率(如0.1)替换为本数据集中随机一个同词性的词(3)N-sampling:从原始样本中,随机选取位置截取长度为m的片段作为新的样本,其中片段的长度m为0到原始样本长度之间的随机值数据增强策略可参考数据增强,我们已准备好了采用上述3种增强策略制作的chnsenticorp的增强数据。3.3 离线蒸馏使用预置的ERNIE 2.0 base模型cd wenxin_appzoo/models_hub bash download_ernie_2.0_base_ch.sh下载预置的原始数据以及增强数据。cd wenxin_appzoo/tasks/data_distillation/distill bash download_data.sh运行以下命令,开始数据蒸馏cd wenxin_appzoo/tasks/data_distillation bash run_distill.sh3.3.1蒸馏过程说明run_distill.sh脚本会进行前述的三步:在任务数据上Fine-tune; 加载Fine-tune好的模型对增强数据进行打分; 使用Student模型进行训练。脚本采用hard-label蒸馏,在第二步中将会直接预测出ERNIE标注的label。run_distill.sh脚本涉及教师和学生模型的json文件,其中:./examples/cls_ernie_fc_ch.json负责教师模型的finetune, ./examples/cls_ernie_fc_ch_infer.json 负责教师模型的预测。 ./examples/cls_cnn_ch.json,负责学生模型的训练。事先构造好的增强数据放在./distill/chnsenticorp/student/unsup_train_aug在脚本的第二步中,使用 ./examples/cls_ernie_fc_ch_infer.json 进行预测:脚本从标准输入获取明文输入,并将打分输出到标准输出。用这种方式对数据增强后的无监督训练预料进行标注。最终的标注结果放在 ./distill/chnsenticorp/student/train/part.1文件中。标注结果包含两列, 第一列为明文,第二列为标注label。在第三步开始student模型的训练,其训练数据放在 distill/chnsenticorp/student/train/ 中,part.0 为原监督数据 part.1 为 ERNIE 标注数据。注:如果用户已经拥有了无监督数据,则可以将无监督数据放入distill/chnsenticorp/student/unsup_train_aug 即可。
  • [技术干货] NLP领域任务如何选择合适预训练模型以及选择合适的方案【规范建议】
    1.常见NLP任务信息抽取:从给定文本中抽取重要的信息,比如时间、地点、人物、事件、原因、结果、数字、日期、货币、专有名词等等。通俗说来,就是要了解谁在什么时候、什么原因、对谁、做了什么事、有什么结果。文本生成:机器像人一样使用自然语言进行表达和写作。依据输入的不同,文本生成技术主要包括数据到文本生成和文本到文本生成。数据到文本生成是指将包含键值对的数据转化为自然语言文本;文本到文本生成对输入文本进行转化和处理从而产生新的文本问答系统:对一个自然语言表达的问题,由问答系统给出一个精准的答案。需要对自然语言查询语句进行某种程度的语义分析,包括实体链接、关系识别,形成逻辑表达式,然后到知识库中查找可能的候选答案并通过一个排序机制找出最佳的答案。对话系统:系统通过一系列的对话,跟用户进行聊天、回答、完成某一项任务。涉及到用户意图理解、通用聊天引擎、问答引擎、对话管理等技术。此外,为了体现上下文相关,要具备多轮对话能力。语音识别和生成:语音识别是将输入计算机的语音符号识别转换成书面语表示。语音生成又称文语转换、语音合成,它是指将书面文本自动转换成对应的语音表征。信息过滤:通过计算机系统自动识别和过滤符合特定条件的文档信息。通常指网络有害信息的自动识别和过滤,主要用于信息安全和防护,网络内容管理等。舆情分析:是指收集和处理海量信息,自动化地对网络舆情进行分析,以实现及时应对网络舆情的目的。信息检索:对大规模的文档进行索引。可简单对文档中的词汇,赋之以不同的权重来建立索引,也可建立更加深层的索引。在查询的时候,对输入的查询表达式比如一个检索词或者一个句子进行分析,然后在索引里面查找匹配的候选文档,再根据一个排序机制把候选文档排序,最后输出排序得分最高的文档。机器翻译:把输入的源语言文本通过自动翻译获得另外一种语言的文本。机器翻译从最早的基于规则的方法到二十年前的基于统计的方法,再到今天的基于神经网络(编码-解码)的方法,逐渐形成了一套比较严谨的方法体系。文本挖掘:包括文本聚类、分类、情感分析以及对挖掘的信息和知识的可视化、交互式的表达界面。目前主流的技术都是基于统计机器学习的。2.如何将业务问题抽象为已得到很好解决的典型问题2.1 明确业务的输入与输出令输入文本用X表示,输出标签用Y表示,则有以下粗略的分类:2.1.1 如果Y表示某一类的概率,或者是一个定长向量,向量中的每个维度是其属于各个类的概率,且概率之和为1,则可抽象为文本多分类问题。a.一般X只有一段文本。如下所示 i.如情感分析等任务。房间 太 小 。 其他 的 都 一般 0b.如果X是2段文本(X1,X2),则是可以抽象为句对分类问题。如下所示 i:如NLI等任务。大家觉得她好看吗 大家觉得跑男好看吗? 0c.如果的每个类别的概率相互独立,即各类概率之和不为1,可抽象为文本多标签分类问题。如下所示 i:如用户评论分类、黄反识别等任务。互联网创业就如选秀 需求与服务就是价值 0 1d. 如果X有多段非文本特征输入,如整型、浮点型类型特征。则可抽象为混合特征的分类问题。如下所示 i:如CTR预估等任务。 CTR预估*CTR预估是推荐中最核心的算法之一。 相关概念: CTR预估:对每次广告的点击情况做出预测,预测用户是点击还是不点击。 CTR预估的影响因素:比如历史点击率、广告位置、时间、用户等 CTR预估相关介绍 推荐算法之4——CTR预估模型2.1.2 如果X是2段文本(X1,X2),Y表示二者的相似度,可抽象为文本匹配问题。如下所示喜欢 打篮球 的 男生 喜欢 什么样 的 女生 爱 打篮球 的 男生 喜欢 什么样 的 女生 1a.如语义相似度、相似问题匹配等任务。b.文本聚类的问题可以通过文本相似度问题进行处理。2.1.3 如果X有一段文本,Y是一个与X等长的序列,可抽象为序列标注问题。如下所示海 钓 比 赛 地 点 在 厦 门 与 金 门 之 间 的 海 域 。 O O O O O O O B-LOC I-LOC O B-LOC I-LOC O O O O O Oa.如分词、POS、NER、词槽挖掘等任务。2.1.4 如果X有一段文本,Y是一个不定长的文本,可抽象为文本生成问题。如下所示Rachel Pike : The science behind a climate headline Khoa học đằng sau một tiêu đề về khí hậua.如机器翻译、文本摘要、标题生成等任务。2.1.5.如果X为一段文本,Y表示文本X作为正常语句出现的概率或者混淆度,则属于语言模型任务。如下所示<s> but some analysts remain sour on the company but some analysts remain sour on the company <e>a.语言模型任务的子问题是基于上(下)文X预测下(上)一个词出现的概率Y,可以理解为一种特殊的文本分类。2.1.6如果X是2段文本(X1,X2),分别表示正文篇章和问题,Y是篇章中的一小段文本,表示对应问题的答案,则可抽象为阅读理解问题。{ "data": [{ "title": "", "paragraphs": [{ "context": "爬行垫根据中间材料的不同可以分为:XPE爬行垫、EPE爬行垫、EVA爬行垫、PVC爬行垫;其中XPE爬行垫、EPE爬行垫都属于PE材料加保鲜膜复合而成,都是无异味的环保材料,但是XPE爬行垫是品质较好的爬行垫,韩国进口爬行垫都是这种爬行垫,而EPE爬行垫是国内厂家为了减低成本,使用EPE(珍珠棉)作为原料生产的一款爬行垫,该材料弹性差,易碎,开孔发泡防水性弱。EVA爬行垫、PVC爬行垫是用EVA或PVC作为原材料与保鲜膜复合的而成的爬行垫,或者把图案转印在原材料上,这两款爬行垫通常有异味,如果是图案转印的爬行垫,油墨外露容易脱落。当时我儿子爬的时候,我们也买了垫子,但是始终有味。最后就没用了,铺的就的薄毯子让他爬。您好,爬行垫一般色彩鲜艳,能吸引宝宝的注意力,当宝宝刚会爬的时候,趴在上面玩,相对比较安全,不存在从床上摔下来的危险。对宝宝的爬行还是很有好处的。还有就是妈妈选择爬行垫时可以选择无害的PE棉,既防潮又隔冷隔热。外有要有一层塑料膜,能隔绝液体进入垫子内部,而且方便清洗。宝宝每次爬行,一定要记得把宝宝的手擦干净。", "qas": [{ "answers": [{ "text": "XPE", "answer_start": 17 }], "id": "DR-single-pre_and_next_paras-181574", "question": "爬行垫什么材质的好" }] }, ..., ] }] }2.1.7 如果Y是以上多种任务的组合,则可以抽象为多标签学习、多任务学习任务。a.如实体关系抽取任务,实体抽取本属于序列标注、关系抽取本属于文本多分类。2.2抽象与拆分任务取舍经验2.2.1优先考虑简单的任务,由易到难循序渐进:a.文本分类、文本匹配、序列标注、文本生成、阅读理解、多任务学习、强化学习、对抗学习等。2.2.2 复杂任务可拆分、化简成简单的子任务a.如实体关系抽取任务,可以拆分为实体识别+关系抽取的pipline进行实现。b.如文本纠错任务,可以拆分出语言模型、统计机器翻译等多种不同子任务构造复杂的pipline进行实现。c.如排序任务,输入X为多段文本,输出Y为每段文本的排序位置,可化简成文本分类问题、文本匹配问题进行处理。2.2.3 有监督学习任务优先于无监督学习任务a.因为有监督学习更可控,更易于应用最前沿的研究成果。文心目前只覆盖有监督、自监督任务。b.比如文本关键词抽取,可以有TFIDF之类的无监督解法,但效果控制较困难,不如转换为文本分类问题。2.2.4 能应用深度学习的任务优于不利用深度学习的任务a.因为深度学习算法效果一般更好,而且可以应用到最前沿的预训练模型。文心目前只采用深度学习算法。b.如果文本聚类,可以有LDA之类的解法,但效果一般不如基于深度学习的语义相似度的文本聚类。3. 明确业务目标与限制条件3.1典型业务目标与限制条件1.预测部署性能a.典型指标:qps 性能指标:QPS、TPS、系统吞吐量理解2.模型效果a.以文本分类为例,典型指标:精确率、准确率、召回率、F1值b.该评估指标应该在训练开始之前基本确定,否则很容易优化偏。3.硬件采购成本a.典型指标:钱b.GPU远贵于CPU,V100贵于P40。4.训练时间成本(GPU,卡,调参,GPU利用率)a.典型指标:每一轮训练所需要的时间。5.数据大小限制a.由于标注成本较高,很多时候是数据量很少又希望有很好的效果。6.开发迭代成本a.搭建环境成本b.迭代效率:往往是最消耗时间的部分。3.2 可供选择的方案选择平台版还是工具版选择GPU还是CPU训练,哪一款硬件,单机还是多机,单卡还是多卡,本地还是集群选择怎样的预制网络是否需要预训练模型选择哪一版本的预训练模型训练数据要多少batch_size、train_log_step、eval_step、save_model_step选多少4.根据业务目标与限制条件选择合适的方案4.1预测部署性能如果要求qps>1000a.不适合直接部署ERNIE预训练模型。b.但可尝试蒸馏策略,模型效果会存在一定损失。如果要求qps>100a.如果预算允许使用GPU,可尝试直接部署ERNIE相关预训练模型,推荐尝试ERNIE-tiny系列模型。b.如果预算只允许使用CPU,可尝试CPU集群部署ERNIE相关预训练模型。3.如果对部署性能要求不高,可随意尝试各种预训练模型。4.性能细节请参考:模型预测与部署——预测性能4.2 模型效果1.一般来说,复杂的网络优于简单的网络,多样的特征优于单一的特征,有预训练模型的效果优于无预训练模型。a.从模型复杂度来看,LSTM、GRU、CNN、BOW的复杂度与效果依次递减,速度依次提升。2.一般来说,在预训练模型中,large优于base优于tiny,新版本的模型优于旧版本的模型,针对具体任务的预训练模型优于通用版预训练模型。3.一般来说,在不欠拟合的情况下,训练数据越多模型效果越好,标注数据的质量越好效果越好。标注数据的质量优于数据的数量。4.不同任务适合的网络结构并不相同,具体任务具体分析。4.3硬件采购成本1.GPU远贵于CPU,常用训练用GPU型号为V100、P40、K40,价格依次递减。2.具体成本可参考百度云服务器-BCC-价格计算器3.如果缺少训练资源,可通过文心平台版的免费共享队列进行训练,资源紧张,且用且珍惜。4.4训练时间成本1.GPU还是CPUa.对于非ERNIE等复杂网络的模型,CPU的训练速度一般也能接受。 如果训练语料过多,数千万条以上,则建议采用CPU集群进行训练。 b.对于ERNIE模型,尽量采用GPU训练,CPU太慢,训练不起来。2.怎么用好GPU a.GPU并行训练能提升训练速度,建议优先把一个节点(trainer)的卡数用完,再考虑多机训练。因为单机多卡的GPU利用率更高,更快。而多机训练数据通信时间成本较高,时间更慢。 b.大原则:GPU利用率越高训练越快。 c.还有一点需要注意,多卡训练时是将不同的数据文件送给不同的卡,所以数据文件的个数要大于卡的个数。数据文件建议拆分细一些,这可以提升数据读取的速度。 d.熟练的同学可以尝试GPU多进程单机多卡训练、混合精度训练等方法,提升训练速度。3.train_log_step、eval_step、save_model_stepa.分别表示每多少步打印训练日志、每多少步评估一次验证集、每多少步保存一次模型。 b.设置不当也会拖慢训练时间 c.一般建议三者依次放大十倍,如:10、100、10004.batch_sizea.设置过小容易收敛慢,设置过大容易超过显存极限直接挂掉 b.如果使用ERNIE,batch_size建议小一些,使用large版本建议更小一些,如果输入语句并不是很长可以适当增加batch_size。 c.如果不使用ERNIE,可以大一些。 d.建议使用默认配置,如果想优化可以采用二分查找4.5 数据大小限制1.一般建议标注语料越多越好。2.非ERNIE模型一般需要几万至几百万条数据能收敛到较好的效果。3.ERNIE模型一般需要几千至几万条数据即可收敛到较好效果。a.一般不用ERNIE训练数百万条以上的数据,因为这会极大延长训练时间,增大资源消耗,而对效果的提升并不明显。自己有足够GPU资源的用户除外。 b.对于基线模型,建议在几万条数据上验证策略有效后再尝试增加数据量。4.如果用ERNIE模型,最少需要多少样本才能取得效果a.对于文本分类与序列标注,一般来说每个标签覆盖的样本数至少要超过200条才能有一定的效果。也就是说如果要进行50类多分类,就总共至少需要1万条样本。一般分类的类别越多任务越复杂。4.6开发迭代成本1.搭建环境成本a.如果只想训练基线模型验证效果,可以考虑使用文心平台版,免去搭建环境的成本。 b.如果需要不断调试、迭代优化模型,而由于平台版集群资源紧张造成迭代周期过长,可以尝试使用工具版。 i:这会付出搭建环境的成本,但长痛不如短痛。2.迭代效率a.使用工具版本地调试成功后再上集群训练能极大提升迭代效率。 b.使用预训练模型能提升迭代效率。 c.基线模型,建议在几万条数据上验证策略,提升迭代效率。验证有效后再尝试增加数据量5. 如何高效训练NLP任务汇总诸多NLP算法同学的建议,我们把高效训练NLP任务的基本流程总结如下:1.分析业务背景、明确任务输入与输出,将其抽象为已得到很好解决的NLP典型任务。 a.对于复杂任务,需要将其拆分成比较简单的子任务 b.文心已覆盖绝大部分NLP典型任务,可参考文心ERNIE工具版-支持任务。2.准备好几千条格式规范的训练数据,快速实现一个NLP模型基线。 a.最快速的方法是通过文心ERNIE平台版或者工具版,采用预制网络和模型无代码训练一个模型基线。 b.本步骤只需要您知道最基本的机器学习概念,划分好训练集、验证集、测试集进行训练即可。 c.评估训练出模型的效果,看是否满足你的业务需求,如果不满足,可考虑进一步优化模型效果。3.优化模型效果: a.各优化手段按照投入产出比排序如下 i:进一步分析你的业务背景和需求,分析基线模型的不足,进行更细致的技术选型。 ii:采用工具版进行本地小数据调试,极大地提升迭代效率。 iii:基于预制网络进行调参。 iv:自定义组网并进行调参。 v:基于核心接口进行高度自定义开发。 vi:直接修改文心核心源码进行开发。 b.每一种优化手段都都可以申请vip服务进行支持。如何自我判断采用哪种文心开发方式 典型的训练方式:无代码训练(不调参),无代码训练(自主调参),自定义组网训练,高阶自定义训练。以上4类训练方式的开发自由度、上手难度、建模的风险、模型效果的上限依次递增,性价比依次递减。本地工具包的调试、迭代效率最高。6总结:需掌握知识6.1 无代码调参建议具备的相关知识1.明确以下概念:有监督学习、标签、特征、训练集、验证集、测试集、逻辑回归、过拟合、欠拟合、激活函数、损失函数、神经网络、学习率、正则化、epoch、batch_size、分词、统计词表。2.知道回归与分类的区别。3.知道如何通过收敛曲线判断过拟合与欠拟合。4.知道准确率、召回率、精确度、F1值、宏平均、微平均的概念与区别。5.知道为什么训练集、验证集、测试集要保证独立同分布。6.知道什么是神经网络.7.知道什么是迁移学习、什么是预训练模型、什么是finetune、迁移学习的优点是什么。6.2 自定义组网建议具备的相关知识1.前提是已经掌握无代码调参建议具备的相关知识2.明确以下概念:Sigmoid函数公式、softmax函数公式、交叉熵公式、前向传播、反向传播、SGD、Adam、词向量、embedding、dropout、BOW、CNN、RNN、GRU、LSTM、迁移学习、3.知道神经网络为什么具有非线性切分能力。4.知道NLP中一维CNN中的卷积核大小、卷积核的个数各指代什么,时序最大池化层如何操作。5.知道NLP中CNN与LSTM的区别,各擅长处理哪类文本问题。6.知道为什么BOW模型无法识别词语顺序关系。7.知道为什么会梯度爆炸,以及如何解决。参考书籍: a.ML特征工程和优化方法 b.周志华《机器学习》前3章 c.迁移学习常见问题 a.CNN常见问题 b.深度学习优化方法 c.花书《深度学习》6-10章 d.《基于深度学习的自然语言处理》整本项目参考链接:cid:link_2
  • [MindX SDK] MindX SDK -- 工业指针型表计读数参考设计案例
    MindX SDK -- 工业指针型表计读数参考设计案例1 案例概述1.1 概要描述在本系统中,目的是基于MindX SDK,在华为云昇腾平台上,开发端到端工业指针型表计读数的参考设计,实现对传统机械式指针表计的检测与自动读数功能,达到功能要求。点击链接可以下载本项目到本地。注:本系统中只使用了两种类型的表盘数据参与训练和测试。我们通过预测的刻度根数来判断表盘类型,第一种表盘的刻度根数为50,第二种表盘的刻度根数为32。因此,目前系统只能实现这两种针表计的检测和自动读数功能。1.2 特性及适用场景在电力能源厂区需要定期监测表计读数,以保证设备正常运行及厂区安全。但厂区分布分散,人工巡检耗时长,无法实时监测表计,且部分工作环境危险导致人工巡检无法触达。针对上述问题,希望通过摄像头拍照后利用计算机智能读数的方式高效地完成此任务。注意事项:本系统中只使用了两种类型的表盘数据参与训练和测试。我们通过预测的刻度根数来判断表盘类型,第一种表盘的刻度根数为50,第二种表盘的刻度根数为32。因此,目前系统只能实现这两种针表计的检测和自动读数功能。本系统要求拍摄图片角度正常,尽可能清晰。如果拍摄图片角度不正常,导致图片模糊,则很难正确读出表数。本系统采用opencv进行图片处理,要求输入文件均为opencv可处理文件。1.3 模型介绍本项目主要使用了两个模型,分别是:用于目标检测的YOLOv5模型(PyTorch)和用于检测指针和刻度的语义分割模型DeepLabv3(pdmodel)。YOLOv5模型参考链接:cid:link_8DeepLabv3模型参考链接:cid:link_41.4 实现流程1、基础环境:Ascend 310、mxVision、Ascend-CANN-toolkit、Ascend Driver2、模型转换:目标检测模型: PyTorch模型转昇腾离线模型:yolov5.onnx --> yolov5.om语义分割模型: pdmodel模型转onnx模型:model.pdmodel --> DeepLabv3.onnx onnx模型转昇腾离线模型:DeepLabv3.onnx --> DeepLabv3.om3、业务流程编排与配置4、yolov5后处理开发5、mxpi_process3插件的后处理开发6、python推理流程代码开发:(1)YOLOv5的pipeline流程图如下: 图1. YOLOv5的pipeline流程图(2)DeepLabv3的pipeline流程图如下: 图2. DeepLabv3的pipeline流程图2 软件方案介绍2.1 项目方案架构介绍本系统识别的流程是:先将输入的图像送入流中解码和缩放大小,使用YOLOv5目标检测模型去检测图片中的表盘,结束流。将目标框裁剪下来,再送入流中解码和缩放大小,用DeepLabv3语义分割模型去得到工业表中的指针和刻度,对语义分割模型预测的结果进行读数后处理,找到指针指向的刻度,根据刻度的间隔和刻度根数计算表盘的读数。表2.1 系统方案中各模块功能:序号子系统功能描述1图像输入调用MindX SDK的appsrc输入图片2图像解码调用MindX SDK的mxpi_imagedecoder输入图片3图像放缩调用MindX SDK的mxpi_imageresize,放缩到1024*576大小4工业表检测调用MindX SDK的mxpi_tensorinfer,使用YOLOv5的检测模型,检测出图片中车辆5保存工业表的图像将YOLOv5检测到的工业表结果保存图片6图像输入调用MindX SDK的appsrc输入检测到的工业表7图像解码调用MindX SDK的mxpi_imagedecoder输入图片8图像放缩调用MindX SDK的mxpi_imageresize,放缩到512*512大小9指针刻度检测调用MindX SDK的mxpi_tensorinfer,使用DeepLabv3语义分割模型,检测图像中的指针与刻度10模型后处理调用MindX mxpi_semanticsegpostprocessor,得到语义分割的结果11读数后处理开发mxpi_process3插件,读出工业表的数字2.2 代码目录结构与说明本工程名称为工业指针型表计读数,工程目录如下图所示:├── build.sh ├── README.md ├── evaluate ├── deeplabv3_val #deeplabv3模型测试精度 ├── seg_evaluate.py ├── yolov5_val #yolov5模型测试精度 ├── det.py #1.使用om模型检测测试数据,将得到的结果保存成yolo格式的txt文件 ├── match.py #3.检测是否有的图像没有目标 ├── yolo2voc.py #2.将得到的检测结果yolo数据格式转换成voc格式 ├── images ├── README_img ├── DeepLabv3_pipeline.png ├── YOLOv5_pipeline.png ├── infer ├── det.py ├── main.py ├── seg.py ├── models ├── deeplabv3 ├── seg_aipp.cfg #deeplabv3的onnx模型转换成om模型的配置文件 ├── yolov5 ├── det_aipp.cfg #yolov5的onnx模型转换成om模型的配置文件 ├── pipeline #pipeline文件 ├── deeplabv3 ├── deeplabv3.cfg ├── deeplabv3.names ├── seg.pipeline ├── yolov5 ├── det.pipeline ├── plugins #开发读数处理插件代码 ├── process3 ├── build.sh ├── CMakeLists.txt ├── Myplugin.cpp ├── Myplugin.h ├── postprocess.cpp ├── postprocess.h3 开发环境准备3.1 环境依赖软件和版本环境依赖软件和版本如下表:软件名称版本ubuntu18.04.1 LTSMindX SDK2.0.4Python3.9.2CANN5.0.4numpy1.23.4opencv-python4.6.0MindX SDK开发套件部分可参考MindX SDK开发套件安装指导3.2 导入基础环境. /usr/local/Ascend/ascend-toolkit/set_env.sh . ${SDK安装路径}/mxVision/set_env.sh4 编译与运行示例步骤如下:步骤1 执行编译编译插件,在项目目录下执行如下命令cd ${MeterReader代码根目录}/plugins/process3 . build.sh步骤2 修改pipeline文件中的参数地址修改"${MeterReader代码根目录}/pipeline/yolov5/det.pipeline"第40行处文件的绝对路径,将pipeline中所需要用到的模型路径改为存放模型的绝对路径地址:40 "modelPath":"${MeterReader代码根目录}/models/yolov5/det.om"修改"${MeterReader代码根目录}/pipeline/deeplabv3/seg.pipeline"第30、38、39行处文件的绝对路径,将pipeline中所需要用到的模型路径、配置文件地址改为绝对路径地址:30 "modelPath":"${MeterReader代码根目录}/models/deeplabv3/seg.om" 38 "postProcessConfigPath":"${MeterReader代码根目录}/pipeline/deeplabv3/deeplabv3.cfg", 39 "labelPath":"${MeterReader代码根目录}/pipeline/deeplabv3/deeplabv3.names",步骤3 运行及输出结果总体运行。输入带有预测表盘的jpg图片,在指定输出目录下输出得到带有预测表盘计数的png图片。cd ${MeterReader代码根目录}/infer python main.py --ifile ${输入图片路径} --odir ${输出图片目录}执行结束后,可在命令行内得到yolo模型得到的表盘文件路径,以及通过后续模型得到的预测表盘度数。并可在设定的${输出图片路径}中查看带有预测表盘计数的图片结果。最后展示的结果图片上用矩形框框出了图片中的表计并且标出了预测的表盘读数。5 指标验证分别对yolo模型与deeplabv3模型进行精度测试。1、YOLOv5模型精度测试步骤一:执行以下命令创建所需要的文件目录cd ${MeterReader代码根目录}/evaluate/yolov5_val/ mkdir -p det_val_data/det_val_voc mkdir -p det_val_data/meter_det mkdir -p det_val_data/det_val_img mkdir -p det_val_data/det_sdk_txt mkdir -p det_val_data/det_sdk_voc步骤二:准备标签文件及推理图片下载YOLOv5表计检测数据集并解压到任意目录后,将数据集目录中"test"和"train"目录下的所有图片汇总拷贝至"${MeterReader代码根目录}/evaluate/yolov5_val/det_val_data/meter_det"目录下。我们提供了样例的模型验证集标签文件以供下载测试。完成下载并解压后,将"data/yolov5/det_val_voc"目录下的文件拷贝至"${MeterReader代码根目录}/evaluate/yolov5_val/det_val_data/det_val_voc"目录下。然后根据拷贝后目录下样例的txt标签文件名称(txt命名格式为:文件名.txt)在"${MeterReader代码根目录}/evaluate/yolov5_val/det_val_data/meter_det"目录下找到对应名称的jpg图片并拷贝至"${MeterReader代码根目录}/evaluate/yolov5_val/det_val_data/det_val_img"目录下。步骤三:预处理数据集执行以下命令后,将在"${MeterReader代码根目录}/evaluate/yolov5_val/det_val_data/det_sdk_txt"目录下生成当前"det.om"模型检测验证集数据的yolo格式结果,并以图片命名的txt格式保存:cd ${MeterReader代码根目录}/evaluate/yolov5_val python det.py再执行以下命令,将上述得到的yolo数据格式转换成voc数据格式,并保存至"${MeterReader代码根目录}/evaluate/yolov5_val/det_val_data/det_sdk_voc"目录下:python yolo2voc.py最后执行以下命令,检测验证集中的数据是否有无目标文件:python match.py注意事项:运行脚本之前需要把det_sdk_txt和det_sdk_voc文件夹下的文件清空。步骤四:精度推理登录并点击下载mAP-master.zip代码压缩包,上传服务器解压后,将代码包中的"main.py"脚本拷贝至"${MeterReader代码根目录}/evaluate/yolov5_val/"目录下,按照以下步骤修改部分代码:修改main.py第47、48、50行处文件路径47 GT_PATH = os.path.join(os.getcwd(), 'det_val_data', 'det_val_voc') 48 DR_PATH = os.path.join(os.getcwd(), 'det_val_data', 'det_sdk_voc') 49 # # if there are no images then no animation can be shown 50 IMG_PATH = os.path.join(os.getcwd(), 'det_val_data', 'det_val_img')修改main.py原第64行代码64 show_animation = False 65 if not args.no_animation:在main.py原第243行添加代码242 def draw_plot_func(dictionary, n_classes, window_title, plot_title, x_label, output_path, to_show, plot_color, true_p_bar): 243 to_show = False使用下面命令运行脚本,计算得到det.om在验证集上的mAP。python main.py经过测试,YOLOv5模型的mAP为100%。2、deeplabv3模型精度测试。执行以下命令,创建所需文件目录:cd ${MeterReader代码根目录}/evaluate/deeplabv3_val/ mkdir seg_val_img cd seg_val_img mkdir seg_test_img mkdir seg_test_img_groundtruth下载语义分割模型验证集voc格式数据,解压至"${MeterReader代码根录}/evaluate/deeplabv3_val/seg_val_img"目录下。然后执行以下命令拷贝数据:cp -r ${MeterReader代码根目录}/evaluate/deeplabv3_val/seg_val_img/meter_seg/meter_seg/images/val/. ${MeterReader代码根目录}/evaluate/deeplabv3_val/seg_val_img/seg_test_img/ cp -r ${MeterReader代码根目录}/evaluate/deeplabv3_val/seg_val_img/meter_seg/meter_seg/annotations/val/. ${MeterReader代码根目录}/evaluate/deeplabv3_val/seg_val_img/seg_test_img_groundtruth/采用Miou指标进行精度评价。使用下面命令运行脚本:cd ${MeterReader代码根目录}/evaluate/deeplabv3_val/ python seg_evaluate.py输出各个图的Miou指标,并求得平均值作为deeplabv3模型的精度指标。经测试,deeplabv3的模型的Miou为67%。6 常见问题6.1 模型转换问题问题描述当图像进入流后,输出到模型的图像格式为yuv,数据类型unit8,但是om模型的时候yolov5需要输入的图像格式为RGB。解决方案在转换模型时必须要在AIPP做色域转换,否则模型输入不正确。6.2 插件权限问题问题描述运行pipeline调用第三步的数值处理插件时报错,提示Check Owner permission failed: Current permission is 7, but required no greater than 6.解决方案将插件的权限调整为默认440(只读)即可chmod 440 "$MX_SDK_HOME/lib/plugins/libmxpi_sampleplugin.so"
  • [技术干货] MindX SDK -- 工业指针型表计读数参考设计案例
    MindX SDK -- 工业指针型表计读数参考设计案例1 案例概述1.1 概要描述在本系统中,目的是基于MindX SDK,在华为云昇腾平台上,开发端到端工业指针型表计读数的参考设计,实现对传统机械式指针表计的检测与自动读数功能,达到功能要求。点击链接可以下载本项目到本地。注:本系统中只使用了两种类型的表盘数据参与训练和测试。我们通过预测的刻度根数来判断表盘类型,第一种表盘的刻度根数为50,第二种表盘的刻度根数为32。因此,目前系统只能实现这两种针表计的检测和自动读数功能。1.2 特性及适用场景在电力能源厂区需要定期监测表计读数,以保证设备正常运行及厂区安全。但厂区分布分散,人工巡检耗时长,无法实时监测表计,且部分工作环境危险导致人工巡检无法触达。针对上述问题,希望通过摄像头拍照后利用计算机智能读数的方式高效地完成此任务。注意事项:本系统中只使用了两种类型的表盘数据参与训练和测试。我们通过预测的刻度根数来判断表盘类型,第一种表盘的刻度根数为50,第二种表盘的刻度根数为32。因此,目前系统只能实现这两种针表计的检测和自动读数功能。本系统要求拍摄图片角度正常,尽可能清晰。如果拍摄图片角度不正常,导致图片模糊,则很难正确读出表数。本系统采用opencv进行图片处理,要求输入文件均为opencv可处理文件。1.3 模型介绍本项目主要使用了两个模型,分别是:用于目标检测的YOLOv5模型(PyTorch)和用于检测指针和刻度的语义分割模型DeepLabv3(pdmodel)。YOLOv5模型参考链接:cid:link_8DeepLabv3模型参考链接:cid:link_41.4 实现流程1、基础环境:Ascend 310、mxVision、Ascend-CANN-toolkit、Ascend Driver2、模型转换:目标检测模型: PyTorch模型转昇腾离线模型:yolov5.onnx --> yolov5.om语义分割模型: pdmodel模型转onnx模型:model.pdmodel --> DeepLabv3.onnx onnx模型转昇腾离线模型:DeepLabv3.onnx --> DeepLabv3.om3、业务流程编排与配置4、yolov5后处理开发5、mxpi_process3插件的后处理开发6、python推理流程代码开发:(1)YOLOv5的pipeline流程图如下: 图1. YOLOv5的pipeline流程图(2)DeepLabv3的pipeline流程图如下: 图2. DeepLabv3的pipeline流程图2 软件方案介绍2.1 项目方案架构介绍本系统识别的流程是:先将输入的图像送入流中解码和缩放大小,使用YOLOv5目标检测模型去检测图片中的表盘,结束流。将目标框裁剪下来,再送入流中解码和缩放大小,用DeepLabv3语义分割模型去得到工业表中的指针和刻度,对语义分割模型预测的结果进行读数后处理,找到指针指向的刻度,根据刻度的间隔和刻度根数计算表盘的读数。表2.1 系统方案中各模块功能:序号子系统功能描述1图像输入调用MindX SDK的appsrc输入图片2图像解码调用MindX SDK的mxpi_imagedecoder输入图片3图像放缩调用MindX SDK的mxpi_imageresize,放缩到1024*576大小4工业表检测调用MindX SDK的mxpi_tensorinfer,使用YOLOv5的检测模型,检测出图片中车辆5保存工业表的图像将YOLOv5检测到的工业表结果保存图片6图像输入调用MindX SDK的appsrc输入检测到的工业表7图像解码调用MindX SDK的mxpi_imagedecoder输入图片8图像放缩调用MindX SDK的mxpi_imageresize,放缩到512*512大小9指针刻度检测调用MindX SDK的mxpi_tensorinfer,使用DeepLabv3语义分割模型,检测图像中的指针与刻度10模型后处理调用MindX mxpi_semanticsegpostprocessor,得到语义分割的结果11读数后处理开发mxpi_process3插件,读出工业表的数字2.2 代码目录结构与说明本工程名称为工业指针型表计读数,工程目录如下图所示:├── build.sh ├── README.md ├── evaluate ├── deeplabv3_val #deeplabv3模型测试精度 ├── seg_evaluate.py ├── yolov5_val #yolov5模型测试精度 ├── det.py #1.使用om模型检测测试数据,将得到的结果保存成yolo格式的txt文件 ├── match.py #3.检测是否有的图像没有目标 ├── yolo2voc.py #2.将得到的检测结果yolo数据格式转换成voc格式 ├── images ├── README_img ├── DeepLabv3_pipeline.png ├── YOLOv5_pipeline.png ├── infer ├── det.py ├── main.py ├── seg.py ├── models ├── deeplabv3 ├── seg_aipp.cfg #deeplabv3的onnx模型转换成om模型的配置文件 ├── yolov5 ├── det_aipp.cfg #yolov5的onnx模型转换成om模型的配置文件 ├── pipeline #pipeline文件 ├── deeplabv3 ├── deeplabv3.cfg ├── deeplabv3.names ├── seg.pipeline ├── yolov5 ├── det.pipeline ├── plugins #开发读数处理插件代码 ├── process3 ├── build.sh ├── CMakeLists.txt ├── Myplugin.cpp ├── Myplugin.h ├── postprocess.cpp ├── postprocess.h3 开发环境准备3.1 环境依赖软件和版本环境依赖软件和版本如下表:软件名称版本ubuntu18.04.1 LTSMindX SDK2.0.4Python3.9.2CANN5.0.4numpy1.23.4opencv-python4.6.0MindX SDK开发套件部分可参考MindX SDK开发套件安装指导3.2 导入基础环境. /usr/local/Ascend/ascend-toolkit/set_env.sh . ${SDK安装路径}/mxVision/set_env.sh4 编译与运行示例步骤如下:步骤1 执行编译编译插件,在项目目录下执行如下命令cd ${MeterReader代码根目录}/plugins/process3 . build.sh步骤2 修改pipeline文件中的参数地址修改"${MeterReader代码根目录}/pipeline/yolov5/det.pipeline"第40行处文件的绝对路径,将pipeline中所需要用到的模型路径改为存放模型的绝对路径地址:40 "modelPath":"${MeterReader代码根目录}/models/yolov5/det.om"修改"${MeterReader代码根目录}/pipeline/deeplabv3/seg.pipeline"第30、38、39行处文件的绝对路径,将pipeline中所需要用到的模型路径、配置文件地址改为绝对路径地址:30 "modelPath":"${MeterReader代码根目录}/models/deeplabv3/seg.om" 38 "postProcessConfigPath":"${MeterReader代码根目录}/pipeline/deeplabv3/deeplabv3.cfg", 39 "labelPath":"${MeterReader代码根目录}/pipeline/deeplabv3/deeplabv3.names",步骤3 运行及输出结果总体运行。输入带有预测表盘的jpg图片,在指定输出目录下输出得到带有预测表盘计数的png图片。cd ${MeterReader代码根目录}/infer python main.py --ifile ${输入图片路径} --odir ${输出图片目录}执行结束后,可在命令行内得到yolo模型得到的表盘文件路径,以及通过后续模型得到的预测表盘度数。并可在设定的${输出图片路径}中查看带有预测表盘计数的图片结果。最后展示的结果图片上用矩形框框出了图片中的表计并且标出了预测的表盘读数。5 指标验证分别对yolo模型与deeplabv3模型进行精度测试。1、YOLOv5模型精度测试步骤一:执行以下命令创建所需要的文件目录cd ${MeterReader代码根目录}/evaluate/yolov5_val/ mkdir -p det_val_data/det_val_voc mkdir -p det_val_data/meter_det mkdir -p det_val_data/det_val_img mkdir -p det_val_data/det_sdk_txt mkdir -p det_val_data/det_sdk_voc步骤二:准备标签文件及推理图片下载YOLOv5表计检测数据集并解压到任意目录后,将数据集目录中"test"和"train"目录下的所有图片汇总拷贝至"${MeterReader代码根目录}/evaluate/yolov5_val/det_val_data/meter_det"目录下。我们提供了样例的模型验证集标签文件以供下载测试。完成下载并解压后,将"data/yolov5/det_val_voc"目录下的文件拷贝至"${MeterReader代码根目录}/evaluate/yolov5_val/det_val_data/det_val_voc"目录下。然后根据拷贝后目录下样例的txt标签文件名称(txt命名格式为:文件名.txt)在"${MeterReader代码根目录}/evaluate/yolov5_val/det_val_data/meter_det"目录下找到对应名称的jpg图片并拷贝至"${MeterReader代码根目录}/evaluate/yolov5_val/det_val_data/det_val_img"目录下。步骤三:预处理数据集执行以下命令后,将在"${MeterReader代码根目录}/evaluate/yolov5_val/det_val_data/det_sdk_txt"目录下生成当前"det.om"模型检测验证集数据的yolo格式结果,并以图片命名的txt格式保存:cd ${MeterReader代码根目录}/evaluate/yolov5_val python det.py再执行以下命令,将上述得到的yolo数据格式转换成voc数据格式,并保存至"${MeterReader代码根目录}/evaluate/yolov5_val/det_val_data/det_sdk_voc"目录下:python yolo2voc.py最后执行以下命令,检测验证集中的数据是否有无目标文件:python match.py注意事项:运行脚本之前需要把det_sdk_txt和det_sdk_voc文件夹下的文件清空。步骤四:精度推理登录并点击下载mAP-master.zip代码压缩包,上传服务器解压后,将代码包中的"main.py"脚本拷贝至"${MeterReader代码根目录}/evaluate/yolov5_val/"目录下,按照以下步骤修改部分代码:修改main.py第47、48、50行处文件路径47 GT_PATH = os.path.join(os.getcwd(), 'det_val_data', 'det_val_voc') 48 DR_PATH = os.path.join(os.getcwd(), 'det_val_data', 'det_sdk_voc') 49 # # if there are no images then no animation can be shown 50 IMG_PATH = os.path.join(os.getcwd(), 'det_val_data', 'det_val_img')修改main.py原第64行代码64 show_animation = False 65 if not args.no_animation:在main.py原第243行添加代码242 def draw_plot_func(dictionary, n_classes, window_title, plot_title, x_label, output_path, to_show, plot_color, true_p_bar): 243 to_show = False使用下面命令运行脚本,计算得到det.om在验证集上的mAP。python main.py经过测试,YOLOv5模型的mAP为100%。2、deeplabv3模型精度测试。执行以下命令,创建所需文件目录:cd ${MeterReader代码根目录}/evaluate/deeplabv3_val/ mkdir seg_val_img cd seg_val_img mkdir seg_test_img mkdir seg_test_img_groundtruth下载语义分割模型验证集voc格式数据,解压至"${MeterReader代码根录}/evaluate/deeplabv3_val/seg_val_img"目录下。然后执行以下命令拷贝数据:cp -r ${MeterReader代码根目录}/evaluate/deeplabv3_val/seg_val_img/meter_seg/meter_seg/images/val/. ${MeterReader代码根目录}/evaluate/deeplabv3_val/seg_val_img/seg_test_img/ cp -r ${MeterReader代码根目录}/evaluate/deeplabv3_val/seg_val_img/meter_seg/meter_seg/annotations/val/. ${MeterReader代码根目录}/evaluate/deeplabv3_val/seg_val_img/seg_test_img_groundtruth/采用Miou指标进行精度评价。使用下面命令运行脚本:cd ${MeterReader代码根目录}/evaluate/deeplabv3_val/ python seg_evaluate.py输出各个图的Miou指标,并求得平均值作为deeplabv3模型的精度指标。经测试,deeplabv3的模型的Miou为67%。6 常见问题6.1 模型转换问题问题描述当图像进入流后,输出到模型的图像格式为yuv,数据类型unit8,但是om模型的时候yolov5需要输入的图像格式为RGB。解决方案在转换模型时必须要在AIPP做色域转换,否则模型输入不正确。6.2 插件权限问题问题描述运行pipeline调用第三步的数值处理插件时报错,提示Check Owner permission failed: Current permission is 7, but required no greater than 6.解决方案将插件的权限调整为默认440(只读)即可chmod 440 "$MX_SDK_HOME/lib/plugins/libmxpi_sampleplugin.so"
  • [技术干货] UIE模型实战实体抽取任务【打车数据、快递单】
    项目连接:可以直接fork使用 Paddlenlp之UIE模型实战实体抽取任务【打车数据、快递单】0.背景介绍本项目将演示如何通过小样本样本进行模型微调,快速且准确抽取快递单中的目的地、出发地、时间、打车费用等内容,形成结构化信息。辅助物流行业从业者进行有效信息的提取,从而降低客户填单的成本。数据集情况: waybill.jsonl文件是快递单信息数据集:{"id": 57, "text": "昌胜远黑龙江省哈尔滨市南岗区宽桥街28号18618391296", "relations": [], "entities": [{"id": 111, "start_offset": 0, "end_offset": 3, "label": "姓名"}, {"id": 112, "start_offset": 3, "end_offset": 7, "label": "省份"}, {"id": 113, "start_offset": 7, "end_offset": 11, "label": "城市"}, {"id": 114, "start_offset": 11, "end_offset": 14, "label": "县区"}, {"id": 115, "start_offset": 14, "end_offset": 20, "label": "详细地址"}, {"id": 116, "start_offset": 20, "end_offset": 31, "label": "电话"}]} {"id": 58, "text": "易颖18500308469山东省烟台市莱阳市富水南路1号", "relations": [], "entities": [{"id": 118, "start_offset": 0, "end_offset": 2, "label": "姓名"}, {"id": 119, "start_offset": 2, "end_offset": 13, "label": "电话"}, {"id": 120, "start_offset": 13, "end_offset": 16, "label": "省份"}, {"id": 121, "start_offset": 16, "end_offset": 19, "label": "城市"}, {"id": 122, "start_offset": 19, "end_offset": 22, "label": "县区"}, {"id": 123, "start_offset": 22, "end_offset": 28, "label": "详细地址"}]}doccano_ext.jsonl是打车数据集:{"id": 1, "text": "昨天晚上十点加班打车回家58元", "relations": [], "entities": [{"id": 0, "start_offset": 0, "end_offset": 6, "label": "时间"}, {"id": 1, "start_offset": 11, "end_offset": 12, "label": "目的地"}, {"id": 2, "start_offset": 12, "end_offset": 14, "label": "费用"}]} {"id": 2, "text": "三月三号早上12点46加班,到公司54", "relations": [], "entities": [{"id": 3, "start_offset": 0, "end_offset": 11, "label": "时间"}, {"id": 4, "start_offset": 15, "end_offset": 17, "label": "目的地"}, {"id": 5, "start_offset": 17, "end_offset": 19, "label": "费用"}]} {"id": 3, "text": "8月31号十一点零四工作加班五十块钱", "relations": [], "entities": [{"id": 6, "start_offset": 0, "end_offset": 10, "label": "时间"}, {"id": 7, "start_offset": 14, "end_offset": 16, "label": "费用"}]} {"id": 4, "text": "5月17号晚上10点35分加班打车回家,36块五", "relations": [], "entities": [{"id": 8, "start_offset": 0, "end_offset": 13, "label": "时间"}, {"id": 1, "start_offset": 18, "end_offset": 19, "label": "目的地"}, {"id": 9, "start_offset": 20, "end_offset": 24, "label": "费用"}]} {"id": 5, "text": "2009年1月份通讯费一百元", "relations": [], "entities": [{"id": 10, "start_offset": 0, "end_offset": 7, "label": "时间"}, {"id": 11, "start_offset": 11, "end_offset": 13, "label": "费用"}]}结果展示预览输入:城市内交通费7月5日金额114广州至佛山 从百度大厦到龙泽苑东区打车费二十元 上海虹桥高铁到杭州时间是9月24日费用是73元 上周末坐动车从北京到上海花费五十块五毛 昨天北京飞上海话费一百元输出:{"出发地": [{"text": "广州", "start": 15, "end": 17, "probability": 0.9073772252165782}], "目的地": [{"text": "佛山", "start": 18, "end": 20, "probability": 0.9927365183877761}], "时间": [{"text": "7月5日", "start": 6, "end": 10, "probability": 0.9978010396512218}]} {"出发地": [{"text": "百度大厦", "start": 1, "end": 5, "probability": 0.968825147409472}], "目的地": [{"text": "龙泽苑东区", "start": 6, "end": 11, "probability": 0.9877913072493669}]} {"目的地": [{"text": "杭州", "start": 7, "end": 9, "probability": 0.9929172180094881}], "时间": [{"text": "9月24日", "start": 12, "end": 17, "probability": 0.9953342057701597}]} {#"出发地": [{"text": "北京", "start": 7, "end": 9, "probability": 0.973048366717471}], "目的地": [{"text": "上海", "start": 10, "end": 12, "probability": 0.988486130309397}], "时间": [{"text": "上周末", "start": 0, "end": 3, "probability": 0.9977407699595275}]} {"出发地": [{"text": "北京", "start": 2, "end": 4, "probability": 0.974188953533556}], "目的地": [{"text": "上海", "start": 5, "end": 7, "probability": 0.9928200521486445}], "时间": [{"text": "昨天", "start": 0, "end": 2, "probability": 0.9731559534465504}]}1.数据集加载(快递单数据、打车数据)doccano_file: 从doccano导出的数据标注文件。save_dir: 训练数据的保存目录,默认存储在data目录下。negative_ratio: 最大负例比例,该参数只对抽取类型任务有效,适当构造负例可提升模型效果。负例数量和实际的标签数量有关,最大负例数量 = negative_ratio * 正例数量。该参数只对训练集有效,默认为5。为了保证评估指标的准确性,验证集和测试集默认构造全负例。splits: 划分数据集时训练集、验证集所占的比例。默认为[0.8, 0.1, 0.1]表示按照8:1:1的比例将数据划分为训练集、验证集和测试集。task_type: 选择任务类型,可选有抽取和分类两种类型的任务。options: 指定分类任务的类别标签,该参数只对分类类型任务有效。默认为["正向", "负向"]。prompt_prefix: 声明分类任务的prompt前缀信息,该参数只对分类类型任务有效。默认为"情感倾向"。is_shuffle: 是否对数据集进行随机打散,默认为True。seed: 随机种子,默认为1000.*separator: 实体类别/评价维度与分类标签的分隔符,该参数只对实体/评价维度级分类任务有效。默认为"##"。!python doccano.py \ --doccano_file ./data/doccano_ext.jsonl \ --task_type 'ext' \ --save_dir ./data \ --splits 0.8 0.1 0.1 \ --negative_ratio 5[2022-07-14 11:34:26,474] [ INFO] - Converting doccano data... 100%|████████████████████████████████████████| 40/40 [00:00<00:00, 42560.16it/s] [2022-07-14 11:34:26,477] [ INFO] - Adding negative samples for first stage prompt... 100%|███████████████████████████████████████| 40/40 [00:00<00:00, 161009.75it/s] [2022-07-14 11:34:26,478] [ INFO] - Converting doccano data... 100%|██████████████████████████████████████████| 5/5 [00:00<00:00, 21754.69it/s] [2022-07-14 11:34:26,479] [ INFO] - Adding negative samples for first stage prompt... 100%|██████████████████████████████████████████| 5/5 [00:00<00:00, 44057.82it/s] [2022-07-14 11:34:26,479] [ INFO] - Converting doccano data... 100%|██████████████████████████████████████████| 5/5 [00:00<00:00, 26181.67it/s] [2022-07-14 11:34:26,480] [ INFO] - Adding negative samples for first stage prompt... 100%|██████████████████████████████████████████| 5/5 [00:00<00:00, 45689.59it/s] [2022-07-14 11:34:26,482] [ INFO] - Save 160 examples to ./data/train.txt. [2022-07-14 11:34:26,482] [ INFO] - Save 20 examples to ./data/dev.txt. [2022-07-14 11:34:26,482] [ INFO] - Save 20 examples to ./data/test.txt. [2022-07-14 11:34:26,482] [ INFO] - Finished! It takes 0.01 seconds输出部分展示:{"content": "上海到北京机票1320元", "result_list": [{"text": "上海", "start": 0, "end": 2}], "prompt": "出发地"} {"content": "上海到北京机票1320元", "result_list": [{"text": "北京", "start": 3, "end": 5}], "prompt": "目的地"} {"content": "上海到北京机票1320元", "result_list": [{"text": "1320", "start": 7, "end": 11}], "prompt": "费用"} {"content": "上海虹桥到杭州东站高铁g7555共73元时间是10月14日", "result_list": [{"text": "上海虹桥", "start": 0, "end": 4}], "prompt": "出发地"} {"content": "上海虹桥到杭州东站高铁g7555共73元时间是10月14日", "result_list": [{"text": "杭州东站", "start": 5, "end": 9}], "prompt": "目的地"} {"content": "上海虹桥到杭州东站高铁g7555共73元时间是10月14日", "result_list": [{"text": "73", "start": 17, "end": 19}], "prompt": "费用"} {"content": "上海虹桥到杭州东站高铁g7555共73元时间是10月14日", "result_list": [{"text": "10月14日", "start": 23, "end": 29}], "prompt": "时间"} {"content": "昨天晚上十点加班打车回家58元", "result_list": [{"text": "昨天晚上十点", "start": 0, "end": 6}], "prompt": "时间"} {"content": "昨天晚上十点加班打车回家58元", "result_list": [{"text": "家", "start": 11, "end": 12}], "prompt": "目的地"} {"content": "昨天晚上十点加班打车回家58元", "result_list": [{"text": "58", "start": 12, "end": 14}], "prompt": "费用"} {"content": "2月20号从南山到光明二十元", "result_list": [{"text": "2月20号", "start": 0, "end": 5}], "prompt": "时间"}2.模型训练!python finetune.py \ --train_path "./data/train.txt" \ --dev_path "./data/dev.txt" \ --save_dir "./checkpoint" \ --learning_rate 1e-5 \ --batch_size 8 \ --max_seq_len 512 \ --num_epochs 100 \ --model "uie-base" \ --seed 1000 \ --logging_steps 10 \ --valid_steps 50 \ --device "gpu"部分训练效果展示:**具体输出已折叠** [2022-07-12 15:09:47,643] [ INFO] - global step 250, epoch: 13, loss: 0.00045, speed: 3.90 step/s [2022-07-12 15:09:47,910] [ INFO] - Evaluation precision: 1.00000, recall: 1.00000, F1: 1.00000 [2022-07-12 15:09:50,399] [ INFO] - global step 260, epoch: 13, loss: 0.00043, speed: 4.02 step/s [2022-07-12 15:09:52,966] [ INFO] - global step 270, epoch: 14, loss: 0.00042, speed: 3.90 step/s [2022-07-12 15:09:55,464] [ INFO] - global step 280, epoch: 14, loss: 0.00040, speed: 4.00 step/s [2022-07-12 15:09:58,028] [ INFO] - global step 290, epoch: 15, loss: 0.00039, speed: 3.90 step/s [2022-07-12 15:10:00,516] [ INFO] - global step 300, epoch: 15, loss: 0.00038, speed: 4.02 step/s [2022-07-12 15:10:00,781] [ INFO] - Evaluation precision: 1.00000, recall: 1.00000, F1: 1.00000 [2022-07-12 15:10:03,348] [ INFO] - global step 310, epoch: 16, loss: 0.00036, speed: 3.90 step/s [2022-07-12 15:10:05,836] [ INFO] - global step 320, epoch: 16, loss: 0.00035, speed: 4.02 step/s [2022-07-12 15:10:08,393] [ INFO] - global step 330, epoch: 17, loss: 0.00034, speed: 3.91 step/s [2022-07-12 15:10:10,888] [ INFO] - global step 340, epoch: 17, loss: 0.00033, speed: 4.01 step/s 推荐使用GPU环境,否则可能会内存溢出。CPU环境下,可以修改model为uie-tiny,适当调下batch_size。 增加准确率的话:--num_epochs 设置大点多训练训练 可配置参数说明: **train_path:** 训练集文件路径。 **dev_path:** 验证集文件路径。 **save_dir:** 模型存储路径,默认为./checkpoint。 **learning_rate:** 学习率,默认为1e-5。 **batch_size:** 批处理大小,请结合显存情况进行调整,若出现显存不足,请适当调低这一参数,默认为16。 **max_seq_len:** 文本最大切分长度,输入超过最大长度时会对输入文本进行自动切分,默认为512。 **num_epochs:** 训练轮数,默认为100。 **model** 选择模型,程序会基于选择的模型进行模型微调,可选有uie-base和uie-tiny,默认为uie-base。 **seed:** 随机种子,默认为1000. **logging_steps:** 日志打印的间隔steps数,默认10。 **valid_steps:** evaluate的间隔steps数,默认100。 **device:** 选用什么设备进行训练,可选cpu或gpu。3模型评估!python evaluate.py \ --model_path ./checkpoint/model_best \ --test_path ./data/test.txt \ --batch_size 16 \ --max_seq_len 512[2022-07-11 13:41:23,831] [ INFO] - ----------------------------- [2022-07-11 13:41:23,831] [ INFO] - Class Name: all_classes [2022-07-11 13:41:23,832] [ INFO] - Evaluation Precision: 1.00000 | Recall: 1.00000 | F1: 1.00000 [2022-07-11 13:41:35,024] [ INFO] - ----------------------------- [2022-07-11 13:41:35,024] [ INFO] - Class Name: 出发地 [2022-07-11 13:41:35,024] [ INFO] - Evaluation Precision: 1.00000 | Recall: 1.00000 | F1: 1.00000 [2022-07-11 13:41:35,139] [ INFO] - ----------------------------- [2022-07-11 13:41:35,139] [ INFO] - Class Name: 目的地 [2022-07-11 13:41:35,139] [ INFO] - Evaluation Precision: 1.00000 | Recall: 1.00000 | F1: 1.00000 [2022-07-11 13:41:35,246] [ INFO] - ----------------------------- [2022-07-11 13:41:35,246] [ INFO] - Class Name: 费用 [2022-07-11 13:41:35,246] [ INFO] - Evaluation Precision: 1.00000 | Recall: 1.00000 | F1: 1.00000 [2022-07-11 13:41:35,313] [ INFO] - ----------------------------- [2022-07-11 13:41:35,313] [ INFO] - Class Name: 时间 [2022-07-11 13:41:35,313] [ INFO] - Evaluation Precision: 1.00000 | Recall: 1.00000 | F1: 1.00000model_path: 进行评估的模型文件夹路径,路径下需包含模型权重文件model_state.pdparams及配置文件model_config.json。test_path: 进行评估的测试集文件。batch_size: 批处理大小,请结合机器情况进行调整,默认为16。max_seq_len: 文本最大切分长度,输入超过最大长度时会对输入文本进行自动切分,默认为512。model: 选择所使用的模型,可选有uie-base, uie-medium, uie-mini, uie-micro和uie-nano,默认为uie-base。debug: 是否开启debug模式对每个正例类别分别进行评估,该模式仅用于模型调试,默认关闭。4 结果预测from pprint import pprint import json from paddlenlp import Taskflow def openreadtxt(file_name): data = [] file = open(file_name,'r',encoding='UTF-8') #打开文件 file_data = file.readlines() #读取所有行 for row in file_data: data.append(row) #将每行数据插入data中 return data data_input=openreadtxt('./input/nlp.txt') schema = ['出发地', '目的地','时间'] few_ie = Taskflow('information_extraction', schema=schema, batch_size=1,task_path='./checkpoint/model_best') results=few_ie(data_input) with open("./output/test.txt", "w+",encoding='UTF-8') as f: #a : 写入文件,若文件不存在则会先创建再写入,但不会覆盖原文件,而是追加在文件末尾 for result in results: line = json.dumps(result, ensure_ascii=False) #对中文默认使用的ascii编码.想输出真正的中文需要指定ensure_ascii=False f.write(line + "\n") print("数据结果已导出")输入文件展示:城市内交通费7月5日金额114广州至佛山 从百度大厦到龙泽苑东区打车费二十元 上海虹桥高铁到杭州时间是9月24日费用是73元 上周末坐动车从北京到上海花费五十块五毛 昨天北京飞上海话费一百元输出展示:{"出发地": [{"text": "广州", "start": 15, "end": 17, "probability": 0.9073772252165782}], "目的地": [{"text": "佛山", "start": 18, "end": 20, "probability": 0.9927365183877761}], "时间": [{"text": "7月5日", "start": 6, "end": 10, "probability": 0.9978010396512218}]} {"出发地": [{"text": "百度大厦", "start": 1, "end": 5, "probability": 0.968825147409472}], "目的地": [{"text": "龙泽苑东区", "start": 6, "end": 11, "probability": 0.9877913072493669}]} {"目的地": [{"text": "杭州", "start": 7, "end": 9, "probability": 0.9929172180094881}], "时间": [{"text": "9月24日", "start": 12, "end": 17, "probability": 0.9953342057701597}]} {"出发地": [{"text": "北京", "start": 7, "end": 9, "probability": 0.973048366717471}], "目的地": [{"text": "上海", "start": 10, "end": 12, "probability": 0.988486130309397}], "时间": [{"text": "上周末", "start": 0, "end": 3, "probability": 0.9977407699595275}]} {"出发地": [{"text": "北京", "start": 2, "end": 4, "probability": 0.974188953533556}], "目的地": [{"text": "上海", "start": 5, "end": 7, "probability": 0.9928200521486445}], "时间": [{"text": "昨天", "start": 0, "end": 2, "probability": 0.9731559534465504}]}5.可视化显示visualDL详细文档可以参考: cid:link_1 有详细讲解,具体实现参考代码,核心是:添加一个初始化记录器下面是结果展示:6.小技巧:获取paddle开源数据集数据集网站:cid:link_0数据集名称 简介 调用方法CoLA 单句分类任务,二分类,判断句子是否合法 paddlenlp.datasets.load_dataset('glue','cola')SST-2 单句分类任务,二分类,判断句子情感极性paddlenlp.datasets.load_dataset('glue','sst-2')MRPC 句对匹配任务,二分类,判断句子对是否是相同意思 paddlenlp.datasets.load_dataset('glue','mrpc')STSB 计算句子对相似性,分数为1~5 paddlenlp.datasets.load_dataset('glue','sts-b') QQP 判定句子对是否等效,等效、不等效两种情况,二分类任务 paddlenlp.datasets.load_dataset('glue','qqp')MNLI 句子对,一个前提,一个是假设。前提和假设的关系有三种情况:蕴含(entailment),矛盾(contradiction),中立(neutral)。句子对三分类问题 paddlenlp.datasets.load_dataset('glue','mnli')QNLI 判断问题(question)和句子(sentence)是否蕴含,蕴含和不蕴含,二分类 paddlenlp.datasets.load_dataset('glue','qnli')RTE 判断句对是否蕴含,句子1和句子2是否互为蕴含,二分类任务 paddlenlp.datasets.load_dataset('glue','rte')WNLI 判断句子对是否相关,相关或不相关,二分类任务 paddlenlp.datasets.load_dataset('glue','wnli')LCQMC A Large-scale Chinese Question Matching Corpus 语义匹配数据集 paddlenlp.datasets.load_dataset('lcqmc')通过paddlenlp提供的api调用,可以很方便实现数据加载,当然你想要把数据下载到本地,可以参考我下面的输出就可以保存数据了。#加载中文评论情感分析语料数据集ChnSentiCorp from paddlenlp.datasets import load_dataset train_ds, dev_ds, test_ds = load_dataset("chnsenticorp", splits=["train", "dev", "test"]) with open("./output/test2.txt", "w+",encoding='UTF-8') as f: #a : 写入文件,若文件不存在则会先创建再写入,但不会覆盖原文件,而是追加在文件末尾 for result in test_ds: line = json.dumps(result, ensure_ascii=False) #对中文默认使用的ascii编码.想输出真正的中文需要指定ensure_ascii=False f.write(line + "\n")7 总结UIE(Universal Information Extraction):Yaojie Lu等人在ACL-2022中提出了通用信息抽取统一框架UIE。该框架实现了实体抽取、关系抽取、事件抽取、情感分析等任务的统一建模,并使得不同任务间具备良好的迁移和泛化能力。PaddleNLP借鉴该论文的方法,基于ERNIE 3.0知识增强预训练模型,训练并开源了首个中文通用信息抽取模型UIE。该模型可以支持不限定行业领域和抽取目标的关键信息抽取,实现零样本快速冷启动,并具备优秀的小样本微调能力,快速适配特定的抽取目标。UIE的优势使用简单: 用户可以使用自然语言自定义抽取目标,无需训练即可统一抽取输入文本中的对应信息。实现开箱即用,并满足各类信息抽取需求。降本增效: 以往的信息抽取技术需要大量标注数据才能保证信息抽取的效果,为了提高开发过程中的开发效率,减少不必要的重复工作时间,开放域信息抽取可以实现零样本(zero-shot)或者少样本(few-shot)抽取,大幅度降低标注数据依赖,在降低成本的同时,还提升了效果。效果领先: 开放域信息抽取在多种场景,多种任务上,均有不俗的表现。本人本次主要通过实体抽取这个案例分享给大家,主要对开源的paddlenlp的案例进行了细化,比如在结果可视化方面以及结果输入输出的增加,使demo项目更佳完善。当然标注问题是所有问题的痛点,可以参考我的博客来解决这个问题本人博客:cid:link_3
  • 使用MindStudio完成RARE_Resnet34_vd模型开发
    目录一、介绍... 21.1 模型介绍... 21.2 MindStudio介绍... 21.3 MindStudio安装... 3二、MindStudio工程创建... 31.1 新建模板工程... 31.2 工程配置... 9三、获取项目代码... 133.1 工程代码... 133.2 模型代码获取... 133.3 推理工具获取... 143.4 远程同步代码... 143.5 配置远程环境... 15四、模型转换... 164.1 转onnx模型... 164.2 转om模型... 20五、图像文字识别测试... 25六、总结... 28一、介绍本文主要给大家介绍使用MindStudio开发工具进行英文识别模型RARE_Resnet34_vd离线推理的开发过程,主要内容包括环境安装创建、模型获取转换以及离线推理三个部分。1.1 模型介绍识别自然图像中的文字仍是一个充满挑战的任务,RARE(Robust text recognizer with Automatic REctification)是一个对于不规则的文字具有鲁棒性的识别模型。该模型包括一个空间变换网络Spatial Transformer Network (STN)和一个序列识别网络Sequence Recognition Network (SRN),两个网络同时用BP算法进行训练。在推理过程中一张图像先通过Thin-Plate-Spline (TPS)变换成一个正规的、更易读的图像,此变换可以矫正不同类型的不规则文本,包括透射变换和弯曲的文本。TPS变换由一组基准点(fiducial points)表示,坐标通过卷积神经网络回归得到。然后再放入SRN中进行识别。SRN使用序列识别的attention-based方法,包含一个编码器和一个解码器。编码器产生一个特征表示序列,即序列的特征向量;解码器根据输入序列循环地产生一个字符序列。这个系统是一个端到端的文本识别系统,在训练过程中也不需要额外标记字符串的关键点、字符位置等。更详细的模型介绍大家可以参考原论文:cid:link_41.2 MindStudio介绍MindStudio是一套基于华为昇腾AI处理器开发的AI全栈开发平台,包括基于芯片的算子开发、以及自定义算子开发,同时还包括网络层的网络移植、优化和分析,另外在业务引擎层提供了一套可视化的AI引擎拖拽式编程服务,极大的降低了AI引擎的开发门槛。MindStudio功能框架如下图所示,目前含有的工具链包括:模型转换工具、模型训练工具、自定义算子开发工具、应用开发工具、工程管理工具、编译工具、流程编排工具、精度比对工具、日志管理工具、性能分析工具、设备管理工具、开发工具包(Ascend Development Kit,ADK)等多种工具。离线推理开发主要使用的是模型转换功能,将训练好的第三方网络模型可以直接通过离线模型工具导入并转换成离线模型,并可一键式自动生成模型接口,方便开发者基于模型接口进行编程,同时也提供了离线模型的可视化功能。1.3 MindStudio安装MindStudio的安装包可以通过官方网站获取,链接如下:cid:link_3安装方法可以参考用户指导手册中的安装部分,链接如下:cid:link_0二、MindStudio工程创建1.1 新建模板工程首次打开软件会指示是否导入配置,下图所示,选择不导入配置,点击OK进入MindStudio欢迎界面。欢迎界面如下图所示,点击Customize标签,可以修改相关用户设置,如将主题修改为IntelliJ Light。在MindStudio欢迎界面点击Projects标签,如下图所示,点击New Project进入创建工程流程。如下图所示,在工程创建选择Ascend App,点击Change。进入远程CANN配置界面,如下图所示,点击+号。进入下图SSH配置界面,点击+号创建新的SSH配置,输入SSH信息后点击OK返回远程CANN配置界面。如下图所示,点击文件夹图标,选择远程CANN安装路径,点击OK和Finish。开始同步远程CANN环境,如下图所示。 同步完成后返回新建工程界面,如下图所示,选择ACL Project(Python),点击Next。如下图所示,选择工程名称和路径,点击Finish完成工程创建,自动进入工程界面。下图所示,点击Close关闭提示信息,完成工程创建。1.2 工程配置首先配置SDK,如下图所示,点击File,选择Project Structure,进入工程结构界面。如下图所示,选择SDKs标签,点击+号,选择Add Python SDK,入在Python解释器选择界面。如下图所示,选择SSH Interpreter,然后选择Deploy系统会自动识别Python信息,点击OK确认,然后返回工程结构界面。如下图所示,选择Project,在SDK按钮下选择Remote Python,点击OK完成配置。配置Deployment,如下图所示,点击Tools->Deployment->Configuration,进入Deployment配置界面,如下图所示,点击Mappings,选择远程映射目录,点击OK。最后激活远程终端,如下图所示,点击Tools->Start SSH session。如下图所示,选择远程服务器,启动Remote Terminal。三、获取项目代码3.1 工程代码需要在工程目录中开发工程代码如下图所示,其中:inv_delta_C.npy:常量数据RARE_Resnet34_vd.patch:模型补丁文件RARE_Resnet34_vd_infer.py:模型推理脚本requirements.txt:工程依赖信息3.2 模型代码获取在本地终端窗口通过git命令获取模型代码,命令如下:git clone -b release/2.5 https://github.com/PaddlePaddle/PaddleOCR.gitcd PaddleOCRgit reset --hard a40f64a70b8d290b74557a41d869c0f9ce4959d5git apply ../RARE_Resnet34_vd.patchrm .\applications\cd ..cp .\inv_delta_C.npy .\PaddleOCR\tools\获取之后模型代码结构如下图所示。3.3 推理工具获取推理工具使用的是 ais_infer,该工具的获取、编译、安装说明链接为:https://gitee.com/ascend/tools/tree/master/ais-bench_workload/tool/ais_infer下载后将 ais_infer 工具代码放到本地工程路径下。3.4 远程同步代码工程所有代码如下图所示,点击Tools->Deployment->Upload to上传代码。如下图所示,选择远程服务器开始远程同步。同步完成后如下图所示。3.5 配置远程环境首先安装工程依赖,在远程终端窗口输入安装命令如下图所示。然后进入到ais_infer编译目录,执行编译安装命令:cd ais_infer/backend/pip3 wheel ./pip3 install aclruntime-0.0.1-cp37-cp37m-linux_x86_64.whlcd ../../四、模型转换4.1 转onnx模型首先获取模型训练权重,链接为:https://paddleocr.bj.bcebos.com/dygraph_v2.0/en/rec_r34_vd_tps_bilstm_att_v2.0_train.tar本地下载训练权重后,解压到RARE_Resnet34_vd\checkpoint目录下,并上传到远程服务器,如下图所示。然后需要将训练权重转为推理权重,创建可执行命令,如下图所示,点击Add Configuration。如下图所示,点击+号,选择Python。如下图所示,配置可执行命令参数,包括:Name:执行命令名称Script path:执行命令脚本Parameters:执行命令参数,该命令需要配置的参数为:-c /home/ccx/MindstudioProjects/RARE_Resnet34_vd/PaddleOCR/configs/rec/rec_r34_vd_tps_bilstm_att.yml -o Global.pretrained_model=/home/ccx/MindstudioProjects/RARE_Resnet34_vd/checkpoint/rec_r34_vd_tps_bilstm_att_v2.0_train/best_accuracy Global.save_inference_dir=/home/ccx/MindstudioProjects/inference/rec_rare其中-c表示模型配置文件,-o表示用户可选参数,包括Global.pretrained_model表示训练模型,Global.save_inference_dir表示推理模型保存路径。Use specified interpreter:选择Python解释器。配置完以上命令后点击OK完成。如下图所示,点击执行按钮开始执行命令。模型转换成功如下图所示。最后将推理权重转为onnx模型,在远程终端窗口使用以下命令,转换成功如下图所示。paddle2onnx \--model_dir ../inference/rec_rare \--model_filename inference.pdmodel \--params_filename inference.pdiparams \--save_file ../RARE_Resnet34_vd.onnx \--opset_version 11 \--enable_onnx_checker Trueonnxsim ../RARE_Resnet34_vd.onnx ../RARE_Resnet34_vd_sim.onnx命令说明:paddle2onnx为paddle模型转onnx模型工具,相关参数为:--model_dir表示模型路径,--model_filename表示模型文件名称,--params_filename表示参数文件名称,--save_file表示onnx模型保存路径,--opset_version表示选择onnx算子版本,--enable_onnx_checker表示是否进行onnx模型校验。onnxsim为onnx模型简化工具,主要进行模型中常量折叠和shape推导。4.2 转om模型使用MindStudio提供的Model Converter功能进行模型转换,如下图所示,点击Model Converter图标进入模型转换配置界面,如下图所示,点击Model File的文件夹图标,选择远程onnx模型,点击OK开始解析模型。模型解析如下图所示。模型解析完成后,填入相关的模型转换信息,如下图所示,点击Next开始检查模型转换参数。模型转换信息包括如下:1.Model Name:输出om模型的名称。2.Target SoC Version:远程环境设备芯片型号,本文环境使用的是Ascend310P3。3.Output Path:om模型保存路径。4.Input Format:输入数据的格式,本文模型的输入为NCHW,表示图片格式的数据。5.Input Nodes:模型输入节点信息,包括输入节点Name为x、Shape为1,3,32,100、Type为FP32。6.Output Nodes:可以选择模型输出节点信息。本文使用默认输出节点。参数校验如下图所示。校验完成后如下图所示,本文不需要Data Proprocessing,因此将其关闭,点击Next继续。最后如下图所示,确认转换命令后点击Finish开始进行模型转换。图44模型转换成功如下图所示。五、图像文字识别测试进行图像文字识别测试需要创建推理执行命令,下图所示,点击执行命令下拉按钮,选择Edit Configuration。如下图所示,同样创建Python命令。如下图所示输入可执行命令名称、可执行脚本、参数、Python解释器,点击OK完成创建。其中具体参数为:--image_dir="PaddleOCR/doc/imgs_words/en/word_3.png" \--rec_model_dir="/home/ccx/MindstudioProjects/inference/rec_rare/" \--rec_image_shape="3, 32, 100" \--rec_char_dict_path="./PaddleOCR/ppocr/utils/ic15_dict.txt"参数说明:--image_dir:推理图片路径--rec_model_dir:离线权重路径--rec_image_shape:图片shape信息--rec_char_dict_path:文字字典路径创建推理执行命令完成后,如下图所示,点击运行按钮开始执行推理命令。推理命令执行完成后如下图所示,对于word_3.png文字识别结果为“154”,打开该图片可以看出图片的内容为154,说明推理成功并且成功识别出了图片中的文字内容。六、总结通过使用MindStudio进行英语文字识别模型RARE_Resnet34_vd离线推理开发,完成了图像文字识别,在这次开发过程中,主要体验了MindStudio模型转换功能,相比于使用命令行进行转换,MindStudio可以自动识别到onnx模型的基本信息,非常方便。推荐大家参考MindStudio手册体验其他开发过程中用到的相关功能,链接为:cid:link_1另外大家也可通过MindStudio开发者社区,获取更多帮助以及参数案例,链接为:cid:link_2目录一、介绍... 21.1 模型介绍... 21.2 MindStudio介绍... 21.3 MindStudio安装... 3二、MindStudio工程创建... 31.1 新建模板工程... 31.2 工程配置... 9三、获取项目代码... 133.1 工程代码... 133.2 模型代码获取... 133.3 推理工具获取... 143.4 远程同步代码... 143.5 配置远程环境... 15四、模型转换... 164.1 转onnx模型... 164.2 转om模型... 20五、图像文字识别测试... 25六、总结... 28一、介绍本文主要给大家介绍使用MindStudio开发工具进行英文识别模型RARE_Resnet34_vd离线推理的开发过程,主要内容包括环境安装创建、模型获取转换以及离线推理三个部分。1.1 模型介绍识别自然图像中的文字仍是一个充满挑战的任务,RARE(Robust text recognizer with Automatic REctification)是一个对于不规则的文字具有鲁棒性的识别模型。该模型包括一个空间变换网络Spatial Transformer Network (STN)和一个序列识别网络Sequence Recognition Network (SRN),两个网络同时用BP算法进行训练。在推理过程中一张图像先通过Thin-Plate-Spline (TPS)变换成一个正规的、更易读的图像,此变换可以矫正不同类型的不规则文本,包括透射变换和弯曲的文本。TPS变换由一组基准点(fiducial points)表示,坐标通过卷积神经网络回归得到。然后再放入SRN中进行识别。SRN使用序列识别的attention-based方法,包含一个编码器和一个解码器。编码器产生一个特征表示序列,即序列的特征向量;解码器根据输入序列循环地产生一个字符序列。这个系统是一个端到端的文本识别系统,在训练过程中也不需要额外标记字符串的关键点、字符位置等。更详细的模型介绍大家可以参考原论文:cid:link_41.2 MindStudio介绍MindStudio是一套基于华为昇腾AI处理器开发的AI全栈开发平台,包括基于芯片的算子开发、以及自定义算子开发,同时还包括网络层的网络移植、优化和分析,另外在业务引擎层提供了一套可视化的AI引擎拖拽式编程服务,极大的降低了AI引擎的开发门槛。MindStudio功能框架如下图所示,目前含有的工具链包括:模型转换工具、模型训练工具、自定义算子开发工具、应用开发工具、工程管理工具、编译工具、流程编排工具、精度比对工具、日志管理工具、性能分析工具、设备管理工具、开发工具包(Ascend Development Kit,ADK)等多种工具。离线推理开发主要使用的是模型转换功能,将训练好的第三方网络模型可以直接通过离线模型工具导入并转换成离线模型,并可一键式自动生成模型接口,方便开发者基于模型接口进行编程,同时也提供了离线模型的可视化功能。1.3 MindStudio安装MindStudio的安装包可以通过官方网站获取,链接如下:cid:link_3安装方法可以参考用户指导手册中的安装部分,链接如下:cid:link_0二、MindStudio工程创建1.1 新建模板工程首次打开软件会指示是否导入配置,下图所示,选择不导入配置,点击OK进入MindStudio欢迎界面。欢迎界面如下图所示,点击Customize标签,可以修改相关用户设置,如将主题修改为IntelliJ Light。在MindStudio欢迎界面点击Projects标签,如下图所示,点击New Project进入创建工程流程。如下图所示,在工程创建选择Ascend App,点击Change。进入远程CANN配置界面,如下图所示,点击+号。进入下图SSH配置界面,点击+号创建新的SSH配置,输入SSH信息后点击OK返回远程CANN配置界面。如下图所示,点击文件夹图标,选择远程CANN安装路径,点击OK和Finish。开始同步远程CANN环境,如下图所示。 同步完成后返回新建工程界面,如下图所示,选择ACL Project(Python),点击Next。如下图所示,选择工程名称和路径,点击Finish完成工程创建,自动进入工程界面。下图所示,点击Close关闭提示信息,完成工程创建。1.2 工程配置首先配置SDK,如下图所示,点击File,选择Project Structure,进入工程结构界面。如下图所示,选择SDKs标签,点击+号,选择Add Python SDK,入在Python解释器选择界面。如下图所示,选择SSH Interpreter,然后选择Deploy系统会自动识别Python信息,点击OK确认,然后返回工程结构界面。如下图所示,选择Project,在SDK按钮下选择Remote Python,点击OK完成配置。配置Deployment,如下图所示,点击Tools->Deployment->Configuration,进入Deployment配置界面,如下图所示,点击Mappings,选择远程映射目录,点击OK。最后激活远程终端,如下图所示,点击Tools->Start SSH session。如下图所示,选择远程服务器,启动Remote Terminal。三、获取项目代码3.1 工程代码需要在工程目录中开发工程代码如下图所示,其中:inv_delta_C.npy:常量数据RARE_Resnet34_vd.patch:模型补丁文件RARE_Resnet34_vd_infer.py:模型推理脚本requirements.txt:工程依赖信息3.2 模型代码获取在本地终端窗口通过git命令获取模型代码,命令如下:git clone -b release/2.5 https://github.com/PaddlePaddle/PaddleOCR.gitcd PaddleOCRgit reset --hard a40f64a70b8d290b74557a41d869c0f9ce4959d5git apply ../RARE_Resnet34_vd.patchrm .\applications\cd ..cp .\inv_delta_C.npy .\PaddleOCR\tools\获取之后模型代码结构如下图所示。3.3 推理工具获取推理工具使用的是 ais_infer,该工具的获取、编译、安装说明链接为:https://gitee.com/ascend/tools/tree/master/ais-bench_workload/tool/ais_infer下载后将 ais_infer 工具代码放到本地工程路径下。3.4 远程同步代码工程所有代码如下图所示,点击Tools->Deployment->Upload to上传代码。如下图所示,选择远程服务器开始远程同步。同步完成后如下图所示。3.5 配置远程环境首先安装工程依赖,在远程终端窗口输入安装命令如下图所示。然后进入到ais_infer编译目录,执行编译安装命令:cd ais_infer/backend/pip3 wheel ./pip3 install aclruntime-0.0.1-cp37-cp37m-linux_x86_64.whlcd ../../四、模型转换4.1 转onnx模型首先获取模型训练权重,链接为:https://paddleocr.bj.bcebos.com/dygraph_v2.0/en/rec_r34_vd_tps_bilstm_att_v2.0_train.tar本地下载训练权重后,解压到RARE_Resnet34_vd\checkpoint目录下,并上传到远程服务器,如下图所示。然后需要将训练权重转为推理权重,创建可执行命令,如下图所示,点击Add Configuration。如下图所示,点击+号,选择Python。如下图所示,配置可执行命令参数,包括:Name:执行命令名称Script path:执行命令脚本Parameters:执行命令参数,该命令需要配置的参数为:-c /home/ccx/MindstudioProjects/RARE_Resnet34_vd/PaddleOCR/configs/rec/rec_r34_vd_tps_bilstm_att.yml -o Global.pretrained_model=/home/ccx/MindstudioProjects/RARE_Resnet34_vd/checkpoint/rec_r34_vd_tps_bilstm_att_v2.0_train/best_accuracy Global.save_inference_dir=/home/ccx/MindstudioProjects/inference/rec_rare其中-c表示模型配置文件,-o表示用户可选参数,包括Global.pretrained_model表示训练模型,Global.save_inference_dir表示推理模型保存路径。Use specified interpreter:选择Python解释器。配置完以上命令后点击OK完成。如下图所示,点击执行按钮开始执行命令。模型转换成功如下图所示。最后将推理权重转为onnx模型,在远程终端窗口使用以下命令,转换成功如下图所示。paddle2onnx \--model_dir ../inference/rec_rare \--model_filename inference.pdmodel \--params_filename inference.pdiparams \--save_file ../RARE_Resnet34_vd.onnx \--opset_version 11 \--enable_onnx_checker Trueonnxsim ../RARE_Resnet34_vd.onnx ../RARE_Resnet34_vd_sim.onnx命令说明:paddle2onnx为paddle模型转onnx模型工具,相关参数为:--model_dir表示模型路径,--model_filename表示模型文件名称,--params_filename表示参数文件名称,--save_file表示onnx模型保存路径,--opset_version表示选择onnx算子版本,--enable_onnx_checker表示是否进行onnx模型校验。onnxsim为onnx模型简化工具,主要进行模型中常量折叠和shape推导。4.2 转om模型使用MindStudio提供的Model Converter功能进行模型转换,如下图所示,点击Model Converter图标进入模型转换配置界面,如下图所示,点击Model File的文件夹图标,选择远程onnx模型,点击OK开始解析模型。模型解析如下图所示。模型解析完成后,填入相关的模型转换信息,如下图所示,点击Next开始检查模型转换参数。模型转换信息包括如下:1.Model Name:输出om模型的名称。2.Target SoC Version:远程环境设备芯片型号,本文环境使用的是Ascend310P3。3.Output Path:om模型保存路径。4.Input Format:输入数据的格式,本文模型的输入为NCHW,表示图片格式的数据。5.Input Nodes:模型输入节点信息,包括输入节点Name为x、Shape为1,3,32,100、Type为FP32。6.Output Nodes:可以选择模型输出节点信息。本文使用默认输出节点。参数校验如下图所示。校验完成后如下图所示,本文不需要Data Proprocessing,因此将其关闭,点击Next继续。最后如下图所示,确认转换命令后点击Finish开始进行模型转换。图44模型转换成功如下图所示。五、图像文字识别测试进行图像文字识别测试需要创建推理执行命令,下图所示,点击执行命令下拉按钮,选择Edit Configuration。如下图所示,同样创建Python命令。如下图所示输入可执行命令名称、可执行脚本、参数、Python解释器,点击OK完成创建。其中具体参数为:--image_dir="PaddleOCR/doc/imgs_words/en/word_3.png" \--rec_model_dir="/home/ccx/MindstudioProjects/inference/rec_rare/" \--rec_image_shape="3, 32, 100" \--rec_char_dict_path="./PaddleOCR/ppocr/utils/ic15_dict.txt"参数说明:--image_dir:推理图片路径--rec_model_dir:离线权重路径--rec_image_shape:图片shape信息--rec_char_dict_path:文字字典路径创建推理执行命令完成后,如下图所示,点击运行按钮开始执行推理命令。推理命令执行完成后如下图所示,对于word_3.png文字识别结果为“154”,打开该图片可以看出图片的内容为154,说明推理成功并且成功识别出了图片中的文字内容。六、总结通过使用MindStudio进行英语文字识别模型RARE_Resnet34_vd离线推理开发,完成了图像文字识别,在这次开发过程中,主要体验了MindStudio模型转换功能,相比于使用命令行进行转换,MindStudio可以自动识别到onnx模型的基本信息,非常方便。推荐大家参考MindStudio手册体验其他开发过程中用到的相关功能,链接为:cid:link_1另外大家也可通过MindStudio开发者社区,获取更多帮助以及参数案例,链接为:cid:link_2
  • [经验分享] 使用MindStudio完成EAST_ResNet50_vd模型开发
    目录一、MindStudio介绍 二、MindStudio工程创建 1.1 主界面功能介绍 1.2 创建工程 1.3 工程配置 三、模型代码获取 3.1 模型介绍 3.2 添加工程代码 3.3 模型代码获取 3.4 模型权重获取 3.5 推理工具获取 3.6 同步代码 3.7 配置远程环境 四、模型转换 4.1 获取推理权重 4.3 转om模型 五、文本检测 六、总结 本文主要给大家介绍使用MindStudio进行EAST_ResNet50_vd模型离线推理开发,完成图像文本检测,主要内容包括MindStudio安装、MindStudio工程创建、模型介绍与获取、模型转换、模型推理5个部分。一、MindStudio介绍MindStudio是一套基于华为昇腾AI处理器开发的AI全栈开发平台,包括基于芯片的算子开发、以及自定义算子开发,同时还包括网络层的网络移植、优化和分析,另外在业务引擎层提供了一套可视化的AI引擎拖拽式编程服务,极大的降低了AI引擎的开发门槛。本文使用MindStudio版本为:5.0.RC3,MindStudio功能框架如图1所示,集成开发环境包括:工程管理、编译、运行、模型转换、应用开发、精度比对、自定义算子、性能分析、仿真器、Debug、CANN-Toolkit功能。图1离线推理开发主要使用的是模型转换功能,将训练好的第三方网络模型可以直接通过离线模型工具导入并转换成离线模型,并可一键式自动生成模型接口,方便开发者基于模型接口进行编程,同时也提供了离线模型的可视化功能。MindStudio的安装过程可以参考官方指导手册,链接为:cid:link_0安装指南部分详细介绍了安装相关步骤,如图2所示。图2二、MindStudio工程创建1.1 主界面功能介绍首次启动MindStudio会提示是否导入配置,如图3所示,可以选择不导入配置,点击OK进入MindStudio主界面。图3MindStudio欢迎界面比较简洁,相关功能如下:a.工程管理功能,如图4所示,包括新建工程,打开、导入工程。图4b.用户设置功能,可以设置主题、字体等,如图5所示,将界面颜色设置为IntelliJ Light。图5c.插件管理功能,如图6所示,可以安装、卸载一些常用的插件。图6d.学习功能,如图7所示,可以进入到MindStudio用户帮助界面。图71.2 创建工程使用MindStudio主界面的工程管理功能创建一个新的工程,具体步骤为:a.点击New Project开始创建一个新的工程,如图8所示。图8b.New Project界面如图9所示,选择Ascend App,点击Change进行CANN配置。图9c.CANN配置界面如图10所示,点击Remote Connection的+号图标添加远程服务器链接,点击SSH Configurations中的+号,输入远程服务器相关信息,点击OK。图10d.如图11所示,点击Remote CANN location中的文件夹图标,选择远程服务CANN安装路径,点击OK确认,点击Finish结束配置。图11e.CANN配置结束后会自动同步远程CANN信息,如图12所示。图12f.同步完成后自动返回New Project界面,如图13所示,选择ACL Project(Python),点击Next继续。图13g.设置工程名称和位置,如图14所示,点击Finish继续。图14h.如图15所示,自动打开新建工程,此时会弹出提示信息,点击Close关闭,也可以选择不再提示。图15通过以上步骤完成工程创建。1.3 工程配置工程创建完成后需要进行相关配置,包括SDK、Deploy。具体步骤如下:a.如图16所示,点击File->Project Structure进入工程结构配置界面。图16b.工程结构界面如图17所示,选择SDKs,点击+号,选择Add Python SDK添加Python解释器。图17c.在添加Python解释器界面,如图18所示,选择SSH Interpreter,然后选择Deploy后会自动识别远程Python相关信息,点击OK完成。图18d.返回工程结构界面,如图19所示,选择Project,在SDK列表选择Remote Python,点击OK完成。图19e.进入Deploy设置界面,如图20所示,点击Tools-Deployment-Configuration。图20f.Deploy设置界面如图21所示,选择Deployment,点击远程服务器,点击Mappings标签,输入远程开发映射路径,点击OK完成。图21通过以上步骤激活完成工程配置。1.4 激活远程终端a.激活远程终端,如图22所示,点击Tools,选择Start SSH session。图22b.如图23所示,在弹出的对话框中选择远程服务器,启动Remote Terminal窗口。图23三、模型代码获取3.1 模型介绍EAST是一个高效准确的场景文本检测器,通过两步进行文本检测:先是一个全卷积的网络直接产生一个字符或者文本行的预测(可以是旋转的矩形或者不规则四边形),然后通过NMS(Non-Maximum Suppression)算法合并最后的结果。参考论文:cid:link_5EAST模型结构如图24所示,主要包括:(1) 特征提取层:使用的基础网络结构是PVANet,分别从stage1,stage2,stage3,stage4抽出特征,一种FPN(feature pyramid network)的思想。(2) 特征融合层:第一步抽出的特征层从后向前做上采样,然后Concat。(3) 输出层:输出一个score map和4个回归的框+1个角度信息,或者输出,一个scoremap和8个坐标信息。图243.2 添加工程代码完成推理功能需要开发的代码如图25所示,其中包括:EAST_ResNet50_vd.patch:模型补丁文件EAST_ResNet50_vd_det.py:模型推理脚本requirements.txt:工程依赖信息图25a.EAST_ResNet50_vd.patch:模型补丁文件主要是将使用gpu关闭,如图26所示。图26b. EAST_ResNet50_vd_det.py:模型推理脚本用于推理过程,业务流程及注释如图27所示。​图27c. requirements.txt:工程依赖信息,如图28所示。图283.3 模型代码获取在本地终端窗口可以通过以下命令获取模型代码:git clone -b release/2.5 https://github.com/PaddlePaddle/PaddleOCR.gitcd PaddleOCRgit reset --hard a40f64a70b8d290b74557a41d869c0f9ce4959d5git apply ../EAST_ResNet50_vd.patchrm .\applications\cd ..模型代码目录结构如科29所示。图293.4 模型权重获取模型权重链接为:https://paddleocr.bj.bcebos.com/dygraph_v2.0/en/det_r50_vd_east_v2.0_train.tar本地下载后,解压到EAST_ResNet50_vd\checkpoint目录下,如图30所示。图303.5 推理工具获取推理工具使用的是 ais_infer,该工具的获取、编译、安装说明链接为:cid:link_1下载后将 ais_infer 工具代码放到本地工程路径下,推理工具目录如图31所示。图313.6 同步代码整个工程代码结构如图32所示,选中工程名称,点击Tools->Deployment->Upload to将代码同步到远程服务器。图32在图33中弹出的对话框中选择远程服务器名称,开始同步文件。图333.7 配置远程环境在远程终端窗口中需要通过以下步骤配置远程服务器环境a.进入远程映射目录,命令为:cd /home/mindstudio_prj/EAST_ResNet50_vd/b.安装依赖,命令为:pip3 install -r requirements.txt --userc.进入ais_infer编译目录,命令为:cd ais_infer/backend/d.进行编译,命令为:pip3 wheel ./e.安装编译好的python包,命令为:pip3 install aclruntime-0.0.1-cp37-cp37m-linux_x86_64.whlf.返回到远程项目目录,命令为:cd ../../通过以上步骤完成代码获取以及远程环境配置。四、模型转换4.1 获取推理权重a.首先需要可执行命令将训练权重转为推理权重,创建可执行命令如图34所示,点击Add Configuration。图34b.如图35所示,在弹出的命令配置界面点击+号,选择Python。图35c.Python命令配置界面如图36所示,需要填入的参数信息如下:1.Name:可执行命令的名称。2.Scrip path:可执行脚本,如本次需要执行的是:EAST_ResNet50_vd\PaddleOCR\tools\export_model.py。3.Parameters:命令参数,如本次的命令参数为:-c /home/mindstudio_prj/EAST_ResNet50_vd/PaddleOCR/configs/det/det_r50_vd_east.yml -o Global.pretrained_model=/home/mindstudio_prj/EAST_ResNet50_vd/checkpoint/det_r50_vd_east_v2.0_train/best_accuracy Global.save_inference_dir=/home/mindstudio_prj/inference/det_r50_eas其中-c表示模型配置文件,-o表示用户参数,Global.pretrained_model为模型训练权重路径,Global.save_inference_dir模型推理权重路径。4.Use specified interpreter:选择Python解释器,如本次选的是Remote Python3.7.5。配置以上信息后点击OK。图36d.执行命令,如图37所示,点击可执行按钮开始执行命令。图37e.执行完成后得到推理模型,如图38所示。图384.2 转onnx模型a.在远程终端使用paddle2onnx工具命令将推理权重转为onnx模型,命令为:paddle2onnx \--model_dir ../inference/det_r50_eas \--model_filename inference.pdmodel \--params_filename inference.pdiparams \--save_file ../EAST_ResNet50_vd.onnx \--opset_version 11 --enable_onnx_checker True \--input_shape_dict="{'x':[1,3,544,960]}"成功转出onnx模型如图39所示,模型名称为:EAST_ResNet50_vd。图39b.使用onnxsim工具简化onnx模型,onnxsim工具说明链接为:cid:link_3onnxsim命令为:onnxsim ../EAST_ResNet50_vd.onnx ../EAST_ResNet50_vd_sim.onnx4.3 转om模型将onnx转为om模型需要用到MindStudio的模型转换功能,具体步骤如下:a.打开模型转换功能,如图40所示,点击Model Converter按钮。图40b.进入Model Converter界面,如图41所示,点击Model File文件夹图标,然后选择远程环境中的onnx模型,点击OK。 图41c.开始自动解析onnx模型信息,如图42所示。图42d.模型解析完成后,如图43,补全模型转换信息包括如下:1.Model Name:输出om模型的名称。2.Target SoC Version:远程环境设备芯片型号,本文环境使用的是Ascend310P3。3.Output Path:om模型保存路径。4.Input Format:输入数据的格式,本文模型的输入为NCHW,表示图片格式的数据。5.Input Nodes:模型输入节点信息,包括输入节点Name、Shape和Type。6.Output Nodes:可以选择模型输出节点信息。本文使用默认输出节点。补全模型转换信息后点击Next继续。图43e.开始校验模型转换参数,如图44所示图44f.校验完成后如图45所示,是否进行数据预处理,本文不需要数据预处理,关闭后点击Next继续。图45g.再次确认模型转换命令,如图46所示,点击Finish完成,并开始进行模型转换。图46h.模型转换完成后如图47所示,在本地生成om模型。图47五、文本检测获取EAST_ResNet50_vd_sim.om后,可以进行离线推理,步骤如下:a.创建离线推理命令,如图48所示,点击OK完成,命令参数为:--image_dir="./PaddleOCR/doc/imgs_en/img_10.jpg" --det_model_dir="/home/mindstudio_prj/inference/det_r50_eas" --det_algorithm="EAST"其中--image_dir表示图片路径,--det_model_dir表示推理权重路径,--det_algorithm表示检测算法。图48b.执行推理后,如图49所示,得到推理结果。图49c.将推理结果同步到本地,如图50所示,点击Tools->Deployment->Download from。图50d.打开推理结果图像,文本检测效果如图51所示。图51六、总结使用MindStudio进行EAST_ResNet50_vd模型图像文本检测过程,相关参考学习资料如下:1.MindStudio用户手册:cid:link_02.MindStudio开发者社区:cid:link_23.MindStudio B站:cid:link_4
  • [经验分享] 使用MindStudio完成ch_PP-OCRv2_det模型开发
    一、介绍本文主要介绍使用MindStudio进行ch_PP-OCRv2_det模型离线中文检测开发过程,完成文本检测,包括MindStudio安装、工程创建部署、模型转换和推理。1.1 模型介绍ch_PP-OCRv2_det是基于PP-OCRv2的中文文本检测模型,PP-OCRv2在PP-OCR的基础上,进一步在5个方面重点优化,检测模型采用CML协同互学习知识蒸馏策略和CopyPaste数据增广策略;识别模型采用LCNet轻量级骨干网络、UDML 改进知识蒸馏策略和Enhanced CTC loss损失函数改进,进一步在推理速度和预测效果上取得明显提升。1.2 MindStudio介绍MindStudio提供了AI开发所需的一站式开发环境,支持模型开发、算子开发以及应用开发三个主流程中的开发任务。依靠模型可视化、算力测试、IDE本地仿真调试等功能,MindStudio能够帮助开发者在一个工具上就能高效便捷地完成AI应用开发。MindStudio的功能架构如下图所示。二、安装部署2.1 软件下载通过MindStudio官网可以获取下载途径以及用户手册,如下图。MindStudio的官方网址为:cid:link_3如下图,在下载页面中可以选择新最版本,也可以选择历史版本进行下载。MindStudio的安装过程可以参考官方指导手册,链接为:cid:link_0安装指南部分详细介绍了安装相关步骤,如下图所示。2.2 软件配置第一次启动MindStudio提示是否导入配置,如下图,选择不导入配置,点击OK。选择Customiz选择,配置色彩主题为IntelliJ Light,如下图。2.3 工程创建选择Projects选项,点击New Project,如下图。选择Ascend App,点击Change,如下图。点击+号图标,如下图。点击加号,填入服务器信息,点击OK,如下图。点击文件夹图标,选择CANN包安装路径,点击OK,点击Finish,如下图。同步远程CANN环境到本地,如下图。同步完成后,选择ACL Project(Python)工程模板,点击Next,如下图。输入工程名称和工程目录,点击Finish,如下图。点击Close关闭提示信息,如下图。此时,成功创建了一个新的工程。2.4 工程配置点击File,选择Project Structure,如下图。选择SDKs,点击+号图标,选择Add Python SDK,如下图。选择SSH Interpreter,自识别远程Python环境信息,点击OK,如下图。选择Project,选择SDK,点击OK,如下图。点击Tools,选择Deployment,点击Configuration,如下图。选择远程服务器,点击Mappings,点击文件夹图标,选择远程映射目录,依次点击OK,如下图。点击Tools,选择Start SSH session,如下图。点击远程服务器,启动Remote Terminal,如下图。此时,成功创建并配置了一个新的工程。三、获取代码3.1 获取模型代码在本地终端窗口通过以下命令获取模型代码:git clone -b release/2.6 cid:link_4cd PaddleOCRgit reset --hard 274c216c6771a94807a34fb94377a1d7d674a69frm .\applications\rm .\doc\imgs\model_prod_flow_ch.pngcd ..获取代码后,修改模型配置文件ch_PP-OCRv2_det_cml.yml,如下图所示,将use_gpu设置成false。修改模型配置文件ch_PP-OCRv2_det_cml.yml,如下图所示,将model_name设置成 ["Teacher"]。修改infer_det.py文件,如下图所示,将53行代码进行注释。3.2 获取开发代码在本地工程中需要开发如下四个文件,包括:ch_PP-OCRv2_det_ais_infer.py:模型推理脚本ch_PP-OCRv2_det_postprocess.py:数据后处理脚本ch_PP-OCRv2_det_preprocess.py:数据前处理脚本requirements.txt:环境依赖文件3.3 获取推理工具代码推理工具使用的是ais_infer,该工具的获取、编译、安装说明链接为:cid:link_1下载后将ais_infer工具代码放到本地工程路径下。3.4 远程同步代码获取模型代码、开发代码、推理工具代码后,工程目录结构如下图所示。选中工程名称mindstudio_proj,然后点击Tools->Deployment->Upload to...,如下图。选择服务器,如下图,开始远程同步代码。四、模型转换4.1 获取推理权重模型推理权重的链接为:https://paddleocr.bj.bcebos.com/PP-OCRv2/chinese/ch_PP-OCRv2_det_infer.tar下载后将ch_PP-OCRv2_det_infer.tar解压到mindstudio_proj\inference目录下,如下图,并同步到远程服务器。4.2 转onnx模型在远程终端中进入映射目录,安装依赖,执行命令如下图。执行转onnx命令,如下图,获取ch_PP-OCRv2_rec.onnx模型,命令为:paddle2onnx \--model_dir ./inference/ch_PP-OCRv2_det_infer \--model_filename inference.pdmodel \--params_filename inference.pdiparams \--save_file ../ch_PP-OCRv2_det.onnx \--opset_version 11 \--enable_onnx_checker True \--input_shape_dict="{'x':[-1,3,-1,-1]}"4.3 转om模型点击Model Converter按钮,如下图。点击文件夹图标,选择onnx模型,如下图,点击OK。正在解析模型,如下图。解析完成之后输入模型转换参数,如下图,点击Next。模型转换参数说明:1.Model Name:输出om模型的名称。2.Target SoC Version:远程环境设备芯片型号,本文环境使用的是Ascend310P3。3.Output Path:om模型保存路径。4.Input Format:输入数据的格式,本文模型的输入为NCHW,表示图片格式的数据。5.Input Nodes:模型输入节点信息,包括输入节点Name为x、Shape为1,3,544,960、Type为FP32,由于模型是动态shape输入,所以需要指定Dynamic Image Size,本文模型设置的为:736,736;736,800;736,960;736,992;736,1184;736,1248;736,1280;768,928;832,1536;992,736;1088,736;1184,736。6.Output Nodes:可以选择模型输出节点信息。本文使用默认输出节点。工具进行参数检查,如下图。检查完成后,如下图,点击Next。再次校验生成的模型转换命令,如下图,确认后点击Finish开始进行模型转换。模型转换完成后在本地生成om模型,如下图。五、离线推理5.1 数据处理创建数据预处理执行命令,如下图,点击Add Configuration。点击+号,选择Python,如下图所示。输入命令名称,选择可执行文件,填入命令参数,选择Python解释器,如下图,具体参数为:-c PaddleOCR/configs/det/ch_PP-OCRv2/ch_PP-OCRv2_det_cml.yml -o Global.infer_img=./PaddleOCR/doc/imgs/参数说明:-c:模型配置文件路径。-o:可选参数:Global.infer_img为图片所在路径。点击执行按钮,如下图,开始运行数据处理命令。数据处理完成后,保存在pre_data目录下,如下图。5.2 执行推理在远程终端使用以下命令编译安装ais_infer依赖。cd ais_infer/backend/pip3 wheel ./pip3 install aclruntime-0.0.1-cp37-cp37m-linux_x86_64.whl创建推理执行命令,如下图,点击Edit Configurations。推理命令如下图所示,详细参数为:--ais_infer=./ais_infer/ais_infer.py --model=./ch_PP-OCRv2_det.om --inputs=/home/ych/pre_data --batchsize=1参数说明:--ais_infer:ais_infer脚本--model:om模型--inputs:输入数据路径--batchsize:模型的batchsize执行推理命令后,推理结果保存在results_bs1目录下,如下图。5.3 文本检测效果同样创建后处理执行命令,如下图,填入执行命令名称、脚本、参数、Python解释器,点击OK,具体参数为:-c PaddleOCR/configs/det/ch_PP-OCRv2/ch_PP-OCRv2_det_cml.yml -o Global.infer_img="./PaddleOCR/doc/imgs/" Global.infer_results=/home/ych/results_bs1参数说明:-c:模型配置文件-o:用户参数:Global.infer_img 表示推理图片所在路径;Global.infer_results表示推理结果路径执行后处理命令后,预测图片保存det_results目录下,如下图:通过远程终端命令将预测图片目录复制到远程映射目录,并下载到本地,如下图。下载完成后预测图片所在目录如下图所示。查看图片,文本检测效果如下图所示。六、总结本文介绍了使用MindStudio进行ch_PP-OCRv2_det模型离线中文检测开发的整个流程,大家学习使用MindStudio的过程中可以按照官方用户手册进行操作,另外还可以通过开发者社区学习一些技术干货和经典案例,以下是相关链接。MindStudio官网入口:cid:link_3MindStudio用户手册入口:cid:link_0MindStudio开发者社区入口:cid:link_2
  • [开发环境] notebook 昇卡/Ascend
    notebook里跑模型训练,资源显示ascend利用率0,context按照要求规范地设置了ascend。请问有成功使用ascend跑模型训练吗,能否给个成功代码的示例?(加上截图显示ascend使用率)非常感谢!附:我的规格是Ascend: 1*Ascend910|CPU: 24核 96GB,镜像tensorflow1.15-mindspore1.7.0-cann5.1.0-euler2.8-aarch64。
  • [API使用] MindSpore Callback方法是否提供网络输出结果?
    run_context.original_args()中是否能获取训练输出的结果,例如是否能输出语义分割的pred_label数组,想用这些结果计算训练阶段的precision、recall等,注意是训练阶段的指标,而不是验证阶段。cb_param.net_outputs只能得到loss值。或者有计算训练阶段指标的其他方法吗?
  • [ModelZoo] onnx模型atc转换om失败
    转换命令:atc --model=weight.onnx --framework=5 --output=Slice2 --soc_version=Ascend310 --input_shape="input:1,3,736,736" --log=error报错信息:报错算子
  • [推理经验] Mindspore 众智项目ONNX推理经验分享
    2022.8月 - 2022.10月我开始了华为的众智计划的开发,我主要负责CenterNet和FairMOT两个模型的ONNX推理任务,按照任务指导,开发流程是首先结合权重文件将模型转为MINDIR模型,然后将MINDIR文件使用MindSpore Lite解密为ms文件,上传到Netron 在线官网对模型可视化对算子经行分析。如果需要映射算子,就经行映射任务。然后导出onnx模型,最后进行onnx模型推理使精度和ckpt文件的精度保持一致。模型导出但是两个模型在使用MindSpore Lite时都出现了算子不支持的错误,而且两个模型均涉及到GaterD算子,原因是GatherD算子在MindSpore Lite-1.7版本都不支持,在使用了所有版本进行尝试后仍然无果,最后在等待一段时间后,社区推出了1.8测试版本,在开源版1.8版本转换成功,并进行了算子可视化分析。算子映射对算子经行了分析后发现有多个算子均需要映射,但同时,值得庆幸的是两个模型有部分算子是通用的。CenterNet模型中最复杂的映射工作是GatherD算子,要将MindSpore的GatherD算子映射为ONNX的GatherDElements算子(MindSpore的GatherD算子和ONNX的GatherDElements功能一致,但是输入和参数不一致),需要将他们的输入和维度参数相互映射一下,映射过后可以编译,但是其他算子受到影响,需要在其他受到影响的算子加入更多的索引判断条件。最后一样的流程完成其他算子的映射。但是在FairMOT算子映射时,发现L2Normalize算子没有在ONNX算子库里实现,在ONNX算子库找到最接近的算子是LayerNormalization算子,但是在编译结束后,进行推理的过程中出现许多报错,在与对接人吴逸群工程师和其他优秀的开发者(感谢他们的帮助)交流出两种方案,1. 通过在python中自己实现一个Normalize规避,替换掉ops.L2Normalize的调用 2. 使用onnx算子库中的LpNormalization算子分析精度变化, 但是没法指定epsilon数值。我首先采取了算子调试,输入相同数据如果结果差异比较明显,那就只能自己实现一个norm,把框架的norm替换掉,但是实现函数的时候必须调用框架算子实现,不然得自己自定义反向传播,这样难度又增加了。最后我使用直接映射的方法,将L2Normalize算子直接一对一映射到LpNormalization算子,在最后的实验中,精度并不会受到影响。这样就完成了全部算子的映射工作。ONNX推理在ONNX推理过程中,均遇到了各种问题,首先是CenterNet模型,CenterNet模型使用的是MS COCO2017数据集经行推理,但是模型输入的时候只支持静态输入,也就是对数据集中的图片输入到网络的时候,ONNX中的图片大小是固定的,当大小不一致的图片输入ONNX图的时候,就会报错。经过查询发现是MindSpore不支持动态输入的类型,但是我发现武汉理工大学团队提交的许多模型中有许多是动态输入的类型(这里感谢武汉理工大学团队的杜闯同学,为我提供了许多建议和帮助)。具体做法是通过export的时候,根据不同shape导出对应的onnx,eval_onnx在不同图片推理的时候分别调用到对应onnx就可以了,在导出的时候输出张量的图片宽高变量,并将高宽命名为onnx模型名字,在推理的时候保存张量的图片宽高变量,从根目录通过宽高调取onnx文件,此时命名一致。在一个for循环中根据宽高调用不同的onnx推理文件并将推理结果写入一个txt文件中,最后评估器调用txt文件中的推理结果,得到和ckpt文件推理结果一致的精度。其次是FairMOT模型的推理工作,FairMOT和其他模型不一样的地方在于ckpt文件不是通过MindSpore官网下载得到,而是根据训练过后的pth文件通过权重转换的方式将它转为ckpt文件,通过转换后的ckpt文件可以正常导出MINDIR和ONNX文件,但是推理精度不对,开始我认为是多目标跟踪领域跟踪结果需要上传服务器的问题,将本地ckpt文件推理结果上传到MOT challenge评估服务器后,得到的结果依然是空值(onnx推理结果依然是空值)。在经过多次尝试后分析,判断是预训练权重的问题,但是ckpt文件必须自己训练,而FairMOT需要的训练数据集高达70个G,可能需要训练非常久的时间,但是可以通过加载预训练权重的方式训练,结果在训练过程中发现作者并没有提供训练文件,比如MOT20.train、MOT20.val的文件,我使用Github仓库原FairMOT作者提供的gen-labels-20.py代码中生成出训练文件,再通过加载预训练权重的方式训练30个epochs,最后使用第30轮epoch进行推理,推理结果在本地显示,ckpt和onnx精度均达标。
  • [技术干货] MindX SDK -- X射线图像焊缝缺陷检测参考设计案例
    MindX SDK -- X射线图像焊缝缺陷检测参考设计案例1 案例概述1.1 概要描述在本系统中,目的是基于MindX SDK,在华为云昇腾平台上,开发端到端X射线图像焊缝缺陷检测的参考设计,实现对图像中的焊缝缺陷进行缺陷位置定位与类别识别的功能,并把可视化结果保存到本地,达到功能及精度要求,详细的精度可见 5.2精度测试 。样例输入:带有已裁剪出焊缝的jpg图片。样例输出:框出并标有缺陷类型与置信度的jpg图片。1.2 特性及适用场景经过测试,在现有数据集的基础上,该项目检测算法可以检测八种焊缝缺陷:气孔、裂纹、夹渣、未熔合、未焊透、咬边、内凹、成形不良,关于缺陷召回率和MAP分数在后续内容中将会提到。本项目属于工业缺陷中焊缝缺陷检测领域,主要针对DR成像设备(数字化X射线成像设备)拍摄金属焊接处成像形成的焊接X射线图像进行缺陷检测。1.3 模型介绍本项目主要使用到的模型是:用于目标检测的Faster_R-CNN模型(MIndSpore) 。Faster_R-CNN模型相关文件可以在此处下载:cid:link_21.4 数据集介绍GDXray是一个公开X射线数据集,其中包括一个关于X射线焊接图像(Welds)的数据,该数据由德国柏林的BAM联邦材料研究和测试研究所收集。Welds集中W0003 包括了68张焊接公司的X射线图像。本文基于W0003数据集并在焊接专家的帮助下将焊缝和其内部缺陷标注。数据集下载地址:cid:link_4注:本系统训练使用的数据是由原png图片转为jpg图片,然后经过焊缝裁剪和滑窗裁剪后输入模型训练,推理时所用的图片是已经经过焊缝裁剪的图片。1.5 实现流程1、基础环境:Ascend 310、mxVision、Ascend-CANN-toolkit、Ascend Driver 2、模型转换:fasterrcnn_mindspore.air --> fasterrcnn_mindspore_dvpp.om 或:fasterrcnn_mindspore.air --> fasterrcnn_mindspore_rgb.om 3、业务流程编排与配置 4、mxpi_classpostprocessor插件的后处理库开发 5、python推理流程代码开发技术流程图如下:1.6 代码地址本项目的代码地址为:Faster_R-CNN2 软件方案介绍2.1 技术原理在原始焊缝图片上裁剪出完整的焊缝。对焊缝做滑窗裁剪处理,通过滑窗步长小于图片尺寸的方法,在保留所有缺陷的前提下,将图片变为可输入到模型中推理的图片。对最终预测到的结果进行nms去重后,还原到焊缝图片中。2.2 项目方案架构介绍本方案中,会先进行滑窗裁剪处理,然后将处理好的图片通过 appsrc 插件输入到业务流程中,最终根据Faster—RCNN模型识别得到缺陷类别和置信度生成框输出标有缺陷类别与置信度的jpg图片。系统方案各子系统功能描述:序号子系统功能描述1图片输入获取 jpg 格式输入图片2图片解码解码图片3图片缩放将输入图片放缩到模型指定输入的尺寸大小4模型推理对输入张量进行推理5目标检测后处理从模型推理结果计算检测框的位置和置信度,并保留置信度大于指定阈值的检测框作为检测结果6结果输出获取检测结果7结果可视化将检测结果标注在输入图片上2.3 代码目录结构与说明本工程名称为 Faster_R-CNN,工程目录如下所示:. ├── images # README文件内的图片 │   ├── 1.png │   ├── 2.png │   ├── permissionerror.png │   ├── W0003_0001.jpg # 测试图片 ├── postprocess # 后处理插件 │   ├── build.sh # 后处理编译所需环境变量可参考该文件 │   ├── CMakeLists.txt │   ├── FasterRcnnMindsporePost.cpp │   └── FasterRcnnMindsporePost.h ├── python │   ├── Main │   │   ├── main.py │   │   ├── eval.py │   │   ├── infer.py │   │   ├── eval_by_sdk.py │   │   ├── config.py │   │   ├── util.py │   │   ├── draw_predict.py │   │   └── postprocess.py │   ├── models │   │   ├── aipp-configs (需创建) │   │   │   ├── aipp.cfg # sdk做图像预处理aipp配置文件 │   │   │ └── aipp_rgb.cfg # opencv做图像预处理aipp配置文件 │   │   ├── conversion-scripts # 转换前后模型所放的位置 │   │   ├── convert_om.sh # 模型转换相关环境变量配置可参考该文件 │   │   ├── coco2017.names # 支持的缺陷类别 │   │   ├── fasterrcnn_coco2017.cfg # 高性能要求配置 │   │   └── fasterrcnn_coco2017_acc_test.cfg # 高精度要求配置 │   ├── data (需创建) │   │   ├── test # 用于测试该系统功能的数据集目录 │   │   │   ├── infer_result # 小图(滑窗裁剪后的图片)推理结果所在目录 │   │   │   ├── draw_result # 最终推理结果的可视化 │   │   │   ├── cut # 测试图片所在目录 (需创建) │   │   │   ├── crop # 滑窗裁剪后的小图片所在目录 │   │   │   ├── img_txt # 小图推理结果txt格式 │   │   │   ├── img_huizong_txt # 还原到焊缝图片上的未经过nmx去重的标注框信息 │   │   │   └── img_huizong_txt_nms # 最终推理结果标注框信息(txt格式) │   │   ├── eval # 用于精度测试的数据集 (需创建) │   │   │   ├── cocodataset # 进行验证时数据的coco格式 │   │   │   ├── VOCdevkit # 进行验证时数据的VOC格式 │   └── pipeline │   ├── fasterrcnn_ms_dvpp.pipeline # sdk做图像预处理 │   └── fasterrcnn_ms_acc_test.pipeline # opencv做图像预处理 └── README.md注:验证时有COCO和VOC两种数据格式是因为原图片经过滑窗裁剪后的小图片是以coco的数据格式进行训练的,而本系统最终采用的验证方式是,将经过推理后得到的小图片的标注框信息还原到未经过滑窗裁剪的图片上,再进行VOC评估。3 开发环境准备3.1 环境依赖说明环境依赖软件和版本如下表:软件名称版本ubantu18.04MindX SDK2.0.4Python3.9.2CANN5.1.RC1numpy1.23.3opencv-python4.6.0.66pycocotools2.0.5mmcv1.7.03.2 环境搭建3.2.1 依赖安装确保环境中正确安装mxVision SDK。在编译运行项目前,需要设置环境变量:MindSDK 环境变量:. ${SDK-path}/set_env.shCANN 环境变量:. ${ascend-toolkit-path}/set_env.sh环境变量介绍SDK-path: mxVision SDK 安装路径 ascend-toolkit-path: CANN 安装路径。3.3 模型转换本项目中采用的模型是 Faster—RCNN模型,参考实现代码:cid:link_2将训练好的模型 fasterrcnn_mindspore.air 下载至 python/models/conversion-scripts 文件夹下。将该模型转换为om模型,具体操作为: python/models 文件夹下,执行指令:DVPP模型转换bash convert_om.sh conversion-scripts/fasterrcnn_mindspore.air aipp-configs/aipp.cfg conversion-scripts/fasterrcnn_mindspore_dvppOPENCV模型转换bash convert_om.sh conversion-scripts/fasterrcnn_mindspore.air aipp-configs/aipp_rgb.cfg conversion-scripts/fasterrcnn_mindspore_rgb注:转换后的OPENCV模型会用OpenCV对图片做预处理,然后进行推理,用户可自行进行选择。4 编译与运行步骤1 编译后处理插件切换到postprocess目录下,执行命令:bash build.sh步骤2 准备测试图片在python/data/test/cut/目录下放好待检测的焊缝图片(./images下有一张测试图片W0003_0001.jpg)步骤3 图片检测切换到python/Main目录下,执行命令:# 进行推理 python3 main.py # 进行nms去重并还原到原图 python3 postprocess.py命令执行成功后在目录python/data/test/draw_result下生成检测结果文件 。5 指标验证5.1 精度测试步骤1 准备数据准备精度测试所需图片,将验证集下载到python/data/eval/目录下并解压。步骤2 修改配置文件打开python/pipeline/fasterrcnn_ms_dvpp.pipeline文件,将第45行(postProcessConfigPath)配置参数改为../models/fasterrcnn_coco2017_acc_test.cfg。步骤3 执行推理使用dvpp模式对图片进行推理,切换到python/Main目录下,执行命令:python3 main.py --img_path ../data/eval/cocodataset/val2017/ --pipeline_path ../pipeline/fasterrcnn_ms_dvpp.pipeline --model_type dvpp --infer_mode eval --ann_file ../data/eval/cocodataset/annotations/instances_val2017.json步骤4 nms去重并评估因为涉及到去重处理,每种缺陷需要分开评估精度,切换到python/Main目录下,执行命令:# 验证气孔精度 python3 eval.py --cat_id 1 --object_name "qikong" # 验证裂纹精度 python3 eval.py --cat_id 2 --object_name "liewen"注:cat_id为缺陷标签,object_name为对应缺陷名称,在 python/models/coco2017.names可查看缺陷类别。缺陷种类AP气孔0.7251裂纹0.75975.2 性能测试步骤1 执行推理切换到python/Main目录下,执行命令:script -c "python3 main.py --img_path ../data/eval/cocodataset/val2017/ --pipeline_path ../pipeline/fasterrcnn_ms_dvpp.pipeline --model_type dvpp --infer_mode eval --ann_file ../data/eval/cocodataset/annotations/instances_val2017.json" -q opencv_test.log“opencv_test.log”为推理结果保存文件,文件名可根据实际修改。步骤2 查看性能结果继续执行命令:cat opencv_test.log | grep " elapsed_time" |awk -F "elapsed_time: " '{print $2 }' |awk -F "." '{c=($1"."$2);print c}' | awk '{sum += $1} END {print "Average=",sum/NR, "sum=", sum, "number=", NR};'输出性能结果:6 常见问题6.1 后处理插件权限问题运行检测 demo 和评测时都需要将生成的Faster_R-CNN后处理动态链接库的权限修改,否则将会报权限错误,如下图所示:解决方案:切换到postprocess目录下,执行命令:chmod 640 ./build/libfasterrcnn_mindspore_post.so6.2 模型转换问题运行模型转换命名后报错:环境变量设置时加了“$”符号。解决方案:参考build.sh中环境变量设置,并去掉“$”符号。