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

百度飞浆目标检测PPYOLOE模型在PC端、Jetson上的部署(python)

部署目标检测模型前,需要配置好paddlepaddle的环境:
开始使用_飞桨-源于产业实践的开源深度学习平台 (paddlepaddle.org.cn)

PC端和Jetson板卡端的部署方法相同,如下(直接放置部署和测试代码):

import paddle.inference
import cv2
import numpy as np
import time
from paddle.inference import Config, PrecisionType, create_predictor
import os
import json
import argparse
from PIL import Image
import yaml
import globdef config_init(model_dir):model_file = glob.glob(model_dir + "/*.pdmodel")[0]params_file = glob.glob(model_dir + "/*.pdiparams")[0]config = Config()config.set_prog_file(model_file)config.set_params_file(params_file)config.switch_ir_optim()  # 开启IR优化config.enable_memory_optim()  # 启用内存优化config.enable_use_gpu(500, 0)  # 500是内存大小,0是GPU编号return create_predictor(config)  # 初始化一个预测器对象class PPYoloeModel:def __init__(self, model_dir):self.yaml_file = glob.glob(model_dir + "/*.yml")[0]self.predictor = config_init(model_dir)  # 初始化一个预测器对象self.mean = [0.0, 0.0, 0.0]self.std = [1.0, 1.0, 1.0]self.img_size = 640self.threshold = 0.6  # 置信度阈值def read_yaml(self):with open(self.yaml_file, 'r', encoding='utf-8') as infer_cfg:  # 使用with语句确保文件正确关闭yaml_reader = yaml.safe_load(infer_cfg)  # 直接从文件对象中读取label_list = yaml_reader['label_list']  # 获取分类# print(label_list)return label_listdef resize(self, img):if not isinstance(img, np.ndarray):raise TypeError('image type is not numpy.')im_shape = img.shape im_scale_x = float(self.img_size) / float(im_shape[1])  # 可以保持宽高比im_scale_y = float(self.img_size) / float(im_shape[0])img = cv2.resize(img, None, None, fx=im_scale_x, fy=im_scale_y)  # fx和fy是缩放因子(倍数)return imgdef normalize(self, img):img = img / 255.0  # 归一化到[0,1]mean = np.array(self.mean)[np.newaxis, np.newaxis, :]  # np.newaxis增加新的轴(维度)std = np.array(self.std)[np.newaxis, np.newaxis, :]img -= mean  img /= std return imgdef pre_process(self, img):img = self.resize(img)img = img[:, :, ::-1].astype('float32')  # bgr -> rgbimg = self.normalize(img)img = img.transpose((2, 0, 1))  # hwc -> chwreturn img[np.newaxis, :]def run_predict(self, img):input_names = self.predictor.get_input_names()for i, name in enumerate(input_names):input_tensor = self.predictor.get_input_handle(name)  # 获取张量句柄input_tensor.reshape(img[i].shape)  # 重塑输入张量input_tensor.copy_from_cpu(img[i].copy())  # 从CPU复制图像数据到输入张量self.predictor.run()results = []output_names = self.predictor.get_output_names()for i, name in enumerate(output_names):output_tensor = self.predictor.get_output_handle(name)output_data = output_tensor.copy_to_cpu()  # 获取检测结果results.append(output_data)return resultsdef get_result(self, img):result = []scale_factor = (np.array([self.img_size * 1.0 / img.shape[0], self.img_size * 1.0 / img.shape[1]]).reshape((1, 2)).astype(np.float32))img = self.pre_process(img)results = self.run_predict([img, scale_factor])for res in results[0]:score = res[1]if score > self.threshold:result.append(res)  # 只保留置信度大于阈值的目标(同时可能有多个目标)return result# result是一个列表,里面可能存有一个或多个目标的信息# 对于单个目标,第一个值是类别的id,第二个值是置信度,后四个值分别是xmin, ymin, xmax, ymaxdef draw_bbox_cv(self, img):  # 对于实时摄像头图片的后处理label_list = self.read_yaml()result = self.get_result(img)for res in result:cat_id, score, bbox = res[0], res[1], res[2:]  # cat_id表示类别的id;score是得分;bbox是列表,含有xmin, ymin, xmax, ymax四个元素bbox = [int(i) for i in bbox]  # 对坐标取整xmin, ymin, xmax, ymax = bboxcv2.rectangle(img, (xmin, ymin), (xmax, ymax), (255, 0, 255), 2)  # 2表示线宽print('category id is {}, bbox is {}'.format(cat_id, bbox))print(f"中心点:{(xmin + xmax) / 2},{(ymin + ymax) / 2}")try:label_id = label_list[int(cat_id)]  # 通过类别id查找对应类别名称# 在图像上打印类别   FONT_HERSHEY_SIMPLEX为字体类型cv2.putText(img, label_id, (int(xmin), int(ymin + 15)), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 0),2)# 在图像上打印得分cv2.putText(img, str(round(score, 2)), (int(xmin - 35), int(ymin + 15)), cv2.FONT_HERSHEY_SIMPLEX, 0.5,(0, 255, 0), 2)print(round(score, 2))except KeyError:pass# 调用示例
if __name__ == "__main__":ppyoloe_model = PPYoloeModel("这里输入模型所在文件夹的路径")  # 初始化一个ppyoloe目标检测模型对象cap = cv2.VideoCapture(0)  # 初始化摄像头while True:ret, image = cap.read()  # 获取图像if not ret:print("无法正确读取图像!")breakppyoloe_model.draw_bbox_cv(image)cv2.imshow("frame", image)if cv2.waitKey(1) & 0xFF == ord('q'):break

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Python入门笔记
  • 【C/C++】C++类与对象基本概念(抽象封装、类的定义与使用、构造函数、析构函数、静态成员、友元)
  • openlayers10+vue3+ts
  • Java后端 - 常见BUG及其处理策略(持续更新中~)
  • C语言备忘
  • RocketMQ学习(二)
  • 华为OD机试真题 - 字符成环找偶数O - 滑动窗口(Python/JS/C/C++ 2024 E卷 100分)
  • C++中AVL树的底层逻辑原理及其实现原理和过程
  • 【C++ | 设计模式】代理模式的详解与实现
  • minio文件存储+ckplayer视频播放(minio分片上传合并视频播放)
  • Java 4.3 - Redis
  • HTML中自定义属性并通过JS获取属性值
  • 【生日视频制作】农村大马路绿色墙体广告标语喷漆AE模板修改文字软件生成器教程特效素材【AE模板】
  • SpringMVC 笔记篇
  • jmeter的聚合报告生成测试报告的方法(生成.HTML模式)
  • Angular 2 DI - IoC DI - 1
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • ES学习笔记(12)--Symbol
  • JavaScript设计模式之工厂模式
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • MySQL QA
  • react-native 安卓真机环境搭建
  • SpiderData 2019年2月25日 DApp数据排行榜
  • springboot_database项目介绍
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • windows下如何用phpstorm同步测试服务器
  • 阿里云购买磁盘后挂载
  • 编写高质量JavaScript代码之并发
  • 模型微调
  • 设计模式走一遍---观察者模式
  • 因为阿里,他们成了“杭漂”
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • 阿里云移动端播放器高级功能介绍
  • #传输# #传输数据判断#
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • #数据结构 笔记三
  • (¥1011)-(一千零一拾一元整)输出
  • (04)odoo视图操作
  • (2024,Vision-LSTM,ViL,xLSTM,ViT,ViM,双向扫描)xLSTM 作为通用视觉骨干
  • (六)vue-router+UI组件库
  • (三)uboot源码分析
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (转)LINQ之路
  • ./configure、make、make install 命令
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .jks文件(JAVA KeyStore)
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .NET Core 版本不支持的问题
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .NET Framework 服务实现监控可观测性最佳实践
  • .net Stream篇(六)