高要区住房和城乡建设局网站,网站建设外包兼职,医生在线咨询,欢迎访问建设银行网站目录 一、前言#xff1a;
二、关于环境安装#xff1a;
三、首先记录下自己的几个问题 问题#xff1a;c部署和python部署的区别#xff1f;
四、正文开始 4.1 图像预处理讲解 1、BGR----RBG 2、等比例放缩图片#xff08;涉及到短边的填充#xff09; 3、归一化…目录 一、前言
二、关于环境安装
三、首先记录下自己的几个问题 问题c部署和python部署的区别
四、正文开始 4.1 图像预处理讲解 1、BGR----RBG 2、等比例放缩图片涉及到短边的填充 3、归一化 4、HWC----NCHW 5、将图像转为一维向量格式并将整理为连续内存 4.2图像内存开辟与传递 一、前言 之前实现了基于win环境中的python的加速部署过程现在将c实现过程进行记录这次记录会非常详细。总的来说只要整个过程的思路捋清楚保证思路是正确的做起工作来就比较有方向性开始记录。 二、关于环境安装 环境wsl2Ubuntu2004cuda113cudnn8.9.5.30tensrort8.6.1.6opencv4.2.0 主要要安装的是cuda和cudnn和tensorrt。确定好版本我本地cuda是11.7cuda可以向下兼容所以我wsl中使用11.3也是支持的。参考博客【教程】Install NVIDIA TensorRT on WSL 在WSL上安装英伟达TensorRT_wsl tensorrt-CSDN博客win11 WSL ubuntu安装CUDA、CUDNN、TensorRT最有效的方式-CSDN博客这两个博客互补一下。 tips1、安装位置最好新建一个文件夹放在一起在设定环境变量的时候会方便些。 2、opencv4版本会和libtorch1.10冲突如果没有装libtorch之前opencv是好的装了libtorch发现这两个库都用不了大概率是版本冲突了一踩坑心态崩了一天时间sad但是不用libtorch也完全不影响推理。 三、首先记录下自己的几个问题 问题c部署和python部署的区别 我最开始个人理解可能c会更多设计自己手动开辟回收内存在我实现c部署之后会过头看python实现过程发现python也是手动开辟回收内存的所以他们最重要的区别到底在哪里呢 回答最重要的东西确实还是内存管理上然后自然而然的会影响性能还有系统集成中。 在内存管理方面 1、C版本需要显式地管理所有资源的生命周期包括内存分配和释放。 2、Python版本虽然也进行了一些手动内存管理但仍然依赖于Python的垃圾回收机制来处理大部分对象的清理。 3、C版本提供了更细粒度的控制可以精确地控制何时分配和释放资源。 4、Python版本在语法上更简洁并且某些资源管理被抽象化使得代码更容易编写和维护。 性能方面我理解在一些计算开销没有非常限制的情况下或者执行次数不多的情况下两者区别不会拉太卡但是涉及到性能的极致使用的情况下肯定是c性能要高出python。 1、C通常能提供更高的性能尤其是在低延迟场景中。直接编译为机器码没有解释器开销。 2、Python有解释器开销但在许多情况下性能差异可能不明显特别是当大部分计算都在GPU上进行时。 生态集成方面 python更加依赖于python开发环境而c可以编译为动态库限制更少一些。总的来说在工业应用中肯定吃c更加方便些。 四、正文开始 前处理主要分为两部分第一部分是对image的格式的转换即cv::imread读取上来的单张图片要转为符合深度学习torch中dataload中读取上来的nchw格式的数据。第二部分就是将这样格式的数据从cpu传输到GPU中。第二部分相对操作固定一些。 Opencv读取图片格式转换为深度学习图片输入格式 一般有两方面需要转换第一方面是格式第二方面是尺寸。一般来说应该是先进行格式转换然后在进行尺寸变化因为尺寸变化要是涉及到放缩的话uint8的数据空间可能会一点可能会有一些精度的损失。 使用opencv中cv::imread读取上来的image一般保存在cv::Mat中OpenCV 中的 cv::Mat 格式如下 数据类型cv::Mat 默认使用 8 位无符号整数CV_8U存储图像数据。 通道顺序cv::Mat 默认使用 BGR 顺序存储图像通道。 形状cv::Mat 通常具有二维或三维矩阵结构对应于 (height, width, channels)。 而深度学习一般需要的输入数据格式如下 数据类型深度学习模型通常使用 32 位浮点数float32存储图像数据。 通道顺序深度学习模型通常使用 RGB 顺序存储图像通道。 形状深度学习模型的输入形状通常为 (batch_size, channels, height, width)即 NCHW 格式。 以上是格式方面的区别往往还有尺寸方面的区别。yolov5一般要求输入尺寸大小为640*640大小。我们还需要将图片进行缩放。注意是等比例缩放。 前处理流程和代码 4.1 图像预处理讲解 首先创建处理图像的函数
cv::Mat preImage(cv::Mat rawBGRImage,int inputH, int inputW) 我们创建一个preImage的函数返回类型是cv::Mat类型参数输入是一个cv::Mat类型的rawBGRImage的引用同时输入两个整数代表深度学习输入的大小这里为640*640。 第一步 1、BGR----RBG
// BGR -- RGBcv::cvtColor(oriImage,image,cv::COLOR_BGR2RGB); 2、等比例放缩图片涉及到短边的填充
首先获得原始图像的h和w假设1280*1920int ori_h oriImage.rows;int ori_w oriImage.cols;std::cout原始图片的size是oriImage.sizestd::endl;
两边不一样长的图片要保证长边缩小到640短边进行填充操作。// 取最小的因子以保证长的一边被正确缩放短边过度缩放可在后面使用padding填充// 这两个结果肯定小于1使用整除会将结果截断为0double r std::min(static_castdouble(inputH) / ori_h, static_castdouble(inputW) / ori_w); std::cout缩放因子 r 是 r std::endl;int new_h std::round(ori_h * r);//四舍五入int new_w std::round(ori_w * r);std::cout新图片的size是new_h ,new_wstd::endl;
计算填充大小640减去新图像的边长//计算padding的大小,int dh inputH - new_h;int dw inputW - new_w;std::cout需要填充的size是dh ,dwstd::endl;// 使用双线性插值将图像进行等比例缩放cv::resize(image,image,cv::Size(new_h,new_w),0, 0, cv::INTER_LINEAR);
此时得到了一幅427640的图像需要对h边进行填充 //判断是否需要填充 if(dh 0 || dw 0){cv::resize(image,image,cv::Size(new_h,new_w),0, 0, cv::INTER_LINEAR);
计算填充的像素// Pad the short side with (128,128,128)int top dh / 2;int bottom dh - top;int left dw / 2;int right dw - left;std::cout方框是top ,bottom,left,rightstd::endl;
进行填充其中topbottomleftright等代表填充到图像上下左右的像素行数//扩充边界cv::copyMakeBorder(image, image, left, right, top, bottom, cv::BORDER_CONSTANT, cv::Scalar(128, 128, 128));std::cout扩充边界之后的图片的size是image.sizestd::endl;}
得到一幅填充到640*640大小的图像 3、归一化
image.convertTo(image, CV_32F); //自动转如果原图是32f只拷贝不做转换。image / 255.0; // 8u转32f之后原始像素值还是不变的只是可表示范围变大了。 4、HWC----NCHW
// HWC to CHW format:并处理成cv中的dnn多维格式数据类似于tensorcv::Mat imageCHW;cv::dnn::blobFromImage(image, imageCHW, 1.0, cv::Size(), cv::Scalar(), false, false);//这种缩放会影响图像精度//该函数默认bs维度1。cv::dnn::blobFromImages函数可以自由设定bs维度的值std::cout NCHW shape: imageCHW.size std::endl; 函数介绍 cv::dnn::blobFromImage 函数是 OpenCV 中的一个实用工具用于将图像转换为深度学习模型所需的多维格式通常是 NCHW即 batch size、channels、height、width。这是深度学习中常用的数据格式。
cv::Mat blobFromImage(const cv::Mat image, //输入图像double scalefactor 1.0, //缩放因子用于缩放图像的每个像素值。默认值是 1.0const cv::Size size cv::Size(),//目标图像的大小。cv::Size(width, height) 格式。如果为 Size()则保持原始图像大小。const cv::Scalar mean cv::Scalar(),//用于减去的均值向量cv::Scalar(mean_r, mean_g, mean_b) 格式。用于均值归一化。bool swapRB false,//是否交换R和B通道bool crop false,//是否在缩放后裁剪图像。如果设置为 true则图像会被裁剪以适应目标大小int ddepth CV_32F//默认32位
); 5、将图像转为一维向量格式并将整理为连续内存 //此处还待确认是否一定需要转为一维向量。实际测试下来发现转或不转都可以识别。 cv::Mat imageNCHW imageCHW.reshape(1, 1);std::cout zuihou d NCHW shape: imageNCHW.size std::endl;// Convert the image to row-major order, also known as C order:// 复制矩阵 转换位行主序C order存储。意味着数据在内存中是按行连续存储的// 某些深度学习框架或推理引擎可能要求输入数据是连续存储的cv::Mat imageRowMajor;imageNCHW.copyTo(imageRowMajor); 4.2图像内存开辟与传递 首先设定图像大小并计算数据缓存区然后将数据从cpu复制到gpu。
// 图像前处理函数实现
void YoLov5TRT::preprocessImage(const cv::Mat image, float* gpu_input) {cv::Mat Image image;// preImage函数中对图片进行详细前处理cv::Mat risezed_image preImage(Image, H, W);size_t image_size risezed_image.total() * risezed_image.channels(); // 计算输入大小用来分配缓存区std::vectorfloat input_data(image_size); // 分配输入数据缓冲区// 5. 使用 memcpy 复制数据std::memcpy(input_data.data(), risezed_image.data, image_size * sizeof(float));// 6. 异步复制数据到 GPUcudaMemcpyAsync(gpu_input, input_data.data(), image_size * sizeof(float), cudaMemcpyHostToDevice, stream_);
}
文章转载自: http://www.morning.wqbhx.cn.gov.cn.wqbhx.cn http://www.morning.wcyr.cn.gov.cn.wcyr.cn http://www.morning.jcrfm.cn.gov.cn.jcrfm.cn http://www.morning.nwmwp.cn.gov.cn.nwmwp.cn http://www.morning.msgnx.cn.gov.cn.msgnx.cn http://www.morning.gtbjf.cn.gov.cn.gtbjf.cn http://www.morning.tfrmx.cn.gov.cn.tfrmx.cn http://www.morning.gwsfq.cn.gov.cn.gwsfq.cn http://www.morning.qbjrf.cn.gov.cn.qbjrf.cn http://www.morning.hbjqn.cn.gov.cn.hbjqn.cn http://www.morning.mpscg.cn.gov.cn.mpscg.cn http://www.morning.qrzwj.cn.gov.cn.qrzwj.cn http://www.morning.wbqt.cn.gov.cn.wbqt.cn http://www.morning.pzjfz.cn.gov.cn.pzjfz.cn http://www.morning.qbdsx.cn.gov.cn.qbdsx.cn http://www.morning.ljdtn.cn.gov.cn.ljdtn.cn http://www.morning.hwcln.cn.gov.cn.hwcln.cn http://www.morning.rmyqj.cn.gov.cn.rmyqj.cn http://www.morning.lrdzb.cn.gov.cn.lrdzb.cn http://www.morning.pxtgf.cn.gov.cn.pxtgf.cn http://www.morning.snbrs.cn.gov.cn.snbrs.cn http://www.morning.fbhmn.cn.gov.cn.fbhmn.cn http://www.morning.stpkz.cn.gov.cn.stpkz.cn http://www.morning.lhsdf.cn.gov.cn.lhsdf.cn http://www.morning.lnwdh.cn.gov.cn.lnwdh.cn http://www.morning.ttvtv.cn.gov.cn.ttvtv.cn http://www.morning.qgjxy.cn.gov.cn.qgjxy.cn http://www.morning.wmdlp.cn.gov.cn.wmdlp.cn http://www.morning.yrmpr.cn.gov.cn.yrmpr.cn http://www.morning.ldnrf.cn.gov.cn.ldnrf.cn http://www.morning.twdkt.cn.gov.cn.twdkt.cn http://www.morning.gthgf.cn.gov.cn.gthgf.cn http://www.morning.nfbxgtj.com.gov.cn.nfbxgtj.com http://www.morning.zmwd.cn.gov.cn.zmwd.cn http://www.morning.jjhng.cn.gov.cn.jjhng.cn http://www.morning.bkqdg.cn.gov.cn.bkqdg.cn http://www.morning.qpqcq.cn.gov.cn.qpqcq.cn http://www.morning.gqwbl.cn.gov.cn.gqwbl.cn http://www.morning.kjyqr.cn.gov.cn.kjyqr.cn http://www.morning.wyppp.cn.gov.cn.wyppp.cn http://www.morning.cylbs.cn.gov.cn.cylbs.cn http://www.morning.znlhc.cn.gov.cn.znlhc.cn http://www.morning.plznfnh.cn.gov.cn.plznfnh.cn http://www.morning.nzsx.cn.gov.cn.nzsx.cn http://www.morning.fhrgk.cn.gov.cn.fhrgk.cn http://www.morning.zhghd.cn.gov.cn.zhghd.cn http://www.morning.pyzt.cn.gov.cn.pyzt.cn http://www.morning.fkmqg.cn.gov.cn.fkmqg.cn http://www.morning.syfty.cn.gov.cn.syfty.cn http://www.morning.wcqkp.cn.gov.cn.wcqkp.cn http://www.morning.tnhqr.cn.gov.cn.tnhqr.cn http://www.morning.lpskm.cn.gov.cn.lpskm.cn http://www.morning.mllmm.cn.gov.cn.mllmm.cn http://www.morning.jrsgs.cn.gov.cn.jrsgs.cn http://www.morning.tslwz.cn.gov.cn.tslwz.cn http://www.morning.qflwp.cn.gov.cn.qflwp.cn http://www.morning.muniubangcaishui.cn.gov.cn.muniubangcaishui.cn http://www.morning.wfkbk.cn.gov.cn.wfkbk.cn http://www.morning.wmfny.cn.gov.cn.wmfny.cn http://www.morning.schwr.cn.gov.cn.schwr.cn http://www.morning.qkdcb.cn.gov.cn.qkdcb.cn http://www.morning.yktwr.cn.gov.cn.yktwr.cn http://www.morning.drfrm.cn.gov.cn.drfrm.cn http://www.morning.wrtpk.cn.gov.cn.wrtpk.cn http://www.morning.xfncq.cn.gov.cn.xfncq.cn http://www.morning.ffcsr.cn.gov.cn.ffcsr.cn http://www.morning.pqppj.cn.gov.cn.pqppj.cn http://www.morning.ctqlq.cn.gov.cn.ctqlq.cn http://www.morning.playmi.cn.gov.cn.playmi.cn http://www.morning.mjpgl.cn.gov.cn.mjpgl.cn http://www.morning.mumgou.com.gov.cn.mumgou.com http://www.morning.cmqrg.cn.gov.cn.cmqrg.cn http://www.morning.kqpsj.cn.gov.cn.kqpsj.cn http://www.morning.trzmb.cn.gov.cn.trzmb.cn http://www.morning.hryhq.cn.gov.cn.hryhq.cn http://www.morning.zdqsc.cn.gov.cn.zdqsc.cn http://www.morning.fndfn.cn.gov.cn.fndfn.cn http://www.morning.wpqwk.cn.gov.cn.wpqwk.cn http://www.morning.nzhzt.cn.gov.cn.nzhzt.cn http://www.morning.xhlht.cn.gov.cn.xhlht.cn