在 PCIe 上執行您的第一個模型
| 欄位 | 值 |
|---|---|
| 類別 | PCIe 協同處理 |
| 難度 | 初級 |
| 預估閱讀時間 | 15 minutes |
| 標籤 | PCIe, inference, tensor, image, detection |
使用相同的 YOLOv8s 檔案和 640x480 街景執行三個獨立的程式。每個程式都演示一種模式,同步使用佇列 0,並關閉一個模型。這可確保每個範例都足夠簡短,可以單獨複製。
操作指南
執行模型準備好的張量
主機會將圖像調整大小,使其符合模型報告的 [640, 640, 3] 輸入,將 BGR 轉換為 RGB,並將像素縮放到 [0, 1]。Model.run() 會傳送該 FP32 張量,而無需卡片端圖像預處理,並列印所有六個原始 YOLO 輸出路由。
pcie_host/tutorials/024_run_your_first_model_over_pcie/run_tensor_mode.cpp
pcie::ConnectionOptions connection;
connection.card_id = card_id;
pcie::Model model(kModelPath, {}, connection);
const auto info = model.info();
if (info.inputs.size() != 1) {
throw std::runtime_error("YOLOv8s must expose one input tensor");
}
const pcie::Tensor input = make_yolo_tensor(image, info.inputs[0]);
model.build(kBuildTimeoutMs);
const auto outputs = model.run(input, kRunTimeoutMs);
if (outputs.empty()) {
throw std::runtime_error("tensor mode returned no outputs");
}
std::cout << "Tensor mode raw outputs:\n";
for (const auto& output : outputs) {
std::cout << " " << output.route.name << " " << dtype_name(output.dtype) << " "
<< shape_string(output.shape) << '\n';
}
model.close();
將預處理移動到卡片
將 preprocess.kind 設置為 Image,將傳入的像素識別為 BGR,並選擇 COCO_YOLO 預設設定。主機現在會傳送已解碼的像素,而卡片會執行調整大小、BGR 到 RGB 轉換和正規化。該程式會列印六個原始輸出路由名稱和形狀,以便您可以將其與張量模式進行比較。
pcie_host/tutorials/024_run_your_first_model_over_pcie/run_image_mode.cpp
pcie::ConnectionOptions connection;
connection.card_id = card_id;
pcie::ModelOptions options;
options.preprocess.kind = pcie::InputKind::Image;
options.preprocess.color_convert.input_format = pcie::ColorFormat::BGR;
options.preprocess.color_convert.output_format = pcie::ColorFormat::RGB;
options.preprocess.resize.enable = pcie::AutoFlag::On;
options.preprocess.resize.mode = pcie::ResizeMode::Letterbox;
options.preprocess.normalize.preset = pcie::NormalizePreset::COCO_YOLO;
pcie::Model model(kModelPath, options, connection);
model.build(kBuildTimeoutMs);
const auto outputs = model.run(image, kRunTimeoutMs);
if (outputs.empty()) {
throw std::runtime_error("image mode returned no outputs");
}
std::cout << "Image mode raw outputs:\n";
for (const auto& output : outputs) {
std::cout << " " << output.route.name << " " << dtype_name(output.dtype) << " "
<< shape_string(output.shape) << '\n';
}
model.close();
在卡片上解碼檢測
添加 BoxDecodeType.YoloV8、分數閾值、NMS 閾值和輸出限制。傳回的 BBOX 張量以檢測計數開始,然後是固定大小的記錄,其中包含 (x, y, width, height, score, class_id)。該範例會解析並列印源圖像座標中的前十條記錄。
pcie_host/tutorials/024_run_your_first_model_over_pcie/run_image_boxdecode.cpp
pcie::ConnectionOptions connection;
connection.card_id = card_id;
pcie::ModelOptions options;
options.preprocess.kind = pcie::InputKind::Image;
options.preprocess.color_convert.input_format = pcie::ColorFormat::BGR;
options.preprocess.color_convert.output_format = pcie::ColorFormat::RGB;
options.preprocess.resize.enable = pcie::AutoFlag::On;
options.preprocess.resize.mode = pcie::ResizeMode::Letterbox;
options.preprocess.normalize.preset = pcie::NormalizePreset::COCO_YOLO;
options.decode_type = pcie::BoxDecodeType::YoloV8;
options.score_threshold = 0.25F;
options.nms_iou_threshold = 0.45F;
options.top_k = 100;
pcie::Model model(kModelPath, options, connection);
model.build(kBuildTimeoutMs);
const auto boxes = parse_boxes(model.run(image, kRunTimeoutMs));
std::cout << "Image + boxdecode detections=" << boxes.size() << '\n';
for (std::size_t index = 0; index < std::min<std::size_t>(boxes.size(), 10); ++index) {
const auto& box = boxes[index];
std::cout << " " << class_name(box.class_id) << " score=" << std::fixed
<< std::setprecision(3) << box.score << " box=(" << box.x << ", " << box.y << ", "
<< box.width << ", " << box.height << ")\n";
}
if (boxes.empty()) {
throw std::runtime_error("no detections passed the score threshold");
}
model.close();