{"id":19053869,"url":"https://github.com/mkurc1/climbingcrux_model","last_synced_at":"2026-06-05T16:31:45.333Z","repository":{"id":225388506,"uuid":"762637730","full_name":"mkurc1/climbingcrux_model","owner":"mkurc1","description":"The climbing crux model is a machine-learning project that aims to recognize climbing holds and the distance between them from a photo and suggest routes that fit the user's climbing level.","archived":false,"fork":false,"pushed_at":"2024-06-08T19:31:52.000Z","size":851415,"stargazers_count":29,"open_issues_count":1,"forks_count":2,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-11-12T16:24:55.066Z","etag":null,"topics":["climbing","fastapi","jupiter-notebook","machine-learning","python","yolo"],"latest_commit_sha":null,"homepage":"","language":"Jupyter Notebook","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mkurc1.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-02-24T09:10:35.000Z","updated_at":"2025-10-02T08:41:31.000Z","dependencies_parsed_at":"2024-04-17T21:38:23.199Z","dependency_job_id":null,"html_url":"https://github.com/mkurc1/climbingcrux_model","commit_stats":null,"previous_names":["mkurc1/climbingcrux_model"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/mkurc1/climbingcrux_model","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mkurc1%2Fclimbingcrux_model","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mkurc1%2Fclimbingcrux_model/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mkurc1%2Fclimbingcrux_model/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mkurc1%2Fclimbingcrux_model/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mkurc1","download_url":"https://codeload.github.com/mkurc1/climbingcrux_model/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mkurc1%2Fclimbingcrux_model/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33951156,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-05T02:00:06.157Z","response_time":120,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["climbing","fastapi","jupiter-notebook","machine-learning","python","yolo"],"created_at":"2024-11-08T23:35:03.280Z","updated_at":"2026-06-05T16:31:45.314Z","avatar_url":"https://github.com/mkurc1.png","language":"Jupyter Notebook","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Climbing Crux Model\n\nThe climbing crux model is a machine-learning project that aims to recognize climbing holds and the distance between them from a photo and suggest routes that fit the user's climbing level.\n\nThe model recognizes climbing holds and volumes from a photo using the YOLOv9 object detection algorithm. The model is trained on a custom dataset containing photos of climbing walls and annotations in the YOLO format.\n\nYou can generate climbing routes through the FastAPI.\n\n### Generated climbing route preview\n![Generated climbing route preview](./resources/route_preview.jpg)\n\n### Climbing holds detection preview \n![Climbing holds detection preview](./resources/climbing_holds_detection_preview.jpg)\n\n### Starting position preview\n![Starting position preview](./resources/starting_position_preview.jpg)\n\n## Setup\nYou can run the project locally or using Docker.\n\n### Local setup\nTo run the project, you need to have Python 3.11 and the required packages installed. You can install the required packages using the following command:\n\n#### Install pyenv and Python 3.11\n```bash\n$ curl https://pyenv.run | bash\n$ pyenv install 3.11.8\n```\n\n#### Turn on pyenv\n```bash \n$ pyenv shell 3.11.8\n```\n\n#### Install poetry and the required packages\n```bash\n$ python -m pip install poetry\n$ poetry install\n```\n\n#### Turn on the virtual environment\n```bash\n$ poetry shell\n```\n\n#### Create `env` file by copying the example and update the model path\n\n```bash\n$ cp .env.dist .env\n$ nano .env\n```\n\n#### Turn on the Jupyter Lab\n```bash\n$ jupyter-lab\n```\n\n### Docker setup\n\nTo run the project using Docker, you need to have Docker installed. You can build the Docker image and run the container using the following commands:\n\n#### Create `env` file by copying the example and update the model path\n\n```bash\n$ cp .env.dist .env\n$ nano .env\n```\n\n#### Build the Docker image\n```bash\n$ docker compose up -d --build\n```\n\n#### Swagger API documentation\n```bash\n$ http://localhost:8000/docs\n```\n\n## Data\n\nTo achieve the goal of this project, I will use photos from a private collection of climbing walls. You can download the dataset from the link below. It also contains photos and the annotations in the YOLO format.\n\n* [Download the dataset](https://drive.google.com/file/d/1JBzTWpQVjzBkB_mmd7ztzu2ifw78tLrx/view?usp=sharing)\n\n## Distance detection\n\nThe distance between climbing holds is calculated using the distance between the centers of the bounding boxes of the detected climbing holds. The distance is calculated in pixels and then converted to centimeters using the reference to aruco marker.\n\n* [Used marker](./resources/aruco_marker_5x5_200px.png)\n\n![Distance detection preview](./resources/aruco_marker_5x5_200px_preview.jpg)\n\n## Metrics for object detection\n\nThe model is evaluated using the following metrics:\n\nmAP (mean Average Precision) - the average of the precision-recall curves at different IoU thresholds.\n\n* map50-95 - 0.8216387037838236\n* map50 - 0.9298378191260248\n* map75 - 0.8925210764855455\n\n## Model\n\nYou can download the trained model from the link below.\n\n* [Download the model](https://drive.google.com/file/d/1n2eCwIOLOGnisuqwGP7IY1-T6J1YNScu/view?usp=sharing)\n\n## Useful links\n\n* [Train Yolov8 object detection on a custom dataset](https://www.youtube.com/watch?v=m9fH9OWn8YM)\n* [Object Detection with YOLO v8 on Mac M1](https://www.youtube.com/watch?v=kEcWUZ8unmc)\n* [Online Annotation Platform](https://www.cvat.ai/)\n\n## To do\n\n* [x] Train the YOLOv9 object detection model\n* [x] detect climbing holds and volumes from a photo\n* [x] Calculate the distance between climbing holds\n* [x] Generate climbing routes\n* [x] Generate climbing routes using the Jupyter Notebook\n* [x] Generate climbing routes using the FastAPI\n* [ ] Improve ground detection\n* [ ] Generate climbing routes on different wall angles\n\n## License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmkurc1%2Fclimbingcrux_model","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmkurc1%2Fclimbingcrux_model","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmkurc1%2Fclimbingcrux_model/lists"}