{"id":24719135,"url":"https://github.com/makhmudovmels/posture-keypoints-detection","last_synced_at":"2026-05-04T19:38:40.319Z","repository":{"id":273923668,"uuid":"921157503","full_name":"MakhmudovMels/posture-keypoints-detection","owner":"MakhmudovMels","description":"An application for tracking human posture","archived":false,"fork":false,"pushed_at":"2025-02-09T21:38:00.000Z","size":54033,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-09T22:27:03.323Z","etag":null,"topics":["keypoint-detection","opencv-python","pose-estimation","streamlit","yolo11s"],"latest_commit_sha":null,"homepage":"","language":"Jupyter Notebook","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/MakhmudovMels.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-01-23T12:56:16.000Z","updated_at":"2025-02-09T21:38:03.000Z","dependencies_parsed_at":null,"dependency_job_id":"f080bf41-663c-45f5-a68a-e281bf13d737","html_url":"https://github.com/MakhmudovMels/posture-keypoints-detection","commit_stats":null,"previous_names":["makhmudovmels/posture-keypoints-detection"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MakhmudovMels%2Fposture-keypoints-detection","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MakhmudovMels%2Fposture-keypoints-detection/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MakhmudovMels%2Fposture-keypoints-detection/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MakhmudovMels%2Fposture-keypoints-detection/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MakhmudovMels","download_url":"https://codeload.github.com/MakhmudovMels/posture-keypoints-detection/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244952554,"owners_count":20537467,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["keypoint-detection","opencv-python","pose-estimation","streamlit","yolo11s"],"created_at":"2025-01-27T11:16:50.748Z","updated_at":"2026-05-04T19:38:40.268Z","avatar_url":"https://github.com/MakhmudovMels.png","language":"Jupyter Notebook","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Анализ осанки человека с помощью детектирования ключевых точек позвоночника\r\n---\r\nЭто приложение было разработано в рамках **итогового проекта курса Deep Learning School от МФТИ**. Оно позволяет отслеживать положение спины человека в процессе его работы за компьютером.\r\n\r\n![Example of how the site works](images/interface.gif)\r\n\r\nМы собрали и разметили датасет из 300 изображений людей и дообучили на нём модель YOLO11s-pose. Обученная модель позволяет детектировать ключевые точки позвоночника, которые в дальнейшем могут быть использованы для анализа и корректировки осанки человека.\r\nДля демонстрации работы обученной модели было реализовано веб-приложение на фреймворке Streamlit. Приложение получает видеопоток с вебкамеры пользователя и с помощью модели детектирует ключевые точки осанки.\r\n\r\n## Поиск проблемы и описание предполагаемого решения\r\n---\r\n### Проблема\r\nКривая осанка – одна из наиболее распространенных проблем среди людей, работающих за компьютером. Эта проблема может привести к серьезным последствиям для здоровья, включая боли в спине, шее и плечах, а также головные боли и проблемы со зрением. \r\n\r\nОсновная причина кривой осанки при работе за компьютером заключается в неправильном положении тела. Когда человек сидит за столом, он часто наклоняется вперед, чтобы лучше видеть экран монитора или клавиатуру. Это приводит к напряжению мышц спины и шеи, что вызывает их усталость и деформацию позвоночника.\r\n### Предполагаемое решение\r\nПредполагаемое решение заключается в реализации программного обеспечения, которое бы с помощью установленной сбоку от человека камеры отслеживало положение спины и уведомляло пользователя при отклонении позвоночника от вертикального положения.\r\n\r\nДля отслеживания положения спины необходимо определять ключевые точки позвоночника, по которым уже можно анализировать осанку человека. Чтобы обнаруживать ключевые точки можно обучить свою или найти уже готовую модель детекции.\r\n\r\n![example](images/example.png)\r\n\r\nСамый простой способ опредления правильности осанки по ключевым точкам - это определение расстояния между парами ключевых точек по координате X. Если расстояния между двумя точками превышает некоторое пороговое значение, то будем считать, что осанка кривая, в противном случае делаем вывод, что осанка ровная.\r\n\r\n## Поиск обученной модели и датасета\r\n---\r\n### Модель YOLO11s-pose\r\nYOLO11s-pose — это модель машинного обучения, предназначенная для определения позы человека (Pose Estimation). Она представляет собой одну из версий модели YOLO, ориентированную на задачи обнаружения объектов и оценки их позы в реальном времени. Число 11 в названии означает версию модели YOLO, а буква s - размер архитектуры модели.\r\n\r\nВ стандартной модели позы YOLO11 имеется 17 ключевых точек, каждая из которых представляет собой отдельную часть человеческого тела. Вот отображение каждого индекса на соответствующий сустав тела:\r\n- 0: Нос\r\n- 1: Левый глаз \r\n- 2: Правый глаз \r\n- 3: Левое ухо \r\n- 4: Правое ухо \r\n- 5: Левое плечо \r\n- 6: Правое плечо \r\n- 7: Левый локоть \r\n- 8: Правый локоть \r\n- 9: Левое запястье \r\n- 10: Правое запястье \r\n- 11: Левое бедро \r\n- 12: Правое бедро \r\n- 13: Левое колено \r\n- 14: Правое колено \r\n- 15: Левая лодыжка \r\n- 16: Правая лодыжка\r\n\r\nДемонстрация работы модели YOLO:\r\n\r\n![example](images/ronaldo.png)\r\n\r\nПопробуем применить модель YOLO11s-pose для нашей задачи. После инференса модели отобразим только точки, которые находятся на линии позвоночника.\r\n\r\n![example](images/man.png)\r\n\r\nС детектированием точек модель справляется очень даже хорошо, однако для более точной оценки осанки необходимо также отслеживать промежуточную точку между точками в бедре и плече. На приведённом примере видно, что все три точки находятся примерно на одной линии, однако позвоночник находится в неровном положении из-за искривления в грудном и поясничном отделах. \r\n\r\nТаким образом, модель YOLO11s-pose из коробки не позволяет полноценно отслеживать положение спины человека.\r\n### Сбор и разметка датасета\r\n#### Сбор изображений\r\nУчитывая перечисленный выше недостаток модели YOLO11s-pose, было принято решение осуществить fine tuning этой модели на новом датасете, который будет содержать изображения с разметкой всех необходимых точек.\r\n\r\nБыло собрано 300 изображений людей в положении сидя и стоя (камера расположена сбоку). Большая часть изображений была взята со следующих сайтов: https://ru.freepik.com/, https://www.istockphoto.com/ru.\r\n\r\nНа тренировочную выборку было выделено 250 изображений, а на валидационную оставшиеся 50.\r\n#### Разметка в CVAT\r\nДля разметки изображений использовался такой инструмент как CVAT. CVAT (Computer Vision Annotation Tool) — это веб-платформа для аннотирования изображений и видео с открытым исходным кодом. Используется для разметки данных под задачи компьютерного зрения.\r\n\r\nВот как выглядит проект в инструменте CVAT:\r\n\r\n![example](images/cvat-project.png)\r\n\r\nПроцесс разметки:\r\n\r\n![example](images/markup-process.png)\r\n\r\nСкачать датасет и прочитать его полное описание можно по ссылке https://www.kaggle.com/datasets/melsmm/posture-keypoints-detection/data.\r\n\r\n## Обучение модели\r\n---\r\nПосле сбора и разметки датасета мы дообучили на нём модель YOLO11s-pose. При обучении мы задали количетсво эпох равное 200, а размер батча равным 32. Обучение заняло около 23-х минут на GPU P100.\r\n\r\nПо окончании обучения удалось достигнуть следующих показателей по метрикам:\r\n| Class | Images | Instances | Box | P | R | mAP50 | mAP50-95 | Pose | P | R | mAP50 | mAP50-95 |\r\n| ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |\r\n| all | 50 | 50 |  | 0.868 | 0.8 | 0.841 | 0.548 |  | 0.94 | 0.947 | 0.982 | 0.895 |\r\n\r\nКод обучения содержится в записной книжке notebooks/train.ipynb.\r\n\r\n## Тестирование модели\r\n---\r\nПриведём сравнение дообученной модели с базовой моделью YOLO11s-pose. Посмотрим как модели детектируют ключевые точки в реальном времени.\r\n\r\nРезультат работы базовой модели YOLO11s-pose:\r\n\r\n![example](images/yolov8s-pose.gif)\r\n\r\nРезультат работы дообученной модели:\r\n\r\n![example](images/yolov8s-pose-train.gif)\r\n\r\nМожем отметить, что дообученная модель детектирует ключевые точки со схожим качеством, однако она обнаруживет ещё одну дополнительную ключевую точку, как мы и хотели.\r\n\r\nВ записной книжке notebooks/inference.ipynb содержится ещё несколько примеров инференса моделей на изображениях.\r\n\r\n## Разработка демо\r\n---\r\nВ качестве фреймворка для разработки веб-демо был выбран Streamlit, Streamlit — это бесплатный фреймворк для языка программирования Python с открытым исходным кодом, который позволяет создавать интерактивные панели и приложения на базе машинного обучения и делиться ими. Для написания Backend-части приложения использовался FastAPI, FastAPI — веб-фреймворк для создания API, написанный на Python. После чего мы обернули оба сервиса в docker-compose.\r\n\r\nПриложение использует предобученную модель YOLO для определения ключевых точек тела и оценивает правильность осанки. Если осанка правильная, выводится сообщение \"Отличная осанка\" зеленым цветом, иначе — \"Выпрями спину\" красным. Также в отдельном окне выводится изображение с вебкамеры, на котором отмечены соединённые линиями ключевые точки. При этом, если осанка правильная, то точки рисуются зелёным цветом, иначе - красным.\r\n\r\nОценка правильности осанки осуществляется путём вычисления расстояния между парами ключевых точек по координате X. Если расстояния между двумя точками превышает некоторое пороговое значение, то будем считать, что осанка кривая, в противном случае делаем вывод, что осанка ровная.\r\n\r\nПороговое значение вычисляется по следующей формуле:\r\n\r\n$$threshold = K * l,$$\r\nгде $$l$$ - это разница по модулю между координатами $$Y$$ крайних ключевых точек, $$K$$ - некоторый коэффициент правильности осанки.\r\n\r\nИспользование $$l$$ нужно для того, чтобы пороговое значение изменялось с изменением размера изображения. \r\n\r\nА $$K$$ регулирует степень допустимого отклонения спины от вертикального положения и варьируется в диапазоне $$(0, 1]$$. При этом чем меньше $$K$$, тем сильнее программа реагирует на небольшие отклонения в осанке. Экспериментальным путём было получено, что $$K = 1/6$$ является оптимальным значением\r\n## Тестирование демо\r\n---\r\nПротестируем разработанное веб-приложение:\r\n\r\n![example](images/interface.gif)\r\n\r\nПроанлизировав приведённый выше пример, можно сделать вывод, что все ключевые точки детектируются с хорошей точностью и правильность осанки оценивается корректно.\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmakhmudovmels%2Fposture-keypoints-detection","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmakhmudovmels%2Fposture-keypoints-detection","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmakhmudovmels%2Fposture-keypoints-detection/lists"}