最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

如何讓YOLOv8獲得1000+FPS性能?蝰蛇峽谷告訴你答案

2023-02-13 17:51 作者:科研市  | 我要投稿

以下文章來(lái)源于英特爾物聯(lián)網(wǎng) ,作者武卓,張晶

英特爾??銳炫??獨(dú)立顯卡簡(jiǎn)介

英特爾??銳炫??顯卡基于 Xe-HPG 微架構(gòu),Xe?HPG GPU 中的每個(gè) Xe?內(nèi)核都配置了一組 256 位矢量引擎,旨在加速傳統(tǒng)圖形和計(jì)算工作負(fù)載,以及新的 1024 位矩陣引擎或 Xe?矩陣擴(kuò)展,旨在加速人工智能工作負(fù)載。

蝰蛇峽谷簡(jiǎn)介

蝰蛇峽谷(Serpent Canyon) 體積僅約2.5升,提供了豐富的接口,是一款性能強(qiáng)勁,并且體積小巧的高性能迷你主機(jī)。新一代NUC蝰蛇峽谷搭載全新一代混合架構(gòu)的第 12 代智能英特爾??酷睿??處理器,并且內(nèi)置了英特爾??銳炫??A770M 獨(dú)立顯卡。這張顯卡擁有強(qiáng)大算力,在運(yùn)行AI開發(fā)軟件或者創(chuàng)意應(yīng)用時(shí)能提供穩(wěn)定性能。

YOLO 家族又添新成員了!

作為目標(biāo)檢測(cè)領(lǐng)域著名的模型家族,you only look once (YOLO) 推出新模型的速度可謂是越來(lái)越快。就在剛剛過(guò)去的1月份,YOLO 又推出了最新的YOLOv8 模型,其模型結(jié)構(gòu)和架構(gòu)上的創(chuàng)新以及所提供的性能提升,使得它剛剛面世,就獲得了廣大開發(fā)者的關(guān)注。

YOLOv8 的性能到底怎么樣?如果說(shuō)利用 OpenVINO? 的量化和加速,利用英特爾? CPU、集成顯卡以及獨(dú)立顯卡與同一代碼庫(kù)無(wú)縫協(xié)作,可以獲得 1000+ FPS 的性能,你相信嗎?那不妨繼續(xù)往下看,我們將手把手的教你在利用 OpenVINO? 工具套件在英特爾? 處理器上實(shí)現(xiàn)這一性能。

圖1. YOLOv8 推理結(jié)果示例?

好的,讓我們開始吧。

注意

以下步驟中的所有代碼來(lái)自 OpenVINO? Notebooks 開源倉(cāng)庫(kù)中的 230-yolov8-optimization notebook 代碼示例,您可以點(diǎn)擊以下鏈接直達(dá)源代碼:

https://github.com/openvinotoolkit/openvino_notebooks/blob/main/notebooks/230-yolov8-optimization/230-yolov8-optimization.ipynb

01

安裝相應(yīng)工具包及加載模型?

本次代碼示例我們使用的是 Ultralytics YOLOv8 模型,因此需要首先安裝相應(yīng)工具套件;

!pip install "ultralytics==8.0.5"

向右滑動(dòng)查看完整代碼

?

然后下載及加載相應(yīng)的 PyTorch 模型;

from ultralytics import YOLO MODEL_NAME = "yolov8n" model = YOLO(f'{MODEL_NAME}.pt') label_map = model.model.names

向右滑動(dòng)查看完整代碼

?

定義測(cè)試圖片的地址,獲得原始 PyTorch 模型的推理結(jié)果;

IMAGE_PATH = "../data/image/coco_bike.jpg" results = model(IMAGE_PATH, return_outputs=True)

向右滑動(dòng)查看完整代碼

?

其運(yùn)行效果如下:

為將目標(biāo)檢測(cè)的效果以可視化的形式呈現(xiàn)出來(lái),需要定義相應(yīng)的函數(shù),最終運(yùn)行效果如下圖所示。

02

將模型轉(zhuǎn)換為 OpenVINO IR 格式

為獲得良好的模型推理加速,并更方便的部署在不同的硬件平臺(tái)上,接下來(lái)我們首先將YOLO v8模型轉(zhuǎn)換為 OpenVINO IR 模型格式。YOLOv8 提供了用于將模型導(dǎo)出到不同格式(包括 OpenVINO IR 格式)的 API。model.export 負(fù)責(zé)模型轉(zhuǎn)換。我們需要在這里指定格式,此外,我們還可以在模型中保留動(dòng)態(tài)輸入。

from pathlib import Path model_path = Path(f"{MODEL_NAME}_openvino_model/{MODEL_NAME}.xml") if not model_path.exists(): ? ? ?model.export(format="openvino", dynamic=True, half=False)

向右滑動(dòng)查看完整代碼

?

接下來(lái)我們來(lái)測(cè)試一下轉(zhuǎn)換后模型的準(zhǔn)確度如何。運(yùn)行以下代碼,并定義相應(yīng)的前處理、后處理函數(shù);

from openvino.runtime import Core, Model core = Core() ov_model = core.read_model(model_path) device = "CPU" ?# GPU if device != "CPU": ? ? ?ov_model.reshape({0: [1, 3, 640, 640]}) compiled_model = core.compile_model(ov_model, device)

向右滑動(dòng)查看完整代碼


在單張測(cè)試圖片上進(jìn)行推理,可以得到如下推理結(jié)果。

03

在數(shù)據(jù)集上驗(yàn)證模型準(zhǔn)確度

YOLOv8 是在 COCO 數(shù)據(jù)集上進(jìn)行預(yù)訓(xùn)練的,因此為了評(píng)估模型的準(zhǔn)確性,我們需要下載該數(shù)據(jù)集。根據(jù) YOLOv8 GitHub 倉(cāng)庫(kù)中提供的說(shuō)明,我們還需要下載模型作者使用的格式的標(biāo)注,以便與原始模型評(píng)估功能一起使用。

import sys from zipfile import ZipFile sys.path.append("../utils") from notebook_utils import download_file DATA_URL = "http://images.cocodataset.org/zips/val2017.zip" LABELS_URL = "https://github.com/ultralytics/yolov5/releases/download/v1.0/coco2017labels-segments.zip" OUT_DIR = Path('./datasets') download_file(DATA_URL, directory=OUT_DIR, show_progress=True) download_file(LABELS_URL, directory=OUT_DIR, show_progress=True) if not (OUT_DIR / "coco/labels").exists(): ? ?with ZipFile(OUT_DIR / 'coco2017labels-segments.zip' , "r") as zip_ref: ? ? ? ? ? ? ? ?zip_ref.extractall(OUT_DIR) ? ?with ZipFile(OUT_DIR / 'val2017.zip' , "r") as zip_ref: ? ? ? ?zip_ref.extractall(OUT_DIR / 'coco/images')

向右滑動(dòng)查看完整代碼

?

接下來(lái),我們配置 DetectionValidator 并創(chuàng)建 DataLoader。原始模型存儲(chǔ)庫(kù)使用 DetectionValidator 包裝器,它表示精度驗(yàn)證的過(guò)程。它創(chuàng)建 DataLoader 和評(píng)估標(biāo)準(zhǔn),并更新 DataLoader 生成的每個(gè)數(shù)據(jù)批的度量標(biāo)準(zhǔn)。此外,它還負(fù)責(zé)數(shù)據(jù)預(yù)處理和結(jié)果后處理。對(duì)于類初始化,應(yīng)提供配置。我們將使用默認(rèn)設(shè)置,但可以用一些參數(shù)替代,以測(cè)試自定義數(shù)據(jù),代碼如下:

from ultralytics.yolo.utils import DEFAULT_CONFIG from ultralytics.yolo.configs import get_config args = get_config(config=DEFAULT_CONFIG) args.data = "coco.yml" validator = model.ValidatorClass(args) data_loader = validator.get_dataloader("datasets/coco", 1)

向右滑動(dòng)查看完整代碼

?

Validator 配置代碼如下:

from tqdm.notebook import tqdm from ultralytics.yolo.utils.metrics import ConfusionMatrix validator.is_coco = True validator.class_map = ops.coco80_to_coco91_class() validator.names = model.model.names validator.metrics.names = validator.names validator.nc = model.model.model[-1].nc

向右滑動(dòng)查看完整代碼

?

定義驗(yàn)證函數(shù),以及打印相應(yīng)測(cè)試結(jié)果的函數(shù),結(jié)果如下:

04

利用 NNCF POT 量化 API 進(jìn)行模型優(yōu)化?

Neural network compression framework (NNCF) 為 OpenVINO? 中的神經(jīng)網(wǎng)絡(luò)推理優(yōu)化提供了一套先進(jìn)的算法,精度下降最小。我們將在后訓(xùn)練(Post-training)模式中使用8位量化(無(wú)需微調(diào))來(lái)優(yōu)化YOLOv8。

優(yōu)化過(guò)程包括以下三個(gè)步驟:

1.建立量化數(shù)據(jù)集 Dataset;

2.運(yùn)行 nncf.quantize 來(lái)得到優(yōu)化模型

3.使用串行化函數(shù) openvino.runtime.serialize 來(lái)得到 OpenVINO IR 模型。

建立量化數(shù)據(jù)集代碼如下:

import nncf ?# noqa: F811 from typing import Dict def transform_fn(data_item:Dict): ? ?""" ? ?Quantization transform function. Extracts and preprocess input data from dataloader item for quantization. ? ?Parameters: ? ? ? data_item: Dict with data item produced by DataLoader during iteration ? ?Returns: ? ? ? ?input_tensor: Input data for quantization ? ?""" ? ?input_tensor = validator.preprocess(data_item)['img'].numpy() ? ?return input_tensor quantization_dataset = nncf.Dataset(data_loader, transform_fn)

向右滑動(dòng)查看完整代碼

運(yùn)行 nncf.quantize 代碼如下:

quantized_model = nncf.quantize( ? ?ov_model, ? ?quantization_dataset, ? ?preset=nncf.QuantizationPreset.MIXED, ? ?ignored_scope=nncf.IgnoredScope( ? ? ? ?types=["Multiply", "Subtract", "Sigmoid"], ?# ignore operations ? ? ? ?names=["/model.22/dfl/conv/Conv", ? ? ? ? ? # in the post-processing subgraph ? ? ? ? ? ? ? "/model.22/Add", ? ? ? ? ? ? ? "/model.22/Add_1", ? ? ? ? ? ? ? "/model.22/Add_2", ? ? ? ? ? ? ? "/model.22/Add_3", ? ? ? ? ? ? ? "/model.22/Add_4", ? ? ? ? ? ? ? "/model.22/Add_5", ? ? ? ? ? ? ? "/model.22/Add_6", ? ? ? ? ? ? ? "/model.22/Add_7", ? ? ? ? ? ? ? "/model.22/Add_8", ? ? ? ? ? ? ? "/model.22/Add_9", ? ? ? ? ? ? ? "/model.22/Add_10"] ? ?))

向右滑動(dòng)查看完整代碼

?

最終串行化函數(shù)代碼如下:

from openvino.runtime import serialize int8_model_path = Path(f'{MODEL_NAME}_openvino_int8_model/{MODEL_NAME}.xml') print(f"Quantized model will be saved to {int8_model_path}") serialize(quantized_model, str(int8_model_path))

向右滑動(dòng)查看完整代碼

?

運(yùn)行后得到的優(yōu)化的 YOLOv8 模型保存在以下路徑;

yolov8n_openvino_int8_model/yolov8n.xml

向右滑動(dòng)查看完整代碼

接下來(lái),運(yùn)行以下代碼在單張測(cè)試圖片上驗(yàn)證優(yōu)化模型的推理結(jié)果;

if device != "CPU": ? ?quantized_model.reshape({0, [1, 3, 640, 640]}) quantized_compiled_model = core.compile_model(quantized_model, device) input_image = np.array(Image.open(IMAGE_PATH)) detections = detect(input_image, quantized_compiled_model)[0] image_with_boxes = draw_boxes(detections, input_image) Image.fromarray(image_with_boxes)

向右滑動(dòng)查看完整代碼

?

運(yùn)行結(jié)果如下:

驗(yàn)證下優(yōu)化后模型的精度,運(yùn)行如下代碼;

print("FP32 model accuracy") print_stats(fp_stats, validator.seen, validator.nt_per_class.sum()) print("INT8 model accuracy") print_stats(int8_stats, validator.seen, validator.nt_per_class.sum())

向右滑動(dòng)查看完整代碼

得到結(jié)果如下:

可以看到模型精度相較于優(yōu)化前,并沒有明顯的下降。

05

比較優(yōu)化前后模型的性能?

接著,我們利用 OpenVINO? 基線測(cè)試工具

https://docs.openvino.ai/latest/openvino_inference_engine_tools_benchmark_tool_README.html?

?

來(lái)比較優(yōu)化前(FP32)和優(yōu)化后(INT8)模型的性能。在這里,我們分別在英特爾?至強(qiáng)? 第三代處理器(Xeon Ice Lake Gold Intel 6348 2.6 GHz 42 MB 235W 28 cores)上運(yùn)行 CPU 端的性能比較。針對(duì)優(yōu)化前模型的測(cè)試代碼和運(yùn)行結(jié)果如下;

# Inference FP32 model (OpenVINO IR) !benchmark_app -m $model_path -d CPU -api async -shape "[1,3,640,640]"

向右滑動(dòng)查看完整代碼

?

FP32 模型性能:

INT8模型性能:

已經(jīng)達(dá)到了 1400+ FPS!

在英特爾? 獨(dú)立顯卡上的性能又如何呢?我們?cè)贏rc? A770m 上測(cè)試效果如下:

也超過(guò)了1000 FPS!

需要注意的是要想獲得如此的高性能,需要將推理運(yùn)行在吞吐量模式下,并使用多流和多個(gè)推理請(qǐng)求(即并行運(yùn)行多個(gè))。同樣,仍然需要確保對(duì)預(yù)處理和后處理管道進(jìn)行微調(diào),以確保沒有性能瓶頸。

06

利用網(wǎng)絡(luò)攝像頭運(yùn)行實(shí)時(shí)測(cè)試?

除了基線測(cè)試工具外,如果你想利用自己的網(wǎng)絡(luò)攝像頭,體驗(yàn)一下實(shí)時(shí)推理的效果,可以運(yùn)行我們提供的實(shí)時(shí)運(yùn)行目標(biāo)檢測(cè)函數(shù);

run_object_detection(source=0, flip=True, use_popup=False, model=ov_model, device="AUTO")

向右滑動(dòng)查看完整代碼

?

獲得類似如下圖的效果:

07

進(jìn)一步提升性能的小技巧

非同步推理流水線

在進(jìn)行目標(biāo)檢測(cè)的推理時(shí),推理性能常常會(huì)因?yàn)閿?shù)據(jù)輸入量的限制而受到影響。此時(shí),采用異步推理的模型,可以進(jìn)一步提升推理的性能。異步 API 的主要優(yōu)點(diǎn)是,當(dāng)設(shè)備忙于推理時(shí),應(yīng)用程序可以并行執(zhí)行其他任務(wù)(例如填充輸入或調(diào)度其他請(qǐng)求),而不是等待當(dāng)前推理首先完成。要了解如何使用 OpenVINO? 執(zhí)行異步推理,請(qǐng)參閱 AsyncAPI 教程:

https://github.com/openvinotoolkit/openvino_notebooks/blob/97f25b16970b6fe2287ca47bba64f31cff98e795/notebooks/115-async-api/115-async-api.ipynb

使用預(yù)處理 API?

預(yù)處理 API 允許將預(yù)處理作為模型的一部分,從而減少應(yīng)用程序代碼和對(duì)其他圖像處理庫(kù)的依賴。預(yù)處理 API 的主要優(yōu)點(diǎn)是將預(yù)處理步驟集成到執(zhí)行圖中,并將在選定的設(shè)備(CPU/GPU/VPU/等)上執(zhí)行,而不是作為應(yīng)用程序的一部分始終在 CPU 上執(zhí)行。這將提高所選設(shè)備的利用率。更詳細(xì)的預(yù)處理 API 信息,請(qǐng)參閱預(yù)處理教程

https://docs.openvino.ai/latest/openvino_docs_OV_Runtime_UG_Preprocessing_Overview.html?

對(duì)于本次 YOLOv8 示例來(lái)說(shuō),預(yù)處理 API 的使用包含以下幾個(gè)步驟:

01

初始化 PrePostProcessing 對(duì)象 …?

from openvino.preprocess import PrePostProcessor ppp = PrePostProcessor(quantized_model)

向右滑動(dòng)查看完整代碼

?

02

定義輸入數(shù)據(jù)格式…

from openvino.runtime import Type, Layout ppp.input(0).tensor().set_shape([1, 640, 640, 3]).set_element_type(Type.u8).set_layout(Layout('NHWC')) pass

向右滑動(dòng)查看完整代碼

?

03

描述預(yù)處理步驟

預(yù)處理步驟主要包括以下三步:

將數(shù)據(jù)類型從 U8 轉(zhuǎn)換為 FP32

將數(shù)據(jù)布局從 NHWC 轉(zhuǎn)換為 NCHW 格式

通過(guò)按比例因子 255 進(jìn)行除法來(lái)歸一化每個(gè)像素

ppp.input(0).preprocess().convert_element_type(Type.f32).convert_layout(Layout('NCHW')).scale([255., 255., 255.]) print(ppp)

向右滑動(dòng)查看完整代碼

?

04

將步驟集成到模型中

quantized_model_with_preprocess = ppp.build() serialize(quantized_model_with_preprocess, str(int8_model_path.with_name(f"{MODEL_NAME}_with_preprocess.xml")))

向右滑動(dòng)查看完整代碼

?

具有集成預(yù)處理的模型已準(zhǔn)備好加載到設(shè)備。現(xiàn)在,我們可以跳過(guò)檢測(cè)函數(shù)中的這些預(yù)處理步驟,直接運(yùn)行如下推理:

def detect_without_preprocess(image:np.ndarray, model:Model): ? ?""" ? ?OpenVINO YOLOv8 model with integrated preprocessing inference function. Preprocess image, runs model inference and postprocess results using NMS. ? ?Parameters: ? ? ? ?image (np.ndarray): input image. ? ? ? ?model (Model): OpenVINO compiled model. ? ?Returns: ? ? ? ?detections (np.ndarray): detected boxes in format [x1, y1, x2, y2, score, label] ? ?""" ? ?output_layer = model.output(0) ? ?img = letterbox(image)[0] ? ?input_tensor = np.expand_dims(img, 0) ? ?input_hw = img.shape[:2] ? ?result = model(input_tensor)[output_layer] ? ?detections = postprocess(result, input_hw, image) ? ?return detections compiled_model = core.compile_model(quantized_model_with_preprocess, device) input_image = np.array(Image.open(IMAGE_PATH)) detections = detect_without_preprocess(input_image, compiled_model)[0] image_with_boxes = draw_boxes(detections, input_image) Image.fromarray(img_with_boxes)

向右滑動(dòng)查看完整代碼


08

小結(jié)

整個(gè)的步驟就是這樣!現(xiàn)在就開始跟著我們提供的代碼和步驟,動(dòng)手試試用 OpenVINO? 優(yōu)化和加速 YOLOv8 吧。

關(guān)于英特爾 OpenVINO? 開源工具套件的詳細(xì)資料,包括其中我們提供的三百多個(gè)經(jīng)驗(yàn)證并優(yōu)化的預(yù)訓(xùn)練模型的詳細(xì)資料,請(qǐng)您點(diǎn)擊:

https://www.intel.com/content/www/us/en/developer/tools/openvino-toolkit/overview.html

除此之外,為了方便大家了解并快速掌握 OpenVINO? 的使用,我們還提供了一系列開源的 Jupyter notebook demo。運(yùn)行這些 notebook,就能快速了解在不同場(chǎng)景下如何利用 OpenVINO? 實(shí)現(xiàn)一系列、包括計(jì)算機(jī)視覺、語(yǔ)音及自然語(yǔ)言處理任務(wù)。

OpenVINO? notebooks的資源可以在 Github 這里下載安裝:

https://github.com/openvinotoolkit/openvino_notebooks


如何讓YOLOv8獲得1000+FPS性能?蝰蛇峽谷告訴你答案的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
禹州市| 仪陇县| 卫辉市| 大田县| 水城县| 玉树县| 桐城市| 兴安盟| 镶黄旗| 拉萨市| 永福县| 彭州市| 平江县| 陆河县| 鄄城县| 永州市| 赣州市| 霍山县| 柳林县| 隆德县| 平安县| 沐川县| 尉犁县| 广宁县| 凤冈县| 阜南县| 靖州| 开远市| 九江县| 遵化市| 东兰县| 上虞市| 通海县| 崇信县| 门源| 射洪县| 怀柔区| 界首市| 建德市| 静宁县| 巴彦县|