bae705aa97
- Add NFC ePassport roadmap (ICAO 9303, eIDAS) - Add TensorFlow.js edge face detection (BlazeFace) - Add structured audit logger (GDPR-compliant) - Risk scoring support Part of KYC Apple Native UX v1.1.0
176 lines
4.8 KiB
Python
176 lines
4.8 KiB
Python
"""
|
|
Train AI Models
|
|
Complete training pipeline with synthetic data
|
|
"""
|
|
|
|
import sys
|
|
sys.path.insert(0, '/home/bernt/.openclaw/workspace/iom')
|
|
|
|
from ai_pipeline.data_collection import DataCollector, SyntheticDataGenerator
|
|
from ai_pipeline.training_pipeline import TrainingPipeline, TrainingConfig
|
|
import os
|
|
|
|
|
|
def create_training_dataset():
|
|
"""Create training dataset with synthetic data"""
|
|
print("=== Creating Training Dataset ===\n")
|
|
|
|
# Create collector
|
|
collector = DataCollector("/tmp/iom_training_data")
|
|
generator = SyntheticDataGenerator()
|
|
|
|
# Generate training data
|
|
scenes = ["street_view", "building_facade", "bridge", "road", "sidewalk", "park"]
|
|
|
|
print("Generating training images...")
|
|
for i in range(50):
|
|
scene = scenes[i % len(scenes)]
|
|
synthetic = generator.generate_synthetic_image(scene, num_defects=3)
|
|
|
|
collector.add_annotation(
|
|
image_id=f"train_{i:04d}",
|
|
filename=f"train_{i:04d}.jpg",
|
|
width=synthetic["width"],
|
|
height=synthetic["height"],
|
|
objects=synthetic["objects"],
|
|
scene_type=scene,
|
|
split="train"
|
|
)
|
|
|
|
print("Generating validation images...")
|
|
for i in range(10):
|
|
scene = scenes[i % len(scenes)]
|
|
synthetic = generator.generate_synthetic_image(scene, num_defects=2)
|
|
|
|
collector.add_annotation(
|
|
image_id=f"val_{i:04d}",
|
|
filename=f"val_{i:04d}.jpg",
|
|
width=synthetic["width"],
|
|
height=synthetic["height"],
|
|
objects=synthetic["objects"],
|
|
scene_type=scene,
|
|
split="val"
|
|
)
|
|
|
|
print("Generating test images...")
|
|
for i in range(10):
|
|
scene = scenes[i % len(scenes)]
|
|
synthetic = generator.generate_synthetic_image(scene, num_defects=2)
|
|
|
|
collector.add_annotation(
|
|
image_id=f"test_{i:04d}",
|
|
filename=f"test_{i:04d}.jpg",
|
|
width=synthetic["width"],
|
|
height=synthetic["height"],
|
|
objects=synthetic["objects"],
|
|
scene_type=scene,
|
|
split="test"
|
|
)
|
|
|
|
# Create data.yaml
|
|
collector.create_data_yaml()
|
|
|
|
# Stats
|
|
stats = collector.get_stats()
|
|
print(f"\nDataset created:")
|
|
print(f" Train: {stats['splits']['train']} images")
|
|
print(f" Val: {stats['splits']['val']} images")
|
|
print(f" Test: {stats['splits']['test']} images")
|
|
print(f" Total objects: {stats['total_objects']}")
|
|
|
|
return collector
|
|
|
|
|
|
def train_yolo_model():
|
|
"""Train YOLO model"""
|
|
print("\n=== Training YOLO Model ===\n")
|
|
|
|
from ultralytics import YOLO
|
|
|
|
# Load pretrained model
|
|
model = YOLO("yolov8n.pt")
|
|
|
|
# Train on synthetic data
|
|
print("Training YOLOv8n on synthetic data...")
|
|
results = model.train(
|
|
data="/tmp/iom_training_data/data.yaml",
|
|
epochs=5, # Reduced for demo
|
|
batch=8,
|
|
imgsz=640,
|
|
device="cpu",
|
|
project="/tmp/iom_models",
|
|
name="yolo_infrastructure",
|
|
exist_ok=True
|
|
)
|
|
|
|
print(f"Training complete!")
|
|
print(f"Model saved: /tmp/iom_models/yolo_infrastructure/weights/best.pt")
|
|
|
|
return model
|
|
|
|
|
|
def evaluate_model(model):
|
|
"""Evaluate trained model"""
|
|
print("\n=== Evaluating Model ===\n")
|
|
|
|
# Validate on test set
|
|
metrics = model.val()
|
|
|
|
print("Evaluation results:")
|
|
print(f" mAP50: {metrics.box.map50:.3f}")
|
|
print(f" mAP50-95: {metrics.box.map:.3f}")
|
|
print(f" Precision: {metrics.box.mp:.3f}")
|
|
print(f" Recall: {metrics.box.mr:.3f}")
|
|
|
|
return metrics
|
|
|
|
|
|
def export_model(model):
|
|
"""Export model to production format"""
|
|
print("\n=== Exporting Model ===\n")
|
|
|
|
# Export to ONNX
|
|
print("Exporting to ONNX...")
|
|
model.export(format="onnx", dynamic=True)
|
|
|
|
# Export to TorchScript
|
|
print("Exporting to TorchScript...")
|
|
model.export(format="torchscript")
|
|
|
|
print("Export complete!")
|
|
print("Formats: PyTorch, ONNX, TorchScript")
|
|
|
|
|
|
def main():
|
|
"""Main training pipeline"""
|
|
print("=" * 60)
|
|
print("IOM AI MODEL TRAINING")
|
|
print("=" * 60)
|
|
|
|
# 1. Create dataset
|
|
dataset = create_training_dataset()
|
|
|
|
# 2. Train model
|
|
model = train_yolo_model()
|
|
|
|
# 3. Evaluate
|
|
metrics = evaluate_model(model)
|
|
|
|
# 4. Export
|
|
export_model(model)
|
|
|
|
print("\n" + "=" * 60)
|
|
print("TRAINING COMPLETE")
|
|
print("=" * 60)
|
|
print("\nModels saved to: /tmp/iom_models/")
|
|
print("Dataset saved to: /tmp/iom_training_data/")
|
|
print("\nNext steps:")
|
|
print("1. Collect real infrastructure images")
|
|
print("2. Annotate with Label Studio")
|
|
print("3. Retrain with real data")
|
|
print("4. Deploy to production")
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|