免费的站外推广,wordpress上传文件功能,国外有没有网站是做潘多拉的,鄂州第一官方网站目录
一、关键点预测
二、图像预处理
二、推理
三、后处理与可视化
3.1、后处理
3.2、特征点可视化
四、完整pytorch代码 yolov8-pose tensorrt 一、关键点预测
注#xff1a;本篇只是阐述推理流程#xff0c;tensorrt实现后续跟进。
yolov8-pose的tensorrt部署代码…目录
一、关键点预测
二、图像预处理
二、推理
三、后处理与可视化
3.1、后处理
3.2、特征点可视化
四、完整pytorch代码 yolov8-pose tensorrt 一、关键点预测
注本篇只是阐述推理流程tensorrt实现后续跟进。
yolov8-pose的tensorrt部署代码稍后更新还是在仓库GitHub - FeiYull/TensorRT-Alpha: TensorRT-Alpha supports YOLOv8、YOLOv7、YOLOv6、YOLOv5、YOLOv4、v3、YOLOX、YOLOR...CUDA IS ALL YOU NEED.It also supports end2end CUDA C acceleration and multi-batch inference.
也可以关注TensorRT系列教程-CSDN博客
以下是官方预测代码
from ultralytics import YOLO
model YOLO(modelyolov8n-pose.pt)
model.predict(sourced:/Data/1.jpg, saveTrue)
推理过程无非是图像预处理 - 推理 - 后处理 可视化这三个关键步骤在文件大概247行D:\CodePython\ultralytics\ultralytics\engine\predictor.py代码如下
# Preprocess
with profilers[0]:im self.preprocess(im0s) # 图像预处理# Inference
with profilers[1]:preds self.inference(im, *args, **kwargs) # 推理# Postprocess
with profilers[2]:self.results self.postprocess(preds, im, im0s) # 后处理
二、图像预处理
通过debug进入上述self.preprocess函数看到代码实现如下。处理流程大概是padding满足矩形推理图像通道转换即BGR装RGB检查图像数据是否连续存储顺序有HWC转为CHW然后归一化。需要注意原始pytorch框架图像预处理的时候会将图像缩放padding为HxW的图像其中H、W为32倍数而导出tensorrt的时候为了高效推理H、W 固定为640x640。
def preprocess(self, im):Prepares input image before inference.Args:im (torch.Tensor | List(np.ndarray)): BCHW for tensor, [(HWC) x B] for list.not_tensor not isinstance(im, torch.Tensor)if not_tensor:im np.stack(self.pre_transform(im))im im[..., ::-1].transpose((0, 3, 1, 2)) # BGR to RGB, BHWC to BCHW, (n, 3, h, w)im np.ascontiguousarray(im) # contiguousim torch.from_numpy(im)img im.to(self.device)img img.half() if self.model.fp16 else img.float() # uint8 to fp16/32if not_tensor:img / 255 # 0 - 255 to 0.0 - 1.0return img
二、推理
图像预处理之后直接推理就行了这里是基于pytorch推理。
def inference(self, im, *args, **kwargs):visualize increment_path(self.save_dir / Path(self.batch[0][0]).stem,mkdirTrue) if self.args.visualize and (not self.source_type.tensor) else Falsereturn self.model(im, augmentself.args.augment, visualizevisualize)
三、后处理与可视化
3.1、后处理
网络推理输出特征图维度为56x8400其中
8400表示候选目标数量56 xywhc points * 17points的长度为3分别为xyc即特征点的坐标和置信度
尽管推理输出特征图中每一行既有bbox还有keypoints但是NMS的时候依然只作用于bbox下面代码作了NMS之后将筛选之后的目标中bbox、keypoints进行坐标值缩放缩放到原图尺寸坐标系。
def postprocess(self, preds, img, orig_imgs):Return detection results for a given input image or list of images.preds ops.non_max_suppression(preds,self.args.conf,self.args.iou,agnosticself.args.agnostic_nms,max_detself.args.max_det,classesself.args.classes,nclen(self.model.names))results []for i, pred in enumerate(preds):orig_img orig_imgs[i] if isinstance(orig_imgs, list) else orig_imgsshape orig_img.shapepred[:, :4] ops.scale_boxes(img.shape[2:], pred[:, :4], shape).round()pred_kpts pred[:, 6:].view(len(pred), *self.model.kpt_shape) if len(pred) else pred[:, 6:]pred_kpts ops.scale_coords(img.shape[2:], pred_kpts, shape)path self.batch[0]img_path path[i] if isinstance(path, list) else pathresults.append(Results(orig_imgorig_img,pathimg_path,namesself.model.names,boxespred[:, :6],keypointspred_kpts))return results
3.2、特征点可视化
bbox可视化没什么好说的说下17个特征点的可视化在文件D:\CodePython\ultralytics_fire_smoke\ultralytics\utils\plotting.py171行绘制特征点需要注意需要按照预定义的顺序绘制其中特征点置信度需要足够大。
def kpts(self, kpts, shape(640, 640), radius5, kpt_lineTrue):Plot keypoints on the image.Args:kpts (tensor): Predicted keypoints with shape [17, 3]. Each keypoint has (x, y, confidence).shape (tuple): Image shape as a tuple (h, w), where h is the height and w is the width.radius (int, optional): Radius of the drawn keypoints. Default is 5.kpt_line (bool, optional): If True, the function will draw lines connecting keypointsfor human pose. Default is True.Note: kpt_lineTrue currently only supports human pose plotting.if self.pil:# Convert to numpy firstself.im np.asarray(self.im).copy()nkpt, ndim kpts.shapeis_pose nkpt 17 and ndim 3kpt_line is_pose # kpt_lineTrue for now only supports human pose plotting# 绘制特征点for i, k in enumerate(kpts):color_k [int(x) for x in self.kpt_color[i]] if is_pose else colors(i)x_coord, y_coord k[0], k[1]if x_coord % shape[1] ! 0 and y_coord % shape[0] ! 0:if len(k) 3:conf k[2]if conf 0.5:continuecv2.circle(self.im, (int(x_coord), int(y_coord)), radius, color_k, -1, lineTypecv2.LINE_AA)# 绘制线段if kpt_line:ndim kpts.shape[-1]for i, sk in enumerate(self.skeleton):pos1 (int(kpts[(sk[0] - 1), 0]), int(kpts[(sk[0] - 1), 1]))pos2 (int(kpts[(sk[1] - 1), 0]), int(kpts[(sk[1] - 1), 1]))if ndim 3:conf1 kpts[(sk[0] - 1), 2]conf2 kpts[(sk[1] - 1), 2]if conf1 0.5 or conf2 0.5:continueif pos1[0] % shape[1] 0 or pos1[1] % shape[0] 0 or pos1[0] 0 or pos1[1] 0:continueif pos2[0] % shape[1] 0 or pos2[1] % shape[0] 0 or pos2[0] 0 or pos2[1] 0:continuecv2.line(self.im, pos1, pos2, [int(x) for x in self.limb_color[i]], thickness2, lineTypecv2.LINE_AA)if self.pil:# Convert im back to PIL and update drawself.fromarray(self.im)
这里给一张特征点顺序图 四、完整pytorch代码
将以上流程合并起来并加以修改完整代码如下
import torch
import cv2 as cv
import numpy as np
from ultralytics.data.augment import LetterBox
from ultralytics.utils import ops
from ultralytics.engine.results import Results
import copy# path d:/Data/1.jpg
path d:/Data/6406402.jpg
device cuda:0
conf 0.25
iou 0.7# preprocess
im cv.imread(path)
# letterbox
im [im]
orig_imgs copy.deepcopy(im)
im [LetterBox([640, 640], autoTrue, stride32)(imagex) for x in im]
im im[0][None] # im np.stack(im)
im im[..., ::-1].transpose((0, 3, 1, 2)) # BGR to RGB, BHWC to BCHW, (n, 3, h, w)
im np.ascontiguousarray(im) # contiguous
im torch.from_numpy(im)
img im.to(device)
img img.float()
img / 255
# load model pt
ckpt torch.load(yolov8n-pose.pt, map_locationcpu)
model ckpt[model].to(device).float() # FP32 model
model.eval()# inference
preds model(img)
prediction ops.non_max_suppression(preds, conf, iou, agnosticFalse, max_det300, classesNone, nclen(model.names))results []
for i, pred in enumerate(prediction):orig_img orig_imgs[i] if isinstance(orig_imgs, list) else orig_imgsshape orig_img.shapepred[:, :4] ops.scale_boxes(img.shape[2:], pred[:, :4], shape).round()pred_kpts pred[:, 6:].view(len(pred), *model.kpt_shape) if len(pred) else pred[:, 6:]pred_kpts ops.scale_coords(img.shape[2:], pred_kpts, shape)img_path pathresults.append(Results(orig_imgorig_img,pathimg_path,namesmodel.names,boxespred[:, :6],keypointspred_kpts))# show
plot_args {line_width: None,boxes: True,conf: True, labels: True}
plot_args[im_gpu] img[0]
result results[0]
plotted_img result.plot(**plot_args)
cv.imshow(plotted_img, plotted_img)
cv.waitKey(0)
cv.destroyAllWindows()
print()
文章转载自: http://www.morning.dpdr.cn.gov.cn.dpdr.cn http://www.morning.tqrjj.cn.gov.cn.tqrjj.cn http://www.morning.wjlnz.cn.gov.cn.wjlnz.cn http://www.morning.zbhfs.cn.gov.cn.zbhfs.cn http://www.morning.rqkck.cn.gov.cn.rqkck.cn http://www.morning.wjmb.cn.gov.cn.wjmb.cn http://www.morning.mdrnn.cn.gov.cn.mdrnn.cn http://www.morning.pmysp.cn.gov.cn.pmysp.cn http://www.morning.oioini.com.gov.cn.oioini.com http://www.morning.clbgy.cn.gov.cn.clbgy.cn http://www.morning.qwbls.cn.gov.cn.qwbls.cn http://www.morning.lwcqh.cn.gov.cn.lwcqh.cn http://www.morning.dtpqw.cn.gov.cn.dtpqw.cn http://www.morning.wnjbn.cn.gov.cn.wnjbn.cn http://www.morning.csnmd.cn.gov.cn.csnmd.cn http://www.morning.zgztn.cn.gov.cn.zgztn.cn http://www.morning.gqcsd.cn.gov.cn.gqcsd.cn http://www.morning.nnqrb.cn.gov.cn.nnqrb.cn http://www.morning.xwlmg.cn.gov.cn.xwlmg.cn http://www.morning.lrwsk.cn.gov.cn.lrwsk.cn http://www.morning.lfmwt.cn.gov.cn.lfmwt.cn http://www.morning.rgksz.cn.gov.cn.rgksz.cn http://www.morning.jjxxm.cn.gov.cn.jjxxm.cn http://www.morning.ykgp.cn.gov.cn.ykgp.cn http://www.morning.dxpzt.cn.gov.cn.dxpzt.cn http://www.morning.wrlxt.cn.gov.cn.wrlxt.cn http://www.morning.mflhr.cn.gov.cn.mflhr.cn http://www.morning.krkwp.cn.gov.cn.krkwp.cn http://www.morning.zpfr.cn.gov.cn.zpfr.cn http://www.morning.qdrhf.cn.gov.cn.qdrhf.cn http://www.morning.mbprq.cn.gov.cn.mbprq.cn http://www.morning.dlrsjc.com.gov.cn.dlrsjc.com http://www.morning.llcgz.cn.gov.cn.llcgz.cn http://www.morning.rwdbz.cn.gov.cn.rwdbz.cn http://www.morning.lynmt.cn.gov.cn.lynmt.cn http://www.morning.dmcqy.cn.gov.cn.dmcqy.cn http://www.morning.hkcjx.cn.gov.cn.hkcjx.cn http://www.morning.rdnpg.cn.gov.cn.rdnpg.cn http://www.morning.nzsdr.cn.gov.cn.nzsdr.cn http://www.morning.cpzkq.cn.gov.cn.cpzkq.cn http://www.morning.mnygn.cn.gov.cn.mnygn.cn http://www.morning.ftcrt.cn.gov.cn.ftcrt.cn http://www.morning.xzqzd.cn.gov.cn.xzqzd.cn http://www.morning.qxkcx.cn.gov.cn.qxkcx.cn http://www.morning.qzglh.cn.gov.cn.qzglh.cn http://www.morning.yrgb.cn.gov.cn.yrgb.cn http://www.morning.ryyjw.cn.gov.cn.ryyjw.cn http://www.morning.gxtfk.cn.gov.cn.gxtfk.cn http://www.morning.gxtfk.cn.gov.cn.gxtfk.cn http://www.morning.wnjwb.cn.gov.cn.wnjwb.cn http://www.morning.tfwr.cn.gov.cn.tfwr.cn http://www.morning.tlbhq.cn.gov.cn.tlbhq.cn http://www.morning.xcyhy.cn.gov.cn.xcyhy.cn http://www.morning.hlfnh.cn.gov.cn.hlfnh.cn http://www.morning.lxngn.cn.gov.cn.lxngn.cn http://www.morning.ydhmt.cn.gov.cn.ydhmt.cn http://www.morning.dansj.com.gov.cn.dansj.com http://www.morning.ndrzq.cn.gov.cn.ndrzq.cn http://www.morning.wwsgl.com.gov.cn.wwsgl.com http://www.morning.mwcqz.cn.gov.cn.mwcqz.cn http://www.morning.qbmpb.cn.gov.cn.qbmpb.cn http://www.morning.nktxr.cn.gov.cn.nktxr.cn http://www.morning.ygkb.cn.gov.cn.ygkb.cn http://www.morning.wkws.cn.gov.cn.wkws.cn http://www.morning.rkjz.cn.gov.cn.rkjz.cn http://www.morning.rqhn.cn.gov.cn.rqhn.cn http://www.morning.jyknk.cn.gov.cn.jyknk.cn http://www.morning.jzyfy.cn.gov.cn.jzyfy.cn http://www.morning.kkjlz.cn.gov.cn.kkjlz.cn http://www.morning.rdkqt.cn.gov.cn.rdkqt.cn http://www.morning.bygyd.cn.gov.cn.bygyd.cn http://www.morning.kcfnp.cn.gov.cn.kcfnp.cn http://www.morning.nqrlz.cn.gov.cn.nqrlz.cn http://www.morning.kzcz.cn.gov.cn.kzcz.cn http://www.morning.rlpmy.cn.gov.cn.rlpmy.cn http://www.morning.pjtnk.cn.gov.cn.pjtnk.cn http://www.morning.jfmyt.cn.gov.cn.jfmyt.cn http://www.morning.mngh.cn.gov.cn.mngh.cn http://www.morning.cwknc.cn.gov.cn.cwknc.cn http://www.morning.dpbgw.cn.gov.cn.dpbgw.cn