面向计算机视觉的领域特定语言设计与实现
2022-02-15马方超
马方超
(承德市教育局 河北 承德 067000)
0 引言
在生产和科研过程中,有时需要用到大量计算机视觉算子,比如OpenCV算子、Halco算子还有其他商业算子,这种算子之间的配合调度比较麻烦,也不易集成。例如在对某产品包装的缺陷进行检查时,比较好的方法就是首先做A滤波器然后再做亚像素的边界提取,A滤波算子有OpenCV供给,但亚像素的边界提取则有某商用算子库供给,因此必须通过跨算子库调度两种算子。尽管这种商用算子库一般都给出了C++接口,采用C++语言即可实现上述任务,但由于编码过程较为复杂,再加上部分电脑视觉开发者并不是计算机专业出身,所以他们更喜欢采用一类更抽象、简洁的编程语言。所以研究人员已经设计并实现了一个DSL,这一DSL降低了解码时限和解码量,同时拥有丰富研发经历的使用者也能够更改或增加平台内的元模型,以便于进行对平台的扩充。本文把面向对象计算机视觉的领域特定语言称为CVDSL。
1 相关概念阐述
1.1 计算机视觉
计算机视觉(computer vision,CV)是指通过电脑或有关装置对生物视觉的某种仿真,最终目标是让电脑可以像人那样利用视觉观察进而认识整个世界,拥有主动适应环境的能力。近些年,电脑视觉技术得到了蓬勃发展,大量高效、实用的AI算子被制作出来,同时对传统CV算子库也进行了调整和优化。越来越多的机器视觉的程序和模式将被普遍采用。
机器视觉应用模式的特征是在完成一定目标后,按照预设顺序进行操作。当运用特定编程语言(如C++)去完成某个计算机视觉的应用模型时,具体程序中通常首先包含对某个算子库的引入、基本结构句子(如循环句子、分支句子、赋值语句等)和对算子库的具体算子的运用。因此掌握计算机视觉基本处理过程,对于如何去建立CV领域元模型的CVDSL语言程序非常关键。
1.2 领域特定语言
领域特定语言(domain specific language, DSL)是领域工程技术之一,它是在某一专门领域中具有受限制表达特性的一个计算机程序设计语言圈。不同于一般的编程语言,它的使用特定的抽象层次比较高。下面介绍了几个相对通用的领域特定编程语言:用来描述Web网站的HTML语言,以及用来构建软件系统的Ant, RAKE,MAKE,用来描述语言的BNF范式,语法分析器的编程语言YACC,Bison,ANTLR,用来数据库结构化检查的编程语言SQL,以及用来定义格式表的编程语言CSS,专用的排版系统LaTe等。近些年由于新一代人工智能的迅速发展,有些面向机器教学、深度研究的领域特定编程语言也随之面世,比如OptiML,DeepDSL等。
2 CVDSL的设计与实现
本文中首次提出了建立CV领域元模型的基本途径和方法,并通过研究领域内的共性与变性所要求的原始数据种类、所需要的原始数据数量等一系列的关键要素,进一步明确了元模型的构建要求,并在此基础上形成了CV领域元模型[1-2]。
在对CV领域元模型映射和持久化的基础上,确定了CVDSL方法规范体系。并且使用自描述语法规则库,还自定义了模型的语法检查器。语言检查的主要目的,是用来避免开发者在使用一项特殊的代码时会出现语法错误,进而降低生成程序的质量准确性。
本文通过研发基于模板映射语言的、满足领域特定要求的应用模板代码自动生成功能,实现了将CVDSL编码转换成相应的C++编程语言的代码自动生成器,以及实现了领域中特定程序向应用语言的自动转化。
2.1 构建元领域模型
元模型的构建依据是元对象机制(Meta Object Facility,MOF)。MOF又称之为MOF标准,具有可扩展性、高度开放性和良好的互操作性。MOF方法的核心内容是具有高度可扩展性的元模型数据管理技术,它所实现的主要方法就是进行元数据分类。它的主要优点在于提供了一个四层建模框架,提供了各种元类型的框架。在需要新添加的元类型数据的地方,它也能够很简单地添加新的数据类型。
2.1.1 MOF的层次
MOF的层次分别为M0、M1、M2和M3,且M3∈M2∈M1∈M0。
(1)M3层,即元建模层次是领域元模型的提取或构造过程,所定义的元模型一般这些模块中包含属性、类型、关联关系等,是元模型构造的基石。CVDSL的元建模通常包含单一的算子(如读取数据的算子)、单一的语言规范(如赋值语句)等。
(2)M2层,元模型层。由最上一级模块搭建而来,它的基本元素包括了各个元模块间的相互关联、元模型的性质等。这一过程产生的成果是领域元模型,同时也是定制应用领域中特定语言语义模式和语言规则的基石。
(3)M1层,模型层。这一级的模式都是直接通过这一级的模块所建立而成。所以,这层的模式就是元模型层的实例,即是通过CVDSL创建起来的应用模式。而语法检查就根据这层的输出结果展开。
(4)M0层,指对象的结果,这一级的结果通常是指真实世界中的人事物对象,由这一级的结果数据可以通过自动产生的方法获取,包括文件和程序等。
2.1.2 元模型的构建条件
(1)分析领域模型间内在特点上的相似性,对相似特性加以整合;
(2)对于合并之后的领域模型及其内部特性,都必须在相应的单元模型上反映。元结构模型的构建过程如图1所示。
图1 元结构模型的构建过程
本文使用了EMF(Eclipse Modeling Framework)来构造元模型的方法。使用EMF构造的元模型通常是Ecore模式。而Ecore模式通常是一个简单的UML模板。和UML相似,EMF也能够实现图形化的架构搭建,其自带的Existing、Elements、Classifier、Feature、Relation、Dynamic、Package、Class、Datatype、Attribute、SuperType、Referent等使用基本模型对开发者而言,能够非常简单地使用拖拽的方法构造CV领域的单元模型。
另外,EMF是一个建模框架,在建模实际更改或增加时,能够简单地使用emf中的各种模型对实例进行调整。emf中集成的Class、Data-type、Attribute、SuperType、Reference等模式,也是CV范围内的元模式中由EMF构造出的模式实例,等同于是CV应用领域的模块实例,将所有CV应用领域的模块实例都通过程序自动生成,进而获得模式目标代码。这样MOF的四层架构也就非常简洁清晰[3-4]。
2.2 CVDSL语法规则定义
2.2.1 元模型映射
在CV领域中,元模型自身被反映成区域特殊编程语言中的结构框架,而每一个元模型都会反映成区域特殊编程语言的每一段基本语言规范的算子概念,而元模型的参数则反映成区域特殊编程语言的每一段基本语言规范概念的形参概念。
2.2.2 规则添加
研究人员可以选用Xtext框架作为CVDSL语法规范定义的工具,由于它主要支持对Ecore元类型的导入。而Xtext则是一个基于Eclipse的公开源代码框架,配套编程语言也是Xtend,所以它主要进行DSL的编写和实现。
Xtext工具可以获取所有元模型语法的关键字和特征,并连接它们,从而形成抽象语法树。通过Xtext的XModelSet()工具可以浏览EM F工程中的元Model文本夹,并捕获所有类名、属性、特征之间的逻辑关系等。
作为DSL语言来说,本身也是一个不成熟的语言,所以在制定语言模板的时候不要用基于语言模板所生成的代码,在执行语法检索时会出现特征性质的不足等现象。但是,要让应用开发者可以简单地捕捉到DSL程序中的关键数据,从而方便定制代码中生成的模板。
2.3 定制语法检查器
语言检测系统应以范围内特定语言的句法模式为基准,并定制模型化语言检测器。模型语言检测器经过用户对模型的筛选,并找出与其相关的目标根节点,进而找出应用模块所相对的语言CV领域元模型。例如模块名字是由不正确的字符所构成,或是将不同类别的数据加以对比等。无论错误或者提醒,语言检测器都需要实现快速定位,并使语言检测的结果直接反映到用户上。
语法检查器的开发过程也是采用Xtext。Xtext的机制中有两个文件:CVDSL Validator。Xtend和CVDSL Quick fix Proviler。Xtend。这两种文件,前者主要是使用检查方式,对存在问题的程序进行标注解释,后者主要是根据不同的程序问题给出快速修改的方式。具体的流程如下:
(1)经由编辑器中的监视器,通知CVDSL Validator Xtend,用户已经更改了模型。
(2)由typeof()接口,以确定模型的类型。
(3)再次使用typeof()接口确定了检查的属性和调用方法的名称。
(4)确定相关特征类别,属性参数及信息是否符合规范要求。
(5)如果满足标准,该次检测完成。如果违反标准,确定违反标准的代码位置,执行步骤(6)。
(6)可以按照具体要求的差异,提出error()或是warning)连接。这两种连接均必须给出编码的正确位置以及标记,并且出于读者编辑的便利,也必须给出适当的提示语句。若该类出错安全性很好,可对该出错用一串数字串为特征,调用CVDSL Quick fix Provider。Xtend相应快速修复方法。
(7)CVDSL Quick fix Provider。Xtend中的相应程序可以得到错误的相关数据,在提示框中有帮助地进行快速恢复按钮。
(8)用户在点击快速修复后,模型会出现一定改变,故系统将重新启动步骤(1)。
2.4 定制代码自动生成器
因为电脑视觉领域软件的规模巨大、功能繁杂、迭代更新速度快等原因,再加上对人工代码的撰写习惯不同和良莠不齐的不确定性,所以指望人工通过领域语言代码写出通用代码是不现实的。选择代码自主生产是必然结果。
应用模型代码生成技术,可以让系统设计者获得更多的设计知识,并促使程序员把更多的知识用在系统架构设计上,能够增强系统健壮度、可扩展性以及可维护性。所以,为CV领域而开发的非领域语言代码生成器,必须建立在已研究的领域语言规范基础上和其他领域语言规范基础上,与研究进程中不同阶段的语言模型整合,便于生成内容一致且遵循规范准则的持久化模型文件,然后再把模型文件利用语言代码生成器,制作为完全遵循已有规范的通用编程语言。
3 可扩展性评估
CVDSL的开发过程是采用标准模型驱动结构的,所以它拥有相当好的可延伸性。而CVDSL的可延伸性主要体现在可对CVDSL的语法规范进行调整、可对底层的算符库进行扩展、可对代码生成器的映射规范进行调整,等等。对一个拥有领域内特定语言开发经历的人而言,对CVDSL的功能加以扩充是相当容易的,因此可见CVDSL拥有良好的可扩展性。而用户也只需要按照自身的实际需要,逐一进行具体的使用即可[5]。
本文对扩展CVDSL功能的过程进行了总结,主要分为以下六步:(1)了解CVDSL的源码(仅需掌握与需求相关的部分源码即可);(2)修改CV领域元模型;(3)修改或添加CVDSL语法规则项;(4)修改或添加语法检查器的功能(非必须);(5)修改或添加代码生成器映射规则;(6)测试。由此也可看出,CVDSL的功能是可扩展的,而且也是易扩展的,使用者只需依据自己的需求,逐步完成相应的操作即可。
4 结语
研究人员采用了CV领域元模型,并通过建模驱动研究的方法,设计实现了一个面向对象计算机可视化的领域特殊编程语言——CVDSL。文章中首先研究了CV领域元模型的构成和建立方式,进而在领域元模型的基础上,确立了CVDSL的语言规范,并根据语法规则还定制了语法检查器,以降低在进行CVDSL代码进程中产生的句法问题。最后研究人员还根据模板映射规则,设计并完成了将CVDSL转化为C++的代码自动生成器,从而提高了其通用性与安全性。经过实验和FQAD框架,对CVDSL做出了评价,并分析了CVDSL所具备的优点和特点,在未来的工作,可以采用自定义CVDSL级调试程序来提高其安全性,并可以采用把CVDSL语言框架包装为Eclipse插件的方法来提升其可集成性。