project 02
RhinoAI
A mobile AI application that objectively measures facial proportions before and after rhinoplasty. Face landmark detection and deep learning inference run in real time, entirely on the device.
- Category
- Mobile
- Role
- Solo developer — mobile and edge AI
- Year
- 2026
technologies used
- Kotlin
- Jetpack Compose
- Python
- TensorFlow Lite
- ML Kit
- ViT
problem
Problem
Surgical planning and asymmetry assessment before and after rhinoplasty rely largely on the surgeon's subjective observation. There was no lightweight mobile tool showing a patient their angular and millimetric ratios in the moment. Existing mobile solutions upload the photo to a server, which creates a privacy problem and makes the app dependent on an internet connection.
solution
Solution
I built a native Android architecture on Kotlin and Jetpack Compose. ML Kit Face Mesh integration maps facial landmarks within milliseconds, and TensorFlow Lite models run directly on the device for image analysis and nasal angle calculations. The heavier classification models were converted to TFLite and shrunk through quantisation.
outcome
Outcome
The result is an application running fully locally at zero server cost, analysing facial contours and nasolabial/dorsal angles at 30+ FPS on the live camera stream. It was released as open source.
key features
- 01Detection of 468 facial reference points via ML Kit Face Mesh, with asymmetry calculations.
- 02Live analysis of nasolabial and dorsal angles at 30+ FPS on the camera stream.
- 03Low-latency on-device inference using models optimised and converted to TFLite.
- 04Modern, reactive Android architecture built on MVVM and Jetpack Compose.
- 05Released as open source on GitHub.
why these choices
Why on-device inference?
Rather than sending the camera stream to a Python FastAPI backend, I chose to run everything on the device. In a health-related application, the photo never leaving the phone is a stronger privacy guarantee than any measure that could be taken server-side. The same decision also brought zero latency and independence from network connectivity.
Why TensorFlow Lite?
The Vision Transformer based model was far too heavy to run directly on mobile. TFLite conversion and quantisation brought both the model size and the inference time down to an acceptable level.
Why Jetpack Compose?
The app had to draw landmarks over a live camera preview in real time. Compose's reactive model handles an interface that updates every frame far more cleanly than XML-based views.