環境:
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 *找不到模塊問題
參考文章: