如何消滅飛機的「黑色十分鐘」,AI來幫忙
近年來,「AI的應用和落地」逐漸成了具化的關鍵詞,它和很多事物很多行業結合在一起,形成了奇妙的「化學反應」。例如,在日常生活中,AI可以推送我們喜歡的新聞或影片,可以在拍照的時候識別場景提升照片的美感……. 而今天筆者要說的,可能是從很多人都密切相關但大多很陌生的一個「神秘」的職業說起:機場塔台指揮中心。上海麥圖資訊科技有限公司,藉助華為雲ModelArts一站式開發與管理平台,開發出跑道防侵系統。
AI 給了我一雙「慧眼」
在機場的每一架飛機起飛或者著陸,從飛機推離停機位到離開機場空域,或相反的降落過程中,背後都需要依靠管制員之間的協作。飛機起降的間隔非常短暫且風險大,有著「黑色十分鐘」之說。管制員也被稱為是飛行員背後的「眼睛」,對於他們的要求是非常嚴苛的,需要超長時間集中注意力,尤其在航班密集的時候,管制員需要在極短的時間內對複雜的情況,做出正確判斷,這也讓管制員們擔負著極大的壓力。對於普通乘客來說,這可能只是一次普通的空中之旅,但對於管制員來說,每一次飛機起停都伴隨著重大責任。
「跑道侵入事件」 是所有管制員們的「噩夢」。飛機起降架次的增多,再加上惡劣天氣的影響,跑道侵入事件已成為民航領域航空器地面安全運行的頭等問題,跑道安全事故在民用航空事故中也佔有很大的比例。然而,隨著機場規模和航班密度增加,對於大型機場的塔台而言,單點視野物理受限,數字化程度提升的同時,客觀上造成螢幕變多、資訊量變大等挑戰,對管制員提出了更高的要求,人的主觀能動性很強,但往往難以面面俱到。
聚焦在智慧航空領域、專註於人工智慧技術和應用研發的上海麥圖資訊科技有限公司,希望用AI的力量破解以上痛點, 讓管制員們從高壓中解脫出來。為了加強跑道侵入事件的防範,麥圖開發出了跑道侵入防護系統,也就是說,在有飛機在使用的情況下,防止其他飛機沖入跑道,從而造成航空線之間的碰撞。
「我們想通過影片去捕捉飛機的動態,把飛機從影片中識別出來之後,再計算它的位置和速度,計算兩個飛機之間的運動軌跡,再根據其他的關聯數據進行認證,確保飛機之間不會發生碰撞,即使有發生碰撞的風險,也可以提前預知。」麥圖項目總監徐擎陽對筆者說。
華為雲ModelArts平台賦能模型開發
理想有多美好,現實就有多骨感。眾所周知,人工智慧包括了訓練和推理兩個階段,只有先訓練出人工智慧模型才能進行推理。麥圖面臨的挑戰是,項目開發團隊基本是專註在軟體應用開發和數據分析層面的,對於電腦視覺技術方面的研究並不深。2018年,項目團隊也開始嘗試過很多場景,「當時是兩個問題制約了我們,一是影片的清晰度不夠,當時高清影片攝像機還沒有普及。二是沒有好的AI開發平台,算力和工具都不夠。到了今年,4K攝像機也開始普及了,訓練工具ModelArts也有了,這個事情就可以做了。」
徐擎陽說,華為雲ModelArts提供了全流程的AI開發與管理平台,在很大程度上降低了麥圖科技進入影片AI領域的門檻,「如果沒有ModelArts,在準備訓練前,需要自己買設備,去開源社區裡面找這方面的技術,學習構建和配置環境;在訓練的過程中,要涉及到設備維護、性能調優,以及標定工具的開發等等。這個過程是會非常漫長和繁雜的,我們在管制語音識別的產品AI核心開發過程中已經體會過一遍,過程非常痛苦,代價非常大。」
對於麥圖來說,ModelArts帶來的效率提升的價值顯而易見:「第一版模型開發,從標定到訓練,到最後給客戶做演示,只花了三天時間。如果用傳統的方法做,可能連伺服器的快遞都寄不到。」
徐擎陽介紹說,在這個系統中,「光電盯防子系統」是一個重要的實時核心,它需要具備較完整的「基於影片流的航空器目標識別和跟蹤」能力。通過將機場平面各個關鍵點採集到的實時影片流送入基於華為雲ModelArts一站式AI開發與管理平台開發的「航空器識別模型」進行處理,識別出畫面中飛行器對象的像素坐標等一次參數後,對其進行空間位置換算,以及包括速度、運行方向等在內的二次參數的計算,並在系統運行數據中找到相匹配的航班資訊對目標進行資訊標記,以AR資訊增強的形式呈現在監視器上,讓管制員以「抬頭顯示」的形式在單一螢幕中直觀了解到足夠全面的動態資訊。同時該系統會在後台對所有目標的軌跡和矢量動態數據進行監控和推算,讓電腦能夠代替或輔助管制人員在全局範圍對每一個航班、每一個道口進行實時盯防,提前預知潛在運行風險,從而降低事故發生的概率。
此模型單幀主要目標識別準確率可以逼近96%,多幀識別中主要目標識別結果可在99%以上。目前,麥圖正在嘗試Mask-RCNN模型,將坐標輸出精度提升至像素級,實現更精確的航空器識別和位置計算。
模型開發程式碼如下:
1.開發流程
本項目基於Yolo模型,其主要程式參考華為「ModelArts/開發環境/notebook」,Examples中的mxnetobjectiondetection項目構建。
1.1 基本流程與yolov3
本項目基本流程如圖,基本遵循從華為提供的樣例程式碼開始進行修改,並最終調整應用的過程。如開發其它類型基於華為樣例程式碼的工程,同樣可以參考本開發流程。開發流程示意圖如下:
本項目使用yolov3模型,該模型是經典的目標檢測模型。可以實現快速、準確的目標檢測。其採用darknet_53作為特徵提取網路,並採用多層級檢測的方式,實現對大小不同的目標進行快速檢測。詳細內容可以參考論文原文: YOLOv3: An Incremental Improvement
1.2 標註並準備訓練數據
模型開發的第一步就是進行數據,由於ModelArts提供的數據準備函數是基於PASCAL VOC 系列數據集的,其中每一張圖片對應一個xml標註數據文件。具體可是可以參考PASCAL VOC(//host.robots.ox.ac.uk/pascal/VOC/)系列數據集的描述和詳細內容。
標註數據與調整數據集結構是一件非常麻煩的事情,但是ModelArts已經對目標檢測的標註提供了完善的數據標註工具支援。本項目也採用ModelArts提供的數據標註工具進行相關工作。具體的說,將採用ModelArts提供的」數據管理/數據集「功能創建」目標檢測「數據集以進行標註工作。具體流程可以參考官方數據管理使用指南(//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打開。具體位置如圖:
而其他的參考程式碼獲得方法則略有不同。我們可以在notebook文件中看到,該notebook正常運行需要通過wget下載程式碼,該程式碼即為我們需要的參考程式碼。位置如圖:
在公網也可以正常下載,可以使用如下命令直接下載然後減壓縮獲得參考程式碼:wget //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」作為基礎程式碼,以進行修改。
修改文件讀取方式,載入其他程式碼和文件
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 數據獲取
鑒於本程式所用數據包較大,為方便實踐,本程式的數據和程式碼打包在一起,存儲於百度雲上:
鏈接://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,否則訓練速度會非常慢。
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文件夾。然後創建訓練任務後,各個參數可以參考如下圖:
然後啟動訓練即可,其結果將會保存 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相關內容[//github.com/huaweicloud/ModelArts-Lab.git]