馬方超
(承德市教育局 河北 承德 067000)
在生產和科研過程中,有時需要用到大量計算機視覺算子,比如OpenCV算子、Halco算子還有其他商業算子,這種算子之間的配合調度比較麻煩,也不易集成。例如在對某產品包裝的缺陷進行檢查時,比較好的方法就是首先做A濾波器然后再做亞像素的邊界提取,A濾波算子有OpenCV供給,但亞像素的邊界提取則有某商用算子庫供給,因此必須通過跨算子庫調度兩種算子。盡管這種商用算子庫一般都給出了C++接口,采用C++語言即可實現上述任務,但由于編碼過程較為復雜,再加上部分電腦視覺開發者并不是計算機專業出身,所以他們更喜歡采用一類更抽象、簡潔的編程語言。所以研究人員已經設計并實現了一個DSL,這一DSL降低了解碼時限和解碼量,同時擁有豐富研發經歷的使用者也能夠更改或增加平臺內的元模型,以便于進行對平臺的擴充。本文把面向對象計算機視覺的領域特定語言稱為CVDSL。
計算機視覺(computer vision,CV)是指通過電腦或有關裝置對生物視覺的某種仿真,最終目標是讓電腦可以像人那樣利用視覺觀察進而認識整個世界,擁有主動適應環境的能力。近些年,電腦視覺技術得到了蓬勃發展,大量高效、實用的AI算子被制作出來,同時對傳統CV算子庫也進行了調整和優化。越來越多的機器視覺的程序和模式將被普遍采用。
機器視覺應用模式的特征是在完成一定目標后,按照預設順序進行操作。當運用特定編程語言(如C++)去完成某個計算機視覺的應用模型時,具體程序中通常首先包含對某個算子庫的引入、基本結構句子(如循環句子、分支句子、賦值語句等)和對算子庫的具體算子的運用。因此掌握計算機視覺基本處理過程,對于如何去建立CV領域元模型的CVDSL語言程序非常關鍵。
領域特定語言(domain specific language, DSL)是領域工程技術之一,它是在某一專門領域中具有受限制表達特性的一個計算機程序設計語言圈。不同于一般的編程語言,它的使用特定的抽象層次比較高。下面介紹了幾個相對通用的領域特定編程語言:用來描述Web網站的HTML語言,以及用來構建軟件系統的Ant, RAKE,MAKE,用來描述語言的BNF范式,語法分析器的編程語言YACC,Bison,ANTLR,用來數據庫結構化檢查的編程語言SQL,以及用來定義格式表的編程語言CSS,專用的排版系統LaTe等。近些年由于新一代人工智能的迅速發展,有些面向機器教學、深度研究的領域特定編程語言也隨之面世,比如OptiML,DeepDSL等。
本文中首次提出了建立CV領域元模型的基本途徑和方法,并通過研究領域內的共性與變性所要求的原始數據種類、所需要的原始數據數量等一系列的關鍵要素,進一步明確了元模型的構建要求,并在此基礎上形成了CV領域元模型[1-2]。
在對CV領域元模型映射和持久化的基礎上,確定了CVDSL方法規范體系。并且使用自描述語法規則庫,還自定義了模型的語法檢查器。語言檢查的主要目的,是用來避免開發者在使用一項特殊的代碼時會出現語法錯誤,進而降低生成程序的質量準確性。
本文通過研發基于模板映射語言的、滿足領域特定要求的應用模板代碼自動生成功能,實現了將CVDSL編碼轉換成相應的C++編程語言的代碼自動生成器,以及實現了領域中特定程序向應用語言的自動轉化。
元模型的構建依據是元對象機制(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.1 元模型映射
在CV領域中,元模型自身被反映成區域特殊編程語言中的結構框架,而每一個元模型都會反映成區域特殊編程語言的每一段基本語言規范的算子概念,而元模型的參數則反映成區域特殊編程語言的每一段基本語言規范概念的形參概念。
2.2.2 規則添加
研究人員可以選用Xtext框架作為CVDSL語法規范定義的工具,由于它主要支持對Ecore元類型的導入。而Xtext則是一個基于Eclipse的公開源代碼框架,配套編程語言也是Xtend,所以它主要進行DSL的編寫和實現。
Xtext工具可以獲取所有元模型語法的關鍵字和特征,并連接它們,從而形成抽象語法樹。通過Xtext的XModelSet()工具可以瀏覽EM F工程中的元Model文本夾,并捕獲所有類名、屬性、特征之間的邏輯關系等。
作為DSL語言來說,本身也是一個不成熟的語言,所以在制定語言模板的時候不要用基于語言模板所生成的代碼,在執行語法檢索時會出現特征性質的不足等現象。但是,要讓應用開發者可以簡單地捕捉到DSL程序中的關鍵數據,從而方便定制代碼中生成的模板。
語言檢測系統應以范圍內特定語言的句法模式為基準,并定制模型化語言檢測器。模型語言檢測器經過用戶對模型的篩選,并找出與其相關的目標根節點,進而找出應用模塊所相對的語言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)。
因為電腦視覺領域軟件的規模巨大、功能繁雜、迭代更新速度快等原因,再加上對人工代碼的撰寫習慣不同和良莠不齊的不確定性,所以指望人工通過領域語言代碼寫出通用代碼是不現實的。選擇代碼自主生產是必然結果。
應用模型代碼生成技術,可以讓系統設計者獲得更多的設計知識,并促使程序員把更多的知識用在系統架構設計上,能夠增強系統健壯度、可擴展性以及可維護性。所以,為CV領域而開發的非領域語言代碼生成器,必須建立在已研究的領域語言規范基礎上和其他領域語言規范基礎上,與研究進程中不同階段的語言模型整合,便于生成內容一致且遵循規范準則的持久化模型文件,然后再把模型文件利用語言代碼生成器,制作為完全遵循已有規范的通用編程語言。
CVDSL的開發過程是采用標準模型驅動結構的,所以它擁有相當好的可延伸性。而CVDSL的可延伸性主要體現在可對CVDSL的語法規范進行調整、可對底層的算符庫進行擴展、可對代碼生成器的映射規范進行調整,等等。對一個擁有領域內特定語言開發經歷的人而言,對CVDSL的功能加以擴充是相當容易的,因此可見CVDSL擁有良好的可擴展性。而用戶也只需要按照自身的實際需要,逐一進行具體的使用即可[5]。
本文對擴展CVDSL功能的過程進行了總結,主要分為以下六步:(1)了解CVDSL的源碼(僅需掌握與需求相關的部分源碼即可);(2)修改CV領域元模型;(3)修改或添加CVDSL語法規則項;(4)修改或添加語法檢查器的功能(非必須);(5)修改或添加代碼生成器映射規則;(6)測試。由此也可看出,CVDSL的功能是可擴展的,而且也是易擴展的,使用者只需依據自己的需求,逐步完成相應的操作即可。
研究人員采用了CV領域元模型,并通過建模驅動研究的方法,設計實現了一個面向對象計算機可視化的領域特殊編程語言——CVDSL。文章中首先研究了CV領域元模型的構成和建立方式,進而在領域元模型的基礎上,確立了CVDSL的語言規范,并根據語法規則還定制了語法檢查器,以降低在進行CVDSL代碼進程中產生的句法問題。最后研究人員還根據模板映射規則,設計并完成了將CVDSL轉化為C++的代碼自動生成器,從而提高了其通用性與安全性。經過實驗和FQAD框架,對CVDSL做出了評價,并分析了CVDSL所具備的優點和特點,在未來的工作,可以采用自定義CVDSL級調試程序來提高其安全性,并可以采用把CVDSL語言框架包裝為Eclipse插件的方法來提升其可集成性。