Розпізнавання рослин за фотографією у мобільних застосунках
Користувач фотографує незнайому квітку в парку й миттєво бачить назву, опис і попередження про токсичність. Технічно просто—PlantNet API і Google Cloud Vision мають готові endpoints. Розрив між «працює в демо» і «працює в продакшні» зазвичай ховається в обробці поганих фото і UX при низькій впевненості моделі.
Варіанти реалізації
Два шляхи: облачне API або on-device модель.
Облачні API (PlantNet, iNaturalist, Plant.id) дають високу точність і регулярно оновлювану базу (PlantNet—30 000+ видів). Компроміс: залежність від інтернету і затримка 1–3 секунди. Для більшості застосунків прийнятно.
On-device через CoreML (iOS) або TensorFlow Lite (Android)—працює офлайн, миттєвий відклик, але модель вимагає OTA-оновлень і точність на рідких видах помітно нижча. Модель EfficientNet-B4, дообучена на датасеті PlantCLEF—близько 20 МБ в форматі .mlmodel.
Для більшості проектів оптимально: CoreML/TFLite для швидкого офлайн-результату (топ-3 кандидати) + хмара для уточнення при наявності мережі.
Інтеграція Plant.id API
struct PlantIdentificationService {
func identify(image: UIImage) async throws -> [PlantMatch] {
guard let imageData = image.jpegData(compressionQuality: 0.8) else {
throw PlantError.invalidImage
}
let base64 = imageData.base64EncodedString()
let request = PlantIdentifyRequest(
images: [base64],
modifiers: ["crops_fast", "similar_images"],
plant_language: "uk",
plant_details: ["common_names", "url", "description",
"taxonomy", "edible_parts", "toxicity"]
)
let response = try await apiClient.post("/identify", body: request)
return response.suggestions
.filter { $0.probability >= 0.1 } // відфільтрувати дуже слабкі збіги
.prefix(5)
.map { PlantMatch(from: $0) }
}
}
Поле toxicity—важливе. Для застосунків із аудиторією батьків або грибників попередження про токсичність повинно бути візуально виділене—не п'ятим пунктом у списку деталей.
Обробка поганого фото
Часта проблема: розмиті снимки, невдалий ракурс (тільки стебло без листків/квітки), темний фон. Виявіть перед викликом API:
func assessImageQuality(_ image: UIImage) -> ImageQualityResult {
// Розмитість через дисперсію Лапласіяна
let laplacianVariance = computeLaplacianVariance(image)
if laplacianVariance < 50 {
return .tooBlurry
}
// Перевірка наявності рослини—через CoreML Vision класифікатор
let plantPresenceScore = runPlantPresenceClassifier(image)
if plantPresenceScore < 0.3 {
return .noPlantDetected
}
return .acceptable
}
На .tooBlurry миттєво попросіть переснята—не витрачайте API-запит.
Орієнтири за часом
Інтеграція з одним облачним API (Plant.id або PlantNet), обробка результатів, базовий UI карточки рослини—1–2 дні. Додавання on-device моделі, обробки якості зображення, історії розпізнавань, офлайн-режиму та підтримки обох платформ—1–1,5 тижня.







