{"id":34976290,"url":"https://github.com/mtyrolski/mimuw-hats","last_synced_at":"2025-12-27T00:12:12.560Z","repository":{"id":40893788,"uuid":"244574088","full_name":"mtyrolski/mimuw-hats","owner":"mtyrolski","description":"Hats. Redefined. No more hat spam on your social media.","archived":false,"fork":false,"pushed_at":"2022-12-22T17:39:07.000Z","size":3459,"stargazers_count":2,"open_issues_count":12,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2023-05-19T08:33:37.057Z","etag":null,"topics":["deep-learning","tensorflow","transfer-learning"],"latest_commit_sha":null,"homepage":"https://mimuw-hats.herokuapp.com/","language":"TypeScript","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/mtyrolski.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}},"created_at":"2020-03-03T07:52:22.000Z","updated_at":"2020-10-31T23:41:39.000Z","dependencies_parsed_at":"2023-01-30T15:16:01.025Z","dependency_job_id":null,"html_url":"https://github.com/mtyrolski/mimuw-hats","commit_stats":null,"previous_names":[],"tags_count":null,"template":null,"template_full_name":null,"purl":"pkg:github/mtyrolski/mimuw-hats","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mtyrolski%2Fmimuw-hats","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mtyrolski%2Fmimuw-hats/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mtyrolski%2Fmimuw-hats/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mtyrolski%2Fmimuw-hats/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mtyrolski","download_url":"https://codeload.github.com/mtyrolski/mimuw-hats/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mtyrolski%2Fmimuw-hats/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28065855,"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","status":"online","status_checked_at":"2025-12-26T02:00:06.189Z","response_time":55,"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":["deep-learning","tensorflow","transfer-learning"],"created_at":"2025-12-27T00:12:11.862Z","updated_at":"2025-12-27T00:12:12.553Z","avatar_url":"https://github.com/mtyrolski.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cimg src=\"client/public/android-chrome-384x384.png\" width=\"75\" height=\"75\" /\u003e MIMUW-Hats\n=======\nMIMUW-hats is a project meant to help fight against the plague of hats and other items lost in the MIMUW building. It incorporates novel solutions such as Machine Learning, REST APIs and responsive web design to tackle this issue.\n\u003cbr\u003e\nhttps://mimuw-hats.herokuapp.com/\n## \u003cimg src=\"client/public/images/sumport.png\" width=\"35\" height=\"35\" /\u003e Software Architecture Introduction\n\nThe project provides a web app which allows users to post found hats as well as report their finds. \u003cbr\u003e \u003cbr\u003e The system automatically matches images and/or textual descriptions, notifying the owners of the lost items. There is the option to register their hats to be automatically matched if they are found. There is an element of gamification by means of awarding productive users with experience points as well as a very simple feed for viewing, bumping and reacting to posts about lost and found items. The project can also be modified to suit current market demand, for example handling face masks in addition to hats.\n\n## \u003cimg src=\"client/public/images/sumport_2.png\" width=\"35\" height=\"35\" /\u003e Technical Details\n\nThe project is composed of three major parts: a responsive web client interface written in React, a REST API backend utilizing Express.js and Node.js, and Machine Learning infrastructure built with Keras in Python.\n\n### Frontend\nThe frontend is based on React.js version 16. It is responsive and function both on mobile and desktop.\n\n### Backend\nThe backend is entirely REST-based, including authentication. All HTML rendering is done client-side in React. A SQLite relational database coupled with TypeORM is used for persistence.\n\u003cbr\u003e \u003cbr\u003e\nAuthentication is done with JWT. In order to limit the app’s usage to MIMUW students, a MIMUW email address is connected to each account (Nodemailer).\n\u003cbr\u003e \u003cbr\u003e\nNotification of users is primarily be done by email and push notification done with web-push library.\n\n### Machine Learning\nWe use convolutional neural networks (CNNs) to solve the problem of detecting hats in pictures. To be more specific, our neural network (NN) is able to find bounding box of potential hat. Currently there is used MobileNet (https://arxiv.org/abs/1704.04861). If increased detail is needed, we move to another type of CNN, namely the YOLO v3 (https://arxiv.org/abs/1804.02767) model from the well-known scientific article. \n\u003cbr\u003e \u003cbr\u003e\nThe implementation is carried out in keras 2.3.1 (python3) in a version with tensorflow 2.0 backend. We don't have 100% certainty about NN correctness. If prediction fails, posts can be still verified by moderators.\nFor rapid testing, Proofs-of-Concept (PoC-s) provided by the fast.ai\nlibrary is used.\n\u003cbr\u003e \u003cbr\u003e\nDatasets come from two sources: 1) photos from MIMUW groups on\nFacebook about missing things 2) scraping Google images using simple\nscripts (in JavaScript and Python). Dataset size is about n 10k \u003c=\n100k images.\n\u003cbr\u003e \u003cbr\u003e\nDue to the complexity of the problem, the training takes place on\nGoogle Colab - the free version gives access to NVIDIA Tesla K80, P4,\nT4, P100, and V100 GPUs (Google Colab assigns specific models\nwithout the possibility of choosing them by us).\n\n### Deployment\nThe current deployment setup consists of two Heroku apps - the one visible to the user (frontend) is powered by a nginx\nserver which serves the React app through static files as well as acts as a (reverse) proxy to the actual backend, which is another\nHeroku app, not visible directly to the user. The backend is connected to a MongoDB cluster. Both frontend and backend run\nas Docker containers (on Heroku they are deployed through heroku.yml). Machine learning backend is easily configurable \nand can run on any provided infrastructure.\n\n## \u003cimg src=\"client/public/images/sumport_3.png\" width=\"35\" height=\"35\" /\u003e Additional constraints\n\n### Security – Moderation\nTo limit malicious usage, each account is linked to a MIMUW email\nby sending a confirmation. The system will automatically detect posts not\nrelated to hats. Users designated as moderators have the ability to\ndelete inappropriate posts not detected by the system as well as allow\nposts flagged by mistake.\n### Speed\nSince information is sent to users mostly by notification, speed of\nmatching items does not have to be very high. Notifying a user of their\nimage being removed due to being inappropriate should be reasonably\nfast as to provide a better user experience.\n### User rewards\nUser participation is encouraged by awarding active players with\nexperience points. When accumulated, they allow users to gain\nranks. Ranks will be named by MIMUW courses according to their\ndifficulty, e.g. Rank 1 - PO, Rank 5 - MD, Rank 10 - WPI.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmtyrolski%2Fmimuw-hats","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmtyrolski%2Fmimuw-hats","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmtyrolski%2Fmimuw-hats/lists"}