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

YOLOv5推理代码解析

代码如下

import cv2
import numpy as np
import onnxruntime as ort
import time
import random# 画一个检测框
def plot_one_box(x, img, color=None, label=None, line_thickness=None):"""description: 在图像上绘制一个矩形框。param:x: 框的坐标 [x1, y1, x2, y2]img: 输入图像color: 矩形框的颜色,默认为随机颜色label: 框内显示的标签line_thickness: 矩形框的线条宽度return: 无返回值,直接在图像上绘制"""tl = (line_thickness or round(0.002 * (img.shape[0] + img.shape[1]) / 2) + 1)  # line/font thickness,计算线条或字体的粗细color = color or [random.randint(0, 255) for _ in range(3)]  # 如果没有提供颜色,随机生成颜色c1, c2 = (int(x[0]), int(x[1])), (int(x[2]), int(x[3]))  # 左上角和右下角的坐标cv2.rectangle(img, c1, c2, color, thickness=tl, lineType=cv2.LINE_AA)  # 绘制矩形框if label:  # 如果提供了标签,则绘制标签tf = max(tl - 1, 1)  # 字体的粗细t_size = cv2.getTextSize(label, 0, fontScale=tl / 3, thickness=tf)[0]  # 获取标签的大小c2 = c1[0] + t_size[0], c1[1] - t_size[1] - 3  # 计算标签背景框的位置cv2.rectangle(img, c1, c2, color, -1, cv2.LINE_AA)  # 绘制标签背景框cv2.putText(img,label,(c1[0], c1[1] - 2),0,tl / 3,[225, 255, 255],thickness=tf,lineType=cv2.LINE_AA,)  # 绘制标签文本# 生成网格坐标
def _make_grid(nx, ny):"""description: 生成网格坐标,用于解码预测框位置。param:nx, ny: 网格的行数和列数return: 返回网格坐标"""xv, yv = np.meshgrid(np.arange(ny), np.arange(nx))  # 生成网格坐标return np.stack((xv, yv), 2).reshape((-1, 2)).astype(np.float32)  # 转换为需要的格式# 输出解码
def cal_outputs(outs, nl, na, model_w, model_h, anchor_grid, stride):"""description: 对模型输出的坐标进行解码,转换为图像坐标。param:outs: 模型输出的框的偏移量nl: 输出层数量na: 每层的anchor数目model_w, model_h: 模型输入图像的尺寸anchor_grid: anchor的尺寸stride: 每个输出层的缩放步长return: 解码后的输出"""row_ind = 0grid = [np.zeros(1)] * nl  # 每个层对应一个网格for i in range(nl):h, w = int(model_w / stride[i]), int(model_h / stride[i])  # 计算该层特征图的高和宽length = int(na * h * w)  # 当前层的总框数if grid[i].shape[2:4] != (h, w):  # 如果网格的大小不匹配,则重新生成网格grid[i] = _make_grid(w, h)# 解码每个框的中心坐标和宽高outs[row_ind:row_ind + length, 0:2] = (outs[row_ind:row_ind + length, 0:2] * 2. - 0.5 + np.tile(grid[i], (na, 1))) * int(stride[i])outs[row_ind:row_ind + length, 2:4] = (outs[row_ind:row_ind + length, 2:4] * 2) ** 2 * np.repeat(anchor_grid[i], h * w, axis=0)  # 计算宽高row_ind += lengthreturn outs# 后处理,计算检测框
def post_process_opencv(outputs, model_h, model_w, img_h, img_w, thred_nms, thred_cond):"""description: 对模型输出的框进行后处理,得到最终的检测框。param:outputs: 模型输出的框model_h, model_w: 模型输入的高度和宽度img_h, img_w: 原图的高度和宽度thred_nms: 非极大值抑制的阈值thred_cond: 置信度阈值return: 返回处理后的框、置信度和类别"""conf = outputs[:, 4].tolist()  # 获取每个框的置信度c_x = outputs[:, 0] / model_w * img_w  # 计算中心点x坐标c_y = outputs[:, 1] / model_h * img_h  # 计算中心点y坐标w = outputs[:, 2] / model_w * img_w  # 计算框的宽度h = outputs[:, 3] / model_h * img_h  # 计算框的高度p_cls = outputs[:, 5:]  # 获取分类得分if len(p_cls.shape) == 1:  # 如果分类结果只有一维,增加一维p_cls = np.expand_dims(p_cls, 1)cls_id = np.argmax(p_cls, axis=1)  # 获取类别编号# 计算框的四个角坐标p_x1 = np.expand_dims(c_x - w / 2, -1)p_y1 = np.expand_dims(c_y - h / 2, -1)p_x2 = np.expand_dims(c_x + w / 2, -1)p_y2 = np.expand_dims(c_y + h / 2, -1)areas = np.concatenate((p_x1, p_y1, p_x2, p_y2), axis=-1)  # 合并成框的坐标areas = areas.tolist()  # 转为列表形式ids = cv2.dnn.NMSBoxes(areas, conf, thred_cond, thred_nms)  # 非极大值抑制if len(ids) > 0:  # 如果有框被保留return np.array(areas)[ids], np.array(conf)[ids], cls_id[ids]else:return [], [], []# 图像推理
def infer_img(img0, net, model_h, model_w, nl, na, stride, anchor_grid, thred_nms=0.4, thred_cond=0.5):"""description: 对输入图像进行推理,输出检测框。param:img0: 原始图像net: 加载的ONNX模型model_h, model_w: 模型的输入尺寸nl: 输出层数量na: 每层的anchor数量stride: 每层的缩放步长anchor_grid: 每层的anchor尺寸thred_nms: 非极大值抑制阈值thred_cond: 置信度阈值return: 检测框、置信度和类别"""# 图像预处理img = cv2.resize(img0, [model_w, model_h], interpolation=cv2.INTER_AREA)  # 将图像调整为模型输入大小img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # 转换为RGB格式img = img.astype(np.float32) / 255.0  # 归一化blob = np.expand_dims(np.transpose(img, (2, 0, 1)), axis=0)  # 将图像转为模型输入格式# 模型推理outs = net.run(None, {net.get_inputs()[0].name: blob})[0].squeeze(axis=0)  # 推理并去掉batch维度# 输出坐标矫正outs = cal_outputs(outs, nl, na, model_w, model_h, anchor_grid, stride)# 检测框计算img_h, img_w, _ = np.shape(img0)  # 获取原图的尺寸boxes, confs, ids = post_process_opencv(outs, model_h, model_w, img_h, img_w, thred_nms, thred_cond)return boxes, confs, idsif __name__ == "__main__":# 加载ONNX模型model_pb_path = "a.onnx"  # 模型文件路径so = ort.SessionOptions()net = ort.InferenceSession(model_pb_path, so)# 类别字典dic_labels = {0: 'jn', 1: 'pill_bag', 2: 'pill_ban', 3: 'yg', 4: 'ys', 5: 'kfy',6: 'pw', 7: 'yanyao_1', 8: 'yanyao_2', 9: 'paper_cup', 10: 'musai',11: 'carrot', 12: 'potato', 13: 'potato_s', 14: 'potato_black',15: 'cizhuan', 16: 'eluanshi_guang', 17: 'stone', 18: 'zhuankuai_bai',19: 'zhuankuai_red', 20: 'empty'}# 模型参数model_h = 320model_w = 320nl = 3na = 3stride = [8., 16., 32.]anchors = [[10, 13, 16, 30, 33, 23], [30, 61, 62, 45, 59, 119], [116, 90, 156, 198, 373, 326]]anchor_grid = np.asarray(anchors, dtype=np.float32).reshape(nl, -1, 2)# 打开摄像头video = 1  # 摄像头设备编号,1表示默认摄像头cap = cv2.VideoCapture(video)  # 视频捕获对象flag_det = False  # 检测开关while True:success, img0 = cap.read()  # 读取每一帧if success:if flag_det:  # 如果检测开启t1 = time.time()  # 记录推理前的时间det_boxes, scores, ids = infer_img(img0, net, model_h, model_w, nl, na, stride, anchor_grid,thred_nms=0.4, thred_cond=0.5)  # 推理t2 = time.time()  # 记录推理后的时间# 绘制检测框和标签for box, score, id in zip(det_boxes, scores, ids):label = '%s:%.2f' % (dic_labels[id], score)plot_one_box(box.astype(np.int16), img0, color=(255, 0, 0), label=label, line_thickness=None)# 计算并显示FPSdelta_time = t2 - t1if delta_time > 0:str_FPS = "FPS: %.2f" % (1. / delta_time)else:str_FPS = "FPS: inf"cv2.putText(img0, str_FPS, (50, 50), cv2.FONT_HERSHEY_COMPLEX, 1, (0, 255, 0), 3)cv2.imshow("video", img0)  # 显示图像key = cv2.waitKey(1) & 0xFF  # 等待键盘输入if key == ord('q'):  # 按q键退出breakelif key & 0xFF == ord('s'):  # 按s键切换检测开关flag_det = not flag_detprint(flag_det)cap.release()  # 释放视频捕获对象

代码中推理相关的函数逐行详细中文注释和解释,帮助你从初学者的角度完全理解代码。我们重点讲解这几个核心函数:


1. infer_img() 推理主函数

def infer_img(img0, net, model_h, model_w, nl, na, stride, anchor_grid, thred_nms=0.4, thred_cond=0.5):

这是图像推理的主函数,完成从原始图像到预测结果的所有操作。


第一步:图像预处理

img = cv2.resize(img0, [model_w, model_h], interpolation=cv2.INTER_AREA)
  • 将原始图像 img0 缩放成模型输入要求的大小(例如 320×320)。

  • cv2.INTER_AREA 是一种图像插值方式,适合缩小图像时使用。

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
  • OpenCV 读取图像是 BGR 顺序,而深度学习模型通常使用 RGB,因此这里需要转换颜色通道。

img = img.astype(np.float32) / 255.0
  • 把图像的数据类型转为 float32,并将像素值从 [0, 255] 范围归一化到 [0, 1],符合模型输入要求。

blob = np.expand_dims(np.transpose(img, (2, 0, 1)), axis=0)
  • OpenCV图像的格式是 (H, W, C),而 PyTorch 模型(如YOLO)的输入是 (B, C, H, W)

  • np.transpose(img, (2, 0, 1)) 把通道 C 移到第一个维度

  • np.expand_dims(..., axis=0) 增加 batch 维度:变成 (1, 3, 320, 320)


第二步:模型推理

outs = net.run(None, {net.get_inputs()[0].name: blob})[0].squeeze(axis=0)
  • 用 ONNX Runtime 推理:输入是 blob

  • net.get_inputs()[0].name 得到模型输入的名字

  • squeeze(axis=0) 把 batch 维度去掉,形状变成 (N, 85),N 是预测框数量,85 是每个框的信息(x, y, w, h, conf, + 80类)


第三步:输出坐标解码

outs = cal_outputs(outs, nl, na, model_w, model_h, anchor_grid, stride)
  • YOLO 的输出是相对 anchor + grid 编码的,需要转换为图像上的真实位置

  • cal_outputs() 就是做这个解码变换的函数(后面详细讲)


第四步:后处理,获取检测框信息

img_h, img_w, _ = np.shape(img0)
boxes, confs, ids = post_process_opencv(outs, model_h, model_w, img_h, img_w, thred_nms, thred_cond)
  • 将模型输出映射回原始图像尺寸

  • 使用置信度阈值和 NMS 非极大值抑制删除重复框

  • 得到最终的:

    • boxes: 框坐标

    • confs: 置信度

    • ids: 类别编号


2. cal_outputs() 坐标解码函数

def cal_outputs(outs, nl, na, model_w, model_h, anchor_grid, stride):

含义解释:

  • outs: 模型输出,形状大致是 (N, 85),前4列是框的位置

  • nl: YOLO使用的输出层数量(3个:大中小目标)

  • na: 每个特征层使用的 anchor 数(通常为 3)

  • anchor_grid: 每层 anchor 的宽高尺寸

  • stride: 每层特征图相对于原图的缩放倍数

grid = [np.zeros(1)] * nl
  • 每一层都要生成网格坐标 grid,初始化为占位

for i in range(nl):h, w = int(model_w / stride[i]), int(model_h / stride[i])
  • 计算第 i 层的特征图尺寸(如:320/8=40)

    length = int(na * h * w)
  • 该层有多少个预测框

    if grid[i].shape[2:4] != (h, w):grid[i] = _make_grid(w, h)
  • 如果还没有生成 grid,就调用 _make_grid() 创建形状为 (h*w, 2) 的网格点

    outs[row_ind:row_ind + length, 0:2] = ...outs[row_ind:row_ind + length, 2:4] = ...
  • 对该层的所有框做位置矫正(中心点解码 + 宽高缩放)

  • 用 grid 和 anchor 反算出真实坐标


3. post_process_opencv() 后处理函数

def post_process_opencv(outputs, model_h, model_w, img_h, img_w, thred_nms, thred_cond):

功能:

  • 将模型输出映射回原始图像尺寸

  • 提取类别信息

  • 使用 OpenCV 的 cv2.dnn.NMSBoxes() 进行非极大值抑制,保留重要框

步骤:

conf = outputs[:, 4].tolist()         # 提取每个框的置信度
c_x = outputs[:, 0] / model_w * img_w
c_y = outputs[:, 1] / model_h * img_h
w = outputs[:, 2] / model_w * img_w
h = outputs[:, 3] / model_h * img_h
  • 将中心点和尺寸从模型尺寸映射回原始图像尺寸

p_cls = outputs[:, 5:]
cls_id = np.argmax(p_cls, axis=1)
  • 取得每个框的类别分数最大值(即分类结果)

p_x1 = c_x - w/2
p_y1 = c_y - h/2
p_x2 = c_x + w/2
p_y2 = c_y + h/2
  • 把中心点转为左上角和右下角坐标 [x1, y1, x2, y2]

areas = np.concatenate((p_x1, p_y1, p_x2, p_y2), axis=-1)
ids = cv2.dnn.NMSBoxes(areas, conf, thred_cond, thred_nms)
  • 用 NMS 去除重叠预测框


相关文章:

YOLOv5推理代码解析

代码如下 import cv2 import numpy as np import onnxruntime as ort import time import random# 画一个检测框 def plot_one_box(x, img, colorNone, labelNone, line_thicknessNone):"""description: 在图像上绘制一个矩形框。param:x: 框的坐标 [x1, y1, x…...

创建三个网络,分别使用RIP、OSPF、静态,并每个网络10个电脑。使用DHCP分配IP

DHCP 自动分配IP,集中管理,提高效率 在路由器中设置 Router>en Router#conf t Router(config)#ip dhcp pool ip30 //创建DHCP地址池 Router(dhcp-config)#network 192.168.30.0 255.255.255.0 // 配置网络地址和子网掩码 Router(dhcp-config)#defa…...

[网络层]网络层设备路由器

路由表 路由器能进行路由转发,所依靠的核心数据结构就是路由表,那么路由表是怎么来的, 静态路由和动态路由: 说的是表项,这个表项是静态的还是动态的,就跟ARP缓存表的表项静态动态是一回事, …...

Maven 项目中将本地依赖库打包到最终的 JAR 中

文章目录 前言详细步骤 前言 在现代后端开发中,构建高效且可扩展的 Web 应用程序通常依赖于多种第三方库和内部依赖。这些依赖可以来自公共仓库,也可能是公司内部自研的库或尚未发布到公共仓库的 JAR 包。本文将详细介绍如何在 Maven 项目中处理本地依赖…...

大模型的Lora如何训练?

大模型LoRA(Low-Rank Adaptation)训练是一种参数高效的微调方法,通过冻结预训练模型权重并引入低秩矩阵实现轻量化调整。以下是涵盖原理、数据准备、工具、参数设置及优化的全流程指南: 一、LoRA的核心原理 低秩矩阵分解 在原始权重矩阵$ W 旁添加两个低秩矩阵 旁添加两个…...

CSS3 伪类和使用场景

CSS3 伪类(Pseudo-classes)大全 CSS3 引入了许多新的伪类,以下是完整的 CSS3 伪类分类列表(包括 CSS2 的伪类): 一、结构性伪类(Structural Pseudo-classes) 这些伪类根据元素在文…...

GitDiagram - GitHub 仓库可视化工具

GitDiagram - GitHub 仓库可视化工具 项目链接:https://github.com/ahmedkhaleel2004/gitdiagram 将任何 GitHub 仓库转换为交互式架构图,只需替换 URL 中的 hub 为 diagram。 ✨ 核心功能 即时可视化:将代码库结构转换为系统设计/架构图…...

[特殊字符] 本地大模型编程实战(29):用大语言模型LLM查询图数据库NEO4J(2)

本文将基于langgraph框架,用LLM查询NEO4J图数据库,构建可定制、能应对复杂场景的工作流! 🌟 核心亮点 是否用户提问是否电影相关?生成Cypher查询直接回答执行查询生成最终答案 🧩 模块化实现 1️⃣ 定义状态机 from …...

Python中操作Neo4j图数据库

在当今数据驱动的时代,关系型数据库在处理高度关联的数据时常常显得力不从心。图数据库,尤其是Neo4j,以其独特的图结构和高效的关系查询能力,成为了解决这一问题的利器。结合Python的简洁与强大,我们可以更高效地构建和…...

人工智能时代:解锁职业新身份,从“认证师”到“工程师”的进阶之路

在人工智能技术浪潮席卷全球的今天,技术的飞速迭代正在重塑职业版图。从算法优化到伦理决策,从系统测试到应用开发,AI技术不再只是程序员的专属领域,而是成为各行各业从业者必须掌握的“生存技能”。当企业争相布局AI赛道,个人如何在这场变革中抢占先机?答案或许藏在两个…...

浙江大学 deepseek 公开课 第三季 第3期 - 陈喜群 教授 (附PPT下载) by 突破信息差

浙江大学DeepSeek系列公开课第三季重磅开启,特邀该校多领域权威学者联袂主讲。课程聚焦AI技术如何重构基础学科研究范式,深度解码以DeepSeek为代表的智能模型在交叉学科中的创新应用。在"XAI"融合浪潮下,学术大咖将剖析传统学科与人…...

企业级商城系统容器化部署技术方案

容器化部署已成为企业级商城系统构建高可用、弹性架构的核心技术。结合行业实践与技术趋势,以下从架构设计、工具链选型、关键挑战及解决方案等维度,提供一套完整的实施技术方案: 一、架构设计与技术选型 微服务架构拆分 服务拆分原则&#x…...

Java设计模式之适配器模式:从入门到精通

适配器模式(Adapter Pattern)是Java中最常用的结构型设计模式之一,它像一座桥梁连接两个不兼容的接口,使得原本由于接口不兼容而不能一起工作的类可以协同工作。本文将全面深入地解析适配器模式,从基础概念到高级应用,包含丰富的代码示例、详细注释、使用场景分析以及多维对…...

Spark,RDD中的转换算子

RDD中的转换算子 map算子 对数字1-10进行乘除,*2 filter算子 对数字1-10进行过滤,过滤出偶数 filatMap算子 对单词进行拆分 reduceByKey算子 对具有相同键的所有值进行聚合操作 统计词频词频统计简洁写法 ———————————————— 版权声明…...

牛客周赛 Round 92(再现京津冀蓝桥杯???)

1. 小红的签到题 现在小红希望你写出一个长度为 nnn 的、使用了下划线命名法命名的变量。为了显出特征,请保证该变量至少由两个单词组成。 输入描述: 输入一个正整数 n(3≦n≦100),代表需要构造的变量长度。 输出描述: 输出一个长度为 n 的字符串&#x…...

React 18 的新功能:构建高性能应用的革新之道

React 18 的发布标志着前端开发进入了一个全新的并发时代。作为 React 历史上最重要的版本之一,它不仅带来了底层架构的深度重构,更通过一系列创新功能重新定义了现代 Web 应用的开发范式。这些特性在保持向后兼容的同时,为开发者提供了前所未…...

Python-Flask-Dive

Python-Flask-Dive 适用Python编写一个Flask的快速上手模板,后续如果需要使用Python快速进行we端的验证可以直接下载使用 1-项目创建 本项目仓库代码地址:https://gitee.com/enzoism/python_flask_dive 1-Python环境 ## 1-空工程初始化环境 mkdir my_pr…...

热门CPS联盟小程序聚合平台与CPA推广系统开发搭建:助力流量变现与用户增长

一、行业趋势:CPS与CPA模式成流量变现核心 在移动互联网流量红利见顶的背景下,CPS(按销售付费)和CPA(按行为付费)模式因其精准的投放效果和可控的成本,成为企业拉新与用户增长的核心工具。 CPS…...

16.three官方示例+编辑器+AI快速学习webgl_buffergeometry_lines_indexed

本实例主要讲解内容 这个Three.js示例展示了如何使用**索引几何体(Indexed Geometry)**创建复杂的分形线条图案。通过递归算法生成科赫雪花(Koch Snowflake)曲线,并利用索引缓冲区优化顶点数据存储,实现高效的线条渲染。 核心技术包括: 索…...

PowerBI基础

一、前言 在当今数据驱动的时代,如何高效地整理、分析并呈现数据,已成为企业和个人提升决策质量的关键能力。Power BI 作为微软推出的强大商业智能工具,正帮助全球用户将海量数据转化为直观、动态的可视化洞察。数据的世界充满可能性&#xf…...

【MCP】魔搭社区MCP服务(高德地图、everything文件搜索)

【MCP】魔搭社区MCP服务(高德地图、everything文件搜索) 1、上手使用2、环境配置(1)cherry-studio配置(2)添加魔搭大模型服务(如果已经设置了其他大模型服务,可跳过)&…...

适合大数据和宽表的数据存储和分析场景的数据库

适合大数据和**宽表(wide table)**的数据存储和分析场景的数据库,通常需要具备以下几个特性: 支持高吞吐量的写入和读取;能处理百万级列或数百列的宽表结构;良好的压缩和分区能力;支持分布式扩展和容错;一定程度的 SQL 支持或灵活的查询引擎。✅ 推荐数据库类型及代表产…...

ORB特征点检测算法

角点是图像中灰度变化在两个方向上都比较剧烈的点。与边缘(只有一个方向变化剧烈)或平坦区域(灰度变化很小)不同,角点具有方向性和稳定性。 tips:像素梯度计算 ORB算法流程简述 1.关键点检测(使用FAST…...

Node和npm初学

了解Node和npm 目录 ​1. 什么是 npm?​ 2. npm有哪些使用场景?​ 3. npm有什么核心特性?​ 4.npm的常用命令有那些? 5. 关键配置文件是什么?​ ​6. 安全与最佳实践​ 7.什么是 Node.js?​ 8.Node.js有什么优势? 9.如何安装和下载? 10.如何验证安装成功?…...

【android bluetooth 案例分析 03】【PTS 测试 】【PBAP/PCE/SGSIT/SERR/BV-01-C】

1. PBAP/PCE/SGSIT/OFFS/BV-01-C 1. 测试项说明: Please initiate a GATT connection over BR/EDR to the PTS.Description: Verify that the Implementation Under Test (IUT) can initiate GATT connect request over BR/EDR to PTS.测试项名称: Ple…...

VIC-2D 7.0 为平面样件机械试验提供全视野位移及应变数据软件

The VIC-2D系统是一个完全集成的解决方案,它基于优化的相关算法为平面试样的力学测试提供非接触、全场的二维位移和应变数据,可测量关注区域内的每个像素子集的面内位移,并通过多种张量选项计算全场应变。The VIC-2D 系统可测量超过 2000%变形…...

深入理解Embedding Models(嵌入模型):从原理到实战(下)

🐇明明跟你说过:个人主页 🏅个人专栏:《深度探秘:AI界的007》 🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、什么是 Embedding 2、什么是嵌入模型 二、构建嵌入…...

labview硬件采集

(1)硬件的描述 (2)实验步骤1: (3)实验步骤2 库名/路径的选择要使用32位的开发资料 (4)实验步骤3 (5)实验步骤4 找到DoSetV12() 设置返回类型 设置chan 设置state labv…...

自动驾驶技术栈——DoIP通信协议

一、DoIP协议简介 DoIP,英文全称是Diagnostic communication over Internet Protocol,是一种基于因特网的诊断通信协议。 DoIP协议基于TCP/IP等网络协议实现了车辆电子控制单元(ECU)与诊断应用程序之间的通信,常用于汽车行业的远程诊断、远…...

uniapp引入七鱼客服微信小程序SDK

小程序引入七鱼sdk 1.微信公众平台引入2.代码引入3.在pagesQiyu.vue初始化企业appKey4.跳转打开七鱼客服 1.微信公众平台引入 账号设置->第三方设置->添加插件->搜索 QIYUSDK ->添加 2.代码引入 在分包中引入插件 "subPackages": [{"root":…...

【SSM-SpringMVC(二)】Spring接入Web环境!本篇开始研究SpringMVC的使用!SpringMVC数据响应和获取请求数据

SpringMVC的数据响应方式 页面跳转 直接返回字符串通过ModelAndView对象返回 回写数据 直接返回字符串返回对象或集合 页面跳转: 返回字符串方式 直接返回字符串:此种方式会将返回的字符串与视图解析器的前后缀拼接后跳转 RequestMapping("/con&…...

【AXI总线专题】AXI-FULL-Master

【AXI总线专题】AXI-FULL-Master 1.axi-full概述2.信号定义3.测试4.仿真波形5.附录clogb2函数axi4中的一些参数解释wishbone总线 6.工程文件 概述 参考文档: 《3-2-03米联客2022版AXI4总线专题-20211123.pdf》 《IHI0022E_amba_axi_and_ace_protocol_spec.pdf》 1.a…...

风车OVF镜像:解放AI开发限制的Ubuntu精简系统

风车OVF镜像:解放AI开发限制的Ubuntu精简系统 AI白嫖续杯一站式-风车ovf AI白嫖续杯一站式解决-风车ovf 前言 作为一名AI开发者,我经常在Windows和Linux环境之间切换开发。然而,Windows平台上的各种免费版限制逐渐成为我工作效率的瓶颈。在寻…...

降低60.6%碰撞率!复旦大学地平线CorDriver:首次引入「走廊」增强端到端自动驾驶安全性

导读 复旦大学&地平线新作-CorDriver: 首次通过引入"走廊"作为中间表征,揭开一个新的范式。预测的走廊作为约束条件整合到轨迹优化过程中。通过扩展优化的可微分性,使优化后的轨迹能无缝地在端到端学习框架中训练,从而提高安全…...

查看购物车

一.查看购物车 查看购物车使用get请求。我们要查看当前用户的购物车,就要获取当前用户的userId字段进行条件查询。因为在用户登录时就已经将userId封装在token中了,因此我们只需要解析token获取userId即可,不需要前端再传入参数了。 Control…...

11 配置Hadoop集群-免密登录

一、复习导入 前面的课程中我们在虚拟机上安装并测试使用了hadoop的示例程序wordcount,并且在准备好了集群的同步工具,那接下来,我们就可去配置hadoop集群了。 二、授新 (一)认识ssh命令 SSH(Secure Shell…...

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】金融风控分析案例-10.1 风险数据清洗与特征工程

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 PostgreSQL金融风控分析案例:风险数据清洗与特征工程实战一、案例背景:金融风控数据处理需求二、风险数据清洗实战(一)缺失值…...

《AI大模型应知应会100篇》第60篇:Pinecone 与 Milvus,向量数据库在大模型应用中的作用

第60篇:Pinecone与Milvus,向量数据库在大模型应用中的作用 摘要 本文将系统比较Pinecone与Milvus两大主流向量数据库的技术特点、性能表现和应用场景,提供详细的接入代码和最佳实践,帮助开发者为大模型应用选择并优化向量存储解…...

如何在通义灵码里使用 MCP 能力?

通义灵码编程智能体支持 MCP 工具使用,根据用户需求描述,通过模型自主规划,实现 MCP 工具调用,并深度集成国内最大的 MCP 中文社区——魔搭 MCP 广场,涵盖开发者工具、文件系统、搜索、地图等十大热门领域 2400 MCP 服…...

关于mac配置hdc(鸿蒙)

关于mac配置hdc(鸿蒙) 在最开始配置的hdc -v时候老是出现格式不匹配 于是乎在网上找官网也不行,最后在csdn上找到了这篇文章Mac配置hdc才有的头绪 环境变量的问题 自己做一个简单的总结 首先在访达里面打开ide 打开之后输入下面的命令,一步一步的找…...

几何_平面方程表示_点+向量形式

三维平面方程可以写成: π : n ⊤ X d 0 \boxed{\pi: \mathbf{n}^\top \mathbf{X} d 0} π:n⊤Xd0​ 📐 一、几何直观解释 ✅ 平面是“法向量 平面上一点”定义的集合 一个平面可以由: 一个单位法向量 n ∈ R 3 \mathbf{n} \in \mat…...

iOS safari和android chrome开启网页调试与检查器的方法

手机开启远程调试教程(适用于 Chrome / Safari) 前端移动端调试指南|适用 iPhone 和 Android|WebDebugX 出品 本教程将详细介绍如何在 iPhone 和 Android 手机上开启网页检查器,配合 WebDebugX 实现远程调试。教程包含…...

Matlab 模糊pid控制的永磁同步电机PMSM

1、内容简介 Matlab 226-模糊pid控制的永磁同步电机PMSM 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略基于模糊控制的高精度伺服速度控制器的设计与实现_刘京航...

ActiveMQ 高级特性:延迟消息与优先级队列实战(二)

三、优先级队列实战 3.1 优先级队列概念与应用场景 优先级队列是一种特殊的队列,与普通队列按照先进先出(FIFO)的规则不同,优先级队列中的元素按照其优先级进行排序,在消费消息时,高优先级的消息会优先被…...

ActiveMQ 高级特性:延迟消息与优先级队列实战(一)

引言 在当今的分布式系统开发中,消息中间件扮演着至关重要的角色,而 ActiveMQ 作为一款广泛使用的开源消息中间件,凭借其丰富的特性和良好的性能,深受开发者的青睐。它支持多种消息模型,如点对点和发布 / 订阅&#x…...

动手学深度学习12.4.硬件-笔记练习(PyTorch)

以下内容为结合李沐老师的课程和教材补充的学习笔记,以及对课后练习的一些思考,自留回顾,也供同学之人交流参考。 本节课程地址:31 深度学习硬件:CPU 和 GPU【动手学深度学习v2】_哔哩哔哩_bilibili 本节教材地址&am…...

LAN-402 全国产信号采集处理模块K7-325T(4通道采集)

UD LAN-402全国产化信号处理模块最多支持2通道16bit125Msps的短波采集(或2通道14bit250Msps超短波采集)、2通道16bit310Msps超短波采集,可选配XC7K325T、XC7K410T、JFM7K325T、JFM7K410T FPGA芯片,对外支持PCIe2.0x8接口、千兆网、…...

关于大语言模型的困惑度(PPL)指标优势与劣势

1. 指标本身的局限性 与人类感知脱节: PPL衡量的是模型对词序列的预测概率(基于交叉熵损失),但低困惑度未必对应高质量的生成结果。例如: 模型可能生成语法正确但内容空洞的文本(PPL低但质量差)…...

[Spring AOP 8] Spring AOP 源码全流程总结

Spring AOP总结 更美观清晰的版本在:Github 前面的章节: [Spring AOP 1] 从零开始的JDK动态代理 [Spring AOP 2] 从零开始的CGLIB动态代理 [Spring AOP 3] Spring选择代理 [Spring AOP 4] Spring AOP 切点匹配 [Spring AOP 5] 高级切面与低级切面&#…...

通信网络编程——JAVA

1.计算机网络 IP 定义与作用 :IP 地址是在网络中用于标识设备的数字标签,它允许网络中的设备之间相互定位和通信。每一个设备在特定网络环境下都有一个唯一的 IP 地址,以此来确定其在网络中的位置。 分类 :常见的 IP 地址分为 I…...