基于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版本。 Linux–wget、curl command not found解决方案 【Error】解决curl: command not found
乱改了一通还是不行,就问了学姐,最后学姐告诉我这个curl报错是因为,在docker里没有curl指令,而我查到的curl版本和更新curl版本都是在虚拟机上进行的,所以我再怎么折腾docker里都没有,最后只要在# apt-get 安装这部分加一个curl即可。 所以有的时候还是要多问,本来很简单的问题浪费了一个上午的时间,可惜。 问题一解决方法:# apt-get 安装这部分加一个curl即可 问题2:在解压用curl 指令下载的zip文件出现以下问题: 出现这个问题主要原因是下载的zip文件其实只是一个网页文件,并不是真正的zip文件,如下图所示,我用vim查看了改文件发现是404NotFound,离大谱。 针对这个问题我查了很多博客,主要是有两种解决方法,但是对我都不适用,先记录下这两种解决方法:
- 用curl -L 重定向End-of-central-directory signature not found
- 用 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部分的代码 改成如下:
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/
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
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"
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
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命令详解
后来在公司关于容器的资料里看到:
- 先执行如下指令启动容器并进入容器
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
可以看到有两个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文件夹,将最后处理好的结果存放到该文件夹中。
至此,该项目成功部署运行。
|