[Vision API] Javaで不適切なコンテンツを検出する(セーフサーチ検出)

Googleが提供しているVision APIをJavaで使ってみました。

APIを使用し、画像のセーフサーチ検出を行います。

セーフサーチ検出は、画像に含まれる不適切なコンテンツを検出します。
以下の5つのカテゴリが、画像にどの程度の可能性で存在するかチェックします。
|カテゴリ|
|---|
|アダルトコンテンツの可能性|
|医療画像である可能性|
|際どい内容が含まれている可能性|
|なりすましの可能性|
|暴力的なコンテンツが含まれている可能性|

それぞれの上記のカテゴリに対して以下の５段階で評価します。
|レベル|可能性|
|---|---|
|1|可能性は非常に低い|
|2|可能性は低い|
|3|可能性はある|
|4|可能性は高い|
|5|可能性は非常に高い|

:::note info
APIを利用する環境の準備から始める場合や、コードを実行する際は、
[⧉[Vision API] Javaで画像内のいろいろなものを検出する](https://qiita.com/doran/items/444cb6231b7dffb9ddac)
を参照ください。
:::

|No||目次|
|---|---|---|
|1||[Feature.Typeの指定](#1-featuretypeの指定)|
|2||[実行結果の取得](#2-実行結果の取得)|
||1|[レスポンスの出力](#21-レスポンスの出力)|
||2|[レスポンスの内容](#22-レスポンスの内容)|
|3||[結果の検証](#3-結果の検証)|
||1|[繁華街](#31-繁華街)|
||2|[ボーリング](#32-ボーリング)|
||3|[人物](#33-人物)|
||4|[街](#34-街)|
||5|[野菜](#35-野菜)|
||6|[猫](#36-猫)|
||7|[デスク](#37-デスク)|
||8|[ハロウィン](#38-ハロウィン)|
||9|[錠剤](#39-錠剤)|
||10|[ダイエット](#310-ダイエット)|
||11|[マッチョ](#311-マッチョ)|
||12|[サップヨガ](#312-サップヨガ)|

# 1. Feature.Typeの指定
不適切なコンテンツを検出する場合は、
**Feature.Type.SAFE_SEARCH_DETECTION**
を指定します。

以下の記事でexecApi()にタイプを指定します。
[⧉[Vision API] Javaで画像内のいろいろなものを検出する](https://qiita.com/doran/items/444cb6231b7dffb9ddac#25-apiを呼び出す)

# 2. 実行結果の取得
### 2.1. レスポンスの出力
取得した結果をコンソールに出力します。
```
private static void output(BatchAnnotateImagesResponse response){
    List<AnnotateImageResponse> responses = response.getResponsesList();
    
    for (AnnotateImageResponse res : responses) {
        if (res.hasError()) {
            System.out.format("Error: %s%n", res.getError().getMessage());
            return;
        }

        SafeSearchAnnotation annotation = res.getSafeSearchAnnotation();
        System.out.format(
            "adult: %s%nmedical: %s%nspoofed: %s%nviolence: %s%nracy: %s%n",
            annotation.getAdult(),
            annotation.getMedical(),
            annotation.getSpoof(),
            annotation.getViolence(),
            annotation.getRacy());
    }
}
```
### 2.2. レスポンスの内容
BatchAnnotateImagesResponseの
getResponsesListでAnnotateImageResponseリストが取得できます。
検出されなった場合は、空のリストが返ってきます。
#### AnnotateImageResponse
|メソッド|戻り値|内容|
|---|---|---|
|getSafeSearchAnnotation|[SafeSearchAnnotation](#safesearchannotation)|画像に関連する一連の特徴|

#### SafeSearchAnnotation
|メソッド|戻り値|内容|
|---|---|---|
|getAdult|[Likelihood(enum)](#likelihood)|アダルトコンテンツの可能性|
|getMedical|[Likelihood(enum)](#likelihood)|医療画像である可能性|
|getRacy|[Likelihood(enum)](#likelihood)|際どい内容が含まれている可能性|
|getSpoof|[Likelihood(enum)](#likelihood)|なりすましの可能性|
|getViolence|[Likelihood(enum)](#likelihood)|暴力的なコンテンツが含まれている可能性|
#### Likelihood
可能性を定義値(文字列)で返します。一覧の下の方がより可能性が高くなります。
|定義値|内容|
|---|---|
|UNKNOWN|可能性は不明|
|VERY_UNLIKELY|可能性は非常に低い|
|UNLIKELY|可能性は低い|
|POSSIBLE|可能性はある|
|LIKELY|可能性は高い|
|VERY_LIKELY|可能性は非常に高い|

## 3. 結果の検証
いろいろな画像の可能性を検出してみました。
完全にアウトな画像はさすがに使えなかったので判定にかかりそうなものを差し込んでみました。
中にはそうだろうなというのも、意外なものもありました。

### 3.1. 繁華街
**検出させる元画像**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/9b78a837-5b15-c8c4-d4f5-3bc3f69fb92e.jpeg">

**検出結果**
アダルトと際どい可能性が「低い」と検出されました。
看板の文字を見ると完全にアダルティーですけどね。
|アダルト|医療|際どい|なりすまし|暴力|
|---|---|---|---|---|
|低い|非常に低い|低い|非常に低い|非常に低い|

### 3.2. ボーリング
**検出させる元画像**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/d7330b6f-ec07-4959-cff2-345e546dfceb.jpeg">

**検出結果**
楽しそうに遊んでいるので特に問題はありませんでした。
|アダルト|医療|際どい|なりすまし|暴力|
|---|---|---|---|---|
|非常に低い|非常に低い|非常に低い|非常に低い|非常に低い|

### 3.3. 人物
**検出させる元画像**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/02b5422f-0c58-0856-6a64-3790c4977e6d.jpeg">

**検出結果**
医療と際どい可能性が「低い」と検出されました。
|アダルト|医療|際どい|なりすまし|暴力|
|---|---|---|---|---|
|非常に低い|低い|低い|非常に低い|非常に低い|

### 3.4. 街
**検出させる元画像**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/5c0cf874-28e4-9bb7-230d-16a49e28ddcb.jpeg">

**検出結果**
特に何も検出されませんでした。
|アダルト|医療|際どい|なりすまし|暴力|
|---|---|---|---|---|
|非常に低い|非常に低い|非常に低い|非常に低い|非常に低い|

### 3.5. 野菜
**検出させる元画像**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/e3180831-f3b2-0d46-3a15-d121c0d19555.jpeg">

**検出結果**
医療と際どい可能性が「低い」と検出されました。
|アダルト|医療|際どい|なりすまし|暴力|
|---|---|---|---|---|
|非常に低い|低い|低い|非常に低い|非常に低い|

### 3.6. 猫
**検出させる元画像**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/61ee0313-6719-2de3-67d2-31711161a3a7.jpeg">

**検出結果**
なりすましの可能性が「低い」と検出されました。
|アダルト|医療|際どい|なりすまし|暴力|
|---|---|---|---|---|
|非常に低い|非常に低い|非常に低い|低い|非常に低い|

### 3.7. デスク
**検出させる元画像**
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/0e2fe664-5a6c-75cf-2250-ad80d7c9768e.jpeg">

**検出結果**
アダルトで医療で際どい可能性が「低い」と検出されました。
|アダルト|医療|際どい|なりすまし|暴力|
|---|---|---|---|---|
|低い|低い|低い|非常に低い|非常に低い|

### 3.8. ハロウィン
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/21fe5778-2055-3a04-3773-74b1e69f2df2.jpeg">

**検出結果**
医療、際どいの可能性が「低い」、なりすましが「可能性はある」、
暴力の可能性が「高い」と検出されました。
見たままですね。
|アダルト|医療|際どい|なりすまし|暴力|
|---|---|---|---|---|
|非常に低い|低い|低い|可能性はある|高い|

### 3.9. 錠剤
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/d35a58b3-4ed7-06dc-7e6d-f7f549c6483c.jpeg">

**検出結果**
意外にも医療の可能性が「低い」と検出されました。
|アダルト|医療|際どい|なりすまし|暴力|
|---|---|---|---|---|
|非常に低い|低い|非常に低い|非常に低い|非常に低い|

### 3.10. ダイエット
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/be936c3b-ae3f-a80b-2913-92654037d298.jpeg">

**検出結果**
医療の可能性が「低い」、際どい可能性が低いより高い「可能性がある」になりました。
|アダルト|医療|際どい|なりすまし|暴力|
|---|---|---|---|---|
|非常に低い|低い|可能性はある|非常に低い|非常に低い|

### 3.11. マッチョ
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/eb211ca9-7fca-5735-1749-a6202b1b2c67.jpeg">

**検出結果**
医療と暴力の可能性が「低い」、際どい可能性が「非常に高い」と検出されました。
|アダルト|医療|際どい|なりすまし|暴力|
|---|---|---|---|---|
|非常に低い|低い|非常に高い|非常に低い|低い|

### 3.12. サップヨガ
<img width="480" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/8f97db89-9ebf-1646-2d92-872c437f00c7.jpeg">

**検出結果**
医療の可能性が「低い」、アダルトの可能性が「可能性はある」、
際どい可能性が「非常に高い」と検出されました。
|アダルト|医療|際どい|なりすまし|暴力|
|---|---|---|---|---|
|可能性はある|低い|非常に高い|非常に低い|非常に低い|


<BR>
<BR>
おしまい。。。