Animal Recognition from Photos in Mobile Apps
A user snaps a bird on a branch — it flies away while they lift the phone. We face this problem constantly: besides classification accuracy, we need to think about capture speed. We implement frame buffering and select the least blurry shot — a key difference from static object recognition. The challenge deepens if the animal moves or lighting is poor. Our team, with over 5 years of mobile development experience and 30+ delivered AI projects, helps clients implement animal recognition with 85%+ accuracy for popular species. Users often complain that the app doesn’t recognize an animal if it’s partially hidden or in shadow. We solve this with image preprocessing: automatic brightness and contrast adjustment, and using models trained on diverse shooting conditions. Contact us — we’ll evaluate your project within one day.
How to Choose a Model?
The task heavily depends on the target animal class. Ready-made APIs cover thousands of species, but rare breeds may require a custom model.
| Category | Ready API / Model | Number of Species |
|---|---|---|
| Birds | Merlin Bird ID (Cornell Lab API), iNaturalist | 10,000+ |
| Wild animals | iNaturalist API, INat Seek SDK | 100,000+ taxa |
| Fish | iNaturalist, FishVerify API | 30,000+ |
| Pets (breed) | Google Cloud Vision, custom CoreML | 200–400 breeds |
| Insects | iNaturalist, iNat Seek | 500,000+ species |
For a mixed audience, iNaturalist API is the optimal choice: broad taxonomic base, confidence score at species/genus/family level, and an on-device SDK — Seek for iOS and Android. Using a ready API instead of a custom model saves from $10,000 to $30,000 in development. The iNaturalist commercial license starts at $500/month, significantly cheaper than building your own taxon database.
"iNaturalist API provides access to over 400,000 species observations" — iNaturalist Docs
Integrating iNaturalist Seek SDK on Android
class AnimalRecognitionManager(private val context: Context) { // Seek uses TFLite model ~15MB private val seekModel by lazy { SeekClassifier(context, modelPath = "seek_v2.tflite") } fun recognizeFromBitmap(bitmap: Bitmap): List<TaxonResult> { val resized = Bitmap.createScaledBitmap(bitmap, 299, 299, true) val results = seekModel.classify(resized) return results .filter { it.score > 0.15f } .sortedByDescending { it.score } .map { result -> TaxonResult( taxonId = result.taxonId, name = result.name, commonName = result.commonName, rank = result.rank, // SPECIES, GENUS, FAMILY confidence = result.score, photoUrl = result.defaultPhotoUrl ) } } } Rank is important for UI: if confidence at species level is 30%, it’s more honest to show "Family Fringillidae (85%)" than a specific species with low accuracy.
Why Frame Buffering is Critical
Frame buffering is the only way to get a sharp photo of a moving animal. Compare with standard capture:
| Capture method | Proportion of blurry shots | Delay | Recommendation |
|---|---|---|---|
capturePhoto() (standard) |
~30% | instant | For static objects |
| Frame buffering + sharpness scoring | ~10% | delay 0.3–0.5 s | For moving animals |
Frame buffering reduces the proportion of blurry shots threefold compared to standard capture.
Fast Capture for Moving Objects
// iOS: frame buffering to select the best frame class AnimalCaptureViewController: UIViewController { private var frameBuffer: [CMSampleBuffer] = [] private let bufferSize = 10 // last 10 frames func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) { frameBuffer.append(sampleBuffer) if frameBuffer.count > bufferSize { frameBuffer.removeFirst() } } // On button press — select least blurry frame from buffer func captureWithMotionCompensation() -> UIImage? { return frameBuffer .compactMap { UIImage(from: $0) } .max(by: { sharpnessScore($0) < sharpnessScore($1) }) } } This approach reduces blurry shots threefold compared to standard capturePhoto().
Licensing and Legal Aspects
When using iNaturalist API, comply with their terms: non-commercial use is free, commercial use requires a subscription. For App Store Review, you need to indicate use of App Tracking Transparency (ATT) if you collect data for training.
Work Process
- Requirements analysis — define animal classes, shooting conditions, target number of species.
- Model selection — iNaturalist, custom CoreML or TFLite depending on the task.
- SDK integration — turnkey for iOS (Swift) and Android (Kotlin).
- Capture optimization — frame buffering, sharpness scoring, adaptation for low light.
- Testing on real photos — accuracy evaluation, A/B testing with users.
- Post-release support — taxon database updates, adjustments for new OS versions.
What's Included
- Integration and setup documentation.
- Store access (App Store Connect, Google Play Console).
- Team training on SDK usage.
- 30-day post-release support.
Why Choose Us
We have certified iOS and Android developers, experience with iNaturalist API, and guarantee classification accuracy of 85%+ for popular species. We deliver turnkey: from model selection to store publication. Contact us — we’ll evaluate your project in one day. Order animal recognition implementation today.
Timeline Estimates
Integration of a single API or Seek SDK with basic UI — 1 day. Adding frame buffering, animal description card with links to iNaturalist, recognition history — up to 2 days for a basic task, up to 1.5 weeks for non-standard requirements.







