偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

如何只用兩個(gè)Python函數(shù)在幾分鐘內(nèi)創(chuàng)建完整的計(jì)算機(jī)視覺(jué)應(yīng)用程序

譯文
開發(fā) 人工智能
本文介紹在計(jì)算機(jī)視覺(jué)開發(fā)中采用的Pipeless開源框架,以及如何使用幾個(gè)代碼函數(shù)創(chuàng)建一個(gè)完整的應(yīng)用程序。

譯者 | 李睿

審校 | 重樓

本文首先概述典型的計(jì)算機(jī)視覺(jué)應(yīng)用程序的要求。然后,介紹Pipeless這一為嵌入式計(jì)算機(jī)視覺(jué)提供無(wú)服務(wù)器開發(fā)體驗(yàn)的開源框架。最后,提供一個(gè)詳細(xì)的步驟指南,介紹如何創(chuàng)建和執(zhí)行一個(gè)簡(jiǎn)單的對(duì)象檢測(cè)應(yīng)用程序,該應(yīng)用程序只需采用幾個(gè)Python函數(shù)和一個(gè)模型進(jìn)行創(chuàng)建。

創(chuàng)建計(jì)算機(jī)視覺(jué)應(yīng)用程序

如果有人希望用一句話描述“計(jì)算機(jī)視覺(jué)”的話,那么給出回答是“通過(guò)攝像頭界面識(shí)別視覺(jué)事件并對(duì)其做出反應(yīng)的藝術(shù)?!钡@可能不是他想聽(tīng)到的答案。因此,以下將深入了解計(jì)算機(jī)視覺(jué)應(yīng)用程序是如何構(gòu)建的,以及每個(gè)子系統(tǒng)需要實(shí)現(xiàn)的功能。

?真正快速的幀處理:如要實(shí)時(shí)處理60 fps的視頻流,只有16毫秒的時(shí)間來(lái)處理每幀。這在一定程度上是通過(guò)多線程和多處理進(jìn)程實(shí)現(xiàn)的。在許多情況下,希望在前一個(gè)幀完成之前開始處理一個(gè)幀。

?在每一幀上運(yùn)行推理并執(zhí)行對(duì)象檢測(cè)、分割、姿態(tài)估計(jì)等的人工智能模型:幸運(yùn)的是,有越來(lái)越多優(yōu)秀的開源模型,所以不必從頭開始創(chuàng)建自己的模型,通常只需微調(diào)模型的參數(shù)以匹配用例。

?推理運(yùn)行時(shí)間:推理運(yùn)行時(shí)間負(fù)責(zé)加載模型,并在不同的可用設(shè)備(GPU或CPU)上高效運(yùn)行。

?GPU:為了使模型足夠快地運(yùn)行推理,我們需要采用GPU。這是因?yàn)镚PU可以處理比CPU多幾個(gè)數(shù)量級(jí)的并行操作,而最低級(jí)別的模型只是大量的數(shù)學(xué)運(yùn)算。你需要處理幀所在的內(nèi)存。它們可以位于 GPU 內(nèi)存或 CPU 內(nèi)存 (RAM) 中,在這些內(nèi)存之間復(fù)制幀是一項(xiàng)非常繁重的操作,因?yàn)閹笮?huì)使處理速度變慢。

?多媒體管道:這些部件允許從數(shù)據(jù)源獲取視頻流,將它們分割成幀,將它們作為模型的輸入,有時(shí)修改和重建視頻流以轉(zhuǎn)發(fā)。

?視頻流管理:開發(fā)人員可能希望應(yīng)用程序能夠抵抗視頻流的中斷、重新連接、動(dòng)態(tài)添加和刪除視頻流、同時(shí)處理多個(gè)視頻流,等等。

所有這些系統(tǒng)都需要?jiǎng)?chuàng)建或合并到項(xiàng)目中,因此,需要維護(hù)代碼。然而,面臨的問(wèn)題是最終維護(hù)的大量代碼并非特定于應(yīng)用程序,而是圍繞實(shí)際案例特定代碼的子系統(tǒng)。

Pipeless框架

為了避免從頭開始構(gòu)建上述所有內(nèi)容,可以代用Pipeless框架。這是一個(gè)用于計(jì)算機(jī)視覺(jué)的開源框架,允許提供一些特定于案例的功能,并且能夠處理其他事物。

Pipeless框架將應(yīng)用程序的邏輯劃分為“階段”,其中的一個(gè)階段就像單個(gè)模型的微型應(yīng)用程序。一個(gè)階段可以包括預(yù)處理、使用預(yù)處理的輸入運(yùn)行推理,以及對(duì)模型輸出進(jìn)行后處理以采取行動(dòng)。然后,可以鏈接盡可能多的階段,以組成完整的應(yīng)用程序,甚至使用多個(gè)模型。

為了提供每個(gè)階段的邏輯,只需添加一個(gè)特定于應(yīng)用程序的代碼函數(shù),然后在需要時(shí)由Pipeless負(fù)責(zé)調(diào)用它。這就是可以將Pipeless視為一個(gè)框架的原因,它為嵌入式計(jì)算機(jī)視覺(jué)提供類似服務(wù)器的開發(fā)體驗(yàn),并且提供了一些功能,不必?fù)?dān)心需要其他的子系統(tǒng)。

Pipeless的另一個(gè)重要特性是,可以通過(guò)CLI或REST API動(dòng)態(tài)地添加、刪除和更新視頻流,從而實(shí)現(xiàn)視頻流處理的自動(dòng)化。甚至可以指定重新啟動(dòng)策略,指示何時(shí)應(yīng)該重新啟動(dòng)視頻流的處理,是否應(yīng)該在出現(xiàn)錯(cuò)誤后重新啟動(dòng),等等。

最后,部署Pipeless框架,只需要在任何設(shè)備上安裝它并與代碼函數(shù)一起運(yùn)行,無(wú)論是在云計(jì)算虛擬機(jī)或容器化模式中,還是直接在Nvidia Jetson、Raspberry等邊緣設(shè)備中。

創(chuàng)建對(duì)象檢測(cè)應(yīng)用程序

以下深入地了解如何使用Pipeless框架創(chuàng)建一個(gè)簡(jiǎn)單的對(duì)象檢測(cè)應(yīng)用程序。

第一就是安裝。安裝腳本,使其安裝非常簡(jiǎn)單:

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

現(xiàn)在,必須創(chuàng)建一個(gè)項(xiàng)目。Pipeless項(xiàng)目是一個(gè)包含階段的目錄。每個(gè)階段都在子目錄下,在每個(gè)子目錄中,創(chuàng)建包含hooks(特定的代碼函數(shù))的文件。為每個(gè)階段文件夾提供的名稱是稍后要為視頻流運(yùn)行該階段時(shí),必須向Pipeless框指示的階段名稱。

pipeless init my-project --template empty
cd my-project

在這里,空模板告訴CLI只創(chuàng)建目錄,如果不提供任何模板,CLI將提示幾個(gè)問(wèn)題以交互式地創(chuàng)建階段。

如上所述,現(xiàn)在需要為項(xiàng)目添加一個(gè)階段。采用下面的命令從GitHub下載一個(gè)階段示例:

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


這將創(chuàng)建一個(gè)階段目錄onnx-yolo,其中包含應(yīng)用程序函數(shù)。

然后,檢查每個(gè)階段文件的內(nèi)容,也就是應(yīng)用程序hooks。

這里有一個(gè)pre-process.py文件,它定義了一個(gè)接受一個(gè)框架和一個(gè)場(chǎng)景的函數(shù)(hooks)。該函數(shù)執(zhí)行一些操作來(lái)準(zhǔn)備接收RGB幀的輸入數(shù)據(jù),以便與模型期望的格式匹配。該數(shù)據(jù)被添加到frame_data[' interence_input ']中,這是Pipeless將傳遞給模型的數(shù)據(jù)。

def hook(frame_data, context):
    frame = frame_data["original"].view()
    yolo_input_shape = (640, 640, 3) # h,w,c
    frame = 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,w
    inference_inputs = frame.astype("float32")
    frame_data['inference_input'] = inference_inputs
... (some other auxiliar functions that we call from the hook function)

還有process.json文件,它指示要使用的Pipeless推理運(yùn)行時(shí)間(在本例中為ONNX運(yùn)行時(shí)間),在哪里可以找到它應(yīng)該加載的模型,以及它的一些可選參數(shù),例如要使用的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文件定義了一個(gè)類似于pre-process.py中的函數(shù)。這一次,它接受Pipeless存儲(chǔ)在frame_data["inference_output"]中的推理輸出,并執(zhí)行將該輸出解析為邊界框的操作。稍后,它在框架上繪制邊界框,最后將修改后的框架分配給frame_data['modified']。這樣,Pipeless將轉(zhuǎn)發(fā)提供的視頻流,但帶有修改后的幀,其中包括邊界框。

def hook(frame_data, _):
    frame = frame_data['original']
    model_output = frame_data['inference_output']
    yolo_input_shape = (640, 640, 3) # h,w,c
    boxes, 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)

最后一步是啟動(dòng)Pipeless并提供一個(gè)視頻流。要啟動(dòng)Pipeless,只需在my-project目錄下運(yùn)行以下命令:

pipeless start --stages-dir .

一旦運(yùn)行,將提供來(lái)自網(wǎng)絡(luò)攝像頭(v4l2)的視頻流,并直接在屏幕上顯示輸出。需要注意的是,必須提供視頻流按順序執(zhí)行的階段列表。在這個(gè)例子中,它只是onnx-yolo階段:

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

結(jié)論

創(chuàng)建計(jì)算機(jī)視覺(jué)應(yīng)用程序是一項(xiàng)復(fù)雜的任務(wù),因?yàn)橛性S多因素和必須圍繞它實(shí)現(xiàn)的子系統(tǒng)。使用像Pipeless這樣的框架,啟動(dòng)和運(yùn)行只需要幾分鐘,可以專注于為特定用例編寫代碼。此外,Pipeless的“階段”是高度可重用的,易于維護(hù),因此維護(hù)將會(huì)很容易,可以非??焖俚氐?/span>

如果希望參與Pipeless的開發(fā),可以通過(guò)它的GitHub存儲(chǔ)庫(kù)來(lái)實(shí)現(xiàn)。

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

鏈接:https://dzone.com/articles/creating-a-complete-computer-vision-application-in

責(zé)任編輯:龐桂玉 來(lái)源: 51CTO
相關(guān)推薦

2020-09-11 09:18:07

PythonPython包開發(fā)

2017-08-03 17:30:26

戴爾IoT設(shè)備

2016-09-30 15:13:01

Python代碼

2010-11-30 10:12:08

2010-03-01 18:13:22

Python程序

2022-04-06 09:28:04

漏洞SQL注入

2013-07-02 09:58:38

ClojureClojure教程

2010-01-21 09:46:24

C++程序

2020-07-17 07:21:36

TensorFlow機(jī)器學(xué)習(xí)計(jì)算機(jī)視覺(jué)

2021-12-02 11:54:10

云計(jì)算云錯(cuò)誤配置網(wǎng)絡(luò)安全

2023-05-09 15:04:37

人工智能工具

2022-03-28 08:00:00

數(shù)據(jù)庫(kù)GraphQL公共云

2010-02-23 14:19:30

Python目錄操作

2023-11-01 14:51:21

邊緣計(jì)算云計(jì)算

2010-01-21 14:51:02

C++函數(shù)指針

2010-01-06 15:35:06

JSON對(duì)象

2023-11-24 16:38:38

無(wú)人機(jī)計(jì)算機(jī)視覺(jué)

2009-12-29 09:01:46

ADSL斷線

2023-08-15 09:00:00

人工智能破解密碼

2024-04-19 09:37:49

Ollama大語(yǔ)言模型開源
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)