{"id":20553470,"url":"https://github.com/nvsriram/keepervision","last_synced_at":"2026-04-16T16:06:38.818Z","repository":{"id":238577604,"uuid":"668409185","full_name":"nvsriram/KeeperVision","owner":"nvsriram","description":"ECE Final Year Design Project: Using computer vision, image processing, and machine learning, KeeperVision physically guides goalkeepers in real-time to the best position to defend against any incoming shots.","archived":false,"fork":false,"pushed_at":"2024-05-07T17:54:40.000Z","size":144932,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-06T06:19:02.744Z","etag":null,"topics":["aws-rds-mysql","aws-s3","computer-vision","flask","machine-learning","yolov8"],"latest_commit_sha":null,"homepage":"https://uwaterloo.ca/capstone-design/project-abstracts/2024-capstone-design-projects/2024-electrical-computer-engineering-capstone-designs#40","language":"Python","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/nvsriram.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}},"created_at":"2023-07-19T18:30:08.000Z","updated_at":"2024-05-07T17:54:43.000Z","dependencies_parsed_at":"2024-11-16T02:52:06.332Z","dependency_job_id":null,"html_url":"https://github.com/nvsriram/KeeperVision","commit_stats":null,"previous_names":["nvsriram/keepervision"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/nvsriram/KeeperVision","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nvsriram%2FKeeperVision","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nvsriram%2FKeeperVision/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nvsriram%2FKeeperVision/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nvsriram%2FKeeperVision/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nvsriram","download_url":"https://codeload.github.com/nvsriram/KeeperVision/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nvsriram%2FKeeperVision/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31893358,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-16T11:36:10.202Z","status":"ssl_error","status_checked_at":"2026-04-16T11:36:09.652Z","response_time":69,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["aws-rds-mysql","aws-s3","computer-vision","flask","machine-learning","yolov8"],"created_at":"2024-11-16T02:42:04.103Z","updated_at":"2026-04-16T16:06:38.786Z","avatar_url":"https://github.com/nvsriram.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"![banner](https://github.com/nvsriram/KeeperVision/assets/50625504/56e69ee3-a7d9-413a-85f4-f73253c34675)\n\n## 💡Motivation\n\nSoccer is the most popular sport with hundreds of millions of players and fans around the world. Many times, a key save can be the difference between winning and losing a game. KeeperVision is a training tool which aims to help goalkeepers in tackling their greatest hurdle - positioning. Using computer vision, image processing, and machine learning, KeeperVision physically guides goalkeepers in real-time to the best position to defend against any incoming shots.\n\n## 🚀 Demo\n\nhttps://github.com/nvsriram/KeeperVision/assets/50625504/f4d87b97-4a0c-4a7a-9e95-1bd64e781f94\n\n## 🌐 API Reference\n\n### `api/register/\u003cusername\u003e`\n\n\u003cdetails\u003e   \n\u003csummary\u003e\u003cb\u003eGET\u003c/b\u003e\u003c/summary\u003e\n   \u003ctable\u003e\n      \u003ctr\u003e\n         \u003cth rowspan=\"3\"\u003eResponse\u003c/th\u003e\n         \u003cth\u003eOK\u003c/th\u003e\n         \u003cth\u003eCode\u003c/th\u003e\n         \u003cth\u003eContent\u003c/th\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n         \u003ctd\u003e✅\u003c/td\u003e\n         \u003ctd\u003e\u003ccode\u003e200\u003c/code\u003e\u003c/td\u003e\n         \u003ctd\u003e\n            \u003cpre lang=\"typescript\"\u003e{\"id\": \u0026lt;player_id\u0026gt;}\u003c/pre\u003e\n         \u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n         \u003ctd\u003e❌\u003c/td\u003e\n         \u003ctd\u003e\u003ccode\u003e404\u003c/code\u003e\u003c/td\u003e\n         \u003ctd\u003e\n            \u003cpre lang=\"typescript\"\u003e{\"message\": \"Player \u0026lt;username\u0026gt; does not exist.\"}\u003c/pre\u003e\n         \u003c/td\u003e\n      \u003c/tr\u003e\n   \u003c/table\u003e \n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003ePOST\u003c/b\u003e\u003c/summary\u003e\n   \u003ctable\u003e\n      \u003ctr\u003e\n         \u003cth\u003eBody\u003c/th\u003e\n         \u003ctd colspan='4'\u003e\n            \u003cpre lang=\"typescript\"\u003e{\"email\": \u0026lt;email\u0026gt;}\u003c/pre\u003e\n         \u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n         \u003cth rowspan='4'\u003eResponse\u003c/th\u003e\n         \u003cth\u003eOK\u003c/th\u003e\n         \u003cth\u003eCode\u003c/th\u003e\n         \u003cth\u003eContent\u003c/th\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n         \u003ctd\u003e✅\u003c/td\u003e\n         \u003ctd\u003e\u003ccode\u003e200\u003c/code\u003e\u003c/td\u003e\n         \u003ctd\u003e\n            \u003cpre lang=\"typescript\"\u003e{\"id\": \u0026lt;player_id\u0026gt;}\u003c/pre\u003e\n         \u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n         \u003ctd\u003e❌\u003c/td\u003e\n         \u003ctd\u003e\u003ccode\u003e400\u003c/code\u003e\u003c/td\u003e\n         \u003ctd\u003e\n            \u003cpre lang=\"typescript\"\u003e{\"message\": \"\u0026lt;some error message like duplicate key Integrity error\u0026gt;\"}\u003c/pre\u003e\n         \u003c/td\u003e\n      \u003c/tr\u003e\n   \u003c/table\u003e\n\u003c/details\u003e\n\n### `api/session/\u003cusername\u003e`\n\n\u003cdetails\u003e   \n\u003csummary\u003e\u003cb\u003eGET\u003c/b\u003e\u003c/summary\u003e\n   \u003ctable\u003e\n      \u003ctr\u003e\n         \u003cth rowspan='3'\u003eResponse\u003c/th\u003e\n         \u003cth\u003eOK\u003c/th\u003e\n         \u003cth\u003eCode\u003c/th\u003e\n         \u003cth\u003eContent\u003c/th\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n         \u003ctd\u003e✅\u003c/td\u003e\n         \u003ctd\u003e\u003ccode\u003e200\u003c/code\u003e\u003c/td\u003e\n         \u003ctd\u003e\n            \u003cpre lang=\"typescript\"\u003e{\"player_id\": \u0026lt;player_id\u0026gt;, \"session_stats\": \u0026lt;list of session_stats in desc order of session_end\u0026gt;}\u003c/pre\u003e\n         \u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n         \u003ctd\u003e❌\u003c/td\u003e\n         \u003ctd\u003e\u003ccode\u003e404\u003c/code\u003e\u003c/td\u003e\n         \u003ctd\u003e\n            \u003cpre lang=\"typescript\"\u003e{\"message\": \"Player \u0026lt;username\u0026gt; does not exist.\"}\u003c/pre\u003e\n         \u003c/td\u003e\n      \u003c/tr\u003e\n   \u003c/table\u003e \n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003ePOST\u003c/b\u003e\u003c/summary\u003e\n   \u003ctable\u003e\n      \u003ctr\u003e\n         \u003cth\u003eBody\u003c/th\u003e\n         \u003ctd colspan='4'\u003e\n            \u003cpre lang=\"typescript\"\u003e{\"session_stats\": \u0026lt;session_stats JSON with all the fields\u0026gt;}\u003c/pre\u003e\n         \u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n         \u003cth rowspan='3'\u003eFiles\u003c/th\u003e\n         \u003cth\u003eFile Name\u003c/th\u003e\n         \u003cth colspan='4'\u003eDescription\u003c/th\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n         \u003ctd\u003e\u003ccode\u003einitial_image\u003c/code\u003e\u003c/td\u003e\n         \u003ctd colspan='4'\u003eImage file containing goalkeeper's initial position before session starts\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n         \u003ctd\u003e\u003ccode\u003efinal_image\u003c/code\u003e\u003c/td\u003e\n         \u003ctd colspan='4'\u003eImage file containing goalkeeper's final position at the end of session\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n         \u003cth rowspan='4'\u003eResponse\u003c/th\u003e\n         \u003cth\u003eOK\u003c/th\u003e\n         \u003cth\u003eCode\u003c/th\u003e\n         \u003cth\u003eContent\u003c/th\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n         \u003ctd\u003e✅\u003c/td\u003e\n         \u003ctd\u003e\u003ccode\u003e200\u003c/code\u003e\u003c/td\u003e\n         \u003ctd\u003e\n            \u003cpre lang=\"typescript\"\u003e{\"id\": \u0026lt;session_id\u0026gt;}\u003c/pre\u003e\n         \u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n         \u003ctd\u003e❌\u003c/td\u003e\n         \u003ctd\u003e\u003ccode\u003e400\u003c/code\u003e\u003c/td\u003e\n         \u003ctd\u003e\n            \u003cpre lang=\"typescript\"\u003e{\"message\": \"\u0026lt;some error message like duplicate key Integrity error\u0026gt;\"}\u003c/pre\u003e\n         \u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n         \u003ctd\u003e❌\u003c/td\u003e\n         \u003ctd\u003e\u003ccode\u003e404\u003c/code\u003e\u003c/td\u003e\n         \u003ctd\u003e\n            \u003cpre lang=\"typescript\"\u003e{\"message\": \"Player \u0026lt;username\u0026gt; does not exist.\"}\u003c/pre\u003e\n         \u003c/td\u003e\n      \u003c/tr\u003e\n   \u003c/table\u003e\n\u003c/details\u003e\n\n### `api/predict`\n\n\u003cdetails\u003e   \n\u003csummary\u003e\u003cb\u003ePOST\u003c/b\u003e\u003c/summary\u003e\n   \u003ctable\u003e\n      \u003ctr\u003e\n         \u003cth rowspan='2'\u003eFiles\u003c/th\u003e\n         \u003cth\u003eFile Name\u003c/th\u003e\n         \u003cth colspan='2'\u003eDescription\u003c/th\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n         \u003ctd\u003e\u003ccode\u003eimage\u003c/code\u003e\u003c/td\u003e\n         \u003ctd colspan='2'\u003eImage file to be processed\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n         \u003cth rowspan='4'\u003eResponse\u003c/th\u003e\n         \u003cth\u003eOK\u003c/th\u003e\n         \u003cth\u003eCode\u003c/th\u003e\n         \u003cth\u003eContent\u003c/th\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n         \u003ctd\u003e✅\u003c/td\u003e\n         \u003ctd\u003e\u003ccode\u003e200\u003c/code\u003e\u003c/td\u003e\n         \u003ctd\u003e\n            \u003cpre lang=\"typescript\"\u003e{\"idx\": \u0026lt;idx corresponding to direction to move\u0026gt;, \"x\": \u0026lt;offset in x direction\u0026gt;, \"y\": \u0026lt;offset in y direction\u0026gt;}\u003c/pre\u003e\n         \u003c/td\u003e\n      \u003c/tr\u003e\n   \u003c/table\u003e\n\u003c/details\u003e\n\n## 📈 Block Diagram\n\n![Block Diagram 2](https://github.com/nvsriram/KeeperVision/assets/50625504/b5c1cec2-a9f0-4b01-8828-41b061232a9e)\n\n\n\n## 💻 Instructions on running locally\n\n1. Ensure python is installed\n2. Run `pip install -r requirements.txt` to install all dependencies\u003cbr /\u003e\n   **NOTE:** Recommended to use venv before installing dependencies. See below for details on how to set it up\n3. Run the Flask app using `python app.py`. This will run the app on debug mode on the server's IP\u003cbr /\u003e\n   **NOTE**: Ensure the Flask app and the client are in the same WLAN to be able to connect to the server's IP as it is otherwise considered a private IP address\n\n**[Optional]** To use venv:\n\n1. Run `python -m venv \u003cpath-to-env\u003e` to create virtual environment\n2. To activate the virtual environment:\n\n   - If on Windows, run: `\u003cpath-to-env\u003e/Scripts/activate`\n   - If on MacOS, run: `source \u003cpath-to-env\u003e/bin/activate`\n\n3. Run Step 2 to install all dependencies\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnvsriram%2Fkeepervision","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnvsriram%2Fkeepervision","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnvsriram%2Fkeepervision/lists"}