import React, { useState } from 'react'; import { Settings, Zap, Crown, Target, Cpu, CheckCircle } from 'lucide-react'; import { motion } from 'framer-motion'; import { useUserStore } from '@/store/userStore'; import { useCVStore } from '@/store/cvStore'; import { TrainingMode, CVTrainingConfig } from '@/types/cv'; interface Props { onStartTraining: (mode: TrainingMode, config: CVTrainingConfig, taskType?: string) => void; disabled?: boolean; selectedTaskType?: string; } const CVTrainingConfigPanel: React.FC = ({ onStartTraining, disabled, selectedTaskType }) => { const { isDark } = useUserStore(); const { trainingMode, setTrainingMode, activeDatasetId, datasets } = useCVStore(); const dataset = datasets.find(d => d.id === activeDatasetId); const effectiveTaskType = selectedTaskType || dataset?.taskType || 'object_detection'; const [config, setConfig] = useState({ model: effectiveTaskType === 'classification' ? 'resnet50' : effectiveTaskType === 'pose_estimation' ? 'yolov8s-pose' : effectiveTaskType === 'ocr' ? 'trocr' : (effectiveTaskType === 'instance_segmentation' || effectiveTaskType === 'semantic_segmentation') ? 'yolov8s-seg' : 'yolov8s', epochs: 50, batchSize: 16, learningRate: 0.001, imageSize: 640, optimizer: 'AdamW', weightDecay: 0.0005, augmentations: ['mosaic', 'mixup'], }); const handleStart = () => { onStartTraining(trainingMode, config, effectiveTaskType); }; const modeTabs = [ { id: 'fast', label: 'Fast Mode', icon: Zap, desc: 'Quick prototyping, 10-20 epochs, basic augmentations' }, { id: 'ultra', label: 'Ultra Mode', icon: Crown, desc: 'State-of-the-art accuracy, heavy augmentations, 100+ epochs' }, { id: 'expert', label: 'Expert Mode', icon: Settings, desc: 'Full manual hyperparameter control' } ]; // Advanced model definitions matching AutoML's deep selection const detectionModels = [ { category: 'YOLOv11 (State of the Art)', models: [ { id: 'yolo11n', name: 'YOLO11 Nano', desc: 'Ultra-fast edge deployment', params: '2.6M' }, { id: 'yolo11s', name: 'YOLO11 Small', desc: 'Balanced speed/accuracy', params: '9.4M' }, { id: 'yolo11m', name: 'YOLO11 Medium', desc: 'Standard use cases', params: '20.1M' }, { id: 'yolo11l', name: 'YOLO11 Large', desc: 'High accuracy', params: '25.3M' }, { id: 'yolo11x', name: 'YOLO11 Extra', desc: 'Max performance', params: '56.9M' } ]}, { category: 'YOLOv10 / v9', models: [ { id: 'yolov10n', name: 'YOLOv10 Nano', desc: 'NMS-free end-to-end', params: '2.7M' }, { id: 'yolov10x', name: 'YOLOv10 Extra', desc: 'Max NMS-free perf', params: '31.6M' }, { id: 'yolov9c', name: 'YOLOv9 Compact', desc: 'PGI architecture', params: '25.3M' }, { id: 'yolov9e', name: 'YOLOv9 Extended', desc: 'GELAN heavy', params: '58.1M' } ]}, { category: 'YOLOv8 (Industry Standard)', models: [ { id: 'yolov8n', name: 'YOLOv8 Nano', desc: 'Extremely fast', params: '3.2M' }, { id: 'yolov8s', name: 'YOLOv8 Small', desc: 'Good baseline', params: '11.2M' }, { id: 'yolov8x', name: 'YOLOv8 Extra', desc: 'Heavy but precise', params: '68.2M' } ]}, { category: 'Transformers & Other', models: [ { id: 'rtdetr-l', name: 'RT-DETR Large', desc: 'Real-time Transformer', params: '32M' }, { id: 'rtdetr-x', name: 'RT-DETR Extra', desc: 'SOTA Transformer', params: '67M' }, { id: 'faster_rcnn', name: 'Faster R-CNN', desc: 'Classic two-stage', params: '41M' }, { id: 'ssd_mobilenet', name: 'SSD MobileNet', desc: 'Lightweight mobile', params: '4M' }, { id: 'retinanet', name: 'RetinaNet', desc: 'Focal loss pioneer', params: '38M' }, { id: 'efficientdet_d0', name: 'EfficientDet-D0', desc: 'BiFPN architecture', params: '4M' } ]} ]; const classificationModels = [ { category: 'Transformers (SOTA)', models: [ { id: 'vit_b_16', name: 'ViT Base 16', desc: 'Vision Transformer', params: '86M' }, { id: 'vit_l_16', name: 'ViT Large 16', desc: 'Heavy Transformer', params: '304M' }, { id: 'swin_t', name: 'Swin-T', desc: 'Hierarchical ViT', params: '28M' }, { id: 'deit_base', name: 'DeiT Base', desc: 'Data-efficient ViT', params: '86M' } ]}, { category: 'EfficientNet (Balanced)', models: [ { id: 'efficientnet_b0', name: 'EfficientNet-B0', desc: 'Fast baseline', params: '5M' }, { id: 'efficientnet_b4', name: 'EfficientNet-B4', desc: 'High accuracy', params: '19M' }, { id: 'efficientnet_v2_s', name: 'EfficientNetV2-S', desc: 'Faster training', params: '21M' }, { id: 'convnext_tiny', name: 'ConvNeXt Tiny', desc: 'Modern ConvNet', params: '28M' } ]}, { category: 'Classic ResNet', models: [ { id: 'resnet18', name: 'ResNet-18', desc: 'Lightweight classic', params: '11M' }, { id: 'resnet50', name: 'ResNet-50', desc: 'Industry standard', params: '25M' }, { id: 'resnet101', name: 'ResNet-101', desc: 'Deeper network', params: '44M' } ]}, { category: 'Mobile & Edge', models: [ { id: 'mobilenet_v3_small', name: 'MobileNetV3 S', desc: 'Ultra-light', params: '2.5M' }, { id: 'mobilenet_v3_large', name: 'MobileNetV3 L', desc: 'Mobile standard', params: '5.4M' }, { id: 'shufflenet_v2_x1_0', name: 'ShuffleNet V2', desc: 'Efficient edge', params: '2.3M' } ]} ]; const segmentationModels = [ { category: 'Foundation Models', models: [ { id: 'sam_b', name: 'SAM Base', desc: 'Segment Anything', params: '91M' }, { id: 'sam2_t', name: 'SAM 2 Tiny', desc: 'Video/Image SOTA', params: '38M' } ]}, { category: 'YOLO Segmentation', models: [ { id: 'yolo11n-seg', name: 'YOLO11n-Seg', desc: 'Fast instance seg', params: '2.8M' }, { id: 'yolov8s-seg', name: 'YOLOv8s-Seg', desc: 'Standard instance', params: '11.8M' } ]}, { category: 'Classic', models: [ { id: 'mask_rcnn', name: 'Mask R-CNN', desc: 'Standard two-stage', params: '44M' }, { id: 'deeplabv3', name: 'DeepLabV3', desc: 'Semantic seg', params: '39M' } ]} ]; const poseModels = [ { category: 'YOLO Pose Estimation', models: [ { id: 'yolo11n-pose', name: 'YOLO11n-Pose', desc: 'Fast pose tracking', params: '2.9M' }, { id: 'yolov8s-pose', name: 'YOLOv8s-Pose', desc: 'Standard keypoints', params: '11.6M' }, { id: 'yolov8x-pose', name: 'YOLOv8x-Pose', desc: 'SOTA pose accuracy', params: '69.4M' } ]}, { category: 'Classic Keypoints', models: [ { id: 'hrnet_w32', name: 'HRNet-W32', desc: 'High-resolution keypoints', params: '28.5M' }, { id: 'openpose', name: 'OpenPose Multi-Person', desc: 'Real-time multi-person', params: '26M' } ]} ]; const ocrModels = [ { category: 'Text Recognition & Detection', models: [ { id: 'trocr', name: 'TrOCR (Transformer OCR)', desc: 'Encoder-decoder text OCR', params: '62M' }, { id: 'paddle_ocr', name: 'PaddleOCR Engine', desc: 'Multilingual document OCR', params: '15M' }, { id: 'easy_ocr', name: 'EasyOCR Text Pipeline', desc: 'Fast multi-language text', params: '12M' } ]} ]; const currentModels = effectiveTaskType === 'classification' ? classificationModels : effectiveTaskType === 'pose_estimation' ? poseModels : effectiveTaskType === 'ocr' ? ocrModels : (effectiveTaskType === 'instance_segmentation' || effectiveTaskType === 'semantic_segmentation') ? segmentationModels : detectionModels; const renderModelGrid = (categories: {category: string, models: any[]}[]) => (
{categories.map((group, idx) => (

{group.category}

{group.models.map(m => (
setConfig({...config, model: m.id})} className={`relative p-4 rounded-xl border cursor-pointer transition-all ${ config.model === m.id ? 'border-emerald-500 bg-emerald-500/10 shadow-[0_0_15px_rgba(16,185,129,0.1)]' : 'hover:border-emerald-500/50 hover:bg-black/5 dark:hover:bg-white/5' }`} style={{ borderColor: config.model === m.id ? '' : 'var(--border-color)' }} > {config.model === m.id && (
)}
{m.name}
{m.desc}
{m.params} Params
))}
))}
); return (
{/* Mode Selector - Uses AutoML pill pattern */}
{modeTabs.map((tab) => ( ))}

{modeTabs.find(t => t.id === trainingMode)?.desc}

{trainingMode === 'fast' && (

Note: Fast Mode will automatically select a lightweight model ({effectiveTaskType === 'classification' ? 'ResNet-18' : 'YOLO11n'}) and train for 20 epochs. Model architecture selection is disabled in Fast Mode.

)}
{/* Model Selection (Visible in Ultra and Expert) */} {trainingMode !== 'fast' && (

Model Architecture

Select a foundation model to fine-tune on your dataset.

{renderModelGrid(currentModels)}
)} {/* Expert Settings */} {trainingMode === 'expert' && (

Advanced Hyperparameters

Fine-tune the training process manually.

setConfig({...config, epochs: parseInt(e.target.value)})} className="w-full p-2.5 rounded-xl border outline-none bg-transparent focus:border-emerald-500" style={{ borderColor: 'var(--border-color)', color: 'var(--text-primary)' }} />
setConfig({...config, batchSize: parseInt(e.target.value)})} className="w-full p-2.5 rounded-xl border outline-none bg-transparent focus:border-emerald-500" style={{ borderColor: 'var(--border-color)', color: 'var(--text-primary)' }} />
setConfig({...config, learningRate: parseFloat(e.target.value)})} className="w-full p-2.5 rounded-xl border outline-none bg-transparent focus:border-emerald-500" style={{ borderColor: 'var(--border-color)', color: 'var(--text-primary)' }} />
setConfig({...config, imageSize: parseInt(e.target.value)})} className="w-full p-2.5 rounded-xl border outline-none bg-transparent focus:border-emerald-500" style={{ borderColor: 'var(--border-color)', color: 'var(--text-primary)' }} />
setConfig({...config, weightDecay: parseFloat(e.target.value)})} className="w-full p-2.5 rounded-xl border outline-none bg-transparent focus:border-emerald-500" style={{ borderColor: 'var(--border-color)', color: 'var(--text-primary)' }} />

Data Augmentation

)} {/* Start Button */}
); }; export default CVTrainingConfigPanel;