目标识别与双目测距(1)环境搭建:Ubuntu+yolov5+pcl库

环境情况

  • ubuntu 18.04 → 20.04(最终)
  • Python 3.6.13 → 3.8(最终)
  • Anaconda3-2021.05

目标识别:YOLOv5相关

  • 1、安装git
sudo apt install git
  • 2、使用以下代码来下载源码并直接安装:
git clone https://github.com/ultralytics/yolov5
  • 3、配置YOLO v5的环境
cd yolov5
pip install -r requirements.txt

问题及解决

  • 1、fatal: unable to access

    • 错误显示:
    (base) wjq@wjqUbuntu1804:~$ git clone https://github.com/ultralytics/yolov5
    正克隆到 'yolov5'...
    fatal: unable to access 'https://github.com/ultralytics/yolov5/': gnutls_handshake() failed: The TLS connection was non-properly terminated.
    
    • 解决方式1:
      • ①更新 Git:
        sudo apt update
        sudo apt upgrade git
        
      • ②更新 CA 证书:
        sudo apt install --reinstall ca-certificates
        
    • 解决方式2:把命令行里的http改为git重新执行
  • 2、问题443

    • 解决途径的参考:https://blog.youkuaiyun.com/liubang00001/article/details/141334472
    • 随意打开一个终端,输入一下代码安装软件包:
      • 出现[y/n],均写y
        sudo apt update
        sudo apt install openssh-server
        
    • 验证:sudo systemctl status ssh,接着输入q可以返回命令行,于是可以重新
  • 3、版本问题

    • 问题:安装requirements.txt时很多版本找不到。
    • 解决:可能是anaconda默认下载的Python版本太低,我碰上该问题时用Python3.6无法下载,在虚拟环境搭建Python3.8则可以使用。

创建虚拟环境

  • 0、conda很慢时,可以换镜像源
    • 通过命令行直接添加:
    conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
    conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r/
    conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2/
    conda config --set channel_priority strict
    
  • 1、尝试创建虚拟环境:
    conda create -n py36 python=3.6.13
    
  • 2、如果还是失败,可以尝试指定国内镜像加速
    conda create -n py36 python=3.6.13 -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
    
  • 3、成功时
    在这里插入图片描述
  • 4、激活环境:conda activate py36
  • 5、返回到 base 环境:conda activate base
  • 6、查看当前的活跃环境:conda info --envs
  • 7、列出所有的 Conda 环境,当前激活的环境会有一个星号(*)标记。:
    # conda environments:
    #
    base                  *  /home/user/anaconda3
    py36                     /home/user/anaconda3/envs/py36
    

安装 PyTorch

  • Python3.6对应下载:pip install torch==1.10.0+cpu torchvision==0.11.1+cpu torchaudio==0.10.0+cpu -f https://download.pytorch.org/whl/torch_stable.html
  • 检查是否成功安装:pip list | grep torch
    在这里插入图片描述

VMware虚拟机中的Ubuntu识别不到摄像头

  • 在Windows上识别得到外接摄像头,但ubuntu上识别不到
    • ①关闭虚拟机,在Windows上启动该服务 在这里插入图片描述

      • 此时在:虚拟机>可移动设备可见这些选项了
      • STEREOLABS ZED-2:这是一款完整的硬件设备,具备双目摄像头、深度传感器、IMU(惯性测量单元)、RGB 摄像头等,能够直接用于捕捉深度图像、视频流、环境映射、对象跟踪等。
      • STEREOLABS ZED-2 HID INTERFACE:这是一个接口模式,主要用于支持 ZED-2 摄像头的通信。通过 HID 接口,摄像头和计算机之间可以通过标准 USB 连接进行数据传输,但 HID 本身并不具备图像采集和处理功能,它仅是作为摄像头与计算机的通讯桥梁。
        在这里插入图片描述
    • ②关闭虚拟机,打开“首选项”
      在这里插入图片描述
      在这里插入图片描述

    • 查看清楚USB接口对应的都是什么设备

      ls -l /dev/video*
      lsusb
      

      在这里插入图片描述

    • 如果以上选中后仍无法识别,可按序完成如下参考方法:

    • 最后连接上摄像头的效果(本处采用的是双目相机)

      • 安装chesse:sudo apt-get install cheese
      • 开启ubuntu的茄子相机:cheese
        在这里插入图片描述

安装yolov5期间的问题总结

  • 问题1:识别不到摄像头(解决如上)

  • 问题2:库等不匹配相关问题

    • 不匹配1:yolov5 要求的是 torchvision 0.9.1

      • 解决:
        # S1.卸载当前torchvision 版本
        pip uninstall torchvision
        # S2.安装正确版本的 torchvision
        pip install torchvision==0.9.1
        # S3.确认 torch 版本是否匹配
        python -c "import torch; print(torch.__version__)"
        # S4.如果当前版本与 YOLOv5 要求的不匹配,安装兼容版本
        pip install torch==1.8.1
        # S5.检查依赖是否正确
        pip install -r requirements.txt
        
    • 不匹配2:YOLOv5 需要版本 >=2.2 的 tensorboard

      • 解决:
        # S1.安装或更新 tensorboard 到合适的版本:
        pip install tensorboard>=2.2
        #	如果你已经安装了 tensorboard,可以通过以下命令检查版本:
        pip show tensorboard
        # S2.确保安装所有依赖
        pip install -r requirements.txt
        # S3.再次运行
        python detect.py
        
    • 不匹配3:opencv-python版本不匹配

      • YOLOv5 要求的是 opencv-python==4.5.2.54。
      • 解决
        # S1.卸载当前的 opencv-python 版本
        pip uninstall opencv-python
        # S2.安装所需版本
        pip install opencv-python==4.5.2.54
        # S3.再次运行
        python detect.py
        
    • 插曲:不匹配1-3都是由于虚拟环境切换错了,所以导致库匹配出了很多问题(吃一堑:虚拟环境名要区别好,运行前要多留心虚拟环境对不对)

  • 问题3:yolov5中模型不够新。

    • 由于py38对应的是改动过的yolov5_stereo_Pro,所以包中的模型yolov5s有点问题。在这里插入图片描述
    • 解决:重新下载官方权重
      wget https://github.com/ultralytics/yolov5/releases/download/v6.0/yolov5s.pt
      
  • 问题4:输入图片尺寸不匹配代码

    • 解决:
      • 使用 v4l2-ctl 命令查看虚拟机当前连接的摄像头所拍摄图片的分辨率是多少
        # 安装 v4l-utils(如果未安装)
        sudo apt update
        sudo apt install v4l-utils
        # 查看连接的摄像头设备:
        v4l2-ctl --list-devices
        	# 输出中如“/dev/video0”,即是你的摄像头设备
        # 查看当前摄像头分辨率:
        v4l2-ctl --device=/dev/video0 --get-fmt-video
        # 列出当前摄像头所有支持的分辨率
        v4l2-ctl --device=/dev/video0 --list-formats-ext
        
      • (#暂缓,先换用笔记本自带摄像头测试yolov5的安装情况,后续再进一步修改匹配ZED2双目相机的代码)
  • 问题5:模型文件(yolov5s.pt)的结构和代码不匹配

    • 主要是 缺少 SPPF 模块的定义,SPPF是YOLOv5 v6.0 及之后版本新增的模块,用于提高检测速度和精度。原先代码可能是基于旧版本 YOLOv5,而下载的权重文件是基于新版本模型结构。
      在这里插入图片描述
    • 解决:由于我不想更新代码(为了让yolov5匹配后续结合双目相机),故尝试使用旧版本的权重(不包含 SPPF 的版本)
      # 回退模型权重
      wget https://github.com/ultralytics/yolov5/releases/download/v5.0/yolov5s.pt -O yolov5s.pt
      # 再运行
      python detect.py --source 0
      
  • 问题6:摄像头又连不上了

    • 原因:采用ctrl+z退出摄像头,导致进程被挂起,使得原先分配摄像头的source 0被挂起,摄像头因此被轮分配给source 1了。

    • 解决

      # 查看后台挂起的任务
      jobs
      	# 输出类似:
      	# [1]+  Stopped                 python detect.py --source 0
      # 恢复到前台(%1 对应任务编号)
      fg %1
      # 如果不想恢复,直接终止挂起进程
      kill %1
      
    • 把两次ctrl+z挂起的进程鲨掉之后,重新在可移动设备断开后再连接,即可重新给摄像头分配source 0了。 在这里插入图片描述

    • 恢复后,按 Ctrl + C退出,不要用ctrl+z 退出了

  • 摄像头匹配+yolov5安装成功后:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • yolov5改v8


双目测距相关

点云图:采用pcl生成

双目相机:ZED2相机

### 使用YOLOv5双目摄像头进行物体检测 #### 准备工作 为了在双目摄像头上使用YOLOv5进行物体检测,需先安装必要的软件环境。这通常包括Python及其相关OpenCV用于处理视频流以及PyTorch作为深度学习框架支持YOLOv5模型运行。 #### 获取YOLOv5模型 可以从官方GitHub仓下载预训练好的YOLOv5权重文件[^3]。对于特定应用场景还可以进一步微调此模型以提高准确性。 #### 配置双目相机 设置好硬件连接之后,在程序里初始化两个独立的Camera对象来分别读取左眼和右眼视角下的图像帧。确保两台设备同步良好以便后续计算视差图时能获得准确数据。 ```python import cv2 left_camera = cv2.VideoCapture(0) # 假设左侧为默认内置 webcam 或者指定 ID 的 USB 设备 right_camera = cv2.VideoCapture(1) while True: ret_left, frame_left = left_camera.read() ret_right, frame_right = right_camera.read() if not (ret_left and ret_right): break # 后续操作... ``` #### 执行目标检测 加载YOLOv5网络并对每一对立体影像执行前向传播得到边界框预测结果;注意这里要对两张图片都做同样的推理过程从而保持一致性。 ```python from ultralytics import YOLO model = YOLO('yolov5s.pt') # 加载轻量级版本或其他自定义路径下保存的最佳 checkpoint 文件 def detect_objects(image): results = model(image) boxes = [] confidences = [] class_ids = [] for result in results.pred[0]: box = result[:4].cpu().numpy() # 提取坐标信息 confidence = float(result[4]) # 得分即概率值 class_id = int(result[-1]) # 类别索引 boxes.append(box.tolist()) confidences.append(confidence) class_ids.append(class_id) return boxes, confidences, class_ids for i in range(num_frames): _, imgL = left_camera.read() _, imgR = right_camera.read() bboxes_L, scores_L, labels_L = detect_objects(imgL) bboxes_R, scores_R, labels_R = detect_objects(imgR) ``` #### 计算三维位置 通过比较同一物体在同一时刻于左右两侧成像的位置差异——即所谓的“视差”,可以推断出该物距离观察者的远近关系。具体来说就是寻找匹配的关键点对,并基于已知基线长度(Baseline)、焦距等参数求解实际空间坐标。 ```python stereo_calib_params = { 'baseline': ..., # 单位毫米 'focal_length': ..., } disparity_map = compute_disparities(bboxes_L, bboxes_R) depth_map = stereo_to_depth(disparity_map, **stereo_calib_params) def get_3d_coordinates(bbox_l, bbox_r, depth_value): center_x_l = (bbox_l[0]+bbox_l[2])/2. center_y = (bbox_l[1]+bbox_l[3])/2. z = baseline * focal / disparity x = (center_x_l - cx)*z/fx y = (cy-center_y)*z/fy return np.array([x,y,z]) ``` 以上代码片段展示了基本思路和技术要点,但在真实环境中还需要考虑更多细节比如光照变化影响、遮挡情况处理等问题[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值