美文网首页深度学习
视频活体检测:post文件的django部署

视频活体检测:post文件的django部署

作者: 一个摸鱼AI喵 | 来源:发表于2021-09-23 09:37 被阅读0次

    一、创建项目

    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
    

    相关文章

      网友评论

        本文标题:视频活体检测:post文件的django部署

        本文链接:https://www.haomeiwen.com/subject/ryoagltx.html