windows下用Apache部署mmdetection的cascade目标检测项目

环境:

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 *找不到模块问题

参考文章:

windows 下配置python WSGI

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章