首頁  >  文章  >  科技週邊  >  如何只用兩個Python函數在幾分鐘內創建完整的電腦視覺應用程式

如何只用兩個Python函數在幾分鐘內創建完整的電腦視覺應用程式

WBOY
WBOY轉載
2024-03-12 17:07:24448瀏覽

如何只用兩個Python函數在幾分鐘內創建完整的電腦視覺應用程式

譯者| 李睿

#審查| 重樓

這篇文章首先簡要介紹了電腦視覺應用程式的基本要求。接著,詳細介紹了Pipeless這個開源框架,它為嵌入式電腦視覺提供了無伺服器開發體驗。最後,提供了一個詳細的步驟指南,示範如何使用幾個Python函數和一個模型建立和運行一個簡單的物件偵測應用程式。

創建電腦視覺應用程式

描述「電腦視覺」的一種方式是將其定義為「利用攝影機和演算法技術進行圖像識別和處理的領域」。然而,這種簡單的定義可能無法完全滿足人們對這個概念的理解。因此,為了更深入地了解電腦視覺應用程式的建構過程,我們需要考慮每個子系統所需實現的功能。 電腦視覺應用程式的建構過程涉及多個關鍵步驟,包括影像擷取、影像處理、特徵提取、目標識別和決策制定。首先,透過攝影機或其他影像擷取設備取得影像資料。然後,利用演算法對影像進行處理,包括去噪、增強和分割等操作,以便進一步分析。在特徵提取階段,系統會辨識影像中的關鍵特徵,如

為了即時處理60 fps的視訊串流,需要在16毫秒內處理每一幀。這通常透過多執行緒和多處理進程實現。有時候,甚至需要在上一幀完成之前就開始處理下一幀,以確保能夠實現真正快速的幀處理。

對於人工智慧模型,現在幸好有許多優秀的開源模型可供使用,因此大多數情況下無需從零開始開發自己的模型,只需微調參數以滿足特定用例即可。這些模型在每一幀上運行推理,執行物件偵測、分割、姿態估計等任務。

•推理運行時間:推理運行時間負責載入模型,並在不同的可用設備(GPU或CPU)上高效運行。

為了確保模型在推理過程中能夠快速運行,採用GPU是不可或缺的。 GPU能夠處理比CPU更多數量級的平行操作,尤其是在處理大量數學運算時效果更為顯著。在處理幀時,需要考慮幀所在的記憶體位置,可以選擇儲存在GPU記憶體或CPU記憶體(RAM)中。然而,在這兩種不同的記憶體之間複製幀會導致運算速度變慢,尤其是當幀的大小較大時。這也意味著需要權衡記憶體的選擇以及資料傳輸的開銷,以實現更有效率的模型推理過程。

多媒體管道是一組元件,用於從資料來源中取得視訊串流,並將其分割成幀,然後將其作為模型的輸入。有時,這些部件還可以對視訊串流進行修改和重建,以便進行轉發。這些部件在處理視訊資料時發揮關鍵作用,確保視訊串流能夠被有效地傳輸和處理。

•視訊串流管理:開發人員可能希望應用程式能夠抵抗視訊串流的中斷、重新連接、動態新增和刪除視訊串流、同時處理多個視訊串流,等等。

所有這些系統都需要建立或合併到專案中,因此,需要維護程式碼。然而,面臨的問題是最終維護的大量代碼並非特定於應用程序,而是圍繞實際案例特定代碼的子系統。

Pipeless框架

為了避免從頭開始建立上述所有內容,可以代用Pipeless框架。這是一個用於電腦視覺的開源框架,允許提供一些特定於案例的功能,並且能夠處理其他事物。

Pipeless框架將應用程式的邏輯劃分為“階段”,其中的一個階段就像單一模型的微型應用程式。一個階段可以包括預處理、使用預處理的輸入運行推理,以及對模型輸出進行後處理以採取行動。然後,可以連結盡可能多的階段,以組成完整的應用程序,甚至使用多個模型。

為了提供每個階段的邏輯,只需新增一個特定於應用程式的程式碼函數,然後在需要時由Pipeless負責呼叫它。這就是為什麼可以將Pipeless視為框架的原因,它為嵌入式電腦視覺提供類似伺服器的開發體驗,並且提供了一些功能,不必擔心需要其他的子系統。

Pipeless的另一個重要特性是,可以透過CLI或REST API動態地新增、刪除和更新視訊串流,從而實現視訊串流處理的自動化。甚至可以指定重新啟動策略,指示何時應該重新啟動視訊串流的處理,是否應該在出現錯誤後重新啟動,等等。

最後,部署Pipeless框架,只需要在任何設備上安裝它並與程式碼函數一起運行,無論是在雲端運算虛擬機器或容器化模式中,還是直接在Nvidia Jetson、Raspberry等邊緣設備中。

建立物件偵測應用程式

以下深入了解如何使用Pipeless框架建立一個簡單的物件偵測應用程式。

第一就是安裝。安裝腳本,使其安裝非常簡單:

Curl https://raw.githubusercontent.com/pipeless-ai/pipeless/main/install.sh | bash

現在,必須建立一個專案。 Pipeless專案是一個包含階段的目錄。每個階段都在子目錄下,在每個子目錄中,建立包含hooks(特定的程式碼函數)的檔案。為每個階段資料夾提供的名稱是稍後要為視訊串流運行該階段時,必須向Pipeless框指示的階段名稱。

pipeless init my-project --template emptycd my-project

在這裡,空模板告訴CLI只建立目錄,如果不提供任何模板,CLI將提示幾個問題以互動式建立階段。

如上所述,現在需要為專案新增一個階段。採用下面的命令從GitHub下載一個階段範例:

wget -O - https://github.com/pipeless-ai/pipeless/archive/main.tar.gz | tar -xz --strip=2 "pipeless-main/examples/onnx-yolo"


#這將建立一個階段目錄onnx-yolo,其中包含應用程式函數。

然後,檢查每個階段檔案的內容,也就是應用程式hooks。

這裡有一個pre-process.py文件,它定義了一個接受一個框架和一個場景的函數(hooks)。此函數執行一些操作來準備接收RGB幀的輸入數據,以便與模型期望的格式相符。資料被加入到frame_data[' interence_input ']中,這是Pipeless將傳遞給模型的資料。

def hook(frame_data, context):frame = frame_data["original"].view()yolo_input_shape = (640, 640, 3) # h,w,cframe = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)frame = resize_rgb_frame(frame, yolo_input_shape)frame = cv2.normalize(frame, None, 0.0, 1.0, cv2.NORM_MINMAX)frame = np.transpose(frame, axes=(2,0,1)) # Convert to c,h,winference_inputs = frame.astype("float32")frame_data['inference_input'] = inference_inputs... (some other auxiliar functions that we call from the hook function)

還有process.json文件,它指示要使用的Pipeless推理運行時間(在本例中為ONNX運行時間),在哪裡可以找到它應該載入的模型,以及它的一些可選參數,例如要使用的execution_provider,即CPU、CUDA、TensortRT等。

{ "runtime": "onnx","model_uri": "https://pipeless-public.s3.eu-west-3.amazonaws.com/yolov8n.onnx","inference_params": { "execution_provider": "tensorrt" }}

最後,post-process.py檔案定義了一個類似pre-process.py中的函式。這次,它接受Pipeless儲存在frame_data["inference_output"]中的推理輸出,並執行將該輸出解析為邊界框的操作。稍後,它在框架上繪製邊界框,最後將修改後的框架指派給frame_data['modified']。這樣,Pipeless將轉送提供的視訊串流,但帶有修改後的幀,其中包括邊界框。

def hook(frame_data, _):frame = frame_data['original']model_output = frame_data['inference_output']yolo_input_shape = (640, 640, 3) # h,w,cboxes, scores, class_ids =  parse_yolo_output(model_output, frame.shape, yolo_input_shape)class_labels = [yolo_classes[id] for id in class_ids]for i in range(len(boxes)):draw_bbox(frame, boxes[i], class_labels[i], scores[i])frame_data['modified'] = frame... (some other auxiliar functions that we call from the hook function)

最後一步是啟動Pipeless並提供一個視訊串流。要啟動Pipeless,只需在my-project目錄下運行以下命令:

pipeless start --stages-dir .

一旦運行,將提供來自網路攝影機(v4l2)的視訊串流,並直接在螢幕上顯示輸出。需要注意的是,必須提供視訊串流按順序執行的階段清單。在這個例子中,它只是onnx-yolo階段:

pipeless add stream --input-uri "v4l2" --output-uri "screen" --frame-path "onnx-yolo"

#結論

創建電腦視覺應用程式是一項複雜的任務,因為有許多因素和必須圍繞它實現的子系統。使用像Pipeless這樣的框架,啟動和運行只需要幾分鐘,可以專注於為特定用例編寫程式碼。此外,Pipeless的「階段」是高度可重複使用的,易於維護,因此維護將會很容易,可以非常快速地迭代。

如果希望參與Pipeless的開發,可以透過它的GitHub儲存庫來實現。

原文標題:Create a Complete Computer Vision App in Minutes With Just Two Python Functions,作者:Miguel Angel Cabrera

#連結:https://www.php.cn/link/e26dbb5b1843bf566ea7ec757f3325c4

以上是如何只用兩個Python函數在幾分鐘內創建完整的電腦視覺應用程式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:51cto.com。如有侵權,請聯絡admin@php.cn刪除