Добавлена загрузка своих онтологий, немного красоты в webapp
This commit is contained in:
parent
898a94a541
commit
8bba4e72d6
@ -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
|
||||
|
@ -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,
|
||||
|
@ -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>
|
||||
|
Loading…
Reference in New Issue
Block a user