亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        面向計(jì)算機(jī)視覺(jué)的領(lǐng)域特定語(yǔ)言

        2020-05-12 09:09:46鄭啟龍
        關(guān)鍵詞:規(guī)則語(yǔ)言模型

        姜 靖,鄭啟龍,2

        1(中國(guó)科學(xué)技術(shù)大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,合肥 230026)

        2(中國(guó)科學(xué)技術(shù)大學(xué) 國(guó)家高性能計(jì)算中心,合肥 230026)

        E-mail:jjdl@mail.ustc.edu.cn

        1 引 言

        計(jì)算機(jī)視覺(jué)(Computer Vision,CV)是指使用計(jì)算機(jī)及相關(guān)設(shè)備對(duì)生物視覺(jué)的一種模擬,最終目標(biāo)是使計(jì)算機(jī)能夠像人類一樣通過(guò)視覺(jué)觀察進(jìn)而理解世界,具有自主適應(yīng)環(huán)境的能力[1].近些年來(lái),計(jì)算機(jī)視覺(jué)得到了飛速發(fā)展,大量高效、實(shí)用的AI算子被設(shè)計(jì)了出來(lái).傳統(tǒng)CV算子庫(kù)也得到了更新和完善.更多基于計(jì)算機(jī)視覺(jué)的軟件和系統(tǒng)已被廣泛使用.

        領(lǐng)域特定語(yǔ)言(Domain Specific Language,DSL)是領(lǐng)域工程技術(shù)之一,它是針對(duì)某一特定領(lǐng)域具有受限制表達(dá)性的一種計(jì)算機(jī)程序設(shè)計(jì)語(yǔ)言[2].不同于普通的編程語(yǔ)言,領(lǐng)域特定語(yǔ)言抽象層次更高.針對(duì)特定領(lǐng)域,領(lǐng)域特定語(yǔ)言能更簡(jiǎn)潔、清晰、系統(tǒng)地描述某部分的意圖,提高開(kāi)發(fā)效率,使開(kāi)發(fā)過(guò)程更加輕松.隨著需求和技術(shù)的不斷更新,領(lǐng)域特定語(yǔ)言的種類也越來(lái)越多.以下是一些比較常見(jiàn)的領(lǐng)域特定語(yǔ)言:用于描述Web頁(yè)面的HTML,用于構(gòu)造軟件系統(tǒng)的Ant、RAKE、MAKE,用于表達(dá)語(yǔ)法的 BNF 范式,語(yǔ)法分析器生成語(yǔ)言 YACC、Bison、ANTLR,用于數(shù)據(jù)庫(kù)結(jié)構(gòu)化查詢的SQL,用于描述樣式表的CSS,專用的排版系統(tǒng)LaTex等[3].近些年隨著人工智能的快速發(fā)展,一些面向機(jī)器學(xué)習(xí)、深度學(xué)習(xí)的領(lǐng)域特定語(yǔ)言也相繼面世,例如OptiML、DeepDSL等.

        在工業(yè)生產(chǎn)和科研工作中,有時(shí)需使用大量計(jì)算機(jī)視覺(jué)算子,例如OpenCV算子[4,5]、Halcon算子[6,7]以及其它商業(yè)算子,同時(shí)也在越來(lái)越多的使用基于機(jī)器學(xué)習(xí)和深度學(xué)習(xí)的AI算子[8].這些算子間的組合調(diào)用較為困難,難以集成.例如在完成某商品包裝的缺陷檢測(cè)時(shí),比較好的方式是先做A濾波再做亞像素的邊緣提取,A濾波算子只有OpenCV提供,而亞像素的邊緣提取只有某商業(yè)算子庫(kù)提供,所以需要跨算子庫(kù)調(diào)用兩種算子.雖然大部分算子庫(kù)均提供C++接口,用C++可以完成這些任務(wù),但編碼過(guò)于繁瑣,而且一些計(jì)算機(jī)視覺(jué)開(kāi)發(fā)人員并非計(jì)算機(jī)背景出身,因此他們更愿意使用一種更抽象、簡(jiǎn)單的語(yǔ)言.在開(kāi)發(fā)過(guò)程中,領(lǐng)域?qū)<液途幋a人員的溝通也存在很大的問(wèn)題.故本文設(shè)計(jì)實(shí)現(xiàn)了一種DSL,其基本思想是為現(xiàn)有的常用計(jì)算機(jī)視覺(jué)算子庫(kù)和AI算子提供簡(jiǎn)單、一致的語(yǔ)法,從而整合使用這些算子,以提供統(tǒng)一的開(kāi)發(fā)平臺(tái).這樣一種DSL減少了編碼時(shí)間和編碼量,能讓領(lǐng)域工作者將更多的時(shí)間和精力放在算法設(shè)計(jì)上.具有開(kāi)發(fā)經(jīng)驗(yàn)的用戶也可以修改添加平臺(tái)內(nèi)的元模型,從而實(shí)現(xiàn)對(duì)平臺(tái)的擴(kuò)展.此處將面向計(jì)算機(jī)視覺(jué)的領(lǐng)域特定語(yǔ)言命名為CVDSL.

        圖1 CVDSL整體設(shè)計(jì)圖

        本文采用模型驅(qū)動(dòng)開(kāi)發(fā)的方式對(duì)CVDSL進(jìn)行建模、設(shè)計(jì)與實(shí)現(xiàn),主要進(jìn)行了以下幾個(gè)方面的工作:1)構(gòu)建CV領(lǐng)域元模型;2)定義CVDSL語(yǔ)法規(guī)則;3)定制CVDSL語(yǔ)法檢查器;4)定制將CVDSL轉(zhuǎn)換為C++的代碼自動(dòng)生成器.CVDSL的整體設(shè)計(jì)方案如圖1所示.

        2 CVDSL的設(shè)計(jì)與實(shí)現(xiàn)

        本文首先確定了構(gòu)建CV領(lǐng)域元模型的方法及工具,并通過(guò)分析領(lǐng)域中的共性和變性、所需要的原始數(shù)據(jù)類型、必須的原始數(shù)據(jù)規(guī)模等一系列領(lǐng)域相關(guān)因素,確定了元模型的組成內(nèi)容,在此基礎(chǔ)上建立了CV領(lǐng)域元模型.

        本文在CV領(lǐng)域元模型的映射和持久化的基礎(chǔ)上,定義了CVDSL語(yǔ)法規(guī)則體系.同時(shí)通過(guò)自定義語(yǔ)法規(guī)則庫(kù),定制了模型語(yǔ)法檢查器.語(yǔ)法檢查的目的是為了防止開(kāi)發(fā)人員在使用領(lǐng)域特定語(yǔ)言編碼時(shí)產(chǎn)生語(yǔ)法錯(cuò)誤,從而影響生成代碼的正確性.

        本文通過(guò)研究基于模板映射語(yǔ)言的、符合特定標(biāo)準(zhǔn)的應(yīng)用模型代碼自動(dòng)生成技術(shù),設(shè)計(jì)了將CVDSL代碼轉(zhuǎn)換成對(duì)應(yīng)的C++代碼的代碼自動(dòng)生成器,實(shí)現(xiàn)領(lǐng)域特定語(yǔ)言向通用語(yǔ)言的自動(dòng)轉(zhuǎn)換.

        2.1 構(gòu)建CV領(lǐng)域元模型

        元模型的構(gòu)建依據(jù)元對(duì)象機(jī)制(MOF,Meta Object Facility).MOF也被稱為MOF標(biāo)準(zhǔn),其特點(diǎn)是具有易擴(kuò)展性,高開(kāi)放性及良好的互操作性.MOF方法的核心是一種具有易擴(kuò)展性的元模型數(shù)據(jù)管理方法,其實(shí)現(xiàn)的方式是對(duì)元數(shù)據(jù)分層.它的特點(diǎn)是提供了一種四層建模結(jié)構(gòu),支持各種元數(shù)據(jù)的框架.在需要添加新元模型數(shù)據(jù)的時(shí)候,就可以方便地加入新的類型[9].

        MOF的層次分別為M0、M1、M2和M3,且M3∈M2∈M1∈M0.

        1)M3層,元元模型層.為領(lǐng)域元模型的提取或搭建,而定義的模型.一般這些模型包括屬性、數(shù)據(jù)類型、關(guān)聯(lián)關(guān)系等,是元模型搭建的基礎(chǔ).CVDSL的元元模型包括獨(dú)立的算子(如讀取圖片的算子)、單個(gè)的語(yǔ)法規(guī)則(如賦值語(yǔ)句)等.

        2)M2層,元模型層.由上一層模型搭建而來(lái),它的元素包括各個(gè)元元模型之間的關(guān)系、元元模型的類型等.這一層輸出的結(jié)果是領(lǐng)域元模型,它是定制領(lǐng)域特定語(yǔ)言語(yǔ)義模型和語(yǔ)法規(guī)范的基礎(chǔ).

        3)M1層,模型層.這一層的模型由用戶使用上一層的模型搭建而來(lái).所以,這一層的模型是元模型層的實(shí)例,即用戶使用CVDSL編寫出來(lái)的應(yīng)用模型.語(yǔ)法檢查將基于這一層的輸出結(jié)果進(jìn)行.

        4)M0層,對(duì)象和數(shù)據(jù).這一層的結(jié)果是現(xiàn)實(shí)世界中的事物對(duì)象,由上一層的結(jié)果通過(guò)自動(dòng)生成的方式得到,比如文檔和代碼等.

        元模型的構(gòu)建,需要去符合以下兩個(gè)條件:

        1)分析領(lǐng)域模型內(nèi)部特征的相似性,對(duì)相似特征進(jìn)行合并;

        2)對(duì)于合并之后的領(lǐng)域模型內(nèi)部特征,需要在對(duì)應(yīng)的元模型上體現(xiàn).

        元模型的構(gòu)建過(guò)程如圖2所示.

        圖2 元模型的構(gòu)建流程

        本文采用EMF(Eclipse Modeling Framework)作為構(gòu)建元模型的工具.用EMF搭建的元模型即Ecore模型.Ecore模型是一種簡(jiǎn)化的UML模型.與UML類似,EMF也可以進(jìn)行圖形化的模型搭建,框架自帶了Existing Elements、Classifier、Feature、Relation、Dynamic、Package六大類型,包括Class、Datatype、Attribute、SuperType、Reference等實(shí)用基本模型[10].對(duì)于開(kāi)發(fā)人員來(lái)說(shuō)可以很方便地通過(guò)拖拽的方式搭建CV領(lǐng)域的元模型.

        另一方面,由于EMF的模型實(shí)例是由EMF框架提供的模型搭建的,如果當(dāng)模型實(shí)例需要修改或者添加的時(shí)候,就可以輕易地通過(guò) EMF提供的各種模型對(duì)模型實(shí)例進(jìn)行修改或者額外添加一個(gè)新的模型實(shí)例.EMF中集成的 Class、Datatype、Attribute、SuperType、Reference 等模型即相當(dāng)于CV領(lǐng)域中的元元模型,用 EMF 搭建出來(lái)的模型實(shí)例,就相當(dāng)于CV領(lǐng)域中的元模型,而在設(shè)計(jì)好的開(kāi)發(fā)平臺(tái)里用EMF搭建的模型實(shí)例再次搭建的模型,就相當(dāng)于是CV領(lǐng)域的模型實(shí)例了.將CV領(lǐng)域的模型實(shí)例通過(guò)代碼自動(dòng)生成最終將得到模型的目標(biāo)代碼實(shí)現(xiàn).這樣MOF的四層結(jié)構(gòu)就很清晰了.

        通過(guò)對(duì)CV領(lǐng)域的分析,確定CV領(lǐng)域元模型的兩個(gè)主要組成部分如下:

        1)基礎(chǔ)語(yǔ)法部分.CV領(lǐng)域的實(shí)際應(yīng)用模型中,是需要循環(huán)、分支、跳轉(zhuǎn)等基礎(chǔ)語(yǔ)法結(jié)構(gòu)的,因此在元模型中,需要有常見(jiàn)的基礎(chǔ)語(yǔ)法建模.

        2)算子庫(kù)部分.CV領(lǐng)域應(yīng)用模型的核心是各種算子的組合調(diào)用.本文將所涉及的算子分為兩大類:ImageOperators和BasicOperators.其中ImageOperators中包含與圖像處理相關(guān)的算子,依據(jù)算子的功能劃分成File、Filter、Matching等23類.其中每一類又依據(jù)更具體的功能劃分成若干細(xì)分類,例如File中的算子被劃分成Images、XLD_file、Text、Misc、Region和Tuple六類.每一細(xì)分類中則包含具體的算子模型,例如Images中包含用于進(jìn)行圖片讀取的算子ReadImage(string path,stringname,string color).BasicOperators中則包含字符串操作、位操作、元組操作、數(shù)學(xué)函數(shù)以及異常處理等相關(guān)的算子.

        圖3 CV領(lǐng)域元模型部分結(jié)構(gòu)圖

        圖3為CV領(lǐng)域元模型部分結(jié)構(gòu)圖,其中”a-> b”表示a包含b,”0..*”表示一個(gè)a包含0個(gè)或多個(gè)b,”0..1”表示一個(gè)a包含0個(gè)或1個(gè)b.整個(gè)元模型為樹(shù)形結(jié)構(gòu),DomainModel為樹(shù)的根節(jié)點(diǎn).元模型的樹(shù)形結(jié)構(gòu)是下文建立語(yǔ)法規(guī)則樹(shù)的基礎(chǔ),也是代碼自動(dòng)生成器中,關(guān)鍵字查詢匹配的基礎(chǔ).

        元模型中不同類型的元元模型的具體構(gòu)建如表1所示.

        2.2 CVDSL語(yǔ)法規(guī)則定義

        CVDSL的語(yǔ)法規(guī)則定義分為以下兩步:

        2.2.1 元模型的映射

        在CV領(lǐng)域中,元模型本身會(huì)映射為領(lǐng)域特定語(yǔ)言中的語(yǔ)法框架,每個(gè)元元模型會(huì)映射為領(lǐng)域特定語(yǔ)言的每條基礎(chǔ)語(yǔ)法規(guī)則以及算子定義,元元模型的參數(shù)會(huì)映射成領(lǐng)域特定語(yǔ)言中各條語(yǔ)法規(guī)則定義的形參定義.

        2.2.2 規(guī)則添加

        為了領(lǐng)域特定語(yǔ)言語(yǔ)法的正確性與美觀,語(yǔ)法規(guī)范中除了元模型對(duì)應(yīng)的代碼之外,往往還需要加入其它的代碼.比如一個(gè)分支語(yǔ)句的開(kāi)始結(jié)束要有關(guān)鍵字給予明顯的提示;在代碼中是否要明確體現(xiàn)每一個(gè)模塊之間的關(guān)聯(lián)關(guān)系等.

        表1 不同類型的元元模型示例

        本文選擇Xtext框架作為CVDSL語(yǔ)法規(guī)則定義的工具,因?yàn)槠渲С諩core元模型的導(dǎo)入.Xtext是一種基于Eclipse的開(kāi)源框架,配套語(yǔ)言為Xtend,其主要用于DSL的設(shè)計(jì)與實(shí)現(xiàn).

        語(yǔ)法模型映射活動(dòng)圖如圖4所示.

        圖4 語(yǔ)法模型映射

        Xtext需要提取元模型語(yǔ)法的關(guān)鍵字與結(jié)構(gòu),組合它們,產(chǎn)生抽象語(yǔ)法樹(shù).在本文中,Xtext的XModelSet()方法會(huì)訪問(wèn)EMF項(xiàng)目中的 Model文件夾,捕獲所有類名稱、屬性、相互之間的邏輯關(guān)系等[11].

        作為DSL來(lái)說(shuō),本身即是一種不完備的語(yǔ)言,故在定制語(yǔ)法模型的時(shí)候一方面不能讓基于語(yǔ)法模型生成的代碼,在進(jìn)行語(yǔ)法檢查時(shí)遇到特征屬性缺失等問(wèn)題.另一方面,要使領(lǐng)域開(kāi)發(fā)人員能夠簡(jiǎn)便地捕捉到DSL代碼中的相關(guān)信息,從而方便定制代碼生成的模板.

        CVDSL部分語(yǔ)法規(guī)則的Xtend語(yǔ)言形式化描述如下:

        DomainModel:(elements+=AbstractElement)*;

        AbstractElement:BasicGrammar | Operators;

        BasicGrammar:ControlFlow | Assignment |

        Import |Arithmetic |Comparison |VariableDeclaration;

        Operators:ImageOperatos | BasicOperatos;

        ImageOperatos:File |_1D_Measurling | XLD | _3D_Matching |_3D_Reconstruction | Classification | Calibration | Filter | Indentification | Graphics | Image | Inspection | Matirx | Matching | Object | OCR | Morphology | Regions | Segmentation | System | Transformations | Tools | _Tuple;

        BasicOperatos:BitOp | StringOp | TupleOp | BooleanOp | TrigonometricFunctions | ExponentialFunctions | NumericalFunctions | ExceptionHandling;

        File:Images | XLD_file | Text | Misc | Region | TupleFile;

        Images:ReadImage | WriteImage | ListImageFiles | ParseFilename;

        ReadImage:′ReadImage′′(′ path=CharacterType‘,’ name=CharacterType(‘,’color=CharcterType)?′)′;

        由此可知CVDSL的語(yǔ)法規(guī)則框架是繼承于元模型的樹(shù)形結(jié)構(gòu)的.

        表2為算子部分和基礎(chǔ)語(yǔ)法部分的語(yǔ)法規(guī)則定義的Xtend語(yǔ)言形式化描述示例.

        表2 算子和基礎(chǔ)語(yǔ)法定義示例

        因?yàn)閄tend的內(nèi)置數(shù)據(jù)類型有限,而在CV領(lǐng)域會(huì)涉及到豐富的數(shù)據(jù)類型,如RealType、Tuple、

        Matrix等,因此需要在元模型映射的基礎(chǔ)上擴(kuò)展新

        的數(shù)據(jù)類型.具體示例如下:

        1)擴(kuò)展數(shù)據(jù)類型語(yǔ)法定義示例:

        terminalDOUBLE:((′0′..′9′)*(′.′)(′0′..′9′)*);

        terminalBOOL:′true′ | ′false′;

        terminalTUPLE:′[′(STRING | ID | INT | DOUBLE)*′]′;

        terminalMATRIX_TYPE:′[′(TUPLE)*′]′;

        2)復(fù)合數(shù)據(jù)類型語(yǔ)法定義示例:

        CharacterType:STRING | ID;

        RealType:INT | DOUBLE;

        其中STRING、ID、INT為Xtend語(yǔ)言內(nèi)置數(shù)據(jù)類型,DOUBLE為擴(kuò)展數(shù)據(jù)類型.CharterType和RealType為復(fù)合數(shù)據(jù)類型.

        2.3 定制語(yǔ)法檢查器

        CV領(lǐng)域應(yīng)用模型檢查是依據(jù)語(yǔ)法規(guī)則庫(kù),檢查在之前步驟中建立的CV領(lǐng)域應(yīng)用模型,判斷這些已經(jīng)建立的應(yīng)用模型的語(yǔ)法是否正確[12].

        語(yǔ)法檢查應(yīng)以領(lǐng)域特定語(yǔ)言的語(yǔ)法模型為基礎(chǔ),定制模型語(yǔ)法檢查器[13].模型語(yǔ)法檢查器通過(guò)用戶對(duì)模型的選擇,找到其對(duì)應(yīng)的對(duì)象根節(jié)點(diǎn),然后找到應(yīng)用模型對(duì)應(yīng)的CV領(lǐng)域元模型.此時(shí)找到領(lǐng)域特定語(yǔ)言相應(yīng)元模型對(duì)應(yīng)的語(yǔ)法規(guī)則,驗(yàn)證用戶搭建的應(yīng)用模型的正確性,與通用語(yǔ)言相同,這種驗(yàn)證應(yīng)該是一種即時(shí)性的驗(yàn)證.同時(shí),在語(yǔ)法檢查器中還應(yīng)該包括警告驗(yàn)證.警告,不一定會(huì)導(dǎo)致程序錯(cuò)誤,但是可能會(huì)提高出錯(cuò)的風(fēng)險(xiǎn),或者影響用戶閱讀體驗(yàn).比如模塊名稱是由不恰當(dāng)?shù)淖址M成,或者將不同類型的數(shù)據(jù)進(jìn)行比較等.無(wú)論是錯(cuò)誤還是提醒,語(yǔ)法檢查器都應(yīng)該進(jìn)行快速定位,并將語(yǔ)法檢查的結(jié)果直觀體現(xiàn)在用戶界面上.語(yǔ)法檢查的流程如圖5所示.

        圖5 語(yǔ)法檢查流程

        語(yǔ)法檢查器的開(kāi)發(fā)同樣基于Xtext.Xtext驗(yàn)證機(jī)制中提供兩個(gè)文件:CVDSLValidator.Xtend和CVDSLQuickfixProvider.Xtend.這兩個(gè)文件,前者主要是添加檢查規(guī)則,對(duì)出現(xiàn)錯(cuò)誤的代碼進(jìn)行標(biāo)注說(shuō)明,后者主要是針對(duì)不同的代碼錯(cuò)誤提供快速修正的方法.具體實(shí)現(xiàn)過(guò)程如下:

        1)由編輯器中的監(jiān)視器通知CVDSLValidator.Xtend,用戶修改了模型.

        2)由typeof()接口,確定模型的類型.

        3)再次調(diào)用typeof()接口確定檢查的屬性,或者調(diào)用方法的名稱.

        4)判斷相關(guān)屬性類型,屬性值等數(shù)據(jù)是否符合規(guī)范標(biāo)準(zhǔn).

        5)如果符合標(biāo)準(zhǔn),該次檢查結(jié)束.如果不符合標(biāo)準(zhǔn),定位不符合標(biāo)準(zhǔn)的代碼位置,執(zhí)行6).

        6)根據(jù)具體標(biāo)準(zhǔn)的不同,使用error()或者warning()接口.這兩個(gè)接口都需要提供代碼的定位以便標(biāo)注,同時(shí)為了用戶修改的方便,還需要提供相應(yīng)的提示文字.如果該類錯(cuò)誤可控性較高,則將該錯(cuò)誤用一串字符串作為特征,調(diào)用CVDSLQuickfixProvider.Xtend相應(yīng)快速修復(fù)方法.

        7)CVDSLQuickfixProvider.Xtend中的相應(yīng)方法會(huì)得到錯(cuò)誤的關(guān)鍵信息,在提示框里對(duì)用戶提供快速修復(fù)按鈕.

        8)用戶點(diǎn)擊快速修復(fù)后,模型會(huì)發(fā)生相應(yīng)變化,故將再次激活步驟1).

        算法1描述了在CVDSLValidator.Xtend文件中檢查算子首字母是否大寫的過(guò)程.

        算法1.檢查算子首字母是否大寫:

        輸入:算子類型參數(shù)

        輸出:在編程界面上提示算子首字母是否大寫

        1.通過(guò)代碼生成器中的過(guò)濾器獲取每一個(gè)operator,將其作為參數(shù)傳入2.中函數(shù)

        2.defcheckOpetationNameStartsWithCapital:

        ifoperator.name.charAt(0).lowerCase==true

        warning("Operator′s name should start with a capital",CVDSLPackage.eINSTANCE.operation_Name,INVALID_NAME,operator.name);

        算法2描述了在CVDSLQuickfixProvider.Xtend文件中快速修正首字母為大寫的過(guò)程.

        算法2.快速修正算子首字母為大寫:

        輸入:Issue類對(duì)象,IssueResolutionAcceptor對(duì)象

        輸出:在編程界面上呈現(xiàn)出將算子首字母修正為大寫的提示,雙擊即可修正

        1.將輸入中的系統(tǒng)類的對(duì)象傳入2.中函數(shù)

        2.defvoidcapitalizeOperationNameFirstLetterWithModel

        acceptor.accept( issue,"Capitalize first letter","Capitalize first letter of ′" + issue.data.get( 0)+ "′","upcase.gif",[element,context|(element as Operation).

        name=issue.data.get(0).toFirstUpper])

        表3 語(yǔ)法檢查器運(yùn)行示例

        表3為檢查算子首字母是否大寫及快速修正的運(yùn)行示例.

        2.4 定制代碼自動(dòng)生成器

        領(lǐng)域特定語(yǔ)言雖然在領(lǐng)域相關(guān)環(huán)境或者人員中具有其獨(dú)特的優(yōu)勢(shì)和作用,但是基于通用性、安全性等的考量,領(lǐng)域特定語(yǔ)言的代碼必須能夠轉(zhuǎn)換成通用語(yǔ)言代碼.

        由于計(jì)算機(jī)視覺(jué)領(lǐng)域軟件有規(guī)模龐大、功能復(fù)雜、迭代更新快等因素,再加上人工代碼的書寫習(xí)慣差異及良莠不齊的不確定性,希望人工通過(guò)領(lǐng)域語(yǔ)言代碼,編寫通用代碼是不現(xiàn)實(shí)的.所以選擇代碼自動(dòng)生成是必然結(jié)果[14].

        代碼生成技術(shù)可以提高代碼質(zhì)量,增強(qiáng)代碼的一致性,也可以突出設(shè)計(jì)決策或者便于系統(tǒng)的遷移實(shí)現(xiàn).應(yīng)用模型代碼生成技術(shù)使設(shè)計(jì)師擁有更多的設(shè)計(jì)時(shí)間,使得程序員將更多的時(shí)間花在系統(tǒng)架構(gòu)設(shè)計(jì)上,從而可以提高系統(tǒng)健壯性、可擴(kuò)展性、以及可維護(hù)性.

        所以,CV領(lǐng)域軟件的非領(lǐng)域代碼生成器,應(yīng)當(dāng)建立在已經(jīng)研究的領(lǐng)域語(yǔ)言規(guī)則標(biāo)準(zhǔn)及非領(lǐng)域語(yǔ)言規(guī)則標(biāo)準(zhǔn)之上,然后將開(kāi)發(fā)過(guò)程中各個(gè)階段的模型集成,從而形成統(tǒng)一且符合規(guī)則標(biāo)準(zhǔn)的持久化模型文件,然后將這些模型文件通過(guò)代碼生成器生成出符合已有標(biāo)準(zhǔn)的通用代碼.

        代碼自動(dòng)生成器的開(kāi)發(fā)同樣基于Xtext框架,因?yàn)槠淇蓾M足代碼自動(dòng)生成器對(duì)于良好擴(kuò)展性的需求.代碼自動(dòng)生成器主要由元模型分析數(shù)據(jù)、應(yīng)用模型分析數(shù)據(jù)、生成通用代碼的模板以及環(huán)境配置工具組成,其設(shè)計(jì)的核心思想是制定CVDSL與C++間的映射關(guān)系,確定每一條合法的CVDSL語(yǔ)句將對(duì)應(yīng)的C++代碼塊.當(dāng)代碼生成器獲取到CVDSL的應(yīng)用模型后,會(huì)依據(jù)上文中建立的語(yǔ)法樹(shù),檢索每一行代碼,確定它所對(duì)應(yīng)的元元模型類型和語(yǔ)法規(guī)則,然后依據(jù)該語(yǔ)句與C++代碼塊的映射規(guī)則,進(jìn)行代碼生成.圖6為代碼自動(dòng)生成活動(dòng)圖.

        圖6 代碼自動(dòng)生成活動(dòng)圖

        算法3描述了CVDSL代碼自動(dòng)轉(zhuǎn)換為C++代碼的過(guò)程.

        算法3.CVDSL代碼自動(dòng)轉(zhuǎn)換C++代碼模板

        輸入:Resource類對(duì)象,IFileSystemAccess類對(duì)象,IGeneratorContext類對(duì)象

        輸出:生成的C++代碼文件

        1.對(duì)classCVDSLGeneratoreXtendsAbstractGenerator中的函數(shù)doGenerate進(jìn)行重寫

        2.在函數(shù)overridevoiddoGenerate(Resource resource,IFileSystemAccess2 fsa,IGeneratorContext context)中,對(duì)CVDSL中的每一個(gè)元元模型進(jìn)行遍歷,然后調(diào)用相應(yīng)的映射模板進(jìn)行代碼生成

        for(e:resource.allContents.toIterable.filter(AbstractElement)):

        /*調(diào)用自定義的映射模板中的函數(shù),獲取每一行CVDSL代碼所對(duì)應(yīng)的C++代碼塊,并進(jìn)行存儲(chǔ)*/

        fsa.generateFile(/*這里包含兩個(gè)參數(shù):①所生成的文件名②上文中已獲取的所需生成文件的內(nèi)容*/)

        算法4描述了ReadImage算子的代碼生成過(guò)程.

        算法4.ReadImage算子代碼生成模板

        輸入:CVDSL中的ReadImage類型變量

        輸出:ReadImage對(duì)應(yīng)的C++代碼

        1.將ReadImage變量作為參數(shù)傳遞給compile函數(shù),在complie函數(shù)中,解析ReadImage的參數(shù),并用content記錄對(duì)應(yīng)的C++代碼

        varcontent=′′′′′′

        content+=′′′Mat ′′′

        content+=readImage.name.compile

        content+=′′′=imread(′′′

        content+=readImage.path.compile

        content+=′′′,′′′

        if(readImage.color==null)

        content+="IMREAD_COLOR"

        else

        content+=readImage.color.compile

        content+=′′′)′′′

        2.返回content

        returncontent

        3 實(shí)驗(yàn)及評(píng)估

        3.1 實(shí) 驗(yàn)

        3.1.1 實(shí)驗(yàn)過(guò)程

        本實(shí)驗(yàn)邀請(qǐng)了四位領(lǐng)域工作者,并提前對(duì)他們進(jìn)行了兩種語(yǔ)言的培訓(xùn).而后將他們分為兩組,分別使用CVDSL和C++來(lái)開(kāi)發(fā)貓眼識(shí)別、人臉識(shí)別和人臉定位三個(gè)CV應(yīng)用模型,并對(duì)開(kāi)發(fā)時(shí)間以及代碼量進(jìn)行了對(duì)比.

        3.1.2 實(shí)驗(yàn)結(jié)果及評(píng)估

        實(shí)驗(yàn)結(jié)果如表4、表5所示.從表4可知,采用CVDSL的開(kāi)發(fā)效率約為采用C++的3倍.從表5可知,采用CVDSL開(kāi)發(fā)的代碼量約為采用C++的0.5倍.由此可得到初步結(jié)論:在CV領(lǐng)域,使用CVDSL編程比C++編程效率更高,所編寫的代碼量更少,更加面向領(lǐng)域工作者,凸顯出了CVDSL的易用性和高效性.

        表4 CVDSL與C++開(kāi)發(fā)時(shí)間對(duì)比

        表5 CVDSL與C++代碼量對(duì)比

        表6為貓眼識(shí)別應(yīng)用模型示例,對(duì)比CVDSL源碼和所生成的C++代碼,可知CVDSL具有以下優(yōu)點(diǎn):

        1)語(yǔ)法規(guī)則嚴(yán)格統(tǒng)一;從表6可知,使用C++調(diào)用不同底層算子庫(kù)中的算子時(shí),在語(yǔ)法上是存在差異的.CVDSL在語(yǔ)法規(guī)則定義上,統(tǒng)一了所有算子的語(yǔ)法風(fēng)格,通過(guò)代碼生成器中制定的映射規(guī)則將這些差異透明化,從而可以極大降低領(lǐng)域工作者的編碼難度.

        2)相關(guān)頭文件及代碼自動(dòng)補(bǔ)全;在表6中,生成的C++代碼中編號(hào)為0的行,是依據(jù)函數(shù)體中使用的相關(guān)算子自動(dòng)補(bǔ)全的,既減少了領(lǐng)域工作者的編碼量,又降低了bug的出現(xiàn)率.

        3)算子合并;在構(gòu)建CV應(yīng)用模型時(shí),很多時(shí)候某些算子間有著嚴(yán)格的調(diào)用次序,那么在構(gòu)建元模型和定制語(yǔ)法規(guī)則時(shí),可將這些算子進(jìn)行合并.例如本例中CVDSL代碼中編號(hào)6的代碼行,在通過(guò)代碼生成后得到了對(duì)應(yīng)C++代碼中編號(hào)為6的兩行代碼.通過(guò)算子合并的方式可以極大降低領(lǐng)域工作者的編碼難度和編碼量.

        4)保證算子性能較優(yōu);通過(guò)前期的充分調(diào)研,以及與多位CV領(lǐng)域?qū)<?、工程師的充分溝通,本文?duì)實(shí)現(xiàn)不同功能的算子的性能進(jìn)行了評(píng)估.例如Halcon中與域處理相關(guān)的算子的性能要優(yōu)于其他算子庫(kù)中的相應(yīng)算子,因此在進(jìn)行代碼生成時(shí),以Region為前綴的算子,在生成的C++代碼中,默認(rèn)調(diào)用Halcon中的相應(yīng)算子.這樣領(lǐng)域工作者在進(jìn)行編碼時(shí),僅需考慮算子的功能,而無(wú)需考慮算子的性能優(yōu)劣,這在很大程度上提高了其編碼效率.

        5)隱藏不同算子庫(kù)中變量的聲明;不同算子庫(kù)中的某些變量,在C++代碼中有著不同的變量類型.例如OpenCV用Mat來(lái)表示圖像類型,而Halcon中用Himage來(lái)表示圖像類型.CVDSL通過(guò)在代碼自動(dòng)生成器中判別不同算子所屬的算子庫(kù)以及算子的參數(shù)類型,生成相應(yīng)變量聲明的C++代碼.同時(shí)CVDSL對(duì)不同類型變量的轉(zhuǎn)換進(jìn)行了封裝.這一過(guò)程對(duì)于領(lǐng)域工作者是透明的,從而降低了其編碼難度.

        3.2 基于FQAD對(duì)CVDSL的評(píng)估

        FQAD是基于ISO/IEC 25010:2011標(biāo)準(zhǔn)的用于DSL定性評(píng)估的框架[15].該框架定義了一套評(píng)估DSL質(zhì)量的特性,包括:功能適用性,可用性,可靠性,可擴(kuò)展性,可集成性,可維護(hù)性,生產(chǎn)力,兼容性,表達(dá)性和可重用性.本文基于以上特性,對(duì)CVDSL作出了如下評(píng)估:

        1)功能適用性是指DSL完全開(kāi)發(fā)的程度,即判斷DSL是否包括所有必要的功能且不包括域中不存在的功能.CVDSL擁有完整的面向于域的語(yǔ)法定義,且其底層有多個(gè)計(jì)算機(jī)視覺(jué)算子庫(kù)的支持,并支持算子庫(kù)的擴(kuò)展,因此可以滿足大部分計(jì)算機(jī)視覺(jué)應(yīng)用模型開(kāi)發(fā)的需求.且其語(yǔ)法規(guī)則不具有普適性,僅面向計(jì)算機(jī)視覺(jué)領(lǐng)域.綜上可知CVDSL擁有良好的功能適用性.

        2)可用性是指用戶可以使用DSL來(lái)實(shí)現(xiàn)指定目標(biāo)的難易程度.為分析CVDSL的可用性,本文邀請(qǐng)多位CV領(lǐng)域?qū)<液虲V領(lǐng)域工程師對(duì)CVDSL進(jìn)行了評(píng)估,得出的結(jié)論是:CVDSL簡(jiǎn)單且具有表現(xiàn)力,相對(duì)容易學(xué)習(xí).與通用編程語(yǔ)言C++相比,CVDSL降低了構(gòu)建CV應(yīng)用模型的復(fù)雜性,并提高了可理解性和可維護(hù)性.綜上可知CVDSL的可用性極高,未來(lái)可通過(guò)完善用戶使用手冊(cè)來(lái)進(jìn)一步提高CVDSL的可用性.

        3)可靠性是指生成可靠程序語(yǔ)言的屬性.CVDSL語(yǔ)法規(guī)則的定義較為完善,并且本文針對(duì)CVDSL的語(yǔ)法規(guī)則及CV領(lǐng)域C++代碼風(fēng)格定制了語(yǔ)法檢查器,大幅度減少了在編碼過(guò)程中可能產(chǎn)生的語(yǔ)法錯(cuò)誤.同時(shí)本文設(shè)計(jì)實(shí)現(xiàn)了基于模板映射的的代碼自動(dòng)生成器,使得每一行CVDSL代碼能夠轉(zhuǎn)換成對(duì)應(yīng)的C++代碼塊,確保了C++代碼風(fēng)格的統(tǒng)一.以上都是CVDSL可靠性的保證,未來(lái)可通過(guò)在CVDSL級(jí)定制調(diào)試器來(lái)進(jìn)一步提高CVDSL的可靠性.

        4)可擴(kuò)展性是指DSL添加新功能的難易程度.本文是采用模型驅(qū)動(dòng)開(kāi)發(fā)的方式對(duì)CVDSL進(jìn)行建模、設(shè)計(jì)與實(shí)現(xiàn)的,因此可方便的通過(guò)擴(kuò)展元模型來(lái)實(shí)現(xiàn)對(duì)CVDSL功能的擴(kuò)展,可見(jiàn)CVDSL擁有很好的擴(kuò)展性.

        表6 貓眼識(shí)別應(yīng)用模型示例

        5)可集成性是指DSL與其他語(yǔ)言和建模工具集成的難易程度.CVDSL的開(kāi)發(fā)是基于EMF工具和Xtext框架的,兩者均屬于Eclipse框架中的插件.Eclipse平臺(tái)允許開(kāi)發(fā)人員通過(guò)插件擴(kuò)展Eclipse IDE等Eclipse應(yīng)用程序以及其他功能,故未來(lái)可將CVDSL語(yǔ)言框架開(kāi)發(fā)為Eclipse框架中的插件,然后使用Eclipse IDE和整個(gè)OSGI組件模型來(lái)完成CVDSL和其他語(yǔ)言的集成.

        6)可維護(hù)性是指DSL易于維護(hù)的程度.可維護(hù)性與可擴(kuò)展性相關(guān),上文中已說(shuō)明CVDSL具有很好的可擴(kuò)展性,并且CVDSL的構(gòu)建是基于元模型的,故易于修改和完善.由此可知CVDSL是具有良好的可維護(hù)性的.

        7)生產(chǎn)力是指DSL提高編程效率的程度.CVDSL僅面向計(jì)算機(jī)視覺(jué)領(lǐng)域,因此與通用編程語(yǔ)言相比,在領(lǐng)域概念的描述上有著明顯的優(yōu)勢(shì),便于領(lǐng)域工作者的建模.從上文的實(shí)驗(yàn)中可知使用CVDSL開(kāi)發(fā)CV應(yīng)用模型的效率約為C++的3倍,大大提高了領(lǐng)域工作者的開(kāi)發(fā)效率.

        8)兼容性是指DSL與域和開(kāi)發(fā)過(guò)程的兼容程度.CVDSL是基于CV領(lǐng)域元模型的,因此與CV領(lǐng)域有很好的兼容性.同時(shí)CV領(lǐng)域元模型的構(gòu)建與CV應(yīng)用模型的開(kāi)發(fā)過(guò)程密切相關(guān),這使得CVDSL與開(kāi)發(fā)過(guò)程也有著良好的兼容性.

        9)可重用性是指DSL的語(yǔ)言結(jié)構(gòu)在其他語(yǔ)言中的使用程度.CVDSL本身的語(yǔ)言結(jié)構(gòu)是唯一的,但為CVDSL所定制的基于模板映射的代碼自動(dòng)生成器是可重用的,通過(guò)修改映射規(guī)則,CVDSL可以轉(zhuǎn)換成任意一種通用編程語(yǔ)言.同時(shí)CVDSL底層的算子庫(kù)也是可重用的,凡有相應(yīng)算子庫(kù)接口的語(yǔ)言均可調(diào)用.

        10)表達(dá)性是指問(wèn)題解決策略映射為程序的難易程度.CVDSL的語(yǔ)法規(guī)則是針對(duì)CV領(lǐng)域而定制的,因此其對(duì)于任何CV應(yīng)用模型都有很好的表達(dá)性.與C++相比,CVDSL封裝了很多與問(wèn)題解決策略無(wú)關(guān)的編程細(xì)節(jié),如類型轉(zhuǎn)換等.通過(guò)使用CVDSL,領(lǐng)域工作者可以輕松的將問(wèn)題解決策略映射為程序.在CV領(lǐng)域,CVDSL有著強(qiáng)大的表達(dá)性.

        3.3 CVDSL與Halide的性能比較

        Halide是面向圖像處理的著名領(lǐng)域特定語(yǔ)言,比起傳統(tǒng)編程語(yǔ)言,用Halide編寫的程序不僅更容易閱讀、編寫和修改,而且由于Halide能夠自動(dòng)優(yōu)化代碼,因此程序運(yùn)行速度也顯著提高[16].Halide語(yǔ)言將算法描述、算法中數(shù)據(jù)存儲(chǔ)與計(jì)算執(zhí)行等調(diào)度方便的內(nèi)容解耦合,從而算法的描述和性能的優(yōu)化可以分開(kāi)進(jìn)行,可在不改動(dòng)算法的情況下對(duì)算法進(jìn)行調(diào)優(yōu)[17].

        下面基于FQAD中定義的特性,對(duì)CVDSL與Halide進(jìn)行性能比較:

        1)功能適用性:Halide和CVDSL均只面向計(jì)算機(jī)視覺(jué)領(lǐng)域,在語(yǔ)法上均不具有普適性,且均能滿足大部分計(jì)算機(jī)視覺(jué)應(yīng)用模型的開(kāi)發(fā),因此都具有很好的功能適用性.但在對(duì)代碼性能要求更高的情況下,Halide要優(yōu)于CVDSL.

        2)可用性:Halide不是獨(dú)立的編程語(yǔ)言,而是嵌入在C++中的.在語(yǔ)法上,相比較于CVDSL,要復(fù)雜一些,CVDSL更易于學(xué)習(xí)和使用.可用性上CVDSL要優(yōu)于Halide.

        3)可靠性:Halide是非常成熟的商用編程語(yǔ)言,有獨(dú)立的編譯器,能在多種操作系統(tǒng)上運(yùn)行,且其能自動(dòng)優(yōu)化代碼.而CVDSL目前沒(méi)有獨(dú)立的編譯器,僅提供從CVDSL到C++的代碼自動(dòng)生成器.因此在可靠性上比Halide稍差一些.

        4)可擴(kuò)展性:Halide是成熟的商用編程語(yǔ)言,普通用戶很難在功能上進(jìn)行擴(kuò)展.而具有開(kāi)發(fā)經(jīng)驗(yàn)的用戶可通過(guò)擴(kuò)展元模型,方便的對(duì)CVDSL進(jìn)行功能擴(kuò)展.Halide提供C++API,甚至可以將Halide中功能強(qiáng)大的算子擴(kuò)展到CVDSL中,因此CVDSL有著更優(yōu)的可擴(kuò)展性.

        5)可集成性:CVDSL是一門獨(dú)立的語(yǔ)言,因此很難做到和其他語(yǔ)言集成,但后期可將CVDSL開(kāi)發(fā)成Eclipse的插件,因此可將其與其它建模工具進(jìn)行集成.Halide在某種意義上可看做一個(gè)函數(shù)庫(kù),因此它可與其它提供接口的通用編程語(yǔ)言進(jìn)行集成.由此可見(jiàn)在不同層面上,CVDSL和Halide都有較好的集成性.

        6)可維護(hù)性:CVDSL的構(gòu)建是基于元模型的,具有良好的維護(hù)性.Halide作為一門著名的編程語(yǔ)言,同樣具有很好的維護(hù)性.

        7)生產(chǎn)力:CVDSL語(yǔ)法更簡(jiǎn)潔,底層算子庫(kù)更龐大.但Halide對(duì)于代碼的優(yōu)化更好,因此兩者都可以大大提高領(lǐng)域工作者的開(kāi)發(fā)效率.對(duì)于不同的開(kāi)發(fā)需求,兩者所能帶來(lái)的效率提升則不同.

        8)兼容性:CVDSL和Halide都是僅面向計(jì)算機(jī)視覺(jué)的編程語(yǔ)言,因此兩者與域及開(kāi)發(fā)過(guò)程必然具有很好的兼容性.

        9)可重用性:CVDSL的可重用性體現(xiàn)在基于模板映射的代碼生成器.而Halide有著獨(dú)立的編譯器,其語(yǔ)言結(jié)構(gòu)很難在其他語(yǔ)言中重用,因此CVDSL相比較于Halide,有著更好的可重用性.

        10)表達(dá)性:CVDSL與Halide對(duì)于任何CV領(lǐng)域的問(wèn)題,都可以方便的將解決策略映射為程序,因此兩者都具有很好的表達(dá)性.

        綜上可知,CVDSL與Halide各有優(yōu)劣,選擇哪門開(kāi)發(fā)語(yǔ)言完全依賴于開(kāi)發(fā)需求.

        4 總 結(jié)

        本文基于CV領(lǐng)域元模型,采用模型驅(qū)動(dòng)開(kāi)發(fā)的方式,設(shè)計(jì)實(shí)現(xiàn)了一種面向計(jì)算機(jī)視覺(jué)的領(lǐng)域特定語(yǔ)言——CVDSL.本文首先分析了CV領(lǐng)域元模型的結(jié)構(gòu)及構(gòu)建方法,然后在領(lǐng)域元模型的基礎(chǔ)上,定義了CVDSL的語(yǔ)法規(guī)則,并依據(jù)語(yǔ)法規(guī)則定制了語(yǔ)法檢查器,以減少在使用CVDSL編碼過(guò)程中出現(xiàn)的語(yǔ)法錯(cuò)誤.最后本文基于模板映射規(guī)則,設(shè)計(jì)實(shí)現(xiàn)了將CVDSL轉(zhuǎn)換為C++的代碼自動(dòng)生成器,保證了其通用性和安全性.

        本文通過(guò)實(shí)驗(yàn)和FQAD框架,對(duì)CVDSL做了詳細(xì)評(píng)估,分析了CVDSL所具有的優(yōu)勢(shì)和特性,并依據(jù)FQAD對(duì)CVDSL和Halide進(jìn)行了比較.在未來(lái)的工作中,可通過(guò)定制CVDSL級(jí)調(diào)試器來(lái)提升其可靠性,并可通過(guò)將CVDSL語(yǔ)言框架封裝成Eclipse插件的方式來(lái)提升其可集成性.

        猜你喜歡
        規(guī)則語(yǔ)言模型
        一半模型
        撐竿跳規(guī)則的制定
        數(shù)獨(dú)的規(guī)則和演變
        重要模型『一線三等角』
        重尾非線性自回歸模型自加權(quán)M-估計(jì)的漸近分布
        語(yǔ)言是刀
        文苑(2020年4期)2020-05-30 12:35:30
        讓語(yǔ)言描寫搖曳多姿
        讓規(guī)則不規(guī)則
        Coco薇(2017年11期)2018-01-03 20:59:57
        TPP反腐敗規(guī)則對(duì)我國(guó)的啟示
        累積動(dòng)態(tài)分析下的同聲傳譯語(yǔ)言壓縮
        国产另类av一区二区三区| 亚洲av网一区二区三区| 久久久国产精品免费a片3d| 亚洲日韩乱码中文无码蜜桃臀 | 日本一区二区在线看看| 亚洲美女毛片在线视频| 日本熟妇人妻xxxx| 樱花草在线播放免费中文| 97精品国产91久久久久久久| 国产不卡在线免费视频| av网址在线一区二区| 中文字幕女同系列在线看一| 私人vps一夜爽毛片免费| 亚洲精品综合一区二区三| 妺妺窝人体色www聚色窝| 日本熟女人妻一区二区三区| 午夜视频一区二区三区四区| 久久亚洲日韩精品一区二区三区| 精品成人乱色一区二区| 中文字幕Aⅴ人妻一区二区苍井空| 网友自拍人妻一区二区三区三州| 91成人国产九色在线观看| 亚洲av成人精品日韩在线播放| 午夜男女爽爽爽在线视频| 中文字幕经典一区| 亚洲精品99久91在线| 亚洲精品国产精品乱码在线观看 | 亚洲欧美日韩一区二区三区在线| 岛国成人在线| 国产人成在线成免费视频| 亚洲一区二区三区精品久久av | 欧美性白人极品1819hd| 国产99久久久久久免费看| 国产精品伦人视频免费看| 精品少妇一区二区三区四区 | 色综合久久天天综线观看| 久久九九av久精品日产一区免费| 中文字幕在线乱码av| 免费a级毛片无码免费视频120软件| 乱子伦视频在线看| 日韩一区二区不卡av|