Добавление веб-версии сервиса #5

Merged
al-f merged 12 commits from webapp into master 2023-07-11 13:25:17 +04:00
3 changed files with 80 additions and 26 deletions
Showing only changes of commit 8bba4e72d6 - Show all commits

View File

@ -11,13 +11,39 @@ def is_ontology_exists(ontology_uid: str, url: str) -> bool:
@param ontology_uid: УИД онтологии.
@param url: Базовый URL сервиса.
'''
list_ontologies = requests.get(url).json()['response']['items']
list_ontologies = requests.get(url).json()
list_ontologies = list_ontologies['response']['items']
for onto in list_ontologies:
if onto['uid'] == ontology_uid:
return True
return False
def upload_ontology(name: str, file_buf) -> str:
"""
Загружает файл.
:param name: Имя файла.
:param file_buf: Содержимое файла.
:return: УИД загруженной онтологии.
"""
files = {'file': file_buf}
response = requests.post(f'{url}?name={name}', files=files)
response = response.json()
return response['response']['uid']
def delete_ontology(ontology_uid: str) -> bool:
"""
Загружает файл.
:param name: Имя файла.
:param file_buf: Содержимое файла.
:return: УИД загруженной онтологии.
"""
response = requests.delete(url + ontology_uid)
response = response.json()
return False if response['error'] else True
def rename_entity(list_names: dict) -> dict:
'''
Нормализация названий объектов.
@ -52,16 +78,24 @@ def get_request_data(entities: dict, objects: np.ndarray, confs: np.ndarray, box
for entity_idx, entity in enumerate(entities):
if (entity_idx in objects):
object_properties.append({'domain': entity, 'property': 'locatedIn', 'range': classroom})
object_properties.append(
{'domain': entity, 'property': 'locatedIn', 'range': classroom})
else:
object_properties.append({'domain': entity, 'property': 'notLocatedIn', 'range': classroom})
object_properties.append(
{'domain': entity, 'property': 'notLocatedIn', 'range': classroom})
for object_idx, object in enumerate(objects):
conf = confs[object_idx]
box = boxes[object_idx]
entity = entities[object.item()]
data_properties.append({'domain': entity, 'property': 'hasArea', 'value': get_entity_square(float(box[2]), float(box[3]))})
data_properties.append({'domain': entity, 'property': 'hasConfidence', 'value': float(conf)})
data_properties.append(
{'domain': entity,
'property': 'hasArea',
'value': get_entity_square(float(box[2]), float(box[3]))})
data_properties.append(
{'domain': entity,
'property': 'hasConfidence',
'value': float(conf)})
return object_properties, data_properties
@ -86,8 +120,9 @@ def analyze(ontology_uid: str, object_properties: list, data_properties: list, q
}
}
params = '&'.join([f'names={query}' for query in queries])
# Выполнение запроса.
response = requests.post(url + f'{ontology_uid}/query/multi?{params}', json=data).json()
response = requests.post(
url + f'{ontology_uid}/query/multi?{params}', json=data).json()
return response

View File

@ -4,13 +4,16 @@ from flask import Flask, redirect, request
import numpy
from imageWorking import get_image_buf_as_array
from main import analyze_base
from ontologyWorking import delete_ontology, upload_ontology
app = Flask(__name__, static_folder="../static", static_url_path="/")
app = Flask(__name__, static_folder = "../static", static_url_path = "/")
@app.route("/")
def main():
return redirect('index.html')
@app.route("/analyze", methods=["POST"])
def analyze():
# Первоначальные проверки.
@ -19,27 +22,34 @@ def analyze():
'success': False,
'error': 'Укажите изображение',
}
ontology_uid = '5cc5570b-6ed9-3b33-9db4-bdb8ecb9f890'
remove_ontology = False
if 'ontology' in request.files and request.files['ontology'].filename != '':
return {
'success': False,
'error': 'Загрузка онтологии ещё не реализована',
}
ontology_uid = upload_ontology(
request.files['ontology'].filename, request.files['ontology'])
remove_ontology = True
# Подготовка исходного изображения.
image_source = request.files['image'].read();
image_source = request.files['image'].read()
image_source = numpy.fromstring(image_source, numpy.uint8)
image_source = get_image_buf_as_array(image_source)
# Подготовка прочих данных и выполнение запроса.
queries = request.form['queries'].split(',') if request.form['queries'] is not None else [ ]
results, response = analyze_base('5cc5570b-6ed9-3b33-9db4-bdb8ecb9f890', image_source, queries)
queries = request.form['queries'].split(
',') if request.form['queries'] is not None else []
results, response = analyze_base(ontology_uid, image_source, queries)
# Если требуется, чистим за собой.
if remove_ontology:
delete_ontology(ontology_uid)
# Подготовка изображения с ответом.
image_result = results[0].plot()
image_result = cv.cvtColor(image_result, cv.COLOR_BGR2RGB)
image_result = cv.imencode(".jpg", image_result)[1]
image_result = base64.b64encode(image_result).decode("utf-8")
# Вывод ответа.
return {
'success': True,

View File

@ -26,19 +26,28 @@
<div class="card-body">
<div class="row">
<div class="col-lg">
<p class="alert alert-info">Загрузите изображение в поле ниже, чтобы проверить, на фотография пустая или заполненная аудитория.</p>
<p class="alert alert-info">Загрузите изображение и, если требуется, собственную онтологию для анализа.</p>
<form id="uploadForm" action="analyze">
<div>
<label for="image" class="form-label">Нажмите, чтобы загрузить изображение</label>
<div class="my-3">
<label for="image" class="form-label">Изображение для анализа</label>
<input type="file" class="form-control" name="image" id="image" />
</div>
<div>
<div class="my-3">
<label for="ontology" class="form-label">Онтология предметной области</label>
<input type="file" class="form-control" name="ontology" id="ontology" />
<input type="file" class="form-control" name="ontology" id="ontology" aria-describedby="ontologyHelp" />
<div id="ontologyHelp" class="form-text">Для анализа заполненности аудиторий оставьте это поле пустым.</div>
</div>
<div>
<div class="my-3">
<label for="queries" class="form-label">Набор запросов для запуска</label>
<input type="text" class="form-control" name="queries" id="queries" value="QueryGetNotEmpty,QueryGetCheck,QueryGetEmpty" />
<input
type="text"
class="form-control"
name="queries"
id="queries"
aria-describedby="queriesHelp"
value="QueryGetNotEmpty,QueryGetCheck,QueryGetEmpty"
/>
<div id="queriesHelp" class="form-text">Для анализа заполненности аудиторий не изменяйте это поле.</div>
</div>
<div class="my-3">
<button type="submit" class="btn btn-primary">Отправить</button>