基于yolov5+fastreid+deepsort的TensorRT目标跟踪(C++版)复现过程

基于yolov5+fastreid+deepsort的TensorRT目标跟踪

大部分的多目标跟踪项目都是用Python写的,但是C++版本能够用TensorRT进行加速,适合在边缘端部署,所以公司要求用C++版。
这个博客复现了GitHub上一个C++版的yolov5+fastreid+deepsort的TensorRT项目,通过复现这个项目来得到一点启发。
项目地址:yolov5+fastreid+deepsort+tensorrt

我在自己的目录下新建了一个文件夹来存放项目:
在这里以 /test 代称:
首先将项目克隆到服务器:
在/test目录下执行:

sudo git clone https://github.com/linghu8812/yolov5_fastreid_deepsort_tensorrt.git

创建项目运行环境,根据项目的GitHub地址中README.md文件指导:

第一步:创建镜像

在/test目录执行指令:

cd  test-yolo-deep-fast
docker build -t tensorrt_tracker:0.1.0_rc .

以下是踩坑记录,中间有的操作是无用功,正在解决方法会用加粗提示
不想看踩坑记录的直接往下翻找到我修改后的DockerFIle文件复制过去就行
踩坑原因是对docker镜像和相关指令不熟悉的原因。

问题1:出现了:bash: curl: command not found错误
但是我查看curl的版本他有显示,说明是有curl的,所以我就猜测是版本的问题,所以就更新了curl版本。
基于yolov5+fastreid+deepsort的TensorRT目标跟踪(C++版)复现过程_第1张图片
Linux–wget、curl command not found解决方案
基于yolov5+fastreid+deepsort的TensorRT目标跟踪(C++版)复现过程_第2张图片
【Error】解决curl: command not found

乱改了一通还是不行,就问了学姐,最后学姐告诉我这个curl报错是因为,在docker里没有curl指令,而我查到的curl版本和更新curl版本都是在虚拟机上进行的,所以我再怎么折腾docker里都没有,最后只要在# apt-get 安装这部分加一个curl即可。
所以有的时候还是要多问,本来很简单的问题浪费了一个上午的时间,可惜。
问题一解决方法:# apt-get 安装这部分加一个curl即可
在这里插入图片描述
问题2:在解压用curl 指令下载的zip文件出现以下问题:
基于yolov5+fastreid+deepsort的TensorRT目标跟踪(C++版)复现过程_第3张图片
出现这个问题主要原因是下载的zip文件其实只是一个网页文件,并不是真正的zip文件,如下图所示,我用vim查看了改文件发现是404NotFound,离大谱。基于yolov5+fastreid+deepsort的TensorRT目标跟踪(C++版)复现过程_第4张图片
针对这个问题我查了很多博客,主要是有两种解决方法,但是对我都不适用,先记录下这两种解决方法:

  1. 用curl -L 重定向End-of-central-directory signature not found
  2. 用 jar xvf 指令:装入归档文件时出现了一个错误,End-of-central-directory signature not found.

使用jar操作文件
ubuntun下使用:sudo apt-get install -f jar,
centos使用 yum -y install java-1.6.0-openjdk-devel
安装jar工具。
当jar工具安装完成后,再次执行:jar xvf

真正解决问题的博客:一种可能的原因 gzip: stdin: not in gzip format
看了这个博客我才知道为什么下载的zip文件是网页文件而不是真正的zip文件,因为我们的curl 指令把整个html page当成压缩包下载下来了。所以我们下载zip文件时的下载连接应该用压缩包的链接而不是网页链接。
我对比了原作者的Dockerfile文件中下载opencv步骤的代码和我更改后的代码发现了两个不同,
第一要用curl -OL 指令而不是curl -O
第二,下载链接复制的文件名是什么就是什么,不能更改。

问题2解决方法:修改DockerFile文件中安装opencv部分的代码
改成以下指令:

RUN bash -xc "curl -OL https://gitee.com/mirrors/opencv/repository/archive/4.x.zip  && ls /home/install/ && unzip 4.x.zip && ls /home/install/ && mv opencv-4.x opencv && \
    curl -OL https://gitee.com/orzchenyuming/opencv_contrib/repository/archive/master.zip && unzip master.zip  && ls /home/install/ && mv opencv_contrib-master opencv_contrib && \
    pushd opencv>&1 > /dev/null && mkdir build && pushd build>&1 > /dev/null && \
    cmake -D WITH_QT=ON \
          -D WITH_CUDA=ON \
          -D BUILD_TIFF=ON \
          -D BUILD_TESTS=OFF \
          -D BUILD_PERF_TESTS=OFF \
          -D OPENCV_GENERATE_PKGCONFIG=ON \
          -D CMAKE_INSTALL_PREFIX=/usr/local \
          -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules/ \
          -D BUILD_opencv_xfeatures2d=OFF  .. && \
    make -j4 && make -j4 install && pkg-config --cflags opencv4 && echo '/usr/local/lib' > /etc/ld.so.conf.d/opencv.conf && \
    popd 2>&1 > /dev/null && popd 2>&1 > /dev/null && rm -rf 4.x.zip && rm -rf master.zip"

主要修改的地方就是第一、二行的curl指令部分和最后一行的 rm 指令部分。
在这里插入图片描述
看到这里说明opencv成功安装了,激动!!!

问题3:pip的安装问题
关于pip的安装出现了一些问题,当时忘记记录具体问题了,大概是访问太慢导致下载不成功,参考了很多博客之后将 RUN pip3 指令修改成如下:
(具体参考的博客也忘记记录了,如果以后找到了再补上)
问题3解决方法:修改DockerFile文件中安装pip3部分的代码
改成以下指令:

RUN pip3 --default-timeout=100 install -U pip && pip3 install torch torchvision mxnet-cu102 onnx-simplifier -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com\
    && pip3 --default-timeout=100 install --ignore-installed -U PyYAML

问题4:安装tensorrt出现的问题
原来的DockerFile中是用curl指令下载tensorrt的deb包,但是仍然产生了同问题2一样的错误,即下载的deb文件实际上是HTML文件。我试了很多方法都不能下载正确的deb文件。
然后看了很多博客,看到说要下载到本机再传到虚拟机中,我当时感觉这个方法不适用于在docker中,因为我的宿主机也无法下载正确的deb文件。走头无路的我又重新看了一下docker部署镜像的相关指令,看到了COPY指令能够将宿主机的文件传到docker镜像中,我仿佛看到了希望。

问题3解决方法:
第一步:先想办法实现Win和linux的文件互传
Windows与Linux之间互传文件的方法
救命了的博客!!!

下载了WinSCP能够实现Win和linux的文件互传

第二步:在win中下载tensorrt的deb包将它传到linux中

第三步:修改DockerFile文件中安装tensorrt部分的代码
改成如下:

# tensorrt 安装
COPY nv-tensorrt-repo-ubuntu1804-cuda10.2-trt7.1.3.4-ga-20200617_1-1_amd64.deb /home/install/nv-tensorrt-repo-ubuntu1804-cuda10.2-trt7.1.3.4-ga-20200617_1-1_amd64.deb
RUN bash -xc " ls /home/install/ && \
    dpkg -i nv-tensorrt-repo-ubuntu1804-cuda10.2-trt7.1.3.4-ga-20200617_1-1_amd64.deb \
    && apt-key add /var/nv-tensorrt-repo-cuda10.2-trt7.1.3.4-ga-20200617/7fa2af80.pub && apt-get update\
    && apt-get -y install tensorrt && rm -rf nv-tensorrt-repo-ubuntu1804-cuda10.2-trt7.1.3.4-ga-20200617_1-1_amd64.deb"

其中COPY指令是将宿主机中deb文件挂载到docker镜像中。

这四个问题解决了之后再执行

docker build -t tensorrt_tracker:0.1.0_rc .

就能成功构建项目环境镜像

终于构建成功了,热泪盈眶
在这里插入图片描述

在这里放上我更改后的DockerFile文件:

FROM nvidia/cuda:10.2-cudnn8-devel-ubuntu18.04
RUN sed -i s:/archive.ubuntu.com:/mirrors.tuna.tsinghua.edu.cn/ubuntu:g /etc/apt/sources.list
RUN cat /etc/apt/sources.list
RUN apt-get clean
RUN apt-get -y update --fix-missing
WORKDIR /home/install/

# apt-get 安装
RUN apt-get update
RUN apt-get install software-properties-common -y
RUN add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
RUN rm /etc/apt/sources.list.d/cuda.list /etc/apt/sources.list.d/nvidia-ml.list && \
    apt-get update && apt-get -y upgrade && apt-get -y install ssh vim build-essential cmake git libgtk2.0-dev pkg-config \
    libavcodec-dev libavformat-dev libswscale-dev python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev \
    libjasper-dev libdc1394-22-dev qtbase5-dev qtdeclarative5-dev python3-pip zip curl fastjar rar unzip unrar 

# opencv 安装
RUN bash -xc "curl -OL https://gitee.com/mirrors/opencv/repository/archive/4.x.zip  && ls /home/install/ && unzip 4.x.zip && ls /home/install/ && mv opencv-4.x opencv && \
    curl -OL https://gitee.com/orzchenyuming/opencv_contrib/repository/archive/master.zip && unzip master.zip  && ls /home/install/ && mv opencv_contrib-master opencv_contrib && \
    pushd opencv>&1 > /dev/null && mkdir build && pushd build>&1 > /dev/null && \
    cmake -D WITH_QT=ON \
          -D WITH_CUDA=ON \
          -D BUILD_TIFF=ON \
          -D BUILD_TESTS=OFF \
          -D BUILD_PERF_TESTS=OFF \
          -D OPENCV_GENERATE_PKGCONFIG=ON \
          -D CMAKE_INSTALL_PREFIX=/usr/local \
          -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules/ \
          -D BUILD_opencv_xfeatures2d=OFF  .. && \
    make -j4 && make -j4 install && pkg-config --cflags opencv4 && echo '/usr/local/lib' > /etc/ld.so.conf.d/opencv.conf && \
    popd 2>&1 > /dev/null && popd 2>&1 > /dev/null && rm -rf 4.x.zip && rm -rf master.zip"

# pip3 安装
RUN pip3 --default-timeout=100 install -U pip && pip3 install torch torchvision mxnet-cu102 onnx-simplifier -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com\
    && pip3 --default-timeout=100 install --ignore-installed -U PyYAML

# tensorrt 安装
COPY nv-tensorrt-repo-ubuntu1804-cuda10.2-trt7.1.3.4-ga-20200617_1-1_amd64.deb /home/install/nv-tensorrt-repo-ubuntu1804-cuda10.2-trt7.1.3.4-ga-20200617_1-1_amd64.deb
RUN bash -xc " ls /home/install/ && \
    dpkg -i nv-tensorrt-repo-ubuntu1804-cuda10.2-trt7.1.3.4-ga-20200617_1-1_amd64.deb \
    && apt-key add /var/nv-tensorrt-repo-cuda10.2-trt7.1.3.4-ga-20200617/7fa2af80.pub && apt-get update\
    && apt-get -y install tensorrt && rm -rf nv-tensorrt-repo-ubuntu1804-cuda10.2-trt7.1.3.4-ga-20200617_1-1_amd64.deb"

第二步:在镜像中部署运行项目

我们在第一步中已经成功构建了项目的环境镜像,现在在镜像中部署运行项目。
由于我对docker 基本没有了解所以踩坑过程非常多,先在这里放我运行成功的指令,再一步步记录我的踩坑过程。

docker run -itd --gpus all --network host --v {项目在宿主机中位置}:{挂载到镜像中位置} tensorrt_tracker:0.1.0_rc bash

比如我的是:

docker run -itd --gpus all --network host --v {项目在宿主机中位置}:{挂载到镜像中位置} tensorrt_tracker:0.1.0_rc bash

这些参数会在我的踩坑过程中一个个解释和记录。

由于我对docker基本上没什么了解所以查询了docker -run的参数
【docker】docker run命令详解

后来在公司关于容器的资料里看到:
基于yolov5+fastreid+deepsort的TensorRT目标跟踪(C++版)复现过程_第5张图片

  1. 先执行如下指令启动容器并进入容器
docker run -it tensorrt_tracker:0.1.0_rc bash

进去之后,由于容器中没有我们需要运行的项目代码,所以我又去了解docker跑本地项目代码地方步骤,了解到 docker run -v指令能够将宿主机的一个目录挂载到容器中,于是我的docker -run指令扩充成了:


docker run -it -v /root/cxy/test-yolo-deep-fast/yolov5_fastreid_deepsort_tensorrt/:/home/install/ tensorrt_tracker:0.1.0_rc bash

其中 -v 指令的格式如下:

docker run -it -v /宿主机目录:/容器目录 镜像名 /bin/bash

参考博客:docker run中-v参数的用法解释

docker的安装以及跑本地项目代码步骤说明
这个博客是最开始点醒我要用到-v指令的。
博客里写道:
如何使用docker跑本地的项目代码
镜像里面的内部东西分为两种:A.只包括运行环境 B.包括运行环境和项目代码
对于A这钟情况来说,需要使用者自行下载项目的源代码放在本地目录上,进而pull命令拉镜像下载,从而将本地项目代码挂载-v在镜像目录当中。最后run。
具体图片和操作指令看上面的博客。

成功将宿主机目录挂载进容器之后,我就进行了cmake 和 make指令;
在Dockerfile文件中我们指定了工作目录/home/install,所以进入docker中就进入了:/home/install,我在这个目录下新建了一个test目录,将项目代码放在test目录中,所以最终我的项目存放在/home/install/test目录下:
所以在/home/install/test目录下执行指令:

make build && cd build
cmake ..
make -j

我能够cmake成功并且也make成功,生成了可执行的二进制文件object_tracker,但是我在运行这个文件的时候报了下面的错
请添加图片描述
在学姐的指导下,我查看了CUDA和cudnn的版本,发现cudnn的版本查不到,问了学姐后发现在docker run 的时候要加 --gups all
在这里插入图片描述
在这里插入图片描述
再次运行时报错:
在这里插入图片描述
这个之前查到过是GPU被占用了,所以要更改docker run指令,指定使用空闲的GPU。
在指定空闲GPU之前要先看哪个GPU是空闲的,用下面指令:

nvidia-smi

基于yolov5+fastreid+deepsort的TensorRT目标跟踪(C++版)复现过程_第6张图片
可以看到有两个GPU,第一个编号为0的GPU内存已经满了,第二个比较空闲,可以使用。
所以docker -run最终指令如下:

docker run -itd --gpus '"device=1"' -v /root/cxy/test-yolo-deep-fast/yolov5_fastreid_deepsort_tensorrt/:/home/install/ tensorrt_tracker:0.1.0_rc bash

第三步 运行项目
第二步成功构建容器之后,就能在容器中跑项目
在/home/install/test目录下执行指令:

make build && cd build
cmake ..
make -j

遇到了很多缺少安装包错误
ModuleNotFoundError: No module named ‘cv2’

 pip install opencv-python

ModuleNotFoundError: No module named ‘pandas’

pip install pandas -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

ModuleNotFoundError: No module named ‘tqdm‘

pip install tqdm

ModuleNotFoundError: No module named ‘matplotlib’

pip install matplotlib
pip install matplotlib -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

ModuleNotFoundError: No module named ‘seaborn’

pip install seaborn -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

ModuleNotFoundError: No module named ‘yacs’

pip install yacs -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

ModuleNotFoundError: No module named ‘termcolor’

pip install termcolor -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

解决完上述问题之后,就能正常运行项目了

./object_tracker ../configs/config.yaml ../samples/test.mp4

其中

../configs/config.yaml

是项目的配置文件,指明了yolo和fastreid的一些配置参数

../samples/test.mp4

是测试视频存放地址

我自己新建了一个results文件夹,将最后处理好的结果存放到该文件夹中。

至此,该项目成功部署运行。

你可能感兴趣的:(docker,容器,深度学习,目标跟踪,c++)