1. 程式人生 > 實用技巧 >如何消滅飛機的“黑色十分鐘”,AI來幫忙

如何消滅飛機的“黑色十分鐘”,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(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開啟。具體位置如圖:

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

在公網也可以正常下載,可以使用如下命令直接下載然後減壓縮獲得參考程式碼: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”作為基礎程式碼,以進行修改。

修改檔案讀取方式,載入其他程式碼和檔案

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,否則訓練速度會非常慢。

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相關內容[https://github.com/huaweicloud/ModelArts-Lab.git]

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