参考文章: 基于YOLOv5和DeepSort的目标跟踪
- 下载安装包:
git clone https://github.com/mikel-brostrom/Yolov5_DeepSort_Pytorch.git
- 由于在上一篇文章Jetson Xavier NX使用Yolov5+DeepStream+TensorRT实现CSI摄像头的目标识别及采坑记录中, 已经安装过了torch和torchvision, 因此, 只要下载权重文件即可运行
- 参考这一篇文章: 基于YOLOv5和DeepSort的目标跟踪, 下载deepsort的权重文件ckpt.t7, 并放置在deep_sort/deep/checkpoint文件夹下, 而yolov5的权重文件放置在yolov5/weights文件夹下
- 下载图示的文件, 然后解压到yolov5的文件夹下即可 (这个可以自动下载yolov5的权重文件)
运行指令:
python3 track.py --source /opt/nvidia/deepstream/deepstream-5.0/samples/streams/sample_1080p_h264.mp4 --show-vid
说明: 在Jetson Xavier NX下, 运行的速度大概在每帧图片0.05秒的样子, 速度还是比较快的
新建一个
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摄像头实现目标跟踪, 需要将
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)
这里为了方便, 给出修改的部分
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}'
参考文章: 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摄像头的目标识别及采坑记录