5.18.12.1. sail.algo_yolov8_seg_post_tpu_opt
针对yolov8_seg模型,使用TPU对后处理进行了加速。
5.18.12.1.1. __init__
- 接口形式:
def __init__( self, bmodel_file: str, dev_id: int, detection_shape: list[int], segmentation_shape: list[int], network_h: int, network_w: int)
参数说明:
bmodel_file: str
输入参数。TPU后处理所使用的getmask bmodel的路径。
dev_id: int
输入参数。智能视觉深度学习处理器的id号。
detection_shape: list[int]
输入参数。yolov8_seg分割模型检测头的输出shape。
segmentation_shape: list[int]
输入参数。yolov8_seg分割模型分割头的输出shape,即Prototype Mask的shape。
network_h: int
输入参数。yolov8_seg分割模型的输入高度。
network_w: int
输入参数。yolov8_seg分割模型的输入宽度。
5.18.12.1.2. process
处理接口。
- 接口形式1:
def process(self, detection_input: TensorPTRWithName, segmentation_input: TensorPTRWithName, ost_h: int, ost_w: int, dete_threshold: float, nms_threshold: float, input_keep_aspect_ratio: bool, input_use_multiclass_nms: bool) -> list[tuple[left, top, right, bottom, score, class_id, contour, mask]]
参数说明1:
detection_input: TensorPTRWithName
输入参数。yolov8_seg分割模型检测头的输出数据。
segmentation_input: TensorPTRWithName
输入参数。yolov8_seg分割模型分割头的输出数据,即Prototype Mask。
ost_h: int
输入参数。原始图片的高度。
ost_w: int
输入参数。原始图片的宽度。
dete_threshold: float
输入参数。检测阈值。
nms_threshold: float
输入参数。nms阈值。
input_keep_aspect_ratio: bool
输入参数。输入图片是否保持纵横比。
input_use_multiclass_nms: bool
输入参数。是否使用多类nms。
- 接口形式2:
def process(self, detection_input: dict[str, Tensor], segmentation_input: dict[str, Tensor], ost_h: int, ost_w: int, dete_threshold: float, nms_threshold: float, input_keep_aspect_ratio: bool, input_use_multiclass_nms: bool) -> list[tuple[left, top, right, bottom, score, class_id, contour, mask]]
参数说明2:
detection_input: dict[str, Tensor]
输入参数。yolov8_seg分割模型检测头的输出数据。
segmentation_input: dict[str, Tensor]
输入参数。yolov8_seg分割模型分割头的输出数据,即Prototype Mask。
ost_h: int
输入参数。原始图片的高度。
ost_w: int
输入参数。原始图片的宽度。
dete_threshold: float
输入参数。检测阈值。
nms_threshold: float
输入参数。nms阈值。
input_keep_aspect_ratio: bool
输入参数。输入图片是否保持纵横比。
input_use_multiclass_nms: bool
输入参数。是否使用多类nms。
返回值说明:
list[tuple[left, top, right, bottom, score, class_id, contour, mask]]
left: int
检测框的最左x坐标。
top: int
检测框的最上y坐标。
right: int
检测框的最右x坐标。
bottom: int
检测框的最下y坐标。
class_id: int
检测框内物体的类别编号。
score: float
检测框内物体的分数。
contour: list[float]
检测框内物体的轮廓。
mask: numpy.ndarray
检测框内物体的分割掩码。
- 示例代码:
import sophon.sail as sail import numpy as np if __name__ == '__main__': tpu_id = 0 handle = sail.Handle(tpu_id) image_name = "../../..//sophon-demo/sample/YOLOv8_seg/datasets/test/dog.jpg" yolov8_seg_bmodel_name = "../../..//sophon-demo/sample/YOLOv8_seg/models/BM1688/yolov8s_int8_1b.bmodel" get_mask_bmodel_name = "../../..//sophon-demo/sample/YOLOv8_seg/yolov8s_getmask_32_fp32.bmodel" decoder = sail.Decoder(image_name, True, tpu_id) bmimg = decoder.read(handle) engine_image_pre_process = sail.EngineImagePreProcess(yolov8_seg_bmodel_name, tpu_id, 0) engine_image_pre_process.InitImagePreProcess(sail.sail_resize_type.BM_PADDING_TPU_LINEAR, True, 10, 10) engine_image_pre_process.SetPaddingAtrr(114, 114, 114, 1) alpha_beta = (1.0/255, 0), (1.0/255, 0), (1.0/255, 0) engine_image_pre_process.SetConvertAtrr(alpha_beta) ret = engine_image_pre_process.PushImage(0, 0, bmimg) output_tensor_map, ost_images, channels ,imageidxs, padding_atrr = engine_image_pre_process.GetBatchData(True) width_list = [] height_list= [] for index, channel in enumerate(channels): width_list.append(ost_images[index].width()) height_list.append(ost_images[index].height()) yolov8_tpu_post = sail.algo_yolov8_seg_post_tpu_opt(get_mask_bmodel_name, tpu_id, [1, 116, 8400], [1, 32, 160, 160], 640, 640) dete_threshold = 0.25 nms_threshold = 0.7 results = yolov8_tpu_post.process(output_tensor_map[0], output_tensor_map[1], height_list[0], width_list[0], dete_threshold, nms_threshold, True, False) print(results)