明火煙霧目標檢測項目部署(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
查看容器torch的版本,進入python終端輸入下面的指令,可以看到使用的torch版本是1.10.0
。
>>> import torch
>>> torch.__version__
'1.10.0'
>>>
2. 配置項目環境
2.1 更換軟體源
先備份原有的軟體源,命令如下。
cp /etc/apt/sources.list /etc/apt/sources.list.bak
因為鏡像沒有安裝vim,故只能通過echo
指令更改/etc/apt/sources.list
文件內容。
# 清空文件內容
echo "">/etc/apt/sources.list
echo "deb //mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main restricted">>/etc/apt/sources.list
echo "deb //mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates main restricted">>/etc/apt/sources.list
echo "deb //mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial universe">>/etc/apt/sources.list
echo "deb //mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates universe">>/etc/apt/sources.list
echo "deb //mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial multiverse">>/etc/apt/sources.list
echo "deb //mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates multiverse">>/etc/apt/sources.list
echo "deb //mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse">>/etc/apt/sources.list
echo "deb //mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security main restricted">>/etc/apt/sources.list
echo "deb //mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security universe">>/etc/apt/sources.list
echo "deb //mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security multiverse">>/etc/apt/sources.list
更新軟體源。
apt-get update
apt-get upgrade
2.2 下載vim
修改文件內容需要使用vim,所以要下載。
apt-get install vim -y
下載完成後可以通過下面的指令查看vim的版本。
vim --version
2.3 解決vim中文亂碼問題
修改/etc/vim/vimrc
內容,在最後面添加下面的內容:
set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936
set termencoding=utf-8
set encoding=utf-8
設置後文件內的中文就可以正常顯示了。
3. 運行項目
3.1 拷貝項目到容器中
將本機上的項目程式碼文件拷貝到容器的工作目錄下。
$ docker cp "本機上項目的路徑" fire:/workspace/
上面的指令實現的功能是,將項目拷貝到fire
容器中的/workspace/
目錄下。
3.2 安裝項目所需的工具包
使用pip指令下載工具包,-i
後面使用的清華源,最後是工具包的名稱。
pip install -i //pypi.tuna.tsinghua.edu.cn/simple packageName
在該容器中,我需要安裝的包如下:
pip install -i //pypi.tuna.tsinghua.edu.cn/simple opencv-python
pip install -i //pypi.tuna.tsinghua.edu.cn/simple opencv-python-headless
pip install -i //pypi.tuna.tsinghua.edu.cn/simple matplotlib
pip install -i //pypi.tuna.tsinghua.edu.cn/simple scipy
pip install -i //pypi.tuna.tsinghua.edu.cn/simple flask
pip install -i //pypi.tuna.tsinghua.edu.cn/simple pyyaml
其中我在安裝opencv-python
這個包後,在執行項目的時候報錯了:
ImportError: libGL.so.1: cannot open shared object file: No such file or directory
在網上搜索到的解決方法就是安裝opencv-python-headless
。而且我嘗試先安裝opencv-python-headless
後安裝opencv-python
也會報相同的錯,不能反過來安裝!!
3.3 啟動項目
在flask_app.py
中需要檢查主機號和埠號,主機號要寫成0.0.0.0
不然本機打不開項目,如果埠號要和創建容器時映射的埠一致(這裡我設置了5001)。而且要關閉調試模式。
app.run(debug=False, host='0.0.0.0', port=5001)
在完成以上的操作後,在終端中輸入如下指令啟動項目:
python flask_app.py
這時在本機的瀏覽器上輸入localhost:5001
即可成功打開項目頁面了!
4.搭建項目鏡像
現在把項目所在的容器封裝成鏡像,方便不同系統上的部署。這裡我採用兩種方法搭建,分別是Docker commit
和Dockerfile
搭建項目鏡像。
4.1 Docker commit搭建
在Docker中,鏡像是多層存儲,每一層是在前一層的基礎上進行的修改;而容器同樣也是多層存儲,是在以鏡像為基礎層,在其基礎上加一層作為容器運行時的存儲層。
在該項目中,我們是在pytorch
鏡像的基礎上創建了fire
這個容器,並在該容器中進行了修改操作。可以通過 docker diff
命令看到具體的改動。
$ docker diff CONTAINER
docker commit
命令可以將容器的存儲層保存下來成為鏡像。換句話說,就是在原有鏡像的基礎上,再疊加上容器的存儲層,並構成新的鏡像。docker commit
的語法格式為:
$ docker commit [選項] <容器ID或容器名> [<倉庫名>[:<標籤>]]
在該項目中,我使用如下的指令構建項目鏡像:
$ docker commit --author "Kint" --message "Fire Detection Project" fire kint216/fire-detection:v1
其中 --author
是指定作者,而 --message
則是記錄本次修改的內容。這點和 git
版本控制相似,不過這裡這些資訊也可以省略不寫。需要注意的是倉庫名必須是小寫。
用docker image ls
指令可以查看我們新創建的鏡像。
使用docker run
指令可以根據項目鏡像生成項目容器,該容器已經配置好環境了,在容器中直接啟動服務即可。
4.2 Dockerfile搭建
Dockerfile文件內容如下:
# FROM 指定基礎鏡像
FROM pytorch/pytorch:latest
# 指定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 //mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial main restricted">>/etc/apt/sources.list \
&& echo "deb //mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates main restricted">>/etc/apt/sources.list \
&& echo "deb //mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial universe">>/etc/apt/sources.list \
&& echo "deb //mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates universe">>/etc/apt/sources.list \
&& echo "deb //mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial multiverse">>/etc/apt/sources.list \
&& echo "deb //mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-updates multiverse">>/etc/apt/sources.list \
&& echo "deb //mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse">>/etc/apt/sources.list \
&& echo "deb //mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security main restricted">>/etc/apt/sources.list \
&& echo "deb //mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security universe">>/etc/apt/sources.list \
&& echo "deb //mirrors.tuna.tsinghua.edu.cn/ubuntu/ xenial-security multiverse">>/etc/apt/sources.list \
&& apt-get update \
&& apt-get install vim -y \
&& pip install -i //pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
# CMD指令用來指定當Docker容器運行起來執行的命令
CMD ["python","flask_app.py"]
在Dockerfile
文件目錄下輸入下面的指令:
$ docker build -t firedemo .
-t
參數是指定鏡像名稱,.
告訴docker在該目錄下尋找Dockerfile
文件。
通過docker run
指令來啟動一個容器。指令如下:
$ docker run -p 5001:5001 -d --name firetest firedemo
但是在這裡啟動失敗了,這在已經在安裝好opencv-python-headless
後出現的問題,還沒有解決。
5.發布項目鏡像
在Docker Hub上創建一個倉庫。
將有Docker commit
搭建好的項目鏡像推送到遠端倉庫中,指令如下:
$ docker push kint216/fire-detection:v1
上傳成功後,此時可以從遠端倉庫拉取部署使用。
$ docker run -dit -p 5001:5001 --name firetest kint216/fire-detection:v1