Цель: iOS-приложение для анализа лица, отслеживания пропорций (скулы, щёки, челюсть), детекции состояния кожи и статистики прогресса.
| # | Задача | Статус | Приоритет | Заметки |
|---|---|---|---|---|
| 1 | Структура проекта | ✅ | P0 | Features/, Services/, Models/, Extensions/ |
| 2 | SwiftData модели | ✅ | P0 | FaceSnapshot с @Model |
| 3 | Camera Service | ✅ | P0 | AVCaptureSession + Photo Output |
| 4 | Vision Face Analyzer | ✅ | P0 | VNDetectFaceLandmarksRequest, 76 точек |
| 5 | ARKit Face Tracking | ⬜️ | P1 | ARFaceGeometry для точных мм |
| 6 | Metrics Calculator | ✅ | P0 | Скулы, челюсть, щёки, симметрия |
| 7 | ML модель кожи | ✅ | P1 | SkinMLService (placeholder ready) |
| 8 | Camera UI | ✅ | P0 | iOS 26 Liquid Glass стили |
| 9 | Analysis Results UI | ✅ | P1 | Карточки метрик, Material backgrounds |
| 10 | Statistics UI | ✅ | P1 | Swift Charts, LineMark, AreaMark |
| 11 | Tab Navigation | ✅ | P0 | TabView с Camera/Stats/Profile |
| 12 | Simulator Support | ✅ | P0 | Заглушка для камеры + демо режим |
| 13 | Тестирование | ✅ | P2 | Работает в iOS Simulator |
| 14 | Deployment | ✅ | P0 | Задеплоено на iPhone 16 (8E5AFD6A-8C09-5638-9FCE-518CEF01AAA0) |
Легенда: ⬜️ Не начато | 🔄 В процессе | ✅ Готово | ❌ Заблокировано
jEt/
├── jEtApp.swift # Entry point + ModelContainer
├── ContentView.swift # Main TabView navigation
├── Models/
│ ├── FaceSnapshot.swift # @Model - снимок анализа
│ ├── FaceMetrics.swift # Структура метрик лица
│ └── SkinAnalysis.swift # @Model - анализ кожи
├── Services/
│ ├── CameraService.swift # AVCaptureSession управление
│ ├── FaceAnalyzer.swift # Vision + расчёт метрик
│ ├── ARFaceService.swift # ARKit face tracking
│ ├── SkinMLService.swift # CoreML inference
│ ├── HealthKitService.swift # Интеграция с Apple Health
│ └── AuthenticationService.swift # Sign in with Apple
├── Features/
│ ├── Camera/
│ │ ├── CameraView.swift # UI камеры
│ │ └── CameraPreview.swift # UIViewRepresentable превью
│ ├── Analysis/
│ │ ├── AnalysisView.swift # Результаты анализа
│ │ └── MetricCard.swift # Компонент карточки
│ ├── Statistics/
│ │ ├── StatisticsView.swift # Графики прогресса
│ │ ├── FullHistoryView.swift # Полная история записей
│ │ └── ChartComponents.swift # Swift Charts компоненты
│ ├── Health/
│ │ └── AcneLogView.swift # Экран записи акне в HealthKit
│ └── AuthenticationView.swift # Экран входа
├── Extensions/
│ └── View+LiquidGlass.swift # iOS 26 стили
└── Resources/
└── SkinClassifier.mlmodel # CoreML модель
При работе с этим проектом использовать:
- /apple/swift-evolution — актуальный Swift синтаксис
- /apple/swiftui — iOS 26 API, .glassEffect(), Material
- /apple/vision — VNFaceLandmarks2D, VNDetectFaceLandmarksRequest
- /apple/arkit — ARFaceGeometry, ARFaceAnchor
- /apple/coreml — MLModel, VNCoreMLRequest
- /apple/swiftdata — @Model, ModelContainer, @Query
- /apple/swift-charts — Chart, LineMark, AreaMark
- /apple/healthkit - HKHealthStore, HKCategoryType
// Vision Face Landmarks
VNDetectFaceLandmarksRequest
VNFaceLandmarks2D.faceContour // Контур лица - 17 точек
VNFaceLandmarks2D.leftEye // Левый глаз
VNFaceLandmarks2D.rightEye // Правый глаз
VNFaceLandmarks2D.nose // Нос
VNFaceLandmarks2D.outerLips // Губы
// ARKit Face Geometry
ARFaceTrackingConfiguration
ARFaceGeometry.vertices // 1220 вершин 3D меша
ARFaceAnchor.blendShapes // 52 выражения лица
// SwiftData
@Model class FaceSnapshot
modelContainer(for:)
@Query var snapshots: [FaceSnapshot]
// iOS 26 Liquid Glass
.glassEffect()
.ultraThinMaterial
.regularMaterialШирина лица = |faceContour[0] - faceContour[16]|
Высота лица = |faceContour[8].y - переносица.y|
Ширина скул = |faceContour[2] - faceContour[14]|
Ширина челюсти = |faceContour[4] - faceContour[12]|
Ширина щёк = (скулы - челюсть) / скулы * 100%
Симметрия = 1 - |левая_сторона - правая_сторона| / среднее
Отёчность = сравнение с baseline (первый снимок)
ARFaceGeometry.vertices даёт координаты в метрах
Умножить на 1000 для мм
Использовать индексы вершин для ключевых точек
- Полупрозрачные контролы с
.glassEffect() - Размытие фона через Material
- Плавные анимации с
.spring() - Иконки SF Symbols 6
- Контрастный текст на стекле
// Акцентные цвета для метрик
Color.green // Хороший показатель
Color.orange // Средний
Color.red // Требует внимания
// Фоны
.ultraThinMaterial
.regularMaterial
.thickMaterialИсточник: uzairu809/skin_disease_classifier_MobileNetV2
Формат: Keras → CoreML через coremltools
Классы: Акне, покраснения, пигментация, норма
import coremltools as ct
model = ct.convert(keras_model,
inputs=[ct.ImageType(shape=(1, 224, 224, 3))])
model.save("SkinClassifier.mlmodel")mcp_ios-simulator_open_simulator # Открыть симулятор
mcp_ios-simulator_get_booted_sim_id # Получить ID
mcp_ios-simulator_ui_tap # Тап по координатам
mcp_ios-simulator_take_screenshot # Скриншот для проверки
| Дата | Изменение |
|---|---|
| 30.12.2025 | Создан agents.md, начало проекта |
| 30.12.2025 | ✅ Структура проекта: Models/, Services/, Features/, Extensions/ |
| 30.12.2025 | ✅ SwiftData: FaceSnapshot.swift, FaceMetrics.swift, SkinAnalysis.swift |
| 30.12.2025 | ✅ Services: CameraService, FaceAnalyzer, SkinMLService |
| 30.12.2025 | ✅ UI: CameraView, AnalysisView, StatisticsView, MetricCard |
| 30.12.2025 | ✅ Extensions: View+LiquidGlass с iOS 26 стилями |
| 30.12.2025 | ✅ Главные файлы: ContentView с TabView, jEtApp с ModelContainer |
| 30.12.2025 | ✅ Исправлен NSCameraUsageDescription (INFOPLIST_KEY) |
| 30.12.2025 | ✅ Добавлена поддержка iOS Simulator с заглушкой камеры |
| 30.12.2025 | ✅ Приложение успешно запускается и работает |
| 06.01.2026 | ✅ Добавлен FullHistoryView, удаление данных, экспорт JSON |
| 06.01.2026 | ✅ Исправлен CameraService (concurrency) и build errors |
| 06.01.2026 | ✅ Успешный билд и деплой на iPhone 16 |
- Создать структуру папок
- Реализовать SwiftData модели
- Создать CameraService
- Реализовать FaceAnalyzer с Vision
- Построить Camera UI
- Analysis UI с карточками метрик
- Statistics UI с Charts
- Скачать и конвертировать ML модель для кожи
- Добавить ARKit для точных измерений
- Протестировать в iOS Simulator
- Задеплоить на реальное устройство