Content Moderation SDK for Java を使用して、画像内のテキストを認識します。scenes パラメーターを ocr に設定して同期 OCR タスクを送信し、応答を解析して認識されたテキストを抽出します。
ユースケース
本人確認:オンボーディング中に ID カードやパスポートからテキストを抽出し、ユーザーの本人確認を行います。
コンテンツフィルタリング:ユーザーがアップロードした画像に埋め込まれた不適切または禁止されたテキストを検出します。
データ入力の自動化:レシート、フォーム、またはラベルから構造化されたテキストを解析し、手動入力を削減します。
ナンバープレート認識:交通カメラや防犯カメラの画像から車両のナンバープレート番号を抽出します。
前提条件
開始する前に、以下が完了していることを確認してください。
Java 依存関係がインストールされていること。必要な Java バージョンについては、「インストール」をご参照ください。異なるバージョンを使用すると、操作の呼び出しが失敗します。
(ローカル画像またはバイナリ画像ストリームの場合) `Extension.Uploader` ユーティリティクラスがダウンロードされ、プロジェクトにインポートされていること。
Alibaba Cloud アカウントの認証情報ではなく、RAM ユーザーの AccessKey ID と AccessKey Secret を使用してください。認証情報はソースコードにハードコーディングするのではなく、環境変数に保存してください。
同期 OCR タスクの送信
ImageSyncScanRequest は同期 OCR タスクを送信します。scenes パラメーターを ocr に設定して、画像内のテキストを認識します。
サポートされているリージョン
| リージョン ID | ロケーション |
|---|---|
cn-shanghai | 中国 (上海) |
cn-beijing | 中国 (北京) |
cn-shenzhen | 中国 (深セン) |
ap-southeast-1 | シンガポール |
仕組み
リージョンと認証情報でクライアントを初期化します。
scenesを["ocr"]に設定し、画像ごとに 1 つのタスクオブジェクトを持つImageSyncScanRequestを構築します。doAction()を呼び出して、リクエストを同期的に送信します。応答を解析します:トップレベルの
codeを確認し、dataを反復処理し、各タスク結果でsuggestionとsceneを確認します。
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.green.model.v20180509.ImageSyncScanRequest;
import com.aliyuncs.http.FormatType;
import com.aliyuncs.http.HttpResponse;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.http.ProtocolType;
import com.aliyuncs.profile.DefaultProfile;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
// クライアントを初期化します。環境変数から認証情報をロードします。
DefaultProfile profile = DefaultProfile.getProfile(
"cn-shanghai",
System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),
System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
DefaultProfile.addEndpoint("cn-shanghai", "Green", "green.cn-shanghai.aliyuncs.com");
IAcsClient client = new DefaultAcsClient(profile);
ImageSyncScanRequest imageSyncScanRequest = new ImageSyncScanRequest();
imageSyncScanRequest.setAcceptFormat(FormatType.JSON);
imageSyncScanRequest.setMethod(MethodType.POST);
imageSyncScanRequest.setEncoding("utf-8");
imageSyncScanRequest.setProtocol(ProtocolType.HTTP);
JSONObject httpBody = new JSONObject();
// 画像内のテキストを認識するために、scenes を "ocr" に設定します。
httpBody.put("scenes", Arrays.asList("ocr"));
// 画像ごとに 1 つのタスクを作成します。1 つのリクエストで複数の画像を送信すると、
// 平均応答時間が増加します。合計時間はリクエストの開始から
// 最後の画像が処理されるまでです。
JSONObject task = new JSONObject();
task.put("dataId", UUID.randomUUID().toString());
task.put("url", "https://example.com/xxx.jpg"); // ご利用の画像 URL に置き換えてください
httpBody.put("tasks", Arrays.asList(task));
imageSyncScanRequest.setHttpContent(
org.apache.commons.codec.binary.StringUtils.getBytesUtf8(httpBody.toJSONString()),
"UTF-8",
FormatType.JSON);
// タイムアウトを設定します。サーバーは各画像モデレーションリクエストを最大 10 秒で処理します。
// 10 秒未満の読み取りタイムアウトは、タイムアウトエラーを引き起こす可能性があります。
imageSyncScanRequest.setConnectTimeout(3000);
imageSyncScanRequest.setReadTimeout(10000);
HttpResponse httpResponse = null;
try {
httpResponse = client.doAction(imageSyncScanRequest);
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
if (httpResponse != null && httpResponse.isSuccess()) {
JSONObject scrResponse = JSON.parseObject(
org.apache.commons.codec.binary.StringUtils.newStringUtf8(httpResponse.getHttpContent()));
System.out.println(JSON.toJSONString(scrResponse));
int requestCode = scrResponse.getIntValue("code");
JSONArray taskResults = scrResponse.getJSONArray("data");
if (200 == requestCode) {
for (Object taskResult : taskResults) {
int taskCode = ((JSONObject) taskResult).getIntValue("code");
JSONArray sceneResults = ((JSONObject) taskResult).getJSONArray("results");
if (200 == taskCode) {
for (Object sceneResult : sceneResults) {
String scene = ((JSONObject) sceneResult).getString("scene");
String suggestion = ((JSONObject) sceneResult).getString("suggestion");
// suggestion が "review" で scene が "ocr" の場合、応答には
// 画像から認識されたテキストを含む idCardInfo が含まれます。
if ("review".equals(suggestion) && "ocr".equals(scene)) {
JSONObject idCardInfo = ((JSONObject) sceneResult).getJSONObject("idCardInfo");
System.out.println(idCardInfo.toJSONString());
}
}
} else {
// 個々の画像タスクが失敗しました。詳細についてはタスクの応答を確認してください。
System.out.println("Task failed. Response: " + JSON.toJSONString(taskResult));
}
}
} else {
// リクエスト全体が失敗しました。エラーの詳細については応答を確認してください。
System.out.println("Request failed. Response: " + JSON.toJSONString(scrResponse));
}
}
}
}リクエストパラメーター
| パラメーター | 型 | 説明 |
|---|---|---|
scenes | 配列 | モデレーションシナリオ。テキスト認識の場合は ["ocr"] に設定します。 |
dataId | 文字列 | 一意のタスク識別子。UUID.randomUUID().toString() を使用して生成します。 |
url | 文字列 | モデレーション対象の画像へのパブリックにアクセス可能な URL。 |
応答構造
応答は、以下のトップレベルフィールドを持つ JSON オブジェクトです:
| フィールド | 型 | 説明 |
|---|---|---|
code | 整数 | リクエストの状態コード。200 は成功を示します。 |
data | 配列 | 送信された画像ごとに 1 つのタスク結果の配列。 |
data 内の各要素には以下が含まれます:
| フィールド | 型 | 説明 |
|---|---|---|
code | 整数 | タスクの状態コード。200 は画像が正常に処理されたことを示します。 |
results | 配列 | シーン結果の配列。 |
results 内の各要素には以下が含まれます:
| フィールド | 型 | 説明 |
|---|---|---|
scene | 文字列 | モデレーションシナリオ。OCR タスクの場合は ocr を返します。 |
suggestion | 文字列 | モデレーション結果。有効な値:pass、review、block。 |
idCardInfo | オブジェクト | 画像から認識されたテキスト。suggestion が review で scene が ocr の場合に返されます。 |
注意事項
画像ごとに 1 つのタスク:画像ごとに個別のタスクオブジェクトを作成してください。1 つのリクエストで複数の画像を送信すると、合計応答時間が長くなります。サーバーはすべての画像を処理してから結果を返します。
タイムアウト:読み取りタイムアウトを少なくとも 10,000 ms (10 秒) に設定してください。サーバーは単一の画像モデレーションリクエストの処理に最大 10 秒かかる場合があります。
ローカル画像:ローカル画像またはバイナリ画像ストリームを送信するには、リクエストを送信する前に `Extension.Uploader` ユーティリティクラスをダウンロードしてインポートしてください。
認証情報:コード内で認証情報を公開しないように、AccessKey ID と AccessKey Secret を環境変数 (
ALIBABA_CLOUD_ACCESS_KEY_IDおよびALIBABA_CLOUD_ACCESS_KEY_SECRET) からロードしてください。
次のステップ
インストール — Content Moderation SDK for Java をセットアップします。