From b5b627f7e9fbbafaf33fb38748b1045e8c545b96 Mon Sep 17 00:00:00 2001 From: Vladislav Moiseev Date: Sat, 24 Jun 2023 23:26:19 +0400 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD=D1=82=D0=B0?= =?UTF-8?q?=D1=80=D0=B8=D0=B8,=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=B8=D1=81=D0=BA=D0=B0=20=D0=BE=D0=BD=D1=82=D0=BE=D0=BB?= =?UTF-8?q?=D0=BE=D0=B3=D0=B8=D0=B8=20=D0=B2=20=D1=81=D0=B5=D1=80=D0=B2?= =?UTF-8?q?=D0=B8=D1=81=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- imageWorking.py | 13 ++++++++++--- main.py | 25 ++++++++++++++++++------- neuralNetwork.py | 6 +++++- ontologyWorking.py | 27 +++++++++++++++++++++------ 4 files changed, 54 insertions(+), 17 deletions(-) diff --git a/imageWorking.py b/imageWorking.py index 78eaa0c..eb63ade 100644 --- a/imageWorking.py +++ b/imageWorking.py @@ -3,13 +3,20 @@ import numpy as np from main import img_size as size - -def image_transform(image): +def image_transform(image: np.ndarray) -> np.ndarray: + ''' + Трансформирует изображение нужным образом. + @param image: Исходная матрица с представлением изображения. + ''' image = cv.resize(image, (size[0], size[1])) return image[:, :, ::-1] -def get_image_as_array(image_name): +def get_image_as_array(image_name: str) -> np.ndarray: + ''' + Получает изображение из файла и нормализует его. + @param image_name: Путь до изображения. + ''' image = cv.imread(image_name) image: np.ndarray # приведение типов image = image_transform(image) diff --git a/main.py b/main.py index e0ec629..b5973fa 100644 --- a/main.py +++ b/main.py @@ -12,18 +12,26 @@ import ontologyWorking url = 'http://kb.athene.tech/api/1.0/ontology/' img_path = 'data' -img_size = (1280, 720) +img_size = (1280, 720) # Размер изображения для нормализации. -def analyse_file(uid, image_path): - if ontologyWorking.is_ontology_exists(uid, url): +def analyze_file(uid: str, image_path: str) -> None: + ''' + Анализирует файл и выводит результат в консоль. + @param uid: УИД онтологии. + @param url: Базовый URL сервиса. + ''' + if not ontologyWorking.is_ontology_exists(uid, url): raise Exception(f'Онтология с uid {uid} не существует') if not os.path.isfile(image_path): raise Exception(f'Изображение {image_path} не существует') model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True) model.names = neuralNetwork.rename_entity(model.names) + # Распознавание изображения. results = model(imageWorking.get_image_as_array(image_path)) + + # Создание аксиом онтологии на основе результатов распознавания. object_properties = list() data_properties = list() for i, res in enumerate(results.pred): @@ -32,6 +40,7 @@ def analyse_file(uid, image_path): object_properties += request[0] data_properties += request[1] + # Формирование данных для запроса к сервису работы с онтологиями. data = { 'data': { @@ -39,13 +48,14 @@ def analyse_file(uid, image_path): 'dataPropertyAssertions': data_properties } } - result = { 'QueryGetNotEmpty': '', 'QueryGetCheck': '', 'QueryGetEmpty': '' } params = '&'.join([f'names={query}' for query in result.keys()]) + + # Выполнение запроса. response = requests.post(url + f'{uid}/query/multi?{params}', json=data).json() if response['error']: raise Exception(response['error']) @@ -53,6 +63,7 @@ def analyse_file(uid, image_path): result[query] = [resultSQWRL['name']['value'] for resultSQWRL in response['response'][query]['rows']] print(f'Запрос выполнен') + # Вывод результата. print() print('Результат:') if result['QueryGetNotEmpty']: @@ -64,14 +75,14 @@ def analyse_file(uid, image_path): else: print('Неизвестное состояние') - # Вывод изображения + # Вывод изображения. cv.imshow('result', results.render()[0][:, :, ::-1]) cv.waitKey(0) cv.destroyAllWindows() - +# Точка входа в приложение. if __name__ == '__main__': if len(sys.argv) != 3: print(f'Запуск: {sys.argv[0]} ') exit(1) - analyse_file(sys.argv[1], sys.argv[2]) + analyze_file(sys.argv[1], sys.argv[2]) diff --git a/neuralNetwork.py b/neuralNetwork.py index a80899e..35c4f39 100644 --- a/neuralNetwork.py +++ b/neuralNetwork.py @@ -1,4 +1,8 @@ -def rename_entity(list_names: dict): +def rename_entity(list_names: dict) -> dict: + ''' + Нормализация названий объектов. + @param list_names: Список названий объектов. + ''' temp_list = list() for entity in list_names.values(): entity: str diff --git a/ontologyWorking.py b/ontologyWorking.py index 01476c0..8f97ed2 100644 --- a/ontologyWorking.py +++ b/ontologyWorking.py @@ -1,21 +1,36 @@ +import numpy as np import requests -def is_ontology_exists(uid, url): - list_ontologies = requests.get(url).json()['response'] +def is_ontology_exists(uid: str, url: str) -> bool: + ''' + Проверяет, существует ли онтология в сервисе. + @param uid: УИД онтологии. + @param url: Базовый URL сервиса. + ''' + list_ontologies = requests.get(url).json()['response']['items'] for onto in list_ontologies: if onto['uid'] == uid: - return False - return True + return True + return False -def get_entity_square(results_ndarray_i): +def get_entity_square(results_ndarray_i: np.ndarray) -> float: + ''' + Получение площади занимаемой области. + @param results_ndarray_i: Описание местоположения объекта. + ''' square = float((results_ndarray_i[2] - results_ndarray_i[0]) * (results_ndarray_i[3] - results_ndarray_i[1])) return abs(square) -def get_request_data(entities, results_ndarray): +def get_request_data(entities: dict, results_ndarray: np.ndarray) -> tuple[list, list]: + ''' + Формирование данных для сервиса онтологий. + @param entities: Список имён объектов. + @param results_ndarray: Результат распознавания объектов. + ''' classroom = 'classroom' object_properties = list() data_properties = list()