文章目录
概要
在阿里云服务器上部署yolov5和图传检测网页。原本只想通过HTML和PHP来实现,但此方法PHP的exec方法始终执行不了yolo的detect.py,具体原因未知。然后想通过flask来实现,此方法可行但有更方便的方法就是本文介绍的gradio和rinetd端口转发。iptables也可实现端口转发但配置实在繁琐。
成果展示
左侧选择图片,右侧显示检测结果
电脑浏览器和手机浏览器都可访问
环境
服务器操作系统为linux centos7 ,nginx web服务器软件
Yolo环境
一下载conda虚拟环境
1. 下载Miniconda
wget -c https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh
2. 添加权限
chmod 777 Miniconda3-latest-Linux-x86_64.sh
3.运行
sh Miniconda3-latest-Linux-x86_64.sh
注意看提示和协议然后回车,最后询问是否初始化【yes|no】输入no
4.编辑.bashrc文件添加conda的路径
vim ~/.bashrc
export PATH="$PATH:/你的miniconda3路径/bin:"
5.重启bashrc
source ~/.bashrc
6.验证conda
conda -V
出现conda版本则安装成功
7.创建python3.7的虚拟环境
conda create -n 虚拟环境名字
虚拟环境的相关命令:
进入:conda activate 虚拟环境名字
切换:conda source activate 其他虚拟环境名字
退出:conda deactivate
查看:conda env list
二yolov5安装
1.github下载yolob5项目
https://github.com/ultralytics/yolov5
code下载zip至本地(此处下载至Windows)
2.下载.pt文件
网上说运行download_weights.sh下载,但我始终运行报错。
也可以在网上自行下载pt文件存放至yolo主目录
或者在下面运行yolo detect.py时指定pt并保持联网可自动下载
3.上传yolo文件至服务器
此处用filezilla上传至/home/文件夹下
4.配置yolov5
(虚拟环境中)进入yolov5的目录,执行命令安装依赖
pip install -r requirements.txt
5.运行yolov5
未加任何参数,识别自带的两张图片,并保存在runs/detect/exp
python detect.py
检测一个自己的视频或图片,名叫Testj.JPG,权重文件用yolov5x.pt (自动从GitHub下载)
python detect.py --source Testj.JPG --weights yolov5x.pt
6.detact.py的部分参数(详自行搜索)
-
source
:测试集文件/文件夹 -
conf-thres
:置信度的阈值超过这个阈值的预测框就会被预测出来。
-
iou-thres
:iou阈值 -
save-txt
:是否把检测结果保存成一个.txt的格式
txt默认保存物体的类别索引和预测框坐标(YOLO格式),每张图一个txt,txt中每行表示一个物体 -
max-det
:每张图最大检测数量,默认是最多检测1000个目标 -
view-img
:检测的时候是否实时的把检测结果显示出来 如果输入代码python detect.py
–view-img,在检测的时候系统要把我检测的结果实时的显示出来,假如我文件夹有5张图片,那么模型每检测出一张就会显示出一张,直到所有图片检测完成。 -
classes
:指定检测某几种类别。
比如coco128.yaml中person是第一个类别,classes指定“0”,则表示只检测图片中的person。 -
project
:预测结果保存的路径
安装torch包
torch是一个科学计算框架,广泛支持机器学习算法,并以高效的方式并行处理CPU和GPU。由于使用简单快速的脚本语言LuaJIT以及底层的C / CUDA实现,因此易于使用和高效。(详见百度)
pip install torch
检测安装
pip show torch
Gradio环境
Gradio就是一种快速搭建web界面来演示机器学习模型的方式,任何人都可以在任何地方使用它。
1.Gradio安装
使用pip自动安装
pip install gradio
2.Gradio测试
通过vim 创建一个测试页面Test.py
vim Test.py
编写代码
import gradio as gr
#输入文本处理程序
def greet(name):
return "Hello " + name + "!"
#接口创建函数
#fn设置处理函数,inputs设置输入接口组件,outputs设置输出接口组件
#fn,inputs,outputs都是必填函数
demo = gr.Interface(fn=greet, inputs="text", outputs="text")
demo.launch()
运行程序
python Test.py
网页展示左边是文本输入框,右边是结果展示框。Clear按钮用于重置网页状态,Submit按钮用于执行处理程序,Flag按钮用于保存结果到本地。
Gradio默认端口为7860
和本地127.0.0.1地址
在代码launch函数
中可输入参数更改:
- share=True 分享此网站至公网但是通过Gradio的地址,可供显目此时,时间有限。此处不用
- server_name 内网的ip地址
- server_port 端口号
由于没有内网浏览器访问,则直接通过命令测试
curl 127.0.0.1:7860
返回网页代码则表示成功
3.Gradio代码
新建一个MyYolo.py文件
引入torch包和编辑图片接口
并添加两个参数控制显示阈值和重复阈值
完整代码:
import torch
import gradio as gr
model=torch.hub.load("/yolo的主目录/","custom",path="/pt文件的地址/",source="local")
title="标题内容..."
desc="简介内容..."
base_conf,base_iou=0.25,0.30
def det_image(img,conf,iou):
model.conf=conf
model.iou=iou
return model(img).render()[0]
gr.Interface(inputs=["image",gr.Slider(minimum=0,maximum=1,value=base_conf),gr.Slider(minimum=0,maximum=1,value=base_iou)],
outputs=["image"],
fn=det_image,
title=title,
description=desc).launch()
4.后台运行
关闭终端保持运行
nohup python MyYolo.py &
返回进程的PID
可通过命令查看进程
netstat -nptl
关闭进程则通过
kill -9 进程的PID
rinetd端口转发
rinetd是一个单进程服务器,处理与文件中指定的地址/端口对的任意数量的连接。比iptables方便和小巧。
1.rinetd安装
安装依赖
yum -y install gcc gcc-c++ make
下载rinetd
wget https://github.com/samhocevar/rinetd/releases/download/v0.70/rinetd-0.73.tar.gz
解压
tar xf rinetd-0.70.tar.gz
进入目录
cd rinetd-0.73
编译安装
./bootstrap
./configure
make && make install
Sh
检查安装
rinetd -v
2.配置转发
编辑rinetd配置文件
vim /usr/local/etc/rinetd.conf
填写转发地址和端口
0.0.0.0 7866 127.0.0.1 7860
参数说明
0.0.0.0:源IP就是本机监听IP
7866 :源端口
127.0.0.1:目标IP
7860:目标端口
3.启动转发
rinetd -c /data/rinetd/etc/rinetd.conf
注意是阿里云服务器不要忘记开启安全组下的相应端口(7866)
查看进程
netstat -aptl |grep rinetd
4.配置服务
创建rinetd服务
vim /etc/systemd/system/rinetd.service
复制下面内容
[Unit]
Description=rinetd
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/sbin/rinetd -c /usr/local/etc/rinetd.conf
ExecReload=/bin/kill -SIGHUP $MAINPID
ExecStop=/bin/kill -SIGINT $MAINPID
[Install]
WantedBy=multi-user.target
重载daemon
systemctl daemon-reload
然后就可以使用下面的命令来管理rinetd了。
#启动rinetd
service rinet start
#设置开机启动
systemctl enable rinetd
#停止rinetd
service rinet stop
#重启
service rinet restart
#状态
service rinet status