Jetson Xavier NX使用yolov5+deepsort实现CSI摄像头的目标跟踪

文章目录

  • 安装过程
  • 运行效果
  • 用python代码来打开CSI摄像头
  • 实现CSI摄像头目标跟踪
  • 报错: AttributeError: 'NoneType' object has no attribute 'shape'
  • 运行效果

参考文章: 基于YOLOv5和DeepSort的目标跟踪

安装过程

  1. 下载安装包: git clone https://github.com/mikel-brostrom/Yolov5_DeepSort_Pytorch.git
  2. 由于在上一篇文章Jetson Xavier NX使用Yolov5+DeepStream+TensorRT实现CSI摄像头的目标识别及采坑记录中, 已经安装过了torch和torchvision, 因此, 只要下载权重文件即可运行
  3. 参考这一篇文章: 基于YOLOv5和DeepSort的目标跟踪, 下载deepsort的权重文件ckpt.t7, 并放置在deep_sort/deep/checkpoint文件夹下, 而yolov5的权重文件放置在yolov5/weights文件夹下
  4. 下载图示的文件, 然后解压到yolov5的文件夹下即可 (这个可以自动下载yolov5的权重文件)

Jetson Xavier NX使用yolov5+deepsort实现CSI摄像头的目标跟踪_第1张图片


运行效果

运行指令:
python3 track.py --source /opt/nvidia/deepstream/deepstream-5.0/samples/streams/sample_1080p_h264.mp4 --show-vid
说明: 在Jetson Xavier NX下, 运行的速度大概在每帧图片0.05秒的样子, 速度还是比较快的

用python代码来打开CSI摄像头

新建一个test_csi.py文件, 然后使用python3 test_csi.py来运行下面的程序, 启动CSI摄像头

# coding=utf-8
import cv2
 

def show_camera():
    cap = cv2.VideoCapture("nvarguscamerasrc ! video/x-raw(memory:NVMM), width=1280, height=720, format=(string)NV12, framerate=(fraction)60/1 ! nvvidconv flip-method=0 ! video/x-raw, width=1280, height=720, format=(string)BGRx ! videoconvert ! video/x-raw, format=(string)BGR ! appsink", cv2.CAP_GSTREAMER)
 
    while cap.isOpened():
        flag, img = cap.read()
        cv2.imshow("CSI Camera", img)
        kk = cv2.waitKey(1)
        if kk == ord('q'):  
            break
 
    cap.release()
    cv2.destroyAllWindows()
    
 
if __name__ == "__main__":
    show_camera()

问题: 程序运行之后不报错, 但是没有打开摄像头的界面, 且没有任何输出;

解决方案:

  • 先查看python3对应的opencv版本:
  • python3 -c "import cv2; print(cv2.__version__)"
  • 我一开始的版本是4.5.3, 改为3.3.1的版本就可以了
  • 因此: 用python3 -c "import cv2; print(cv2.__file__)"查看4.5.3的安装路径, 然后直接删除即可 (需确保已经安装过3.3.1版本)

实现CSI摄像头目标跟踪

当用上面的程序可以正常地打开摄像头后, 为了用CSI摄像头实现目标跟踪, 需要将 yolov5/utils/dataset.py文件进行更改, 主要就是将cv2.VideoCapture(0)改为:

cap = cv2.VideoCapture("nvarguscamerasrc ! video/x-raw(memory:NVMM), width=1280, height=720, format=(string)NV12, framerate=(fraction)60/1 ! nvvidconv flip-method=0 ! video/x-raw, width=1280, height=720, format=(string)BGRx ! videoconvert ! video/x-raw, format=(string)BGR ! appsink", cv2.CAP_GSTREAMER)

Jetson Xavier NX使用yolov5+deepsort实现CSI摄像头的目标跟踪_第2张图片

这里为了方便, 给出修改的部分dataset.py文件

for i, s in enumerate(sources):  # index, source
    # Start thread to read frames from video stream
    print(f'{i + 1}/{n}: {s}... ', end='')
    if 'youtube.com/' in s or 'youtu.be/' in s:  # if source is YouTube video
        check_requirements(('pafy', 'youtube_dl'))
        import pafy
        s = pafy.new(s).getbest(preftype="mp4").url  # YouTube URL
    s = eval(s) if s.isnumeric() else s  # i.e. s = '0' local webcam
    
    if s == 0:
        print('\nthis is a CSI camera')
        cap = cv2.VideoCapture("nvarguscamerasrc ! video/x-raw(memory:NVMM), width=1280, height=720, format=(string)NV12, framerate=(fraction)60/1 ! nvvidconv flip-method=0 ! video/x-raw, width=1280, height=720, format=(string)BGRx ! videoconvert ! video/x-raw, format=(string)BGR ! appsink", cv2.CAP_GSTREAMER)
    else:
        cap = cv2.VideoCapture(s)

    assert cap.isOpened(), f'Failed to open {s}'

报错: AttributeError: ‘NoneType’ object has no attribute ‘shape’

Jetson Xavier NX使用yolov5+deepsort实现CSI摄像头的目标跟踪_第3张图片

参考文章: https://blog.csdn.net/weixin_42899627/article/details/115129085

解决方案: 重启 nvargus-daemon

sudo systemctl restart nvargus-daemon

运行效果

由于模型推理速度和准确性之间存在影响, 为了满足推理速度和准确性的需求, 可以选择 Yolov5 合适的模型进行自动下载
执行指令:
python3 track.py --source 0 --yolo_weights yolov5s.pt --img 640 --show-vid       (最小的模型)
python3 track.py --source 0 --yolo_weights yolov5x6.pt --img 1280 --show-vid   (最大的模型)

说明一下:

  • 用yolov5s.pt的话 (最小14.8MB) 大约为20帧每秒
  • 使用yolov5x.pt (178.5MB) 大约9~10帧每秒
  • 而使用yolov5x6.pt (284.5MB) 大约就只有3~4帧每秒了, 且运行比较卡顿
  • 下面的图片, 我采用的是yolov5s.pt这个权重文件
  • 另外, 用CSI摄像头检测的效果没有检测mp4文件的效果好



上一篇文章: Jetson Xavier NX使用Yolov5+DeepStream+TensorRT实现CSI摄像头的目标识别及采坑记录

你可能感兴趣的:(ROS,目标跟踪)