Реалізація відстеження калорій через мобільний додаток
Додаток для підрахунку калорій — це насамперед база продуктів харчування, надійний алгоритм розрахунку макронутрієнтів (КБЖУ) та інтеграція з платформними сховищами даних здоров'я. UX та ML для розпізнавання їжі розташовуються на верхівці цієї основи.
База даних продуктів
Створювати власну базу — трудомістко. Для старту використовуйте готові API:
Open Food Facts — відкрита база з 3+ млн продуктів, REST API безкоштовний:
GET https://world.openfoodfacts.org/api/v2/product/{barcode}.json
GET https://world.openfoodfacts.org/cgi/search.pl?search_terms=apple&json=true
Відповідь містить nutriments.energy-kcal_100g, nutriments.proteins_100g тощо. Якість даних неоднорідна: для світових брендів — відмінно, для місцевих продуктів — пропуски.
USDA FoodData Central — детальна база харчування США, безкоштовний API з ключем:
GET https://api.nal.usda.gov/fdc/v1/foods/search?query=chicken+breast&api_key={key}
Для українського ринку — інтеграція з базами типу каталогів або власна база з краудсорсингом.
Локальне кешування: популярні продукти (топ-1000 за частотою пошуку) кешуються в Room/CoreData. Пошук за штрихкодом або назвою спочатку в локальній базі, промах — запит до API.
Сканування штрихкоду
Найшвидший спосіб додати продукт. На iOS — DataScannerViewController (iOS 16+, Vision framework під капотом) або AVCaptureMetadataOutput для старших версій. На Android — CameraX + BarcodeScanning з ML Kit:
val options = BarcodeScannerOptions.Builder()
.setBarcodeFormats(Barcode.FORMAT_EAN_13, Barcode.FORMAT_EAN_8, Barcode.FORMAT_QR_CODE)
.build()
val scanner = BarcodeScanning.getClient(options)
val imageAnalysis = ImageAnalysis.Builder()
.setTargetResolution(Size(1280, 720))
.setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
.build()
imageAnalysis.setAnalyzer(executor) { imageProxy ->
val mediaImage = imageProxy.image ?: return@setAnalyzer imageProxy.close()
val image = InputImage.fromMediaImage(mediaImage, imageProxy.imageInfo.rotationDegrees)
scanner.process(image)
.addOnSuccessListener { barcodes ->
barcodes.firstOrNull()?.rawValue?.let { barcode ->
onBarcodeDetected(barcode)
}
}
.addOnCompleteListener { imageProxy.close() }
}
Розрахунок макронутрієнтів
Основні формули:
BMR (Mifflin-St Jeor):
- Чоловіки:
10 × вага(кг) + 6.25 × зріст(см) − 5 × вік + 5 - Жінки:
10 × вага(кг) + 6.25 × зріст(см) − 5 × вік − 161
TDEE = BMR × коефіцієнт активності (1.2–1.9). Дефіцит/профіцит — цільові калорії мінус TDEE.
Добова норма БЖУ в грамах: білок 1.6–2.2 г/кг ваги (при похуданні/наборі), жири 0.8–1.2 г/кг, вуглеводи — залишок від загальних калорій.
Інтеграція з HealthKit / Health Connect
iOS — записування калорій:
let calorieType = HKQuantityType(.dietaryEnergyConsumed)
let calorieSample = HKQuantitySample(
type: calorieType,
quantity: HKQuantity(unit: .kilocalorie(), doubleValue: 450),
start: mealTime,
end: mealTime
)
healthStore.save(calorieSample) { _, _ in }
Окремо можна записувати dietaryProtein, dietaryFatTotal, dietaryCarbohydrates — тоді дані з'являться у розділі «Харчування» в додатку «Здоров'я».
Android — Health Connect:
val nutritionRecord = NutritionRecord(
startTime = mealTime,
startZoneOffset = ZoneOffset.systemDefault().getRules().getOffset(mealTime),
endTime = mealTime.plusMinutes(30),
endZoneOffset = ZoneOffset.systemDefault().getRules().getOffset(mealTime),
energy = Energy.kilocalories(450.0),
protein = Mass.grams(35.0),
totalCarbohydrate = Mass.grams(60.0),
totalFat = Mass.grams(15.0),
mealType = NutritionRecord.MEAL_TYPE_LUNCH
)
healthConnectClient.insertRecords(listOf(nutritionRecord))
Розпізнавання їжі за фото (опціонально)
ML Kit ImageLabeling на основі MobileNetV2 розпізнає ~1000 категорій об'єктів — не страви, а об'єкти типу «apple», «sandwich». Для точного розпізнавання страв потрібна спеціалізована модель. Варіанти:
- Logmeal API — REST API для розпізнавання їжі, ~92% точності на стандартних стравах
- Власна модель на CoreML / TensorFlow Lite, навчена на датасеті Food-101 або власному
Зіставлення результату розпізнавання з базою продуктів — нечіткий пошук за назвою категорії.
Терміни
Базовий додаток з ручним вводом, сканером штрихкодів та інтеграцією в HealthKit/Health Connect — 6–10 тижнів. З розпізнаванням їжі за фото, синхронізацією з сервером та аналітикою — 3–5 місяців.







