From 719cb90de4df5ff3e600aeb53e849fdcd4ce3221 Mon Sep 17 00:00:00 2001 From: moon-strider Date: Mon, 28 Aug 2023 16:01:53 +0300 Subject: [PATCH 01/50] emotion_detection initial commit --- annotators/emotion_detection/Dockerfile | 21 +++ annotators/emotion_detection/requirements.txt | 147 +++++++++++++++++ annotators/emotion_detection/server.py | 149 ++++++++++++++++++ .../emotion_detection/environment.yml | 2 + .../emotion_detection/service.yml | 23 +++ annotators/emotion_detection/test.py | 12 ++ annotators/emotion_detection/test.sh | 2 + assistant_dists/dream_ocean/dev.yml | 5 + .../dream_ocean/docker-compose.override.yml | 18 ++- .../dream_ocean/pipeline_conf.json | 16 ++ components.tsv | 2 +- components/OQWoiqfnqwfnoqwib.yml | 23 +++ components/OowqncqowNAbj.yml | 2 +- 13 files changed, 419 insertions(+), 3 deletions(-) create mode 100644 annotators/emotion_detection/Dockerfile create mode 100644 annotators/emotion_detection/requirements.txt create mode 100644 annotators/emotion_detection/server.py create mode 100644 annotators/emotion_detection/service_configs/emotion_detection/environment.yml create mode 100644 annotators/emotion_detection/service_configs/emotion_detection/service.yml create mode 100644 annotators/emotion_detection/test.py create mode 100644 annotators/emotion_detection/test.sh create mode 100644 components/OQWoiqfnqwfnoqwib.yml diff --git a/annotators/emotion_detection/Dockerfile b/annotators/emotion_detection/Dockerfile new file mode 100644 index 0000000000..1b0c4b5065 --- /dev/null +++ b/annotators/emotion_detection/Dockerfile @@ -0,0 +1,21 @@ +FROM python:3.7 + +WORKDIR /src + +RUN apt update + +RUN pip install -y gdown + +RUN git clone https://github.com/anna-a-m/MultimodalERC repo + +RUN mv -rf repo/multimodal_concat/* . +RUN rm -rf + +RUN gdown 'https://drive.google.com/file/d/12C36rGUe7tuWGAh_FByw80c3wAtdUHx8/view?usp=drive_link' -O '1d_cnn_with_opensmile.pt' +RUN gdown 'https://drive.google.com/file/d/1ZHw2MEbjLwU5A7EaNysgVHZlaWq4FJZG/view?usp=drive_link' -O 'bert-large-uncased_none_seed-42.pt' +RUN gdown 'https://drive.google.com/file/d/1tDf-jWihZ6M0oX-niOfVmLUimJqYrG_M/view?usp=drive_link' -O 'final_model.pt' +RUN gdown 'https://drive.google.com/file/d/1DMUHqbwqn-j9XIhoqnfSwqyqrlPMkVJe/view?usp=drive_link' -O 'XCLIP_Augmented.pt' + +COPY . . + +RUN pip install -r requirements.txt diff --git a/annotators/emotion_detection/requirements.txt b/annotators/emotion_detection/requirements.txt new file mode 100644 index 0000000000..b8d52e7993 --- /dev/null +++ b/annotators/emotion_detection/requirements.txt @@ -0,0 +1,147 @@ +absl-py==1.4.0 +aiobotocore==2.4.2 +aiohttp==3.8.4 +aioitertools==0.11.0 +aiosignal==1.3.1 +appdirs==1.4.4 +astunparse==1.6.3 +async-timeout==4.0.2 +audeer==1.20.1 +audformat==1.0.1 +audinterface==1.1.0 +audiofile==1.3.0 +audmath==1.3.0 +audobject==0.7.9 +audresample==1.3.2 +av==10.0.0 +botocore==1.27.59 +brotlipy==0.7.0 +cachetools==5.3.0 +cchardet==2.1.7 +click==8.1.3 +cmake==3.27.0 +contourpy==1.0.7 +cycler==0.11.0 +datasets @ git+https://github.com/huggingface/datasets.git@29de6179766418c937fb33b0cc8803ec24a39e9e +dill==0.3.6 +docker-pycreds==0.4.0 +docstring-parser==0.15 +einops==0.3.2 +fairscale==0.4.13 +filelock==3.9.0 +flatbuffers==23.5.26 +fonttools==4.38.0 +frozenlist==1.3.3 +fsspec==2023.1.0 +fvcore==0.1.5.post20221221 +gast==0.4.0 +gitdb==4.0.10 +GitPython==3.1.30 +google-auth==2.17.2 +google-auth-oauthlib==1.0.0 +google-pasta==0.2.0 +grpcio==1.53.0 +h5py==3.8.0 +huggingface-hub==0.16.4 +imageio==2.27.0 +importlib-metadata==6.3.0 +importlib-resources==5.12.0 +iopath==0.1.10 +ipywidgets==8.0.4 +iso-639==0.4.5 +iso3166==2.1.1 +jax==0.4.12 +jmespath==1.0.1 +jsonargparse==4.20.1 +jupyterlab-widgets==3.0.5 +keras==2.13.1 +kiwisolver==1.4.4 +lazy_loader==0.3 +libclang==16.0.0 +lightning-utilities==0.8.0 +lit==16.0.6 +Markdown==3.4.3 +matplotlib==3.6.3 +mkl-fft==1.3.1 +mkl-service==2.4.0 +ml-dtypes==0.2.0 +mlxtend==0.21.0 +mpmath==1.3.0 +multidict==6.0.4 +multiprocess==0.70.14 +networkx==3.0 +nvidia-cublas-cu11==11.10.3.66 +nvidia-cuda-cupti-cu11==11.7.101 +nvidia-cuda-nvrtc-cu11==11.7.99 +nvidia-cuda-runtime-cu11==11.7.99 +nvidia-cudnn-cu11==8.5.0.96 +nvidia-cufft-cu11==10.9.0.58 +nvidia-curand-cu11==10.2.10.91 +nvidia-cusolver-cu11==11.4.0.1 +nvidia-cusparse-cu11==11.7.4.91 +nvidia-nccl-cu11==2.14.3 +nvidia-nvtx-cu11==11.7.91 +oauthlib==3.2.2 +opencv-python==4.7.0.68 +opensmile==2.4.2 +opt-einsum==3.3.0 +oyaml==1.0 +pandas==1.5.3 +parameterized==0.8.1 +pathtools==0.1.2 +Pillow==9.3.0 +portalocker==2.7.0 +protobuf==4.21.12 +pyarrow==11.0.0 +pyasn1==0.4.8 +pyasn1-modules==0.2.8 +pyparsing==3.0.9 +python-version==0.0.2 +pytorch-lightning==1.9.4 +pytorch-ranger==0.1.1 +pytz==2022.7.1 +PyWavelets==1.4.1 +PyYAML==6.0 +regex==2022.10.31 +requests-oauthlib==1.3.1 +responses==0.18.0 +rsa==4.9 +s3fs==2023.1.0 +safetensors==0.3.1 +scenedetect==0.6.2 +scipy==1.9.3 +seaborn==0.12.2 +sentry-sdk==1.15.0 +setproctitle==1.3.2 +sklearn==0.0.post1 +smmap==5.0.0 +soundfile==0.12.1 +sympy==1.12 +tabulate==0.9.0 +tensorboard==2.13.0 +tensorboard-data-server==0.7.0 +tensorboard-plugin-wit==1.8.1 +tensorflow==2.13.0 +tensorflow-estimator==2.13.0 +tensorflow-io-gcs-filesystem==0.32.0 +termcolor==2.2.0 +tifffile==2023.7.18 +tokenizers==0.12.1 +torch==2.0.1 +torch-optimizer==0.3.0 +torchaudio==0.13.1 +torchmetrics==0.9.3 +torchvision==0.14.1 +tqdm==4.64.1 +transformers==4.31.0 +triton==2.0.0 +typeshed-client==2.2.0 +wandb==0.15.8 +webencodings==0.5.1 +Werkzeug==2.2.3 +widgetsnbextension==4.0.5 +wrapt==1.14.1 +xxhash==3.2.0 +yacs==0.1.8 +yarl==1.8.2 +zipp==3.15.0 \ No newline at end of file diff --git a/annotators/emotion_detection/server.py b/annotators/emotion_detection/server.py new file mode 100644 index 0000000000..278b2ced6d --- /dev/null +++ b/annotators/emotion_detection/server.py @@ -0,0 +1,149 @@ +import logging +import os +import opensmile +from models import MultimodalClassificaionModel, MainModel +from utils import prepare_models + +import torch +import numpy as np +import sentry_sdk +from flask import Flask, jsonify, request +from sentry_sdk.integrations.flask import FlaskIntegration +from transformers import AutoTokenizer, AutoProcessor +import cv2 + +sentry_sdk.init(dsn=os.getenv("SENTRY_DSN"), integrations=[FlaskIntegration()]) +app = Flask(__name__) + +label2id = {'anger': 0, 'disgust': 1, 'fear': 2, 'joy': 3, 'neutral': 4, 'sadness': 5, 'surprise': 6} +num_labels = 7 +text_model, video_model, audio_model = prepare_models(num_labels) + +logger = logging.getLogger(__name__) + + +def sample_frame_indices(seg_len, clip_len=16, frame_sample_rate=4, mode="video"): + converted_len = int(clip_len * frame_sample_rate) + converted_len = min(converted_len, seg_len-1) + end_idx = np.random.randint(converted_len, seg_len) + start_idx = end_idx - converted_len + if mode == "video": + indices = np.linspace(start_idx, end_idx, num=clip_len) + else: + indices = np.linspace(start_idx, end_idx, num=clip_len*frame_sample_rate) + indices = np.clip(indices, start_idx, end_idx - 1).astype(np.int64) + return indices + + +def get_frames(file_path, clip_len=16,): + cap = cv2.VideoCapture(file_path) + v_len = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) + indices = sample_frame_indices(v_len) + + frames = [] + for fn in range(v_len): + success, frame = cap.read() + if success is False: + continue + if (fn in indices): + frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) + res = cv2.resize(frame, dsize=(224, 224), interpolation=cv2.INTER_CUBIC) + frames.append(res) + cap.release() + + if len(frames) < clip_len: + add_num = clip_len - len(frames) + frames_to_add = [frames[-1]] * add_num + frames.extend(frames_to_add) + + return frames + +def create_final_model(): + multi_model = MultimodalClassificaionModel( + text_model, + video_model, + audio_model, + num_labels, + input_size=1920, + hidden_size=512 + ) + checkpoint = torch.load('final_model.pt') + multi_model.load_state_dict(checkpoint) + + device = 'cuda' + return MainModel(multi_model, device=device) + + +def process_text(input_tokens: str): + text_model_name = 'bert-large-uncased' + tokenizer = AutoTokenizer.from_pretrained(text_model_name) + + return tokenizer(input_tokens, + padding='max_length', + truncation=True, + max_length=128, + return_tensors='pt') + + +def process_video(video_path: str): + video_frames = get_frames(video_path) + + video_model_name = "microsoft/xclip-base-patch32" + video_feature_extractor = AutoProcessor.from_pretrained(video_model_name) + + return video_feature_extractor(videos=video_frames, return_tensors="pt") + + +def process_audio(file_path: str): + smile = opensmile.Smile( + opensmile.FeatureSet.ComParE_2016, + opensmile.FeatureLevel.Functionals, + sampling_rate=16000, + resample=True, + num_workers=5, + verbose=True, + ) + + audio_features = smile.process_files([file_path]) + return audio_features.values.reshape(audio_features.shape[0], 1, audio_features.shape[1]) + + +def infer(text: str, video_path: str): + text_encoding = process_text(text) + video_encoding = process_video(video_path) + audio_features = process_audio(video_path) + batch = {'text': text_encoding, 'video': video_encoding, 'audio': audio_features, 'label': None} + label = final_model(batch) + id2label = {v: k for k, v in label2id.items()} + return id2label[int(label.detach().cpu())] + + +def predict_emotion(text: str, video_path: str): + try: + return infer(text, video_path) + except Exception as e: + sentry_sdk.capture_exception(e) + raise e + + +final_model = create_final_model() + + +@app.route("/model", methods=["POST"]) +def infer(): + msg_text = request.json["last_human_utterances"][-1]["text"] + msg_split = msg_text.split('\n') + + if all([len(msg_split) == 2, "https://" in msg_split[1], len(msg_split[0])]): + try: + logger.info(f"Emotion Detection: {msg_text}") + emotion = predict_emotion(msg_split[0], msg_split[1]) + except Exception as e: + raise ValueError(f"The message format is correct, but: {e}") + else: + raise ValueError("Input should be text and a videofile link on two separate lines.") + return jsonify(emotion) + + +if __name__ == "__main__": + app.run(debug=False, host="0.0.0.0", port=8027) \ No newline at end of file diff --git a/annotators/emotion_detection/service_configs/emotion_detection/environment.yml b/annotators/emotion_detection/service_configs/emotion_detection/environment.yml new file mode 100644 index 0000000000..f596cf9d27 --- /dev/null +++ b/annotators/emotion_detection/service_configs/emotion_detection/environment.yml @@ -0,0 +1,2 @@ +SERVICE_PORT: 8027 +SERVICE_NAME: emotion_detection diff --git a/annotators/emotion_detection/service_configs/emotion_detection/service.yml b/annotators/emotion_detection/service_configs/emotion_detection/service.yml new file mode 100644 index 0000000000..1c890607d4 --- /dev/null +++ b/annotators/emotion_detection/service_configs/emotion_detection/service.yml @@ -0,0 +1,23 @@ +name: emotion-detection +endpoints: +- model +compose: + env_file: + - .env + build: + args: + SERVICE_PORT: 8027 + SERVICE_NAME: emotion_detection + context: . + dockerfile: ./annotators/emotion_detection/Dockerfile + command: uvicorn server:app --host 0.0.0.0 --port 8027 + deploy: + resources: + limits: + memory: 312M + reservations: + memory: 312M + volumes: + - ./annotators/emotion_detection:/src + ports: + - 8027:8027 \ No newline at end of file diff --git a/annotators/emotion_detection/test.py b/annotators/emotion_detection/test.py new file mode 100644 index 0000000000..4b9b3b5227 --- /dev/null +++ b/annotators/emotion_detection/test.py @@ -0,0 +1,12 @@ +# import requests + + +# def test(): +# response = requests.post("http://0.0.0.0:8026/model", json={"personality": ["Hello world"]}) +# assert response.status_code == 200 +# assert response.json() == [{"EXT": 0, "NEU": 1, "AGR": 1, "CON": 0, "OPN": 1}] +# print("SUCCESS") + + +# if __name__ == "__main__": +# test() diff --git a/annotators/emotion_detection/test.sh b/annotators/emotion_detection/test.sh new file mode 100644 index 0000000000..c1b69d856e --- /dev/null +++ b/annotators/emotion_detection/test.sh @@ -0,0 +1,2 @@ +#!/bin/bash +#python test.py \ No newline at end of file diff --git a/assistant_dists/dream_ocean/dev.yml b/assistant_dists/dream_ocean/dev.yml index 212a907368..13ecee55fd 100644 --- a/assistant_dists/dream_ocean/dev.yml +++ b/assistant_dists/dream_ocean/dev.yml @@ -144,4 +144,9 @@ services: - "./annotators/personality_detection:/src" ports: - 8026:8026 + emotion-detection: + volumes: + - "./annotators/emotion_detection:/src" + ports: + - 8027:8027 version: "3.7" diff --git a/assistant_dists/dream_ocean/docker-compose.override.yml b/assistant_dists/dream_ocean/docker-compose.override.yml index 60f24f08b7..033ad85e7e 100644 --- a/assistant_dists/dream_ocean/docker-compose.override.yml +++ b/assistant_dists/dream_ocean/docker-compose.override.yml @@ -7,7 +7,7 @@ services: factoid-qa:8071, kbqa:8072, entity-linking:8075, wiki-parser:8077, text-qa:8078, combined-classification:8087, fact-retrieval:8100, entity-detection:8103, sentence-ranker:8128, property-extraction:8136, prompt-selector:8135, openai-api-chatgpt:8145, - openai-api-chatgpt-16k:8167, summarization-annotator:8058, dialog-summarizer:8059, personality-detection:8026" + openai-api-chatgpt-16k:8167, summarization-annotator:8058, dialog-summarizer:8059, personality-detection:8026, emotion-detection:8027" WAIT_HOSTS_TIMEOUT: ${WAIT_TIMEOUT:-1000} HIGH_PRIORITY_INTENTS: 1 RESTRICTION_FOR_SENSITIVE_CASE: 1 @@ -441,4 +441,20 @@ services: reservations: memory: 312M + emotion-detection: + build: + args: + SERVICE_PORT: 8027 + SERVICE_NAME: emotion_detection + context: annotators/emotion_detection + command: flask run -h 0.0.0.0 -p 8027 + deploy: + mode: replicated + replicas: 1 + resources: + limits: + memory: 312M + reservations: + memory: 312M + version: '3.7' diff --git a/assistant_dists/dream_ocean/pipeline_conf.json b/assistant_dists/dream_ocean/pipeline_conf.json index 6e77e5faec..ac2657ed66 100644 --- a/assistant_dists/dream_ocean/pipeline_conf.json +++ b/assistant_dists/dream_ocean/pipeline_conf.json @@ -101,6 +101,22 @@ "service": "annotators/personality_detection/service_configs/personality_detection" } }, + "emotion_detection": { + "connector": { + "protocol": "http", + "timeout": 3.0, + "url": "http://emotion-detection:8027/model" + }, + "dialog_formatter": "state_formatters.dp_formatters:last_human_bot_annotated_utterance", + "response_formatter": "state_formatters.dp_formatters:simple_formatter_service", + "state_manager_method": "add_annotation", + "previous_services": [], + "is_enabled": true, + "source": { + "component": "components/OQWoiqfnqwfnoqwib.yml", + "service": "annotators/emotion_detection/service_configs/emotion_detection" + } + }, "prompt_goals_collector": { "connector": { "protocol": "http", diff --git a/components.tsv b/components.tsv index ff1160f50e..12e52bd3f4 100644 --- a/components.tsv +++ b/components.tsv @@ -29,7 +29,7 @@ 8024 sentiment-classification-multilingual 8025 8026 personality-detection -8027 +8027 emotion-detection 8028 8029 convert-reddit 8030 personal-info-ru-skill,personal-info-skill diff --git a/components/OQWoiqfnqwfnoqwib.yml b/components/OQWoiqfnqwfnoqwib.yml new file mode 100644 index 0000000000..636db86a21 --- /dev/null +++ b/components/OQWoiqfnqwfnoqwib.yml @@ -0,0 +1,23 @@ +name: emotion_detection +display_name: Emotion Detection +component_type: null +model_type: ML-based +is_customizable: false +author: publisher@deeppavlov.ai +description: Emotion detection annotator. +ram_usage: 312M +gpu_usage: null +group: annotators +connector: + protocol: http + timeout: 3.0 + url: http://emotion-detection:8027/model +dialog_formatter: state_formatters.dp_formatters:last_human_bot_annotated_utterance +response_formatter: state_formatters.dp_formatters:simple_formatter_service +previous_services: null +required_previous_services: null +state_manager_method: add_annotation +tags: null +endpoint: model +service: annotators/emotion_detection/service_configs/emotion_detection +date_created: '2023-08-28T12:12:12' \ No newline at end of file diff --git a/components/OowqncqowNAbj.yml b/components/OowqncqowNAbj.yml index 60d640c74f..3ec35fe8ab 100644 --- a/components/OowqncqowNAbj.yml +++ b/components/OowqncqowNAbj.yml @@ -20,4 +20,4 @@ state_manager_method: add_annotation tags: null endpoint: model service: annotators/personality_detection/service_configs/personality_detection -date_created: '2023-08-24T12:12:12' +date_created: '2023-08-24T12:12:12' \ No newline at end of file From c8898292e34f7d35ecb7c963f6557240da0608b2 Mon Sep 17 00:00:00 2001 From: moon-strider Date: Tue, 29 Aug 2023 16:58:31 +0300 Subject: [PATCH 02/50] many small fixes --- annotators/emotion_detection/Dockerfile | 10 +++++----- annotators/emotion_detection/requirements.txt | 7 ++++--- annotators/emotion_detection/server.py | 4 ++-- .../dream_ocean/docker-compose.override.yml | 2 ++ 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/annotators/emotion_detection/Dockerfile b/annotators/emotion_detection/Dockerfile index 1b0c4b5065..6047dc4e96 100644 --- a/annotators/emotion_detection/Dockerfile +++ b/annotators/emotion_detection/Dockerfile @@ -1,21 +1,21 @@ -FROM python:3.7 +FROM python:3.9 WORKDIR /src RUN apt update -RUN pip install -y gdown +RUN pip install gdown RUN git clone https://github.com/anna-a-m/MultimodalERC repo -RUN mv -rf repo/multimodal_concat/* . -RUN rm -rf +RUN mv -f repo/* . +RUN rm -rf repo RUN gdown 'https://drive.google.com/file/d/12C36rGUe7tuWGAh_FByw80c3wAtdUHx8/view?usp=drive_link' -O '1d_cnn_with_opensmile.pt' RUN gdown 'https://drive.google.com/file/d/1ZHw2MEbjLwU5A7EaNysgVHZlaWq4FJZG/view?usp=drive_link' -O 'bert-large-uncased_none_seed-42.pt' RUN gdown 'https://drive.google.com/file/d/1tDf-jWihZ6M0oX-niOfVmLUimJqYrG_M/view?usp=drive_link' -O 'final_model.pt' RUN gdown 'https://drive.google.com/file/d/1DMUHqbwqn-j9XIhoqnfSwqyqrlPMkVJe/view?usp=drive_link' -O 'XCLIP_Augmented.pt' -COPY . . +COPY . /src RUN pip install -r requirements.txt diff --git a/annotators/emotion_detection/requirements.txt b/annotators/emotion_detection/requirements.txt index b8d52e7993..dcca57e464 100644 --- a/annotators/emotion_detection/requirements.txt +++ b/annotators/emotion_detection/requirements.txt @@ -113,7 +113,7 @@ scipy==1.9.3 seaborn==0.12.2 sentry-sdk==1.15.0 setproctitle==1.3.2 -sklearn==0.0.post1 +scikit-learn==1.3.0 smmap==5.0.0 soundfile==0.12.1 sympy==1.12 @@ -127,7 +127,7 @@ tensorflow-io-gcs-filesystem==0.32.0 termcolor==2.2.0 tifffile==2023.7.18 tokenizers==0.12.1 -torch==2.0.1 +torch==1.13.1 torch-optimizer==0.3.0 torchaudio==0.13.1 torchmetrics==0.9.3 @@ -144,4 +144,5 @@ wrapt==1.14.1 xxhash==3.2.0 yacs==0.1.8 yarl==1.8.2 -zipp==3.15.0 \ No newline at end of file +zipp==3.15.0 +flask==2.2.2 \ No newline at end of file diff --git a/annotators/emotion_detection/server.py b/annotators/emotion_detection/server.py index 278b2ced6d..4ecfa3504b 100644 --- a/annotators/emotion_detection/server.py +++ b/annotators/emotion_detection/server.py @@ -1,8 +1,8 @@ import logging import os import opensmile -from models import MultimodalClassificaionModel, MainModel -from utils import prepare_models +from multimodal_concat.models import MultimodalClassificaionModel, MainModel +from multimodal_concat.utils import prepare_models import torch import numpy as np diff --git a/assistant_dists/dream_ocean/docker-compose.override.yml b/assistant_dists/dream_ocean/docker-compose.override.yml index 033ad85e7e..c8c7e13a14 100644 --- a/assistant_dists/dream_ocean/docker-compose.override.yml +++ b/assistant_dists/dream_ocean/docker-compose.override.yml @@ -456,5 +456,7 @@ services: memory: 312M reservations: memory: 312M + environment: + - FLASK_APP=server version: '3.7' From a37bb53dd7b74690e929fef8d4fe978c182aac92 Mon Sep 17 00:00:00 2001 From: moon-strider Date: Wed, 30 Aug 2023 12:53:12 +0300 Subject: [PATCH 03/50] gdown fix --- annotators/emotion_detection/Dockerfile | 16 +++++++++------- annotators/emotion_detection/requirements.txt | 3 ++- annotators/emotion_detection/server.py | 2 +- .../dream_ocean/docker-compose.override.yml | 2 -- 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/annotators/emotion_detection/Dockerfile b/annotators/emotion_detection/Dockerfile index 6047dc4e96..d6ea8cba91 100644 --- a/annotators/emotion_detection/Dockerfile +++ b/annotators/emotion_detection/Dockerfile @@ -2,7 +2,11 @@ FROM python:3.9 WORKDIR /src +COPY . /src +RUN pip install -r requirements.txt + RUN apt update +RUN apt install -y ffmpeg libsm6 libxext6 RUN pip install gdown @@ -11,11 +15,9 @@ RUN git clone https://github.com/anna-a-m/MultimodalERC repo RUN mv -f repo/* . RUN rm -rf repo -RUN gdown 'https://drive.google.com/file/d/12C36rGUe7tuWGAh_FByw80c3wAtdUHx8/view?usp=drive_link' -O '1d_cnn_with_opensmile.pt' -RUN gdown 'https://drive.google.com/file/d/1ZHw2MEbjLwU5A7EaNysgVHZlaWq4FJZG/view?usp=drive_link' -O 'bert-large-uncased_none_seed-42.pt' -RUN gdown 'https://drive.google.com/file/d/1tDf-jWihZ6M0oX-niOfVmLUimJqYrG_M/view?usp=drive_link' -O 'final_model.pt' -RUN gdown 'https://drive.google.com/file/d/1DMUHqbwqn-j9XIhoqnfSwqyqrlPMkVJe/view?usp=drive_link' -O 'XCLIP_Augmented.pt' +RUN touch multimodal_concat/__init__.py -COPY . /src - -RUN pip install -r requirements.txt +RUN gdown 'https://drive.google.com/uc?id=12C36rGUe7tuWGAh_FByw80c3wAtdUHx8' -O '1d_cnn_with_opensmile.pt' +RUN gdown 'https://drive.google.com/uc?id=1ZHw2MEbjLwU5A7EaNysgVHZlaWq4FJZG' -O 'bert-large-uncased_none_seed-42.pt' +RUN gdown 'https://drive.google.com/uc?id=1tDf-jWihZ6M0oX-niOfVmLUimJqYrG_M' -O 'final_model.pt' +RUN gdown 'https://drive.google.com/uc?id=1DMUHqbwqn-j9XIhoqnfSwqyqrlPMkVJe' -O 'XCLIP_Augmented.pt' \ No newline at end of file diff --git a/annotators/emotion_detection/requirements.txt b/annotators/emotion_detection/requirements.txt index dcca57e464..28311209b2 100644 --- a/annotators/emotion_detection/requirements.txt +++ b/annotators/emotion_detection/requirements.txt @@ -145,4 +145,5 @@ xxhash==3.2.0 yacs==0.1.8 yarl==1.8.2 zipp==3.15.0 -flask==2.2.2 \ No newline at end of file +flask==2.2.2 +blinker==1.5.0 \ No newline at end of file diff --git a/annotators/emotion_detection/server.py b/annotators/emotion_detection/server.py index 4ecfa3504b..330fb0ee87 100644 --- a/annotators/emotion_detection/server.py +++ b/annotators/emotion_detection/server.py @@ -17,7 +17,7 @@ label2id = {'anger': 0, 'disgust': 1, 'fear': 2, 'joy': 3, 'neutral': 4, 'sadness': 5, 'surprise': 6} num_labels = 7 -text_model, video_model, audio_model = prepare_models(num_labels) +text_model, video_model, audio_model = prepare_models(num_labels, "./") logger = logging.getLogger(__name__) diff --git a/assistant_dists/dream_ocean/docker-compose.override.yml b/assistant_dists/dream_ocean/docker-compose.override.yml index c8c7e13a14..f9d34c61ed 100644 --- a/assistant_dists/dream_ocean/docker-compose.override.yml +++ b/assistant_dists/dream_ocean/docker-compose.override.yml @@ -449,8 +449,6 @@ services: context: annotators/emotion_detection command: flask run -h 0.0.0.0 -p 8027 deploy: - mode: replicated - replicas: 1 resources: limits: memory: 312M From bbebaa0246353a719fbe8f12e4b5d87de52877f0 Mon Sep 17 00:00:00 2001 From: moon-strider Date: Wed, 30 Aug 2023 15:48:31 +0300 Subject: [PATCH 04/50] major update to configs, small change in data receiving --- annotators/emotion_detection/Dockerfile | 7 +++++-- annotators/emotion_detection/requirements.txt | 2 +- annotators/emotion_detection/server.py | 10 ++++++---- assistant_dists/dream_ocean/dev.yml | 3 ++- .../dream_ocean/docker-compose.override.yml | 1 + 5 files changed, 15 insertions(+), 8 deletions(-) diff --git a/annotators/emotion_detection/Dockerfile b/annotators/emotion_detection/Dockerfile index d6ea8cba91..24b4ad1c9f 100644 --- a/annotators/emotion_detection/Dockerfile +++ b/annotators/emotion_detection/Dockerfile @@ -1,11 +1,14 @@ -FROM python:3.9 +FROM nvidia/cuda:12.1.1-base-ubuntu20.04 ++ +RUN apt update +RUN apt install -y python3.9 +RUN apt install -y git python3-pip WORKDIR /src COPY . /src RUN pip install -r requirements.txt -RUN apt update RUN apt install -y ffmpeg libsm6 libxext6 RUN pip install gdown diff --git a/annotators/emotion_detection/requirements.txt b/annotators/emotion_detection/requirements.txt index 28311209b2..d1a5f700ce 100644 --- a/annotators/emotion_detection/requirements.txt +++ b/annotators/emotion_detection/requirements.txt @@ -125,7 +125,7 @@ tensorflow==2.13.0 tensorflow-estimator==2.13.0 tensorflow-io-gcs-filesystem==0.32.0 termcolor==2.2.0 -tifffile==2023.7.18 +tifffile==2023.7.10 tokenizers==0.12.1 torch==1.13.1 torch-optimizer==0.3.0 diff --git a/annotators/emotion_detection/server.py b/annotators/emotion_detection/server.py index 330fb0ee87..dbfe1500f6 100644 --- a/annotators/emotion_detection/server.py +++ b/annotators/emotion_detection/server.py @@ -21,6 +21,8 @@ logger = logging.getLogger(__name__) +prefix = "Detect emotions:" +prefix_len = len(prefix) def sample_frame_indices(seg_len, clip_len=16, frame_sample_rate=4, mode="video"): converted_len = int(clip_len * frame_sample_rate) @@ -132,12 +134,12 @@ def predict_emotion(text: str, video_path: str): @app.route("/model", methods=["POST"]) def infer(): msg_text = request.json["last_human_utterances"][-1]["text"] - msg_split = msg_text.split('\n') - if all([len(msg_split) == 2, "https://" in msg_split[1], len(msg_split[0])]): + if prefix in msg_text: try: - logger.info(f"Emotion Detection: {msg_text}") - emotion = predict_emotion(msg_split[0], msg_split[1]) + text = msg_text[prefix_len:] + logger.info(f"Emotion Detection: {text}") + emotion = predict_emotion(text, "/src/datafiles/vid.mp4") except Exception as e: raise ValueError(f"The message format is correct, but: {e}") else: diff --git a/assistant_dists/dream_ocean/dev.yml b/assistant_dists/dream_ocean/dev.yml index 13ecee55fd..cd6b1598e2 100644 --- a/assistant_dists/dream_ocean/dev.yml +++ b/assistant_dists/dream_ocean/dev.yml @@ -146,7 +146,8 @@ services: - 8026:8026 emotion-detection: volumes: - - "./annotators/emotion_detection:/src" + - "./annotators/emotion_detection:/src/drm" + - "/home/dikanskiy/emotion_test:/src/datafiles" ports: - 8027:8027 version: "3.7" diff --git a/assistant_dists/dream_ocean/docker-compose.override.yml b/assistant_dists/dream_ocean/docker-compose.override.yml index f9d34c61ed..c2fbaabfaa 100644 --- a/assistant_dists/dream_ocean/docker-compose.override.yml +++ b/assistant_dists/dream_ocean/docker-compose.override.yml @@ -455,6 +455,7 @@ services: reservations: memory: 312M environment: + - CUDA_VISIBLE_DEVICES=0 - FLASK_APP=server version: '3.7' From b1449db5329cfc8479ccfd59da2a61418f811d0b Mon Sep 17 00:00:00 2001 From: moon-strider Date: Wed, 30 Aug 2023 16:14:43 +0300 Subject: [PATCH 05/50] small typo fixed, logging added --- annotators/emotion_detection/Dockerfile | 2 +- annotators/emotion_detection/server.py | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/annotators/emotion_detection/Dockerfile b/annotators/emotion_detection/Dockerfile index 24b4ad1c9f..82fa523543 100644 --- a/annotators/emotion_detection/Dockerfile +++ b/annotators/emotion_detection/Dockerfile @@ -1,5 +1,5 @@ FROM nvidia/cuda:12.1.1-base-ubuntu20.04 -+ + RUN apt update RUN apt install -y python3.9 RUN apt install -y git python3-pip diff --git a/annotators/emotion_detection/server.py b/annotators/emotion_detection/server.py index dbfe1500f6..d71b4c74c6 100644 --- a/annotators/emotion_detection/server.py +++ b/annotators/emotion_detection/server.py @@ -110,7 +110,7 @@ def process_audio(file_path: str): return audio_features.values.reshape(audio_features.shape[0], 1, audio_features.shape[1]) -def infer(text: str, video_path: str): +def inference(text: str, video_path: str): text_encoding = process_text(text) video_encoding = process_video(video_path) audio_features = process_audio(video_path) @@ -122,7 +122,7 @@ def infer(text: str, video_path: str): def predict_emotion(text: str, video_path: str): try: - return infer(text, video_path) + return inference(text, video_path) except Exception as e: sentry_sdk.capture_exception(e) raise e @@ -140,6 +140,7 @@ def infer(): text = msg_text[prefix_len:] logger.info(f"Emotion Detection: {text}") emotion = predict_emotion(text, "/src/datafiles/vid.mp4") + logger.info(f"Detected emotion: {jsonify(emotion)}") except Exception as e: raise ValueError(f"The message format is correct, but: {e}") else: From 151845335f9b1b1476aefe851a8efb477d9b5140 Mon Sep 17 00:00:00 2001 From: moon-strider Date: Wed, 30 Aug 2023 23:05:58 +0300 Subject: [PATCH 06/50] everything prepared for a pr --- .../service_configs/emotion_detection/environment.yml | 1 + .../service_configs/emotion_detection/service.yml | 7 ++++--- assistant_dists/dream_ocean/docker-compose.override.yml | 4 ++-- assistant_dists/dream_ocean/pipeline_conf.json | 2 +- components/OQWoiqfnqwfnoqwib.yml | 6 +++--- 5 files changed, 11 insertions(+), 9 deletions(-) diff --git a/annotators/emotion_detection/service_configs/emotion_detection/environment.yml b/annotators/emotion_detection/service_configs/emotion_detection/environment.yml index f596cf9d27..51eef8842a 100644 --- a/annotators/emotion_detection/service_configs/emotion_detection/environment.yml +++ b/annotators/emotion_detection/service_configs/emotion_detection/environment.yml @@ -1,2 +1,3 @@ SERVICE_PORT: 8027 SERVICE_NAME: emotion_detection +CUDA_VISIBLE_DEVICES: 0 \ No newline at end of file diff --git a/annotators/emotion_detection/service_configs/emotion_detection/service.yml b/annotators/emotion_detection/service_configs/emotion_detection/service.yml index 1c890607d4..03874a5162 100644 --- a/annotators/emotion_detection/service_configs/emotion_detection/service.yml +++ b/annotators/emotion_detection/service_configs/emotion_detection/service.yml @@ -8,16 +8,17 @@ compose: args: SERVICE_PORT: 8027 SERVICE_NAME: emotion_detection + CUDA_VISIBLE_DEVICES: 0 context: . dockerfile: ./annotators/emotion_detection/Dockerfile command: uvicorn server:app --host 0.0.0.0 --port 8027 deploy: resources: limits: - memory: 312M + memory: 1G reservations: - memory: 312M + memory: 1G volumes: - - ./annotators/emotion_detection:/src + - ./annotators/emotion_detection:/src/drm ports: - 8027:8027 \ No newline at end of file diff --git a/assistant_dists/dream_ocean/docker-compose.override.yml b/assistant_dists/dream_ocean/docker-compose.override.yml index c2fbaabfaa..578718b8c3 100644 --- a/assistant_dists/dream_ocean/docker-compose.override.yml +++ b/assistant_dists/dream_ocean/docker-compose.override.yml @@ -451,9 +451,9 @@ services: deploy: resources: limits: - memory: 312M + memory: 1G reservations: - memory: 312M + memory: 1G environment: - CUDA_VISIBLE_DEVICES=0 - FLASK_APP=server diff --git a/assistant_dists/dream_ocean/pipeline_conf.json b/assistant_dists/dream_ocean/pipeline_conf.json index ac2657ed66..3f65b3eb76 100644 --- a/assistant_dists/dream_ocean/pipeline_conf.json +++ b/assistant_dists/dream_ocean/pipeline_conf.json @@ -104,7 +104,7 @@ "emotion_detection": { "connector": { "protocol": "http", - "timeout": 3.0, + "timeout": 15.0, "url": "http://emotion-detection:8027/model" }, "dialog_formatter": "state_formatters.dp_formatters:last_human_bot_annotated_utterance", diff --git a/components/OQWoiqfnqwfnoqwib.yml b/components/OQWoiqfnqwfnoqwib.yml index 636db86a21..2deecd22a4 100644 --- a/components/OQWoiqfnqwfnoqwib.yml +++ b/components/OQWoiqfnqwfnoqwib.yml @@ -5,12 +5,12 @@ model_type: ML-based is_customizable: false author: publisher@deeppavlov.ai description: Emotion detection annotator. -ram_usage: 312M -gpu_usage: null +ram_usage: 1G +gpu_usage: 1G group: annotators connector: protocol: http - timeout: 3.0 + timeout: 15.0 url: http://emotion-detection:8027/model dialog_formatter: state_formatters.dp_formatters:last_human_bot_annotated_utterance response_formatter: state_formatters.dp_formatters:simple_formatter_service From 2d0c946bcc4dd69aedf9d2ed458c4385dfce9c9a Mon Sep 17 00:00:00 2001 From: moon-strider Date: Wed, 30 Aug 2023 23:15:10 +0300 Subject: [PATCH 07/50] conflict resolved, port for emotion_detection changed, codestyle fixed --- annotators/emotion_detection/server.py | 68 +++++++++++++------ .../emotion_detection/environment.yml | 2 +- .../emotion_detection/service.yml | 6 +- assistant_dists/dream_ocean/dev.yml | 2 +- .../dream_ocean/docker-compose.override.yml | 6 +- .../dream_ocean/pipeline_conf.json | 2 +- components.tsv | 4 +- components/OQWoiqfnqwfnoqwib.yml | 2 +- 8 files changed, 58 insertions(+), 34 deletions(-) diff --git a/annotators/emotion_detection/server.py b/annotators/emotion_detection/server.py index d71b4c74c6..46dbf92839 100644 --- a/annotators/emotion_detection/server.py +++ b/annotators/emotion_detection/server.py @@ -15,7 +15,15 @@ sentry_sdk.init(dsn=os.getenv("SENTRY_DSN"), integrations=[FlaskIntegration()]) app = Flask(__name__) -label2id = {'anger': 0, 'disgust': 1, 'fear': 2, 'joy': 3, 'neutral': 4, 'sadness': 5, 'surprise': 6} +label2id = { + "anger": 0, + "disgust": 1, + "fear": 2, + "joy": 3, + "neutral": 4, + "sadness": 5, + "surprise": 6, +} num_labels = 7 text_model, video_model, audio_model = prepare_models(num_labels, "./") @@ -24,20 +32,24 @@ prefix = "Detect emotions:" prefix_len = len(prefix) + def sample_frame_indices(seg_len, clip_len=16, frame_sample_rate=4, mode="video"): converted_len = int(clip_len * frame_sample_rate) - converted_len = min(converted_len, seg_len-1) + converted_len = min(converted_len, seg_len - 1) end_idx = np.random.randint(converted_len, seg_len) start_idx = end_idx - converted_len if mode == "video": indices = np.linspace(start_idx, end_idx, num=clip_len) else: - indices = np.linspace(start_idx, end_idx, num=clip_len*frame_sample_rate) + indices = np.linspace(start_idx, end_idx, num=clip_len * frame_sample_rate) indices = np.clip(indices, start_idx, end_idx - 1).astype(np.int64) return indices -def get_frames(file_path, clip_len=16,): +def get_frames( + file_path, + clip_len=16, +): cap = cv2.VideoCapture(file_path) v_len = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) indices = sample_frame_indices(v_len) @@ -47,8 +59,8 @@ def get_frames(file_path, clip_len=16,): success, frame = cap.read() if success is False: continue - if (fn in indices): - frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) + if fn in indices: + frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) res = cv2.resize(frame, dsize=(224, 224), interpolation=cv2.INTER_CUBIC) frames.append(res) cap.release() @@ -60,31 +72,34 @@ def get_frames(file_path, clip_len=16,): return frames + def create_final_model(): multi_model = MultimodalClassificaionModel( text_model, video_model, audio_model, num_labels, - input_size=1920, - hidden_size=512 + input_size=1920, + hidden_size=512, ) - checkpoint = torch.load('final_model.pt') + checkpoint = torch.load("final_model.pt") multi_model.load_state_dict(checkpoint) - device = 'cuda' + device = "cuda" return MainModel(multi_model, device=device) def process_text(input_tokens: str): - text_model_name = 'bert-large-uncased' + text_model_name = "bert-large-uncased" tokenizer = AutoTokenizer.from_pretrained(text_model_name) - return tokenizer(input_tokens, - padding='max_length', - truncation=True, - max_length=128, - return_tensors='pt') + return tokenizer( + input_tokens, + padding="max_length", + truncation=True, + max_length=128, + return_tensors="pt", + ) def process_video(video_path: str): @@ -100,21 +115,28 @@ def process_audio(file_path: str): smile = opensmile.Smile( opensmile.FeatureSet.ComParE_2016, opensmile.FeatureLevel.Functionals, - sampling_rate=16000, - resample=True, + sampling_rate=16000, + resample=True, num_workers=5, verbose=True, ) audio_features = smile.process_files([file_path]) - return audio_features.values.reshape(audio_features.shape[0], 1, audio_features.shape[1]) + return audio_features.values.reshape( + audio_features.shape[0], 1, audio_features.shape[1] + ) def inference(text: str, video_path: str): text_encoding = process_text(text) video_encoding = process_video(video_path) audio_features = process_audio(video_path) - batch = {'text': text_encoding, 'video': video_encoding, 'audio': audio_features, 'label': None} + batch = { + "text": text_encoding, + "video": video_encoding, + "audio": audio_features, + "label": None, + } label = final_model(batch) id2label = {v: k for k, v in label2id.items()} return id2label[int(label.detach().cpu())] @@ -144,9 +166,11 @@ def infer(): except Exception as e: raise ValueError(f"The message format is correct, but: {e}") else: - raise ValueError("Input should be text and a videofile link on two separate lines.") + raise ValueError( + "Input should be text and a videofile link on two separate lines." + ) return jsonify(emotion) if __name__ == "__main__": - app.run(debug=False, host="0.0.0.0", port=8027) \ No newline at end of file + app.run(debug=False, host="0.0.0.0", port=8025) diff --git a/annotators/emotion_detection/service_configs/emotion_detection/environment.yml b/annotators/emotion_detection/service_configs/emotion_detection/environment.yml index 51eef8842a..0a4f1e3b50 100644 --- a/annotators/emotion_detection/service_configs/emotion_detection/environment.yml +++ b/annotators/emotion_detection/service_configs/emotion_detection/environment.yml @@ -1,3 +1,3 @@ -SERVICE_PORT: 8027 +SERVICE_PORT: 8025 SERVICE_NAME: emotion_detection CUDA_VISIBLE_DEVICES: 0 \ No newline at end of file diff --git a/annotators/emotion_detection/service_configs/emotion_detection/service.yml b/annotators/emotion_detection/service_configs/emotion_detection/service.yml index 03874a5162..3f8b1f82e6 100644 --- a/annotators/emotion_detection/service_configs/emotion_detection/service.yml +++ b/annotators/emotion_detection/service_configs/emotion_detection/service.yml @@ -6,12 +6,12 @@ compose: - .env build: args: - SERVICE_PORT: 8027 + SERVICE_PORT: 8025 SERVICE_NAME: emotion_detection CUDA_VISIBLE_DEVICES: 0 context: . dockerfile: ./annotators/emotion_detection/Dockerfile - command: uvicorn server:app --host 0.0.0.0 --port 8027 + command: uvicorn server:app --host 0.0.0.0 --port 8025 deploy: resources: limits: @@ -21,4 +21,4 @@ compose: volumes: - ./annotators/emotion_detection:/src/drm ports: - - 8027:8027 \ No newline at end of file + - 8025:8025 \ No newline at end of file diff --git a/assistant_dists/dream_ocean/dev.yml b/assistant_dists/dream_ocean/dev.yml index cd6b1598e2..3e35fe47c9 100644 --- a/assistant_dists/dream_ocean/dev.yml +++ b/assistant_dists/dream_ocean/dev.yml @@ -149,5 +149,5 @@ services: - "./annotators/emotion_detection:/src/drm" - "/home/dikanskiy/emotion_test:/src/datafiles" ports: - - 8027:8027 + - 8025:8025 version: "3.7" diff --git a/assistant_dists/dream_ocean/docker-compose.override.yml b/assistant_dists/dream_ocean/docker-compose.override.yml index 578718b8c3..458d35d38a 100644 --- a/assistant_dists/dream_ocean/docker-compose.override.yml +++ b/assistant_dists/dream_ocean/docker-compose.override.yml @@ -7,7 +7,7 @@ services: factoid-qa:8071, kbqa:8072, entity-linking:8075, wiki-parser:8077, text-qa:8078, combined-classification:8087, fact-retrieval:8100, entity-detection:8103, sentence-ranker:8128, property-extraction:8136, prompt-selector:8135, openai-api-chatgpt:8145, - openai-api-chatgpt-16k:8167, summarization-annotator:8058, dialog-summarizer:8059, personality-detection:8026, emotion-detection:8027" + openai-api-chatgpt-16k:8167, summarization-annotator:8058, dialog-summarizer:8059, personality-detection:8026, emotion-detection:8025" WAIT_HOSTS_TIMEOUT: ${WAIT_TIMEOUT:-1000} HIGH_PRIORITY_INTENTS: 1 RESTRICTION_FOR_SENSITIVE_CASE: 1 @@ -444,10 +444,10 @@ services: emotion-detection: build: args: - SERVICE_PORT: 8027 + SERVICE_PORT: 8025 SERVICE_NAME: emotion_detection context: annotators/emotion_detection - command: flask run -h 0.0.0.0 -p 8027 + command: flask run -h 0.0.0.0 -p 8025 deploy: resources: limits: diff --git a/assistant_dists/dream_ocean/pipeline_conf.json b/assistant_dists/dream_ocean/pipeline_conf.json index 3f65b3eb76..acbabe1fa6 100644 --- a/assistant_dists/dream_ocean/pipeline_conf.json +++ b/assistant_dists/dream_ocean/pipeline_conf.json @@ -105,7 +105,7 @@ "connector": { "protocol": "http", "timeout": 15.0, - "url": "http://emotion-detection:8027/model" + "url": "http://emotion-detection:8025/model" }, "dialog_formatter": "state_formatters.dp_formatters:last_human_bot_annotated_utterance", "response_formatter": "state_formatters.dp_formatters:simple_formatter_service", diff --git a/components.tsv b/components.tsv index 12e52bd3f4..a0d7915e9e 100644 --- a/components.tsv +++ b/components.tsv @@ -27,9 +27,9 @@ 8022 dff-program-y-dangerous-skill 8023 dff-movie-skill 8024 sentiment-classification-multilingual -8025 +8025 emotion-detection 8026 personality-detection -8027 emotion-detection +8027 8028 8029 convert-reddit 8030 personal-info-ru-skill,personal-info-skill diff --git a/components/OQWoiqfnqwfnoqwib.yml b/components/OQWoiqfnqwfnoqwib.yml index 2deecd22a4..6deba4e06b 100644 --- a/components/OQWoiqfnqwfnoqwib.yml +++ b/components/OQWoiqfnqwfnoqwib.yml @@ -11,7 +11,7 @@ group: annotators connector: protocol: http timeout: 15.0 - url: http://emotion-detection:8027/model + url: http://emotion-detection:8025/model dialog_formatter: state_formatters.dp_formatters:last_human_bot_annotated_utterance response_formatter: state_formatters.dp_formatters:simple_formatter_service previous_services: null From 4e22e5a407f1a36b949e270532768dfab5be52a1 Mon Sep 17 00:00:00 2001 From: moon-strider Date: Wed, 30 Aug 2023 23:18:03 +0300 Subject: [PATCH 08/50] codestyle fixed again --- annotators/emotion_detection/server.py | 68 +++++++++----------------- 1 file changed, 22 insertions(+), 46 deletions(-) diff --git a/annotators/emotion_detection/server.py b/annotators/emotion_detection/server.py index 46dbf92839..5401b3a7c9 100644 --- a/annotators/emotion_detection/server.py +++ b/annotators/emotion_detection/server.py @@ -15,15 +15,7 @@ sentry_sdk.init(dsn=os.getenv("SENTRY_DSN"), integrations=[FlaskIntegration()]) app = Flask(__name__) -label2id = { - "anger": 0, - "disgust": 1, - "fear": 2, - "joy": 3, - "neutral": 4, - "sadness": 5, - "surprise": 6, -} +label2id = {'anger': 0, 'disgust': 1, 'fear': 2, 'joy': 3, 'neutral': 4, 'sadness': 5, 'surprise': 6} num_labels = 7 text_model, video_model, audio_model = prepare_models(num_labels, "./") @@ -32,24 +24,20 @@ prefix = "Detect emotions:" prefix_len = len(prefix) - def sample_frame_indices(seg_len, clip_len=16, frame_sample_rate=4, mode="video"): converted_len = int(clip_len * frame_sample_rate) - converted_len = min(converted_len, seg_len - 1) + converted_len = min(converted_len, seg_len-1) end_idx = np.random.randint(converted_len, seg_len) start_idx = end_idx - converted_len if mode == "video": indices = np.linspace(start_idx, end_idx, num=clip_len) else: - indices = np.linspace(start_idx, end_idx, num=clip_len * frame_sample_rate) + indices = np.linspace(start_idx, end_idx, num=clip_len*frame_sample_rate) indices = np.clip(indices, start_idx, end_idx - 1).astype(np.int64) return indices -def get_frames( - file_path, - clip_len=16, -): +def get_frames(file_path, clip_len=16,): cap = cv2.VideoCapture(file_path) v_len = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) indices = sample_frame_indices(v_len) @@ -59,8 +47,8 @@ def get_frames( success, frame = cap.read() if success is False: continue - if fn in indices: - frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) + if (fn in indices): + frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) res = cv2.resize(frame, dsize=(224, 224), interpolation=cv2.INTER_CUBIC) frames.append(res) cap.release() @@ -72,34 +60,31 @@ def get_frames( return frames - def create_final_model(): multi_model = MultimodalClassificaionModel( text_model, video_model, audio_model, num_labels, - input_size=1920, - hidden_size=512, + input_size=1920, + hidden_size=512 ) - checkpoint = torch.load("final_model.pt") + checkpoint = torch.load('final_model.pt') multi_model.load_state_dict(checkpoint) - device = "cuda" + device = 'cuda' return MainModel(multi_model, device=device) def process_text(input_tokens: str): - text_model_name = "bert-large-uncased" + text_model_name = 'bert-large-uncased' tokenizer = AutoTokenizer.from_pretrained(text_model_name) - return tokenizer( - input_tokens, - padding="max_length", - truncation=True, - max_length=128, - return_tensors="pt", - ) + return tokenizer(input_tokens, + padding='max_length', + truncation=True, + max_length=128, + return_tensors='pt') def process_video(video_path: str): @@ -115,28 +100,21 @@ def process_audio(file_path: str): smile = opensmile.Smile( opensmile.FeatureSet.ComParE_2016, opensmile.FeatureLevel.Functionals, - sampling_rate=16000, - resample=True, + sampling_rate=16000, + resample=True, num_workers=5, verbose=True, ) audio_features = smile.process_files([file_path]) - return audio_features.values.reshape( - audio_features.shape[0], 1, audio_features.shape[1] - ) + return audio_features.values.reshape(audio_features.shape[0], 1, audio_features.shape[1]) def inference(text: str, video_path: str): text_encoding = process_text(text) video_encoding = process_video(video_path) audio_features = process_audio(video_path) - batch = { - "text": text_encoding, - "video": video_encoding, - "audio": audio_features, - "label": None, - } + batch = {'text': text_encoding, 'video': video_encoding, 'audio': audio_features, 'label': None} label = final_model(batch) id2label = {v: k for k, v in label2id.items()} return id2label[int(label.detach().cpu())] @@ -166,11 +144,9 @@ def infer(): except Exception as e: raise ValueError(f"The message format is correct, but: {e}") else: - raise ValueError( - "Input should be text and a videofile link on two separate lines." - ) + raise ValueError("Input should be text and a videofile link on two separate lines.") return jsonify(emotion) if __name__ == "__main__": - app.run(debug=False, host="0.0.0.0", port=8025) + app.run(debug=False, host="0.0.0.0", port=8025) \ No newline at end of file From 17603d1e6f46eb9f5b48ae2887dde0cfe114e9e5 Mon Sep 17 00:00:00 2001 From: moon-strider Date: Wed, 30 Aug 2023 23:19:44 +0300 Subject: [PATCH 09/50] yet another style fix --- annotators/emotion_detection/server.py | 68 +++++++++++++++++--------- 1 file changed, 46 insertions(+), 22 deletions(-) diff --git a/annotators/emotion_detection/server.py b/annotators/emotion_detection/server.py index 5401b3a7c9..46dbf92839 100644 --- a/annotators/emotion_detection/server.py +++ b/annotators/emotion_detection/server.py @@ -15,7 +15,15 @@ sentry_sdk.init(dsn=os.getenv("SENTRY_DSN"), integrations=[FlaskIntegration()]) app = Flask(__name__) -label2id = {'anger': 0, 'disgust': 1, 'fear': 2, 'joy': 3, 'neutral': 4, 'sadness': 5, 'surprise': 6} +label2id = { + "anger": 0, + "disgust": 1, + "fear": 2, + "joy": 3, + "neutral": 4, + "sadness": 5, + "surprise": 6, +} num_labels = 7 text_model, video_model, audio_model = prepare_models(num_labels, "./") @@ -24,20 +32,24 @@ prefix = "Detect emotions:" prefix_len = len(prefix) + def sample_frame_indices(seg_len, clip_len=16, frame_sample_rate=4, mode="video"): converted_len = int(clip_len * frame_sample_rate) - converted_len = min(converted_len, seg_len-1) + converted_len = min(converted_len, seg_len - 1) end_idx = np.random.randint(converted_len, seg_len) start_idx = end_idx - converted_len if mode == "video": indices = np.linspace(start_idx, end_idx, num=clip_len) else: - indices = np.linspace(start_idx, end_idx, num=clip_len*frame_sample_rate) + indices = np.linspace(start_idx, end_idx, num=clip_len * frame_sample_rate) indices = np.clip(indices, start_idx, end_idx - 1).astype(np.int64) return indices -def get_frames(file_path, clip_len=16,): +def get_frames( + file_path, + clip_len=16, +): cap = cv2.VideoCapture(file_path) v_len = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) indices = sample_frame_indices(v_len) @@ -47,8 +59,8 @@ def get_frames(file_path, clip_len=16,): success, frame = cap.read() if success is False: continue - if (fn in indices): - frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) + if fn in indices: + frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) res = cv2.resize(frame, dsize=(224, 224), interpolation=cv2.INTER_CUBIC) frames.append(res) cap.release() @@ -60,31 +72,34 @@ def get_frames(file_path, clip_len=16,): return frames + def create_final_model(): multi_model = MultimodalClassificaionModel( text_model, video_model, audio_model, num_labels, - input_size=1920, - hidden_size=512 + input_size=1920, + hidden_size=512, ) - checkpoint = torch.load('final_model.pt') + checkpoint = torch.load("final_model.pt") multi_model.load_state_dict(checkpoint) - device = 'cuda' + device = "cuda" return MainModel(multi_model, device=device) def process_text(input_tokens: str): - text_model_name = 'bert-large-uncased' + text_model_name = "bert-large-uncased" tokenizer = AutoTokenizer.from_pretrained(text_model_name) - return tokenizer(input_tokens, - padding='max_length', - truncation=True, - max_length=128, - return_tensors='pt') + return tokenizer( + input_tokens, + padding="max_length", + truncation=True, + max_length=128, + return_tensors="pt", + ) def process_video(video_path: str): @@ -100,21 +115,28 @@ def process_audio(file_path: str): smile = opensmile.Smile( opensmile.FeatureSet.ComParE_2016, opensmile.FeatureLevel.Functionals, - sampling_rate=16000, - resample=True, + sampling_rate=16000, + resample=True, num_workers=5, verbose=True, ) audio_features = smile.process_files([file_path]) - return audio_features.values.reshape(audio_features.shape[0], 1, audio_features.shape[1]) + return audio_features.values.reshape( + audio_features.shape[0], 1, audio_features.shape[1] + ) def inference(text: str, video_path: str): text_encoding = process_text(text) video_encoding = process_video(video_path) audio_features = process_audio(video_path) - batch = {'text': text_encoding, 'video': video_encoding, 'audio': audio_features, 'label': None} + batch = { + "text": text_encoding, + "video": video_encoding, + "audio": audio_features, + "label": None, + } label = final_model(batch) id2label = {v: k for k, v in label2id.items()} return id2label[int(label.detach().cpu())] @@ -144,9 +166,11 @@ def infer(): except Exception as e: raise ValueError(f"The message format is correct, but: {e}") else: - raise ValueError("Input should be text and a videofile link on two separate lines.") + raise ValueError( + "Input should be text and a videofile link on two separate lines." + ) return jsonify(emotion) if __name__ == "__main__": - app.run(debug=False, host="0.0.0.0", port=8025) \ No newline at end of file + app.run(debug=False, host="0.0.0.0", port=8025) From 43f918f126d774573add28346432a3cfab72af91 Mon Sep 17 00:00:00 2001 From: moon-strider Date: Wed, 30 Aug 2023 23:23:09 +0300 Subject: [PATCH 10/50] go agane --- annotators/emotion_detection/server.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/annotators/emotion_detection/server.py b/annotators/emotion_detection/server.py index 46dbf92839..68fd90a34c 100644 --- a/annotators/emotion_detection/server.py +++ b/annotators/emotion_detection/server.py @@ -122,9 +122,7 @@ def process_audio(file_path: str): ) audio_features = smile.process_files([file_path]) - return audio_features.values.reshape( - audio_features.shape[0], 1, audio_features.shape[1] - ) + return audio_features.values.reshape(audio_features.shape[0], 1, audio_features.shape[1]) def inference(text: str, video_path: str): @@ -166,9 +164,7 @@ def infer(): except Exception as e: raise ValueError(f"The message format is correct, but: {e}") else: - raise ValueError( - "Input should be text and a videofile link on two separate lines." - ) + raise ValueError("Input should be text and a videofile link on two separate lines.") return jsonify(emotion) From db0d04ba122291a6f231680719a0b505bc24d669 Mon Sep 17 00:00:00 2001 From: moon-strider Date: Thu, 31 Aug 2023 18:11:55 +0300 Subject: [PATCH 11/50] major changes for pr --- annotators/emotion_detection/Dockerfile | 6 +- annotators/emotion_detection/requirements.txt | 2 +- annotators/emotion_detection/server.py | 63 ++++++++++++++++--- .../emotion_detection/environment.yml | 2 +- .../emotion_detection/service.yml | 7 +-- annotators/emotion_detection/test.py | 12 ---- annotators/emotion_detection/test.sh | 2 - assistant_dists/dream_ocean/dev.yml | 3 +- .../dream_ocean/docker-compose.override.yml | 6 +- .../dream_ocean/pipeline_conf.json | 4 +- components.tsv | 4 +- components/OQWoiqfnqwfnoqwib.yml | 2 +- 12 files changed, 70 insertions(+), 43 deletions(-) delete mode 100644 annotators/emotion_detection/test.py delete mode 100644 annotators/emotion_detection/test.sh diff --git a/annotators/emotion_detection/Dockerfile b/annotators/emotion_detection/Dockerfile index 82fa523543..df6604ddd1 100644 --- a/annotators/emotion_detection/Dockerfile +++ b/annotators/emotion_detection/Dockerfile @@ -9,11 +9,11 @@ WORKDIR /src COPY . /src RUN pip install -r requirements.txt -RUN apt install -y ffmpeg libsm6 libxext6 +RUN apt install -y ffmpeg==7:4.2.7-0ubuntu0.1 libsm6==2:1.2.3-1 libxext6==2:1.3.4-0ubuntu1 -RUN pip install gdown +RUN pip install gdown==4.7.1 -RUN git clone https://github.com/anna-a-m/MultimodalERC repo +RUN git clone https://github.com/anna-a-m/MultimodalERC repo && cd repo && git reset --hard 95cbd971ecb2a057f0162f0384bba28c6fddee31 RUN mv -f repo/* . RUN rm -rf repo diff --git a/annotators/emotion_detection/requirements.txt b/annotators/emotion_detection/requirements.txt index d1a5f700ce..774b39915c 100644 --- a/annotators/emotion_detection/requirements.txt +++ b/annotators/emotion_detection/requirements.txt @@ -145,5 +145,5 @@ xxhash==3.2.0 yacs==0.1.8 yarl==1.8.2 zipp==3.15.0 -flask==2.2.2 +fastapi==0.103.0 blinker==1.5.0 \ No newline at end of file diff --git a/annotators/emotion_detection/server.py b/annotators/emotion_detection/server.py index 68fd90a34c..440ee6e203 100644 --- a/annotators/emotion_detection/server.py +++ b/annotators/emotion_detection/server.py @@ -7,13 +7,14 @@ import torch import numpy as np import sentry_sdk -from flask import Flask, jsonify, request -from sentry_sdk.integrations.flask import FlaskIntegration +from fastapi import FastAPI, Body +from pydantic import BaseModel +from starlette.middleware.cors import CORSMiddleware from transformers import AutoTokenizer, AutoProcessor +from typing import Any, List import cv2 -sentry_sdk.init(dsn=os.getenv("SENTRY_DSN"), integrations=[FlaskIntegration()]) -app = Flask(__name__) +sentry_sdk.init(dsn=os.getenv("SENTRY_DSN")) label2id = { "anger": 0, @@ -33,6 +34,38 @@ prefix_len = len(prefix) +def jsonify_data(data: Any) -> Any: + """Replaces JSON-non-serializable objects with JSON-serializable. + + Function replaces numpy arrays and numbers with python lists and numbers, tuples is replaces with lists. All other + object types remain the same. + + Args: + data: Object to make JSON-serializable. + + Returns: + Modified input data. + + """ + if isinstance(data, (list, tuple)): + result = [jsonify_data(item) for item in data] + elif isinstance(data, dict): + result = {} + for key in data.keys(): + result[key] = jsonify_data(data[key]) + elif isinstance(data, np.ndarray): + result = data.tolist() + elif isinstance(data, np.integer): + result = int(data) + elif isinstance(data, np.floating): + result = float(data) + elif callable(getattr(data, "to_serializable_dict", None)): + result = data.to_serializable_dict() + else: + result = data + return result + + def sample_frame_indices(seg_len, clip_len=16, frame_sample_rate=4, mode="video"): converted_len = int(clip_len * frame_sample_rate) converted_len = min(converted_len, seg_len - 1) @@ -151,10 +184,11 @@ def predict_emotion(text: str, video_path: str): final_model = create_final_model() -@app.route("/model", methods=["POST"]) -def infer(): - msg_text = request.json["last_human_utterances"][-1]["text"] +class EmotionsPayload(BaseModel): + personality: List[str] = Body(...) + +def subinfer(msg_text): if prefix in msg_text: try: text = msg_text[prefix_len:] @@ -165,8 +199,17 @@ def infer(): raise ValueError(f"The message format is correct, but: {e}") else: raise ValueError("Input should be text and a videofile link on two separate lines.") - return jsonify(emotion) + return emotion + + +app = FastAPI() +app.add_middleware( + CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"] +) -if __name__ == "__main__": - app.run(debug=False, host="0.0.0.0", port=8025) +@app.post("/model") +def infer(payload: EmotionsPayload): + logger.info(f"Emotion Detection: {payload}") + emotion = [subinfer(p) for p in payload.personality] + return jsonify_data(emotion) \ No newline at end of file diff --git a/annotators/emotion_detection/service_configs/emotion_detection/environment.yml b/annotators/emotion_detection/service_configs/emotion_detection/environment.yml index 0a4f1e3b50..866f5cbcd3 100644 --- a/annotators/emotion_detection/service_configs/emotion_detection/environment.yml +++ b/annotators/emotion_detection/service_configs/emotion_detection/environment.yml @@ -1,3 +1,3 @@ -SERVICE_PORT: 8025 +SERVICE_PORT: 8045 SERVICE_NAME: emotion_detection CUDA_VISIBLE_DEVICES: 0 \ No newline at end of file diff --git a/annotators/emotion_detection/service_configs/emotion_detection/service.yml b/annotators/emotion_detection/service_configs/emotion_detection/service.yml index 3f8b1f82e6..517cda454d 100644 --- a/annotators/emotion_detection/service_configs/emotion_detection/service.yml +++ b/annotators/emotion_detection/service_configs/emotion_detection/service.yml @@ -6,12 +6,11 @@ compose: - .env build: args: - SERVICE_PORT: 8025 + SERVICE_PORT: 8045 SERVICE_NAME: emotion_detection - CUDA_VISIBLE_DEVICES: 0 context: . dockerfile: ./annotators/emotion_detection/Dockerfile - command: uvicorn server:app --host 0.0.0.0 --port 8025 + command: uvicorn server:app --host 0.0.0.0 --port 8045 deploy: resources: limits: @@ -21,4 +20,4 @@ compose: volumes: - ./annotators/emotion_detection:/src/drm ports: - - 8025:8025 \ No newline at end of file + - 8045:8045 \ No newline at end of file diff --git a/annotators/emotion_detection/test.py b/annotators/emotion_detection/test.py deleted file mode 100644 index 4b9b3b5227..0000000000 --- a/annotators/emotion_detection/test.py +++ /dev/null @@ -1,12 +0,0 @@ -# import requests - - -# def test(): -# response = requests.post("http://0.0.0.0:8026/model", json={"personality": ["Hello world"]}) -# assert response.status_code == 200 -# assert response.json() == [{"EXT": 0, "NEU": 1, "AGR": 1, "CON": 0, "OPN": 1}] -# print("SUCCESS") - - -# if __name__ == "__main__": -# test() diff --git a/annotators/emotion_detection/test.sh b/annotators/emotion_detection/test.sh deleted file mode 100644 index c1b69d856e..0000000000 --- a/annotators/emotion_detection/test.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -#python test.py \ No newline at end of file diff --git a/assistant_dists/dream_ocean/dev.yml b/assistant_dists/dream_ocean/dev.yml index 3e35fe47c9..ed29ca1f02 100644 --- a/assistant_dists/dream_ocean/dev.yml +++ b/assistant_dists/dream_ocean/dev.yml @@ -147,7 +147,6 @@ services: emotion-detection: volumes: - "./annotators/emotion_detection:/src/drm" - - "/home/dikanskiy/emotion_test:/src/datafiles" ports: - - 8025:8025 + - 8045:8045 version: "3.7" diff --git a/assistant_dists/dream_ocean/docker-compose.override.yml b/assistant_dists/dream_ocean/docker-compose.override.yml index 458d35d38a..d971f21a98 100644 --- a/assistant_dists/dream_ocean/docker-compose.override.yml +++ b/assistant_dists/dream_ocean/docker-compose.override.yml @@ -7,7 +7,7 @@ services: factoid-qa:8071, kbqa:8072, entity-linking:8075, wiki-parser:8077, text-qa:8078, combined-classification:8087, fact-retrieval:8100, entity-detection:8103, sentence-ranker:8128, property-extraction:8136, prompt-selector:8135, openai-api-chatgpt:8145, - openai-api-chatgpt-16k:8167, summarization-annotator:8058, dialog-summarizer:8059, personality-detection:8026, emotion-detection:8025" + openai-api-chatgpt-16k:8167, summarization-annotator:8058, dialog-summarizer:8059, personality-detection:8026, emotion-detection:8045" WAIT_HOSTS_TIMEOUT: ${WAIT_TIMEOUT:-1000} HIGH_PRIORITY_INTENTS: 1 RESTRICTION_FOR_SENSITIVE_CASE: 1 @@ -444,10 +444,10 @@ services: emotion-detection: build: args: - SERVICE_PORT: 8025 + SERVICE_PORT: 8045 SERVICE_NAME: emotion_detection context: annotators/emotion_detection - command: flask run -h 0.0.0.0 -p 8025 + command: flask run -h 0.0.0.0 -p 8045 deploy: resources: limits: diff --git a/assistant_dists/dream_ocean/pipeline_conf.json b/assistant_dists/dream_ocean/pipeline_conf.json index acbabe1fa6..6a9a93891e 100644 --- a/assistant_dists/dream_ocean/pipeline_conf.json +++ b/assistant_dists/dream_ocean/pipeline_conf.json @@ -105,9 +105,9 @@ "connector": { "protocol": "http", "timeout": 15.0, - "url": "http://emotion-detection:8025/model" + "url": "http://emotion-detection:8045/model" }, - "dialog_formatter": "state_formatters.dp_formatters:last_human_bot_annotated_utterance", + "dialog_formatter": "state_formatters.dp_formatters:personality_catcher_formatter_dialog", "response_formatter": "state_formatters.dp_formatters:simple_formatter_service", "state_manager_method": "add_annotation", "previous_services": [], diff --git a/components.tsv b/components.tsv index a0d7915e9e..7397d5c601 100644 --- a/components.tsv +++ b/components.tsv @@ -27,7 +27,7 @@ 8022 dff-program-y-dangerous-skill 8023 dff-movie-skill 8024 sentiment-classification-multilingual -8025 emotion-detection +8025 8026 personality-detection 8027 8028 @@ -47,7 +47,7 @@ 8042 embodied-sender 8043 8044 -8045 +8045 emotion-detection 8046 8047 eliza 8048 diff --git a/components/OQWoiqfnqwfnoqwib.yml b/components/OQWoiqfnqwfnoqwib.yml index 6deba4e06b..e10b9e1b41 100644 --- a/components/OQWoiqfnqwfnoqwib.yml +++ b/components/OQWoiqfnqwfnoqwib.yml @@ -11,7 +11,7 @@ group: annotators connector: protocol: http timeout: 15.0 - url: http://emotion-detection:8025/model + url: http://emotion-detection:8045/model dialog_formatter: state_formatters.dp_formatters:last_human_bot_annotated_utterance response_formatter: state_formatters.dp_formatters:simple_formatter_service previous_services: null From 59489ece8a433c6d9a3c994e56b956cfd4b25597 Mon Sep 17 00:00:00 2001 From: moon-strider Date: Thu, 31 Aug 2023 19:38:12 +0300 Subject: [PATCH 12/50] flask -> fastapi, batch fix --- annotators/emotion_detection/Dockerfile | 2 +- annotators/emotion_detection/server.py | 2 +- assistant_dists/dream_ocean/docker-compose.override.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/annotators/emotion_detection/Dockerfile b/annotators/emotion_detection/Dockerfile index df6604ddd1..c5fc4c46e0 100644 --- a/annotators/emotion_detection/Dockerfile +++ b/annotators/emotion_detection/Dockerfile @@ -9,7 +9,7 @@ WORKDIR /src COPY . /src RUN pip install -r requirements.txt -RUN apt install -y ffmpeg==7:4.2.7-0ubuntu0.1 libsm6==2:1.2.3-1 libxext6==2:1.3.4-0ubuntu1 +RUN apt install -y ffmpeg=7:4.2.7-0ubuntu0.1 libsm6=2:1.2.3-1 libxext6=2:1.3.4-0ubuntu1 RUN pip install gdown==4.7.1 diff --git a/annotators/emotion_detection/server.py b/annotators/emotion_detection/server.py index 440ee6e203..1c114bf251 100644 --- a/annotators/emotion_detection/server.py +++ b/annotators/emotion_detection/server.py @@ -194,7 +194,7 @@ def subinfer(msg_text): text = msg_text[prefix_len:] logger.info(f"Emotion Detection: {text}") emotion = predict_emotion(text, "/src/datafiles/vid.mp4") - logger.info(f"Detected emotion: {jsonify(emotion)}") + logger.info(f"Detected emotion: {jsonify_data(emotion)}") except Exception as e: raise ValueError(f"The message format is correct, but: {e}") else: diff --git a/assistant_dists/dream_ocean/docker-compose.override.yml b/assistant_dists/dream_ocean/docker-compose.override.yml index d971f21a98..3fad570527 100644 --- a/assistant_dists/dream_ocean/docker-compose.override.yml +++ b/assistant_dists/dream_ocean/docker-compose.override.yml @@ -447,7 +447,7 @@ services: SERVICE_PORT: 8045 SERVICE_NAME: emotion_detection context: annotators/emotion_detection - command: flask run -h 0.0.0.0 -p 8045 + command: uvicorn server:app --host 0.0.0.0 --port 8045 deploy: resources: limits: From b76bdd52127ee15c87dff4530e466da69f8f37e0 Mon Sep 17 00:00:00 2001 From: moon-strider Date: Thu, 31 Aug 2023 19:45:49 +0300 Subject: [PATCH 13/50] codestyle fixed --- annotators/emotion_detection/server.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/annotators/emotion_detection/server.py b/annotators/emotion_detection/server.py index 1c114bf251..c6e102480d 100644 --- a/annotators/emotion_detection/server.py +++ b/annotators/emotion_detection/server.py @@ -212,4 +212,4 @@ def subinfer(msg_text): def infer(payload: EmotionsPayload): logger.info(f"Emotion Detection: {payload}") emotion = [subinfer(p) for p in payload.personality] - return jsonify_data(emotion) \ No newline at end of file + return jsonify_data(emotion) From 3514ad64f1175b1270db39a05f39fb9ecb3fe51d Mon Sep 17 00:00:00 2001 From: moon-strider Date: Fri, 1 Sep 2023 10:30:45 +0300 Subject: [PATCH 14/50] redundant requirements removed --- annotators/emotion_detection/requirements.txt | 152 ++---------------- 1 file changed, 9 insertions(+), 143 deletions(-) diff --git a/annotators/emotion_detection/requirements.txt b/annotators/emotion_detection/requirements.txt index 774b39915c..c16f5ccafe 100644 --- a/annotators/emotion_detection/requirements.txt +++ b/annotators/emotion_detection/requirements.txt @@ -1,149 +1,15 @@ -absl-py==1.4.0 -aiobotocore==2.4.2 -aiohttp==3.8.4 -aioitertools==0.11.0 -aiosignal==1.3.1 -appdirs==1.4.4 -astunparse==1.6.3 -async-timeout==4.0.2 -audeer==1.20.1 -audformat==1.0.1 -audinterface==1.1.0 -audiofile==1.3.0 -audmath==1.3.0 -audobject==0.7.9 -audresample==1.3.2 -av==10.0.0 -botocore==1.27.59 -brotlipy==0.7.0 -cachetools==5.3.0 -cchardet==2.1.7 -click==8.1.3 -cmake==3.27.0 -contourpy==1.0.7 -cycler==0.11.0 -datasets @ git+https://github.com/huggingface/datasets.git@29de6179766418c937fb33b0cc8803ec24a39e9e -dill==0.3.6 -docker-pycreds==0.4.0 -docstring-parser==0.15 -einops==0.3.2 -fairscale==0.4.13 -filelock==3.9.0 -flatbuffers==23.5.26 -fonttools==4.38.0 -frozenlist==1.3.3 -fsspec==2023.1.0 -fvcore==0.1.5.post20221221 -gast==0.4.0 -gitdb==4.0.10 -GitPython==3.1.30 -google-auth==2.17.2 -google-auth-oauthlib==1.0.0 -google-pasta==0.2.0 -grpcio==1.53.0 -h5py==3.8.0 -huggingface-hub==0.16.4 -imageio==2.27.0 -importlib-metadata==6.3.0 -importlib-resources==5.12.0 -iopath==0.1.10 -ipywidgets==8.0.4 -iso-639==0.4.5 -iso3166==2.1.1 -jax==0.4.12 -jmespath==1.0.1 -jsonargparse==4.20.1 -jupyterlab-widgets==3.0.5 -keras==2.13.1 -kiwisolver==1.4.4 -lazy_loader==0.3 -libclang==16.0.0 -lightning-utilities==0.8.0 -lit==16.0.6 -Markdown==3.4.3 -matplotlib==3.6.3 -mkl-fft==1.3.1 -mkl-service==2.4.0 -ml-dtypes==0.2.0 -mlxtend==0.21.0 -mpmath==1.3.0 -multidict==6.0.4 -multiprocess==0.70.14 -networkx==3.0 -nvidia-cublas-cu11==11.10.3.66 -nvidia-cuda-cupti-cu11==11.7.101 -nvidia-cuda-nvrtc-cu11==11.7.99 -nvidia-cuda-runtime-cu11==11.7.99 -nvidia-cudnn-cu11==8.5.0.96 -nvidia-cufft-cu11==10.9.0.58 -nvidia-curand-cu11==10.2.10.91 -nvidia-cusolver-cu11==11.4.0.1 -nvidia-cusparse-cu11==11.7.4.91 -nvidia-nccl-cu11==2.14.3 -nvidia-nvtx-cu11==11.7.91 -oauthlib==3.2.2 +pandas==1.5.3 +scikit-learn==1.3.0 +tqdm==4.64.1 opencv-python==4.7.0.68 opensmile==2.4.2 -opt-einsum==3.3.0 -oyaml==1.0 -pandas==1.5.3 -parameterized==0.8.1 -pathtools==0.1.2 -Pillow==9.3.0 -portalocker==2.7.0 -protobuf==4.21.12 -pyarrow==11.0.0 -pyasn1==0.4.8 -pyasn1-modules==0.2.8 -pyparsing==3.0.9 -python-version==0.0.2 -pytorch-lightning==1.9.4 -pytorch-ranger==0.1.1 -pytz==2022.7.1 -PyWavelets==1.4.1 -PyYAML==6.0 -regex==2022.10.31 -requests-oauthlib==1.3.1 -responses==0.18.0 -rsa==4.9 -s3fs==2023.1.0 -safetensors==0.3.1 -scenedetect==0.6.2 -scipy==1.9.3 -seaborn==0.12.2 sentry-sdk==1.15.0 -setproctitle==1.3.2 -scikit-learn==1.3.0 -smmap==5.0.0 -soundfile==0.12.1 -sympy==1.12 -tabulate==0.9.0 -tensorboard==2.13.0 -tensorboard-data-server==0.7.0 -tensorboard-plugin-wit==1.8.1 -tensorflow==2.13.0 -tensorflow-estimator==2.13.0 -tensorflow-io-gcs-filesystem==0.32.0 -termcolor==2.2.0 -tifffile==2023.7.10 -tokenizers==0.12.1 torch==1.13.1 -torch-optimizer==0.3.0 -torchaudio==0.13.1 -torchmetrics==0.9.3 -torchvision==0.14.1 -tqdm==4.64.1 transformers==4.31.0 -triton==2.0.0 -typeshed-client==2.2.0 -wandb==0.15.8 -webencodings==0.5.1 -Werkzeug==2.2.3 -widgetsnbextension==4.0.5 -wrapt==1.14.1 -xxhash==3.2.0 -yacs==0.1.8 -yarl==1.8.2 -zipp==3.15.0 fastapi==0.103.0 -blinker==1.5.0 \ No newline at end of file +blinker==1.5.0 +pydantic==2.3.0 +numpy==1.24.4 +starlette==0.27.0 +uvicorn==0.23.2 +Pillow==9.3.0 \ No newline at end of file From 6adffb012c8a96d60b0ffed94d49552c0ce59136 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=BB=D1=8C=D1=8F=20=D0=9D=D0=B0=D0=BE=D1=81?= Date: Mon, 4 Sep 2023 12:06:55 +0300 Subject: [PATCH 15/50] another pr fix --- annotators/emotion_detection/Dockerfile | 10 ++++ annotators/emotion_detection/server.py | 48 ++++--------------- .../emotion_detection/service.yml | 8 +++- assistant_dists/dream_ocean/dev.yml | 2 - .../dream_ocean/docker-compose.override.yml | 5 +- components/OQWoiqfnqwfnoqwib.yml | 2 +- 6 files changed, 30 insertions(+), 45 deletions(-) diff --git a/annotators/emotion_detection/Dockerfile b/annotators/emotion_detection/Dockerfile index c5fc4c46e0..5a379182d5 100644 --- a/annotators/emotion_detection/Dockerfile +++ b/annotators/emotion_detection/Dockerfile @@ -4,6 +4,16 @@ RUN apt update RUN apt install -y python3.9 RUN apt install -y git python3-pip +ARG VIDEO_MODEL +ARG TEXT_MODEL +ARG MULTIMODAL_MODEL +ARG PREFIX + +ENV VIDEO_MODEL=$VIDEO_MODEL +ENV TEXT_MODEL=$TEXT_MODEL +ENV MULTIMODAL_MODEL=$MULTIMODAL_MODEL +ENV PREFIX=$PREFIX + WORKDIR /src COPY . /src diff --git a/annotators/emotion_detection/server.py b/annotators/emotion_detection/server.py index c6e102480d..29875ae3c2 100644 --- a/annotators/emotion_detection/server.py +++ b/annotators/emotion_detection/server.py @@ -8,10 +8,11 @@ import numpy as np import sentry_sdk from fastapi import FastAPI, Body +from fastapi.encoders import jsonable_encoder from pydantic import BaseModel from starlette.middleware.cors import CORSMiddleware from transformers import AutoTokenizer, AutoProcessor -from typing import Any, List +from typing import List import cv2 sentry_sdk.init(dsn=os.getenv("SENTRY_DSN")) @@ -30,42 +31,10 @@ logger = logging.getLogger(__name__) -prefix = "Detect emotions:" +prefix = os.getenv("PREFIX") prefix_len = len(prefix) -def jsonify_data(data: Any) -> Any: - """Replaces JSON-non-serializable objects with JSON-serializable. - - Function replaces numpy arrays and numbers with python lists and numbers, tuples is replaces with lists. All other - object types remain the same. - - Args: - data: Object to make JSON-serializable. - - Returns: - Modified input data. - - """ - if isinstance(data, (list, tuple)): - result = [jsonify_data(item) for item in data] - elif isinstance(data, dict): - result = {} - for key in data.keys(): - result[key] = jsonify_data(data[key]) - elif isinstance(data, np.ndarray): - result = data.tolist() - elif isinstance(data, np.integer): - result = int(data) - elif isinstance(data, np.floating): - result = float(data) - elif callable(getattr(data, "to_serializable_dict", None)): - result = data.to_serializable_dict() - else: - result = data - return result - - def sample_frame_indices(seg_len, clip_len=16, frame_sample_rate=4, mode="video"): converted_len = int(clip_len * frame_sample_rate) converted_len = min(converted_len, seg_len - 1) @@ -115,7 +84,7 @@ def create_final_model(): input_size=1920, hidden_size=512, ) - checkpoint = torch.load("final_model.pt") + checkpoint = torch.load(os.getenv("MULTIMODAL_MODEL")) multi_model.load_state_dict(checkpoint) device = "cuda" @@ -123,7 +92,7 @@ def create_final_model(): def process_text(input_tokens: str): - text_model_name = "bert-large-uncased" + text_model_name = os.getenv("TEXT_MODEL") tokenizer = AutoTokenizer.from_pretrained(text_model_name) return tokenizer( @@ -138,7 +107,7 @@ def process_text(input_tokens: str): def process_video(video_path: str): video_frames = get_frames(video_path) - video_model_name = "microsoft/xclip-base-patch32" + video_model_name = os.getenv("VIDEO_MODEL") video_feature_extractor = AutoProcessor.from_pretrained(video_model_name) return video_feature_extractor(videos=video_frames, return_tensors="pt") @@ -189,12 +158,13 @@ class EmotionsPayload(BaseModel): def subinfer(msg_text): + emotion = "Emotion detection unsuccessfull. An error occured during inference." if prefix in msg_text: try: text = msg_text[prefix_len:] logger.info(f"Emotion Detection: {text}") emotion = predict_emotion(text, "/src/datafiles/vid.mp4") - logger.info(f"Detected emotion: {jsonify_data(emotion)}") + logger.info(f"Detected emotion: {jsonable_encoder(emotion)}") except Exception as e: raise ValueError(f"The message format is correct, but: {e}") else: @@ -212,4 +182,4 @@ def subinfer(msg_text): def infer(payload: EmotionsPayload): logger.info(f"Emotion Detection: {payload}") emotion = [subinfer(p) for p in payload.personality] - return jsonify_data(emotion) + return jsonable_encoder(emotion) diff --git a/annotators/emotion_detection/service_configs/emotion_detection/service.yml b/annotators/emotion_detection/service_configs/emotion_detection/service.yml index 517cda454d..184e7d7a59 100644 --- a/annotators/emotion_detection/service_configs/emotion_detection/service.yml +++ b/annotators/emotion_detection/service_configs/emotion_detection/service.yml @@ -8,6 +8,10 @@ compose: args: SERVICE_PORT: 8045 SERVICE_NAME: emotion_detection + VIDEO_MODEL: "microsoft/xclip-base-patch32" + TEXT_MODEL: "bert-large-uncased" + MULTIMODAL_MODEL: "final_model.pt" + PREFIX: "Detect emotions:" context: . dockerfile: ./annotators/emotion_detection/Dockerfile command: uvicorn server:app --host 0.0.0.0 --port 8045 @@ -17,7 +21,7 @@ compose: memory: 1G reservations: memory: 1G - volumes: - - ./annotators/emotion_detection:/src/drm + environment: + - CUDA_VISIBLE_DEVICES=0 ports: - 8045:8045 \ No newline at end of file diff --git a/assistant_dists/dream_ocean/dev.yml b/assistant_dists/dream_ocean/dev.yml index ed29ca1f02..2226f29ece 100644 --- a/assistant_dists/dream_ocean/dev.yml +++ b/assistant_dists/dream_ocean/dev.yml @@ -145,8 +145,6 @@ services: ports: - 8026:8026 emotion-detection: - volumes: - - "./annotators/emotion_detection:/src/drm" ports: - 8045:8045 version: "3.7" diff --git a/assistant_dists/dream_ocean/docker-compose.override.yml b/assistant_dists/dream_ocean/docker-compose.override.yml index 3fad570527..0a91495a78 100644 --- a/assistant_dists/dream_ocean/docker-compose.override.yml +++ b/assistant_dists/dream_ocean/docker-compose.override.yml @@ -446,6 +446,10 @@ services: args: SERVICE_PORT: 8045 SERVICE_NAME: emotion_detection + VIDEO_MODEL: "microsoft/xclip-base-patch32" + TEXT_MODEL: "bert-large-uncased" + MULTIMODAL_MODEL: "final_model.pt" + PREFIX: "Detect emotions:" context: annotators/emotion_detection command: uvicorn server:app --host 0.0.0.0 --port 8045 deploy: @@ -456,6 +460,5 @@ services: memory: 1G environment: - CUDA_VISIBLE_DEVICES=0 - - FLASK_APP=server version: '3.7' diff --git a/components/OQWoiqfnqwfnoqwib.yml b/components/OQWoiqfnqwfnoqwib.yml index e10b9e1b41..d81ae65ecc 100644 --- a/components/OQWoiqfnqwfnoqwib.yml +++ b/components/OQWoiqfnqwfnoqwib.yml @@ -12,7 +12,7 @@ connector: protocol: http timeout: 15.0 url: http://emotion-detection:8045/model -dialog_formatter: state_formatters.dp_formatters:last_human_bot_annotated_utterance +dialog_formatter: state_formatters.dp_formatters:personality_catcher_formatter_dialog response_formatter: state_formatters.dp_formatters:simple_formatter_service previous_services: null required_previous_services: null From 74598122b94d2394a2092fee4242087ebf5e1ea9 Mon Sep 17 00:00:00 2001 From: moon-strider Date: Thu, 21 Sep 2023 16:15:40 +0300 Subject: [PATCH 16/50] added files:3000 to dream_ocean, emotion_detection external video support added --- annotators/emotion_detection/server.py | 26 ++++++++++++------- assistant_dists/dream_embodied/dev.yml | 5 ++++ .../docker-compose.override.yml | 3 +++ .../dream_ocean/pipeline_conf.json | 2 +- state_formatters/dp_formatters.py | 16 ++++++++++++ 5 files changed, 42 insertions(+), 10 deletions(-) diff --git a/annotators/emotion_detection/server.py b/annotators/emotion_detection/server.py index 29875ae3c2..9a606eeacb 100644 --- a/annotators/emotion_detection/server.py +++ b/annotators/emotion_detection/server.py @@ -1,19 +1,21 @@ import logging import os import opensmile -from multimodal_concat.models import MultimodalClassificaionModel, MainModel -from multimodal_concat.utils import prepare_models - import torch import numpy as np import sentry_sdk +import cv2 + +from multimodal_concat.models import MultimodalClassificaionModel, MainModel +from multimodal_concat.utils import prepare_models + from fastapi import FastAPI, Body from fastapi.encoders import jsonable_encoder from pydantic import BaseModel from starlette.middleware.cors import CORSMiddleware from transformers import AutoTokenizer, AutoProcessor from typing import List -import cv2 +from urllib.request import URLopener sentry_sdk.init(dsn=os.getenv("SENTRY_DSN")) @@ -154,21 +156,27 @@ def predict_emotion(text: str, video_path: str): class EmotionsPayload(BaseModel): - personality: List[str] = Body(...) + personality: List[str] + video_path: List[str] def subinfer(msg_text): emotion = "Emotion detection unsuccessfull. An error occured during inference." if prefix in msg_text: + # TODO: maybe add support for multiple videos in one message try: - text = msg_text[prefix_len:] - logger.info(f"Emotion Detection: {text}") - emotion = predict_emotion(text, "/src/datafiles/vid.mp4") + (text, link) = msg_text[prefix_len:].split('\n') + logger.info(f"Emotion Detection: {text}, {link}") + file = URLopener() + if os.path.exists("/src/datafiles/vid.ogg"): + os.remove("/src/datafiles/vid.ogg") + file.retrieve(link, "/src/datafiles/vid.ogg") + emotion = predict_emotion(text, "/src/datafiles/vid.ogg") logger.info(f"Detected emotion: {jsonable_encoder(emotion)}") except Exception as e: raise ValueError(f"The message format is correct, but: {e}") else: - raise ValueError("Input should be text and a videofile link on two separate lines.") + raise ValueError(f"Input should be text and a videofile link on two separate lines. And should start with {prefix}") return emotion diff --git a/assistant_dists/dream_embodied/dev.yml b/assistant_dists/dream_embodied/dev.yml index 210cf31e55..d3004e9b4e 100644 --- a/assistant_dists/dream_embodied/dev.yml +++ b/assistant_dists/dream_embodied/dev.yml @@ -5,6 +5,11 @@ services: - ".:/dp-agent" ports: - 4242:4242 + files: + ports: + - 3000:3000 + volumes: + - "~/.deeppavlov/file_server:/tmp" ranking-based-response-selector: volumes: - "./response_selectors/ranking_based_response_selector:/src" diff --git a/assistant_dists/dream_embodied/docker-compose.override.yml b/assistant_dists/dream_embodied/docker-compose.override.yml index 8de355ed3f..3700fa1ce8 100644 --- a/assistant_dists/dream_embodied/docker-compose.override.yml +++ b/assistant_dists/dream_embodied/docker-compose.override.yml @@ -10,6 +10,9 @@ services: ALWAYS_TURN_ON_ALL_SKILLS: 0 LANGUAGE: EN + files: + image: julienmeerschart/simple-file-upload-download-server + ranking-based-response-selector: env_file: [ .env ] build: diff --git a/assistant_dists/dream_ocean/pipeline_conf.json b/assistant_dists/dream_ocean/pipeline_conf.json index 6a9a93891e..0b8b432b20 100644 --- a/assistant_dists/dream_ocean/pipeline_conf.json +++ b/assistant_dists/dream_ocean/pipeline_conf.json @@ -107,7 +107,7 @@ "timeout": 15.0, "url": "http://emotion-detection:8045/model" }, - "dialog_formatter": "state_formatters.dp_formatters:personality_catcher_formatter_dialog", + "dialog_formatter": "state_formatters.dp_formatters:emotion_detection_formatter", "response_formatter": "state_formatters.dp_formatters:simple_formatter_service", "state_manager_method": "add_annotation", "previous_services": [], diff --git a/state_formatters/dp_formatters.py b/state_formatters/dp_formatters.py index 57afff7859..8c7909af29 100755 --- a/state_formatters/dp_formatters.py +++ b/state_formatters/dp_formatters.py @@ -100,6 +100,22 @@ def personality_catcher_formatter_dialog(dialog: Dict) -> List[Dict]: ] +def emotion_detection_formatter(dialog: Dict) -> List[Dict]: + # Used by: emotion_detection annotator + return [ + { + "personality": [ + dialog["human_utterances"][-1]["annotations"].get( + "spelling_preprocessing", dialog["human_utterances"][-1]["text"] + ) + ], + "video_path": [ + dialog["human_utterances"][-1]["attributes"].get("video_path") + ] + } + ] + + def telegram_selector_formatter_in(dialog: Dict): return [dialog["human"]["attributes"]["active_skill"]] From 61b636d023e1a90c4f40f0107fe6c531457361c2 Mon Sep 17 00:00:00 2001 From: moon-strider Date: Thu, 21 Sep 2023 16:34:15 +0300 Subject: [PATCH 17/50] fixed emotion_detection annotator --- annotators/emotion_detection/server.py | 33 ++++++++++---------------- 1 file changed, 13 insertions(+), 20 deletions(-) diff --git a/annotators/emotion_detection/server.py b/annotators/emotion_detection/server.py index 9a606eeacb..851724fafa 100644 --- a/annotators/emotion_detection/server.py +++ b/annotators/emotion_detection/server.py @@ -33,9 +33,6 @@ logger = logging.getLogger(__name__) -prefix = os.getenv("PREFIX") -prefix_len = len(prefix) - def sample_frame_indices(seg_len, clip_len=16, frame_sample_rate=4, mode="video"): converted_len = int(clip_len * frame_sample_rate) @@ -160,23 +157,19 @@ class EmotionsPayload(BaseModel): video_path: List[str] -def subinfer(msg_text): +def subinfer(msg_text: str, video_path: str): emotion = "Emotion detection unsuccessfull. An error occured during inference." - if prefix in msg_text: - # TODO: maybe add support for multiple videos in one message - try: - (text, link) = msg_text[prefix_len:].split('\n') - logger.info(f"Emotion Detection: {text}, {link}") - file = URLopener() - if os.path.exists("/src/datafiles/vid.ogg"): - os.remove("/src/datafiles/vid.ogg") - file.retrieve(link, "/src/datafiles/vid.ogg") - emotion = predict_emotion(text, "/src/datafiles/vid.ogg") - logger.info(f"Detected emotion: {jsonable_encoder(emotion)}") - except Exception as e: - raise ValueError(f"The message format is correct, but: {e}") - else: - raise ValueError(f"Input should be text and a videofile link on two separate lines. And should start with {prefix}") + # TODO: maybe add support for multiple videos in one message + try: + logger.info(f"Emotion Detection: {msg_text}") + file = URLopener() + if os.path.exists("/src/datafiles/vid.ogg"): + os.remove("/src/datafiles/vid.ogg") + file.retrieve(video_path, "/src/datafiles/vid.ogg") + emotion = predict_emotion(msg_text, "/src/datafiles/vid.ogg") + logger.info(f"Detected emotion: {jsonable_encoder(emotion)}") + except Exception as e: + raise ValueError(f"The message format is correct, but: {e}") return emotion @@ -189,5 +182,5 @@ def subinfer(msg_text): @app.post("/model") def infer(payload: EmotionsPayload): logger.info(f"Emotion Detection: {payload}") - emotion = [subinfer(p) for p in payload.personality] + emotion = [subinfer(p, p.video_path) for p in payload.personality] return jsonable_encoder(emotion) From 642646c2b86f62e7b23f90b15f9b21148ca8aca1 Mon Sep 17 00:00:00 2001 From: moon-strider Date: Fri, 22 Sep 2023 11:06:50 +0300 Subject: [PATCH 18/50] emotion detection videofile support added --- annotators/emotion_detection/server.py | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/annotators/emotion_detection/server.py b/annotators/emotion_detection/server.py index 851724fafa..247d4ad9cb 100644 --- a/annotators/emotion_detection/server.py +++ b/annotators/emotion_detection/server.py @@ -9,13 +9,13 @@ from multimodal_concat.models import MultimodalClassificaionModel, MainModel from multimodal_concat.utils import prepare_models -from fastapi import FastAPI, Body +from fastapi import FastAPI from fastapi.encoders import jsonable_encoder from pydantic import BaseModel from starlette.middleware.cors import CORSMiddleware from transformers import AutoTokenizer, AutoProcessor from typing import List -from urllib.request import URLopener +from urllib.request import urlretrieve sentry_sdk.init(dsn=os.getenv("SENTRY_DSN")) @@ -159,17 +159,16 @@ class EmotionsPayload(BaseModel): def subinfer(msg_text: str, video_path: str): emotion = "Emotion detection unsuccessfull. An error occured during inference." - # TODO: maybe add support for multiple videos in one message try: - logger.info(f"Emotion Detection: {msg_text}") - file = URLopener() - if os.path.exists("/src/datafiles/vid.ogg"): - os.remove("/src/datafiles/vid.ogg") - file.retrieve(video_path, "/src/datafiles/vid.ogg") - emotion = predict_emotion(msg_text, "/src/datafiles/vid.ogg") + filename = video_path.split("=")[-1] + filepath = f"/src/datafiles/{filename}" + urlretrieve(video_path, filepath) + if not os.path.exists(filepath): + raise ValueError(f"Failed to retrieve videofile from {filepath}") + emotion = predict_emotion(msg_text, filepath) logger.info(f"Detected emotion: {jsonable_encoder(emotion)}") except Exception as e: - raise ValueError(f"The message format is correct, but: {e}") + raise ValueError(f"The message format is correct, but: {e}, vid: {video_path}, file: {os.path.exists(filepath)}, filepath: {filepath}, text: {msg_text}") return emotion @@ -182,5 +181,5 @@ def subinfer(msg_text: str, video_path: str): @app.post("/model") def infer(payload: EmotionsPayload): logger.info(f"Emotion Detection: {payload}") - emotion = [subinfer(p, p.video_path) for p in payload.personality] - return jsonable_encoder(emotion) + emotion = [subinfer(p[0], p[1]) for p in zip(payload.personality, payload.video_path)] + return jsonable_encoder(emotion) \ No newline at end of file From b3ca3a4ad1e314368e30c632ce14b649647d67c9 Mon Sep 17 00:00:00 2001 From: moon-strider Date: Tue, 26 Sep 2023 11:27:40 +0300 Subject: [PATCH 19/50] minor refactoring --- annotators/emotion_detection/server.py | 7 +++++-- state_formatters/dp_formatters.py | 4 +--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/annotators/emotion_detection/server.py b/annotators/emotion_detection/server.py index 247d4ad9cb..916735e26e 100644 --- a/annotators/emotion_detection/server.py +++ b/annotators/emotion_detection/server.py @@ -159,6 +159,7 @@ class EmotionsPayload(BaseModel): def subinfer(msg_text: str, video_path: str): emotion = "Emotion detection unsuccessfull. An error occured during inference." + filepath = "undefined" try: filename = video_path.split("=")[-1] filepath = f"/src/datafiles/{filename}" @@ -168,7 +169,9 @@ def subinfer(msg_text: str, video_path: str): emotion = predict_emotion(msg_text, filepath) logger.info(f"Detected emotion: {jsonable_encoder(emotion)}") except Exception as e: - raise ValueError(f"The message format is correct, but: {e}, vid: {video_path}, file: {os.path.exists(filepath)}, filepath: {filepath}, text: {msg_text}") + raise ValueError( + f"The message format is correct, but: {e}, vid: {video_path}, file: {os.path.exists(filepath)}, filepath: {filepath}, text: {msg_text}" + ) return emotion @@ -182,4 +185,4 @@ def subinfer(msg_text: str, video_path: str): def infer(payload: EmotionsPayload): logger.info(f"Emotion Detection: {payload}") emotion = [subinfer(p[0], p[1]) for p in zip(payload.personality, payload.video_path)] - return jsonable_encoder(emotion) \ No newline at end of file + return jsonable_encoder(emotion) diff --git a/state_formatters/dp_formatters.py b/state_formatters/dp_formatters.py index 8c7909af29..ab48c2ec46 100755 --- a/state_formatters/dp_formatters.py +++ b/state_formatters/dp_formatters.py @@ -109,9 +109,7 @@ def emotion_detection_formatter(dialog: Dict) -> List[Dict]: "spelling_preprocessing", dialog["human_utterances"][-1]["text"] ) ], - "video_path": [ - dialog["human_utterances"][-1]["attributes"].get("video_path") - ] + "video_path": [dialog["human_utterances"][-1]["attributes"].get("video_path")], } ] From 4219a17d0bbc844e3df5617008b4260497685053 Mon Sep 17 00:00:00 2001 From: moon-strider Date: Tue, 26 Sep 2023 11:30:35 +0300 Subject: [PATCH 20/50] style fix --- annotators/emotion_detection/server.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/annotators/emotion_detection/server.py b/annotators/emotion_detection/server.py index 916735e26e..2f836ba79d 100644 --- a/annotators/emotion_detection/server.py +++ b/annotators/emotion_detection/server.py @@ -170,14 +170,18 @@ def subinfer(msg_text: str, video_path: str): logger.info(f"Detected emotion: {jsonable_encoder(emotion)}") except Exception as e: raise ValueError( - f"The message format is correct, but: {e}, vid: {video_path}, file: {os.path.exists(filepath)}, filepath: {filepath}, text: {msg_text}" + f"The message format is correct, but: {e}" ) return emotion app = FastAPI() app.add_middleware( - CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"] + CORSMiddleware, + allow_origins=["*"], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], ) From 24287827f34b8fd6cf850e9a7a38b425388f92aa Mon Sep 17 00:00:00 2001 From: moon-strider Date: Tue, 26 Sep 2023 11:34:57 +0300 Subject: [PATCH 21/50] more pr fixes, more style fixed --- annotators/emotion_detection/server.py | 4 +--- assistant_dists/dream_ocean/dev.yml | 2 ++ 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/annotators/emotion_detection/server.py b/annotators/emotion_detection/server.py index 2f836ba79d..77406f118e 100644 --- a/annotators/emotion_detection/server.py +++ b/annotators/emotion_detection/server.py @@ -169,9 +169,7 @@ def subinfer(msg_text: str, video_path: str): emotion = predict_emotion(msg_text, filepath) logger.info(f"Detected emotion: {jsonable_encoder(emotion)}") except Exception as e: - raise ValueError( - f"The message format is correct, but: {e}" - ) + raise ValueError(f"The message format is correct, but: {e}") return emotion diff --git a/assistant_dists/dream_ocean/dev.yml b/assistant_dists/dream_ocean/dev.yml index 2226f29ece..07f56e3d10 100644 --- a/assistant_dists/dream_ocean/dev.yml +++ b/assistant_dists/dream_ocean/dev.yml @@ -145,6 +145,8 @@ services: ports: - 8026:8026 emotion-detection: + volumes: + - "./annotators/emotion_detection:/src" ports: - 8045:8045 version: "3.7" From d1dff5f50983ebab4b4b95be3a57f715ed700b8b Mon Sep 17 00:00:00 2001 From: moon-strider Date: Tue, 26 Sep 2023 11:39:32 +0300 Subject: [PATCH 22/50] even more pr fixes --- annotators/emotion_detection/Dockerfile | 1 + annotators/emotion_detection/server.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/annotators/emotion_detection/Dockerfile b/annotators/emotion_detection/Dockerfile index 5a379182d5..7c581da2a5 100644 --- a/annotators/emotion_detection/Dockerfile +++ b/annotators/emotion_detection/Dockerfile @@ -17,6 +17,7 @@ ENV PREFIX=$PREFIX WORKDIR /src COPY . /src +RUN mkdir /data RUN pip install -r requirements.txt RUN apt install -y ffmpeg=7:4.2.7-0ubuntu0.1 libsm6=2:1.2.3-1 libxext6=2:1.3.4-0ubuntu1 diff --git a/annotators/emotion_detection/server.py b/annotators/emotion_detection/server.py index 77406f118e..2c210fff0c 100644 --- a/annotators/emotion_detection/server.py +++ b/annotators/emotion_detection/server.py @@ -162,7 +162,7 @@ def subinfer(msg_text: str, video_path: str): filepath = "undefined" try: filename = video_path.split("=")[-1] - filepath = f"/src/datafiles/{filename}" + filepath = f"/data/{filename}" urlretrieve(video_path, filepath) if not os.path.exists(filepath): raise ValueError(f"Failed to retrieve videofile from {filepath}") From 1fddb31617df0e83ac4c202876a77424027ba128 Mon Sep 17 00:00:00 2001 From: moon-strider Date: Tue, 26 Sep 2023 12:37:55 +0300 Subject: [PATCH 23/50] argument dockerfile fixes --- annotators/emotion_detection/Dockerfile | 17 +++++++---------- annotators/emotion_detection/server.py | 6 +++--- .../dream_ocean/docker-compose.override.yml | 8 ++++---- 3 files changed, 14 insertions(+), 17 deletions(-) diff --git a/annotators/emotion_detection/Dockerfile b/annotators/emotion_detection/Dockerfile index 7c581da2a5..b1e61a11da 100644 --- a/annotators/emotion_detection/Dockerfile +++ b/annotators/emotion_detection/Dockerfile @@ -7,12 +7,10 @@ RUN apt install -y git python3-pip ARG VIDEO_MODEL ARG TEXT_MODEL ARG MULTIMODAL_MODEL -ARG PREFIX ENV VIDEO_MODEL=$VIDEO_MODEL ENV TEXT_MODEL=$TEXT_MODEL ENV MULTIMODAL_MODEL=$MULTIMODAL_MODEL -ENV PREFIX=$PREFIX WORKDIR /src @@ -24,14 +22,13 @@ RUN apt install -y ffmpeg=7:4.2.7-0ubuntu0.1 libsm6=2:1.2.3-1 libxext6=2:1.3.4-0 RUN pip install gdown==4.7.1 -RUN git clone https://github.com/anna-a-m/MultimodalERC repo && cd repo && git reset --hard 95cbd971ecb2a057f0162f0384bba28c6fddee31 +RUN git clone https://github.com/anna-a-m/MultimodalERC /data/repo && cd /data/repo && git reset --hard 95cbd971ecb2a057f0162f0384bba28c6fddee31 -RUN mv -f repo/* . -RUN rm -rf repo +RUN mv -f /data/repo/* /data/ && rm -rf /data/repo -RUN touch multimodal_concat/__init__.py +RUN touch /data/multimodal_concat/__init__.py -RUN gdown 'https://drive.google.com/uc?id=12C36rGUe7tuWGAh_FByw80c3wAtdUHx8' -O '1d_cnn_with_opensmile.pt' -RUN gdown 'https://drive.google.com/uc?id=1ZHw2MEbjLwU5A7EaNysgVHZlaWq4FJZG' -O 'bert-large-uncased_none_seed-42.pt' -RUN gdown 'https://drive.google.com/uc?id=1tDf-jWihZ6M0oX-niOfVmLUimJqYrG_M' -O 'final_model.pt' -RUN gdown 'https://drive.google.com/uc?id=1DMUHqbwqn-j9XIhoqnfSwqyqrlPMkVJe' -O 'XCLIP_Augmented.pt' \ No newline at end of file +RUN gdown 'https://drive.google.com/uc?id=12C36rGUe7tuWGAh_FByw80c3wAtdUHx8' -O '/data/1d_cnn_with_opensmile.pt' +RUN gdown 'https://drive.google.com/uc?id=1ZHw2MEbjLwU5A7EaNysgVHZlaWq4FJZG' -O '/data/bert-large-uncased_none_seed-42.pt' +RUN gdown 'https://drive.google.com/uc?id=1tDf-jWihZ6M0oX-niOfVmLUimJqYrG_M' -O '/data/final_model.pt' +RUN gdown 'https://drive.google.com/uc?id=1DMUHqbwqn-j9XIhoqnfSwqyqrlPMkVJe' -O '/data/XCLIP_Augmented.pt' \ No newline at end of file diff --git a/annotators/emotion_detection/server.py b/annotators/emotion_detection/server.py index 2c210fff0c..13b0d6b504 100644 --- a/annotators/emotion_detection/server.py +++ b/annotators/emotion_detection/server.py @@ -29,7 +29,7 @@ "surprise": 6, } num_labels = 7 -text_model, video_model, audio_model = prepare_models(num_labels, "./") +text_model, video_model, audio_model = prepare_models(num_labels, os.getenv("MODEL_PATH")) logger = logging.getLogger(__name__) @@ -91,7 +91,7 @@ def create_final_model(): def process_text(input_tokens: str): - text_model_name = os.getenv("TEXT_MODEL") + text_model_name = os.getenv("TEXT_PRETRAINED") tokenizer = AutoTokenizer.from_pretrained(text_model_name) return tokenizer( @@ -106,7 +106,7 @@ def process_text(input_tokens: str): def process_video(video_path: str): video_frames = get_frames(video_path) - video_model_name = os.getenv("VIDEO_MODEL") + video_model_name = os.getenv("VIDEO_PRETRAINED") video_feature_extractor = AutoProcessor.from_pretrained(video_model_name) return video_feature_extractor(videos=video_frames, return_tensors="pt") diff --git a/assistant_dists/dream_ocean/docker-compose.override.yml b/assistant_dists/dream_ocean/docker-compose.override.yml index 0a91495a78..40932d4bd7 100644 --- a/assistant_dists/dream_ocean/docker-compose.override.yml +++ b/assistant_dists/dream_ocean/docker-compose.override.yml @@ -446,10 +446,10 @@ services: args: SERVICE_PORT: 8045 SERVICE_NAME: emotion_detection - VIDEO_MODEL: "microsoft/xclip-base-patch32" - TEXT_MODEL: "bert-large-uncased" - MULTIMODAL_MODEL: "final_model.pt" - PREFIX: "Detect emotions:" + VIDEO_PRETRAINED: "microsoft/xclip-base-patch32" + TEXT_PRETRAINED: "bert-large-uncased" + MODEL_PATH: "/data" + MULTIMODAL_MODEL: "/data/final_model.pt" context: annotators/emotion_detection command: uvicorn server:app --host 0.0.0.0 --port 8045 deploy: From 289cd893fa40c3be7d94e187e0285f54bb715982 Mon Sep 17 00:00:00 2001 From: moon-strider Date: Tue, 26 Sep 2023 12:52:13 +0300 Subject: [PATCH 24/50] Dockerfile fix --- annotators/emotion_detection/Dockerfile | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/annotators/emotion_detection/Dockerfile b/annotators/emotion_detection/Dockerfile index b1e61a11da..9a29329d45 100644 --- a/annotators/emotion_detection/Dockerfile +++ b/annotators/emotion_detection/Dockerfile @@ -4,13 +4,15 @@ RUN apt update RUN apt install -y python3.9 RUN apt install -y git python3-pip -ARG VIDEO_MODEL -ARG TEXT_MODEL +ARG VIDEO_PRETREINED +ARG TEXT_PRETRAINED +ARG MODEL_PATH ARG MULTIMODAL_MODEL -ENV VIDEO_MODEL=$VIDEO_MODEL -ENV TEXT_MODEL=$TEXT_MODEL +ENV VIDEO_PRETRAINED=$VIDEO_PRETRAINED +ENV TEXT_PRETRAINED=$TEXT_PRETRAINED ENV MULTIMODAL_MODEL=$MULTIMODAL_MODEL +ENV MODEL_PATH=$MODEL_PATH WORKDIR /src From 6afc7dc353770283a627bd55931bfc8f8781a0f7 Mon Sep 17 00:00:00 2001 From: moon-strider Date: Tue, 26 Sep 2023 14:19:31 +0300 Subject: [PATCH 25/50] updating dp-agent commit --- annotators/emotion_detection/server.py | 4 ++++ assistant_dists/dream_ocean/docker-compose.override.yml | 2 +- dockerfile_agent | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/annotators/emotion_detection/server.py b/annotators/emotion_detection/server.py index 13b0d6b504..3091b3753e 100644 --- a/annotators/emotion_detection/server.py +++ b/annotators/emotion_detection/server.py @@ -5,6 +5,10 @@ import numpy as np import sentry_sdk import cv2 +import sys + +sys.path.append("/data") +sys.path.append("/data/multimodal_concat") from multimodal_concat.models import MultimodalClassificaionModel, MainModel from multimodal_concat.utils import prepare_models diff --git a/assistant_dists/dream_ocean/docker-compose.override.yml b/assistant_dists/dream_ocean/docker-compose.override.yml index 40932d4bd7..35bea96b9f 100644 --- a/assistant_dists/dream_ocean/docker-compose.override.yml +++ b/assistant_dists/dream_ocean/docker-compose.override.yml @@ -448,7 +448,7 @@ services: SERVICE_NAME: emotion_detection VIDEO_PRETRAINED: "microsoft/xclip-base-patch32" TEXT_PRETRAINED: "bert-large-uncased" - MODEL_PATH: "/data" + MODEL_PATH: "/data/" MULTIMODAL_MODEL: "/data/final_model.pt" context: annotators/emotion_detection command: uvicorn server:app --host 0.0.0.0 --port 8045 diff --git a/dockerfile_agent b/dockerfile_agent index f096d4e111..1beb15919f 100644 --- a/dockerfile_agent +++ b/dockerfile_agent @@ -30,7 +30,7 @@ RUN mkdir /pavlov && \ RUN pip install sentry-sdk==0.16.0 requests==2.24.0 pandas GitPython==3.1.14 pyaml openpyxl==3.0.0 xlrd==1.2.0 ruamel-yaml==0.17.21 -ARG AGENT_COMMIT=e1b385986e6b94c829fc672107c8b099ed54a70f +ARG AGENT_COMMIT=b662dba9982af741d5cb7f757f4d8e9888e87857 RUN pip install https://codeload.github.com/deeppavlov/dp-agent/tar.gz/${AGENT_COMMIT} ENV LANG C.UTF-8 From a297142b695afdd6d8aa3e415491e55655266083 Mon Sep 17 00:00:00 2001 From: moon-strider Date: Tue, 26 Sep 2023 14:31:02 +0300 Subject: [PATCH 26/50] adding file server to dream_ocean dist --- assistant_dists/dream_ocean/dev.yml | 5 +++++ assistant_dists/dream_ocean/docker-compose.override.yml | 3 +++ 2 files changed, 8 insertions(+) diff --git a/assistant_dists/dream_ocean/dev.yml b/assistant_dists/dream_ocean/dev.yml index 07f56e3d10..2236adfd16 100644 --- a/assistant_dists/dream_ocean/dev.yml +++ b/assistant_dists/dream_ocean/dev.yml @@ -149,4 +149,9 @@ services: - "./annotators/emotion_detection:/src" ports: - 8045:8045 + files: + ports: + - 3000:3000 + volumes: + - "~/.deeppavlov/file_server:/tmp" version: "3.7" diff --git a/assistant_dists/dream_ocean/docker-compose.override.yml b/assistant_dists/dream_ocean/docker-compose.override.yml index 35bea96b9f..88372ed78f 100644 --- a/assistant_dists/dream_ocean/docker-compose.override.yml +++ b/assistant_dists/dream_ocean/docker-compose.override.yml @@ -15,6 +15,9 @@ services: LANGUAGE: EN FALLBACK_FILE: fallbacks_dream_en.json + files: + image: julienmeerschart/simple-file-upload-download-server + ranking-based-response-selector: env_file: [ .env ] build: From dbead4715929f2ef5761a80d1745b5d886c0c073 Mon Sep 17 00:00:00 2001 From: moon-strider Date: Tue, 26 Sep 2023 16:12:58 +0300 Subject: [PATCH 27/50] more pr fixes --- .../service_configs/emotion_detection/service.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/annotators/emotion_detection/service_configs/emotion_detection/service.yml b/annotators/emotion_detection/service_configs/emotion_detection/service.yml index 184e7d7a59..1f55e31f39 100644 --- a/annotators/emotion_detection/service_configs/emotion_detection/service.yml +++ b/annotators/emotion_detection/service_configs/emotion_detection/service.yml @@ -8,9 +8,10 @@ compose: args: SERVICE_PORT: 8045 SERVICE_NAME: emotion_detection - VIDEO_MODEL: "microsoft/xclip-base-patch32" - TEXT_MODEL: "bert-large-uncased" + VIDEO_PRETRAINED: "microsoft/xclip-base-patch32" + TEXT_PRETRAINED: "bert-large-uncased" MULTIMODAL_MODEL: "final_model.pt" + MODEL_PATH: "/data/" PREFIX: "Detect emotions:" context: . dockerfile: ./annotators/emotion_detection/Dockerfile From f971885e7e97930c30089895f192f85aa14f2f9b Mon Sep 17 00:00:00 2001 From: moon-strider Date: Tue, 26 Sep 2023 17:17:49 +0300 Subject: [PATCH 28/50] fixed a critical typo in dockerfile --- annotators/emotion_detection/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/annotators/emotion_detection/Dockerfile b/annotators/emotion_detection/Dockerfile index 9a29329d45..ee286a8b2a 100644 --- a/annotators/emotion_detection/Dockerfile +++ b/annotators/emotion_detection/Dockerfile @@ -4,7 +4,7 @@ RUN apt update RUN apt install -y python3.9 RUN apt install -y git python3-pip -ARG VIDEO_PRETREINED +ARG VIDEO_PRETRAINED ARG TEXT_PRETRAINED ARG MODEL_PATH ARG MULTIMODAL_MODEL From 8981183594676167155d0142ce04af6d9a3a8c23 Mon Sep 17 00:00:00 2001 From: moon-strider Date: Wed, 27 Sep 2023 13:39:36 +0300 Subject: [PATCH 29/50] ignoring E402 for some lines of code --- annotators/emotion_detection/server.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/annotators/emotion_detection/server.py b/annotators/emotion_detection/server.py index 3091b3753e..c5d178dbc1 100644 --- a/annotators/emotion_detection/server.py +++ b/annotators/emotion_detection/server.py @@ -7,8 +7,8 @@ import cv2 import sys -sys.path.append("/data") -sys.path.append("/data/multimodal_concat") +sys.path.append("/data") # noqa: E402 +sys.path.append("/data/multimodal_concat") # noqa: E402 from multimodal_concat.models import MultimodalClassificaionModel, MainModel from multimodal_concat.utils import prepare_models From a822ca1667f436693c39fd7e29f65bb61226d73c Mon Sep 17 00:00:00 2001 From: moon-strider Date: Wed, 27 Sep 2023 14:10:42 +0300 Subject: [PATCH 30/50] attempting to fix E402 --- annotators/emotion_detection/Dockerfile | 5 ++++- annotators/emotion_detection/server.py | 4 ---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/annotators/emotion_detection/Dockerfile b/annotators/emotion_detection/Dockerfile index ee286a8b2a..a0ff5acf12 100644 --- a/annotators/emotion_detection/Dockerfile +++ b/annotators/emotion_detection/Dockerfile @@ -33,4 +33,7 @@ RUN touch /data/multimodal_concat/__init__.py RUN gdown 'https://drive.google.com/uc?id=12C36rGUe7tuWGAh_FByw80c3wAtdUHx8' -O '/data/1d_cnn_with_opensmile.pt' RUN gdown 'https://drive.google.com/uc?id=1ZHw2MEbjLwU5A7EaNysgVHZlaWq4FJZG' -O '/data/bert-large-uncased_none_seed-42.pt' RUN gdown 'https://drive.google.com/uc?id=1tDf-jWihZ6M0oX-niOfVmLUimJqYrG_M' -O '/data/final_model.pt' -RUN gdown 'https://drive.google.com/uc?id=1DMUHqbwqn-j9XIhoqnfSwqyqrlPMkVJe' -O '/data/XCLIP_Augmented.pt' \ No newline at end of file +RUN gdown 'https://drive.google.com/uc?id=1DMUHqbwqn-j9XIhoqnfSwqyqrlPMkVJe' -O '/data/XCLIP_Augmented.pt' + +ENV PATH=$PATH:/data +ENV PATH=$PATH:/data/multimodal_concat \ No newline at end of file diff --git a/annotators/emotion_detection/server.py b/annotators/emotion_detection/server.py index c5d178dbc1..13b0d6b504 100644 --- a/annotators/emotion_detection/server.py +++ b/annotators/emotion_detection/server.py @@ -5,10 +5,6 @@ import numpy as np import sentry_sdk import cv2 -import sys - -sys.path.append("/data") # noqa: E402 -sys.path.append("/data/multimodal_concat") # noqa: E402 from multimodal_concat.models import MultimodalClassificaionModel, MainModel from multimodal_concat.utils import prepare_models From 9678e7e1e4993aa5bed6349a9f7c23d6ac6a6e70 Mon Sep 17 00:00:00 2001 From: moon-strider Date: Wed, 27 Sep 2023 16:24:47 +0300 Subject: [PATCH 31/50] another attempt at fixing E402 --- annotators/emotion_detection/Dockerfile | 5 +---- annotators/emotion_detection/aux.py | 4 ++++ annotators/emotion_detection/server.py | 1 + 3 files changed, 6 insertions(+), 4 deletions(-) create mode 100644 annotators/emotion_detection/aux.py diff --git a/annotators/emotion_detection/Dockerfile b/annotators/emotion_detection/Dockerfile index a0ff5acf12..ee286a8b2a 100644 --- a/annotators/emotion_detection/Dockerfile +++ b/annotators/emotion_detection/Dockerfile @@ -33,7 +33,4 @@ RUN touch /data/multimodal_concat/__init__.py RUN gdown 'https://drive.google.com/uc?id=12C36rGUe7tuWGAh_FByw80c3wAtdUHx8' -O '/data/1d_cnn_with_opensmile.pt' RUN gdown 'https://drive.google.com/uc?id=1ZHw2MEbjLwU5A7EaNysgVHZlaWq4FJZG' -O '/data/bert-large-uncased_none_seed-42.pt' RUN gdown 'https://drive.google.com/uc?id=1tDf-jWihZ6M0oX-niOfVmLUimJqYrG_M' -O '/data/final_model.pt' -RUN gdown 'https://drive.google.com/uc?id=1DMUHqbwqn-j9XIhoqnfSwqyqrlPMkVJe' -O '/data/XCLIP_Augmented.pt' - -ENV PATH=$PATH:/data -ENV PATH=$PATH:/data/multimodal_concat \ No newline at end of file +RUN gdown 'https://drive.google.com/uc?id=1DMUHqbwqn-j9XIhoqnfSwqyqrlPMkVJe' -O '/data/XCLIP_Augmented.pt' \ No newline at end of file diff --git a/annotators/emotion_detection/aux.py b/annotators/emotion_detection/aux.py new file mode 100644 index 0000000000..2a2a0732bd --- /dev/null +++ b/annotators/emotion_detection/aux.py @@ -0,0 +1,4 @@ +import sys + +sys.path.append("/data") +sys.path.append("/data/multimodal_concat") diff --git a/annotators/emotion_detection/server.py b/annotators/emotion_detection/server.py index 13b0d6b504..8d0e78fa10 100644 --- a/annotators/emotion_detection/server.py +++ b/annotators/emotion_detection/server.py @@ -5,6 +5,7 @@ import numpy as np import sentry_sdk import cv2 +import aux from multimodal_concat.models import MultimodalClassificaionModel, MainModel from multimodal_concat.utils import prepare_models From 54d99c96ba8cacbd277d8e7d15a2fae98ad21a85 Mon Sep 17 00:00:00 2001 From: moon-strider Date: Wed, 27 Sep 2023 16:27:12 +0300 Subject: [PATCH 32/50] another one --- annotators/emotion_detection/server.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/annotators/emotion_detection/server.py b/annotators/emotion_detection/server.py index 8d0e78fa10..ff7b4d768d 100644 --- a/annotators/emotion_detection/server.py +++ b/annotators/emotion_detection/server.py @@ -5,7 +5,7 @@ import numpy as np import sentry_sdk import cv2 -import aux +import aux # noqa: F401 from multimodal_concat.models import MultimodalClassificaionModel, MainModel from multimodal_concat.utils import prepare_models From 348395b51b47f1e19a4309c659056a10ecade02f Mon Sep 17 00:00:00 2001 From: Alexandra Dolidze Date: Mon, 11 Dec 2023 19:44:38 +0300 Subject: [PATCH 33/50] new models added --- annotators/emotion_detection/Dockerfile | 12 +++++++++--- annotators/emotion_detection/server.py | 11 ++++++++++- .../dream_ocean/docker-compose.override.yml | 2 +- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/annotators/emotion_detection/Dockerfile b/annotators/emotion_detection/Dockerfile index ee286a8b2a..e741454a0e 100644 --- a/annotators/emotion_detection/Dockerfile +++ b/annotators/emotion_detection/Dockerfile @@ -8,11 +8,13 @@ ARG VIDEO_PRETRAINED ARG TEXT_PRETRAINED ARG MODEL_PATH ARG MULTIMODAL_MODEL +ARG REDUNDANT_FEATURES ENV VIDEO_PRETRAINED=$VIDEO_PRETRAINED ENV TEXT_PRETRAINED=$TEXT_PRETRAINED ENV MULTIMODAL_MODEL=$MULTIMODAL_MODEL ENV MODEL_PATH=$MODEL_PATH +ENV REDUNDANT_FEATURES=$REDUNDANT_FEATURES WORKDIR /src @@ -30,7 +32,11 @@ RUN mv -f /data/repo/* /data/ && rm -rf /data/repo RUN touch /data/multimodal_concat/__init__.py -RUN gdown 'https://drive.google.com/uc?id=12C36rGUe7tuWGAh_FByw80c3wAtdUHx8' -O '/data/1d_cnn_with_opensmile.pt' +RUN gdown 'https://drive.google.com/uc?id=1G2SbaE6Ef7mCFcvI60KqINYQlX-kYUhp' -O '/data/1d_cnn_with_opensmile.pt' RUN gdown 'https://drive.google.com/uc?id=1ZHw2MEbjLwU5A7EaNysgVHZlaWq4FJZG' -O '/data/bert-large-uncased_none_seed-42.pt' -RUN gdown 'https://drive.google.com/uc?id=1tDf-jWihZ6M0oX-niOfVmLUimJqYrG_M' -O '/data/final_model.pt' -RUN gdown 'https://drive.google.com/uc?id=1DMUHqbwqn-j9XIhoqnfSwqyqrlPMkVJe' -O '/data/XCLIP_Augmented.pt' \ No newline at end of file +RUN gdown 'https://drive.google.com/uc?id=1XZVPI2ZvE0PbvhFMinsAp2z9SPPEsSjn' -O '/data/final_model.pt' +RUN gdown 'https://drive.google.com/uc?id=1DMUHqbwqn-j9XIhoqnfSwqyqrlPMkVJe' -O '/data/XCLIP_Augmented.pt' +RUN gdown 'https://drive.google.com/uc?id=1VxEQcso_Bsrzix1TykriJ2BLfUm9Gtx5' -O '/data/redundant_features.txt' + +RUN ls '/data' +RUN echo MODEL_PATH \ No newline at end of file diff --git a/annotators/emotion_detection/server.py b/annotators/emotion_detection/server.py index ff7b4d768d..47aa75d1af 100644 --- a/annotators/emotion_detection/server.py +++ b/annotators/emotion_detection/server.py @@ -123,7 +123,16 @@ def process_audio(file_path: str): verbose=True, ) - audio_features = smile.process_files([file_path]) + redundant_features = os.getenv("REDUNDANT_FEATURES") + print(redundant_features) + redundant_features_list = [] + with open(os.getenv("REDUNDANT_FEATURES"), "r") as features_file: + for line in features_file: + redundant_features_list.append(line.split(',')) + print(redundant_features_list) + + audio_features = smile.process_files([file_path], redundant_features_list) + audio_features = audio_features.drop(columns=redundant_features_list, inplace=False) return audio_features.values.reshape(audio_features.shape[0], 1, audio_features.shape[1]) diff --git a/assistant_dists/dream_ocean/docker-compose.override.yml b/assistant_dists/dream_ocean/docker-compose.override.yml index 88372ed78f..da894c5ce2 100644 --- a/assistant_dists/dream_ocean/docker-compose.override.yml +++ b/assistant_dists/dream_ocean/docker-compose.override.yml @@ -462,6 +462,6 @@ services: reservations: memory: 1G environment: - - CUDA_VISIBLE_DEVICES=0 + - CUDA_VISIBLE_DEVICES=3,4,5 version: '3.7' From 0d11584fce04b2fab098e3db656bd7e29093feaf Mon Sep 17 00:00:00 2001 From: Alexandra Dolidze Date: Wed, 13 Dec 2023 17:35:29 +0300 Subject: [PATCH 34/50] minor changes --- annotators/emotion_detection/Dockerfile | 9 ++---- annotators/emotion_detection/requirements.txt | 3 +- annotators/emotion_detection/server.py | 28 +++++++++++-------- .../emotion_detection/service.yml | 1 + .../dream_ocean/docker-compose.override.yml | 2 +- 5 files changed, 24 insertions(+), 19 deletions(-) diff --git a/annotators/emotion_detection/Dockerfile b/annotators/emotion_detection/Dockerfile index e741454a0e..1e1035a5e3 100644 --- a/annotators/emotion_detection/Dockerfile +++ b/annotators/emotion_detection/Dockerfile @@ -26,17 +26,14 @@ RUN apt install -y ffmpeg=7:4.2.7-0ubuntu0.1 libsm6=2:1.2.3-1 libxext6=2:1.3.4-0 RUN pip install gdown==4.7.1 -RUN git clone https://github.com/anna-a-m/MultimodalERC /data/repo && cd /data/repo && git reset --hard 95cbd971ecb2a057f0162f0384bba28c6fddee31 +RUN git clone https://github.com/anna-a-m/MultimodalERC /data/repo && cd /data/repo && git reset --hard 84097d442b23b5a9238b5090a04e2625741314ae RUN mv -f /data/repo/* /data/ && rm -rf /data/repo RUN touch /data/multimodal_concat/__init__.py -RUN gdown 'https://drive.google.com/uc?id=1G2SbaE6Ef7mCFcvI60KqINYQlX-kYUhp' -O '/data/1d_cnn_with_opensmile.pt' +RUN gdown 'https://drive.google.com/uc?id=15rB8cn3MSJpFNIKHY3f9qvCMbgH2ZLmR' -O '/data/1d_cnn_with_opensmile.pt' RUN gdown 'https://drive.google.com/uc?id=1ZHw2MEbjLwU5A7EaNysgVHZlaWq4FJZG' -O '/data/bert-large-uncased_none_seed-42.pt' RUN gdown 'https://drive.google.com/uc?id=1XZVPI2ZvE0PbvhFMinsAp2z9SPPEsSjn' -O '/data/final_model.pt' RUN gdown 'https://drive.google.com/uc?id=1DMUHqbwqn-j9XIhoqnfSwqyqrlPMkVJe' -O '/data/XCLIP_Augmented.pt' -RUN gdown 'https://drive.google.com/uc?id=1VxEQcso_Bsrzix1TykriJ2BLfUm9Gtx5' -O '/data/redundant_features.txt' - -RUN ls '/data' -RUN echo MODEL_PATH \ No newline at end of file +RUN gdown 'https://drive.google.com/uc?id=1VxEQcso_Bsrzix1TykriJ2BLfUm9Gtx5' -O '/data/redundant_features.txt' \ No newline at end of file diff --git a/annotators/emotion_detection/requirements.txt b/annotators/emotion_detection/requirements.txt index c16f5ccafe..9dbf8baf15 100644 --- a/annotators/emotion_detection/requirements.txt +++ b/annotators/emotion_detection/requirements.txt @@ -12,4 +12,5 @@ pydantic==2.3.0 numpy==1.24.4 starlette==0.27.0 uvicorn==0.23.2 -Pillow==9.3.0 \ No newline at end of file +Pillow==9.3.0 +wandb==0.13.9 \ No newline at end of file diff --git a/annotators/emotion_detection/server.py b/annotators/emotion_detection/server.py index 47aa75d1af..e180dacae8 100644 --- a/annotators/emotion_detection/server.py +++ b/annotators/emotion_detection/server.py @@ -7,7 +7,7 @@ import cv2 import aux # noqa: F401 -from multimodal_concat.models import MultimodalClassificaionModel, MainModel +from multimodal_concat.models import MultimodalClassificationModel, MainModel from multimodal_concat.utils import prepare_models from fastapi import FastAPI @@ -76,12 +76,12 @@ def get_frames( def create_final_model(): - multi_model = MultimodalClassificaionModel( + multi_model = MultimodalClassificationModel( text_model, video_model, audio_model, num_labels, - input_size=1920, + input_size=4885, hidden_size=512, ) checkpoint = torch.load(os.getenv("MULTIMODAL_MODEL")) @@ -93,6 +93,7 @@ def create_final_model(): def process_text(input_tokens: str): text_model_name = os.getenv("TEXT_PRETRAINED") + logger.info(f"{text_model_name}") tokenizer = AutoTokenizer.from_pretrained(text_model_name) return tokenizer( @@ -124,22 +125,23 @@ def process_audio(file_path: str): ) redundant_features = os.getenv("REDUNDANT_FEATURES") - print(redundant_features) - redundant_features_list = [] - with open(os.getenv("REDUNDANT_FEATURES"), "r") as features_file: - for line in features_file: - redundant_features_list.append(line.split(',')) - print(redundant_features_list) - - audio_features = smile.process_files([file_path], redundant_features_list) + logger.info(f"{redundant_features}") + with open(redundant_features, 'r') as features_file: + redundant_features_list = features_file.read().split(',') + logger.info(f"{redundant_features_list}") + + audio_features = smile.process_files([file_path]) audio_features = audio_features.drop(columns=redundant_features_list, inplace=False) return audio_features.values.reshape(audio_features.shape[0], 1, audio_features.shape[1]) def inference(text: str, video_path: str): text_encoding = process_text(text) + logger.info(f"{text_encoding}") video_encoding = process_video(video_path) + logger.info(f"{video_encoding}") audio_features = process_audio(video_path) + logger.info(f"{audio_features}") batch = { "text": text_encoding, "video": video_encoding, @@ -153,6 +155,7 @@ def inference(text: str, video_path: str): def predict_emotion(text: str, video_path: str): try: + logger.info(f"{inference(text, video_path)}") return inference(text, video_path) except Exception as e: sentry_sdk.capture_exception(e) @@ -170,10 +173,13 @@ class EmotionsPayload(BaseModel): def subinfer(msg_text: str, video_path: str): emotion = "Emotion detection unsuccessfull. An error occured during inference." filepath = "undefined" + logger.info(f"{video_path}") try: filename = video_path.split("=")[-1] filepath = f"/data/{filename}" + logger.info(f"filepath -- {filepath}, filename -- {filename}") urlretrieve(video_path, filepath) + logger.info(f"{urlretrieve(video_path, filepath)}") if not os.path.exists(filepath): raise ValueError(f"Failed to retrieve videofile from {filepath}") emotion = predict_emotion(msg_text, filepath) diff --git a/annotators/emotion_detection/service_configs/emotion_detection/service.yml b/annotators/emotion_detection/service_configs/emotion_detection/service.yml index 1f55e31f39..2009225c8f 100644 --- a/annotators/emotion_detection/service_configs/emotion_detection/service.yml +++ b/annotators/emotion_detection/service_configs/emotion_detection/service.yml @@ -11,6 +11,7 @@ compose: VIDEO_PRETRAINED: "microsoft/xclip-base-patch32" TEXT_PRETRAINED: "bert-large-uncased" MULTIMODAL_MODEL: "final_model.pt" + REDUNDANT_FEATURES: "redundant_features.txt" MODEL_PATH: "/data/" PREFIX: "Detect emotions:" context: . diff --git a/assistant_dists/dream_ocean/docker-compose.override.yml b/assistant_dists/dream_ocean/docker-compose.override.yml index da894c5ce2..88372ed78f 100644 --- a/assistant_dists/dream_ocean/docker-compose.override.yml +++ b/assistant_dists/dream_ocean/docker-compose.override.yml @@ -462,6 +462,6 @@ services: reservations: memory: 1G environment: - - CUDA_VISIBLE_DEVICES=3,4,5 + - CUDA_VISIBLE_DEVICES=0 version: '3.7' From 93a49471297f7a6c653932e2f99eb63e407df1bf Mon Sep 17 00:00:00 2001 From: Alexandra Dolidze Date: Thu, 14 Dec 2023 17:29:16 +0300 Subject: [PATCH 35/50] formatters slightly changed --- annotators/emotion_detection/server.py | 17 ++++++++--------- annotators/personality_detection/server.py | 3 ++- state_formatters/dp_formatters.py | 13 +++++++++++-- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/annotators/emotion_detection/server.py b/annotators/emotion_detection/server.py index e180dacae8..c631432dca 100644 --- a/annotators/emotion_detection/server.py +++ b/annotators/emotion_detection/server.py @@ -137,11 +137,11 @@ def process_audio(file_path: str): def inference(text: str, video_path: str): text_encoding = process_text(text) - logger.info(f"{text_encoding}") + logger.warning(f"{text_encoding}") video_encoding = process_video(video_path) - logger.info(f"{video_encoding}") + logger.warning(f"{video_encoding}") audio_features = process_audio(video_path) - logger.info(f"{audio_features}") + logger.warning(f"{audio_features}") batch = { "text": text_encoding, "video": video_encoding, @@ -155,7 +155,7 @@ def inference(text: str, video_path: str): def predict_emotion(text: str, video_path: str): try: - logger.info(f"{inference(text, video_path)}") + logger.warning(f"{inference(text, video_path)}") return inference(text, video_path) except Exception as e: sentry_sdk.capture_exception(e) @@ -173,17 +173,15 @@ class EmotionsPayload(BaseModel): def subinfer(msg_text: str, video_path: str): emotion = "Emotion detection unsuccessfull. An error occured during inference." filepath = "undefined" - logger.info(f"{video_path}") try: filename = video_path.split("=")[-1] filepath = f"/data/{filename}" - logger.info(f"filepath -- {filepath}, filename -- {filename}") urlretrieve(video_path, filepath) - logger.info(f"{urlretrieve(video_path, filepath)}") if not os.path.exists(filepath): raise ValueError(f"Failed to retrieve videofile from {filepath}") + logger.warning(f"Text for model -- {msg_text}") emotion = predict_emotion(msg_text, filepath) - logger.info(f"Detected emotion: {jsonable_encoder(emotion)}") + logger.warning(f"Detected emotion: {jsonable_encoder(emotion)}") except Exception as e: raise ValueError(f"The message format is correct, but: {e}") return emotion @@ -201,6 +199,7 @@ def subinfer(msg_text: str, video_path: str): @app.post("/model") def infer(payload: EmotionsPayload): - logger.info(f"Emotion Detection: {payload}") + logger.warning(f"Emotion Detection: {payload}") emotion = [subinfer(p[0], p[1]) for p in zip(payload.personality, payload.video_path)] + logger.warning(emotion) return jsonable_encoder(emotion) diff --git a/annotators/personality_detection/server.py b/annotators/personality_detection/server.py index d77a27ace1..c587556167 100644 --- a/annotators/personality_detection/server.py +++ b/annotators/personality_detection/server.py @@ -84,6 +84,7 @@ class PersonalityPayload(BaseModel): @app.post("/model") def infer(payload: PersonalityPayload): - logger.info(f"Personality Detection: {payload}") + logger.warning(f"Personality Detection: {payload}") personality = [predict_personality(p) for p in payload.personality] + logger.warning(personality) return jsonify_data(personality) diff --git a/state_formatters/dp_formatters.py b/state_formatters/dp_formatters.py index 48ec82015b..9db262404a 100755 --- a/state_formatters/dp_formatters.py +++ b/state_formatters/dp_formatters.py @@ -92,11 +92,17 @@ def convert_formatter_dialog(dialog: Dict) -> List[Dict]: def personality_catcher_formatter_dialog(dialog: Dict) -> List[Dict]: # Used by: personality_catcher_formatter + + logger.warning("Personality catcher") + # logger.warning(dialog["human_utterances"][-1]["annotations"].get( + # dialog["human_utterances"][-1]["text"] + # )) + logger.warning(dialog["human_utterances"][-1]["annotations"]) return [ { "personality": [ dialog["human_utterances"][-1]["annotations"].get( - "spelling_preprocessing", dialog["human_utterances"][-1]["text"] + dialog["human_utterances"][-1]["text"] ) ] } @@ -105,11 +111,13 @@ def personality_catcher_formatter_dialog(dialog: Dict) -> List[Dict]: def emotion_detection_formatter(dialog: Dict) -> List[Dict]: # Used by: emotion_detection annotator + logger.warning("Emotion Personality") + logger.warning(dialog["human_utterances"][-1]["annotations"]) return [ { "personality": [ dialog["human_utterances"][-1]["annotations"].get( - "spelling_preprocessing", dialog["human_utterances"][-1]["text"] + dialog["human_utterances"][-1]["text"] ) ], "video_path": [dialog["human_utterances"][-1]["attributes"].get("video_path")], @@ -502,6 +510,7 @@ def simple_formatter_service(payload: List): sent_rewrite_formatter, sent_segm_formatter, base_skill_selector_formatter """ logging.info(f"answer {payload}") + logging.warning(f"answer {payload}") return payload From ba19cf70f88610003915fd563160bc8b9b2d8267 Mon Sep 17 00:00:00 2001 From: Alexandra Dolidze Date: Fri, 22 Dec 2023 13:39:57 +0300 Subject: [PATCH 36/50] dp_formatter for emotion-detection and personality-detection + reviewed erroes fixed --- annotators/emotion_detection/server.py | 38 ++++++++++++------- .../emotion-detection/environment.yml | 9 +++++ .../service.yml | 0 .../emotion_detection/environment.yml | 3 -- .../docker-compose.override.yml | 3 -- .../dream_ocean/docker-compose.override.yml | 2 + .../dream_ocean/pipeline_conf.json | 2 +- state_formatters/dp_formatters.py | 16 ++++---- 8 files changed, 43 insertions(+), 30 deletions(-) create mode 100644 annotators/emotion_detection/service_configs/emotion-detection/environment.yml rename annotators/emotion_detection/service_configs/{emotion_detection => emotion-detection}/service.yml (100%) delete mode 100644 annotators/emotion_detection/service_configs/emotion_detection/environment.yml diff --git a/annotators/emotion_detection/server.py b/annotators/emotion_detection/server.py index c631432dca..4660d877f5 100644 --- a/annotators/emotion_detection/server.py +++ b/annotators/emotion_detection/server.py @@ -125,10 +125,10 @@ def process_audio(file_path: str): ) redundant_features = os.getenv("REDUNDANT_FEATURES") - logger.info(f"{redundant_features}") - with open(redundant_features, 'r') as features_file: + logger.warning(f"{redundant_features}") + with open('/data/redundant_features.txt', 'r') as features_file: redundant_features_list = features_file.read().split(',') - logger.info(f"{redundant_features_list}") + logger.warning(f"{redundant_features_list}") audio_features = smile.process_files([file_path]) audio_features = audio_features.drop(columns=redundant_features_list, inplace=False) @@ -173,17 +173,27 @@ class EmotionsPayload(BaseModel): def subinfer(msg_text: str, video_path: str): emotion = "Emotion detection unsuccessfull. An error occured during inference." filepath = "undefined" - try: - filename = video_path.split("=")[-1] - filepath = f"/data/{filename}" - urlretrieve(video_path, filepath) - if not os.path.exists(filepath): - raise ValueError(f"Failed to retrieve videofile from {filepath}") - logger.warning(f"Text for model -- {msg_text}") - emotion = predict_emotion(msg_text, filepath) - logger.warning(f"Detected emotion: {jsonable_encoder(emotion)}") - except Exception as e: - raise ValueError(f"The message format is correct, but: {e}") + # with no try-catch + filename = video_path.split("=")[-1] + filepath = f"/data/{filename}" + urlretrieve(video_path, filepath) + logger.warning(f"Text for model -- {msg_text}, filepath -- {filepath}") + emotion = predict_emotion(msg_text+' ', filepath) + logger.warning(f"Emotion -- {predict_emotion(msg_text+' ', filepath)}") + logger.warning(f"Detected emotion: {jsonable_encoder(emotion)}") + + # try: + # filename = video_path.split("=")[-1] + # filepath = f"/data/{filename}" + # urlretrieve(video_path, filepath) + # if not os.path.exists(filepath): + # raise ValueError(f"Failed to retrieve videofile from {filepath}") + # logger.warning(f"Text for model -- {msg_text}") + # emotion = predict_emotion(msg_text+' ', filepath) + # logger.warning(f"Detected emotion: {jsonable_encoder(emotion)}") + # except Exception as e: + # raise ValueError(f"The message format is correct, but: {e}") + return emotion diff --git a/annotators/emotion_detection/service_configs/emotion-detection/environment.yml b/annotators/emotion_detection/service_configs/emotion-detection/environment.yml new file mode 100644 index 0000000000..ac3a0fe81c --- /dev/null +++ b/annotators/emotion_detection/service_configs/emotion-detection/environment.yml @@ -0,0 +1,9 @@ +SERVICE_PORT: 8045 +SERVICE_NAME: emotion_detection +CUDA_VISIBLE_DEVICES: 0 +VIDEO_PRETRAINED: "microsoft/xclip-base-patch32" +EXT_PRETRAINED: "bert-large-uncased" +MULTIMODAL_MODEL: "final_model.pt" +REDUNDANT_FEATURES: "redundant_features.txt" +MODEL_PATH: "/data/" +PREFIX: "Detect emotions:" \ No newline at end of file diff --git a/annotators/emotion_detection/service_configs/emotion_detection/service.yml b/annotators/emotion_detection/service_configs/emotion-detection/service.yml similarity index 100% rename from annotators/emotion_detection/service_configs/emotion_detection/service.yml rename to annotators/emotion_detection/service_configs/emotion-detection/service.yml diff --git a/annotators/emotion_detection/service_configs/emotion_detection/environment.yml b/annotators/emotion_detection/service_configs/emotion_detection/environment.yml deleted file mode 100644 index 866f5cbcd3..0000000000 --- a/annotators/emotion_detection/service_configs/emotion_detection/environment.yml +++ /dev/null @@ -1,3 +0,0 @@ -SERVICE_PORT: 8045 -SERVICE_NAME: emotion_detection -CUDA_VISIBLE_DEVICES: 0 \ No newline at end of file diff --git a/assistant_dists/dream_embodied/docker-compose.override.yml b/assistant_dists/dream_embodied/docker-compose.override.yml index 3700fa1ce8..8de355ed3f 100644 --- a/assistant_dists/dream_embodied/docker-compose.override.yml +++ b/assistant_dists/dream_embodied/docker-compose.override.yml @@ -10,9 +10,6 @@ services: ALWAYS_TURN_ON_ALL_SKILLS: 0 LANGUAGE: EN - files: - image: julienmeerschart/simple-file-upload-download-server - ranking-based-response-selector: env_file: [ .env ] build: diff --git a/assistant_dists/dream_ocean/docker-compose.override.yml b/assistant_dists/dream_ocean/docker-compose.override.yml index 88372ed78f..684b33554e 100644 --- a/assistant_dists/dream_ocean/docker-compose.override.yml +++ b/assistant_dists/dream_ocean/docker-compose.override.yml @@ -429,6 +429,7 @@ services: memory: 4G personality-detection: + env_file: [ .env ] build: args: SERVICE_PORT: 8026 @@ -445,6 +446,7 @@ services: memory: 312M emotion-detection: + env_file: [ .env ] build: args: SERVICE_PORT: 8045 diff --git a/assistant_dists/dream_ocean/pipeline_conf.json b/assistant_dists/dream_ocean/pipeline_conf.json index cdd1c9b6e8..5c5291e65c 100644 --- a/assistant_dists/dream_ocean/pipeline_conf.json +++ b/assistant_dists/dream_ocean/pipeline_conf.json @@ -114,7 +114,7 @@ "is_enabled": true, "source": { "component": "components/OQWoiqfnqwfnoqwib.yml", - "service": "annotators/emotion_detection/service_configs/emotion_detection" + "service": "annotators/emotion_detection/service_configs/emotion-detection" } }, "prompt_goals_collector": { diff --git a/state_formatters/dp_formatters.py b/state_formatters/dp_formatters.py index 9db262404a..c780421af6 100755 --- a/state_formatters/dp_formatters.py +++ b/state_formatters/dp_formatters.py @@ -93,17 +93,15 @@ def convert_formatter_dialog(dialog: Dict) -> List[Dict]: def personality_catcher_formatter_dialog(dialog: Dict) -> List[Dict]: # Used by: personality_catcher_formatter - logger.warning("Personality catcher") + logger.warning("Personality catcher with text") # logger.warning(dialog["human_utterances"][-1]["annotations"].get( # dialog["human_utterances"][-1]["text"] # )) - logger.warning(dialog["human_utterances"][-1]["annotations"]) + logger.warning(dialog["human_utterances"][-1]["text"]) return [ { "personality": [ - dialog["human_utterances"][-1]["annotations"].get( - dialog["human_utterances"][-1]["text"] - ) + dialog["human_utterances"][-1].get("text") ] } ] @@ -111,14 +109,14 @@ def personality_catcher_formatter_dialog(dialog: Dict) -> List[Dict]: def emotion_detection_formatter(dialog: Dict) -> List[Dict]: # Used by: emotion_detection annotator - logger.warning("Emotion Personality") + logger.warning("Emotion Personality with annotation") logger.warning(dialog["human_utterances"][-1]["annotations"]) + logger.warning("Total dialog.human_utterance.-1") + logger.warning(dialog["human_utterances"]) return [ { "personality": [ - dialog["human_utterances"][-1]["annotations"].get( - dialog["human_utterances"][-1]["text"] - ) + dialog["human_utterances"][-2].get("text") ], "video_path": [dialog["human_utterances"][-1]["attributes"].get("video_path")], } From 9caeefb441e1c1c9808b0d52e97ddd7ce26ae0ef Mon Sep 17 00:00:00 2001 From: Alexandra Dolidze Date: Fri, 22 Dec 2023 15:07:48 +0300 Subject: [PATCH 37/50] nano error fixed --- annotators/emotion_detection/server.py | 2 +- state_formatters/dp_formatters.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/annotators/emotion_detection/server.py b/annotators/emotion_detection/server.py index 4660d877f5..45074163ef 100644 --- a/annotators/emotion_detection/server.py +++ b/annotators/emotion_detection/server.py @@ -177,7 +177,7 @@ def subinfer(msg_text: str, video_path: str): filename = video_path.split("=")[-1] filepath = f"/data/{filename}" urlretrieve(video_path, filepath) - logger.warning(f"Text for model -- {msg_text}, filepath -- {filepath}") + logger.warning(f"Text for model -- {msg_text+ ' '}, filepath -- {filepath}") emotion = predict_emotion(msg_text+' ', filepath) logger.warning(f"Emotion -- {predict_emotion(msg_text+' ', filepath)}") logger.warning(f"Detected emotion: {jsonable_encoder(emotion)}") diff --git a/state_formatters/dp_formatters.py b/state_formatters/dp_formatters.py index c780421af6..b08396567b 100755 --- a/state_formatters/dp_formatters.py +++ b/state_formatters/dp_formatters.py @@ -116,7 +116,7 @@ def emotion_detection_formatter(dialog: Dict) -> List[Dict]: return [ { "personality": [ - dialog["human_utterances"][-2].get("text") + dialog["human_utterances"][-1].get("text") ], "video_path": [dialog["human_utterances"][-1]["attributes"].get("video_path")], } From 58e5e318e33a91d094efbbb2a2a3e42f13f0739c Mon Sep 17 00:00:00 2001 From: Alexandra Dolidze Date: Tue, 26 Dec 2023 17:04:36 +0300 Subject: [PATCH 38/50] port changed, redundant features file added to docker --- annotators/emotion_detection/Dockerfile | 4 +++- annotators/emotion_detection/server.py | 2 +- assistant_dists/dream_ocean/dev.yml | 2 +- assistant_dists/dream_ocean/docker-compose.override.yml | 7 ++++--- assistant_dists/dream_ocean/pipeline_conf.json | 2 +- dockerfile_agent | 2 +- 6 files changed, 11 insertions(+), 8 deletions(-) diff --git a/annotators/emotion_detection/Dockerfile b/annotators/emotion_detection/Dockerfile index 1e1035a5e3..db4f5caf28 100644 --- a/annotators/emotion_detection/Dockerfile +++ b/annotators/emotion_detection/Dockerfile @@ -36,4 +36,6 @@ RUN gdown 'https://drive.google.com/uc?id=15rB8cn3MSJpFNIKHY3f9qvCMbgH2ZLmR' -O RUN gdown 'https://drive.google.com/uc?id=1ZHw2MEbjLwU5A7EaNysgVHZlaWq4FJZG' -O '/data/bert-large-uncased_none_seed-42.pt' RUN gdown 'https://drive.google.com/uc?id=1XZVPI2ZvE0PbvhFMinsAp2z9SPPEsSjn' -O '/data/final_model.pt' RUN gdown 'https://drive.google.com/uc?id=1DMUHqbwqn-j9XIhoqnfSwqyqrlPMkVJe' -O '/data/XCLIP_Augmented.pt' -RUN gdown 'https://drive.google.com/uc?id=1VxEQcso_Bsrzix1TykriJ2BLfUm9Gtx5' -O '/data/redundant_features.txt' \ No newline at end of file +RUN gdown 'https://drive.google.com/uc?id=1VxEQcso_Bsrzix1TykriJ2BLfUm9Gtx5' -O '/data/redundant_features.txt' + +RUN echo $REDUNDANT_FEATURES \ No newline at end of file diff --git a/annotators/emotion_detection/server.py b/annotators/emotion_detection/server.py index 45074163ef..69af7ce310 100644 --- a/annotators/emotion_detection/server.py +++ b/annotators/emotion_detection/server.py @@ -126,7 +126,7 @@ def process_audio(file_path: str): redundant_features = os.getenv("REDUNDANT_FEATURES") logger.warning(f"{redundant_features}") - with open('/data/redundant_features.txt', 'r') as features_file: + with open(redundant_features, 'r') as features_file: redundant_features_list = features_file.read().split(',') logger.warning(f"{redundant_features_list}") diff --git a/assistant_dists/dream_ocean/dev.yml b/assistant_dists/dream_ocean/dev.yml index 2236adfd16..72963f5000 100644 --- a/assistant_dists/dream_ocean/dev.yml +++ b/assistant_dists/dream_ocean/dev.yml @@ -148,7 +148,7 @@ services: volumes: - "./annotators/emotion_detection:/src" ports: - - 8045:8045 + - 8040:8040 files: ports: - 3000:3000 diff --git a/assistant_dists/dream_ocean/docker-compose.override.yml b/assistant_dists/dream_ocean/docker-compose.override.yml index 684b33554e..779c2c0d5a 100644 --- a/assistant_dists/dream_ocean/docker-compose.override.yml +++ b/assistant_dists/dream_ocean/docker-compose.override.yml @@ -7,7 +7,7 @@ services: factoid-qa:8071, kbqa:8072, entity-linking:8075, wiki-parser:8077, text-qa:8078, combined-classification:8087, fact-retrieval:8100, entity-detection:8103, sentence-ranker:8128, property-extraction:8136, prompt-selector:8135, openai-api-chatgpt:8145, - openai-api-chatgpt-16k:8167, summarization-annotator:8058, dialog-summarizer:8059, personality-detection:8026, emotion-detection:8045" + openai-api-chatgpt-16k:8167, summarization-annotator:8058, dialog-summarizer:8059, personality-detection:8026, emotion-detection:8040" WAIT_HOSTS_TIMEOUT: ${WAIT_TIMEOUT:-1000} HIGH_PRIORITY_INTENTS: 1 RESTRICTION_FOR_SENSITIVE_CASE: 1 @@ -449,14 +449,15 @@ services: env_file: [ .env ] build: args: - SERVICE_PORT: 8045 + SERVICE_PORT: 8040 SERVICE_NAME: emotion_detection VIDEO_PRETRAINED: "microsoft/xclip-base-patch32" TEXT_PRETRAINED: "bert-large-uncased" MODEL_PATH: "/data/" MULTIMODAL_MODEL: "/data/final_model.pt" + REDUNDANT_FEATURES: "/data/redundant_features.txt" context: annotators/emotion_detection - command: uvicorn server:app --host 0.0.0.0 --port 8045 + command: uvicorn server:app --host 0.0.0.0 --port 8040 deploy: resources: limits: diff --git a/assistant_dists/dream_ocean/pipeline_conf.json b/assistant_dists/dream_ocean/pipeline_conf.json index 5c5291e65c..47ff2e2b15 100644 --- a/assistant_dists/dream_ocean/pipeline_conf.json +++ b/assistant_dists/dream_ocean/pipeline_conf.json @@ -105,7 +105,7 @@ "connector": { "protocol": "http", "timeout": 15.0, - "url": "http://emotion-detection:8045/model" + "url": "http://emotion-detection:8040/model" }, "dialog_formatter": "state_formatters.dp_formatters:emotion_detection_formatter", "response_formatter": "state_formatters.dp_formatters:simple_formatter_service", diff --git a/dockerfile_agent b/dockerfile_agent index 1beb15919f..38140e2028 100644 --- a/dockerfile_agent +++ b/dockerfile_agent @@ -30,7 +30,7 @@ RUN mkdir /pavlov && \ RUN pip install sentry-sdk==0.16.0 requests==2.24.0 pandas GitPython==3.1.14 pyaml openpyxl==3.0.0 xlrd==1.2.0 ruamel-yaml==0.17.21 -ARG AGENT_COMMIT=b662dba9982af741d5cb7f757f4d8e9888e87857 +ARG AGENT_COMMIT=cea048eb2c421649a534321dd570dc52e90da0b7 RUN pip install https://codeload.github.com/deeppavlov/dp-agent/tar.gz/${AGENT_COMMIT} ENV LANG C.UTF-8 From d8ecfb7b108d114e5af9548e03f68810393ad06f Mon Sep 17 00:00:00 2001 From: Alexandra Dolidze Date: Tue, 26 Dec 2023 17:40:52 +0300 Subject: [PATCH 39/50] port fixed(2) --- components.tsv | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components.tsv b/components.tsv index 98c3fc1043..4876c3956d 100644 --- a/components.tsv +++ b/components.tsv @@ -43,12 +43,12 @@ 8037 dff-weather-skill 8038 robot-fake-server 8039 -8040 +8040 emotion-detection 8041 dff-embodied-skill 8042 embodied-sender 8043 8044 -8045 emotion-detection +8045 8046 8047 eliza 8048 emotion-ranking-based-response-selector From 437a5518ee7ff42543409055fbb8e2304fe22d1a Mon Sep 17 00:00:00 2001 From: Alexandra Dolidze Date: Tue, 26 Dec 2023 17:41:36 +0300 Subject: [PATCH 40/50] port fixed(3) --- components.tsv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components.tsv b/components.tsv index 4876c3956d..55f23e1d12 100644 --- a/components.tsv +++ b/components.tsv @@ -47,7 +47,7 @@ 8041 dff-embodied-skill 8042 embodied-sender 8043 -8044 +8044 bot-knowledge-memorizer 8045 8046 8047 eliza From 5347bc53d0fa769a875b7479cde5482e87bcd263 Mon Sep 17 00:00:00 2001 From: Alexandra Dolidze Date: Tue, 26 Dec 2023 18:11:11 +0300 Subject: [PATCH 41/50] codestyle fixed --- annotators/emotion_detection/server.py | 40 +++++++--------------- annotators/personality_detection/server.py | 3 +- state_formatters/dp_formatters.py | 18 ++-------- 3 files changed, 15 insertions(+), 46 deletions(-) diff --git a/annotators/emotion_detection/server.py b/annotators/emotion_detection/server.py index 69af7ce310..03abc4c2e6 100644 --- a/annotators/emotion_detection/server.py +++ b/annotators/emotion_detection/server.py @@ -125,10 +125,8 @@ def process_audio(file_path: str): ) redundant_features = os.getenv("REDUNDANT_FEATURES") - logger.warning(f"{redundant_features}") with open(redundant_features, 'r') as features_file: redundant_features_list = features_file.read().split(',') - logger.warning(f"{redundant_features_list}") audio_features = smile.process_files([file_path]) audio_features = audio_features.drop(columns=redundant_features_list, inplace=False) @@ -137,11 +135,8 @@ def process_audio(file_path: str): def inference(text: str, video_path: str): text_encoding = process_text(text) - logger.warning(f"{text_encoding}") video_encoding = process_video(video_path) - logger.warning(f"{video_encoding}") audio_features = process_audio(video_path) - logger.warning(f"{audio_features}") batch = { "text": text_encoding, "video": video_encoding, @@ -172,27 +167,17 @@ class EmotionsPayload(BaseModel): def subinfer(msg_text: str, video_path: str): emotion = "Emotion detection unsuccessfull. An error occured during inference." - filepath = "undefined" - # with no try-catch - filename = video_path.split("=")[-1] - filepath = f"/data/{filename}" - urlretrieve(video_path, filepath) - logger.warning(f"Text for model -- {msg_text+ ' '}, filepath -- {filepath}") - emotion = predict_emotion(msg_text+' ', filepath) - logger.warning(f"Emotion -- {predict_emotion(msg_text+' ', filepath)}") - logger.warning(f"Detected emotion: {jsonable_encoder(emotion)}") - - # try: - # filename = video_path.split("=")[-1] - # filepath = f"/data/{filename}" - # urlretrieve(video_path, filepath) - # if not os.path.exists(filepath): - # raise ValueError(f"Failed to retrieve videofile from {filepath}") - # logger.warning(f"Text for model -- {msg_text}") - # emotion = predict_emotion(msg_text+' ', filepath) - # logger.warning(f"Detected emotion: {jsonable_encoder(emotion)}") - # except Exception as e: - # raise ValueError(f"The message format is correct, but: {e}") + filepath = "undefined" + try: + filename = video_path.split("=")[-1] + filepath = f"/data/{filename}" + urlretrieve(video_path, filepath) + if not os.path.exists(filepath): + raise ValueError(f"Failed to retrieve videofile from {filepath}") + emotion = predict_emotion(msg_text + ' ', filepath) + logger.info(f"Detected emotion: {jsonable_encoder(emotion)}") + except Exception as e: + raise ValueError(f"The message format is correct, but: {e}") return emotion @@ -209,7 +194,6 @@ def subinfer(msg_text: str, video_path: str): @app.post("/model") def infer(payload: EmotionsPayload): - logger.warning(f"Emotion Detection: {payload}") + logger.info(f"Emotion Detection: {payload}") emotion = [subinfer(p[0], p[1]) for p in zip(payload.personality, payload.video_path)] - logger.warning(emotion) return jsonable_encoder(emotion) diff --git a/annotators/personality_detection/server.py b/annotators/personality_detection/server.py index c587556167..d77a27ace1 100644 --- a/annotators/personality_detection/server.py +++ b/annotators/personality_detection/server.py @@ -84,7 +84,6 @@ class PersonalityPayload(BaseModel): @app.post("/model") def infer(payload: PersonalityPayload): - logger.warning(f"Personality Detection: {payload}") + logger.info(f"Personality Detection: {payload}") personality = [predict_personality(p) for p in payload.personality] - logger.warning(personality) return jsonify_data(personality) diff --git a/state_formatters/dp_formatters.py b/state_formatters/dp_formatters.py index b08396567b..80830fde38 100755 --- a/state_formatters/dp_formatters.py +++ b/state_formatters/dp_formatters.py @@ -92,32 +92,18 @@ def convert_formatter_dialog(dialog: Dict) -> List[Dict]: def personality_catcher_formatter_dialog(dialog: Dict) -> List[Dict]: # Used by: personality_catcher_formatter - - logger.warning("Personality catcher with text") - # logger.warning(dialog["human_utterances"][-1]["annotations"].get( - # dialog["human_utterances"][-1]["text"] - # )) - logger.warning(dialog["human_utterances"][-1]["text"]) return [ { - "personality": [ - dialog["human_utterances"][-1].get("text") - ] + "personality": [dialog["human_utterances"][-1].get("text")] } ] def emotion_detection_formatter(dialog: Dict) -> List[Dict]: # Used by: emotion_detection annotator - logger.warning("Emotion Personality with annotation") - logger.warning(dialog["human_utterances"][-1]["annotations"]) - logger.warning("Total dialog.human_utterance.-1") - logger.warning(dialog["human_utterances"]) return [ { - "personality": [ - dialog["human_utterances"][-1].get("text") - ], + "personality": [dialog["human_utterances"][-1].get("text")], "video_path": [dialog["human_utterances"][-1]["attributes"].get("video_path")], } ] From 9150b11507740d7d6321d96a41a90d9d10a1ca9b Mon Sep 17 00:00:00 2001 From: Alexandra Dolidze Date: Tue, 26 Dec 2023 18:26:12 +0300 Subject: [PATCH 42/50] codestyle fixed 2 --- annotators/emotion_detection/server.py | 10 +++++----- state_formatters/dp_formatters.py | 6 +----- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/annotators/emotion_detection/server.py b/annotators/emotion_detection/server.py index 03abc4c2e6..f405fbacdd 100644 --- a/annotators/emotion_detection/server.py +++ b/annotators/emotion_detection/server.py @@ -125,8 +125,8 @@ def process_audio(file_path: str): ) redundant_features = os.getenv("REDUNDANT_FEATURES") - with open(redundant_features, 'r') as features_file: - redundant_features_list = features_file.read().split(',') + with open(redundant_features, "r") as features_file: + redundant_features_list = features_file.read().split(",") audio_features = smile.process_files([file_path]) audio_features = audio_features.drop(columns=redundant_features_list, inplace=False) @@ -167,18 +167,18 @@ class EmotionsPayload(BaseModel): def subinfer(msg_text: str, video_path: str): emotion = "Emotion detection unsuccessfull. An error occured during inference." - filepath = "undefined" + filepath = "undefined" try: filename = video_path.split("=")[-1] filepath = f"/data/{filename}" urlretrieve(video_path, filepath) if not os.path.exists(filepath): raise ValueError(f"Failed to retrieve videofile from {filepath}") - emotion = predict_emotion(msg_text + ' ', filepath) + emotion = predict_emotion(msg_text + " ", filepath) logger.info(f"Detected emotion: {jsonable_encoder(emotion)}") except Exception as e: raise ValueError(f"The message format is correct, but: {e}") - + return emotion diff --git a/state_formatters/dp_formatters.py b/state_formatters/dp_formatters.py index 7fbb9bc79d..c18b31f2d4 100755 --- a/state_formatters/dp_formatters.py +++ b/state_formatters/dp_formatters.py @@ -92,11 +92,7 @@ def convert_formatter_dialog(dialog: Dict) -> List[Dict]: def personality_catcher_formatter_dialog(dialog: Dict) -> List[Dict]: # Used by: personality_catcher_formatter - return [ - { - "personality": [dialog["human_utterances"][-1].get("text")] - } - ] + return [{"personality": [dialog["human_utterances"][-1].get("text")]}] def emotion_detection_formatter(dialog: Dict) -> List[Dict]: From 890d7f879c5e99b2be802a529f648867fc77e680 Mon Sep 17 00:00:00 2001 From: Alexandra Dolidze Date: Wed, 27 Dec 2023 11:05:18 +0300 Subject: [PATCH 43/50] personality-detection models added --- .../personality_detection/models/cAGR.p | Bin 0 -> 1239207 bytes .../personality_detection/models/cCON.p | Bin 0 -> 1239207 bytes .../personality_detection/models/cEXT.p | Bin 0 -> 1239207 bytes .../personality_detection/models/cNEU.p | Bin 0 -> 6645848 bytes .../personality_detection/models/cOPN.p | Bin 0 -> 1239207 bytes .../models/vectorizer_30.p | Bin 0 -> 701810 bytes .../models/vectorizer_31.p | Bin 0 -> 4423795 bytes annotators/personality_detection/server.py | 14 +++++++------- 8 files changed, 7 insertions(+), 7 deletions(-) create mode 100644 annotators/personality_detection/models/cAGR.p create mode 100644 annotators/personality_detection/models/cCON.p create mode 100644 annotators/personality_detection/models/cEXT.p create mode 100644 annotators/personality_detection/models/cNEU.p create mode 100644 annotators/personality_detection/models/cOPN.p create mode 100644 annotators/personality_detection/models/vectorizer_30.p create mode 100644 annotators/personality_detection/models/vectorizer_31.p diff --git a/annotators/personality_detection/models/cAGR.p b/annotators/personality_detection/models/cAGR.p new file mode 100644 index 0000000000000000000000000000000000000000..54b401ad34508486dc75baf2c8fec96c18d60b85 GIT binary patch literal 1239207 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
    1^o?SJ%|50 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�^GR?;K*N_9_jv#XlXgH;4pZ=6U*2c2PKU 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

    e2HmYrz}jeV}GhP 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