realsense D455深度相机+YOLO V5结合实现目标检测(一)

本文介绍了如何结合Realsense D455深度相机与YOLOv5目标检测算法,实现在检测物体的同时获取其相对于相机的距离。通过github上的开源代码,详细解析了环境配置、代码逻辑,包括相机流的配置、深度图像处理、YOLOv5模型的应用,以及关键函数的分析。最终展示了实时目标检测与距离测量的实现过程。
摘要由CSDN通过智能技术生成

realsense D455深度相机+YOLO V5结合实现目标检测(二)第二篇链接

可以实现将D435,D455深度相机和yolo v5结合到一起,在识别物体的同时,还能测到物体相对与相机的距离。

说明一下为什么需要做这个事情?1.首先为什么需要用到realsense D455深度相机? 因为他是普通的相机还加了一个红外测距的东西,所以其他二维图像一样,能够得到三维世界在二维像素平面的投影,也就是图片,但是我们损失了一个深度的维度以后得到的都是投影的东西,比如说苹果可以和足球一样大,因为我们不知道深度也就是物体距离相机的距离信息,所以我们需要一个深度相机来实现测距离。2.为什么需要用到yolo算法?因为他在实时性和准确率方面都可以,可以应用于工农业生产当中,所以肯定很需要。所以才会有这二者的结合的必要性!

1.代码来源

首先感谢github上的yuanyuanyuan killnice大佬将自己的代码开源出来,这是我第一次用realsense深度相机去实现将其与目标检测的yolo v5 算法结合在一起,实现2.5维的检测吧。首先大家如果想用这个代码的话可以去这里git clone yuanyuanyuan killnice大佬的代码 (为了防止链接不过去还是再写在这里 https://github.com/killnice/yolov5-D435i.git)。

2.环境配置

首选clone下yuanyuanyuan killnice大佬的代码后,在命令行运行:

pip install -r requirements.txt
pip install pyrealsense2

然后cd到进入工程文件夹下执行:

python main_debug.py

第一次运行会自动下载yolov5l6.pt文件,大约140MB左右,如果由于网速原因不能自动下载,请手动在yolo v5的github上自己下载。运行结果如下:
检测试图

3.代码分析:

3.1如何用realsense在python下面调用的问题:

这个的来源是从realsense的官方文档中来的 realsense的官方python文档,如果你对他的其他应用感兴趣可以去这里看一看。

import pyrealsense2 as rs
import numpy as np
import cv2

# Configure depth and color streams
pipeline = rs.pipeline()
config = rs.config()
# config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)
# config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30)

config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)
config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30)

# Start streaming
pipeline.start(config)

try:
    while True:

        # Wait for a coherent pair of frames: depth and color
        frames = pipeline.wait_for_frames()
        # 深度图
        depth_frame = frames.get_depth_frame()
        # 正常读取的视频流
        color_frame = frames.get_color_frame()
        if not depth_frame or not color_frame:
            continue

        # Convert images to numpy arrays
        depth_image = np.asanyarray(depth_frame.get_data())
        color_image = np.asanyarray(color_frame.get_data())
        # print(f"depth_image shape: {depth_image.shape} color_image shape: {color_image.shape}")
        print(f"depth_image value: {depth_image}")   # 里面0值很多,还有很多1900左右的值      300mm 单位是毫米=30厘米=0.3米
        # depth_image shape: (480, 640) color_image shape: (480, 640, 3)
        # 深度图是单通道  颜色图是三通道的

        # Apply colormap on depth image (image must be converted to 8-bit per pixel first)
        # 在深度图像上应用colormap(图像必须先转换为每像素8位)
        depth_colormap = cv2.applyColorMap(cv2.convertScaleAbs(depth_image, alpha=0.03), cv2.COLORMAP_JET)

        # Stack both images horizontally
        images = np.hstack((color_image, depth_colormap))

        # Show images
        cv2.namedWindow('RealSense', cv2.WINDOW_AUTOSIZE)
        cv2.imshow('RealSense', images)
        key = cv2.waitKey(1)
        if key & 0xFF == ord('q') or key == 27:
            cv2.destroyAllWindows()
            break

finally:

    # Stop streaming
    pipeline.stop()

这就是用python调用realsense D455深度相机的程序。

3.2 对main_debug.py文件的分析:

import pyrealsense2 as rs
import numpy as np
import cv2
import random
import torch
import time
#调用各种库
#从文件的构造中不难看出是用了下面的几个函数:分别是get_mid_pos(frame,box,depth_data,randnum),dectshow(org_img, boxs,depth_data),
#主函数。
# model = torch.hub.load('ultralytics/yolov5', 'yolov5s')
#
model = torch.hub.load('ultralytics/yolov5', 'yolov5l6')
model.conf = 0.5

def get_mid_pos(frame,box,depth_data,randnum):
#这个函数就是简单的从给出的图片、框、深度数据、可以选择的迭代次数
    distance_list = []
    mid_pos = [(box[0] + box[2])//2, (box[1] + box[3])//2] #确定索引深度的中心像素位置左上角和右下角相加在/2
    min_val = min(abs(box[2] - box[0]), abs(box[3] - box[1])) #确定深度搜索范围
    #print(box,)
    for i in range(randnum):
        bias = random.randint(-min_val//4, min_val//4)
        dist = depth_data[int(mid_pos[1] + bias), int(mid_pos[0] + bias)]
        cv2.circle(frame, (int(mid_pos[0] + bias), int(mid_pos[1] + bias)), 4, (255,0,0), -1)
        #print(int(mid_pos[1] + bias), int(mid_pos[0] + bias))
        if dist:
            distance_list.append(dist)
    distance_list = np.array(distance_list)
    distance_list = np.sort(distance_list)[randnum//2-randnum//4:randnum//2+randnum//4] #冒泡排序+中值滤波
    #print(distance_list, np.mean(distance_list))
    return np.mean(distance_list)
def dectshow(org_img, boxs,depth_data):
#在原图像上画框和深度信息写在图像上
    img = org_img.copy()
    for box in boxs:
        cv2.rectangle(img, (int(box[0]), int(box[1])), (int(box[2]), int(box[3])), (0, 255, 0), 2)
        dist = get_mid_pos(org_img, box, depth_data, 24)
        cv2.putText(img, box[-1] + str(dist / 1000)[:4] + 'm',
                    (int(box[0]), int(box[1])), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)
    cv2.imshow('dec_img', img)

if __name__ == "__main__":
    # Configure depth and color streams
#这是主要是将上面1中提到的realsense在python中的调用。
    pipeline = rs.pipeline()
    config = rs.config()
    config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 60)
    config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 60)
    # Start streaming
    pipeline.start(config)
    try:
        while True:
            # Wait for a coherent pair of frames: depth and color
            frames = pipeline.wait_for_frames()
            depth_frame = frames.get_depth_frame()
            color_frame = frames.get_color_frame()
            if not depth_frame or not color_frame:
                continue
            # Convert images to numpy arrays

            depth_image = np.asanyarray(depth_frame.get_data())

            color_image = np.asanyarray(color_frame.get_data())

            results = model(color_image)
            boxs= results.pandas().xyxy[0].values
            #boxs = np.load('temp.npy',allow_pickle=True)
            dectshow(color_image, boxs, depth_image)

            # Apply colormap on depth image (image must be converted to 8-bit per pixel first)
            depth_colormap = cv2.applyColorMap(cv2.convertScaleAbs(depth_image, alpha=0.03), cv2.COLORMAP_JET)
            # Stack both images horizontally
            images = np.hstack((color_image, depth_colormap))
            # Show images
            cv2.namedWindow('RealSense', cv2.WINDOW_AUTOSIZE)
            cv2.imshow('RealSense', images)
            key = cv2.waitKey(1)
            # Press esc or 'q' to close the image window
            if key & 0xFF == ord('q') or key == 27:
                cv2.destroyAllWindows()
                break
    finally:
        # Stop streaming
        pipeline.stop()

4. 结束语

从以前在csdn上查找到自己写这是第一次,觉得这是一种进步,希望能够帮助到别人也感谢yuanyuanyuan killnice大佬,还有yolo v5的作者,反正就是感谢开源吧对我感兴趣的童鞋可以关注我,说不定那一天就可以帮到您

目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
Jeson Nano是一款NVIDIA推出的边缘计算设备,搭载了高性能GPU。Yolo v5是一种目标检测算法,具备高准确率和实时性能。对于使用Jeson Nano部署Yolo v5实现目标检测,以下是一些步骤和说明: 首先,需要将Yolo v5的源代码克隆到Jeson Nano设备上。可以在GitHub上找到相应的代码库,并使用git命令进行克隆。 然后,需要下载预训练的权重文件。这些权重文件包含了已经在大型数据集上训练得到的模型参数。可以在Yolo v5的代码库中找到下载链接,并将权重文件保存到设备的合适位置。 接下来,需要安装Jeson Nano上的依赖软件包。这些软件包包括PyTorch、OpenCV和其他需要的库。可以使用pip命令安装这些软件包,确保安装的版本与Yolo v5兼容。 然后,需要通过命令行界面进入Yolo v5的源代码目录,并执行相应的命令来进行目标检测。可以使用预训练的权重文件进行推理,输出每个目标的边界框、置信度和类别。 最后,可以通过对输出进行后处理,例如筛选掉低置信度的目标、进行非极大值抑制等,来提高目标检测的准确性。 需要注意的是,Jeson Nano相比于更强大的设备,其计算能力和内存容量有限。因此,在部署Yolo v5时,可能需要调整模型的大小、选择合适的输入大小等,以适应Jeson Nano的硬件限制。 总之,使用Jeson Nano部署Yolo v5实现目标检测需要下载源代码、预训练权重文件,安装相关依赖软件包,并通过命令行界面进行推理。同时,还需要进行后处理来提高检测的准确性。
评论 81
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值