commit fa9178391f45593cdc465165424770c18d2a2d02 Author: Aleksey Filippov Date: Sat May 20 13:23:06 2023 +0400 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9a80b0e --- /dev/null +++ b/.gitignore @@ -0,0 +1,255 @@ + +# Created by https://www.toptal.com/developers/gitignore/api/python,pycharm+all +# Edit at https://www.toptal.com/developers/gitignore?templates=python,pycharm+all + +### PyCharm+all ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# SonarLint plugin +.idea/sonarlint/ + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +### PyCharm+all Patch ### +# Ignores the whole .idea folder and all .iml files +# See https://github.com/joeblau/gitignore.io/issues/186 and https://github.com/joeblau/gitignore.io/issues/360 + +.idea/* + +# Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023 + +*.iml +modules.xml +.idea/misc.xml +*.ipr + +# Sonarlint plugin +.idea/sonarlint + +### Python ### +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintainted in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + +# End of https://www.toptal.com/developers/gitignore/api/python,pycharm+all +yolov5s.pt \ No newline at end of file diff --git a/.run/main (check).run.xml b/.run/main (check).run.xml new file mode 100644 index 0000000..e3d8565 --- /dev/null +++ b/.run/main (check).run.xml @@ -0,0 +1,24 @@ + + + + + \ No newline at end of file diff --git a/.run/main (empty).run.xml b/.run/main (empty).run.xml new file mode 100644 index 0000000..9ce38d4 --- /dev/null +++ b/.run/main (empty).run.xml @@ -0,0 +1,24 @@ + + + + + \ No newline at end of file diff --git a/.run/main (not empty).run.xml b/.run/main (not empty).run.xml new file mode 100644 index 0000000..6111a47 --- /dev/null +++ b/.run/main (not empty).run.xml @@ -0,0 +1,24 @@ + + + + + \ No newline at end of file diff --git a/DetectionTestOntology.owx b/DetectionTestOntology.owx new file mode 100644 index 0000000..8160756 --- /dev/null +++ b/DetectionTestOntology.owx @@ -0,0 +1,1142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Тестовая аудитория + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + Список адиторий для проверки + + + + QueryGetCheck + + + + + + + + + + + + + + + + + + + + + + + true + + + + Определение пустых аудиторий + + + + Empty All With Low Confidence + + + + + + + + + + + + + + + + + + + 0.5 + + + + + + + + + + + + + + 0.5 + + + + + + + + + + + + + true + + + + Определение пустых аудиторий + + + + Empty Not Tv and Low Person + + + + + + + + + + + + + + + + + + + + + + + + 0.5 + + + + + + + + + + + + + true + + + + Определение аудиторий с людьми + + + + NotEmpty + + + + + + + + + + + + + + + + + + + 0.5 + + + + + + + + + + + + + true + + + + Определение аудиторий без людей но с проектором + + + + Check + + + + + + + + + + + + + + + + + + + 0.5 + + + + + + + + + 20000 + + + + + + + + + + + + + + + + + + true + + + + Определение пустых аудиторий + + + + Empty Not Person and Low Tv + + + + + + + + + + + + + + + + + + + 0.5 + + + + + + + + + + + + + + + + + + true + + + + Определение пустых аудиторий + + + + Emtpy All Not + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + Список всех аудиторий + + + + QueryGetAll + + + + + + + + + + + + + + + + + + + + + + + true + + + + Список пустых аудиторий + + + + QueryGetEmpty + + + + + + + + + + + + + + + + + + + + + + + true + + + + Список не пустых аудиторий + + + + QueryGetNotEmpty + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OntologyObjectDetection123.owl b/OntologyObjectDetection123.owl new file mode 100644 index 0000000..2fd9f53 --- /dev/null +++ b/OntologyObjectDetection123.owl @@ -0,0 +1,1061 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + аудитория 411 + + + + + аудитория 418а + + + + + аудитория 420 + + + + + аудитория 424/1 + + + + + аудитория 424/2 + + + + + аудитория 429 + + + + + аудитория 431 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + Список адиторий для проверки + + + + S8 + + + + + + + + + + + + + + + + + + + + + + + true + + + + Определение аудиторий без людей но с проектором + + + + S2 + + + + + + + + + + + + + + + + + + + + + + + + 20000 + + + + + + + + + + + + + true + + + + Определение аудиторий с людьми + + + + S1 + + + + + + + + + + + + + + + + + + + + + + + true + + + + Определение пустых аудиторий + + + + S3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + Список всех аудиторий + + + + S9 + + + + + + + + + + + + + + + + + + + + + + + true + + + + Список пустых аудиторий + + + + S7 + + + + + + + + + + + + + + + + + + + + + + + true + + + + Список не пустых аудиторий + + + + S6 + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/README.md b/README.md new file mode 100644 index 0000000..a5fa4ce --- /dev/null +++ b/README.md @@ -0,0 +1,15 @@ +Окружение: Python 3.10 + +Сервис: http://kb.athene.tech/swagger-ui/index.html + +Запуск: + +```python +main.py < Ontology +UID > < Image +Path > +main.py +43 +f3f5d1 - a339 - 3256 - a5d9 - fd2f14ec1d60 +"test-data/lectionAudi/2021-03-12 13-48-31.JPG" +``` diff --git a/imageWorking.py b/imageWorking.py new file mode 100644 index 0000000..78eaa0c --- /dev/null +++ b/imageWorking.py @@ -0,0 +1,16 @@ +import cv2 as cv +import numpy as np + +from main import img_size as size + + +def image_transform(image): + image = cv.resize(image, (size[0], size[1])) + return image[:, :, ::-1] + + +def get_image_as_array(image_name): + image = cv.imread(image_name) + image: np.ndarray # приведение типов + image = image_transform(image) + return image diff --git a/main.py b/main.py new file mode 100644 index 0000000..d4734ce --- /dev/null +++ b/main.py @@ -0,0 +1,77 @@ +import os +import sys + +import cv2 as cv +import numpy as np +import requests +import torch + +import imageWorking +import neuralNetwork +import ontologyWorking + +url = 'http://kb.athene.tech/api/1.0/ontology/' +img_path = 'data' +img_size = (1280, 720) + + +def analyse_file(uid, image_path): + if 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) + list_sqwrl = ontologyWorking.get_list_sqwrl(uid, url) + + results = model(imageWorking.get_image_as_array(image_path)) + object_properties = list() + data_properties = list() + for i, res in enumerate(results.pred): + results_ndarray = np.array(res) + request = ontologyWorking.get_request_data(model.names, results_ndarray) + object_properties += request[0] + data_properties += request[1] + + data = { + 'data': + { + 'objectPropertyAssertions': object_properties, + 'dataPropertyAssertions': data_properties + } + } + + result = { + 'QueryGetNotEmpty': '', + 'QueryGetCheck': '', + 'QueryGetEmpty': '' + } + for sqwrl in list_sqwrl['response']: + response = requests.post(url + f'{uid}/query/{sqwrl["name"]}', json=data).json() + if response['error']: + raise Exception(response['error']) + result[sqwrl['name']] = [resultSQWRL['name']['value'] for resultSQWRL in response['response']['rows']] + print(f'Запрос {sqwrl["name"]} выполнен') + + print() + print('Результаты') + if result['QueryGetNotEmpty']: + print('Аудитория занята') + elif result['QueryGetCheck']: + print('Аудиторию необходимо проверить') + elif result['QueryGetEmpty']: + print('Аудитория пустая') + 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]) diff --git a/neuralNetwork.py b/neuralNetwork.py new file mode 100644 index 0000000..a80899e --- /dev/null +++ b/neuralNetwork.py @@ -0,0 +1,6 @@ +def rename_entity(list_names: dict): + temp_list = list() + for entity in list_names.values(): + entity: str + temp_list.append(entity.title().replace(' ', '')) + return temp_list diff --git a/ontologyWorking.py b/ontologyWorking.py new file mode 100644 index 0000000..fed3584 --- /dev/null +++ b/ontologyWorking.py @@ -0,0 +1,44 @@ +import requests + + +def is_ontology_exists(uid, url): + list_ontologies = requests.get(url).json()['response'] + for onto in list_ontologies: + if onto['uid'] == uid: + return False + return True + + +def get_list_sqwrl(uid, url): + return requests.get(url + f'{uid}/query/', verify=False).json() + + +def get_entity_square(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): + classroom = 'classroom' + object_properties = list() + data_properties = list() + for i, entity in enumerate(entities): # запись в лист имен объектов и присутствие + if (results_ndarray[:, -1] == i).sum() > 0: # если объект найден + object_properties.append({'domain': entity, + 'property': 'locatedIn', + 'range': classroom}) + else: + object_properties.append({'domain': entity, + 'property': 'notLocatedIn', + 'range': classroom}) + + for i in range(results_ndarray.shape[0]): + data_properties.append({'domain': entities[int(results_ndarray[i, 5])], + 'property': 'hasArea', + 'value': get_entity_square(results_ndarray[i])}) + data_properties.append({'domain': entities[int(results_ndarray[i, 5])], + 'property': 'hasConfidence', + 'value': float(results_ndarray[i, 4])}) + + return object_properties, data_properties diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..545ff0b --- /dev/null +++ b/requirements.txt @@ -0,0 +1,52 @@ +absl-py==1.4.0 +astunparse==1.6.3 +cachetools==5.3.0 +certifi==2023.5.7 +charset-normalizer==3.1.0 +flatbuffers==23.5.9 +gast==0.4.0 +google-auth==2.18.1 +google-auth-oauthlib==1.0.0 +google-pasta==0.2.0 +grpcio==1.54.2 +h5py==3.8.0 +idna==3.4 +jax==0.4.10 +keras==2.12.0 +libclang==16.0.0 +Markdown==3.4.3 +MarkupSafe==2.1.2 +matplotlib==3.7.1 +ml-dtypes==0.1.0 +numpy==1.23.5 +oauthlib==3.2.2 +opencv-python==4.7.0.72 +opt-einsum==3.3.0 +packaging==23.1 +pandas==2.0.1 +Pillow==9.5.0 +protobuf==4.23.1 +psutil==5.9.5 +PyYAML==6.0 +pyasn1==0.5.0 +pyasn1-modules==0.3.0 +requests==2.30.0 +requests-oauthlib==1.3.1 +rsa==4.9 +scipy==1.10.1 +six==1.16.0 +tensorboard==2.12.3 +tensorboard-data-server==0.7.0 +tensorflow==2.12.0 +tensorflow-estimator==2.12.0 +tensorflow-intel==2.12.0 +tensorflow-io-gcs-filesystem==0.31.0 +termcolor==2.3.0 +torch==2.0.1 +torchvision==0.15.2 +tqdm==4.65.0 +typing_extensions==4.5.0 +ultralytics==8.0.105 +urllib3==1.26.15 +Werkzeug==2.3.4 +wrapt==1.14.1 diff --git a/test-data/images/01.jpg b/test-data/images/01.jpg new file mode 100644 index 0000000..80f8fde Binary files /dev/null and b/test-data/images/01.jpg differ diff --git a/test-data/images/02.jpg b/test-data/images/02.jpg new file mode 100644 index 0000000..1825bdd Binary files /dev/null and b/test-data/images/02.jpg differ diff --git a/test-data/images/03.jpg b/test-data/images/03.jpg new file mode 100644 index 0000000..cfc6987 Binary files /dev/null and b/test-data/images/03.jpg differ diff --git a/test-data/images/04.jpg b/test-data/images/04.jpg new file mode 100644 index 0000000..5d43c14 Binary files /dev/null and b/test-data/images/04.jpg differ diff --git a/test-data/images/05.jpg b/test-data/images/05.jpg new file mode 100644 index 0000000..25b0ae3 Binary files /dev/null and b/test-data/images/05.jpg differ diff --git a/test-data/images/06.jpg b/test-data/images/06.jpg new file mode 100644 index 0000000..c561443 Binary files /dev/null and b/test-data/images/06.jpg differ diff --git a/test-data/lectionAudi/2021-03-12 13-48-31.JPG b/test-data/lectionAudi/2021-03-12 13-48-31.JPG new file mode 100644 index 0000000..915bbf4 Binary files /dev/null and b/test-data/lectionAudi/2021-03-12 13-48-31.JPG differ diff --git a/test-data/lectionAudi/2021-03-12 13-48-42.JPG b/test-data/lectionAudi/2021-03-12 13-48-42.JPG new file mode 100644 index 0000000..fb6c602 Binary files /dev/null and b/test-data/lectionAudi/2021-03-12 13-48-42.JPG differ diff --git a/test-data/lectionAudi/2021-03-12 13-48-50.JPG b/test-data/lectionAudi/2021-03-12 13-48-50.JPG new file mode 100644 index 0000000..cf00d39 Binary files /dev/null and b/test-data/lectionAudi/2021-03-12 13-48-50.JPG differ diff --git a/test-data/lectionAudi/2021-03-12 13-49-25.JPG b/test-data/lectionAudi/2021-03-12 13-49-25.JPG new file mode 100644 index 0000000..f692442 Binary files /dev/null and b/test-data/lectionAudi/2021-03-12 13-49-25.JPG differ diff --git a/test-data/lectionAudi/2021-03-12 13-49-32.JPG b/test-data/lectionAudi/2021-03-12 13-49-32.JPG new file mode 100644 index 0000000..be46df0 Binary files /dev/null and b/test-data/lectionAudi/2021-03-12 13-49-32.JPG differ diff --git a/test-data/lectionAudi/2021-03-12 13-49-37.JPG b/test-data/lectionAudi/2021-03-12 13-49-37.JPG new file mode 100644 index 0000000..f3c3523 Binary files /dev/null and b/test-data/lectionAudi/2021-03-12 13-49-37.JPG differ diff --git a/test-data/lectionAudi/2021-03-12 13-49-38.JPG b/test-data/lectionAudi/2021-03-12 13-49-38.JPG new file mode 100644 index 0000000..59fd36b Binary files /dev/null and b/test-data/lectionAudi/2021-03-12 13-49-38.JPG differ diff --git a/test-data/lectionAudi/2021-03-12 13-50-18.JPG b/test-data/lectionAudi/2021-03-12 13-50-18.JPG new file mode 100644 index 0000000..a76dda7 Binary files /dev/null and b/test-data/lectionAudi/2021-03-12 13-50-18.JPG differ diff --git a/test-data/lectionAudi/2021-03-12 13-51-01.JPG b/test-data/lectionAudi/2021-03-12 13-51-01.JPG new file mode 100644 index 0000000..f3f4cfc Binary files /dev/null and b/test-data/lectionAudi/2021-03-12 13-51-01.JPG differ diff --git a/test-data/lectionAudi/2021-03-12 13-51-07.JPG b/test-data/lectionAudi/2021-03-12 13-51-07.JPG new file mode 100644 index 0000000..cfa7cdd Binary files /dev/null and b/test-data/lectionAudi/2021-03-12 13-51-07.JPG differ diff --git a/test-data/lectionAudi/2021-03-12 13-51-11.JPG b/test-data/lectionAudi/2021-03-12 13-51-11.JPG new file mode 100644 index 0000000..d4a05e7 Binary files /dev/null and b/test-data/lectionAudi/2021-03-12 13-51-11.JPG differ diff --git a/test-data/lectionAudi/2021-03-12 13-51-19.JPG b/test-data/lectionAudi/2021-03-12 13-51-19.JPG new file mode 100644 index 0000000..768c3e1 Binary files /dev/null and b/test-data/lectionAudi/2021-03-12 13-51-19.JPG differ