RKNN3588——利用推理YOLOv8推理图片
1. yolov8_test.py
import os
import cv2
import numpy as np
from class_type import CLASSES# 设置对象置信度阈值和非极大值抑制(NMS)阈值。
OBJ_THRESH = 0.25
NMS_THRESH = 0.45 IMG_SIZE = (640, 640)def filter_boxes(boxes, box_confidences, box_class_probs):# 筛选出满足条件的框,根据置信度和类别概率筛选出有效的框。box_confidences = box_confidences.reshape(-1)# candidate, class_num = box_class_probs.shapeclass_max_score = np.max(box_class_probs, axis=-1)classes = np.argmax(box_class_probs, axis=-1)_class_pos = np.where(class_max_score * box_confidences >= OBJ_THRESH)scores = (class_max_score * box_confidences)[_class_pos]boxes = boxes[_class_pos]classes = classes[_class_pos]return boxes, classes, scoresdef nms_boxes(boxes, scores):# 使用非极大值抑制(NMS)来消除冗余框,保留最优的检测框。x = boxes[:, 0]y = boxes[:, 1]w = boxes[:, 2] - boxes[:, 0]h = boxes[:, 3] - boxes[:, 1]areas = w * horder = scores.argsort()[::-1]keep = []while order.size > 0:i = order[0]keep.append(i)xx1 = np.maximum(x[i], x[order[1:]])yy1 = np.maximum(y[i], y[order[1:]])xx2 = np.minimum(x[i] + w[i], x[order[1:]] + w[order[1:]])yy2 = np.minimum(y[i] + h[i], y[order[1:]] + h[order[1:]])w1 = np.maximum(0.0, xx2 - xx1 + 0.00001)h1 = np.maximum(0.0, yy2 - yy1 + 0.00001)inter = w1 * h1ovr = inter / (areas[i] + areas[order[1:]] - inter)inds = np.where(ovr <= NMS_THRESH)[0]order = order[inds + 1]keep = np.array(keep)return keep# def dfl(position):
# # 改进模型对目标边界框的回归预测,是一种增强的损失函数
# import torch
# x = torch.tensor(position)
# n, c, h, w = x.shape
# p_num = 4
# mc = c // p_num
# y = x.reshape(n, p_num, mc, h, w)
# y = y.softmax(2)
# acc_metrix = torch.tensor(range(mc)).float().reshape(1, 1, mc, 1, 1)
# y = (y * acc_metrix).sum(2)
# return y.numpy()
################################################################ 不需要torch
def dfl(position):# 用来改进模型对目标边界框的回归预测# print('111111111111111', position.shape)n, c, h, w = position.shapep_num = 4mc = c // p_numy = position.reshape(n, p_num, mc, h, w)y = softmax(y, 2)acc_metrix = np.arange(mc).reshape(1, 1, mc, 1, 1)y = (y * acc_metrix).sum(2)return ydef softmax(data, dim):max = np.max(data, axis=dim, keepdims=True).repeat(data.shape[dim], axis=dim)exps = np.exp(data - max)return exps / np.sum(exps, axis=dim, keepdims=True)
#############################################################def box_process(position):# 处理边界框的坐标,将其转换为实际图像上的坐标。grid_h, grid_w = position.shape[2:4]col, row = np.meshgrid(np.arange(0, grid_w), np.arange(0, grid_h))col = col.reshape(1, 1, grid_h, grid_w)row = row.reshape(1, 1, grid_h, grid_w)grid = np.concatenate((col, row), axis=1)stride = np.array([IMG_SIZE[1] // grid_h, IMG_SIZE[0] // grid_w]).reshape(1, 2, 1, 1)position = dfl(position)box_xy = grid + 0.5 - position[:, 0:2, :, :]box_xy2 = grid + 0.5 + position[:, 2:4, :, :]xyxy = np.concatenate((box_xy * stride, box_xy2 * stride), axis=1)return xyxydef yolov8_post_process(input_data):# 模型输出的原始预测结果经过后处理,以生成最终的检测结果print(len(input_data))boxes, scores, classes_conf = [], [], []default_branch = 3 # 输入数据分成三部分进行处理pair_per_branch = len(input_data) // default_branchprint("aaaaaaaaaaa",pair_per_branch)# 处理每个分支数据for i in range(default_branch):boxes.append(box_process(input_data[pair_per_branch * i]))classes_conf.append(input_data[pair_per_branch * i + 1])scores.append(np.ones_like(input_data[pair_per_branch * i + 1][:, :1, :, :], dtype=np.float32))# 将输入张量 _in 重新排列并展平def sp_flatten(_in):ch = _in.shape[1] # 获取输入的通道数_in = _in.transpose(0, 2, 3, 1) # 将通道维度移到最后return _in.reshape(-1, ch) # 将张量展平为二维# 使用 sp_flatten 函数展平每个分支的 boxes、classes_conf 和 scoresboxes = [sp_flatten(_v) for _v in boxes]classes_conf = [sp_flatten(_v) for _v in classes_conf]scores = [sp_flatten(_v) for _v in scores]# 将每个分支的展平数据连接成一个整体boxes = np.concatenate(boxes)scores = np.concatenate(scores)classes_conf = np.concatenate(classes_conf)# 过滤框boxes, classes, scores = filter_boxes(boxes, scores, classes_conf)# nms--非极大值抑制nboxes, nclasses, nscores = [], [], []for c in set(classes):inds = np.where(classes == c)b = boxes[inds]c = classes[inds]s = scores[inds]keep = nms_boxes(b, s)if len(keep) != 0:nboxes.append(b[keep])nclasses.append(c[keep])nscores.append(s[keep])if not nclasses and not nscores:return None, None, Noneboxes = np.concatenate(nboxes)classes = np.concatenate(nclasses)scores = np.concatenate(nscores)return boxes, classes, scoresdef draw(image, boxes, scores, classes):# 画框print("{:^12} {:^12} {}".format('class', 'score', 'xmin, ymin, xmax, ymax'))print('-' * 50)for box, score, cl in zip(boxes, scores, classes):top, left, right, bottom = [int(_b) for _b in box]# print("%s @ (%d %d %d %d) %.3f" % (CLASSES[cl], top, left, right, bottom, score))cv2.rectangle(image, (top, left), (right, bottom), (0, 255, 0), 2)cv2.putText(image, '{0} {1:.2f}'.format(CLASSES[cl], score),(top, left - 6), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0,255, 0), 2)print("{:^12} {:^12.3f} [{:>4}, {:>4}, {:>4}, {:>4}]".format(CLASSES[cl], score, top, left, right, bottom))return image
2. test.py
import time
import cv2
import numpy as np
from coco_utils import COCO_test_helper
from rknnlite.api import RKNNLite
from yolov8_test import yolov8_post_process,draw
from collections import dequeclass Model:def __init__(self, model_path) -> None:self.rknn_model = model_pathself.rknn_lite = RKNNLite()print(f'--> Load {self.rknn_model} model')ret = self.rknn_lite.load_rknn(self.rknn_model)if ret != 0:print('Load RKNNLite model failed')exit(ret)print('done')# 初始化运行环境print('--> Init runtime environment')ret = self.rknn_lite.init_runtime(core_mask=RKNNLite.NPU_CORE_0_1_2)if ret != 0:print('Init runtime environment failed')exit(ret)print('done')def inference(self, img_src, IMG_SIZE):if img_src is None:print('Error: image read failed')return Noneself.co_helper = COCO_test_helper(enable_letter_box=True)img = self.co_helper.letter_box(im=img_src.copy(), new_shape=(IMG_SIZE[1], IMG_SIZE[0]), pad_color=(0, 0, 0))img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)img = np.expand_dims(img, 0)# print(f'--> Running RKNN model')outputs = self.rknn_lite.inference(inputs=[img])return outputsdef release(self):self.rknn_lite.release()def recover_real_box(self, boxes):# 还原框boxes = self.co_helper.get_real_box(boxes)return boxesif __name__ == '__main__':yolo_model_path = 'yolov8-main/study/yolov8-240617.rknn'yolo_model = Model(yolo_model_path)img_path = r"yolov8-main/study/76_269.jpg"img = cv2.imread(img_path)yolo_result = yolo_model.inference(img, IMG_SIZE=(640,640))boxes, classes, scores = yolov8_post_process(yolo_result)boxes = yolo_model.recover_real_box(boxes=boxes)after_images = draw(img, boxes, scores, classes)cv2.imwrite("1.jpg",after_images)# print(yolo_result)
3. study/class_type.py
CLASSES = ("building", "building2", "statue")
coco_id_list = [1, 2, 3]
相关文章:
RKNN3588——利用推理YOLOv8推理图片
1. yolov8_test.py import os import cv2 import numpy as np from class_type import CLASSES# 设置对象置信度阈值和非极大值抑制(NMS)阈值。 OBJ_THRESH 0.25 NMS_THRESH 0.45 IMG_SIZE (640, 640)def filter_boxes(boxes, box_confidences, box_…...
【ARMv8/v9 GIC 系列 1.7 -- GIC PPI | SPI | SGI | LPI 中断使能配置介绍】
请阅读【ARM GICv3/v4 实战学习 】 文章目录 GIC 各种中断使能配置PPIs(每个处理器私有中断)SPIs(共享外设中断)SGIs(软件生成的中断)LPIs(局部中断)GIC 各种中断使能配置 在ARM GICv3和GICv4架构中,不同类型的中断(如PPIs、SPIs、SGIs和LPIs)可以通过不同的方式进…...
uniapp开发射击类小游戏
使用 UniApp 开发射击类小游戏可以遵循以下步骤: 项目规划 确定游戏的主题、玩法、关卡设计等。规划游戏的界面布局,包括游戏主界面、游戏场景、得分显示等。 技术准备 熟悉 UniApp 的开发文档和相关 API。准备所需的开发工具,如 HBuilderX。…...
spring6框架解析(by尚硅谷)
文章目录 spring61. 一些基本的概念、优势2. 入门案例实现maven聚合工程创建步骤分析实现过程 3. IoC(Inversion of Control)基于xml的bean环境搭建获取bean获取接口创建实现类依赖注入 setter注入 和 构造器注入原生方式的setter注入原生方式的构造器注…...
Open3D 计算点云的马氏距离
目录 一、概述 1.1原理 1.2应用 二、代码实现 三、实现效果 3.1原始点云 3.2计算后点云 一、概述 1.1原理 马氏距离(Mahalanobis Distance)是一种度量多维数据点与数据分布中心之间距离的方法。与欧几里得距离不同,马氏距离考虑了数据…...
Java事务(Transaction)
Java事务(Transaction)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列组成,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务的引入主要是为了解决并发操作数据…...
算法 —— 二分查找
目录 二分查找 在排序数组中查找元素的第一个和最后一个位置 搜索插入位置 x的平方根 山峰数组的峰顶索引 寻找峰值 搜索旋转排序数组中的最⼩值 点名 二分查找模板分为三种:1、朴素的二分模板 2、查找左边界的二分模板 3、查找右边界的二分模板…...
Mysql explain语句详解与实例展示
首先简单介绍sql: SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL。 1. 数据查询语言DQL 数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE子句…...
Python基础问题汇总
为什么学习Python? 易学易用:Python语法简洁清晰,易于学习。广泛的应用领域:适用于Web开发、数据科学、人工智能、自动化脚本等多种场景。强大的库支持:拥有丰富的第三方库,如NumPy、Pandas、TensorFlow等…...
【讲解下iOS语言基础】
🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…...
【网络安全】实验一(网络拓扑环境的搭建)
一、本次实验的实验目的 学习利用 VMware 创建虚拟环境 学习利用 VMware 搭建各自网络拓扑环境 二、创建虚拟机 三、克隆虚拟机 选择克隆的系统必须处于关机状态。 方法一: 方法二: 需要修改克隆计算机的名字,避免产生冲突。 四、按照要求完…...
Docker-基础
一,Docker简介,功能特性与应用场景 1.1 Docker简介 Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器…...
《昇思25天学习打卡营第14天|onereal》
第14天学习内容如下: Diffusion扩散模型 本文基于Hugging Face:The Annotated Diffusion Model一文翻译迁移而来,同时参考了由浅入深了解Diffusion Model一文。 本教程在Jupyter Notebook上成功运行。如您下载本文档为Python文件,…...
LeetCode 744, 49, 207
目录 744. 寻找比目标字母大的最小字母题目链接标签思路代码 49. 字母异位词分组题目链接标签思路代码 207. 课程表题目链接标签思路代码 744. 寻找比目标字母大的最小字母 题目链接 744. 寻找比目标字母大的最小字母 标签 数组 二分查找 思路 本题比 基础二分查找 难的一…...
【AI资讯】可以媲美GPT-SoVITS的低显存开源文本转语音模型Fish Speech
Fish Speech是一款由fishaudio开发的全新文本转语音工具,支持中英日三种语言,语音处理接近人类水平,使用Flash-Attn算法处理大规模数据,提供高效、准确、稳定的TTS体验。 Fish Audio...
微服务数据流的协同:Eureka与Spring Cloud Data Flow集成指南
微服务数据流的协同:Eureka与Spring Cloud Data Flow集成指南 在构建基于Spring Cloud的微服务架构时,服务发现和数据流处理是两个关键的组成部分。Eureka作为服务发现工具,而Spring Cloud Data Flow提供了数据流处理的能力。本文将详细介绍…...
java生成json格式文件(包含缩进等格式)
生成json文件的同时保留原json格式,拥有良好的格式(如缩进等),提供友善阅读支持。 pom.xml依赖增加: <dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactI…...
Python面试题:如何在 Python 中读取和写入 JSON 文件?
在 Python 中读取和写入 JSON 文件可以使用 json 模块。以下是具体的示例,展示了如何读取和写入 JSON 文件。 读取 JSON 文件 要读取 JSON 文件,可以使用 json.load() 方法。下面是一个示例代码: import json# 假设有一个名为 data.json 的…...
FlutterWeb渲染模式及提速
背景 在使用Flutter Web开发的网站过程中,常常会遇到不同浏览器之间的兼容性问题。例如,在Google浏览器中动画和交互都非常流畅,但在360浏览器中却会出现卡顿现象;在Google浏览器中动态设置图标颜色正常显示,而在Safa…...
群体优化算法----化学反应优化算法介绍,解决蛋白质-配体对接问题示例
介绍 化学反应优化算法(Chemical Reaction Optimization, CRO)是一种新兴的基于自然现象的元启发式算法,受化学反应过程中分子碰撞和反应机制的启发而设计。CRO算法模拟了分子在化学反应过程中通过能量转换和分子间相互作用来寻找稳定结构的…...
AgentCPM-Report部署教程:Pixel Epic在Ubuntu/CentOS下的环境配置
AgentCPM-Report部署教程:Pixel Epic在Ubuntu/CentOS下的环境配置 1. 项目介绍 Pixel Epic是一款基于AgentCPM-Report大模型构建的研究报告辅助终端,它将枯燥的科研工作转化为一场像素风格的RPG冒险体验。与传统AI工具不同,Pixel Epic采用了…...
M2FP在虚拟试衣间的应用:快速识别人体部位,助力电商设计
M2FP在虚拟试衣间的应用:快速识别人体部位,助力电商设计 1. 虚拟试衣间的技术挑战 在电商领域,虚拟试衣技术正在改变用户的购物体验。传统试衣间面临诸多痛点: 用户无法直观看到服装上身效果退换货率高,增加运营成本…...
忍者像素绘卷开源镜像部署:支持国产昇腾芯片的适配可行性分析
忍者像素绘卷开源镜像部署:支持国产昇腾芯片的适配可行性分析 1. 项目概述与技术特点 忍者像素绘卷是一款基于Z-Image-Turbo深度优化的图像生成工作站,专为二次元风格和复古像素艺术设计。该项目融合了现代AI图像生成技术与16-bit游戏美学,…...
京东 SPU/SKU 数据接口全解读:商品详情 API 文档(2026 最新版)
京东商品详情 API 体系以SPU(标准产品单元)聚合、SKU(库存单元)明细为核心设计,覆盖商家开放平台(JOS)、京东联盟两大核心场景,支持单品 / 批量查询、全字段 / 指定字段返回…...
关于eclipse2019中导入克隆的web项目
分为导入项目和排查可能错误两个方面前言:本文主要总结个人在完成需要合作完成学习项目时,使用共享项目文件时“环境”问题导致的无法“跑通”,为此忙碌很久和豆包进行了“深入聊天”。决定对自己的问题进行总结,方便自己以后阅读…...
嵌入式系统XIP技术:原理、实现与优化
1. XIP技术核心概念解析eXecute In Place(XIP)技术是现代嵌入式系统中的一项关键创新。简单来说,它允许CPU直接从非易失性存储器(如NOR Flash)中读取并执行代码,而无需先将代码复制到RAM中。这种技术最早应…...
5G网络架构:核心网、接入网的组成与工作原理
5G网络架构:核心网、接入网的组成与工作原理📝 本章学习目标:本章探讨网络编程,帮助读者掌握网络应用开发技能。通过本章学习,你将全面掌握"5G网络架构:核心网、接入网的组成与工作原理"这一核心…...
JAE日本航空电子推出满足汽车市场小型防水最新需求的MX80系列连接器
随着汽车电子化和高功能化的演进,每辆汽车所搭载的电子设备数量逐年增加。为了在有限安装空间内集成更多的功能,车载用电子零部件必然要求进一步小型化,高功能化。同时由于连接各设备之间的布线空间也在缩小,因此开发小型化&#…...
如何永久保存B站缓存视频?m4s-converter开源工具完整使用指南
如何永久保存B站缓存视频?m4s-converter开源工具完整使用指南 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾经遇到过这样的…...
别急着重装!Stable Diffusion WebUI安装失败后,如何利用现有文件快速恢复(Mac/Windows通用)
别急着重装!Stable Diffusion WebUI安装失败后,如何利用现有文件快速恢复(Mac/Windows通用) 当你兴致勃勃地准备体验Stable Diffusion WebUI的强大功能时,突然在安装过程中遇到错误提示,那种挫败感可想而知…...
