天天看點

如何消滅飛機的“黑色十分鐘”,AI來幫忙

近年來,“AI的應用和落地”逐漸成了具化的關鍵詞,它和很多事物很多行業結合在一起,形成了奇妙的“化學反應”。例如,在日常生活中,AI可以推送我們喜歡的新聞或視訊,可以在拍照的時候識别場景提升照片的美感……. 而今天筆者要說的,可能是從很多人都密切相關但大多很陌生的一個“神秘”的職業說起:機場塔台指揮中心。上海麥圖資訊科技有限公司,借助華為雲ModelArts一站式開發與管理平台,開發出跑道防侵系統。

AI 給了我一雙“慧眼”

在機場的每一架飛機起飛或者着陸,從飛機推離停機位到離開機場空域,或相反的降落過程中,背後都需要依靠管制員之間的協作。飛機起降的間隔非常短暫且風險大,有着“黑色十分鐘”之說。管制員也被稱為是飛行員背後的“眼睛”,對于他們的要求是非常嚴苛的,需要超長時間集中注意力,尤其在航班密集的時候,管制員需要在極短的時間内對複雜的情況,做出正确判斷,這也讓管制員們擔負着極大的壓力。對于普通乘客來說,這可能隻是一次普通的空中之旅,但對于管制員來說,每一次飛機起停都伴随着重大責任。

“跑道侵入事件” 是所有管制員們的“噩夢”。飛機起降架次的增多,再加上惡劣天氣的影響,跑道侵入事件已成為民航領域航空器地面安全運作的頭等問題,跑道安全事故在民用航空事故中也占有很大的比例。然而,随着機場規模和航班密度增加,對于大型機場的塔台而言,單點視野實體受限,數字化程度提升的同時,客觀上造成螢幕變多、資訊量變大等挑戰,對管制員提出了更高的要求,人的主觀能動性很強,但往往難以面面俱到。

聚焦在智能航空領域、專注于人工智能技術和應用研發的上海麥圖資訊科技有限公司,希望用AI的力量破解以上痛點, 讓管制員們從高壓中解脫出來。為了加強跑道侵入事件的防範,麥圖開發出了跑道侵入防護系統,也就是說,在有飛機在使用的情況下,防止其他飛機沖入跑道,進而造成航空線之間的碰撞。

“我們想通過視訊去捕捉飛機的動态,把飛機從視訊中識别出來之後,再計算它的位置和速度,計算兩個飛機之間的運動軌迹,再根據其他的關聯資料進行認證,確定飛機之間不會發生碰撞,即使有發生碰撞的風險,也可以提前預知。”麥圖項目總監徐擎陽對筆者說。

華為雲ModelArts平台賦能模型開發

理想有多美好,現實就有多骨感。衆所周知,人工智能包括了訓練和推理兩個階段,隻有先訓練出人工智能模型才能進行推理。麥圖面臨的挑戰是,項目開發團隊基本是專注在軟體應用開發和資料分析層面的,對于計算機視覺技術方面的研究并不深。2018年,項目團隊也開始嘗試過很多場景,“當時是兩個問題制約了我們,一是視訊的清晰度不夠,當時高清視訊錄影機還沒有普及。二是沒有好的AI開發平台,算力和工具都不夠。到了今年,4K錄影機也開始普及了,訓練工具ModelArts也有了,這個事情就可以做了。”

如何消滅飛機的“黑色十分鐘”,AI來幫忙

徐擎陽說,華為雲ModelArts提供了全流程的AI開發與管理平台,在很大程度上降低了麥圖科技進入視訊AI領域的門檻,“如果沒有ModelArts,在準備訓練前,需要自己買裝置,去開源社群裡面找這方面的技術,學習建構和配置環境;在訓練的過程中,要涉及到裝置維護、性能調優,以及标定工具的開發等等。這個過程是會非常漫長和繁雜的,我們在管制語音識别的産品AI核心開發過程中已經體會過一遍,過程非常痛苦,代價非常大。”

對于麥圖來說,ModelArts帶來的效率提升的價值顯而易見:“第一版模型開發,從标定到訓練,到最後給客戶做示範,隻花了三天時間。如果用傳統的方法做,可能連伺服器的快遞都寄不到。”

徐擎陽介紹說,在這個系統中,“光電盯防子系統”是一個重要的實時核心,它需要具備較完整的“基于視訊流的航空器目辨別别和跟蹤”能力。通過将機場平面各個關鍵點采集到的實時視訊流送入基于華為雲ModelArts一站式AI開發與管理平台開發的“航空器識别模型”進行處理,識别出畫面中飛行器對象的像素坐标等一次參數後,對其進行空間位置換算,以及包括速度、運作方向等在内的二次參數的計算,并在系統運作資料中找到相比對的航班資訊對目标進行資訊标記,以AR資訊增強的形式呈現在螢幕上,讓管制員以“擡頭顯示”的形式在單一螢幕中直覺了解到足夠全面的動态資訊。同時該系統會在背景對所有目标的軌迹和矢量動态資料進行監控和推算,讓計算機能夠代替或輔助管制人員在全局範圍對每一個航班、每一個道口進行實時盯防,提前預知潛在運作風險,進而降低事故發生的機率。

如何消滅飛機的“黑色十分鐘”,AI來幫忙

此模型單幀主要目辨別别準确率可以逼近96%,多幀識别中主要目辨別别結果可在99%以上。目前,麥圖正在嘗試Mask-RCNN模型,将坐标輸出精度提升至像素級,實作更精确的航空器識别和位置計算。

模型開發代碼如下:

1.開發流程

本項目基于Yolo模型,其主要程式參考華為“ModelArts/開發環境/notebook”,Examples中的mxnetobjectiondetection項目建構。

1.1 基本流程與yolov3

本項目基本流程如圖,基本遵循從華為提供的樣例代碼開始進行修改,并最終調整應用的過程。如開發其它類型基于華為樣例代碼的工程,同樣可以參考本開發流程。開發流程示意圖如下:

如何消滅飛機的“黑色十分鐘”,AI來幫忙

本項目使用yolov3模型,該模型是經典的目标檢測模型。可以實作快速、準确的目标檢測。其采用darknet_53作為特征提取網絡,并采用多層級檢測的方式,實作對大小不同的目标進行快速檢測。詳細内容可以參考論文原文: YOLOv3: An Incremental Improvement

1.2 标注并準備訓練資料

模型開發的第一步就是進行資料,由于ModelArts提供的資料準備函數是基于PASCAL VOC 系列資料集的,其中每一張圖檔對應一個xml标注資料檔案。具體可是可以參考PASCAL VOC(http://host.robots.ox.ac.uk/pascal/VOC/)系列資料集的描述和詳細内容。

标注資料與調整資料集結構是一件非常麻煩的事情,但是ModelArts已經對目标檢測的标注提供了完善的資料标注工具支援。本項目也采用ModelArts提供的資料标注工具進行相關工作。具體的說,将采用ModelArts提供的”資料管理/資料集“功能建立”目标檢測“資料集以進行标注工作。具體流程可以參考官方資料管理使用指南(https://support.huaweicloud.com/engineers-modelarts/modelarts_23_0003.html)。

由于後續我們将在notebook中訓練,是以得到的資料集還需進一步處理。先标注資料,然後釋出資料集,标注資料會儲存在obs://資料集輸出位置/dataset-****/annotation/資料版本号/annotations中,其儲存形式為與圖檔名稱相同的xml格式檔案。将xml标注檔案與對應的圖像檔案放在同一檔案夾中,則可以構築本項目所需資料集。為友善起見,圖像與标注檔案檔案夾仍儲存在obs中的同一檔案夾中。

除了單純的提取資料之外,還可以根據個人需求進行簡單的資料加工,比如重新改寫标注名稱等等。由于本項目中無需額外處理,是以具體方法不再贅述。

1.3 獲得參考代碼

參考代碼有兩個來源,一個是華為提供的notebook example中的notebook代碼,另一個是notebook中需要下載下傳的庫代碼,本小節将描述兩個代碼具體的獲得辦法。

參考notebook代碼可以在ModelArts Jupyter Notebook下通過Examples中的mxnetobjectiondetection打開。具體位置如圖:

如何消滅飛機的“黑色十分鐘”,AI來幫忙

而其他的參考代碼獲得方法則略有不同。我們可以在notebook檔案中看到,該notebook正常運作需要通過wget下載下傳代碼,該代碼即為我們需要的參考代碼。位置如圖:

如何消滅飛機的“黑色十分鐘”,AI來幫忙

在公網也可以正常下載下傳,可以使用如下指令直接下載下傳然後減壓縮獲得參考代碼:wget https://ai-course-common-20.obs.cn-north-1.myhuaweicloud.com/object_detection/object_detection.tar.gz

1.4 修改資料準備代碼,加載資料

友善起見,notebook代碼和其他參考代碼放到一個檔案中進行使用,且都存儲于obs上。其他參考代碼主要用于提供python庫包,是以不用修改,修改内容集中在notebook代碼中。修改内容較為繁雜,具體修改内容可以通過對比本項目提供的notebook檔案和原始notebook參考代碼來确定。這裡僅就其中較為關鍵的部分進行說明。

參考下圖建立notebook,然後使用“mxnetobjectdetection.ipynb”作為基礎代碼,以進行修改。

如何消滅飛機的“黑色十分鐘”,AI來幫忙

修改檔案讀取方式,加載其他代碼和檔案

ModelArts的初始工作目錄是/home/ma-user/work,所有檔案操作都是基于本地系統的,不能直接使用obs中的程式與資料,是以需要修改資料讀取方式。在notebook開始位置添加代碼:

import moxing as moxmox.file.shift('os', 'mox')      

執行後,即可使得python在大部分檔案操作中支援obs系統,比如從obs中複制檔案到本地系統:

shutil.copytree("s3://youziyolo/youzi/src","./src")      

其中s3://為obs檔案路徑字首。

notebook原始代碼中有修改本地工作目錄的内容。在本項目中本地工作目錄工作位置不用修高,保持/home/ma-user/work即可。此外,本項目中所有的代碼在一開始就已經上傳到obs中了,無需用wget下載下傳對應代碼,而是通過從obs中複制的方法獲得代碼和資料。可以參考如下代碼(自行操作使需要根據個人指定的obs路徑進行修改):

shutil.copytree("s3://youziyolo/youzi/src","./src")           # 程式源代碼
shutil.copytree("s3://youziyolo/youzi/model","./model")       # 預訓練模型
shutil.copytree("s3://youziyolo/youzi/data/raw","./rawdata")  # 原始資料      

基本變量修改

在notebook中有一節是基本變量設定。這裡需要修改的内容有:

NUM_GPUS = 1 # 設定使用的gpu數量BATCH_SIZE = 16 # 設定訓練batch_sizeNUM_CLASSES = 1 # 根據實際情況設定分類數量NUM_EXAMPLES = 58 # 設定訓練的樣本數量

準備訓練和測試資料

本項目中的資料沒有區分訓練和測試資料,是以需要在資料準備的過程進行分類。

第一個注意點事删除src目錄下的index檔案,index檔案儲存标簽資料,因為自帶的index檔案中有“雲寶”的标簽,是以需要删除掉。在資料準備的過程中會重新生成。

get_data_iter()函數要添加兩個參數val_file=None,split_spec=0.8,這樣函數将同時傳回訓練集和測試集,比例為 0.8:0.2 。

最後可以通過len(train_data._dataset.label_cache)和len(val_data._dataset.label_cache)來檢視資料集的數量是否正确配置設定。

1.5 修改訓練代碼,進行訓練

初始化使用gpu

原始notebook代碼中初始化過程使用的是純cpu計算,這裡我們要改成gpu計算。mxnet的gpu初始化代碼如下:

devs = mx.cpu() if NUM_GPUS is None or NUM_GPUS == 0 else [          
mx.gpu(int(i)) for i in range(NUM_GPUS)]      

根據NUM_GPUS的數量進行初始化。當為0的時候,則使用cpu進行初始化環境。

加載基礎網絡

其他訓練配置代碼無需修改。不過加載基礎網絡這部分可以特别說明一下。除了原始的預訓練darknet53以外,還可以根據需求加載已經訓練過的的darknet53網絡。

加載參數的函數為mx.model.load_checkpoint(model_prefix, epoch)。其中modelprefix為路徑字首,epoch則為需要加載模型對應的訓練epoch。比如如果要加載\home\ma-user\work\basemodel-0000.params則,`mx.model.loadcheckpoint("\home\ma-user\work\basemodel", 0)`可以正确加載模型。

每epoch評估訓練結果

原始代碼中隻有訓練代碼,但完善的訓練程式應當可以每輪或每n輪通過測試集對訓練結果進行評估。這裡添加的代碼是從src目錄中trainyolov3.py檔案中提取的。主要是添加`Yoloeval類,并通過epochendcallback.append()進行回調。具體代碼較長,可以參考本項目提供的notebook檔案中5.評估訓練結果`部分内容。

這裡要注意的一個bug是,因為評估過程中會用到資料準備過程中生成的index檔案,如果原始的index檔案沒有删除,會導緻測試的過程中的标簽和index檔案中标簽不比對,導緻計算失敗。是以,如果修改了原始資料中的标簽類型或者數量,那麼請一定要删除index檔案,以避免評估過程失敗。

開始訓練

正确配置後就可以開始訓練,執行訓練代碼即可。通常mAP會逐漸提高,可以到80%-90%。此時可以進行推理測試階段。

1.6 推理測試與優化顯示

推理部分内容相對比較簡單,這裡對其中的關鍵點進行描述。

圖檔讀取

由于之前已經修改了檔案打開方式,是以可以直接使用obs中的圖像資料,友善推理過程。比如:

file_name = r"s3://youziyolo/youzi/data/flight_test1.jpg"      

讀取模型并測試

推理過程同樣需要加載模型,這裡要注意加載的模型為訓練後的模型。其中epoch可以設定為不同值,以觀察訓練對于目辨別别的直覺影響。之後順序執行即可看到推理結果。

優化顯示

本項目中的圖檔為4k圖檔,為實作最佳的顯示效果,要擴大figsize。這裡使用plt.figure(figsize=(32,18))來顯示圖檔,效果較好。

置信度的顯示也要适當調整,這裡置信度顯示的參數調整為fontScale=1.5, thickness=3,可以使得置信度文字清晰可見。

2. 程式介紹

本程式采用yoloV3進行航空器目辨別别,參考華為“ModelArts/開發環境/notebook”,Examples中的mxnetobjectiondetection項目建構。

由于本程式使用了華為提供的moxing和Modelarts包,是以所有程式和資料應部署于華為obs上以供ModelArts使用。本程式的訓練和推斷都通過ModelArts提供的訓練和推斷功能加以展示。

本程式所涉及2k圖像資料為自行采集資料,标注是通過華為ModelArts标注系統完成并導出的。本資料集使用遵循Apache 2.0 開源協定。

本程式修改自 Huawei ModelArts 提供的mxnetobjectiondetection圖像檢測項目。所有程式遵循Apache 2.0 開源協定。

2.1 目錄結構介紹

文檔所述的主程式為mxnet_yolov3.ipynb, 位于src目錄下.

本文檔所述目錄結構如下,其中僅在百度雲資料程式整合包中存在的部分用斜體表示:

├── data 資料目錄

│ ├──raw 原始資料與标注内容目錄

│ ├──flight_test1.jpg 用于推理測試的圖檔

│ ├──flight_test2.jpg 用于推理測試的圖檔

├── md_img md圖檔檔案目錄

├── model 模型目錄

│ ├── fine_tune-0000.params 遷移學習後模型參數,可以直接使用

│ ├── fine_tune-symbol.json 遷移學習後模型symbol,可直接使用

│ ├── darknet_53-0000.params 預制模型參數

│ └── darknet_53-symbol.json 預制模型symbol

├── README.md

└── src 源代碼目錄

├── data 資料處理package目錄

├── symbol symbol生成package目錄

├── utils 工具package目錄

├── mxnet_yolov3.ipynb 主程式檔案,用于訓練程式和進行推理測試

├── trainyolov3moxing.py 用于MA訓練任務的獨立程式

├── train_yolov3.py 用于MA訓練任務的獨立程式

└── yolov3_service.py 用于MA推理部署的獨立程式

3. 程式與資料部署

本部分基于已經給出的程式進行描述,與開發過程有一定不同,可以互相參考使用。

3.1 資料擷取

鑒于本程式所用資料包較大,為友善實踐,本程式的資料和代碼打包在一起,存儲于百度雲上:

連結:https://pan.baidu.com/s/1pEf1VeMEGrh3lHFFxtxZw&shfl=sharepset

提取碼:kkt7

其中程式結構與挖寶行動中送出代碼相同。本代碼包中多出資料資源以及fine_tune訓練後的模型,這兩部分檔案較大是以沒有上傳到git上。本代碼包所包含所有内容皆遵循Apache 2.0 開源協定。

3.2 資料上傳

建議将本程式打包上傳到華為的obs系統中,然後進行後續的訓練和推測。之是以采用obs儲存代碼和檔案是基于如下幾個理由:

1.華為obs可以支援檔案版本化,對于模型和資料來說可以更加友善的進行版本管理。

2.obs的檔案可被多個虛拟就/docker同時通路,可以有效進行檔案在多伺服器上儲存和管理。

3.ModelArts與obs做了深度整合,在訓練模型擷取檔案等等方面,ModelArts操作obs比操作其他外部檔案更加友善。

為實作上傳檔案到obs,首先需要建立obs桶,桶是obs的最大存儲單元,類似于根目錄。本文檔所用obs采用預設設定即可。不過需要注意伺服器區域的選擇。後續ModelArts需要選擇同樣的伺服器區域才能通路同一區域的obs。本文檔中所選區域為“華北-北京一”。桶的名字自行設定即可,本文檔中采用“youziyolo”作為桶名。

然後将解壓縮的檔案,上傳到obs中。進入obs控制台-〉對象存儲-〉右下方點選桶的名字,這裡是youziyolo-〉對象-〉上傳對象,然後将目錄上傳即可。

注意這裡一次上傳隻能上傳100個檔案,資料檔案夾檔案較多,分多次上傳即可。

4. 訓練與評估

訓練可以采用兩種方式,一種是使用ModelArts中的“開發環境/Notebook”進行訓練,另一個方法是通過“訓練管理/訓練作業”進行訓練。Notebook訓練在研發階段中比較友善。才用訓練作業的方法,更适合使用自動化的方法。本程式同時支援兩種訓練方法,這裡重點說明Notebook中如何進行訓練和評估,後續會簡述如何使用訓練作業進行訓練

4.1 建立Notebook伺服器

選擇 開發環境-〉Notebook-〉建立,建立一個Notebook伺服器,這裡存儲位置建議選擇obs中的/youziyolo/youzi,這樣可以直接使用在obs上儲存的notebook。如果隻是推理可以使用cpu,如果需要進行訓練推薦使用gpu,否則訓練速度會非常慢。

如何消滅飛機的“黑色十分鐘”,AI來幫忙

4.2 運作程式進行訓練

建立成功後,打開/youziyolo/youzi/src/mxnet_yolov3.ipynb,按序運作程式至開始訓練即可,notebook檔案中。這裡有幾點需要注意。

1.程式中“/youziyolo” 是本文檔所使用的obs桶名稱,在自行測試的過程中,請修改youziyolo為自己的桶名稱,否則會因為無法正确通路桶而報錯。

2.本文檔提供的預訓練模型有兩個,一個是基于imagenet進行預訓練的darknet53,使用該預訓練模型需要花較長時間進行訓練才能夠達到較好的識别效果。另一個是已經訓練好的可以識别機場飛機的模型,名字為finetune。該模型無需訓練或者僅需少量訓練即可實作有效識别。可以通過調整 “basemodelprefix” 參數進行切換。

3.為了更好的整合obs系統,強烈推薦使用

import moxing as mox mox.file.shift('os', 'mox')      

本程式沒有嚴格區分訓練集和測試集,而是從原始資料及中以8:2的數量随機選取訓練集和測試集用例。比例可以在使用getdataiter()函數讀取資料集的過程中修改split_spec參數以調整訓練集和測試集的比例。

使用該方法,可以使大部分python的檔案處理支援obs,obs路徑采用“s3://bucket-name/dir/file”的格式使用,極大的友善訓練過程中檔案的讀取存儲。

4.3 驗證訓練結果

本程式使用标準的mAP驗證模型的性能,在每一個訓練輪之後進行一次模型驗證工作,其驗證結果格式類似:

[('飛機', 0.80242209311072232), ('mAP', 0.80242209311072232)]      

表示飛機标簽的mAP為0.8,由于隻有一個标簽,是以總的mAP也是0.8。

本程式所提供的fine tune後的模型是在darknet53預訓練模型基礎之上進行遷移訓練,共訓練了200 epochs,batchsize=16,在單卡p100上花費5小時45分鐘訓練得到的。結果mAP如上述所示,為0.8。

4.4 采用“訓練管理/訓練作業”進行訓練

本文檔所述程式也可以采用“訓練管理/訓練作業”方式進行訓練,該方法易于通過ModelArts進行版本管理,并且适合多參數測試并發訓練。但該訓練方法較為複雜,需要對訓練代碼進行适當調整,以适配訓練管理的功能。本程式提供了相關代碼,核心代碼與notebook相同。由于筆者也尚未完全吃透該功能,是以,本部分代碼僅為想嘗試訓練作業功能的開發者提供參考。

在youziyolo obs下建立logs檔案和output/model檔案夾。然後建立訓練任務後,各個參數可以參考如下圖:

如何消滅飛機的“黑色十分鐘”,AI來幫忙

然後啟動訓練即可,其結果将會儲存 obs:/your-buckt/output/model/ 下。

5.預測測試

訓練完成後即可進行測試,本測試是在notebook中進行,在notebook中“模型推理測試”有詳細的代碼注釋和流程說明,可以進行參考。按序進行及可獲得推理顯示結果。這裡僅就幾個注意點進行說明:

5.1 測試模型可以采用訓練後的模型 yolov3flight,也可以采用model目錄下提供的finetune模型,都能夠實作正确的識别。如果采用訓練作業所産生的模型,請先将作業訓練所輸出的模型複制到工作目錄,可以使用如下語句:

shutil.copytree("s3://youziyolo/output/model/model/fine_tune-0000.params","./")shutil.copytree("s3://youziyolo/output/model/model/fine_tune-symbol.json","./")      

然後将加載模型的代碼修改為

load_epoch = 0_, arg_params, aux_params = mx.model.load_checkpoint("./fine_tune", load_epoch)      

即可實作使用訓練作業産生的模型進行推理測試。

5.2 本場景原始圖檔較大,是以在顯示圖檔的時候請設定 plt.figure(32,18),否則圖檔會非常不清晰,影響結果觀察。

預測結果如下,圖中方框顔色無實際意義,僅用來輔助觀察。方框上的數字為置信度。

6.開源協定

本程式遵循Apache 2.0開源協定,程式參考ModelArts-Lab相關内容[https://github.com/huaweicloud/ModelArts-Lab.git]

點選關注,第一時間了解華為雲新鮮技術~

繼續閱讀