Skip to content

Commit

Permalink
```优化:提升模型加载和错误处理
Browse files Browse the repository at this point in the history
重构模型加载逻辑,以提高效率并增强错误处理。在AI扫描页面和YOLOv8检测器中实施。更新Firebase Crashlytics集成,以记录更详细的错误信息。主入口文件中的错误记录也得到了改进。

-统一GPU委托的使用,以提高模型加载效率。
- 改进错误记录,包括堆栈跟踪,方便问题追踪。
- 删除无效的Firebase Crashlytics记录方法。

Optimization: Improve model loading and error handling

Refactor the model loading logic to improve efficiency and enhance error handling. Implemented in AI scan page and YOLOv8 detector. Updated the Firebase Crashlytics integration to log more detailed error information. Error logging in the main entry file has also been improved.

- Unify the use of GPU delegates to improve model loading efficiency.
- Improved error logging, including stack tracing, to facilitate problem tracking.
- Delete invalid Firebase Crashlytics logging methods.

```
  • Loading branch information
einsitang committed Aug 20, 2024
1 parent afda1cd commit 05acb14
Show file tree
Hide file tree
Showing 4 changed files with 61 additions and 10 deletions.
3 changes: 2 additions & 1 deletion lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,8 @@ class MyApp extends StatelessWidget {
}
if (snapshot.hasError) {
log.w("here is builder future throws error you should see it");
log.w(snapshot.error);
final e = snapshot.error as Error;
log.w(snapshot.error, stackTrace: e.stackTrace);
}
SudokuState sudokuState = snapshot.data ?? SudokuState();
BootstrapPage bootstrapPage = BootstrapPage(title: "Loading");
Expand Down
45 changes: 37 additions & 8 deletions lib/ml/yolov8/yolov8_detector.dart
Original file line number Diff line number Diff line change
Expand Up @@ -44,14 +44,9 @@ class YoloV8Detector extends Predictor<YoloV8Input, YoloV8Output> {
/// int8 quantitative model seem not enough validation,not recommend to use
@deprecated bool enableInt8Quantize = false,
}) async {
// default enable GPU
final options = InterpreterOptions();
if (Platform.isAndroid) {
options.addDelegate(GpuDelegateV2());
} else {
options.addDelegate(GpuDelegate());
}
var interpreter = await Interpreter.fromAsset(modelPath, options: options);

var interpreter = await _buildInterpreterFromAsset(modelPath);
// var interpreter = await Interpreter.fromAsset(modelPath, options: options);

String yamlContent = await rootBundle.loadString(metadataPath);
var metadata = loadYaml(yamlContent);
Expand Down Expand Up @@ -284,4 +279,38 @@ class YoloV8Detector extends Predictor<YoloV8Input, YoloV8Output> {
YoloV8Output predict(YoloV8Input input) {
return _predict(input);
}

static _buildInterpreterFromAsset(String modelPath) async {
// default enable GPU
var interpreter = null;
final delegates = [];
if (Platform.isAndroid) {
delegates.add(GpuDelegateV2());
delegates.add(XNNPackDelegate());
} else {
delegates.add(GpuDelegate());
}

// try to use gpu delegate , but didn't know device support delegate
final delegateIterator = delegates.iterator;
while (delegateIterator.moveNext()) {
final gpuDelegate = delegateIterator.current;
final options = InterpreterOptions()..addDelegate(gpuDelegate);
try {
log.i("use gpu delegate: $gpuDelegate");
interpreter = await Interpreter.fromAsset(modelPath, options: options);
break;
} catch (_) {
// seem not support gpu delegate , change one
log.w("use gpu delegate: $gpuDelegate failure");
}
}

if (interpreter == null) {
// interpreter without gpu delegate
interpreter = await Interpreter.fromAsset(modelPath);
}

return interpreter;
}
}
7 changes: 6 additions & 1 deletion lib/page/ai_scan.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import 'dart:math';
import 'dart:ui' as ui;

import 'package:camera/camera.dart';
import 'package:firebase_crashlytics/firebase_crashlytics.dart';
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/sudoku_localizations.dart';
import 'package:image/image.dart' as img;
Expand All @@ -13,6 +14,8 @@ import 'package:sudoku/ml/yolov8/yolov8_output.dart';
import 'package:sudoku/page/ai_detection.dart';
import 'package:sudoku/util/image_util.dart';

import '../util/crashlytics_util.dart';

final Logger log = Logger();

class AIScanPage extends StatefulWidget {
Expand Down Expand Up @@ -220,7 +223,9 @@ class AIScanPageState extends State<AIScanPage> {
),
);
} catch (e) {
log.e(e);
e as Error;
log.e(e, stackTrace: e.stackTrace);
CrashlyticsUtil.recordError(e, e.stackTrace);
}
}

Expand Down
16 changes: 16 additions & 0 deletions lib/util/crashlytics_util.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import 'package:firebase_crashlytics/firebase_crashlytics.dart';
import 'package:logger/logger.dart';
import 'package:sudoku/constant.dart';

Logger log = Logger();

class CrashlyticsUtil {
static void recordError(dynamic error, dynamic stackTrace) {
if (!Constant.enableGoogleFirebase) {
log.w("not enable google firebase crashlytics service");
log.w(error, stackTrace: stackTrace);
return;
}
FirebaseCrashlytics.instance.recordError(error, stackTrace);
}
}

0 comments on commit 05acb14

Please sign in to comment.