すべてのプロダクト
Search
ドキュメントセンター

Content Moderation:画像モデレーション

最終更新日:Jan 08, 2025

このトピックでは、Java 用 Content Moderation SDK を使用して、画像に危険なコンテンツが含まれていないかどうかをモデレートする方法について説明します。

説明

PHP 用 Content Moderation SDK は、同期画像モデレーションと非同期画像モデレーションの両方をサポートしています。

  • 同期画像モデレーションを使用する場合、モデレーション結果はリアルタイムで返されます。 関連パラメータの詳細については、/green/image/scan をご参照ください。

  • 非同期画像モデレーションを使用する場合は、モデレーション結果をポーリングするか、コールバック通知を設定してモデレーション結果を受信する必要があります。 関連パラメータの詳細については、/green/image/asyncscan and /green/image/results をご参照ください。

前提条件

  • Java の依存関係がインストールされていること。 詳細については、インストール をご参照ください。

    説明

    インストール トピックに記載されている Java バージョンを使用して依存関係をインストールする必要があります。 そうしないと、後続の操作呼び出しが失敗します。

  • ローカル画像またはバイナリ画像ストリームを画像モデレーションに送信する場合は、Extension.Uploader ユーティリティクラス をダウンロードしてプロジェクトにインポートします。

(推奨)同期画像モデレーションタスクを送信する

操作

説明

サポートされているリージョン

ImageSyncScanRequest

わいせつ物、テロコンテンツ、広告、QRコード、好ましくないシーン、ロゴ検出など、複数のモデレーションシナリオで危険なコンテンツの画像をモデレートするために、同期リクエストを送信します。

  • 中国(上海)

  • 中国(北京)

  • 中国(深圳)

  • シンガポール

サンプルコード

  • オンライン画像の URL を画像モデレーションに送信する

    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.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 com.aliyuncs.profile.IClientProfile;
    
    import java.util.*;
    
    public class Main {
    
        public static void main(String[] args) throws Exception {
            // Alibaba Cloud アカウントの AccessKey ペアには、すべての API 操作に対する権限があります。 セキュリティリスクを回避するために、RAM ユーザーを使用して API 操作を呼び出したり、日常的な O&M を実行することをお勧めします。
            // 環境変数を取得する一般的な方法:
            // 方法 1:
            //     RAM ユーザーの AccessKey ID を取得します:System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
            //     RAM ユーザーの AccessKey シークレットを取得します:System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
            // 方法 2:
            //     RAM ユーザーの AccessKey ID を取得します:System.getProperty("ALIBABA_CLOUD_ACCESS_KEY_ID");
            //     RAM ユーザーの AccessKey シークレットを取得します:System.getProperty("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
            DefaultProfile profile = DefaultProfile.getProfile(
                    "cn-shanghai",
                    "環境変数から RAM ユーザーの AccessKey ID を取得することをお勧めします",
                    "環境変数から RAM ユーザーの AccessKey シークレットを取得することをお勧めします");
            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");
            // HTTP と HTTPS の両方がサポートされています。
            imageSyncScanRequest.setProtocol(ProtocolType.HTTP);
    
            JSONObject httpBody = new JSONObject();
            // モデレーションシナリオを指定します。 システムは、指定したモデレーションシナリオに基づいて課金します。
            // 一度に複数の画像をモデレートするためのリクエストを送信し、画像ごとに複数のモデレーションシナリオを指定できます。 すべてのシナリオの費用は個別に計算され、合計されます。
            // たとえば、わいせつ物とテロコンテンツの両方について 2 つの画像をモデレートする場合、わいせつ物について 2 つの画像をモデレートし、テロコンテンツについて 2 つの画像をモデレートするための料金が請求されます。
            // scenes パラメータでは、porn の値はサーバーがわいせつ物を検出することを示します。
            httpBody.put("scenes", Arrays.asList("porn"));
    
            // モデレートする画像ごとにタスクを作成します。
            // リクエストで複数の画像をモデレートする場合、サーバーがリクエストの処理に費やす合計レスポンス時間は、リクエストが開始されたときに開始し、最後の画像のモデレーション時に終了します。
            // 一般に、リクエストで複数の画像をモデレートする場合の平均レスポンス時間は、単一の画像をモデレートする場合よりも長くなります。 一度に送信する画像が多いほど、平均レスポンス時間が長くなる可能性が高くなります。
            // この例では、単一の画像がモデレートされます。 一度に複数の画像をモデレートする場合は、モデレートする画像ごとにタスクを作成します。
            JSONObject task = new JSONObject();
            task.put("dataId", UUID.randomUUID().toString());
    
            // 画像の URL を指定します。 URL には特殊文字が含まれているため、エンコードする必要があります。
            task.put("url", "http://www.aliyundoc.com/xxx.test.jpg");
            task.put("time", new Date());
            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 (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, true));
                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");
                                // scene パラメータと suggestion パラメータの値に基づいて、さらなるアクションを実行します。
                                // suggestion パラメータのさまざまな値に基づいて、画像に対してさまざまな操作を実行します。 たとえば、好ましくないコンテンツを含む画像を削除します。
                                System.out.println("scene = [" + scene + "]");
                                System.out.println("suggestion = [" + suggestion + "]");
                            }
                        } else {
                            // 単一画像のモデレーションに失敗しました。 実際の状況に基づいて障害を分析します。
                            System.out.println("task process fail. task response:" + JSON.toJSONString(taskResult));
                        }
                    }
                } else {
                    // リクエストの処理に失敗しました。 実際の状況に基づいて障害を分析します。
                    System.out.println("the whole image scan request failed. response:" + JSON.toJSONString(scrResponse));
                }
            }
        }
    
    }
  • ローカル画像の URL を画像モデレーションに送信する

    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.green.extension.uploader.ClientUploader;
    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 com.aliyuncs.profile.IClientProfile;
    
    import java.util.*;
    
    public class Main {
    
        public static void main(String[] args) throws Exception {
            // Alibaba Cloud アカウントの AccessKey ペアには、すべての API 操作に対する権限があります。 セキュリティリスクを回避するために、RAM ユーザーを使用して API 操作を呼び出したり、日常的な O&M を実行することをお勧めします。
            // 環境変数を取得する一般的な方法:
            // 方法 1:
            //     RAM ユーザーの AccessKey ID を取得します:System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
            //     RAM ユーザーの AccessKey シークレットを取得します:System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
            // 方法 2:
            //     RAM ユーザーの AccessKey ID を取得します:System.getProperty("ALIBABA_CLOUD_ACCESS_KEY_ID");
            //     RAM ユーザーの AccessKey シークレットを取得します:System.getProperty("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
            DefaultProfile profile = DefaultProfile.getProfile(
                    "cn-shanghai",
                    "環境変数から RAM ユーザーの AccessKey ID を取得することをお勧めします",
                    "環境変数から RAM ユーザーの AccessKey シークレットを取得することをお勧めします");
            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");
            // HTTP と HTTPS の両方がサポートされています。
            imageSyncScanRequest.setProtocol(ProtocolType.HTTP);
    
    
            JSONObject httpBody = new JSONObject();
            // モデレーションシナリオを指定します。 システムは、指定したモデレーションシナリオに基づいて課金します。
            // 一度に複数の画像をモデレートするためのリクエストを送信し、画像ごとに複数のモデレーションシナリオを指定できます。 すべてのシナリオの費用は個別に計算され、合計されます。
            // たとえば、わいせつ物とテロコンテンツの両方について 2 つの画像をモデレートする場合、わいせつ物について 2 つの画像をモデレートし、テロコンテンツについて 2 つの画像をモデレートするための料金が請求されます。
            // scenes パラメータでは、porn の値はサーバーがわいせつ物を検出することを示します。
            httpBody.put("scenes", Arrays.asList("porn"));
    
            // ローカル画像をモデレートする場合は、次のコードスニペットを使用して、画像のストレージパスに基づいて URL を生成します。
            // 次に、生成された画像の URL をサーバーに送信します。
            String url = null;
            ClientUploader clientUploader = ClientUploader.getImageClientUploader(profile, false);
            try{
                url = clientUploader.uploadFile("d:/test.jpg");
            }catch (Exception e){
                e.printStackTrace();
            }
    
            // モデレートする画像ごとにタスクを作成します。
            // リクエストで複数の画像をモデレートする場合、サーバーがリクエストの処理に費やす合計レスポンス時間は、リクエストが開始されたときに開始し、最後の画像のモデレーション時に終了します。
            // 一般に、リクエストで複数の画像をモデレートする場合の平均レスポンス時間は、単一の画像をモデレートする場合よりも長くなります。 一度に送信する画像が多いほど、平均レスポンス時間が長くなる可能性が高くなります。
            // この例では、単一の画像がモデレートされます。 一度に複数の画像をモデレートする場合は、モデレートする画像ごとにタスクを作成します。
            JSONObject task = new JSONObject();
            task.put("dataId", UUID.randomUUID().toString());
    
            // url パラメータを、サーバーに送信される画像の URL に設定します。 URL には特殊文字が含まれているため、エンコードする必要があります。
            task.put("url", url);
            task.put("time", new Date());
            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 (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, true));
                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");
                                // scene パラメータと suggestion パラメータの値に基づいて、さらなるアクションを実行します。
                                // suggestion パラメータのさまざまな値に基づいて、画像に対してさまざまな操作を実行します。 たとえば、好ましくないコンテンツを含む画像を削除します。
                                System.out.println("scene = [" + scene + "]");
                                System.out.println("suggestion = [" + suggestion + "]");
                            }
                        } else {
                            // 単一画像のモデレーションに失敗しました。 実際の状況に基づいて障害を分析します。
                            System.out.println("task process fail. task response:" + JSON.toJSONString(taskResult));
                        }
                    }
                } else {
                    // リクエストの処理に失敗しました。 実際の状況に基づいて障害を分析します。
                    System.out.println("the whole image scan request failed. response:" + JSON.toJSONString(scrResponse));
                }
            }
        }
    
    }
  • バイナリ画像ストリームを画像モデレーションに送信する

    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.green.extension.uploader.ClientUploader;
    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 com.aliyuncs.profile.IClientProfile;
    import org.apache.commons.io.FileUtils;
    
    import java.io.File;
    import java.util.*;
    
    public class Main {
    
        public static void main(String[] args) throws Exception {
            // Alibaba Cloud アカウントの AccessKey ペアは、すべての API 操作へのアクセスに使用できます。 セキュリティの問題を防ぐために、RAM ユーザーを使用して API 操作にアクセスし、日常的な O&M を実行することをお勧めします。
            // 環境変数を取得する一般的な方法:
            // 方法 1:
            //     RAM ユーザーの AccessKey ID を取得します:System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
            //     RAM ユーザーの AccessKey シークレットを取得します:System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
            // 方法 2:
            //     RAM ユーザーの AccessKey ID を取得します:System.getProperty("ALIBABA_CLOUD_ACCESS_KEY_ID");
            //     RAM ユーザーの AccessKey シークレットを取得します:System.getProperty("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
            DefaultProfile profile = DefaultProfile.getProfile(
                    "cn-shanghai",
                    "環境変数から RAM ユーザーの AccessKey ID を取得することをお勧めします",
                    "環境変数から RAM ユーザーの AccessKey シークレットを取得することをお勧めします");
            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");
            // HTTP と HTTPS の両方がサポートされています。
            imageSyncScanRequest.setProtocol(ProtocolType.HTTP);
    
    
            JSONObject httpBody = new JSONObject();
            // モデレーションシナリオを指定します。 システムは、指定したモデレーションシナリオに基づいて課金します。
            // 一度に複数の画像をモデレートするためのリクエストを送信し、画像ごとに複数のモデレーションシナリオを指定できます。 すべてのシナリオの費用は個別に計算され、合計されます。
            // たとえば、わいせつ物とテロコンテンツの両方について 2 つの画像をモデレートする場合、わいせつ物について 2 つの画像をモデレートし、テロコンテンツについて 2 つの画像をモデレートするための料金が請求されます。
            // scenes パラメータでは、porn の値はサーバーがわいせつ物を検出することを示します。
            httpBody.put("scenes", Arrays.asList("porn"));
    
            // ローカル画像をモデレートする場合は、次のコードスニペットを使用して、画像のストレージパスに基づいて URL を生成します。
            // 次に、生成された画像の URL をサーバーに送信します。
            ClientUploader clientUploader = ClientUploader.getImageClientUploader(profile, false);
            byte[] imageBytes = null;
            String url = null;
            try{
                // ローカル画像を読み取ってバイナリデータに変換し、モデレーションのためにバイナリデータを送信します。 実際のコードでは、画像のバイナリデータを直接使用します。
                imageBytes = FileUtils.readFileToByteArray(new File("/Users/01fb4ab6420b5f34623e13b82b51ef87.jpg"));
                // バイナリ ストリームをサーバーにアップロードします。
                url = clientUploader.uploadBytes(imageBytes);
            }catch (Exception e){
                e.printStackTrace();
                throw e;
            }
    
            // モデレートする画像ごとにタスクを作成します。
            // リクエストで複数の画像をモデレートする場合、サーバーがリクエストの処理に費やす合計レスポンス時間は、リクエストが開始されたときに開始し、最後の画像のモデレーション時に終了します。
            // 一般に、リクエストで複数の画像をモデレートする場合の平均レスポンス時間は、単一の画像をモデレートする場合よりも長くなります。 一度に送信する画像が多いほど、平均レスポンス時間が長くなる可能性が高くなります。
            // この例では、単一の画像がモデレートされます。 一度に複数の画像をモデレートする場合は、モデレートする画像ごとにタスクを作成します。
            JSONObject task = new JSONObject();
            task.put("dataId", UUID.randomUUID().toString());
    
            // url パラメータを、サーバーに送信される画像の URL に設定します。 URL には特殊文字が含まれているため、エンコードする必要があります。
            task.put("url", url);
            task.put("time", new Date());
            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 (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, true));
                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");
                                // scene パラメータと suggestion パラメータの値に基づいて、さらなるアクションを実行します。
                                // suggestion パラメータのさまざまな値に基づいて、画像に対してさまざまな操作を実行します。 たとえば、好ましくないコンテンツを含む画像を削除します。
                                System.out.println("scene = [" + scene + "]");
                                System.out.println("suggestion = [" + suggestion + "]");
                            }
                        } else {
                            // 単一画像のモデレーションに失敗しました。 実際の状況に基づいて障害を分析します。
                            System.out.println("task process fail. task response:" + JSON.toJSONString(taskResult));
                        }
                    }
                } else {
                    // リクエストの処理に失敗しました。 実際の状況に基づいて障害を分析します。
                    System.out.println("the whole image scan request failed. response:" + JSON.toJSONString(scrResponse));
                }
            }
        }
    
    }

非同期画像モデレーションタスクを送信する

このセクションでは、Java 用 Content Moderation SDK を使用して ImageAsyncScanRequest 操作を呼び出し、危険なコンテンツの画像をモデレートする方法について説明します。 非同期リクエストを送信して、画像モデレーションタスクを送信できます。 リクエストを送信するときに、callback パラメータを設定することで、モデレーション結果を受信するためのコールバック URL を指定できます。 また、Content Moderation が画像モデレーションタスクを処理した後に、ImageAsyncScanResultsRequest 操作を呼び出してモデレーション結果をポーリングすることもできます。

同期画像モデレーションを使用する場合と同じように、オンライン画像の URL、ローカル画像の URL、またはバイナリ画像ストリームを非同期画像モデレーションに送信できます。 この例では、オンライン画像の URL が使用されます。

操作

説明

サポートされているリージョン

ImageAsyncScanRequest

わいせつ物、テロコンテンツ、広告、QRコード、好ましくないシーン、ロゴ検出など、複数のモデレーションシナリオで危険なコンテンツの画像をモデレートするために、非同期リクエストを送信します。

  • 中国(上海)

  • 中国(北京)

  • 中国(深圳)

  • シンガポール

サンプルコード

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.green.model.v20180509.ImageAsyncScanRequest;
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 com.aliyuncs.profile.IClientProfile;

import java.util.Arrays;
import java.util.Date;
import java.util.UUID;

public class Main {

    public static void main(String[] args) throws Exception {
        // Alibaba Cloud アカウントの AccessKey ペアは、すべての API 操作へのアクセスに使用できます。 セキュリティの問題を防ぐために、RAM ユーザーを使用して API 操作にアクセスし、日常的な O&M を実行することをお勧めします。
        // 環境変数を取得する一般的な方法:
        // 方法 1:
        //     RAM ユーザーの AccessKey ID を取得します:System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
        //     RAM ユーザーの AccessKey シークレットを取得します:System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
        // 方法 2:
        //     RAM ユーザーの AccessKey ID を取得します:System.getProperty("ALIBABA_CLOUD_ACCESS_KEY_ID");
        //     RAM ユーザーの AccessKey シークレットを取得します:System.getProperty("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
        DefaultProfile profile = DefaultProfile.getProfile(
                "cn-shanghai",
                "環境変数から RAM ユーザーの AccessKey ID を取得することをお勧めします",
                "環境変数から RAM ユーザーの AccessKey シークレットを取得することをお勧めします");
        DefaultProfile.addEndpoint("cn-shanghai", "Green", "green.cn-shanghai.aliyuncs.com");
        // 注:インスタンス化されたクライアントはできるだけ再利用することをお勧めします。 これにより、モデレーションのパフォーマンスが向上し、クライアントの繰り返し接続が回避されます。
        IAcsClient client = new DefaultAcsClient(profile);

        ImageAsyncScanRequest imageAsyncScanRequest = new ImageAsyncScanRequest();
        // 操作のレスポンス形式を指定します。
        imageAsyncScanRequest.setAcceptFormat(FormatType.JSON);
        // リクエストメソッドを指定します。
        imageAsyncScanRequest.setMethod(MethodType.POST);
        imageAsyncScanRequest.setEncoding("utf-8");
        // HTTP と HTTPS の両方がサポートされています。
        imageAsyncScanRequest.setProtocol(ProtocolType.HTTP);


        JSONObject httpBody = new JSONObject();
        // モデレーションシナリオを指定します。 システムは、指定したモデレーションシナリオに基づいて課金します。
        // 一度に複数の画像をモデレートするためのリクエストを送信し、画像ごとに複数のモデレーションシナリオを指定できます。 すべてのシナリオの費用は個別に計算され、合計されます。
        // たとえば、わいせつ物とテロコンテンツの両方について 2 つの画像をモデレートする場合、わいせつ物について 2 つの画像をモデレートし、テロコンテンツについて 2 つの画像をモデレートするための料金が請求されます。
        // scenes パラメータでは、porn の値はサーバーがわいせつ物を検出することを示します。
        httpBody.put("scenes", Arrays.asList("porn"));
        httpBody.put("callback", "http://www.aliyundoc.com/xxx.json");
        httpBody.put("seed", "yourPersonalSeed");

        // モデレートする画像ごとにタスクを作成します。 一度に最大 50 枚の画像をモデレートできます。 この場合、50 個のタスクを作成する必要があります。
        // リクエストで複数の画像をモデレートする場合、サーバーがリクエストの処理に費やす合計レスポンス時間は、リクエストが開始されたときに開始し、最後の画像のモデレーション時に終了します。
        // 一般に、リクエストで複数の画像をモデレートする場合の平均レスポンス時間は、単一の画像をモデレートする場合よりも長くなります。 一度に送信する画像が多いほど、平均レスポンス時間が長くなる可能性が高くなります。
        // この例では、単一の画像がモデレートされます。 一度に複数の画像をモデレートする場合は、モデレートする画像ごとにタスクを作成します。
        JSONObject task = new JSONObject();
        task.put("dataId", UUID.randomUUID().toString());

        // 画像の URL を指定します。 URL には特殊文字が含まれているため、エンコードする必要があります。
        task.put("url", "http://www.aliyundoc.com/xxx.test.jpg");
        task.put("time", new Date());
        httpBody.put("tasks", Arrays.asList(task));

        imageAsyncScanRequest.setHttpContent(org.apache.commons.codec.binary.StringUtils.getBytesUtf8(httpBody.toJSONString()),
            "UTF-8", FormatType.JSON);

        // 接続タイムアウト期間と読み取りタイムアウト期間を指定します。 サーバーが画像モデレーションリクエストを完了するタイムアウト期間は 10 秒です。
        // 読み取りタイムアウトを 10 秒より短い期間に設定すると、リクエスト処理中にサーバーが読み取りタイムアウトエラーを生成する可能性があります。
        imageAsyncScanRequest.setConnectTimeout(3000);
        imageAsyncScanRequest.setReadTimeout(10000);
        HttpResponse httpResponse = null;
        try {
            httpResponse = client.doAction(imageAsyncScanRequest);
        } 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, true));
            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) {
                        // モデレーション結果のポーリングに使用するタスク ID を保存します。
                        System.out.println(((JSONObject)taskResult).getString("taskId"));
                    } else {
                        // 単一画像のモデレーションに失敗しました。 実際の状況に基づいて障害を分析します。
                        System.out.println("task process fail. task response:" + JSON.toJSONString(taskResult));
                    }
                }
            } else {
                // リクエストの処理に失敗しました。 実際の状況に基づいて障害を分析します。
                System.out.println("the whole image scan request failed. response:" + JSON.toJSONString(scrResponse));
            }
        }
    }
}

非同期画像モデレーションの結果を照会する

操作

説明

サポートされているリージョン

ImageAsyncScanResultsRequest

非同期画像モデレーションの結果を照会します。 複数の非同期画像モデレーションタスクのモデレーション結果を一度に照会できます。

  • 中国(上海)

  • 中国(北京)

  • 中国(深圳)

  • シンガポール

サンプルコード

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.ImageAsyncScanRequest;
import com.aliyuncs.green.model.v20180509.ImageAsyncScanResultsRequest;
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 com.aliyuncs.profile.IClientProfile;

import java.util.*;

public class Main {

    public static void main(String[] args) throws Exception {
        // Alibaba Cloud アカウントの AccessKey ペアは、すべての API 操作へのアクセスに使用できます。 セキュリティの問題を防ぐために、RAM ユーザーを使用して API 操作にアクセスし、日常的な O&M を実行することをお勧めします。
        // 環境変数を取得する一般的な方法:
        // 方法 1:
        //     RAM ユーザーの AccessKey ID を取得します:System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
        //     RAM ユーザーの AccessKey シークレットを取得します:System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
        // 方法 2:
        //     RAM ユーザーの AccessKey ID を取得します:System.getProperty("ALIBABA_CLOUD_ACCESS_KEY_ID");
        //     RAM ユーザーの AccessKey シークレットを取得します:System.getProperty("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
        DefaultProfile profile = DefaultProfile.getProfile(
                "cn-shanghai",
                "環境変数から RAM ユーザーの AccessKey ID を取得することをお勧めします",
                "環境変数から RAM ユーザーの AccessKey シークレットを取得することをお勧めします");
        DefaultProfile.addEndpoint("cn-shanghai", "Green", "green.cn-shanghai.aliyuncs.com");
        // 注:インスタンス化されたクライアントはできるだけ再利用することをお勧めします。 これにより、モデレーションのパフォーマンスが向上し、クライアントの繰り返し接続が回避されます。
        IAcsClient client = new DefaultAcsClient(profile);

        ImageAsyncScanResultsRequest imageAsyncScanResultsRequest = new ImageAsyncScanResultsRequest();
        // 操作のレスポンス形式を指定します。
        imageAsyncScanResultsRequest.setAcceptFormat(FormatType.JSON);
        // リクエストメソッドを指定します。
        imageAsyncScanResultsRequest.setMethod(MethodType.POST);
        imageAsyncScanResultsRequest.setEncoding("utf-8");
        // HTTP と HTTPS の両方がサポートされています。
        imageAsyncScanResultsRequest.setProtocol(ProtocolType.HTTP);


        List<String> taskIds = new ArrayList<String>();
        taskIds.add("img4hDosCHcrFk5jAMR80XWJN-1pZ@0p");
        imageAsyncScanResultsRequest.setHttpContent(JSON.toJSONString(taskIds).getBytes("UTF-8"), "UTF-8", FormatType.JSON);

        // 接続タイムアウト期間と読み取りタイムアウト期間を指定します。
        imageAsyncScanResultsRequest.setConnectTimeout(3000);
        imageAsyncScanResultsRequest.setReadTimeout(6000);

        try {
            HttpResponse httpResponse = client.doAction(imageAsyncScanResultsRequest);

            if(httpResponse.isSuccess()){
                JSONObject scrResponse = JSON.parseObject(new String(httpResponse.getHttpContent(), "UTF-8"));
                System.out.println(JSON.toJSONString(scrResponse, true));
                if (200 == scrResponse.getInteger("code")) {
                    JSONArray taskResults = scrResponse.getJSONArray("data");
                    for (Object taskResult : taskResults) {
                        if(200 == ((JSONObject)taskResult).getInteger("code")){
                            JSONArray sceneResults = ((JSONObject)taskResult).getJSONArray("results");
                            for (Object sceneResult : sceneResults) {
                                String scene = ((JSONObject)sceneResult).getString("scene");
                                String suggestion = ((JSONObject)sceneResult).getString("suggestion");
                                // scene パラメータと suggestion パラメータの値に基づいて、さらなるアクションを実行します。
                                // suggestion パラメータのさまざまな値に基づいて、画像に対してさまざまな操作を実行します。 たとえば、好ましくないコンテンツを含む画像を削除します。
                            }
                        }else{
                            System.out.println("task process fail:" + ((JSONObject)taskResult).getInteger("code"));
                        }
                    }
                } else {
                    System.out.println("detect not success. code:" + scrResponse.getInteger("code"));
                }
            }else{
                System.out.println("response not success. status:" + httpResponse.getStatus());
            }
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            e.printStackTrace();
        } catch (Exception e){
            e.printStackTrace();
        }
    }
}

画像モデレーション結果に関するフィードバックを提供する

画像モデレーションの結果が期待どおりでない場合は、ImageScanFeedbackRequest 操作を呼び出して結果を変更できます。 Content Moderation は、フィードバックに基づいて、モデレートされた画像を類似画像ブラックリストまたはホワイトリストに追加します。 類似画像をモデレーションに送信すると、Content Moderation はフィードバックのラベルに基づいてモデレーション結果を返します。

詳細については、/green/image/feedback をご参照ください。

操作

説明

サポートされているリージョン

ImageScanFeedbackRequest

画像モデレーション結果に関するフィードバックを提供し、フィードバックに基づいて機械支援モデレーション結果を変更します。

  • 中国(上海)

  • 中国(北京)

  • 中国(深圳)

  • シンガポール

サンプルコード

import com.alibaba.fastjson.JSON;
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.ImageScanFeedbackRequest;
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 com.aliyuncs.profile.IClientProfile;

import java.util.Arrays;


public class Main {

    public static void main(String[] args) throws Exception {
        // Alibaba Cloud アカウントの AccessKey ペアは、すべての API 操作へのアクセスに使用できます。 セキュリティの問題を防ぐために、RAM ユーザーを使用して API 操作にアクセスし、日常的な O&M を実行することをお勧めします。
        // 環境変数を取得する一般的な方法:
        // 方法 1:
        //     RAM ユーザーの AccessKey ID を取得します:System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
        //     RAM ユーザーの AccessKey シークレットを取得します:System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
        // 方法 2:
        //     RAM ユーザーの AccessKey ID を取得します:System.getProperty("ALIBABA_CLOUD_ACCESS_KEY_ID");
        //     RAM ユーザーの AccessKey シークレットを取得します:System.getProperty("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
        DefaultProfile profile = DefaultProfile.getProfile(
                "cn-shanghai",
                "環境変数から RAM ユーザーの AccessKey ID を取得することをお勧めします",
                "環境変数から RAM ユーザーの AccessKey シークレットを取得することをお勧めします");
        DefaultProfile.addEndpoint("cn-shanghai", "Green", "green.cn-shanghai.aliyuncs.com");
        // 注:インスタンス化されたクライアントはできるだけ再利用することをお勧めします。 これにより、モデレーションのパフォーマンスが向上し、クライアントの繰り返し接続が回避されます。
        IAcsClient client = new DefaultAcsClient(profile);

        ImageScanFeedbackRequest imageScanFeedbackRequest = new ImageScanFeedbackRequest();
        // 操作のレスポンス形式を指定します。
        imageScanFeedbackRequest.setAcceptFormat(FormatType.JSON);
        // リクエストメソッドを指定します。
        imageScanFeedbackRequest.setMethod(MethodType.POST);
        imageScanFeedbackRequest.setEncoding("utf-8");
        // HTTP と HTTPS の両方がサポートされています。
        imageScanFeedbackRequest.setProtocol(ProtocolType.HTTP);

        // scenes:モデレーションシナリオ。 1 つ以上のモデレーションシナリオを指定できます。
        // suggestion:返されることが期待されるモデレーション結果。 pass の値は、モデレートされた画像が正常であることを示します。 block の値は、モデレートされた画像に違反が含まれていることを示します。
        JSONObject httpBody = new JSONObject();
        httpBody.put("suggestion", "block");
        httpBody.put("scenes", Arrays.asList("ad", "terrorism"));
        httpBody.put("url", "画像 URL");

        imageScanFeedbackRequest.setHttpContent(org.apache.commons.codec.binary.StringUtils.getBytesUtf8(httpBody.toJSONString()),
                "UTF-8", FormatType.JSON);

        imageScanFeedbackRequest.setConnectTimeout(3000);
        imageScanFeedbackRequest.setReadTimeout(10000);
        try {
            HttpResponse httpResponse = client.doAction(imageScanFeedbackRequest);
            if (httpResponse.isSuccess()) {
                JSONObject scrResponse = JSON.parseObject(new String(httpResponse.getHttpContent(), "UTF-8"));
                System.out.println(JSON.toJSONString(scrResponse, true));
                if (200 == scrResponse.getInteger("code")) {
                    // 呼び出しは成功しました。
                } else {
                    System.out.println("detect not success. code:" + scrResponse.getInteger("code"));
                }
            } else {
                System.out.println("response not success. status:" + httpResponse.getStatus());
            }
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            e.printStackTrace();
        }
    }
}