• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

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

      2020-05-12 09:09:46鄭啟龍
      關(guān)鍵詞:代碼生成算子代碼

      姜 靖,鄭啟龍,2

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

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

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

      1 引 言

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

      2)算子庫部分.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..*”表示一個a包含0個或多個b,”0..1”表示一個a包含0個或1個b.整個元模型為樹形結(jié)構(gòu),DomainModel為樹的根節(jié)點.元模型的樹形結(jié)構(gòu)是下文建立語法規(guī)則樹的基礎(chǔ),也是代碼自動生成器中,關(guān)鍵字查詢匹配的基礎(chǔ).

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

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

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

      2.2.1 元模型的映射

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

      2.2.2 規(guī)則添加

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

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

      本文選擇Xtext框架作為CVDSL語法規(guī)則定義的工具,因為其支持Ecore元模型的導(dǎo)入.Xtext是一種基于Eclipse的開源框架,配套語言為Xtend,其主要用于DSL的設(shè)計與實現(xiàn).

      語法模型映射活動圖如圖4所示.

      圖4 語法模型映射

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

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

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

      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的語法規(guī)則框架是繼承于元模型的樹形結(jié)構(gòu)的.

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

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

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

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

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

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

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

      terminalBOOL:′true′ | ′false′;

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

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

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

      CharacterType:STRING | ID;

      RealType:INT | DOUBLE;

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

      2.3 定制語法檢查器

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

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

      圖5 語法檢查流程

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

      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()接口.這兩個接口都需要提供代碼的定位以便標(biāo)注,同時為了用戶修改的方便,還需要提供相應(yīng)的提示文字.如果該類錯誤可控性較高,則將該錯誤用一串字符串作為特征,調(diào)用CVDSLQuickfixProvider.Xtend相應(yīng)快速修復(fù)方法.

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

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

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

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

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

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

      1.通過代碼生成器中的過濾器獲取每一個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文件中快速修正首字母為大寫的過程.

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

      輸入:Issue類對象,IssueResolutionAcceptor對象

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

      1.將輸入中的系統(tǒng)類的對象傳入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 語法檢查器運行示例

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

      2.4 定制代碼自動生成器

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

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

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

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

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

      圖6 代碼自動生成活動圖

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

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

      輸入:Resource類對象,IFileSystemAccess類對象,IGeneratorContext類對象

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

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

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

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

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

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

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

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

      輸入:CVDSL中的ReadImage類型變量

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

      1.將ReadImage變量作為參數(shù)傳遞給compile函數(shù),在complie函數(shù)中,解析ReadImage的參數(shù),并用content記錄對應(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 實驗及評估

      3.1 實 驗

      3.1.1 實驗過程

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

      3.1.2 實驗結(jié)果及評估

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

      表4 CVDSL與C++開發(fā)時間對比

      表5 CVDSL與C++代碼量對比

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

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

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

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

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

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

      3.2 基于FQAD對CVDSL的評估

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

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

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

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

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

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

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

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

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

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

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

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

      3.3 CVDSL與Halide的性能比較

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

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

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

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

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

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

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

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

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

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

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

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

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

      4 總 結(jié)

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

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

      猜你喜歡
      代碼生成算子代碼
      擬微分算子在Hp(ω)上的有界性
      各向異性次Laplace算子和擬p-次Laplace算子的Picone恒等式及其應(yīng)用
      Lustre語言可信代碼生成器研究進(jìn)展
      一類Markov模算子半群與相應(yīng)的算子值Dirichlet型刻畫
      創(chuàng)世代碼
      動漫星空(2018年11期)2018-10-26 02:24:02
      創(chuàng)世代碼
      動漫星空(2018年2期)2018-10-26 02:11:00
      創(chuàng)世代碼
      動漫星空(2018年9期)2018-10-26 01:16:48
      創(chuàng)世代碼
      動漫星空(2018年5期)2018-10-26 01:15:02
      Roper-Suffridge延拓算子與Loewner鏈
      代碼生成技術(shù)在軟件開發(fā)中的應(yīng)用
      電子世界(2016年15期)2016-08-29 02:14:28
      红桥区| 常山县| 喀喇| 台北市| 宜春市| 延边| 广饶县| 阿图什市| 濮阳县| 沛县| 利川市| 天等县| 惠水县| 东源县| 三亚市| 绥德县| 望都县| 北安市| 吉首市| 砚山县| 崇文区| 山西省| 金门县| 安阳县| 葫芦岛市| 航空| 清徐县| 慈利县| 闸北区| 东辽县| 泰州市| 桦甸市| 卢湾区| 嘉荫县| 积石山| 称多县| 卢龙县| 丹凤县| 高尔夫| 大新县| 青龙|