迪力夏提·多力昆,張?zhí)t,馮向萍
(新疆農業(yè)大學 計算機與信息工程學院,新疆 烏魯木齊 830052)
隨著計算機技術的發(fā)展,在深度學習領域中,數(shù)據(jù)集的選擇很重要,在構造數(shù)據(jù)集時,需要注意做好數(shù)據(jù)的清洗和標注,一個高質量的數(shù)據(jù)集往往能夠提高模型訓練的質量和預測的準確率。在沒有大規(guī)模的圖像數(shù)據(jù)集的情況下,為提高數(shù)據(jù)集質量,筆者設計了一種基于Django[1-2]的LabelMe[3-4](圖像標注工具)標注核對系統(tǒng)。
該文使用的圖像標注工具為LabelMe,在使用LabelMe標注工具完成標注后,通常對標注進行核對檢查。這是一個繁瑣且耗時的事情,需對每張圖片的每個標簽進行逐個點擊,并核對檢查標注與標簽的一致性。為解決該問題,降低核對工作中的復雜性,減少耗時,該文將分別從Django框架的技術、總體設計、數(shù)據(jù)庫設計、關鍵技術及系統(tǒng)界面展示等五個方面詳述。
Django框架技術是一種開放源代碼式的Web[5-6]應用型框架,由Python[7]程序設計語言寫成,該框架設計模式為MTV[8],選用成熟的框架可避免代碼間迭代耦合等機制,還可根據(jù)具體需求,直接調用框架內部方法,更容易完成開發(fā)。Django框架也是一個遵循MVC[9]設計模式的框架,即模型、視圖、控制器。它們各自職責如下:
(1)模型層(Model):作為Web應用中最重要的一部分,它涵蓋了整個系統(tǒng)的實體類以及各種變量和方法規(guī)則,負責訪問及更新數(shù)據(jù)庫,為域名訪問使用的服務器提供接口。
(2)視圖層(View):視圖層主要是當有請求服務時來產(chǎn)生應答,并由HTML在界面上供使用者操作。主要以表單的形式傳給后臺,還可對其進行校驗,使開發(fā)者不必關心界面的相關問題,專注于業(yè)務邏輯的開發(fā)與實現(xiàn)。
(3)模板(Templates):模板是將數(shù)據(jù)的內容與展現(xiàn)分離,Django框架可隨時替換變更,并滿足用戶多樣需求,不局限于內置模板。強調代碼復用性,以插件形式將多個組件服務于整個框架,并隨時支持擴展,使得Django框架搭建Web平臺具有較強的擴展性。
系統(tǒng)的總體設計如圖1所示,主要有項目管理、原圖記錄、導入JSON[10]、統(tǒng)一標簽名、批量生成標注圖、核對標注圖、導出JSON文件等七大功能模塊,其數(shù)據(jù)存儲部分使用Django框架自帶的SQLite3[11-12]數(shù)據(jù)庫。
(1)項目管理:該模塊作為系統(tǒng)的基礎模塊,主要用來管理來自不同項目的LabelMe數(shù)據(jù)集,使其相互獨立。擁有創(chuàng)建、修改、裁剪主要目標的功能。
(2)原圖記錄:該模塊主要在數(shù)據(jù)庫中記錄圖片路徑及標注狀態(tài),并在數(shù)據(jù)庫中創(chuàng)建圖片表,其一張圖片對應一條記錄。
(3)導入JSON:該模塊主要用于導入標注集到數(shù)據(jù)庫中,一個標簽對應一條記錄,且圖片表與標簽表為一對多關系,同時生成標簽的匯總表。擁有導入新標注數(shù)據(jù)和導入修改后的標注數(shù)據(jù)集的功能。
(4)標簽設置:該模塊主要用來統(tǒng)一標簽的英文名,同時設置標簽的序號、中文名、顏色、字體位置和是否導出等功能,并通過預覽查看設置效果。
(5)批量生成掩碼圖:該模塊主要用來批量生成掩碼圖,通過設置好的標簽,使用OpenCV[13]生成掩碼圖,使用戶核對標注時無需逐個生成掩碼圖,加快核對速度。
(6)標注核對:該模塊為核心模塊,主要用來核對標注集,通過生成的掩碼圖以核對標簽名稱與對應標注物是否一致。擁有切換、修改、預覽等功能。
(7)導出JSON:該模塊為完成標注核對后的最后一部分,主要用于導出系統(tǒng)中核對后的JSON標注數(shù)據(jù)。擁有導出所有數(shù)據(jù)、移除需刪除數(shù)據(jù)、拷貝需修改數(shù)據(jù)和在標簽名后面追加序號等功能。
數(shù)據(jù)庫的設計是系統(tǒng)設計環(huán)節(jié)中必不可少的一環(huán),一個功能完善、結構合理的數(shù)據(jù)庫能夠幫助系統(tǒng)更高效、便捷地管理系統(tǒng)的各項數(shù)據(jù)。在數(shù)據(jù)庫設計中,ER模型是一種能夠改善開發(fā)人員與用戶之間的溝通交流的建模工具,能夠準確地描述數(shù)據(jù)的各種相關特性以及它們之間的互相約束關系,是一種概念性設計。通過ORM[14](對象關系映射)的方式建立Model層與數(shù)據(jù)庫的映射,完成數(shù)據(jù)庫的具體數(shù)據(jù)表的生成。EER[15](增強實體關系模型)則是對其進行了進一步細化,轉換成了關系模型,與具體的數(shù)據(jù)庫管理系統(tǒng)有關。系統(tǒng)的EER模型如圖2所示。
通過圖2對系統(tǒng)數(shù)據(jù)庫中各個結構的展示,可以清楚地發(fā)現(xiàn)數(shù)據(jù)庫不同表之間的具體關聯(lián)關系以及它們的總體情況。本節(jié)將根據(jù)之前的分析結果,綜合項目開發(fā)過程中的具體情況,創(chuàng)建數(shù)據(jù)Model并通過ORM映射生成具體的數(shù)據(jù)表,分別是項目表、匯總表、圖片表和標簽表,并對數(shù)據(jù)表做詳細說明。
該表主要用于管理不同項目的數(shù)據(jù)集,使同項目之間互不干擾。字段有id號、項目英文名、項目中文名、是否裁剪主要目標、X軸裁剪比例和Y軸裁剪比例。其中裁剪目標指的是在原圖上進行目標的裁剪,使圖片只包含主要目標,過濾其他背景。在馬匹四肢別征數(shù)據(jù)集中,裁剪目標設置為馬匹,裁剪比例設置為-1,使其生成的掩碼圖只包含馬匹,且裁剪比例為馬匹框長寬+10%。項目表的具體結構見表1。
表1 項目表結構
該表主要用于統(tǒng)一標簽名及設置不同標簽之間的顏色及中文名坐標。字段有id號、項目分類、標簽英文名、標簽中文名、標簽序號、標簽掩碼顏色其RGB三通道色值、標簽中文名X軸坐標、標簽中文名Y軸坐標、標簽掩碼顏色是否取色差和是否導出。其中標簽英文名用來統(tǒng)一標簽名,若有同一個物體的標簽名誤寫有多個或更改標簽名,可以通過更改標簽英文名實現(xiàn)。標簽中文名主要用來提示掩碼圖中該物體的中文名,方便快速核對。其標簽中文名坐標是防止出現(xiàn)遮擋掩碼而設立。匯總表的具體結構見表2。
表2 匯總表結構
該表主要用于記錄圖片地址及狀態(tài)。字段有id號、項目分類、原圖名、原圖后綴名、原圖路徑、掩碼圖路徑、掩碼圖中中文字體大小、JSON文件是否導入、掩碼圖生成狀態(tài)和圖片狀態(tài)。其中圖片狀態(tài)主要用來判斷圖片的標注數(shù)據(jù)的狀態(tài),分別為未核對、無問題、有問題、需修改和需刪除共五種狀態(tài)。圖片表的具體結構見表3。
表3 圖片表結構
該表主要用于操作標注數(shù)據(jù)集。字段有id號、圖片表外鍵、標簽分類、標注數(shù)據(jù)值、修改時間和標簽狀態(tài)。其中標注數(shù)據(jù)值分別有標簽名、坐標值、Group值、ShapeType值和Flags值。標簽名關聯(lián)匯總表,為一對多關系。坐標值為標注物在圖像中的坐標。項目表的具體結構見表4。
表4 標簽表結構
本系統(tǒng)的關鍵技術是通過標注坐標生成掩碼圖,掩碼是由0和1組成的一個二進制圖像。用選定的圖像、圖形或物體,對待處理的圖像的全部或局部進行遮擋,用來控制圖像。該文用于在馬匹圖像中將馬匹、四肢和別征用不同顏色鏡像顯示,方便用戶一眼就能快速核對,如圖3所示。
在本系統(tǒng)中使用導入的JSON標注數(shù)據(jù),查詢與圖片關聯(lián)的標簽表及匯總表,通過OpenCV將設置好的標簽顏色、標簽中文名和標簽中文名坐標繪制出來,下面詳細闡述其具體步驟。
(1)獲取標簽:在JSON標注集中,標簽的順序是以手工標注物體的順序存放,而每張圖的標注順序不同,故無法按照固定順序獲取標簽。本系統(tǒng)將每個標簽存入標簽表中,一個標簽為一條記錄,同一張圖中的標簽以圖片表和匯總表關聯(lián),通過匯總表中用戶設置的序號排序,獲取每張圖中的標簽。
(2)繪制掩碼圖:通過獲取到的標簽,取出每個標簽的坐標值并將其轉換成OpenCV的嵌套字典格式,通過OpenCV的fillPoly函數(shù)生成mask層,并對標簽坐標值進行半透明填充。
(3)計算中文字體坐標:在繪制圖片中文名之前需要指定其標注中文名的坐標,而每個標簽位置不同,本系統(tǒng)從獲得的標簽中通過標簽坐標值得到該標簽邊框的左上角與右下角的坐標,獲取的文字坐標值見公式1。
(1)
其中,X和Y為標簽中文名坐標值,x1和y1為標簽邊框左上角坐標,x2和y2為標簽邊框右下角坐標。ratioX和ratioY為用戶設置的標簽坐標比例,以邊框左上角為原點,將標簽邊框長度和寬度除10為基本比例單位,ratioX和ratioY的值從-10到10控制標簽中文名的文字位置。
(4)繪制標簽中文名:在繪制標簽中文名時,有些圖片中將看不清文字,因此需要給文字添加背景,在本系統(tǒng)中添加的背景為白色矩形實體框,之后再繪制文字。白色矩形框的左上角坐標值為標簽中文名的左上角坐標值,其右下角的坐標值見公式2。
(2)
因中文、英文數(shù)字、符號所占長度空間不同,以字節(jié)為單位獲取文字實際長度,其中BLen為文字字節(jié)長度,TLen為文字個數(shù)長度,通過公式即可獲取文字實際長度LLen。因每張圖片長和寬不同,可能會出現(xiàn)字體太大遮擋圖片的情況,若遇到不合適的字體大小值,則需要用戶手動設置該圖片的文字大小TSize,默認值為55。X和Y為白色矩形框右下角坐標值。
在用戶界面部分,根據(jù)具體需求,需要制作一個快速核對標注的界面。并在界面設計上,做到簡單明了與易于操作。本節(jié)主要是對系統(tǒng)的各個功能模塊進行展示,主要包括項目管理、原圖記錄、導入JSON、統(tǒng)一標簽名、批量生成標注圖、核對標注圖、導出JSON等七大功能模塊。
該模塊主要是管理不同項目的LabelMe數(shù)據(jù)集,模塊界面見圖4。用戶進行項目管理界面后,輸入項目英文名和中文名,點擊創(chuàng)建目錄,即可生成以項目名稱為名的項目文件夾,其中存放有圖片集、標注集、修改、刪除和掩碼等五個文件夾,用戶需要把原圖放到image文件夾中,標注文件放到JSON文件夾中。該模塊作為該系統(tǒng)的基礎模塊,主要用來管理不同項目的LabelMe數(shù)據(jù)集,使其相互獨立。該模塊的主要功能是為用戶生成存放【原圖】和【標注】的空文件夾,同時生成數(shù)據(jù)集的【修改】、【刪除】、【掩碼】圖的空文件夾。【修改】文件夾是用戶核對標注后,若有標注有問題,可將圖片狀態(tài)改為有問題,最后導出有問題JSON文件,系統(tǒng)會將所有有問題圖片的標注文件和原圖拷貝到【修改】文件夾,方便用戶修數(shù)據(jù)集使用。
【刪除】文件夾則是若該圖片不可用,可將圖片狀態(tài)改為需刪除,系統(tǒng)會將所有有問題圖片的標注文件和原圖移動到【修改】文件夾,并將數(shù)據(jù)庫中的數(shù)據(jù)清除,方便用戶最后導出JSON文件。
【掩碼】文件夾為用戶核對前,系統(tǒng)通過批量生成標掩碼圖,方便用戶快速核對標注。需要注意的是,在最后導出核對后的標注集時,系統(tǒng)會覆蓋【標注】文件夾的JSON標注文件。
該模塊主要是在數(shù)據(jù)庫中記錄圖片路徑及標注的狀態(tài),模塊界面見圖5。
用戶進入原圖記錄界面后,需要先將原圖集放入【原圖】文件夾,再選擇項目并提交,待進度條達到100%后,提示已完成即可完成圖片記錄工作。
該模塊主要用來導入標注集到數(shù)據(jù)庫中,一個標簽名對應一條記錄,圖片表與標簽表為一對多關系,模塊界面與圖5相似,下拉框內容不同。
用戶進入導入JSON界面后,需要先將標注集放入【標注】文件夾,再選擇項目并提交,待進度條達到100%后,提示已完成即可完成標注集導入工作。
在核對標注環(huán)節(jié)中若有圖片與標注無法對應,需要重新導入修改后的標注集,用戶選擇“重新導入需修改JSON”選項并提交,系統(tǒng)會將狀態(tài)為需修改的標簽數(shù)據(jù)從數(shù)據(jù)庫中清除,并將修改后的標注數(shù)據(jù)重新導入到數(shù)據(jù)庫中。待進度條達到100%后,提示已完成即可。
該模塊主要用來統(tǒng)一標簽名英文名和設置標簽屬性。在導入JSON文件時會一同生成匯總表,相同英文名標簽只生成一條記錄,匯總表和標簽表也是一對多關系,模塊界面見圖6。
用戶進入導入JSON界面后,可設置標簽的序號、中文名、顏色、字體位置和是否導出,并通過預覽檢查設置情況。若修改標簽英文名與其他標簽英文名相同,則系統(tǒng)會合并標簽。標簽的排序號則會按照從小到大的順序排序,方便用戶將相同類型標簽放到一起,同時在生成掩碼圖時按照序號順序進行繪制。標簽的是否導出指的是生成掩碼圖和最后導出JSON文件時,這些標簽是否使用,不選擇則忽略。標簽中文名只在掩碼圖中使用,方便用戶快速核對。標簽的標注顏色是指生成掩碼圖時該標簽的顏色。中文名相對位置是指標簽中文名在掩碼圖中的位置。標簽的顏色疊加或色差是指在生成掩碼圖時標簽的顏色會進行疊加,而經(jīng)過多層疊加后,顏色不好區(qū)分,因此一般只對最上層標簽進行取色差操作。最后用戶可以通過修改字體大小并預覽觀察設置效果。
該模塊主要是通過設置號的匯總表,通過OpenCV繪制掩碼圖,并將掩碼圖存入【掩碼】文件夾,方便用戶在核對時無需一一生成掩碼圖,加快核對速度。模塊界面與圖5相似,下拉框內容不同。
用戶進入標批量生成掩碼圖界面后,因批量生成掩碼圖需要一定的時間,用戶可以選擇不同狀態(tài)圖片批量生成掩碼圖,選擇完選項后并提交,待進度條達到100%后,提示已完成即可。
該模塊為核心模塊,主要用來核對標注集,用戶通過生成的掩碼圖核對標簽名稱與對應標注物是否一致,模塊界面見圖7。用戶進入標注核對界面后,可選擇核對不同狀態(tài)的數(shù)據(jù)。在左側掩碼圖中,若標注物與標簽中文名一致,可點擊左上角確認并切換該圖片的狀態(tài)。若標簽名有問題,只需用右側下拉菜單修改正確的標簽名并預覽,核對結束可點擊確認并切換修改圖片狀態(tài)。
若圖片與標注物無法對應,如圖片與JSON文件未對應,可將圖片狀態(tài)設置為需修改狀態(tài)并繼續(xù)核對其他圖片,所有圖片核對完成后可通過導出需修改JSON文件,重新標注,再回到導入JSON模塊,選擇重新導入需修改JSON,并繼續(xù)對需修改狀態(tài)的圖片核對即可。
若圖片質量不好,無法成為數(shù)據(jù)集,可將圖片狀態(tài)修改為需刪除狀態(tài)。所有圖片核對完成后可通過導出將需刪除狀態(tài)的圖片和JSON移除即可。
若圖片無法確定其狀態(tài),可將圖片狀態(tài)修改為有問題狀態(tài)并繼續(xù)核對,所有圖片核對完成后重新對有問題狀態(tài)的圖片進行核對即可。
該模塊為主要做導出所有核對后的數(shù)據(jù)、移除需刪除狀態(tài)的數(shù)據(jù)、拷貝需修改狀態(tài)的文件和對核對后的數(shù)據(jù)中,同一張圖片中有相同標簽名的標簽添加序號,模塊界面與圖5相似,下拉框內容不同。
用戶進入標注核對界面后,若選擇導出全部,則會將【標注】文件夾里的JSON文件全部按照核對后的數(shù)據(jù)進行覆蓋,形成核對后的數(shù)據(jù)集。
若選擇移除需刪除狀態(tài)的圖片,系統(tǒng)則會刪除數(shù)據(jù)庫里需刪除狀態(tài)的數(shù)據(jù),并將對應的圖片和JSON文件移動到【刪除】文件夾,防止誤刪操作。
若選擇拷貝需修改狀態(tài)的圖片和JSON,系統(tǒng)則將需修改狀態(tài)的圖片和JSON文件拷貝到【修改】文件夾里,用戶只需修改完后,將修改后的JSON文件放入【標注】文件夾里,替換掉原文件并重新在導入JSON模塊導入即可。
若選擇在標簽名后面追加序號,系統(tǒng)則會在每張圖片有相同標簽名的標簽后面追加序號,用于實例分割數(shù)據(jù)集區(qū)分同一張圖中相同標簽名物體為不同實例。
該系統(tǒng)采用Django框架、Python語言進行開發(fā),由于Django和Python發(fā)展至今技術已十分成熟,在很大程度上提升了開發(fā)的效率。系統(tǒng)通過數(shù)據(jù)可視化技術幫助大部分做圖像處理的研究人員,為提高圖像數(shù)據(jù)集的質量方面做出一份貢獻,為有相關需求的人員提供一定的幫助。