AI-powered luggage tracking and identification system using computer vision.
- Live Detection: Real-time luggage detection using webcam or video upload
- Smart Description: AI generates detailed descriptions of bags (color, brand, type, features)
- Semantic Search: Find your bag by describing it in natural language
- Status Tracking: Track bags from check-in to conveyor belt
- FastAPI - High-performance Python API
- Roboflow - Object detection (YOLO)
- BLIP - Image captioning and description
- CLIP - Semantic embeddings for similarity search
- Supabase - PostgreSQL database with pgvector
- Next.js 14 - React framework
- Tailwind CSS - Styling
- react-webcam - Live video capture
cd backend
# Create virtual environment
python -m venv venv
# Activate (Windows)
.\venv\Scripts\activate
# Activate (Mac/Linux)
source venv/bin/activate
# Install dependencies
pip install -r requirements.txt
# Copy env file and add your keys
copy .env.example .env
# Edit .env with your API keys
# Run server
uvicorn app.main:app --reload --port 8000cd frontend
# Install dependencies
npm install
# Run development server
npm run dev- Frontend: http://localhost:3000
- Backend API Docs: http://localhost:8000/docs
| Method | Endpoint | Description |
|---|---|---|
| POST | /api/video/upload |
Upload video for processing |
| POST | /api/video/frame |
Process single webcam frame |
| GET | /api/bags |
List all bags |
| GET | /api/bags/{id} |
Get specific bag |
| PATCH | /api/bags/{id}/status |
Update bag status |
| POST | /api/search |
Semantic search for bags |
ROBOFLOW_API_KEY=your_key
SUPABASE_URL=your_url
SUPABASE_KEY=your_key
HF_TOKEN=your_token (optional)
NEXT_PUBLIC_API_URL=http://localhost:8000
Run this SQL in your Supabase SQL Editor:
CREATE EXTENSION IF NOT EXISTS vector;
CREATE TABLE bags (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
status TEXT CHECK (status IN ('CHECKIN', 'CONVEYOR')),
description TEXT,
color TEXT,
brand TEXT,
bag_type TEXT,
size TEXT,
features JSONB DEFAULT '[]',
image_url TEXT,
text_embedding vector(512),
created_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE INDEX ON bags USING ivfflat (text_embedding vector_cosine_ops) WITH (lists = 100);
CREATE OR REPLACE FUNCTION search_bags(query_embedding vector(512), match_count INT)
RETURNS SETOF bags AS $$
BEGIN
RETURN QUERY
SELECT *
FROM bags
ORDER BY text_embedding <=> query_embedding
LIMIT match_count;
END;
$$ LANGUAGE plpgsql;tamuhack26/
├── backend/
│ ├── app/
│ │ ├── main.py # FastAPI app
│ │ ├── database.py # Supabase client
│ │ ├── routers/ # API endpoints
│ │ ├── services/ # ML services
│ │ └── models/ # Pydantic models
│ └── requirements.txt
├── frontend/
│ ├── app/ # Next.js pages
│ ├── components/ # React components
│ └── package.json
├── mockup.html # Design mockup
└── README.md
MIT - Built for TAMUHack 2026