VideoAnalysis/main.py

106 lines
3.7 KiB
Python
Raw Normal View History

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-07-06 07:32:59 +04:00
Базовая функция анализа файла и вывода результатов обработки.
@param ontology_uid: УИД онтологии.
@param image: Изображение.
'''
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-07-06 07:32:59 +04:00
results = model.predict(source=image)
# Создание аксиом онтологии на основе результатов распознавания.
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-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-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-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-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)
analyze_file(sys.argv[1], sys.argv[2])