
- Set up FastAPI project structure with SQLite database - Create database models for tomato images and severity classifications - Implement image upload and processing endpoints - Develop a segmentation model for tomato disease severity detection - Add API endpoints for analysis and results retrieval - Implement health check endpoint - Set up Alembic for database migrations - Update project documentation
96 lines
2.1 KiB
Python
96 lines
2.1 KiB
Python
from datetime import datetime
|
|
from typing import List, Optional, Dict, Any
|
|
from pydantic import BaseModel, validator
|
|
|
|
|
|
# TomatoImage schemas
|
|
class TomatoImageBase(BaseModel):
|
|
filename: str
|
|
mime_type: str
|
|
width: Optional[int] = None
|
|
height: Optional[int] = None
|
|
file_size: int
|
|
|
|
|
|
class TomatoImageCreate(TomatoImageBase):
|
|
file_path: str
|
|
|
|
|
|
class TomatoImage(TomatoImageBase):
|
|
id: str
|
|
file_path: str
|
|
uploaded_at: datetime
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
|
|
|
|
# SeverityDetail schemas
|
|
class SeverityDetailBase(BaseModel):
|
|
severity_class: str
|
|
confidence: float
|
|
affected_area_percentage: Optional[float] = None
|
|
|
|
|
|
class SeverityDetailCreate(SeverityDetailBase):
|
|
analysis_id: str
|
|
|
|
|
|
class SeverityDetail(SeverityDetailBase):
|
|
id: str
|
|
analysis_id: str
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
|
|
|
|
# AnalysisResult schemas
|
|
class AnalysisResultBase(BaseModel):
|
|
model_name: str
|
|
model_version: str
|
|
primary_severity: Optional[str] = None
|
|
severity_confidence: Optional[float] = None
|
|
segmentation_data: Optional[str] = None
|
|
processing_time_ms: Optional[int] = None
|
|
|
|
|
|
class AnalysisResultCreate(AnalysisResultBase):
|
|
image_id: str
|
|
|
|
|
|
class AnalysisResult(AnalysisResultBase):
|
|
id: str
|
|
image_id: str
|
|
processed_at: datetime
|
|
severity_details: List[SeverityDetail] = []
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
|
|
|
|
# Response schemas
|
|
class AnalysisResponse(BaseModel):
|
|
id: str
|
|
image: TomatoImage
|
|
primary_severity: Optional[str] = None
|
|
severity_confidence: Optional[float] = None
|
|
severity_details: List[SeverityDetail] = []
|
|
segmentation_data: Optional[Dict[str, Any]] = None
|
|
processed_at: datetime
|
|
model_name: str
|
|
model_version: str
|
|
|
|
@validator('segmentation_data', pre=True)
|
|
def parse_segmentation_data(cls, v):
|
|
import json
|
|
if v and isinstance(v, str):
|
|
try:
|
|
return json.loads(v)
|
|
except Exception:
|
|
return None
|
|
return v
|
|
|
|
|
|
class UploadResponse(BaseModel):
|
|
image: TomatoImage
|
|
message: str = "Image uploaded successfully" |