<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Rimsha Shehzadi</title>
    <description>The latest articles on DEV Community by Rimsha Shehzadi (@rimshashehzadi98).</description>
    <link>https://dev.to/rimshashehzadi98</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1128938%2F88c3c7a4-0e1a-4cb6-a3f3-afbfd75d57c8.jpeg</url>
      <title>DEV Community: Rimsha Shehzadi</title>
      <link>https://dev.to/rimshashehzadi98</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rimshashehzadi98"/>
    <language>en</language>
    <item>
      <title>Nose ID: I Taught an AI to Recognize Dogs by Their Nose-Print</title>
      <dc:creator>Rimsha Shehzadi</dc:creator>
      <pubDate>Mon, 17 Aug 2026 06:54:15 +0000</pubDate>
      <link>https://dev.to/rimshashehzadi98/nose-id-i-taught-an-ai-to-recognize-dogs-by-their-nose-print-l44</link>
      <guid>https://dev.to/rimshashehzadi98/nose-id-i-taught-an-ai-to-recognize-dogs-by-their-nose-print-l44</guid>
      <description>&lt;h3&gt;
  
  
  What I Built
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Nose ID&lt;/strong&gt; — a biometric dog identification system. Instead of a collar&lt;br&gt;
tag, chip scanner, or manual lookup, it identifies a dog the way security&lt;br&gt;
systems identify people: from a unique physical trait. In this case, the&lt;br&gt;
dog's nose-print — the ridge and texture pattern on a dog's nose, which is&lt;br&gt;
as individual to each dog as a fingerprint is to a human.&lt;/p&gt;

&lt;p&gt;Scan a dog's nose → the system tells you who it is (with a spoken voice&lt;br&gt;
response) or offers to enroll it if it's new.&lt;/p&gt;
&lt;h3&gt;
  
  
  Demo
&lt;/h3&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/JnZ9CDhUhT4"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  How It Works
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Embedding extraction (the core ML piece)&lt;/strong&gt;&lt;br&gt;
Rather than training a nose-print classifier from scratch, I used a&lt;br&gt;
&lt;strong&gt;pretrained MobileNetV2&lt;/strong&gt; (ImageNet weights) as a feature extractor,&lt;br&gt;
stripping its classification head and using the penultimate layer's&lt;br&gt;
pooled output as a 1280-dimensional embedding vector. This is a standard&lt;br&gt;
transfer-learning technique — mid-level CNN filters trained on general&lt;br&gt;
images still respond well to texture, edges, and ridge patterns, which is&lt;br&gt;
exactly what distinguishes one nose-print from another.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Matching&lt;/strong&gt;&lt;br&gt;
Each enrolled dog's embedding is L2-normalized and stored. A new scan's&lt;br&gt;
embedding is compared against all stored ones using &lt;strong&gt;cosine similarity&lt;/strong&gt;.&lt;br&gt;
A similarity above a tuned threshold (0.90) counts as a match.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. AI-generated personality&lt;/strong&gt;&lt;br&gt;
On enrollment, &lt;strong&gt;Google Gemini&lt;/strong&gt; generates a short, fun bio for each dog&lt;br&gt;
from its name and breed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Voice confirmation&lt;/strong&gt;&lt;br&gt;
On identification, &lt;strong&gt;ElevenLabs&lt;/strong&gt; turns the result into a spoken response&lt;br&gt;
— "Welcome back, Bella. Access granted." or "I don't recognize this nose.&lt;br&gt;
Would you like to enroll?"&lt;/p&gt;
&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; React (Vite)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; FastAPI (Python)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ML:&lt;/strong&gt; PyTorch, pretrained MobileNetV2, cosine similarity matching&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Gemini&lt;/strong&gt; — dog bio generation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ElevenLabs&lt;/strong&gt; — text-to-speech voice confirmation&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Challenges I Ran Into
&lt;/h3&gt;

&lt;p&gt;Both Gemini and ElevenLabs changed parts of their APIs the same week I&lt;br&gt;
built this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Google's new API key format required switching from the legacy
&lt;code&gt;generateContent&lt;/code&gt; endpoint to their new &lt;strong&gt;Interactions API&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;ElevenLabs' free tier restricts which voices are callable via the API,
even though the full library shows in their dashboard — had to query
&lt;code&gt;/v1/voices&lt;/code&gt; to find one my account could actually use.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/rimsha-shehzadi98" rel="noopener noreferrer"&gt;
        rimsha-shehzadi98
      &lt;/a&gt; / &lt;a href="https://github.com/rimsha-shehzadi98/Nose_Print" rel="noopener noreferrer"&gt;
        Nose_Print
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;React + Vite&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.&lt;/p&gt;
&lt;p&gt;Currently, two official plugins are available:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react" rel="noopener noreferrer"&gt;@vitejs/plugin-react&lt;/a&gt; uses &lt;a href="https://oxc.rs" rel="nofollow noopener noreferrer"&gt;Oxc&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc" rel="noopener noreferrer"&gt;@vitejs/plugin-react-swc&lt;/a&gt; uses &lt;a href="https://swc.rs/" rel="nofollow noopener noreferrer"&gt;SWC&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;React Compiler&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;The React Compiler is not enabled on this template because of its impact on dev &amp;amp; build performances. To add it, see &lt;a href="https://react.dev/learn/react-compiler/installation" rel="nofollow noopener noreferrer"&gt;this documentation&lt;/a&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Expanding the ESLint configuration&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;If you are developing a production application, we recommend using TypeScript with type-aware lint rules enabled. Check out the &lt;a href="https://github.com/vitejs/vite/tree/main/packages/create-vite/template-react-ts" rel="noopener noreferrer"&gt;TS template&lt;/a&gt; for information on how to integrate TypeScript and &lt;a href="https://typescript-eslint.io" rel="nofollow noopener noreferrer"&gt;&lt;code&gt;typescript-eslint&lt;/code&gt;&lt;/a&gt; in your project.&lt;/p&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/rimsha-shehzadi98/Nose_Print" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;h3&gt;
  
  
  Prize Categories
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Best use of Google AI&lt;/li&gt;
&lt;li&gt;Best use of ElevenLabs&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  weekendchallenge
&lt;/h1&gt;

</description>
      <category>weekendchallenge</category>
      <category>ai</category>
      <category>machinelearning</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
