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

 

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