目录

一、原理图

二、硬件介绍及成果展示

三、pc端操作及关键源码

3.1接收树莓派发来的图片

3.2处理接收到的图像

3.3将结果(txt)发回给树莓派

四、树莓派端操作及关键代码

4.1 截图,并上传到电脑

4.2 接受电脑返回的txt

4.3 读取txt

4.4 根据参数做出小车的运动决策

五、项目源码


一、原理图

由于树莓派3b性能有限,所以只能通过电脑进行预测。


二、硬件介绍及成果展示

树莓派3b+

麦克纳姆轮

usb摄像头:640*480

视频展示:

树莓派小车追踪目标_哔哩哔哩_bilibili


三、pc端操作及关键源码

3.1接收树莓派发来的图片

import socket
import os
import sys
import struct
import result
import scanimagedef socket_service():try:s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)# IP地址留空默认是本机IP地址s.bind(('', 8088))s.listen(7)except socket.error as msg:print(msg)sys.exit(1)print("连接开启,等待传图...")sock, addr = s.accept()deal_data(sock, addr)s.close()def deal_data(sock, addr):print("成功连接上 {0}".format(addr))while True:fileinfo_size = struct.calcsize('128sl')buf = sock.recv(fileinfo_size)if buf:filename, filesize = struct.unpack('128sl', buf)fn = filename.decode().strip('\x00')# PC端图片保存路径new_filename = os.path.join('D:\AI_project\gluoncv', fn)recvd_size = 0fp = open(new_filename, 'wb')while not recvd_size == filesize:if filesize - recvd_size > 1024:data = sock.recv(1024)recvd_size += len(data)else:data = sock.recv(1024)recvd_size = filesizefp.write(data)fp.close()sock.close()class_id, scores, bounding_boxs = scanimage.scan(r'D:\AI_project\gluoncv\image.png')# # print('class_id:', class_id)# # print('scores:', scores)# # print('bounding_boxs:', bounding_boxs)os.remove(r'D:\AI_project\gluoncv\image.png')file = open(r"D:\AI_project\gluoncv\result.txt", 'w')file.write(str(class_id))file.write('\n')file.write(str(scores))file.write('\n')file.write(str(bounding_boxs))breakif __name__ == '__main__':socket_service()

将树莓派和PC保持在同一个网络中。使用socket包互相传递信息。

注:手机热点获取树莓派ip地址方法:

(49条消息) 手机热点ip查看(用于远程树莓派)_宇智波洛必达的博客-CSDN博客

3.2处理接收到的图像

调用gluoncv

from gluoncv import model_zoo, data, utils

下载yolo3_darknet53_coco模型,并把树莓派上传的截图放进去进行预测。

预测结果是

class_ID:预测到的目标标签

scores:得分(应该是叫可信度还是啥的?)

bounding_boxs:[预测框左上角坐标,右下角坐标]

net = model_zoo.get_model('yolo3_darknet53_coco', pretrained=True, root='D:\AI_project\gluoncv\model')
x, img = data.transforms.presets.yolo.load_test(dir, short=512)
class_IDs, scores, bounding_boxs = net(x)# print('Shape of pre-processed image:', x.shape)
# print('class:', class_IDs[0][0])
# print('scores:', scores[0][0])
# print('bounding_box:', bounding_boxs[0][0])

另外,bounding_boxs的坐标系如下图:

3.3将结果(txt)发回给树莓派

import socket
import os
import sys
import structdef send_txt():try:s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 192.168.199.1和8088分别为服务端(pc)的IP地址和网络端口s.connect(('192.168.150.59', 8077))except socket.error as msg:print(msg)print(sys.exit(1))while True:# filepath是要被发送图片的路径filepath = r'D:\AI_project\gluoncv\result.txt'fhead = struct.pack(b'128sl', bytes(os.path.basename(filepath), encoding='utf-8'), os.stat(filepath).st_size)s.send(fhead)print('client filepath: {0}'.format(filepath))fp = open(filepath, 'rb')while 1:data = fp.read(1024)if not data:print('{0} 发送成功...'.format(filepath))breaks.send(data)s.close()break

发完后,这一轮的操作就和电脑再没关系了,电脑回到等待接收图像的状态,以此循环。


四、树莓派端操作及关键代码

4.1 截图,并上传到电脑

上传部分和电脑给raspberry发txt的过程完全一直,不再赘述。

4.2 接受电脑返回的txt

和电脑等待接受截图时完全一致。

4.3 读取txt

# @Time   : 2022/9/11 11:15
# @Author :lgl
# @e-mail :GuanlinLi_BIT@163.com
def read_result(file_route):global y1, x2, y2, x1file = open(file_route, 'r')line1 = file.readline()label = file.readline()line3 = file.readline()line4 = file.readline()score = file.readline()line5 = file.readline()line6 = file.readline()coordinate = file.readline()label = (label.split("[")[1]).split(".")[0]score = (score.split("[")[1]).split("]")[0]coordinate = coordinate.split(" ")num = 0for i in coordinate:if len(i) != 1 and len(i) != 0 and num == 0:x1 = inum += 1continueif len(i) != 1 and len(i) != 0 and num == 1:y1 = inum += 1continueif len(i) != 1 and len(i) != 0 and num == 2:x2 = inum += 1continueif len(i) != 1 and len(i) != 0 and num == 3:y2 = inum += 1continuex1 = x1.split("[")x1 = x1[len(x1)-1]y2 = y2.split("]")[0]return label, score, x1, y1, x2, y2read_result("/home/pi/Desktop/gluoncv/result.txt")
print(x1,y1,x2,y2)

4.4 根据参数做出小车的运动决策

from motor import *
from random import randomdef move(s, x1, y1, x2, y2, t):s = float(s)x1 = float(x1)y1 = float(y1)x2 = float(x2)y2 = float(y2)t = float(t)if s < 0.5:  # 得分过低,找不到目标,需要随机移动,直到找到东西forward(t)x = random()if x > 0.7:left_move(t)if x < 0.3:right_move(t)if 0.6 > x > 0.4:back(t)else:if x2 - x1 < 300:  # 找到了目标,但是距离太远,需要接近目标forward(t)print("forward")else:if x1 > 640 or x2 > 640 or x1 < 0 or x2 < 0 or y1 > 480 or y2 > 480 or y1 < 0 or y2 < 0:# 图像显示不全,证明距离太近了,需要后退back(t / 2)print("back")else:if (x1 + x2) / 2 > 400:  # 目标偏左right_move(t)print("right_move")if (x1 + x2) / 2 < 240:  # 目标偏右left_move(t)print("left_move")if 240 <= (x1 + x2) / 2 <= 400:  # 位置合适,不动,接着拍摄即可print("OK!!!")

五、项目源码

树莓派小车实现目标追踪(yolo3,coco数据集,gluoncv,树莓派和PC信息交互)-Python文档类资源-CSDN文库

树莓派小车实现目标追踪(coco数据集,gluoncv,树莓派和PC信息交互)相关推荐

  1. 目标检测coco数据集点滴介绍

    目标检测coco数据集点滴介绍 COCO数据集介绍 MS COCO 是google 开源的大型数据集, 分为目标检测.分割.关键点检测三大任务, 数据集主要由图片和json 标签文件组成. coco数 ...

  2. coco数据集目标检测论文_目标检测coco数据集点滴介绍

    目标检测coco数据集点滴介绍 1.  COCO数据集介绍 MS COCO 是google 开源的大型数据集, 分为目标检测.分割.关键点检测三大任务, 数据集主要由图片和json 标签文件组成. c ...

  3. 目标检测——COCO数据集上SOTA模型的学习笔记

    1 GitHub上SOTA模型(By 2020.04.22) GitHub上目前开源的SOTA模型是YOLOv5x6-TTA,:

  4. 树莓派python编程小车_树莓派小车教程(三)——软件代码

    原标题:树莓派小车教程(三)--软件代码 树莓派小车教程(三)--软件代码 2017-07-07 琳小豆 HelloWorld少儿编程 树莓派小车教程 (三) 在上一次教程中,我们已经完成了硬件连接. ...

  5. 制作coco数据集,并在mmdetection上实验

    一.dataset2coco 首先将标注好的json和img放在同一个文件夹中,取名为images. format.py 统一修改json中的img_path.将路径修改为统一格式.×××.jpg f ...

  6. ResNeSt 登顶COCO数据集(目标检测,实例分割,全景分割)

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 编辑:Cver 本文作者:张航 https://zhuanlan.z ...

  7. 中科院aibench_中科院发布目标追踪数据集,万条视频,150万个边界框 | 快来下载...

    动栗 发自 凹非寺 量子位 出品 | 公众号 QbitAI 中科院发布了一个目标追踪数据集,叫做Got-10k.很大,很精致. 它包含了超过10,000条视频,主角都是在现实世界里移动的物体,分成56 ...

  8. 《南溪的目标检测学习笔记》——COCO数据集的学习笔记

    1 COCO数据集 COCO数据集下载链接:COCO_download 1.1 数据概览 数据集大小 train: 118287张 train+val: 123287张 val: 5000张 目标数量 ...

  9. 中科院发布了目标追踪数据集,1万多条视频,150万个边界框 | 快来下载

    动栗 发自 凹非寺  量子位 出品 | 公众号 QbitAI 中科院发布了一个目标追踪数据集,叫做Got-10k.很大,很精致. 它包含了超过10,000条视频,主角都是在现实世界里移动的物体,分成5 ...

最新文章

  1. export 和export default不同的引入方式
  2. 构建之法阅读笔记06
  3. JS中怎样比较两个 时分秒 格式的时间大小
  4. url参数中有+、空格、=、%、、#等特殊符号的问题解决
  5. POJ 1422 Air Raid (最小路径覆盖)
  6. 手机只能签荣耀!最忠诚代言人胡歌喊你去天猫超品日
  7. C/C++ 中判断某一文件或目录是否存在
  8. MVC的初步认识理论
  9. 控制属性修改时间,控制时间,联合主键
  10. C++语言的技术性规则
  11. 数学建模美赛E题数据获取
  12. 【JavaSE基础】09-网络编程
  13. 商城系统演示站 -多用户商城系统
  14. LIVE2D模型加载软件Live2DViewerEX(steam),LIVE2Dviewer(LIVED2D社区),LIVE2Dviewer(github),Ppet(github)让你的老婆活灵活现
  15. 小白入门之海康威视摄像机的二次开发
  16. 数据治理系列1:数据治理框架【解读分析】
  17. Hadoop 1.x 和 Hadoop 2.x 有什么区别?
  18. 今天简单地把vw/vh总结一下
  19. python写文件numpy_Numpy | 23 文件读写
  20. 基于vi构建强大的IDE

热门文章

  1. c语言程序设计第14章在线测试,《C语言程序计》第14章在线测试.doc
  2. redis设置key当天到期、当月到期
  3. 公务员备考(二) 行测 言语理解(40题35分钟,正确率80%)
  4. findbugs简介
  5. 游戏创业团队的技术选型之Unreal
  6. python指南针_如何用用Python 函数库 APIs 编写?指南针在这里
  7. 山东济南协和计算机学院,山东协和学院 --- 计算机学院
  8. vmware下Ubuntu挂载U盘
  9. Unity(新机)安装失败解决办法
  10. 2-基于51单片机的蓝牙智能台灯设计