日本yolov8用户案例

2023-12-18 15:50:07

这篇文章转载来自SWITCH?SCIENCE的SuzukiSumiya,本篇文章转载已获作者授权。

原文链接来自:https://www.switch-science.com/blogs/magazine/jetson-maker-faire-tokyo-2023

1.引言

这篇文章来自SWITCH?SCIENCE的SuzukiSumiya?在Maker?Faire?Tokyo?2023上演示了通过模拟人手臂的姿态来控制机械臂。演示的内容是使用USB摄像头通过图像识别估计手臂,并将mycobot制作成类似的手臂形状。

视频链接:https://youtu.be/h1H6pSvhQxQ

该项目主要使用Ultralytics?YOLOv8来进行姿态的估计,结合机器视觉和机械臂的控制等功能。本篇文章我们将复写这个项目,一步一步的开始如何建立起这个项目。

2.技术介绍

YOLOv8介绍

Ultralytics?YOLOv8?是一种尖端、最先进?(SOTA)?模型,它建立在先前?YOLO?版本成功的基础上,并引入了新功能和改进,以进一步提高性能和灵活性。?YOLOv8?的设计目标是快速、准确且易于使用,使其成为各种对象检测和跟踪、实例分割、图像分类和姿态估计任务的绝佳选择。https://docs.ultralytics.com/

Ultralytics?YOLOv8?is?a?cutting-edge,?state-of-the-art?(SOTA)?model?that?builds?upon?the?success?of?previous?YOLO?versions?and?introduces?new?features?and?improvements?to?further?boost?performance?and?flexibility.?YOLOv8?is?designed?to?be?fast,?accurate,?and?easy?to?use,?making?it?an?excellent?choice?for?a?wide?range?of?object?detection?and?tracking,?instance?segmentation,?image?classification?and?pose?estimation?tasks.

YOLOv8,作为这一系列的最新版本,包含以下特点和改进:

  1. 更快的检测速度:YOLO?系列以其快速的检测速度而闻名,每个后续版本都在这方面进行了优化。
  2. 更高的准确性:通过使用更先进的神经网络架构和学习算法,YOLOv8?可能会提高物体检测的准确性。
  3. 更好的泛化能力:改进的算法可能更有效地处理不同类型的图像数据,包括在复杂背景和不同光照条件下的检测。
  4. 适应性和可扩展性的增强:新版本可能会提供更多的定制选项和设置,使其能够更好地适应不同的应用场景和需求。
  5. 优化的资源使用:对计算效率的改进可能会使?YOLOv8?在资源有限的设备上运行得更好,如在移动设备或嵌入式系统中。

简单点说,给它一张图片识别,YOLOv8能够快速的识别出图片中的物体,并且将它标记出来。

myCobot?280?M5

myCobot?280?M5?是?Elephant?Robotics?和?M5Stack?合作开发的最小、最轻的?6?轴协作机器人。?它采用一体化模块化设计,重量仅为850克,格外轻巧。?配备6个高性能伺服电机,具有响应快、惯量低、转动平稳等特点。

The?myCobot?280?M5?is?the?smallest?and?lightest?6-axis?collaborative?robot?developed?in?collaboration?by?Elephant?Robotics?and?M5Stack.?It?adopts?an?integrated?modular?design,?weighing?only?850?grams,?making?it?exceptionally?lightweight.?Equipped?with?6?high-performance?servo?motors,?it?features?rapid?responsiveness,?low?inertia,?and?smooth?rotation.

mycobot?280?支持多平台开发Linux,Windows,MacOS,并且控制接口全部开源支持目前市面上主流的编程语言python,c++/c#等。

python-pymycobot?mycobot系列的控制库https://github.com/elephantrobotics/pymycobot

Jetson?Orin?Nano

Jetson?Orin?Nano?是?NVIDIA?的一种嵌入式人工智能计算模块,具有高性能和低功耗。它基于?NVIDIA?的?Orin?芯片,该芯片具有?12?个?Arm?核心和一个?NVIDIA?Ampere?GPU。这使?Jetson?Orin?Nano?能够运行复杂的人工智能应用程序,例如机器视觉、自然语言处理和增强现实。

https://developer.nvidia.com/buy-jetson?product=all&location=JP

  1. 开发过程

开发环境:

软件:

操作系统:Linux

编译语言:Python

python?库:

import?cv2
import?math
import?time
from?ultralytics?import?YOLO
from?pymycobot.mycobot?import?MyCobot

yolov8模型:yolov8n-pose.pt

https://docs.ultralytics.com/tasks/pose/

硬件:

USB?摄像头*1

myCobot?280?M5Stack?*1

Jetson?Orin?Nano*1

显示器,键盘鼠标*1

代码实现

yolov8姿态估计模型-yolov8n-pose

yolov8有训练好的姿态估计模型,可以直接使用。姿态估计是一项任务,其涉及识别图像中特定点的位置,通常被称为关键点。这些关键点可以代表物体的各种部位,如关节、地标或其他显著特征。关键点的位置通常表示为一组2D?[x,?y]?或3D?[x,?y,?visible]?坐标。

简单使用的方法:

import?torch
from?ultralytics.yolov8?import?YOLO
import?cv2

#引入模型
model?=?YOLO('yolov8n-pose.pt')
#打开图片
img?=?cv2.imread('image.jpg')
# 将图片引入模型
results?=?model(img)

#?展示结果
for?r?in?results:
????im_array?=?r.plot()??#?绘制包含预测结果的BGR?numpy数组
????im?=?Image.fromarray(im_array[...,?::-1])??#?RGB?PIL图像
????im.show()??#?显示图像
????im.save('results.jpg')??#?保存图像

在项目中需要获取人手比的手腕,肘部和肩部的x,y坐标来进行计算角度,然后将相同的角度发送到mycobot的第二第三关节。

Code:

		if?keypoints_tensor?is?not?None?and?keypoints_tensor.size(1)?>?0:
        ?#?提取特定关键点的坐标和置信度
			x_mimi?=?keypoints_tensor[0][3][0]
			y_mimi?=?keypoints_tensor[0][3][1]
			conf_mimi?=?confidence_score[0][3]
			
			x_kosi?=?keypoints_tensor[0][13][0]
			y_kosi?=?keypoints_tensor[0][13][1]
			conf_kosi?=?confidence_score[0][13]
			
			x_kata?=?keypoints_tensor[0][5][0]
			y_kata?=?keypoints_tensor[0][5][1]
			conf_kata?=?confidence_score[0][5]
			
			x_hizi?=?keypoints_tensor[0][7][0]
			y_hizi?=?keypoints_tensor[0][7][1]
			conf_hizi?=?confidence_score[0][7]
			
			x_te?=?keypoints_tensor[0][9][0]
			y_te?=?keypoints_tensor[0][9][1]
			conf_te?=?confidence_score[0][9]

然后计算腰部到肩部之间的角度,这个角度主要关注的是上半身的一个简化模型,可能用于模拟肩部的运动或整个上半身的倾斜。

#计算AB之间的向量
vector_AB?=?(x_kata?-?x_hizi,?y_kata?-?y_hizi)
#用函数计算这个向量的角度
angle_rad1?=?math.atan2(vector_AB[1],?vector_AB[0])
#将角度从弧度转为度
angle_deg1?=?math.degrees(angle_rad1)
#计算后调整的角度值用于控制机械臂
mycobot1?=?int(angle_deg1)-90

接下来在计算手部,肘部,肩部三个关键点形成的角度,这个角度涉及更复杂的姿势分析,因为它包括了从手部到膝部再到肩部的整个链条,结合这两种角度的计算,可以让机械臂模仿人体姿势更加精准和自然。

			x1=x_te?#手部的x,y
			y1=y_te
			
			x2=x_hizi?#肘部的X,Y
			y2=y_hizi
			
			x3=x_kata?#?肘部的x,y
			y3=y_kata
			
			
			#定义三个做标点
			point1?=?(x1,?y1)
			point2?=?(x2,?y2)
			point3?=?(x3,?y3)
			#?计算向量
			vector1?=?(x2?-?x1,?y2?-?y1)
			vector2?=?(x3?-?x2,?y3?-?y2)
			#?计算向量长度?
			length1?=?math.sqrt(vector1[0]?**?2?+?vector1[1]?**?2)
			length2?=?math.sqrt(vector2[0]?**?2?+?vector2[1]?**?2)
			#?计算点积
			dot_product?=?vector1[0]?*?vector2[0]?+?vector1[1]?*?vector2[1]
			#?计算角度(弧度)
			angle_rad?=?math.atan2(vector2[1],?vector2[0])?-?math.atan2(vector1[1],?vector1[0])
        #?如果角度向右弯曲则为?0?度
        #?如果角度从右向左转动则为?180?度
        #?如果在一条直线上,则为?-90?度(或?+90?度,以哪个为准)
			
          if?angle_rad?>?math.pi:
				angle_rad?-=?2?*?math.pi
			elif?angle_rad?<?-math.pi:
				angle_rad?+=?2?*?math.pi
			#?将角度转换为度数
			mycobot2?=?int(math.degrees(angle_rad))

最后将获取到的角度,通过条件判断控制机械臂进行手臂的模拟运动。

#机械臂在计算的mycobot1,mycobot2可接受的范围内分别是是?-180?至?180?度和?-155?至?155?度			
if?-180?<=?mycobot1?and?mycobot1?<=?180?and?-155?<=?mycobot2?and?mycobot2?<=?155?and?conf_hizi?>=?0.75:
?????????????#符合条件led灯会变蓝
				mc.send_angles?([90,-mycobot1,mycobot2,0,-90,0],100)
				mc.set_color(0,?0,?255)
				print("A点的角度(度数法):",?conf_hizi)
			else:#?不符合条件LED等会变红
				print("A点的角度(度数法):",?conf_hizi)
				mc.set_color(255,?0,?255)

  1. 总结

SuzukiSumiya在maker?faire?tokyo?2023上展示了Jetson?Orin?Nano?和mycobot以及yolov8-pose相结合实现了一个非常有趣的demo。可以学到多个方面的知识和技能,包括计算机视觉、机器人编程、数学计算,以及如何将这些元素结合起来创建一个交互式的系统

下面的视频是对SuzukiSumiya做这个项目的一个访谈。

https://www.youtube.com/watch?v=DB5WiUQVhek

如果你有什么其他有趣的项目,也可以联系我们,我们会分享你的项目在各个平台让大家都关注到。

文章来源:https://blog.csdn.net/m0_71627844/article/details/135062016
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。