本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——13使用Resnet-Bin

本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——13使用Resnet-Bin

​ 根据前面的内容,目前已经可以获取到resnet的bin模型

1 .Resnet的bin测试

​ 这里给大家一个测试视频里面黑线的demo,大家可以用来测试自己的黑线识别精度

import cv2
import numpy as np
from hobot_dnn import pyeasy_dnn as dnndef convert_bgr_to_nv12(cv_image):yuv_image = cv2.cvtColor(cv_image, cv2.COLOR_BGR2YUV)y_channel = yuv_image[:, :, 0]u_channel = yuv_image[::2, ::2, 1]v_channel = yuv_image[::2, ::2, 2]uv_channel = np.empty((u_channel.shape[0], u_channel.shape[1] * 2), dtype=u_channel.dtype)uv_channel[:, ::2] = u_channeluv_channel[:, 1::2] = v_channelnv12_image = np.concatenate((y_channel.flatten(), uv_channel.flatten()))return nv12_imagedef process_frame(cv_image, models, original_width, original_height):# 将图像缩放到模型期望的尺寸cv_image_resized = cv2.resize(cv_image, (224, 224), interpolation=cv2.INTER_LINEAR)nv12_image = convert_bgr_to_nv12(cv_image_resized)# 使用模型进行推理outputs = models[0].forward(np.frombuffer(nv12_image, dtype=np.uint8))outputs = outputs[0].buffer# 假设模型输出是在224x224图像上的比例坐标x_ratio, y_ratio = outputs[0][0][0][0], outputs[0][1][0][0]# 将比例坐标转换为原始视频帧的像素坐标x_pixel = int(x_ratio * original_width)y_pixel = int(y_ratio * original_height)return x_pixel, y_pixeldef main():models = dnn.load('/root/model/resnet18_224x224_nv12.bin')cap = cv2.VideoCapture("/root/model/03.avi")# 确定视频编解码器和创建VideoWriter对象fourcc = cv2.VideoWriter_fourcc(*'XVID')out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480))while cap.isOpened():ret, frame = cap.read()if not ret:breakx, y = process_frame(frame, models,640,480)cv2.circle(frame, (x, y), radius=5, color=(0, 0, 255), thickness=-1)# 写入帧到输出文件out.write(frame)# cv2.imshow('Frame', frame)if cv2.waitKey(1) & 0xFF == ord('q'):breakcap.release()out.release()  # 释放VideoWriter对象cv2.destroyAllWindows()if __name__ == "__main__":main()

2.Resnet的bin使用

​ 如果按照前文的Resnet训练转化过程,这里唯一需要注意的就是加载时候,对于图片大小的244控制以及对于输出反归一化,

​ 下面把代码给大家大家有需要可以使用

#!/usr/bin/env python3
# -*- coding: utf-8 -*-import rclpy
from rclpy.node import Node
from geometry_msgs.msg import Twist
from sensor_msgs.msg import Image
import cv2
import numpy as np
from hobot_dnn import pyeasy_dnn as dnn
def convert_bgr_to_nv12(cv_image):# 首先将BGR图像转换为YUV格式yuv_image = cv2.cvtColor(cv_image, cv2.COLOR_BGR2YUV)# 提取Y通道y_channel = yuv_image[:, :, 0]# 对U和V通道进行下采样u_channel = yuv_image[::2, ::2, 1]v_channel = yuv_image[::2, ::2, 2]# 交错U和V通道以形成UV通道uv_channel = np.empty((u_channel.shape[0], u_channel.shape[1] * 2), dtype=u_channel.dtype)uv_channel[:, ::2] = u_channeluv_channel[:, 1::2] = v_channel# 将Y通道和UV通道合并为NV12格式nv12_image = np.concatenate((y_channel.flatten(), uv_channel.flatten()))return nv12_image
class ResNetControlNode(Node):def __init__(self, name):super().__init__(name)self.cmd_vel_pub = self.create_publisher(Twist, "/cmd_vel", 10)self.subscription = self.create_subscription(Image, "/image", self.image_callback, 10)self.models = dnn.load('/root/model/resnet18_224x224_nv12.bin')# 微调PID参数self.Kp = 0.8  # 提高比例系数以增加对偏差的反应速度self.Kd = 0.5  # 减少微分系数以避免过冲self.Ki = 0.1  # 引入积分系数以帮助消除稳态误差(如果之前未使用)self.Target_value = 320.0self.last_Err = 0.0self.total_Err = 0.0self.output = 0.0self.twist = Twist()def image_callback(self, msg):# 使用CvBridge将ROS图像消息转换为OpenCV图像np_arr = np.frombuffer(msg.data, np.uint8)# 使用OpenCV解码MJPG数据image_np = cv2.imdecode(np_arr, cv2.IMREAD_COLOR)# 假设模型需要224x224大小的图像cv_image_resized = cv2.resize(image_np, (224, 224), interpolation=cv2.INTER_LINEAR)nv12_image = convert_bgr_to_nv12(cv_image_resized)# 转换图像格式以符合模型输入要求(如果需要)# 模型推理outputs = self.models[0].forward(np.frombuffer(nv12_image, dtype=np.uint8))outputs = outputs[0].bufferx, y = int(640 * outputs[0][0][0][0]), int(480 * outputs[0][1][0][0])# print(x,y)# PID控制逻辑self.Error = self.Target_value - xself.total_Err += self.Errorself.output = self.Kp * self.Error + self.Kd * (self.Error - self.last_Err)self.last_Err = self.Errorself.twist.linear.x = 0.4self.twist.angular.z = self.output / 100self.cmd_vel_pub.publish(self.twist)print(f"( {x}, {y} )  output = {int(self.output)}")def main(args=None):rclpy.init(args=args)node = ResNetControlNode("resnet_control_node")rclpy.spin(node)node.destroy_node()rclpy.shutdown()if __name__ == "__main__":main()

3.总结

​ 到目前为止整个智能车地平线组的单个拆分任务已经结束了,下面就是编写总控制进行逻辑的判断了

​ 下一节给大家分享一下,我再摸索过程中看到大佬的以及交流得到的思路。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/890589.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安装CPU版的torch(清华源)

1、安装指令: pip3 install torch torchvision torchaudio -i https://pypi.tuna.tsinghua.edu.cn/simple2、验证torch是否安装成功 // 使用python验证 import torch print(torch.__version__)能正常打印版本即表示安装成功,如下图

‘pnpm’ 不是内部或外部命令,也不是可运行的程序或批处理文件。

‘pnpm’ 不是内部或外部命令,也不是可运行的程序或批处理文件。 1.情况: npm -v 和 node -v的都正常就是 pnpm-v 无效 检查环境变量也没看出问题 2.分析 没有正确添加环境变量 3.解决 找到npm的全局安装目录 npm list -g --depth 0这里出现了npm的全局安装…

Java 日志类库

Java 日志库是最能体现 Java 库在进化中的渊源关系的,在理解时重点理解日志框架本身和日志门面,以及比较好的时间等。要关注其历史渊源和设计(比如桥接),而具体在使用时查询接口即可,否则会陷入 JUL&#x…

聚类之轮廓系数

Silhouette Score(轮廓系数)是用于评估聚类质量的指标之一。它衡量了数据点与同簇内其他点的相似度以及与最近簇的相似度之间的对比。 公式 对于一个数据点 i: a(i): 数据点 i 到同簇内其他点的平均距离(簇内不相似度&#xff…

问题小记-达梦数据库报错“字符串转换出错”处理

最近遇到一个达梦数据库报错“-6111: 字符串转换出错”的问题,这个问题主要是涉及到一条sql语句的执行,在此分享下这个报错的处理过程。 问题表现为:一样的表结构和数据,执行相同的SQL,在Oracle数据库中执行正常&…

【电路笔记 信号】Metastability 平均故障间隔时间(MTBF)公式推导:进入亚稳态+退出亚稳态+同步器的可靠性计算

这是一个简化的电路分析模型。图2中的典型触发器包括主锁存器、从锁存器和去耦反相器(这个结构类似 主从边沿触发器)。 在亚稳态中,主锁存器的节点A、B的电压电平大致在逻辑“1”(VDD)和“0”(GND)之间。确切的电压电平…

【C++】B2066救援题目分析和解决讲解

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯 题目💯 题目分析每个屋顶计算的元素 💯 思路解析1. **读取输入**2. **计算屋顶时间**3. **结果精确取整** 💯 完整解决代码&#x1f4a…

springboot创建web项目

一、创建项目 二、导入依赖&#xff08;pom.xml&#xff09; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schem…

RAID5原理简介和相关问题

1、RAID5工作原理 2、RAID5单块硬盘的数据连续吗&#xff1f; 3、RAID5单块硬盘存储的是原始数据&#xff0c;还是异或后的数据&#xff1f; 4、RAID5的分块大小 ‌RAID5的分块大小一般选择4KB到64KB之间较为合适‌。选择合适的分块大小主要取决于以下几个考量因素&#xff1…

重温设计模式--模板方法模式

文章目录 一、模板方法模式概述二、模板方法模式UML图三、优点1代码复用性高2可维护性好3扩展性强 四、缺点五、使用场景六、C 代码示例1七、 C 代码示例2 一、模板方法模式概述 定义&#xff1a;定义一个操作中的算法骨架&#xff0c;而降一些步骤延迟到子类中。模板方法使得…

Websocket客户端从Openai Realtime api Sever只收到部分数据问题分析

目录 背景 分析 解决方案 背景 正常情况下&#xff0c;会从Openai Realtime api Sever收到正常的json数据,但是当返回音频数据时&#xff0c;总会返回非json数据。这是什么问题呢&#xff1f; 分析 期望的完整响应数据如下&#xff1a; {"session": {"inp…

运动控制卡网络通讯的心跳检测之C#上位机编程

本文导读 今天&#xff0c;正运动小助手给大家分享一下如何使用C#上位机编程实现运动控制卡网络通讯的心跳检测功能。 01 ECI2618B硬件介绍 ECI2618B经济型多轴运动控制卡是一款脉冲型、模块化的网络型运动控制卡。控制卡本身最多支持6轴&#xff0c;可扩展至12轴的运动控制…

SpringBoot状态机

Spring Boot 状态机&#xff08;State Machine&#xff09;是 Spring Framework 提供的一种用于实现复杂业务逻辑的状态管理工具。它基于有限状态机&#xff08;Finite State Machine, FSM&#xff09;的概念&#xff0c;允许开发者定义一组状态、事件以及它们之间的转换规则。…

基于图注意力网络的两阶段图匹配点云配准方法

Two-stage graph matching point cloud registration method based on graph attention network— 基于图注意力网络的两阶段图匹配点云配准方法 从两阶段点云配准方法中找一些图匹配的一些灵感。文章提出了两阶段图匹配点云配准网络&#xff08;TSGM-Net&#xff09; TSGM-Ne…

uniapp跨平台开发---webview调用app方法

1.app端实现 注意:为了实现实时通信,app端页面是.nvue 代码实现 <template><view class"content"><view class"web-view"><web-view class"web-view" :src"url" ref"webview" onPostMessage"o…

【专题】2024年悦己生活消费洞察报告汇总PDF洞察(附原数据表)

原文链接&#xff1a; https://tecdat.cn/?p38654 在当今时代背景下&#xff0c;社会发展日新月异&#xff0c;人们的生活方式与消费观念正经历深刻变革。MoonFox 月狐数据的《2024 年悦己生活消费洞察报告》聚焦于这一充满活力与变化的消费领域。随着就业、婚姻等社会压力的…

生产看板管理系统涵盖哪些方面

嘿&#xff0c;各位搞生产管理的朋友&#xff0c;肯定都碰到过些麻烦事儿吧。我就寻思着&#xff0c;能不能弄出个 “明明白白” 的工作场地呢&#xff1f;让员工和管理人员都能随时查查生产进度&#xff0c;一发现生产里有啥问题就能立马知道。 生产进度不好追踪生产过程不清…

密码学期末考试笔记

文章目录 公钥加密之前的部分 (非重点&#xff0c;关注工具怎么用&#xff0c;和性质)一、对称加密 (symmetric ciphers)1. 定义 二、PRG (伪随机数生成器)1. 定义2. 属性 三、语义安全 (Semantic Security)1. one-time key2. 流密码是语义安全的 四、分组密码 (Block Cipher)1…

workman服务端开发模式-应用开发-vue-element-admin挂载websocket

一、项目根目录main.js添加全局引入 import /utils/websocket 二、在根目录app.vue 中初始化WebSocket连接 <template><div id"app"><router-view /></div> </template><script>import store from ./store export default {n…

我的 2024 年终总结

2024 年&#xff0c;我离开了待了两年的互联网公司&#xff0c;来到了一家聚焦教育机器人和激光切割机的公司&#xff0c;没错&#xff0c;是一家硬件公司&#xff0c;从未接触过的领域&#xff0c;但这还不是我今年最重要的里程碑事件 5 月份的时候&#xff0c;正式提出了离职…