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

  • 1.代码来源
  • 2.环境配置
  • 3.代码分析:
    • 3.1 主要展示在将detect.py转换为realsensedetect.py的文件部分,大家也可以直接将自己的detect.py 文件改成下面的文件,直接执行即可。
    • 3.2 文件或者文件夹里面文件的对比差异分析软件介绍:
  • 4. 思考与结束语

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

为什么会出现关于realsense D455 +YOLO V5结合的第二篇文章呢,因为上一篇文章是从github上面找到并且跑通之后写的,后来发现怎么也用不到我自己git下来的YOLO V5代码之中,发现还是缺一点东西,所以从各种途径中学习后将原汁原味的从github上找到的YOLO v5代码应用到了里面,最后可以很好的检测啦!

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

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

1.代码来源

这是我第一次将代码更改后放在了github上,希望大家多多star,主要重写了detect.py文件为realsensedetect.py.首先大家如果想用这个代码的话可以去这里git clone 这是代码链接(为了防止链接不过去还是再写在这里 https://github.com/wenyishengkingkong/realsense-D455-YOLOV5.git)。

2.环境配置

大家按照YOLO V5环境配置方法配置环境就可以,或者是向前面的一篇一样前面的一篇,有一个简单的配置。

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

python realsensedetect.py

主要重写了detect.py部分为realsensedetect.py文件。运行结果如下:

3.代码分析:

3.1 主要展示在将detect.py转换为realsensedetect.py的文件部分,大家也可以直接将自己的detect.py 文件改成下面的文件,直接执行即可。

import argparse
import os
import shutil
import time
from pathlib import Pathimport cv2
import torch
import torch.backends.cudnn as cudnn
from numpy import random
import numpy as np
import pyrealsense2 as rsfrom models.experimental import attempt_load
from utils.general import (check_img_size, non_max_suppression, apply_classifier, scale_coords,xyxy2xywh, plot_one_box, strip_optimizer, set_logging)
from utils.torch_utils import select_device, load_classifier, time_synchronized
from utils.datasets import letterboxdef detect(save_img=False):out, source, weights, view_img, save_txt, imgsz = \opt.save_dir, opt.source, opt.weights, opt.view_img, opt.save_txt, opt.img_sizewebcam = source == '0' or source.startswith(('rtsp://', 'rtmp://', 'http://')) or source.endswith('.txt')# Initializeset_logging()device = select_device(opt.device)if os.path.exists(out):  # output dirshutil.rmtree(out)  # delete diros.makedirs(out)  # make new dirhalf = device.type != 'cpu'  # half precision only supported on CUDA# Load modelmodel = attempt_load(weights, map_location=device)  # load FP32 modelimgsz = check_img_size(imgsz, s=model.stride.max())  # check img_sizeif half:model.half()  # to FP16# Set Dataloadervid_path, vid_writer = None, Noneview_img = Truecudnn.benchmark = True  # set True to speed up constant image size inference#dataset = LoadStreams(source, img_size=imgsz)# Get names and colorsnames = model.module.names if hasattr(model, 'module') else model.namescolors = [[random.randint(0, 255) for _ in range(3)] for _ in range(len(names))]# Run inferencet0 = time.time()img = torch.zeros((1, 3, imgsz, imgsz), device=device)  # init img_ = model(img.half() if half else img) if device.type != 'cpu' else None  # run oncepipeline = rs.pipeline()# 创建 config 对象:config = rs.config()# config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)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 streamingpipeline.start(config)align_to_color = rs.align(rs.stream.color)while True:start = time.time()# Wait for a coherent pair of frames(一对连贯的帧): depth and colorframes = pipeline.wait_for_frames()frames = align_to_color.process(frames)# depth_frame = frames.get_depth_frame()depth_frame = frames.get_depth_frame()color_frame = frames.get_color_frame()color_image = np.asanyarray(color_frame.get_data())depth_image = np.asanyarray(depth_frame.get_data())mask = np.zeros([color_image.shape[0], color_image.shape[1]], dtype=np.uint8)mask[0:480, 320:640] = 255sources = [source]imgs = [None]path = sourcesimgs[0] = color_imageim0s = imgs.copy()img = [letterbox(x, new_shape=imgsz)[0] for x in im0s]img = np.stack(img, 0)img = img[:, :, :, ::-1].transpose(0, 3, 1, 2)  # BGR to RGB, to 3x416x416, uint8 to float32img = np.ascontiguousarray(img, dtype=np.float16 if half else np.float32)img /= 255.0  # 0 - 255 to 0.0 - 1.0# Get detectionsimg = torch.from_numpy(img).to(device)if img.ndimension() == 3:img = img.unsqueeze(0)t1 = time_synchronized()pred = model(img, augment=opt.augment)[0]# Apply NMSpred = non_max_suppression(pred, opt.conf_thres, opt.iou_thres, classes=opt.classes, agnostic=opt.agnostic_nms)t2 = time_synchronized()for i, det in enumerate(pred):  # detections per imagep, s, im0 = path[i], '%g: ' % i, im0s[i].copy()s += '%gx%g ' % img.shape[2:]  # print stringgn = torch.tensor(im0.shape)[[1, 0, 1, 0]]  # normalization gain whwhif det is not None and len(det):# Rescale boxes from img_size to im0 sizedet[:, :4] = scale_coords(img.shape[2:], det[:, :4], im0.shape).round()# Print resultsfor c in det[:, -1].unique():n = (det[:, -1] == c).sum()  # detections per classs += '%g %ss, ' % (n, names[int(c)])  # add to string# Write resultsfor *xyxy, conf, cls in reversed(det):xywh = (xyxy2xywh(torch.tensor(xyxy).view(1, 4)) / gn).view(-1).tolist()  # normalized xywhline = (cls, conf, *xywh) if opt.save_conf else (cls, *xywh)  # label formatdistance_list = []mid_pos = [int((int(xyxy[0]) + int(xyxy[2])) / 2), int((int(xyxy[1]) + int(xyxy[3])) / 2)]  # 确定索引深度的中心像素位置左上角和右下角相加在/2min_val = min(abs(int(xyxy[2]) - int(xyxy[0])), abs(int(xyxy[3]) - int(xyxy[1])))  # 确定深度搜索范围# print(box,)randnum = 40for i in range(randnum):bias = random.randint(-min_val // 4, min_val // 4)dist = depth_frame.get_distance(int(mid_pos[0] + bias), int(mid_pos[1] + bias))# 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]  # 冒泡排序+中值滤波label = '%s %.2f%s' % (names[int(cls)], np.mean(distance_list), 'm')plot_one_box(xyxy, im0, label=label, color=colors[int(cls)], line_thickness=3)# Print time (inference + NMS)print('%sDone. (%.3fs)' % (s, t2 - t1))# Stream resultsif view_img:cv2.imshow(p, im0)if cv2.waitKey(1) == ord('q'):  # q to quitraise StopIterationprint('Done. (%.3fs)' % (time.time() - t0))if __name__ == '__main__':parser = argparse.ArgumentParser()parser.add_argument('--weights', nargs='+', type=str, default='yolov5m.pt', help='model.pt path(s)')parser.add_argument('--source', type=str, default='inference/images', help='source')  # file/folder, 0 for webcamparser.add_argument('--img-size', type=int, default=640, help='inference size (pixels)')parser.add_argument('--conf-thres', type=float, default=0.25, help='object confidence threshold')parser.add_argument('--iou-thres', type=float, default=0.45, help='IOU threshold for NMS')parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')parser.add_argument('--view-img', action='store_true', help='display results')parser.add_argument('--save-txt', action='store_true', help='save results to *.txt')parser.add_argument('--save-conf', action='store_true', help='save confidences in --save-txt labels')parser.add_argument('--save-dir', type=str, default='inference/output', help='directory to save results')parser.add_argument('--classes', nargs='+', type=int, help='filter by class: --class 0, or --class 0 2 3')parser.add_argument('--agnostic-nms', action='store_true', help='class-agnostic NMS')parser.add_argument('--augment', action='store_true', help='augmented inference')parser.add_argument('--update', action='store_true', help='update all models')opt = parser.parse_args()print(opt)with torch.no_grad(): # 一个上下文管理器,被该语句wrap起来的部分将不会track梯度detect()

相信大家看到这么多代码已经觉得头疼了,其实更改的就不多的几行,只不过是将顺序的和位置更改了一下。大家如果觉得麻烦,有两个软件可以辅助大家对文件进行对比(说明上面用的到是YOLO V5代码中的v3.1版本,相信换成其他版本应该不会有任何问题,对于其他的目标检测算法没有进行试验,相信应该都是换汤不换药)。

3.2 文件或者文件夹里面文件的对比差异分析软件介绍:

无论是在windows上或者是在ubuntu上面,好用的pycharm软件都是可以应用的,可以在选择文件或者文件夹然后右键有一个compare with的选项就可以进行差异分析了,大家可以对比上面realsensedetect.py文件和detect.py文件两者的差异部分就可以知道到底更改了多少。第二是在Windows上面可以应用diffnity的软件,按道理来说挺好用的!

4. 思考与结束语

为什么需要用到这个realsense深度相机呢,正如上一篇讲述的一样,他会增加一个维度,就是距离,那多的这个维度到底有什么应用呢?首先第一个就是在社交距离检测中,比如你发现检测到一个人没有戴口罩,那么你可以直接检测到他距离摄像头的距离,你就可以提前通知他带好口罩,以避免在入口处人员多的时候交叉感染。这是一个实际的例子。其次,主要应用在三维重建中,我们得到了物体的二维像素点和距离值,就可以通过三维重建或者数学建模来实现三维物体的重新建模,这是很重要的!最后,我们都可以利用已经得到的信息进行三维建模和用pcl库进行更加准确的距离计算,实现在现实世界中的应用!

这是第一在github上git自己的代码,希望能够帮助到您,对我感兴趣的童鞋可以关注我,说不定那一天就可以帮到您

realsense D455深度相机+YOLO V5结合实现目标检测(二)相关推荐

  1. Intel RealSense D455 深度相机

    2020年6月17日发布的相机:Intel RealSense D455 是 Intel RealSense D435i 的升级版. 外观与D435i基本一样,都包含IMU,摄像头具体参数未知,适用范 ...

  2. 【目标检测】YOLO v5 吸烟行为识别检测

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 YOLO v5 吸烟行为目标检测模型:计算机配置.制作数据集.训练.结果分析和使用 前言 相关连接(look评论) 一.计算机配置 p ...

  3. Ubuntu18.04 + kinova joca2机械臂 + RealSense D435i深度相机进行eye to hand手眼标定

    文章目录 前言 一.前期准备 1. RealSense D435i安装 2. Kinova-ROS安装 二.手眼标定环境配置 1. visip 2. aruco_ros 3. easy_handeye ...

  4. BundleFusion使用Intel RealSense D435i深度相机实现

    BundleFusion是目前效果最好的实时稠密三维重建项目,它支持多种类别的深度相机,本次使用英特尔的RealSense D435i深度相机来采集颜色图和深度图,配置的方式如下: 一.环境与资源准备 ...

  5. 二十. 在ROS系统上实现基于PyTorch YOLO v5的实时物体检测

    一. 背景介绍 在我前面的博文 十八.在JetsonNano上为基于PyTorch的物体检测网络测速和选型 中,我介绍过在基于Jetson Nano硬件平台和Ubuntu 18.04 with Jet ...

  6. 目标检测YOLO实战应用案例100讲-基于深度学习的无人机航拍图像目标检测算法研究与应用

    目录 基于深度学习的无人机航拍图像目标检测算法研究与应用 基于深度学习的目标检测相关知识理论

  7. 目标检测YOLO实战应用案例100讲-基于深度学习的光学遥感图像目标检测及价值评估

    目录 基于深度学习的光学遥感图像目标检测方法研究 传统的目标检测方法

  8. 独家 | 在树莓派+Movidius NCS上运用YOLO和Tiny-YOLO完成目标检测(附代码下载)

    作者:Adrian Rosebrock 翻译:吴振东 校对:郑滋 本文约5000字,建议阅读10+分钟 本文教你如何在树莓派和Movidius神经加速棒上运用Tiny-YOLO来实现近乎实时的目标检测 ...

  9. 深度神经网络在基于视觉的目标检测中的应用

    简 介: 目标检测是计算机视觉的一个重要应用方向,深度神经网络的提出极大地帮助基于视觉的目标检测提高了准确度.自2014年以来,深度神经网络在基于视觉的目标检测中被广泛应用,出现了多种算法.本文分别讨 ...

最新文章

  1. 先验概率,后验概率,条件概率,贝叶斯
  2. 创建DLL动态链接库——声明导出法
  3. c语言 编码规范 C Coding Standard
  4. 【NLP】Transformer及其变种
  5. beanutils获取带参数get方法
  6. python中else在循环中的使用(一分钟读懂)
  7. 中文问句匹配冠军团队的NLP读书会笔记分享
  8. 如何卸载office201032位_office2010卸载不了应该如何通过清理注册表解决方法?
  9. 模拟摄像机和网络摄像机的简要对比
  10. 西部世界Filecoin双节点设置 大胆玩出圈
  11. 软件需求包括3个不同的层次 业务需求 用户需求和功能需求
  12. VCS建立仿真生成DVE波形
  13. 查看知乎404问题解决办法
  14. mri计算机系统,MRI的一些基本介绍
  15. android 极光推送解绑,app集成极光推送笔记(angular js)
  16. Mysql RR级别下如何解决幻读
  17. iOS常用功能 - 根据链接生成二维码图片
  18. python中如何放大字体
  19. 圆弧与直线相切画法_机械制图常识:圆弧连接画法
  20. [日推荐]『质安查』买到放心的产品就靠它了

热门文章

  1. Android 好看的搜索界面,大赞Animation
  2. Activiti工作流学习篇(一)
  3. 缓和曲线计算机编程,关于卡西欧fx-4850计算器--“缓和曲线计算”程序中的一些问题,请...
  4. 数学建模 案例分析——“建立可持续发展的社区智能增长策略”
  5. 论文超详细精读|六千字:ST-GCN
  6. 图解 DataX 核心设计原理
  7. 我为什么要花3年熬几百个夜写一本推荐系统的专著?
  8. 窄带物联网,开启万物互联新篇章
  9. Spring_day02
  10. 使用Jlink RTT工具打印日志