视频活体检测:django与mms部署

一、创建项目

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的功能函数名的名

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值