环境:
windows10
Apache 2.4
Flask 1.1.1
Flask-SocketIO 4.2.1
mod-wsgi 4.7.1+ap24vc14
mmdetection相关环境:
python=3.6
cuda=10.0
cudnn=7.5.0
pytorch=1.2.0
torchversion=0.4.0
介绍:
整个程序是web端的,用的是flask的web框架,将检测到的结果展示到前端界面,后端算法用的是mmdetection的cascade r-cnn的目标检测算法,mmdetection的环境搭建可以参考我前序文章:mmdetection在windows10系统环境中搭建,因为是在windows系统部署,本来考虑用IIS,但是IIS对python的支持不好,后来还是考虑使用Apache来部署,但是Apache一直有一个问题,就是里面所有的相对路径都不能使用,只能使用绝对路径,不知道是配置的问题还是其他什么的,都需要特殊修改一下。
Apache安装:
下载地址:
http://httpd.apache.org/docs/current/platform/windows.html
点击ApacheHaus进入下载选择界面
根据需求下载32位或者64位,需要和python wsgi环境一致,我这里都为64位程序
下载完成之后解压到目录
wsgi安装:
下载地址:
https://www.lfd.uci.edu/~gohlke/pythonlibs/#mod_wsgi
选择对应版本,这里是mod_wsgi‑4.7.1+ap24vc14‑cp36‑cp36m‑win_amd64.whl
进入下载目录运行
pip install mod_wsgi-4.7.1+ap24vc14-cp36-cp36m-win_amd64.whl
注意:python Apache wsgi都得要是64位程序或者编译
下载好之后安装到python目录下,在安装成功后在python的安装目录的\scripts文件夹下运行
mod_wsgi-express module-config
输出如下三行结果:
LoadFile "c:/programdata/anaconda3/envs/mmdetection/python36.dll"
LoadModule wsgi_module "c:/programdata/anaconda3/envs/mmdetection/lib/site-packages/mod_wsgi/server/mod_wsgi.cp36-win_amd64.pyd"
WSGIPythonHome "c:/programdata/anaconda3/envs/mmdetection"
这3行文字很重要,apache选择运行什么python环境就和这个有关
Apache配置:
配置httpd.conf文件:
文件在Apache24\conf目录下
打开文件
将上面3行文字复制到其中
将LoadModule access_compat_module modules/mod_access_compat.so前的#号去除
在最后复制:
Listen 6111
<VirtualHost *:6111>
WSGIScriptAlias / D:\pythonprojects\mmdetection\wsgi.py
<Directory 'D:\pythonprojects\mmdetection'>
Require all granted
Require host ip
# WSGIProcessGroup mmdetection
WSGIApplicationGroup %{GLOBAL}
Order deny,allow
Allow from all
</Directory>
</VirtualHost>
Listen:监听6111端口
WSGIScriptAlias / D:\pythonprojects\mmdetection\wsgi.py:wsgi文件路径
Directory 'D:\pythonprojects\mmdetection':程序主目录
写法有很多种
在mmdetection主目录下添加wsgi.py文件:
import sys
sys.path.insert(0, "D:/pythonprojects/mmdetection")
from server import app
application = app
sys.path是当前mmdetection目录路径
from server import app
server是启动程序的py文件名,我的叫server.py
application名称固定
添加到Windows服务中:
httpd -k install -n Apache24
这里服务名就是Apache24
server.py文件
# encoding:utf-8
# !/usr/bin/env python
import base64
import os
import time
import numpy as np
import cv2
from io import BytesIO
from threading import Lock
from PIL import Image
from flask import Flask, render_template
from flask_socketio import SocketIO
from mmdet.apis import init_detector, inference_detector, show_result
async_mode = None
app = Flask(__name__)
app.config['JSON_AS_ASCII'] = False
socketio = SocketIO(app, async_mode=async_mode)
thread = None
thread_lock = Lock()
config_file = r'D:\pythonprojects\mmdetection\configs\cascade_rcnn_r50_fpn_1x.py'
checkpoint_file = r'D:\pythonprojects\mmdetection\work_dirs\cascade_rcnn_r50_fpn_1x\epoch_200.pth'
# 初始化模型
model = init_detector(config_file, checkpoint_file)
# 先测试一张图片,防止第一次运行时太慢
rtest = inference_detector(model, r'D:\pythonprojects\mmdetection\result\20191230\20191230145713.jpg')
def background_thread():
socketio.emit('server_response',{'name': '', 'base64': str(base64_data, 'utf-8'),'label': label, 'bgc': color, 'clear': 0, 'id': pic_count},namespace='/liqing')
@app.route('/')
def index():
return render_template('index.html', async_mode=socketio.async_mode)
@socketio.on('connect', namespace='/test')
def test_connect():
global thread
with thread_lock:
if thread is None:
thread = socketio.start_background_task(target=background_thread)
if __name__ == '__main__':
socketio.run(app)
这里使用的flask-socketio来将检测的结果通过json返回到前端界面
问题:
Windows安装pytorch及from torch._C import *找不到模块问题
参考文章: