Aleksandr Mulyavin commited on
Commit
cb1ffb6
·
unverified ·
2 Parent(s): 5a8691c d22a98d

Merge pull request #6 from kavlab/mulyavin_aa_api

Browse files
README.md CHANGED
@@ -9,7 +9,7 @@ app_file: run.py
9
  pinned: false
10
  ---
11
 
12
- # Программная инженерия. Практическое задание №2
13
 
14
  Приложение разработано с использованием фреймворка [Streamlit](https://streamlit.io/).
15
  Состоит из двух страниц и Главной страницы:
@@ -21,19 +21,26 @@ pinned: false
21
  3. Описание изображения - позволяет получить описание изображения на русском языке. Использует 1 модель:
22
  - Классификация и описание изображений
23
 
 
 
 
 
24
  ## Используемые модели
25
  - Определение языка текста - [papluca/xlm-roberta-base-language-detection](https://huggingface.co/papluca/xlm-roberta-base-language-detection)
26
  - Перевод текста с языка Ru на En - [Helsinki-NLP/opus-mt-ru-en](https://huggingface.co/Helsinki-NLP/opus-mt-ru-en)
27
  - Озвучивание текста на английском языке - [microsoft/speecht5_tts](https://huggingface.co/microsoft/speecht5_tts)
28
  - Классификация и описание изображений. Модель описания изображения [Salesforce/blip-image-captioning-large](https://huggingface.co/Salesforce/blip-image-captioning-large)
29
 
30
- ## Как запустить
31
  Запуск осуществляется через модуль streamlit:
32
  ```
33
  streamlit run run.py
34
  ```
35
 
36
- ## Как использовать
 
 
 
37
  После запуска приложение открывается на Главной странице. Выбор режима работы приложения доступен слева в меню
38
 
39
  ### Генератор аудио
@@ -46,3 +53,52 @@ streamlit run run.py
46
  Необходимо выбрать изображение и нажать кнопку "Получить описание изображения". В результате появится текстовое описание изображения на русском языке.
47
 
48
  ![Результат работы моделей "Классификации и описания изображений"](https://raw.githubusercontent.com/kavlab/urfu_iml_2023_1_3_hw2/main/zvereva_ev/image_result.jpg)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  pinned: false
10
  ---
11
 
12
+ # Программная инженерия. Практическое задание №2 и №3
13
 
14
  Приложение разработано с использованием фреймворка [Streamlit](https://streamlit.io/).
15
  Состоит из двух страниц и Главной страницы:
 
21
  3. Описание изображения - позволяет получить описание изображения на русском языке. Использует 1 модель:
22
  - Классификация и описание изображений
23
 
24
+ API разработано с использованием фреймворка [FastAPI]('https://fastapi.tiangolo.com/'). API доступные для использования:
25
+ 1. ```/langdetector/detect``` - Определение языка текста
26
+ 2. ```/translator/translate``` - Перевод текста с языка Ru на En
27
+
28
  ## Используемые модели
29
  - Определение языка текста - [papluca/xlm-roberta-base-language-detection](https://huggingface.co/papluca/xlm-roberta-base-language-detection)
30
  - Перевод текста с языка Ru на En - [Helsinki-NLP/opus-mt-ru-en](https://huggingface.co/Helsinki-NLP/opus-mt-ru-en)
31
  - Озвучивание текста на английском языке - [microsoft/speecht5_tts](https://huggingface.co/microsoft/speecht5_tts)
32
  - Классификация и описание изображений. Модель описания изображения [Salesforce/blip-image-captioning-large](https://huggingface.co/Salesforce/blip-image-captioning-large)
33
 
34
+ ## Как запустить Web-приложение
35
  Запуск осуществляется через модуль streamlit:
36
  ```
37
  streamlit run run.py
38
  ```
39
 
40
+ ## Как запустить API-сервер
41
+ ```uvicorn api:app``` либо ```python api.py```
42
+
43
+ ## Как использовать Web-приложение
44
  После запуска приложение открывается на Главной странице. Выбор режима работы приложения доступен слева в меню
45
 
46
  ### Генератор аудио
 
53
  Необходимо выбрать изображение и нажать кнопку "Получить описание изображения". В результате появится текстовое описание изображения на русском языке.
54
 
55
  ![Результат работы моделей "Классификации и описания изображений"](https://raw.githubusercontent.com/kavlab/urfu_iml_2023_1_3_hw2/main/zvereva_ev/image_result.jpg)
56
+
57
+ ### Как использовать API
58
+ Описание методов API генерируется Swagger и доступно по адресу
59
+ ```
60
+ <hots>/docs
61
+ ```
62
+
63
+ #### Пример вызова сервиса Определение языка текста
64
+ Вызвать url сервиса ```<host>/langdetector/detect``` методом POST
65
+
66
+ ![img.png](https://raw.githubusercontent.com/kavlab/urfu_iml_2023_1_3_hw2/main/mulyavin_aa/PostmanLangDetect.png)
67
+
68
+ Передаваемые параметры:
69
+ ```
70
+ {
71
+ "text": "Приветик от Мити кота"
72
+ }
73
+ ```
74
+
75
+ Результат выполнения:
76
+ ```
77
+ {
78
+ "langs": [
79
+ {
80
+ "label": "bg",
81
+ "score": 0.9945043921470642
82
+ }
83
+ ]
84
+ }
85
+ ```
86
+
87
+ #### Пример вызова сервиса Перевод текста с языка Ru на En
88
+ Вызвать url сервиса ```<host>/translator/translate``` методом POST
89
+
90
+ ![img.png](https://raw.githubusercontent.com/kavlab/urfu_iml_2023_1_3_hw2/main/mulyavin_aa/PostmanTranslate.png)
91
+
92
+ Передаваемые параметры:
93
+ ```
94
+ {
95
+ "text": "Приветик от Мити кота"
96
+ }
97
+ ```
98
+
99
+ Результат выполнения:
100
+ ```
101
+ {
102
+ "text": "Hello from Michi Cat."
103
+ }
104
+ ```
api.py ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import uvicorn
2
+ from fastapi import FastAPI
3
+
4
+ import mulyavin_aa.langdetector
5
+ import mulyavin_aa.translator
6
+ import mulyavin_aa.model.langdetector
7
+ import mulyavin_aa.model.translator
8
+
9
+ app = FastAPI()
10
+
11
+
12
+ # Представление проекта урлом по умолчанию
13
+ @app.get("/")
14
+ async def root():
15
+ """Получение базовой информации об API"""
16
+ return {"message": "Проект ДЗ: Модуль 3. Разработка API для приложений искусственного интеллекта (vo_HW)",
17
+ "git": "https://github.com/kavlab/urfu_iml_2023_1_3_hw2",
18
+ "apis": [
19
+ {
20
+ "descr": "API для определения языка текста ",
21
+ "base_url": "/langdetector"
22
+ },
23
+ {
24
+ "descr": "API для перевода текста из Ru в En",
25
+ "base_url": "/translator"}
26
+ ]}
27
+
28
+
29
+ @app.post("/langdetector/detect")
30
+ def lang_detect(request: mulyavin_aa.model.langdetector.Request) \
31
+ -> mulyavin_aa.model.langdetector.Response:
32
+ """Определение языка текста"""
33
+ pipe = mulyavin_aa.langdetector.load_text_detection_model()
34
+ langs = pipe(request.text, )
35
+ return mulyavin_aa.model.langdetector.Response(langs=langs)
36
+
37
+
38
+ @app.post("/translator/translate")
39
+ def lang_detect(request: mulyavin_aa.model.translator.Request) \
40
+ -> mulyavin_aa.model.translator.Response:
41
+ """Перевод текста из Ru в En"""
42
+ pipe = mulyavin_aa.translator.load_text_translator_model()
43
+ text = mulyavin_aa.translator.translate_to_en(request.text, pipe)
44
+
45
+ return mulyavin_aa.model.translator.Response(text=text)
46
+
47
+
48
+ # Запуск как приложения
49
+ if __name__ == '__main__':
50
+ uvicorn.run(app, port=8000, host='127.0.0.1')
mulyavin_aa/PostmanLangDetect.png ADDED
mulyavin_aa/PostmanTranslate.png ADDED
mulyavin_aa/langdetector.py CHANGED
@@ -12,7 +12,9 @@ def load_text_detection_model() -> transformers.pipelines.base.Pipeline:
12
  return pipeline("text-classification", model="papluca/xlm-roberta-base-language-detection")
13
 
14
 
15
- def lang_detect(text: str, langdetector: transformers.pipelines.base.Pipeline) -> str | None:
 
 
16
  """
17
  Определение языка для введенного текста
18
  :param text: Текст
@@ -30,5 +32,7 @@ def lang_detect(text: str, langdetector: transformers.pipelines.base.Pipeline) -
30
  print(text_langs[i])
31
  if text_langs[i]['label'] in ['ru', 'en']:
32
  return text_langs[i]['label']
 
 
33
 
34
  return None
 
12
  return pipeline("text-classification", model="papluca/xlm-roberta-base-language-detection")
13
 
14
 
15
+ def lang_detect(text: str,
16
+ langdetector: transformers.pipelines.base.Pipeline,
17
+ is_any: bool = False) -> str:
18
  """
19
  Определение языка для введенного текста
20
  :param text: Текст
 
32
  print(text_langs[i])
33
  if text_langs[i]['label'] in ['ru', 'en']:
34
  return text_langs[i]['label']
35
+ if is_any:
36
+ return text_langs[i]['label']
37
 
38
  return None
mulyavin_aa/model/__init__.py ADDED
File without changes
mulyavin_aa/model/langdetector.py ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from pydantic import BaseModel
2
+
3
+
4
+ class Request(BaseModel):
5
+ """Структура запроса"""
6
+ text: str
7
+
8
+
9
+ class LangInfo(BaseModel):
10
+ """Информация об определении языка"""
11
+ label: str
12
+ score: float
13
+
14
+
15
+ class Response(BaseModel):
16
+ """Структура ответа"""
17
+ langs: list[LangInfo]
mulyavin_aa/model/translator.py ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from pydantic import BaseModel
2
+
3
+
4
+ class Request(BaseModel):
5
+ """Структура запроса"""
6
+ text: str
7
+
8
+
9
+ class Response(BaseModel):
10
+ """Структура ответа"""
11
+ text: str
requirements.txt CHANGED
@@ -8,3 +8,6 @@ sacremoses==0.1.1
8
  translate==3.6.1
9
  fastapi==0.104.1
10
  uvicorn==0.24.0
 
 
 
 
8
  translate==3.6.1
9
  fastapi==0.104.1
10
  uvicorn==0.24.0
11
+
12
+ pillow~=10.1.0
13
+ pydantic~=2.5.2