モデル選択とロード
- iOS: LoadModel.swift / MainView.swift
- Android: MainActivity.java
モデルのアスペクト比を用いて OCR 結果の描画範囲を決定するため、OCR 画面に遷移する前にモデルのロードを行うことを推奨します。
1. EdgeVisionAPI の初期化
モデルディレクトリのパスを指定して EdgeVisionAPI を初期化します。
- iOS (Swift)
- Android (Java)
import EdgeOCRSwift
let modelPath = Bundle.main.path(forResource: "models", ofType: "")!
let edgeOCR = try ModelBuilder().fromPath(modelPath).build()
import com.nefrock.edgeocr.EdgeVisionAPI;
EdgeVisionAPI api = new EdgeVisionAPI.Builder(context)
.fromAssets("models")
.build();
2. モデルの選択
availableModels() で使用可能なモデル一覧を取得し、UID を指定してモデルを選択します。
- iOS (Swift)
- Android (Java)
var model: Model?
for candidate in edgeOCR.availableModels() {
if candidate.getUID() == "model-d320x320" {
model = candidate
}
}
Model model = null;
for (Model candidate : api.availableModels()) {
if (candidate.getUID().equals("model-large")) {
model = candidate;
break;
}
}
利用可能なモデル
使用可能なモデルはモデルフォルダ内の models.json を参照してください。指定できるモデルは EdgeOCR エンジンのバージョンによって異なります。
一般的なモデルのモデル名には model-d{width}x{height} のようにモデルの解像度が含まれています。解像度が高いほど精度が向上しますが、処理速度が低下します。ユースケースやデバイスのスペックに合わせて選択してください。
| モデル UID | 用途 |
|---|---|
model-d256x64 | テキスト認識(低解像度・高速) |
model-d256x128 | テキスト認識 |
model-d320x160 | テキスト認識 |
model-d320x320 | テキスト認識(標準) |
model-d640x640 | テキスト認識(高解像度・高精度) |
model-d{width}x{height}_with_barcode | テキスト認識 + バーコード認識 |
edgeocr_barcode_default | バーコード認識 |
テキスト認識とバーコード認識を同時に行いたい場合は、model-d{width}x{height}_with_barcode(例: model-d320x320_with_barcode)を指定してください。テキスト専用モデルや edgeocr_barcode_default ではどちらか一方のみの認識となります。
カスタマイズしたモデルを利用する場合も同様に UID を指定します。
3. モデルのロード
useModel でモデルをロードします。第2引数に ModelSettings を渡すことで、検出フィルタや TextMapper などの設定を行えます。
- iOS (Swift)
- Android (Java)
let modelSettings = ModelSettings()
let modelInfo = try await edgeOCR.useModel(model, settings: modelSettings)
// モデルのアスペクト比を取得(OCR 結果の描画に使用)
let aspectRatio = modelInfo.getAspectRatio()
ModelSettings modelSettings = new ModelSettings();
api.useModel(model, modelSettings,
modelInformation -> {
// ロード成功 — アスペクト比を取得して画面遷移
double aspectRatio = modelInformation.getAspectRatio();
startActivity(intent);
},
edgeError -> {
// ロード失敗
Toast.makeText(context, edgeError.getMessage(), Toast.LENGTH_LONG).show();
}
);
実装例
アプリ起動時やボタンタップ時にモデルをロードし、完了後に OCR 画面へ遷移するパターンです。
- iOS (Swift)
- Android (Java)
func loadModelAndNavigate(
destination: EdgeOCRSampleKind,
uid: String = "model-d320x320",
modelSettings: ModelSettings = ModelSettings()
) {
Task {
isLoading = true
do {
let info = try await loadModel(
path: modelPath, uid: uid, modelSettings: modelSettings)
aspectRatio = info!.getAspectRatio()
path.append(destination)
} catch {
showModelAlert = true
modelAlertContent = "失敗\n" + error.localizedDescription
}
isLoading = false
}
}
サンプルアプリでは EdgeOCRSample/Models/LoadModel/LoadModel.swift と EdgeOCRSample/Views/Main/MainView.swift に実装されています。
private void loadModelAndStartActivity(Intent intent, ModelSettings modelSettings) {
runOnUiThread(() ->
findViewById(R.id.progressLayout).setVisibility(View.VISIBLE));
EdgeVisionAPI api;
try {
api = new EdgeVisionAPI.Builder(this).fromAssets("models").build();
} catch (EdgeError e) {
Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
return;
}
Model model = null;
for (Model candidate : api.availableModels()) {
if (candidate.getUID().equals("model-large")) {
model = candidate;
break;
}
}
if (model == null) {
Toast.makeText(this, "モデルが見つかりません", Toast.LENGTH_LONG).show();
return;
}
api.useModel(model, modelSettings,
modelInformation -> {
intent.putExtra("model_aspect_ratio",
modelInformation.getAspectRatio());
startActivity(intent);
},
edgeError -> Toast.makeText(this,
edgeError.getMessage(), Toast.LENGTH_LONG).show()
);
}
サンプルアプリでは app/src/main/java/com/nefrock/edgeocr_example/MainActivity.java に実装されています。
GPU モデルのロード時間について
GPU を使用するモデルは、初回のロード時のみ数秒かかります。ローエンドのデバイスほど時間がかかる傾向があります。 2 回目以降のロードは高速に処理され、アプリを削除しない限りロードに数秒かかることはありません。