一、创建项目
django-admin startproject live_file_django
此时,创建的内容有:
live_file_django/
manage.py
live_file_django/
__init__.py
settings.py
urls.py
asgi.py
wsgi.py
并进入该项目,并执行manage.py
cd live_file_django
python manage.py runserver
此时,会得到一个服务地址,如果是本地就可以使用此地址,如果使用docker ,此manage无用,直接 control-C
二、创建应用
2.1 这里需要创建视频活体检测的应用
python manage.py startapp live_file
live_file的结构目录如下:
live_file/
__init__.py
admin.py
apps.py
migrations/
__init__.py
models.py
tests.py
views.py
views.py 为主程序文件, 函数 类都放在此文件中.注意import 地址都应按根目录来,而不是当前目录,其他地址也如此
2.2 view文件增加内容:
class Live_Model():
def __init__(self):
def live_value(self, frame):
def preprocess(self, request):
def inference(self, video_file):
def postprocess(self, inference_output):
def handle(self,request):
def live_detection(request):
'''此函数为调用接口的函数'''
livenet = Live_Model()
result= livenet.handle(request)
return result
2.3 并创建urls.py文件
from django.urls import path
from . import views
urlpatterns = [ path('live_detection', views.live_detection, name='live_detection'),]
# 第一个'live_detection' 自定义,给中间view.live_detection 起接口名, name也自定义,可有可无
2.4 修改live_file_django(项目文件目录)/urls.py文件
from django.contrib import admin
from django.urls import path,include # todo 增加include
urlpatterns = [
path('admin/', admin.site.urls),
# 活体检测接口
path('live_detection/',include('live_file.urls'))
]
# 这里的view参数相比于app
# live_detection/ 为自定义内容-app名,这个内容会作为接口的一部分, live_file.urls为urls.py地址
path参数:
- route: URL的app匹配,当Django相应请求,它会从urlpatterns遍历, 也是给app命名或功能函数命名
- view : URL的功能匹配,当找到route后,按照view的内容具体去寻找,如果view是个文件,(需加上include()),会去找下一级,直到功能函数.
- name:为你的 URL 取名能使你在 Django 的任意地方唯一地引用它,尤其是在模板中。这个有用的特性允许你只改一个文件就能全局地修改某个 URL 模式(暂没发觉具体用法)
- kwargs:任意个关键字参数可以作为一个字典传递给目标视图函数(暂没发觉具体用法)
2.5 数据库(功能)配置
打开live_file_django/setting.py
**2.5.1 允许主机域名**
ALLOWED_HOSTS = ["*"] # 加上"*""
**2.5.2 把live_file功能加上**
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'live_file.apps.LiveFileConfig', # todo: 增加内容,按实际地址函数填写,前面为地址,最后一个为项目名+"Config",其中项目名会改首字母大写,"_"会把后面字母改大写
]
**2.5.3 注释掉middleware的csrf**
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware', # todo: 注释掉
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
**2.5.4 修改语言跟时区**
# LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'zh-hans'
# TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Shanghai'
三、配置wsgi
在根目录下创建wsgi.ini文件
[uwsgi]
http-socket = :8600
chdir = /models/live_file_django # 为docker内根目录地址
reload-mercy=8
master = True
reload-on-as = 16000
buffer-size = 65535
wsgi-file = live_file_django/wsgi.py # wsgi.py在根目录下的地址
processes = 2
threads = 4
listen = 100
vacuum = true
lazy-apps=true
四、创建容器
docker run --name lives-django \
--hostname lives-django \
-tid \
--restart=on-failure:10 \
-p 8100:8600 \
-v /home/project_documents/Lives_production:/models/live_file_django \
mms_torch_tf:latest \
uwsgi /models/live_file_django/wsgi.ini
wsgi 地址写docker内的地址
五、 POST与Request设置
5.1 图片(文本)形式
5.1.1post界面
url: 服务器ip:端口号/app名/函数名
app名:在根目录项目文件夹/urls.py 里的urlpatterns里添加的path 给app命的名
函数名:具体app下/urls.py 给 app的功能函数名的名
[图片上传失败...(image-b1e00a-1632447406582)]
body 格式选择:application/json
body内容:字典形式,图片转为base64格式字符串
5.1.2 代码post
request_url = "http://192.168.46.229:8001/predictions/insightface"
# 二进制方式打开图片文件
with open(image1, 'rb') as f1:
img1 = base64.b64encode(f1.read()).decode()
with open(image2, 'rb') as f2:
img2 = base64.b64encode(f2.read()).decode()
params = json.dumps(
{
"params":{
"photo1":img1,
"photo2":img2
}
})
headers = {'content-type': 'application/json','Connection':'close'}
response = requests.post(request_url, data=params, headers=headers)
if response:
result = response.json()
return result
5.1.3 requst请求函数(django)
请求代码:
def function(request):
# 获取请求参数
try:
data = json.loads(request.body.decode('utf-8')) # 主要区别在此,按request的属性提取
# 计算指标
image_1 = data["params"]["photo1"]
image_2 = data["params"]["photo2"]
except Exception as err:
print('错误信息:', err)
return HttpResponse(
json.dumps({
'code': 501,
'message': '传参有误',
}),
content_type='application/json',
charset='utf-8'
)
# 图片base64格式转ndarry形式
image_1 = base64_ndarray(image_1)
image_2 = base64_ndarray(image_2)
返回代码:
data = {"data":"abcd5678"} # 字典形式
result = json.dumps(data) # json格式
return HttpResponse(result, content_type='application/json', charset='utf-8')
5.1.3 requst请求函数(mms)
请求代码
for idx, data in enumerate(request):
img1 = data['body']["params"]["photo1"] # 与django区别,按字典key-value提取
img2 = data['body']["params"]["photo2"]
注意:一定要对request进行处理,在测试中,对request不进行任何处理,直接返回指定内容.由于request在传输通道中,如果采用postman工具,其传输通道阻塞,虽然docker正常工作,但postman 读取错误:Error: read ECONNRESET.
返回代码:
data = {"data":"abcd5678"} # 字典形式
return [data] # 列表形式
5.2 视频格式
5.2.1 postman界面选择:
django:
url: 服务器ip:端口号/app名/函数名
mms:
url: 服务器ip:端口号/predictions/模型名
1.选择body格式为:multipart/form-data
2.需要给文件起参数名(注意:此名到时候跟request请求的参数一致)
3.选择文件
5.2.2 代码post形式
vfile = open(videofile_path, 'rb') # 打开文件, 内容为<_io.BufferedReader name='./data/video_test.mp4'>
files = {"filename":vfile} # 以字典形式存放
response = requests.post(request_url, files=files,verify=False) # 不能加headers,否则不能执行,verify可有可无
也就是bufferedReader读大文件会内存溢出
5.2.3 django request请求
video_file = request.FILES.get("filename",None) # 获得文件内容 '' 按request.FILES固定提取,已自动转为二进制bytes
f= open(self.video_file, 'wb')
for chunk in video_file.chunks():
f.write(chunk)
f.close()
5.2.4 mms request请求
video_file = request[0]['filename'] # request为列表形式,只有一个元素取[0],然后以字典取'filename' ,与post字典对应上.
f= open(self.video_file_path, 'wb') # 保存到文件中
f.write(video_file)
f.close()
六、 多功能设置
对一个docker设置多个功能:
6.1 Django
6.1.1 生成多个APPS
依次执行2.1-2.5, 在项目文件夹下urls.py的urlpatterns列表增加app,如:
urlpatterns = [
path('admin/', admin.site.urls),
# 活体检测接口
path('live_detection/',include('live_file.urls')),
path("live_detection/",include('app2.urls')),
] # live_detection/ 为自定义内容
6.1.2 一个APP多个functions
在app的view设置多个functions,然后在app里的urls.py的urlpatterns列表增加function,如
urlpatterns = [
path('function1', views.app2_function, name='abc'),
path('function2', views.app2_function2,),
]
6.1.3 调用接口
接口为:IP:port/App/function
如:
http://192.168.46.230:8002/app1/function1
http://192.168.46.230:8002/app1/function2
http://192.168.46.230:8002/app2/function1
6.2 MMS
一级目录只能是predictions(固定),只能到二级目录,故不能见多个APP,只能见里多个functions.
model-archiver 多个模型
model-archiver --model-name insightface1 --model-path ./ --handler mxnet_vision_service:handle1
model-archiver --model-name insightface2 --model-path ./ --handler mxnet_vision_service:handle2
model-archiver --model-name insightface3 --model-path ./ --handler mxnet_vision_service2:handle1
在创建docker时 并列models
nvidia-docker run -itd --restart=on-failure:10 --gpus 1 --name mms_insightface -p 8001:8080 -p 8066:8081 -v \
/tmp/insightface_ploy/:/models \
mms_insightface_yj:1.0 \
multi-model-server --start --mms-config /models/config.properties --model-store /models \
--models insightface1=insightface1.mar insightface2=insightface2.mar insightface3=insightface3.mar
网友评论