当前位置:   article > 正文

明火烟雾目标检测项目部署(YoloV5+Flask)_yolov5 flask

yolov5 flask

明火烟雾目标检测项目部署


这个项目是我去年负责的项目,当时还有一些小问题没有完全解决,同时也受限于当时的知识储备,就一直搁置到现在。在经过相关知识的学习后,这两天也是花了不少心思在完善这个项目,最终是修改成了理想的状态。

目前的效果是通过网页打开,用户通过上传图片,后端会检测图片是否存在明火或者烟雾。经过调试后该项目可以在不同设备上打开,前端会自适应不同设备。使用的框架是PyTorch,使用的算法是YoloV5算法(4.0版本),使用的模型是经过训练后的YoloV5-S模型。

同时我也是将该项目通过Docker进行封装成镜像,方便在其他系统上部署而不需要重复安装环境。

下面是项目的效果。

在这里插入图片描述

1. 拉取Docker PyToch镜像

从Docker Hub拉取PyTorch的镜像,在该镜像上进行下面的操作。

# 拉取镜像
$ docker pull pytorch/pytorch:latest
# 生成容器
$ docker run -dit --name fire -p 5001:5001 pytorch/pytorch:latest
# 进入容器
$ docker exec -it fire bash
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

查看容器torch的版本,进入python终端输入下面的指令,可以看到使用的torch版本是1.10.0

>>> import torch
>>> torch.__version__
'1.10.0'
>>>
  • 1
  • 2
  • 3
  • 4

2. 配置系统环境

2.1 更换软件源

先备份原有的软件源,命令如下。

cp /etc/apt/sources.list /etc/apt/sources.list.bak
  • 1

因为镜像没有安装vim,故只能通过echo指令更改/etc/apt/sources.list文件内容。
清华源

# 清空文件内容
echo "">/etc/apt/sources.list
echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main restricted">>/etc/apt/sources.list
echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates main restricted">>/etc/apt/sources.list
echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial universe">>/etc/apt/sources.list
echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates universe">>/etc/apt/sources.list
echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial multiverse">>/etc/apt/sources.list
echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates multiverse">>/etc/apt/sources.list
echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse">>/etc/apt/sources.list
echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security main restricted">>/etc/apt/sources.list
echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security universe">>/etc/apt/sources.list
echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security multiverse">>/etc/apt/sources.list
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

阿里源

echo "deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse">>/etc/apt/sources.list
echo "deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse">>/etc/apt/sources.list
echo "deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse">>/etc/apt/sources.list
echo "deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse">>/etc/apt/sources.list
echo "deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse">>/etc/apt/sources.list
echo "deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse">>/etc/apt/sources.list
echo "deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse">>/etc/apt/sources.list
echo "deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse">>/etc/apt/sources.list
echo "deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse">>/etc/apt/sources.list
echo "deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse">>/etc/apt/sources.list
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

更新软件源。

apt-get update
apt-get upgrade
  • 1
  • 2

2.2 下载vim

修改文件内容需要使用vim,所以要下载。

apt-get install vim -y
  • 1

下载完成后可以通过下面的指令查看vim的版本。

vim --version
  • 1

2.3 解决vim中文乱码问题

修改/etc/vim/vimrc内容,在最后面添加下面的内容:

set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936
set termencoding=utf-8
set encoding=utf-8
  • 1
  • 2
  • 3

设置后文件内的中文就可以正常显示了。

3. 运行项目

3.1 拷贝项目到容器中

将本机上的项目代码文件拷贝到容器的工作目录下。

$ docker cp "本机上项目的路径" fire:/workspace/
  • 1

上面的指令实现的功能是,将项目拷贝到fire容器中的/workspace/目录下。

3.2 安装项目所需的工具包

使用pip指令下载工具包,-i后面使用的清华源,最后是工具包的名称。

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple packageName
  • 1

在该容器中,我需要安装的包如下:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python-headless
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple matplotlib
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple scipy
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple flask
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyyaml
  • 1
  • 2
  • 3
  • 4
  • 5

其中我在安装opencv-python这个包后,在执行项目的时候报错了:

ImportError: libGL.so.1: cannot open shared object file: No such file or directory

在网上搜索到的解决方法就是安装opencv-python-headless

3.3 启动项目

flask_app.py中需要检查主机号和端口号,主机号要写成0.0.0.0不然本机打不开项目,如果端口号要和创建容器时映射的端口一致(这里我设置了5001)。而且要关闭调试模式。

app.run(debug=False, host='0.0.0.0', port=5001)
  • 1

在完成以上的操作后,在终端中输入如下指令启动项目:

python flask_app.py
  • 1

在这里插入图片描述

这时在本机的浏览器上输入localhost:5001即可成功打开项目页面了!

在这里插入图片描述

4.搭建项目镜像

现在把项目所在的容器封装成镜像,方便不同系统上的部署。这里我采用两种方法搭建,分别是Docker commitDockerfile搭建项目镜像。

4.1 Docker commit搭建

在Docker中,镜像是多层存储,每一层是在前一层的基础上进行的修改;而容器同样也是多层存储,是在以镜像为基础层,在其基础上加一层作为容器运行时的存储层。

在该项目中,我们是在pytorch镜像的基础上创建了fire这个容器,并在该容器中进行了修改操作。可以通过 docker diff 命令看到具体的改动。

$ docker diff CONTAINER
  • 1

docker commit 命令可以将容器的存储层保存下来成为镜像。换句话说,就是在原有镜像的基础上,再叠加上容器的存储层,并构成新的镜像。docker commit 的语法格式为:

$ docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]
  • 1

在该项目中,我使用如下的指令构建项目镜像:

$ docker commit --author "xxxx" --message "Fire Detection Project" fire username/image:tag
  • 1

其中 --author 是指定作者,而 --message 则是记录本次修改的内容。这点和 git 版本控制相似,不过这里这些信息也可以省略不写。需要注意的是仓库名必须是小写。

docker image ls指令可以查看我们新创建的镜像。

使用docker run指令可以根据项目镜像生成项目容器,该容器已经配置好环境了,在容器中直接启动服务即可。

4.2 Dockerfile搭建

Dockerfile文件内容如下:

# FROM 指定基础镜像
FROM pytorch/pytorch:1.8.1-cuda10.2-cudnn7-runtime
# 指定Docker命令的工作路径,如果路径不存在,Docker会自动创建
WORKDIR /app
# 将所有程序拷贝到Docker镜像中
# COPY <本地路径> <目标路径>
# 第一个'.'代表程序根目录下的所有文件;第二个'.'代表Docker镜像中的路径,即当前的工作路径'/app/'
COPY . .
# 创建镜像,安装环境,RUN指令是在创建镜像时使用
RUN cp /etc/apt/sources.list /etc/apt/sources.list.bak \
    && echo "">/etc/apt/sources.list \
    && echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main restricted">>/etc/apt/sources.list \
    && echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates main restricted">>/etc/apt/sources.list \
    && echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial universe">>/etc/apt/sources.list \
    && echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates universe">>/etc/apt/sources.list \
    && echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial multiverse">>/etc/apt/sources.list \
    && echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates multiverse">>/etc/apt/sources.list \
    && echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse">>/etc/apt/sources.list \
    && echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security main restricted">>/etc/apt/sources.list \
    && echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security universe">>/etc/apt/sources.list \
    && echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security multiverse">>/etc/apt/sources.list \
    && apt-get update \
    && apt-get install vim -y \
    && pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
# CMD指令用来指定当Docker容器运行起来执行的命令
CMD ["python","flask_app.py"]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

requirements.txt内容如下。

opencv-python-headless
matplotlib
scipy
flask
pyyaml
  • 1
  • 2
  • 3
  • 4
  • 5

Dockerfile文件目录下输入下面的指令:

$ docker build -t firedemo .
  • 1

-t参数是指定镜像名称,.告诉docker在该目录下寻找Dockerfile文件。

在这里插入图片描述

通过docker run指令来启动一个容器。指令如下:

$ docker run -p 5001:5001 -d --name firetest firedemo
  • 1

然后在本机浏览器上输入localhost:5001即可使用服务!

5.发布项目镜像

在Docker Hub上创建一个仓库。将搭建好的项目镜像推送到远端仓库中,指令如下:

$ docker push username/image:tag
  • 1

上传成功后,此时可以从远端仓库拉取部署使用。

$ docker run -dit -p 5001:5001 --name firetest username/image:tag
  • 1
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/83210
推荐阅读
相关标签
  

闽ICP备14008679号