当前位置: 首页 > news >正文

呼和浩特网站建设价格科技公司网页

呼和浩特网站建设价格,科技公司网页,博山专业网站优化哪家好,免费咨询广东律师事务所目录 前言一、YOLOv8-Cls推理(Python)1. YOLOv8-Cls预测2. YOLOv8-Cls预处理3. YOLOv8-Cls推理 二、YOLOv8-Cls推理(C)1. ONNX导出2. YOLOv8-Cls预处理3. YOLOv8-Cls推理 三、YOLOv8-Cls部署1. 源码下载2. 环境配置2.1 配置CMakeLists.txt2.2 配置Makefile 3. ONNX导出4. 源码修… 目录 前言一、YOLOv8-Cls推理(Python)1. YOLOv8-Cls预测2. YOLOv8-Cls预处理3. YOLOv8-Cls推理 二、YOLOv8-Cls推理(C)1. ONNX导出2. YOLOv8-Cls预处理3. YOLOv8-Cls推理 三、YOLOv8-Cls部署1. 源码下载2. 环境配置2.1 配置CMakeLists.txt2.2 配置Makefile 3. ONNX导出4. 源码修改 结语下载链接参考 前言 梳理下 YOLOv8-Cls 的预处理流程顺便让 tensorRT_Pro 支持 YOLOv8-Cls 参考https://github.com/shouxieai/tensorRT_Pro 实现https://github.com/Melody-Zhou/tensorRT_Pro-YOLOv8 一、YOLOv8-Cls推理(Python) 1. YOLOv8-Cls预测 我们先尝试利用官方预训练权重来推理一张图片看能否成功 在 YOLOv8 主目录下新建 predict-cls.py 预测文件其内容如下 import cv2 from ultralytics import YOLOif __name__ __main__:model YOLO(yolov8s-cls.pt)img cv2.imread(ultralytics/assets/bus.jpg)result model(img)[0]names result.namestop1_label result.probs.top1top5_label result.probs.top5top1_conf result.probs.top1conftop5_conf result.probs.top5conftop1_name names[top1_label]print(fThe model predicted category is {top1_name}, label {top1_label}, confidence {top1_conf:.4f})在上述代码中我们通过 opencv 读取了一张图像并送入模型中推理得到 resultsresults 中保存着不同任务的结果我们这里是分类任务因此只需要拿到对应 1000 个类别中最高置信度的类别标签即可。 模型推理的结果如下所示 2. YOLOv8-Cls预处理 模型预测成功后我们就需要自己动手来写下 YOLOv8-Cls 的预处理方便后续在 C 上的实现 经过我们的调试分析可知 YOLOv8-Cls 的预处理过程在 ultralytics/data/augment.py 文件中可以参考augment.py#L1059 class CenterCrop:YOLOv8 CenterCrop class for image preprocessing, designed to be part of a transformation pipeline, e.g.,T.Compose([CenterCrop(size), ToTensor()]).def __init__(self, size640):Converts an image from numpy array to PyTorch tensor.super().__init__()self.h, self.w (size, size) if isinstance(size, int) else sizedef __call__(self, im):Resizes and crops the center of the image using a letterbox method.Args:im (numpy.ndarray): The input image as a numpy array of shape HWC.Returns:(numpy.ndarray): The center-cropped and resized image as a numpy array.imh, imw im.shape[:2]m min(imh, imw) # min dimensiontop, left (imh - m) // 2, (imw - m) // 2return cv2.resize(im[top:top m, left:left m], (self.w, self.h), interpolationcv2.INTER_LINEAR)class ToTensor:YOLOv8 ToTensor class for image preprocessing, i.e., T.Compose([LetterBox(size), ToTensor()]).def __init__(self, halfFalse):Initialize YOLOv8 ToTensor object with optional half-precision support.super().__init__()self.half halfdef __call__(self, im):Transforms an image from a numpy array to a PyTorch tensor, applying optional half-precision and normalization.Args:im (numpy.ndarray): Input image as a numpy array with shape (H, W, C) in BGR order.Returns:(torch.Tensor): The transformed image as a PyTorch tensor in float32 or float16, normalized to [0, 1].im np.ascontiguousarray(im.transpose((2, 0, 1))[::-1]) # HWC to CHW - BGR to RGB - contiguousim torch.from_numpy(im) # to torchim im.half() if self.half else im.float() # uint8 to fp16/32im / 255.0 # 0-255 to 0.0-1.0return im它包含如下步骤 im[top:top m, left:left m]中心裁剪cv2.resize缩放到 224x224transpose(2, 0, 1)[::-1]HWC → CHWBGR → RGBtorch.from_numpyto Tensorim / 255.0除以 255.0归一化 因此我们不难写出对应的预处理代码如下所示 def preprocess(img, dst_width224, dst_height224):imh, imw img.shape[:2]m min(imh, imw)top, left (imh - m) // 2, (imw - m) // 2img_pre img[top:topm, left:leftm]img_pre cv2.resize(img_pre, (dst_width, dst_height), interpolationcv2.INTER_LINEAR)img_pre (img_pre[...,::-1] / 255.0).astype(np.float32)img_pre img_pre.transpose(2, 0, 1)[None]img_pre torch.from_numpy(img_pre)return img_pre经过中心裁剪并 resize 后的图片如下所示 3. YOLOv8-Cls推理 由于我们经过 softmax 后直接得到的是每个类别的概率值因此没有后处理一说YOLOv8-Cls 的推理包括图像预处理、模型推理其中预处理主要是 中心裁剪和缩放。 完整的推理代码如下 import cv2 import torch import numpy as np from ultralytics.nn.autobackend import AutoBackenddef preprocess(img, dst_width224, dst_height224):imh, imw img.shape[:2]m min(imh, imw)top, left (imh - m) // 2, (imw - m) // 2img_pre img[top:topm, left:leftm]img_pre cv2.resize(img_pre, (dst_width, dst_height), interpolationcv2.INTER_LINEAR)img_pre (img_pre[...,::-1] / 255.0).astype(np.float32)img_pre img_pre.transpose(2, 0, 1)[None]img_pre torch.from_numpy(img_pre)return img_preif __name__ __main__:img cv2.imread(ultralytics/assets/bus.jpg)img_pre preprocess(img)model AutoBackend(weightsyolov8s-cls.pt)names model.namesprobs model(img_pre)[0]top1_label int(probs.argmax())top5_label (-probs).argsort(0)[:5].tolist()top1_conf probs[top1_label]top5_conf probs[top5_label]top1name names[top1_label]print(fThe model predicted category is {top1name}, label {top1_label}, confidence {top1_conf:.4f})推理结果如下所示 至此我们在 Python 上面完成了 YOLOv8-Cls 的整个推理过程下面我们去 C 上实现。 二、YOLOv8-Cls推理(C) C 上的实现我们使用的 repo 依旧是 tensorRT_Pro现在我们就基于 tensorRT_Pro 完成 YOLOv8-Cls 在 C 上的推理。 1. ONNX导出 首先我们需要将 YOLOv8-Cls 模型导出为 ONNX为了适配 tensorRT_Pro 我们需要做一些修改主要有以下几点 修改输出节点名 output输入输出只让 batch 维度动态宽高不动态 具体修改如下 1. 在 ultralytics/engine/exporter.py 文件中改动一处 323 行输出节点名修改为 output326 行输入只让 batch 维度动态宽高不动态331 行输出只让 batch 维度动态宽高不动态 # exporter.py # ultralytics/engine/exporter.py第323行 # output_names [output0, output1] if isinstance(self.model, SegmentationModel) else [output0] # dynamic self.args.dynamic # if dynamic: # dynamic {images: {0: batch, 2: height, 3: width}} # shape(1,3,640,640) # if isinstance(self.model, SegmentationModel): # dynamic[output0] {0: batch, 2: anchors} # shape(1, 116, 8400) # dynamic[output1] {0: batch, 2: mask_height, 3: mask_width} # shape(1,32,160,160) # elif isinstance(self.model, DetectionModel): # dynamic[output0] {0: batch, 2: anchors} # shape(1, 84, 8400) # 修改为output_names [output0, output1] if isinstance(self.model, SegmentationModel) else [output] dynamic self.args.dynamic if dynamic:dynamic {images: {0: batch}} # shape(1,3,640,640)dynamic[output] {0: batch}if isinstance(self.model, SegmentationModel):dynamic[output0] {0: batch, 2: anchors} # shape(1, 116, 8400)dynamic[output1] {0: batch, 2: mask_height, 3: mask_width} # shape(1,32,160,160)elif isinstance(self.model, DetectionModel):dynamic[output] {0: batch} # shape(1, 84, 8400)以上就是为了适配 tensorRT_Pro 而做出的代码修改修改好以后将预训练权重 yolov8-cls.pt 放在 ultralytics-main 主目录下新建导出文件 export.py内容如下 from ultralytics import YOLOmodel YOLO(yolov8s-cls.pt)success model.export(formatonnx, dynamicTrue, simplifyTrue)在终端执行如下指令即可完成 onnx 导出 python export.py导出过程如下图所示 可以看到导出的 pytorch 模型的输入 shape 是 1x3x224x224输出 shape 是 1x1000符合我们的预期。 导出成功后会在当前目录下生成 yolov8s-cls.onnx 模型我们可以使用 Netron 可视化工具查看如下图所示 可以看到输入节点名是 images维度是 batchx3x224x224保证只有 batch 维度动态输出节点名是 output维度是 batchx1000保证只有 batch 维度动态符合 tensorRT_Pro 的格式。 2. YOLOv8-Cls预处理 之前有提到过 YOLOv8-Cls 的预处理部分主要是中心裁剪加缩放而在 tensorRT_Pro 中有提供 resize 的实现我们只需要添加中心裁剪即可。 因此我们不难写出 YOLOv8-Cls 的预处理代码如下所示 __global__ void crop_resize_bilinear_and_normalize_kernel(uint8_t* src, int src_line_size, int src_width, int src_height, float* dst, int dst_width, int dst_height,int crop_x, int crop_y, float sx, float sy, Norm norm, int edge ){int position blockDim.x * blockIdx.x threadIdx.x;if (position edge) return;int dx position % dst_width;int dy position / dst_width;float src_x (dx 0.5f) * sx - 0.5f crop_x;float src_y (dy 0.5f) * sy - 0.5f crop_y;float c0, c1, c2;int y_low floorf(src_y);int x_low floorf(src_x);int y_high limit(y_low 1, 0, src_height - 1);int x_high limit(x_low 1, 0, src_width - 1);y_low limit(y_low, 0, src_height - 1);x_low limit(x_low, 0, src_width - 1);int ly rint((src_y - y_low) * INTER_RESIZE_COEF_SCALE);int lx rint((src_x - x_low) * INTER_RESIZE_COEF_SCALE);int hy INTER_RESIZE_COEF_SCALE - ly;int hx INTER_RESIZE_COEF_SCALE - lx;int w1 hy * hx, w2 hy * lx, w3 ly * hx, w4 ly * lx;float* pdst dst dy * dst_width dx * 3;uint8_t* v1 src y_low * src_line_size x_low * 3;uint8_t* v2 src y_low * src_line_size x_high * 3;uint8_t* v3 src y_high * src_line_size x_low * 3;uint8_t* v4 src y_high * src_line_size x_high * 3;c0 resize_cast(w1 * v1[0] w2 * v2[0] w3 * v3[0] w4 * v4[0]);c1 resize_cast(w1 * v1[1] w2 * v2[1] w3 * v3[1] w4 * v4[1]);c2 resize_cast(w1 * v1[2] w2 * v2[2] w3 * v3[2] w4 * v4[2]);if(norm.channel_type ChannelType::Invert){float t c2;c2 c0; c0 t;}if(norm.type NormType::MeanStd){c0 (c0 * norm.alpha - norm.mean[0]) / norm.std[0];c1 (c1 * norm.alpha - norm.mean[1]) / norm.std[1];c2 (c2 * norm.alpha - norm.mean[2]) / norm.std[2];}else if(norm.type NormType::AlphaBeta){c0 c0 * norm.alpha norm.beta;c1 c1 * norm.alpha norm.beta;c2 c2 * norm.alpha norm.beta;}int area dst_width * dst_height;float* pdst_c0 dst dy * dst_width dx;float* pdst_c1 pdst_c0 area;float* pdst_c2 pdst_c1 area;*pdst_c0 c0;*pdst_c1 c1;*pdst_c2 c2; }相比于 resize 的实现就多了一个偏移主要是为了做中心裁剪具体代码可以参考preprocess_kernel.cu#L49 3. YOLOv8-Cls推理 通过上面对 YOLOv8-Cls 的预处理分析之后整个推理过程就显而易见了。C 上 YOLOv8-Cls 的预处理部分将 resize 简单修改即可。 我们在终端执行如下指令即可完成推理注意完整流程博主会在后续内容介绍这边只是简单演示 make yolo_cls编译图解如下所示 至此我们在 C 上面完成了 YOLOv8-Cls 的整个推理过程下面我们将完整的走一遍流程。 三、YOLOv8-Cls部署 博主新建了一个仓库 tensorRT_Pro-YOLOv8该仓库基于 shouxieai/tensorRT_Pro并进行了调整以支持 YOLOv8 的各项任务目前已支持分类、检测、分割、姿态点估计任务。 下面我们就来具体看看如何利用 tensorRT_Pro-YOLOv8 这个 repo 完成 YOLOv8-Cls 的推理。 1. 源码下载 tensorRT_Pro-YOLOv8 的代码可以直接从 GitHub 官网上下载源码下载地址是 https://github.com/Melody-Zhou/tensorRT_Pro-YOLOv8Linux 下代码克隆指令如下 git clone https://github.com/Melody-Zhou/tensorRT_Pro-YOLOv8.git也可手动点击下载点击右上角的 Code 按键将代码下载下来。至此整个项目就已经准备好了。也可以点击 here 下载博主准备好的源代码注意代码下载于 2023/11/7 日若有改动请参考最新 2. 环境配置 需要使用的软件环境有 TensorRT、CUDA、cuDNN、OpenCV、Protobuf所有软件环境的安装可以参考 Ubuntu20.04软件安装大全这里不再赘述需要各位看官自行配置好相关环境外网访问较慢这里提供下博主安装过程中的软件安装包下载链接 Baidu Drive【pwd:yolo】 tensorRT_Pro-YOLOv8 提供 CMakeLists.txt 和 Makefile 两种方式编译二者选一即可 2.1 配置CMakeLists.txt 主要修改五处 1. 修改第 13 行修改 OpenCV 路径 set(OpenCV_DIR /usr/local/include/opencv4/)2. 修改第 15 行修改 CUDA 路径 set(CUDA_TOOLKIT_ROOT_DIR /usr/local/cuda-11.6)3. 修改第 16 行修改 cuDNN 路径 set(CUDNN_DIR /usr/local/cudnn8.4.0.27-cuda11.6)4. 修改第 17 行修改 tensorRT 路径 set(TENSORRT_DIR /opt/TensorRT-8.4.1.5)5. 修改第 20 行修改 protobuf 路径 set(PROTOBUF_DIR /home/jarvis/protobuf)2.2 配置Makefile 主要修改五处 1. 修改第 4 行修改 protobuf 路径 lean_protobuf : /home/jarvis/protobuf2. 修改第 5 行修改 tensorRT 路径 lean_tensor_rt : /opt/TensorRT-8.4.1.53. 修改第 6 行修改 cuDNN 路径 lean_cudnn : /usr/local/cudnn8.4.0.27-cuda11.64. 修改第 7 行修改 OpenCV 路径 lean_opencv : /usr/local5. 修改第 8 行修改 CUDA 路径 lean_cuda : /usr/local/cuda-11.63. ONNX导出 导出细节可以查看之前的内容这边不再赘述。记得将导出的 ONNX 模型放在 tensorRT_Pro-YOLOv8/workspace 文件夹下。 4. 源码修改 如果你想推理自己训练的模型还需要修改下源代码YOLOv8-Cls 模型的推理代码主要在 app_yolo_cls.cpp 文件中我们就只需要修改这一个文件中的内容即可源码修改较简单主要有以下几点 1. app_yolo_cls.cpp 187行“yolov8s-cls” 修改为你导出的 ONNX 模型名2. app_yolo_cls.cpp 105行“imagenet.txt” 修改为你自训练分类模型的类别 txt 文件 具体修改示例如下 test(TRT::Model::FP32, best) // 修改1 187行yolov8s-cls改成bestauto labels iLogger::split_string(iLogger::load_text_file(custom.txt), \n); // 修改2 105行修改检测类别为自训练模型的类别名称OK源码修改好了Makefile 编译文件也搞定了ONNX 模型也准备好了现在可以编译运行了直接在终端执行如下指令即可 make yolo_cls编译过程如下所示 编译运行成功后在 workspace 文件夹下会生成 engine 文件 yolov8s-cls.FP32.trtmodel 用于模型推理同时在终端还可以看见模型预测的结果。 OK以上就是使用 tensorRT_Pro-YOLOv8 推理 YOLOv8-Cls 的大致流程若有问题欢迎各位看官批评指正。 结语 博主在这里针对 YOLOv8-Cls 的预处理和后处理做了简单分析同时与大家分享了 C 上的实现流程目的是帮大家理清思路更好的完成后续的部署工作。感谢各位看到最后创作不易读后有收获的看官请帮忙点个⭐️ 最后大家如果觉得 tensorRT_Pro-YOLOv8 这个 repo 对你有帮助的话不妨点个 ⭐️ 支持一波这对博主来说非常重要感谢各位。 下载链接 软件安装包下载链接【提取码:yolo】源代码、权重下载链接【提取码:yolo】 参考 https://github.com/shouxieai/inferhttps://github.com/ultralytics/ultralyticshttps://github.com/shouxieai/tensorRT_Prohttps://github.com/Melody-Zhou/tensorRT_Pro-YOLOv8YOLOv5推理详解及预处理高性能实现
http://www.huolong8.cn/news/292312/

相关文章:

  • 网站的建设步骤包括对网站开发实训的建议
  • 行业网站建设方案网站开发专业是干嘛的
  • 网站开发项目实训总结移动互联网开发软件设计
  • 软件开发 网站开发区别建设企业银行登录
  • 网站建设接单吧定制商城网站的费用
  • 新乡网站建设那家好高明网站设计服务
  • 做网站的调研报告昆明网络开发公司
  • 计算机专业论文网站开发关键词设定在网站上
  • 深圳做网站要多少安徽网站优化多少钱
  • 网站建设需要做些什么做便民工具网站
  • 禁止浏览器访问一个网站怎么做软文营销的本质
  • 网站建设 手机app网站服务器租一个月
  • 公司网站建设 阜阳百度推广关键词优化
  • 织梦 去掉我的网站wordpress 侧边栏菜单
  • 溧水区住房建设局网站北京朝阳区哪里有网站开发
  • 证券投资网站建设做网站的大骗子
  • 网站建设公司何去何从违章建设举报网站
  • 企业解决方案网站seo论坛站长交流
  • 佛山购物网站建设河北网站开发费用
  • 网站建设投放广告seoapp推广
  • 鞍山网站制作开发桂林漓江一号
  • 免费的网站后台管理系统wordpress插件访客
  • 杭州网站建站模板高级网站开发工程师考试题
  • 青岛提供网站建设哪家便宜淘宝官方网站登录页面
  • 广州骏域网站建设专家手机电脑版物流网站
  • 职高网站建设知识点网站设计开发中的具体步骤
  • 苏州专业建站艺术设计类网站
  • 重庆点优建设网站公司网站建设的基本特点
  • 网站ie不兼容做外贸生意在哪个网站
  • 做网站设计的公司名字校园网站开发需求文字