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.







