5.1 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Project overview
Urine test strip recognition system (尿检识别系统) — a full-stack web app that analyzes photos of medical urine reagent strips. Two analysis modes:
- Image mode: Upload a strip photo → OpenCV computer vision pipeline locates reagent pads and extracts color values in RGB/HSV/LAB.
- JSON data mode: Upload pre-extracted color data → OpenCV Random Trees ML models infer semi-quantitative results (negative, +, ++, etc.) per analyte.
The system was ported from a C++ HarmonyOS app (/home/ubuntu/nanocode/UrineCheck/).
Commands
# Backend (Python/FastAPI)
cd backend
pip install -r requirements.txt
uvicorn app:app --host 0.0.0.0 --port 8904
# OR: python app.py
# Frontend (React/Vite)
cd frontend
npm install
npm run dev # dev server on :8905, proxies /api → :8904
npm run build # production build to dist/
There are no application-level tests (no pytest, no Jest/Vitest).
Architecture
Browser → :8905 (Vite/React) ──/api──proxy──→ :8904 (FastAPI/Uvicorn)
│
SSO Center (:9000) ←── JWT cookie verification
Backend (backend/)
app.py— FastAPI entry point. Creates SQLite tables on startup, registersauthandurinecheckrouters, CORS configured for localhost +129.211.173.87.routers/auth.py— Dual-mode auth: local username/password (JWT bearer token, 30-day expiry, stored in localStorage) and SSO cookie validation (decodes JWT fromaccess_tokencookie using a shared secret). Default adminadmin/admin123created on first startup.routers/urinecheck.py— Two endpoints:POST /api/urinecheck/analyze(multipart image upload → CV recognition) andPOST /api/urinecheck/analyze-json(JSON body → ML inference).database.py/models.py— SQLAlchemy + SQLite. Singleadminstable (id, username, password_hash, created_at). Database file:backend/urinecheck.db.schemas.py— Pydantic request/response models for both endpoints.sso_client.py— Readsaccess_tokencookie, decodes JWT locally with a shared secret key. Validates against external SSO athttp://129.211.173.87:9000.
Two recognition pipelines
Image-based CV pipeline (urine_recognizer.py, ~1180 lines — the largest file)
UrineStripRecognizer class implements a 7-step algorithm:
- Preprocess (BGR/HSV/Gray conversion, Gaussian blur)
- Detect locator blocks (HSV color segmentation, contour finding with Canny fallback)
- Filter candidates (area, aspect ratio, rectangularity, Y-clustering, pair validation by color + RGB distance + area ratio)
- Blur assessment (Laplacian variance → 3 sharpness levels)
- Spec matching (distance ratio + area ratio → matches one of 6 PaperConfigs)
- Calculate color block centers (edge-to-edge interpolation)
- Read colors (white balance, circular ROI sampling → RGB/HSV/LAB output)
PaperConfig holds the geometric layout for 6 strip specifications (8/11/14 pads × S-type 10mm / L-type 15mm locators). ColorReader handles white balancing and color-space extraction.
JSON-based ML pipeline (json_recognizer.py, ~430 lines)
UrineJsonRecognizer class:
- Loads OpenCV RTrees models from
/usr/local/Models/*.data - Processes multi-frame data and takes majority vote across frames
- Applies analyte-specific result index corrections (14 correction functions per strip color type)
- Enforces PRO/MAU and SG/pH cross-correlation rules
ML model configuration (ml_config.py)
MLConfigLoader singleton parses /usr/local/Models/ml.json which defines model files, positions, algorithms, and result index maps for 21 paper types × 15 positions.
Frontend (frontend/src/)
- React 18 + React Router 6 + Vite 5 + Tailwind CSS 3
App.jsx— Route definitions withPrivateRouteauth wrapper.pages/Login.jsx— Local auth form + SSO redirect support.pages/UrineCheck.jsx— Image upload + results display.pages/JsonDataCheck.jsx— JSON/paste upload + ML results table.api/config.js— Axios instance configured withbaseURLfromimport.meta.env.VITE_API_BASE_URL(falls back to current origin).
Ports
| Service | Port |
|---|---|
| Frontend (Vite dev) | 8905 |
| Backend (Uvicorn) | 8904 |
| SSO Center | 9000 |
Frontend dev server proxies /api/* to http://localhost:8904.
Deployment
systemd units in deploy/:
urinecheck-backend.service— runs uvicorn as userubuntufrombackend/urinecheck-frontend.service— runsnpm run devas userubuntufromfrontend/
The ML model files (/usr/local/Models/ml.json and /usr/local/Models/*.data) must be present on the server — they are not in this repository.
Key dependencies
Backend: fastapi, uvicorn, sqlalchemy (SQLite), python-jose (JWT), passlib[bcrypt], opencv-python-headless, numpy
Frontend: react 18, react-router-dom 6, axios, vite 5, tailwindcss 3, preline (UI component library)