fix(ai-export): strip photo metadata and minimize the training payload

This commit is contained in:
qlionbleusam
2026-08-29 09:39:31 +02:00
parent eeb857d452
commit 0ab9043d82
6 changed files with 122 additions and 33 deletions
+6 -3
View File
@@ -239,12 +239,15 @@ class AnalysisProvider extends ChangeNotifier {
}
/// Exporte l'image et le json vers le backend IA.
/// [sessionId], [distance] et [weapon] proviennent du SessionProvider de
/// [sessionId], [distance] et [caliber] proviennent du SessionProvider de
/// l'écran appelant, pour que le dataset contienne les vraies métadonnées.
///
/// Le nom de l'arme n'est volontairement pas transmis : il est souvent
/// personnalisé par l'utilisateur et n'apporte rien au modèle de détection.
Future<AiExportResult> exportToAiBackend({
String? sessionId,
int? distance,
String? weapon,
String? caliber,
}) async {
if (_imagePath == null || _targetType == null) {
_errorMessage = "Impossible d'exporter : image ou type de cible manquant.";
@@ -269,7 +272,7 @@ class AnalysisProvider extends ChangeNotifier {
targetRadius: _targetRadius,
shots: _shots,
distanceMeters: distance ?? 25,
weaponName: weapon ?? 'Unknown',
caliber: caliber ?? 'unknown',
);
_state = AnalysisState.success;
+1 -1
View File
@@ -942,7 +942,7 @@ class _AnalysisScreenContentState extends State<_AnalysisScreenContent> {
exportResult = await provider.exportToAiBackend(
sessionId: sessionProvider.activeSessionId,
distance: sessionProvider.distance,
weapon: sessionProvider.currentWeapon,
caliber: sessionProvider.currentWeaponCaliber,
);
messenger.hideCurrentSnackBar();
}
+9 -1
View File
@@ -6,6 +6,7 @@ class SessionProvider extends ChangeNotifier {
DateTime? get sessionDate => _sessionDate;
String? _currentWeaponName;
String? _currentWeaponId;
String? _currentWeaponCaliber;
int _shotsPerTarget = 5;
int _distance = 25;
String? _activeSessionId;
@@ -14,6 +15,11 @@ class SessionProvider extends ChangeNotifier {
String? get currentWeapon => _currentWeaponName;
String? get currentWeaponId => _currentWeaponId;
/// Calibre de l'arme de la session. Contrairement au nom d'arme, il ne
/// designe pas l'utilisateur : c'est la seule donnee d'arme envoyee au
/// backend d'entrainement (le diametre des trous en depend).
String? get currentWeaponCaliber => _currentWeaponCaliber;
int get shotsPerTarget => _shotsPerTarget;
int get distance => _distance;
bool get isSessionActive => _isSessionActive;
@@ -23,9 +29,10 @@ class SessionProvider extends ChangeNotifier {
int get totalSessionScore => _currentAnalyses.fold(0, (sum, a) => sum + a.totalScore);
int get targetCount => _currentAnalyses.length;
void startSession(String weaponName, int shots, String sessionId, {String? weaponId, int distance = 25, DateTime? date}) {
void startSession(String weaponName, int shots, String sessionId, {String? weaponId, String? caliber, int distance = 25, DateTime? date}) {
_currentWeaponName = weaponName;
_currentWeaponId = weaponId;
_currentWeaponCaliber = caliber;
_shotsPerTarget = shots;
_distance = distance;
_sessionDate = date ?? DateTime.now();
@@ -45,6 +52,7 @@ class SessionProvider extends ChangeNotifier {
_activeSessionId = null;
_currentWeaponId = null;
_currentWeaponName = null;
_currentWeaponCaliber = null;
_currentAnalyses.clear();
_distance = 25;
notifyListeners();
@@ -140,6 +140,7 @@ class _SessionSetupScreenState extends State<SessionSetupScreen> {
_shotsPerTarget,
sessionId,
weaponId: _selectedWeapon!.id,
caliber: _selectedWeapon!.caliber,
distance: _distance,
date: _selectedDate,
);