2023-05-20 13:23:06 +04:00
|
|
|
|
import os
|
|
|
|
|
import sys
|
|
|
|
|
|
|
|
|
|
import cv2 as cv
|
2023-07-06 07:32:59 +04:00
|
|
|
|
import numpy as np
|
2023-05-20 13:23:06 +04:00
|
|
|
|
import requests
|
|
|
|
|
|
|
|
|
|
import imageWorking
|
|
|
|
|
import neuralNetwork
|
|
|
|
|
import ontologyWorking
|
|
|
|
|
|
|
|
|
|
url = 'http://kb.athene.tech/api/1.0/ontology/'
|
|
|
|
|
|
|
|
|
|
|
2023-07-06 07:32:59 +04:00
|
|
|
|
def analyze_base(ontology_uid: str, image: np.ndarray, queries: list[str]) -> tuple[2]:
|
2023-06-24 23:26:19 +04:00
|
|
|
|
'''
|
2023-07-06 07:32:59 +04:00
|
|
|
|
Базовая функция анализа файла и вывода результатов обработки.
|
|
|
|
|
@param ontology_uid: УИД онтологии.
|
|
|
|
|
@param image: Изображение.
|
2023-06-24 23:26:19 +04:00
|
|
|
|
'''
|
2023-07-06 07:32:59 +04:00
|
|
|
|
if not ontologyWorking.is_ontology_exists(ontology_uid, url):
|
|
|
|
|
raise Exception(f'Онтология с uid {ontology_uid} не существует')
|
|
|
|
|
if image is None:
|
|
|
|
|
raise Exception(f'Изображение не указано')
|
2023-06-27 00:28:41 +04:00
|
|
|
|
model = neuralNetwork.load_model()
|
2023-05-20 13:23:06 +04:00
|
|
|
|
|
2023-06-24 23:26:19 +04:00
|
|
|
|
# Распознавание изображения.
|
2023-07-06 07:32:59 +04:00
|
|
|
|
results = model.predict(source=image)
|
2023-06-24 23:26:19 +04:00
|
|
|
|
|
|
|
|
|
# Создание аксиом онтологии на основе результатов распознавания.
|
2023-05-20 13:23:06 +04:00
|
|
|
|
object_properties = list()
|
|
|
|
|
data_properties = list()
|
2023-06-27 00:28:41 +04:00
|
|
|
|
for res in results:
|
|
|
|
|
classes = res.boxes.cls.int()
|
|
|
|
|
conf = res.boxes.conf
|
|
|
|
|
boxes = res.boxes.xywh
|
|
|
|
|
request = ontologyWorking.get_request_data(model.names, classes, conf, boxes)
|
2023-05-20 13:23:06 +04:00
|
|
|
|
object_properties += request[0]
|
|
|
|
|
data_properties += request[1]
|
|
|
|
|
|
2023-06-24 23:26:19 +04:00
|
|
|
|
# Формирование данных для запроса к сервису работы с онтологиями.
|
2023-05-20 13:23:06 +04:00
|
|
|
|
data = {
|
|
|
|
|
'data':
|
|
|
|
|
{
|
|
|
|
|
'objectPropertyAssertions': object_properties,
|
|
|
|
|
'dataPropertyAssertions': data_properties
|
|
|
|
|
}
|
|
|
|
|
}
|
2023-07-06 07:32:59 +04:00
|
|
|
|
params = '&'.join([f'names={query}' for query in queries])
|
|
|
|
|
|
|
|
|
|
# Выполнение запроса.
|
|
|
|
|
response = requests.post(url + f'{ontology_uid}/query/multi?{params}', json=data).json()
|
|
|
|
|
|
|
|
|
|
return results, response
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def analyze_file(ontology_uid: str, image_path: str) -> None:
|
|
|
|
|
'''
|
|
|
|
|
Анализирует файл и выводит результат в консоль.
|
|
|
|
|
@param ontology_uid: УИД онтологии.
|
|
|
|
|
@param image_path: Путь до изображения.
|
|
|
|
|
'''
|
|
|
|
|
if not os.path.isfile(image_path):
|
|
|
|
|
raise Exception(f'Изображение {image_path} не существует')
|
|
|
|
|
image = imageWorking.get_image_file_as_array(image_path)
|
|
|
|
|
queries = [ 'QueryGetNotEmpty', 'QueryGetCheck', 'QueryGetEmpty' ]
|
|
|
|
|
|
|
|
|
|
# Распознавание изображения.
|
|
|
|
|
results, response = analyze_base(ontology_uid, image, queries)
|
|
|
|
|
|
2023-05-20 13:23:06 +04:00
|
|
|
|
result = {
|
|
|
|
|
'QueryGetNotEmpty': '',
|
|
|
|
|
'QueryGetCheck': '',
|
|
|
|
|
'QueryGetEmpty': ''
|
|
|
|
|
}
|
2023-05-28 01:07:34 +04:00
|
|
|
|
if response['error']:
|
|
|
|
|
raise Exception(response['error'])
|
|
|
|
|
for query in response['response']:
|
|
|
|
|
result[query] = [resultSQWRL['name']['value'] for resultSQWRL in response['response'][query]['rows']]
|
|
|
|
|
print(f'Запрос выполнен')
|
2023-05-20 13:23:06 +04:00
|
|
|
|
|
2023-06-24 23:26:19 +04:00
|
|
|
|
# Вывод результата.
|
2023-05-20 13:23:06 +04:00
|
|
|
|
print()
|
2023-05-28 01:07:34 +04:00
|
|
|
|
print('Результат:')
|
2023-05-20 13:23:06 +04:00
|
|
|
|
if result['QueryGetNotEmpty']:
|
|
|
|
|
print('Аудитория занята')
|
|
|
|
|
elif result['QueryGetCheck']:
|
|
|
|
|
print('Аудиторию необходимо проверить')
|
|
|
|
|
elif result['QueryGetEmpty']:
|
|
|
|
|
print('Аудитория пустая')
|
|
|
|
|
else:
|
|
|
|
|
print('Неизвестное состояние')
|
|
|
|
|
|
2023-06-24 23:26:19 +04:00
|
|
|
|
# Вывод изображения.
|
2023-06-27 00:28:41 +04:00
|
|
|
|
cv.imshow('result', results[0].plot())
|
2023-05-20 13:23:06 +04:00
|
|
|
|
cv.waitKey(0)
|
|
|
|
|
cv.destroyAllWindows()
|
|
|
|
|
|
2023-07-06 07:32:59 +04:00
|
|
|
|
|
2023-06-24 23:26:19 +04:00
|
|
|
|
# Точка входа в приложение.
|
2023-05-20 13:23:06 +04:00
|
|
|
|
if __name__ == '__main__':
|
|
|
|
|
if len(sys.argv) != 3:
|
|
|
|
|
print(f'Запуск: {sys.argv[0]} <Ontology UID> <Image path>')
|
|
|
|
|
exit(1)
|
2023-06-24 23:26:19 +04:00
|
|
|
|
analyze_file(sys.argv[1], sys.argv[2])
|