文章作者:Robert Chesebrough, Raymond Lo, 和武卓博士
在世界各地,當(dāng)你走進(jìn)博物館,看到巨大的恐龍標(biāo)本展示,你有沒有想過古生物學(xué)家是如何發(fā)現(xiàn)它們的?
有趣的是,我們的一位好朋友兼同事,英特爾的技術(shù)布道師 Bob Chesebrough,在閑暇時(shí)間和他的兒子們一起出去尋找尚未被發(fā)現(xiàn)的恐龍化石。他向我們展示了如何做到這一點(diǎn),以及我們?nèi)绾问褂?AI 和 OpenVINO? 來明顯簡化這一過程。
Bob 向我們解釋說,古生物學(xué)家和考古學(xué)家必須首先找到這些地點(diǎn),其地質(zhì)歷史不僅揭示了化石的創(chuàng)造過程,而且還表明了發(fā)現(xiàn)化石的機(jī)會。傳統(tǒng)上,這是通過掃描航拍圖像來發(fā)現(xiàn)特定的地形紋理,或巖層的顏色和方向,然后構(gòu)建像這樣的“可能性地圖”來完成。
你可以在圖片中看到可能發(fā)現(xiàn)恐龍化石的所有位置。你可以想象的是,即使是由專家親自完成,繪制這樣一張地圖也需要花費(fèi)大量的時(shí)間和精力。但是,由于 Bob 已經(jīng)了解了 AI 的力量,他想知道是否可以開發(fā)一種能夠自動創(chuàng)建這些地圖的 AI 模型。他做到了!
在他的最初嘗試中,他發(fā)現(xiàn) AI 軟件運(yùn)行良好,但在野外創(chuàng)建地圖花費(fèi)了太長時(shí)間,而當(dāng)你在野外并依賴筆記本電腦電池時(shí),這是一個(gè)問題。然后,他想知道如果他使用無人機(jī)拍攝高分辨率航拍照片是否會有所幫助,但不幸的是,這也行不通,因?yàn)檫@仍然需要他回家上傳這些照片。
因此,他與我們(Raymond Lo 和武卓博士)以及英特爾的其他 AI 布道師一起提出了一個(gè)解決方案,使他能夠在幾分鐘內(nèi)(通常這需要幾個(gè)小時(shí))從任意組合的視頻中創(chuàng)建這樣的可能性地圖。
我們很高興向你展示我們做了什么以及如何使用OpenVINO?,但在我們繼續(xù)之前,請注意,雖然狩獵恐龍化石聽起來是一種有趣和令人興奮的愛好,但在美國和大多數(shù)其它地方,恐龍化石的實(shí)際采集受到嚴(yán)格監(jiān)管,如果不是完全禁止的話。因此,如果你親自嘗試,而且你確實(shí)發(fā)現(xiàn)了化石的話,我們強(qiáng)烈建議你拍照并向當(dāng)?shù)赜嘘P(guān)部門報(bào)告你的這一發(fā)現(xiàn)。
狩獵開始了!
現(xiàn)在讓我們開始吧!首先,我們將解釋尋找恐龍化石的不同階段,然后我們將深入了解具體的步驟是怎么做的。
具體的創(chuàng)建可能性地圖的步驟可以參考這里:
https://www.intel.com/content/www/us/en/developer/articles/technical/intel-ai-step-by-step-guide-for-hunting-dinosaurs.html#gs.cg9z4m
(如圖1所示),包括:
圖1. 創(chuàng)建恐龍化石可能性地圖的一般步驟
第一階段和第二階段:收集數(shù)據(jù)并對其進(jìn)行分類,包括獲取已知恐龍骨床(示例中為新墨西哥州)化石的實(shí)際發(fā)現(xiàn)的 GPS 坐標(biāo),并根據(jù)它們之間的接近程度對它們進(jìn)行聚類。我們使用 Intel??機(jī)器學(xué)習(xí)庫 Scikit learn 做到了這一點(diǎn)。
第三階段:標(biāo)記數(shù)據(jù)。我們將聚類的結(jié)果和 Intel? Deep Neural Network Library 應(yīng)用于標(biāo)記為“無化石”、“極有可能找到化石”或“可能找到化石”的相同位置的航拍圖像,并將這些圖像合并起來,得到該區(qū)域的化石可能性地圖。
第四階段和第五階段:訓(xùn)練數(shù)據(jù)并通過將標(biāo)記的航拍圖像轉(zhuǎn)換為張量來構(gòu)建模型,每個(gè)張量都具有與概率分?jǐn)?shù)或置信水平相對應(yīng)的類名(例如,0表示“絕對沒有化石”,1表示“有可能找到化石”,2表示“發(fā)現(xiàn)化石”),以使用 PyTorch 構(gòu)建殘差神經(jīng)網(wǎng)絡(luò)(ResNet)。
第六階段:最后,評分階段,通過使用前面步驟中準(zhǔn)備的模型,利用 OpenVINO??推理引擎分析航拍照片,創(chuàng)建其它地方的化石可能性地圖!
放“碼”過來!
實(shí)現(xiàn)上述過程的代碼由一系列 Jupyter Notebook 提供:
https://github.com/IntelSoftware/Jurassic/blob/main/09_Dino_bone_find_OpenVINO.ipynb
這里,我們描述了最重要的部分,如圖2所示,將 PyTorch 模型轉(zhuǎn)換為 OpenVINO? 中間表示(IR)格式并分析圖像。
圖2. PyTorch 模型轉(zhuǎn)換為 OpenVINO? ?IR 格式
加載?OpenVINO??推理引擎只需要一條指令:
from openvino.runtime import Core
加載所有必要的庫后,Notebook 定義了先前以 PyTorch 格式訓(xùn)練得到的化石尋找模型的路徑,并定義了兩個(gè)新模型的位置,以創(chuàng)建一個(gè)以 ONNX 格式,另一個(gè)以 OpenVINO??IR 格式的模型,原因我們稍后將解釋。
DIRECTORY_NAME = “models”
BASE_MODEL_NAME = DIRECTORY_NAME + f”/bc_resnet18_simple_NOIPEX_6Epochs_StateDict_gold”
# Paths where PyTorch, ONNX and OpenVINO IR models will be stored
model_path = Path(BASE_MODEL_NAME).with_suffix(“.pt”)
onnx_path = model_path.with_suffix(“.onnx”)
ir_path = model_path.with_suffix(“.xml”)
生成 ONNX 模型后,再使用 OpenVINO??模型優(yōu)化器(MO)構(gòu)建命令,將其轉(zhuǎn)換為 FP16 精度的OpenVINO??IR 格式:
# Construct the command for Model Optimizer
mo_command = f”””mo
? ? ?--input_model “{onnx_path}”
? ? ?--input_shape “[1,3, {IMAGE_HEIGHT}, {IMAGE_WIDTH}]”
? ? ?--data_type FP16
? ? ?--output_dir “{model_path.parent}”
? ? ?“””
? ? ?
mo_command = “ “.join(mo_command.split())
在使用 ONNX 模型對測試圖像運(yùn)行推理(此處未顯示)后,在同一圖像上重復(fù)該過程,但使用 OpenVINO? IR 格式模型,因?yàn)樵?OpenVINO??推理引擎上執(zhí)行兩個(gè)模型顯示了如何在 CPU 或 GPU 設(shè)備上可互換地運(yùn)行模型推理。
# Load the network in Inference Engine
core = Core()
model_ir = core.read_model(model=ir_path)
compiled_model_ir = core.compile_model(model=model_ir, device_name=”CPU”)
# Get input and output layers
output_layer_ir = compiled_model_ir.output(0)
# Run inference on the input image
res_ir = compiled_model_ir([x_test2])[output_layer_ir]
上面的前幾行代碼加載OpenVINO?推理引擎,將OpenVINO??IR 模型傳遞給它,然后提取其輸入和輸出層。最后一行代碼是在先前使用 ONNX 模型分析的同一圖像(“x_test2”)上實(shí)際運(yùn)行推理引擎的代碼。
接下來,程序打印出模型推理的結(jié)果;即該圖像所屬的類(0、1或2),然后繼續(xù)使用 PyTorch 模型重復(fù)該過程。
代碼的最后部分做了兩件事:
1)它運(yùn)行 OpenVINO??和 PyTorch 模型,對幾百張圖像進(jìn)行分類,并對所使用的三種模型的性能進(jìn)行近似比較。
2)它將所有這些圖像合并到一張地圖中,如圖1所示,并通過將 PyTorch 結(jié)果與 OpenVINO? 結(jié)果進(jìn)行比較得出結(jié)論,以驗(yàn)證準(zhǔn)確性沒有損失。為了簡潔起見,這里我們只包含一段不言自明的片段:
if “GPU” in core.available_devices:
?num_images = 2000
compiled_model_onnx_gpu = core.compile_model(model=model_onnx, device_name=”GPU”)
#warm up
compiled_model_onnx_gpu([input_image])
使用 OpenVINO??的好處不僅在于我們可以獲得加速,還在于能夠根據(jù)你選擇的硬件優(yōu)化模型,并充分利用你手邊可用的硬件!
后續(xù)步驟
整個(gè)的步驟就是這樣!現(xiàn)在你是一個(gè)現(xiàn)代尋寶者,能夠使用 OpenVINO??為你的尋找侏羅紀(jì)之旅創(chuàng)建和更新可能性地圖。
這是一個(gè)很好的例子,說明 OpenVINO??如何讓每個(gè)人無論做什么都能更容易地使用人工智能。
你可以輕松地將此方法用于任何需要從航拍照片中檢測某些區(qū)域的情況,例如防火、可再生能源發(fā)電等關(guān)鍵領(lǐng)域,甚至其它星球上的生命!