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

【树莓派】利用socket改善树莓派3B运行YOLO运力不够

  • 前言
  • 一、版本一
    • 树莓派(客户端)
    • PC端(服务端)
  • 总结


前言

如标题所示。
目标是树莓派作为客户端只负责捕捉画面,PC端运行yolo识别。


一、版本一

树莓派(客户端)

import cv2
import socket
import pickle
import struct
import time# 初始化摄像头
cap = cv2.VideoCapture(0)# 创建套接字并连接到PC
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('192.168.254.254', 8080))  # 替换为PC的实际IP地址# 添加延时,确保连接稳定
time.sleep(1)while True:ret, frame = cap.read()if not ret:print("无法读取摄像头数据")break# 序列化图像try:data = pickle.dumps(frame)except Exception as e:print(f"序列化图像时出现错误: {e}")break# 发送数据长度try:client_socket.sendall(struct.pack("I", len(data)))except Exception as e:print(f"发送数据长度时出现错误: {e}")break# 发送数据try:client_socket.sendall(data)except Exception as e:print(f"发送数据时出现错误: {e}")break# 释放摄像头和关闭连接
cap.release()
client_socket.close()

PC端(服务端)

'''
#Author :susocool
#Creattime:2024/9/19
#FileName:0-PC2PI-server
#Description: 目标是电脑端作为服务端给客户端(pi)传递信息
'''
import cv2
import torch
import socket
import pickle
import struct
import time# 在循环前设置初始时间
start_time = time.perf_counter()# 加载YOLOv5模型
model_path = 'D:\\yolov5-master\\runs\\train\\exp4\\weights\\best.pt'
model = torch.hub.load ( 'D:\\yolov5-master', 'custom', path=model_path, source='local' )# 创建套接字并监听来自树莓派的连接
server_socket = socket.socket ( socket.AF_INET, socket.SOCK_STREAM )
server_socket.bind ( ('0.0.0.0', 8080) )  # 监听所有接口的8080端口
server_socket.listen ( 1 )print ( "等待连接..." )
conn, addr = server_socket.accept ()
print ( f"连接来自 {addr}" )frames = 0
next_frame_time = 0while True :try :# 接收数据长度data_len = struct.unpack ( "L", conn.recv ( struct.calcsize ( "L" ) ) )[0]# 接收数据data = b''while len ( data ) < data_len :packet = conn.recv ( data_len - len ( data ) )if not packet :print ( "连接中断,数据接收失败" )breakdata += packet# 反序列化图像frame = pickle.loads ( data )# 计算延迟和帧率current_time = time.perf_counter ()frames += 1delay = current_time - next_frame_timenext_frame_time = current_timefps = 1 / delay  # 计算帧率# 显示帧率信息cv2.putText ( frame, f'FPS: {fps:.2f}', (10, 20),cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2 )# 将图像转换为YOLOv5模型所需的格式img = cv2.cvtColor ( frame, cv2.COLOR_BGR2RGB )results = model ( img )# 获取检测结果detections = results.pandas ().xyxy[0]  # 使用 pandas 结果annotated_frame = frame.copy ()# 绘制检测框for _, row in detections.iterrows () :x1, y1, x2, y2 = int ( row['xmin'] ), int ( row['ymin'] ), int ( row['xmax'] ), int ( row['ymax'] )label = row['name']conf = row['confidence']color = (0, 255, 0)  # 绿色cv2.rectangle ( annotated_frame, (x1, y1), (x2, y2), color, 2 )cv2.putText ( annotated_frame, f'{label} {conf:.2f}', (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color,2 )# 显示图像cv2.imshow ( 'YOLOv5 Detection', annotated_frame )# 按 'q' 键退出if cv2.waitKey ( 1 ) & 0xFF == ord ( 'q' ) :break# 每20帧才打印帧率,避免过度日志记录if frames % 20 == 0 :print ( f'Frame rate: {fps:.2f}' )except Exception as e :print ( f"处理数据时出现错误: {e}" )break# 释放资源和关闭连接
conn.close ()
server_socket.close ()
cv2.destroyAllWindows ()

注:先运行服务端再到客户端
结果展示

在这里插入图片描述
运行起来比树莓派直接运行快一点,但不多。
帧数的计算 也不知道对不对,总之很少。我认为可以被优化吧。
2024/9/19


总结

这篇文章依旧没有总结


http://www.mrgr.cn/news/30372.html

相关文章:

  • 宠物空气净化器真的有必要买吗?哪款真的能吸毛?
  • C++中string类的使用
  • HarmonyOS开发实战(5.0)实现二楼上划进入首页效果详解
  • Haproxy搭建Web集群
  • Python 中的异步编程:从入门到实践
  • 打破转化阻碍:Xinstall实现全渠道一键拉起
  • C++ —— 关于vector
  • vue2.0+ts注册全局函数和几个递归查找
  • vue h5 蓝牙连接 webBluetooth API
  • 对 JavaScript 原型的理解
  • ELK企业级日志分析系统
  • 从工厂打螺丝到数据库专家(上)
  • 把设计模式用起来!(4) 用不好模式?之原理不明
  • FortiGate 透明模式下配置注意事项和故障排错技巧
  • 维钧团队与广东能源集团携手共创未来
  • 华为、思科、新华三,三大厂商认证到底选择哪一个?
  • 力扣438 找到字符串中所有字母异位词 Java版本
  • 设计模式之外观设计模式
  • 教师专属:高效查询学生考试成绩系统 - 立即体验吧
  • C++:动态内存分配(new、delete 相比 malloc、free的优势)与运算符重载