{"slug": "nose-id-i-taught-an-ai-to-recognize-dogs-by-their-nose-print", "title": "Nose ID: I Taught an AI to Recognize Dogs by Their Nose-Print", "summary": "A developer built Nose ID, a biometric system that identifies dogs by their unique nose-prints using a pretrained MobileNetV2 as a feature extractor and cosine similarity for matching. The system also uses Google Gemini to generate dog bios and ElevenLabs for voice confirmation. The developer noted that both Gemini and ElevenLabs changed parts of their APIs during the same week the project was built.", "body_md": "**Nose ID** — a biometric dog identification system. Instead of a collar\n\ntag, chip scanner, or manual lookup, it identifies a dog the way security\n\nsystems identify people: from a unique physical trait. In this case, the\n\ndog's nose-print — the ridge and texture pattern on a dog's nose, which is\n\nas individual to each dog as a fingerprint is to a human.\n\nScan a dog's nose → the system tells you who it is (with a spoken voice\n\nresponse) or offers to enroll it if it's new.\n\n**1. Embedding extraction (the core ML piece)**\n\nRather than training a nose-print classifier from scratch, I used a\n\n**pretrained MobileNetV2** (ImageNet weights) as a feature extractor,\n\nstripping its classification head and using the penultimate layer's\n\npooled output as a 1280-dimensional embedding vector. This is a standard\n\ntransfer-learning technique — mid-level CNN filters trained on general\n\nimages still respond well to texture, edges, and ridge patterns, which is\n\nexactly what distinguishes one nose-print from another.\n\n**2. Matching**\n\nEach enrolled dog's embedding is L2-normalized and stored. A new scan's\n\nembedding is compared against all stored ones using **cosine similarity**.\n\nA similarity above a tuned threshold (0.90) counts as a match.\n\n**3. AI-generated personality**\n\nOn enrollment, **Google Gemini** generates a short, fun bio for each dog\n\nfrom its name and breed.\n\n**4. Voice confirmation**\n\nOn identification, **ElevenLabs** turns the result into a spoken response\n\n— \"Welcome back, Bella. Access granted.\" or \"I don't recognize this nose.\n\nWould you like to enroll?\"\n\nBoth Gemini and ElevenLabs changed parts of their APIs the same week I\n\nbuilt this:\n\n`generateContent`\n\nendpoint to their new `/v1/voices`\n\nto find one my account could actually use.This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.\n\nCurrently, two official plugins are available:\n\nThe React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation).\n\nIf you are developing a production application, we recommend using TypeScript with type-aware lint rules enabled. Check out the [TS template](https://github.com/vitejs/vite/tree/main/packages/create-vite/template-react-ts) for information on how to integrate TypeScript and [ typescript-eslint](https://typescript-eslint.io) in your project.", "url": "https://wpnews.pro/news/nose-id-i-taught-an-ai-to-recognize-dogs-by-their-nose-print", "canonical_source": "https://dev.to/rimshashehzadi98/nose-id-i-taught-an-ai-to-recognize-dogs-by-their-nose-print-l44", "published_at": "2026-08-17 06:54:15+00:00", "updated_at": "2026-08-17 07:12:39.345874+00:00", "lang": "en", "topics": ["machine-learning", "computer-vision", "artificial-intelligence", "generative-ai"], "entities": ["MobileNetV2", "Google Gemini", "ElevenLabs", "Nose ID"], "alternates": {"html": "https://wpnews.pro/news/nose-id-i-taught-an-ai-to-recognize-dogs-by-their-nose-print", "markdown": "https://wpnews.pro/news/nose-id-i-taught-an-ai-to-recognize-dogs-by-their-nose-print.md", "text": "https://wpnews.pro/news/nose-id-i-taught-an-ai-to-recognize-dogs-by-their-nose-print.txt", "jsonld": "https://wpnews.pro/news/nose-id-i-taught-an-ai-to-recognize-dogs-by-their-nose-print.jsonld"}}