0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

在英特爾AI開(kāi)發(fā)板上用OpenVINO NNCF優(yōu)化YOLOv7

英特爾物聯(lián)網(wǎng) ? 來(lái)源:英特爾物聯(lián)網(wǎng) ? 2024-01-05 09:29 ? 次閱讀

作者:康瑤明英特爾邊緣計(jì)算創(chuàng)新大使

YOLO代表“You Only Look Once”,它是一種流行的實(shí)時(shí)物體檢測(cè)算法系列。最初的YOLO物體檢測(cè)器于2016年首次發(fā)布。從那時(shí)起,YOLO的不同版本和變體被提出,每個(gè)版本和變體都顯著提高了性能和效率。YOLO算法作為one-stage目標(biāo)檢測(cè)算法最典型的代表,其基于深度神經(jīng)網(wǎng)絡(luò)進(jìn)行對(duì)象的識(shí)別和定位,運(yùn)行速度很快,可以用于實(shí)時(shí)系統(tǒng)。YOLOv7 是 YOLO 模型系列的下一個(gè)演進(jìn)階段,在不增加推理成本的情況下,大大提高了實(shí)時(shí)目標(biāo)檢測(cè)精度。

0682d45a-aae9-11ee-8b88-92fbcf53809c.png

項(xiàng)目使用的代碼在github開(kāi)源,來(lái)源GitHub。

01準(zhǔn)備模型與環(huán)境

1.1安裝OpenVINO以及nncf包,并且clone yolov7的倉(cāng)庫(kù)

%pip install -q "openvino>=2023.2.0" "nncf>=2.5.0"
import sys
from pathlib import Path
sys.path.append("../utils")
from notebook_utils import download_file
# Clone YOLOv7 repo
if not Path('yolov7').exists():
  !git clone https://github.com/WongKinYiu/yolov7
%cd yolov7

左滑查看更多

下圖為代碼執(zhí)行后的輸出:

06986324-aae9-11ee-8b88-92fbcf53809c.png

1.2下載預(yù)訓(xùn)練模型

# Download pre-trained model weights
MODEL_LINK = "https://github.com/WongKinYiu/yolov7/releases/download/v0.1/yolov7-tiny.pt"
DATA_DIR = Path("data/")
MODEL_DIR = Path("model/")
MODEL_DIR.mkdir(exist_ok=True)
DATA_DIR.mkdir(exist_ok=True)


download_file(MODEL_LINK, directory=MODEL_DIR, show_progress=True)

左滑查看更多

下圖為代碼執(zhí)行后的輸出:

06a521ae-aae9-11ee-8b88-92fbcf53809c.png

02使用Pytorch原生推理檢查模型

調(diào)用推理腳本`ignore detect.py`,輸入模型相關(guān)信息和推理圖片執(zhí)行推理:

!python -W ignore detect.py --weights model/yolov7-tiny.pt --conf 0.25 --img-size 640 --source inference/images/horses.jpg

左滑查看更多

下圖為代碼執(zhí)行后的輸出,執(zhí)行完成后可以看到輸出圖像尺寸信息以及torch版本,推理設(shè)備為CPU。推理結(jié)果可以看到識(shí)別到5匹馬,推理耗時(shí)、NMS耗時(shí),結(jié)果圖片保存路徑等信息。

06c70242-aae9-11ee-8b88-92fbcf53809c.png

打開(kāi)圖片查看結(jié)果:

image.png

03導(dǎo)出模型為onnx格式

3.1查看`export.py`腳本參數(shù)說(shuō)明

06fdef50-aae9-11ee-8b88-92fbcf53809c.png

3.2輸入模型權(quán)重文件路徑和要導(dǎo)出Detect()層網(wǎng)格,執(zhí)行腳本生成onnx模型文件并保存

需要說(shuō)明的是,將整個(gè)后處理包含到模型中有助于獲得更高性能的結(jié)果,但同時(shí)會(huì)降低模型的靈活性,并且不能保證完全準(zhǔn)確,這就是為什么我們只添加--grid 參數(shù)來(lái)保留原始 pytorch 模型結(jié)果格式的原因。

071168e6-aae9-11ee-8b88-92fbcf53809c.png

04轉(zhuǎn)換onnx格式為OpenVINO支持的IR文件

雖然 OpenVINO Runtime直接支持 ONNX 模型,但將它們轉(zhuǎn)換為 IR 格式可以利用 OpenVINO 模型轉(zhuǎn)換的一些API特性。調(diào)用模型轉(zhuǎn)換的python API 的`ov.convert_model`可以轉(zhuǎn)換模型。該API返回 OpenVINO 模型類的實(shí)例,該實(shí)例可在 Python 接口中使用。我們可以使用`ov.save_model` API 接口以 OpenVINO IR 格式保存在設(shè)備上,以備使用。

import openvino as ov


model = ov.convert_model('model/yolov7-tiny.onnx')
# serialize model for saving IR
ov.save_model(model, 'model/yolov7-tiny.xml')

左滑查看更多

05驗(yàn)證模型推理

`detect.py` 推理腳本包括預(yù)處理步驟、OpenVINO模型的推理以及結(jié)果后處理以獲得邊界框等功能。

左滑查看更多

模型需要RGB通道格式的圖像,并在[0, 1] 范圍內(nèi)歸一化。要調(diào)整圖像大小以適合模型大小,請(qǐng)使用`letterbox`方法調(diào)整,其中保留了寬度和高度的縱橫比。為了保持特定的形狀,預(yù)處理會(huì)自動(dòng)啟用填充。

5.1預(yù)處理階段

對(duì)圖像進(jìn)行預(yù)處理,以 `np.array` 格式獲取圖像,使用`letterbox`方法將其調(diào)整為特定大小,將色彩空間從 BGR(OpenCV 中的默認(rèn)值)轉(zhuǎn)換為 RGB,并將數(shù)據(jù)布局從 HWC 更改為 CHW:

def preprocess_image(img0: np.ndarray):
  # resize
  img = letterbox(img0, auto=False)[0]
  
  # Convert
  img = img.transpose(2, 0, 1)
  img = np.ascontiguousarray(img)
  return img, img0

左滑查看更多

將預(yù)處理后的圖像轉(zhuǎn)換為張量格式。以 np.array 格式獲取圖像,其中 unit8 數(shù)據(jù)在[0, 255] 范圍內(nèi),并將其轉(zhuǎn)換為浮點(diǎn)數(shù)據(jù)在[0, 1] 范圍內(nèi)的 torch.Tensor 對(duì)象。

def prepare_input_tensor(image: np.ndarray):
  input_tensor = image.astype(np.float32) # uint8 to fp16/32
  input_tensor /= 255.0 # 0 - 255 to 0.0 - 1.0
  
  if input_tensor.ndim == 3:
    input_tensor = np.expand_dims(input_tensor, 0)

左滑查看更多

5.2后處理階段

模型檢測(cè)功能核心代碼的介紹,使用 NMS 讀取圖像、對(duì)其進(jìn)行預(yù)處理、運(yùn)行模型推理和后處理結(jié)果。

參數(shù):

model(Model):OpenVINO編譯的模型。

image_path (Path):輸入圖片路徑。

conf_thres(浮點(diǎn)數(shù),*可選*,0.25):對(duì)象過(guò)濾的最小置信度

iou_thres(float,*可選*,0.45):在 NMS 中重新復(fù)制對(duì)象的最小重疊分?jǐn)?shù)

classes (List[int],*optional*, None):用于預(yù)測(cè)過(guò)濾的標(biāo)簽,如果未提供,則將使用所有預(yù)測(cè)標(biāo)簽

agnostic_nms (bool,*optiona*, False):是否應(yīng)用與類無(wú)關(guān)的 NMS 方法

返回:

pred (List):具有(n,6)形狀的檢測(cè)列表,其中 n - 格式為[x1, y1, x2, y2, score, label] 的檢測(cè)框數(shù)

orig_img (np.ndarray):預(yù)處理前的圖像,可用于結(jié)果可視化

input_shape (Tuple[int]):模型輸入tensor的形狀,可用于輸出分辨率

def detect(model: ov.Model, image_path: Path, conf_thres: float = 0.25, iou_thres: float = 0.45, classes: List[int] = None, agnostic_nms: bool = False):
  output_blob = model.output(0)
  img = np.array(Image.open(image_path))
  preprocessed_img, orig_img = preprocess_image(img)
  input_tensor = prepare_input_tensor(preprocessed_img)
  predictions = torch.from_numpy(model(input_tensor)[output_blob])
  pred = non_max_suppression(predictions, conf_thres, iou_thres, classes=classes, agnostic=agnostic_nms)
  return pred, orig_img, input_tensor.shape

左滑查看更多

圖像上繪制預(yù)測(cè)邊界框的核心代碼實(shí)現(xiàn),

參數(shù):

predictions (np.ndarray):形狀為(n,6)的檢測(cè)列表,其中 n - 檢測(cè)到的框數(shù),格式為[x1, y1, x2, y2, score, label]

image (np.ndarray):用于框可視化的圖像

names (List[str]):數(shù)據(jù)集中每個(gè)類的名稱列表

colors (Dict[str, int]):類名和繪圖顏色之間的映射

返回:

image (np.ndarray):框可視化結(jié)果

def draw_boxes(predictions: np.ndarray, input_shape: Tuple[int], image: np.ndarray, names: List[str], colors: Dict[str, int]):
  if not len(predictions):
    return image
  # Rescale boxes from input size to original image size
  predictions[:, :4] = scale_coords(input_shape[2:], predictions[:, :4], image.shape).round()


  # Write results
  for *xyxy, conf, cls in reversed(predictions):
    label = f'{names[int(cls)]} {conf:.2f}'
    plot_one_box(xyxy, image, label=label, color=colors[names[int(cls)]], line_thickness=1)

左滑查看更多

06選擇設(shè)備并推理

compiled_model = core.compile_model(model, device.value)
boxes, image, input_shape = detect(compiled_model, 'inference/images/horses.jpg')
image_with_boxes = draw_boxes(boxes[0], input_shape, image, NAMES, COLORS)
# visualize results
Image.fromarray(image_with_boxes)

左滑查看更多

07驗(yàn)證模型準(zhǔn)確性

為了評(píng)估模型的準(zhǔn)確性,需要下載coco數(shù)據(jù)集以及注釋。處理驗(yàn)證數(shù)據(jù)集并完成評(píng)估。評(píng)估完成后,下圖可以看到準(zhǔn)確度是符合要求的:

074a578c-aae9-11ee-8b88-92fbcf53809c.png

08使用NNCF 訓(xùn)練后量化API 優(yōu)化模型

NNCF 是 OpenVINO 中的神經(jīng)網(wǎng)絡(luò)推理優(yōu)化提供了一套高級(jí)算法,精度下降最小。我們將在訓(xùn)練后模式下使用 8-bit量化來(lái)優(yōu)化 YOLOv7。優(yōu)化過(guò)程包含以下步驟:1)創(chuàng)建用于量化的數(shù)據(jù)集。2)運(yùn)行 nncf.quantize 以獲取優(yōu)化的模型。3)使用 openvino.runtime.serialize 函數(shù)序列化 OpenVINO IR 模型。

量化變換函數(shù),從數(shù)據(jù)加載器項(xiàng)中提取和預(yù)處理輸入數(shù)據(jù)以進(jìn)行量化。量化完成后可以驗(yàn)證量化模型推理和驗(yàn)證量化模型的準(zhǔn)確性,看是否符合要求。

import nncf 


def transform_fn(data_item):
  img = data_item[0].numpy()
  input_tensor = prepare_input_tensor(img) 
  return input_tensor


quantization_dataset = nncf.Dataset(dataloader, transform_fn)

左滑查看更多

nncf.quantize 函數(shù)提供模型量化的接口。它需要OpenVINO模型和量化數(shù)據(jù)集的實(shí)例。

quantized_model = nncf.quantize(model, quantization_dataset, preset=nncf.QuantizationPreset.MIXED)


ov.save_model(quantized_model, 'model/yolov7-tiny_int8.xml')

左滑查看更多

09比較原始模型和量化后模型的性能

量化完成后,我們希望使用 OpenVINO 基準(zhǔn)測(cè)試工具測(cè)量 FP32 和 INT8 模型的推理性能,從而清楚NNCF帶來(lái)的優(yōu)化提升。

下圖為在AI愛(ài)克斯開(kāi)發(fā)板上FP32格式的模型推理,cpu型號(hào)為n5105,可以看到吞吐為2.27fps。

075de874-aae9-11ee-8b88-92fbcf53809c.png

下圖為量化后 INT8 格式的模型推理,可以看到吞吐為4.89fps。

077f127e-aae9-11ee-8b88-92fbcf53809c.png

總 結(jié)

FP32格式的模型推理AI愛(ài)克斯開(kāi)發(fā)板上CPU吞吐為2.27fps,量化后 INT8 格式為4.89fps,由此說(shuō)明了量化的后性能提升很明顯,提升至2.15倍,在工程和學(xué)習(xí)中推薦使用NNCF等OpenVINO工具來(lái)優(yōu)化模型,從而在不損失精度的前提下提高推理性能,更好的服務(wù)于場(chǎng)景使用。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 英特爾
    +關(guān)注

    關(guān)注

    60

    文章

    9748

    瀏覽量

    170648
  • 檢測(cè)器
    +關(guān)注

    關(guān)注

    1

    文章

    847

    瀏覽量

    47557
  • AI
    AI
    +關(guān)注

    關(guān)注

    87

    文章

    28877

    瀏覽量

    266225
  • 開(kāi)發(fā)板
    +關(guān)注

    關(guān)注

    25

    文章

    4771

    瀏覽量

    96172
  • OpenVINO
    +關(guān)注

    關(guān)注

    0

    文章

    73

    瀏覽量

    139

原文標(biāo)題:在英特爾 AI 開(kāi)發(fā)板上用OpenVINO? NNCF 優(yōu)化 YOLOv7,2.15 倍性能提升 | 開(kāi)發(fā)者實(shí)戰(zhàn)

文章出處:【微信號(hào):英特爾物聯(lián)網(wǎng),微信公眾號(hào):英特爾物聯(lián)網(wǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于C#和OpenVINO?英特爾獨(dú)立顯卡上部署PP-TinyPose模型

    OpenVINO,將 PP-TinyPose 模型部署英特爾獨(dú)立顯卡。 1.1 PP-TinyPose 模型簡(jiǎn)介 PP-TinyPose 是飛槳 PaddleDetecion
    的頭像 發(fā)表于 11-18 18:27 ?2316次閱讀

    如何在您的英特爾? Edison 開(kāi)發(fā)板更新(刷新)固件

    本部分介紹了如何在您的英特爾? Edison 開(kāi)發(fā)板更新(刷新)固件。Flash Tool Lite 是刷新開(kāi)發(fā)板固件的首選方法。固件是開(kāi)發(fā)板
    發(fā)表于 06-15 15:24

    介紹英特爾?分布式OpenVINO?工具包

    性能。 英特爾?OpenlandOpen?管理軟件包包括英特爾?深度學(xué)習(xí)部署工具包(英特爾?DLDT)。適用于Linux *的OpenVINO?工具包的
    發(fā)表于 07-26 06:45

    yolov7 onnx模型NPU太慢了怎么解決?

    我將 yolov7tiny.pt(yolov7-tiny 模型)轉(zhuǎn)換為具有 uint8 權(quán)重的 yolov7tiny.onnx,然后 i.MX 8M Plus NPU
    發(fā)表于 04-04 06:13

    無(wú)法使用MYRIADOpenVINO trade中運(yùn)行YOLOv7自定義模型怎么解決?

    無(wú)法確定如何將 YOLOv7 模型的重量(.pt 文件)轉(zhuǎn)換為OpenVINO?中間表示 (IR) 并推斷有 MYRIAD 的 IR。 分辨率 轉(zhuǎn)換使用此 GitHub* 存儲(chǔ)庫(kù)
    發(fā)表于 08-15 08:29

    英特爾推出了OpenVINO

    接受外媒ZDNet采訪的時(shí)候,英特爾高管Adam Burns表示:“構(gòu)建智能的不只是一種架構(gòu)。”OpenVINO提供了一組已經(jīng)優(yōu)化的能力和runtime引擎,能夠允許
    的頭像 發(fā)表于 04-13 14:18 ?2876次閱讀

    英特爾? FPGA AI套件搭配OpenVINO?工具包

    您可以使用英特爾 分發(fā)版 OpenVINO 工具包和英特爾 FPGA AI 套件開(kāi)發(fā)推理系統(tǒng),服務(wù)于從 DL 增強(qiáng)型嵌入式系統(tǒng)一直到
    的頭像 發(fā)表于 08-11 11:53 ?988次閱讀

    AI愛(ài)克斯開(kāi)發(fā)板OpenVINO?加速YOLOv8分類模型

    本系列文章將在 AI 愛(ài)克斯開(kāi)發(fā)板使用 OpenVINO 開(kāi)發(fā)套件依次部署并測(cè)評(píng) YOLOv8
    的頭像 發(fā)表于 05-05 11:47 ?907次閱讀
    <b class='flag-5'>在</b><b class='flag-5'>AI</b>愛(ài)克斯<b class='flag-5'>開(kāi)發(fā)板</b><b class='flag-5'>上</b><b class='flag-5'>用</b><b class='flag-5'>OpenVINO</b>?加速<b class='flag-5'>YOLOv</b>8分類模型

    AI愛(ài)克斯開(kāi)發(fā)板OpenVINO?加速YOLOv8目標(biāo)檢測(cè)模型

    AI 愛(ài)克斯開(kāi)發(fā)板 OpenVINO 加速 YOL
    的頭像 發(fā)表于 05-12 09:08 ?1151次閱讀
    <b class='flag-5'>在</b><b class='flag-5'>AI</b>愛(ài)克斯<b class='flag-5'>開(kāi)發(fā)板</b><b class='flag-5'>上</b><b class='flag-5'>用</b><b class='flag-5'>OpenVINO</b>?加速<b class='flag-5'>YOLOv</b>8目標(biāo)檢測(cè)模型

    AI愛(ài)克斯開(kāi)發(fā)板使用OpenVINO加速YOLOv8目標(biāo)檢測(cè)模型

    AI愛(ài)克斯開(kāi)發(fā)板OpenVINO加速YOLOv
    的頭像 發(fā)表于 05-26 11:03 ?1077次閱讀
    <b class='flag-5'>AI</b>愛(ài)克斯<b class='flag-5'>開(kāi)發(fā)板</b><b class='flag-5'>上</b>使用<b class='flag-5'>OpenVINO</b>加速<b class='flag-5'>YOLOv</b>8目標(biāo)檢測(cè)模型

    AI愛(ài)克斯開(kāi)發(fā)板OpenVINO?加速YOLOv8-seg實(shí)例分割模型

    AI 愛(ài)克斯開(kāi)發(fā)板 OpenVINO 加速 YOL
    的頭像 發(fā)表于 06-05 11:52 ?856次閱讀
    <b class='flag-5'>在</b><b class='flag-5'>AI</b>愛(ài)克斯<b class='flag-5'>開(kāi)發(fā)板</b><b class='flag-5'>上</b><b class='flag-5'>用</b><b class='flag-5'>OpenVINO</b>?加速<b class='flag-5'>YOLOv</b>8-seg實(shí)例分割模型

    AI愛(ài)克斯開(kāi)發(fā)板OpenVINO?加速YOLOv8-seg實(shí)例分割模型

    AI 愛(ài)克斯開(kāi)發(fā)板 OpenVINO 加速 YOL
    的頭像 發(fā)表于 06-30 10:43 ?770次閱讀
    <b class='flag-5'>在</b><b class='flag-5'>AI</b>愛(ài)克斯<b class='flag-5'>開(kāi)發(fā)板</b><b class='flag-5'>上</b><b class='flag-5'>用</b><b class='flag-5'>OpenVINO</b>?加速<b class='flag-5'>YOLOv</b>8-seg實(shí)例分割模型

    使用OpenVINO優(yōu)化并部署訓(xùn)練好的YOLOv7模型

    英特爾銳炫 顯卡+ oneAPI 和 OpenVINO 實(shí)現(xiàn)英特爾 視頻 AI 計(jì)算盒訓(xùn)推一體-上篇》一文中,我們?cè)敿?xì)介紹基于
    的頭像 發(fā)表于 08-25 11:08 ?1310次閱讀
    使用<b class='flag-5'>OpenVINO</b><b class='flag-5'>優(yōu)化</b>并部署訓(xùn)練好的<b class='flag-5'>YOLOv7</b>模型

    基于OpenVINO英特爾開(kāi)發(fā)套件實(shí)現(xiàn)眼部追蹤

    本文將以訓(xùn)練一個(gè)眼部追蹤 AI 小模型為背景,介紹從 Pytorch 自定義網(wǎng)絡(luò)模型,到使用 OpenVINO NNCF 量化工具優(yōu)化模型,并部署到
    的頭像 發(fā)表于 09-18 10:11 ?670次閱讀

    基于英特爾開(kāi)發(fā)套件的AI字幕生成器設(shè)計(jì)

    市面上有很多自然語(yǔ)言處理模型,本文旨在幫助開(kāi)發(fā)者快速將 OpenAI* 的熱門 NLP 模型 Whisper 部署至英特爾 開(kāi)發(fā)套件愛(ài)克斯開(kāi)發(fā)板
    的頭像 發(fā)表于 09-27 16:59 ?778次閱讀
    基于<b class='flag-5'>英特爾</b><b class='flag-5'>開(kāi)發(fā)</b>套件的<b class='flag-5'>AI</b>字幕生成器設(shè)計(jì)