【内容审核】对审核结果进行封装

目录

1、分析返回结果示例 

2、自定义封装类


【内容审核】Java实现七牛云内容审核功能七牛 java 审核-CSDN博客 中实现了文本、图片和视频的审核功能,但是这些功能灵活性不够,既不能自己设置审核的强度,也不能内容违规的详细信息,所以可以在原来代码的基础上对这些功能进行一个改造。这第一步就是需要自定义封装类来封装审核结果。

1、分析返回结果示例 

        要想知道七牛云内容审核返回结果中的详细信息,就需要定义实体类来接收这些信息再进行处理。

        要自定义这些返回结果的封装类,那就需要先分析这些返回结果的格式。文本、图片和视频审核结果的返回结果示例如下:

仔细把上面的图看一下,我们可以发现在文本、图片和视频这三种JSON格式的返回结果中,视频的返回结果是最复杂的,但是这三种返回结果中有许多属性是一样的,现在我们就开始来分析这些JSON格式的数据,并定义他们的封装类

2、自定义封装类

        我们从最内部的字段开始分析,能得到  "score"  、 "label"  、 "suggestion"  、 "offset"  这几个字段,再结合这些字段对应的“值”,我们能推断除:"score"应该被定义为Double类型;"label"应该被定义为String类型;"suggestion"应该被定义为String类型;"offset"应该被定义为Long类型。

        再进一步分析,我们分析"details"字段,"details"字段在三种返回示例中不一样,在文本审核结果中的"details"字段内部只包含"score"字段和"label"字段,而在视频和图片审核结果中的"details"字段内部除了包含"score"字段和"label"字段还包含"suggestion"字段,所以在"details"字段对应的封装类中就应该包含"score"、"label"和"suggestion"这三个属性,因为java中没有"details"字段对应的封装类,所以我们要自定义封装类DetailsJson代码如下:

 DetailsJson类

@Data
@ToString
public class DetailsJson implements Serializable {

    String label; // 标签

    Double score; // 分数,该分类的置信度分数

    String suggestion; // 建议
}

        定义了封装类DetailsJson后,我们继续分析,可以定义CutsJson类来封装视频审核结果中 "cuts"字段下的"details"、"offset"和"suggestion"字段,代码如下:

 CutsJson类

@Data
@ToString
public class CutsJson implements Serializable {

    List<DetailsJson> details; // 视频中,这个时间段审核结果的详细信息

    Long offset; // 这个时间段的偏移量

    String suggestion; // 建议

}

        然后我们直接看文本、图片和视频审核结果中的"scenes"字段,我们对这三种返回结果的"scenes"字段下所包含的字段做一个并集操作,我们可以得到 "politician""pulp""terror""antispam"字段,然后再对这四个字段下所包含的字段做一个并集操作,我们可以得到 "cuts"、"details""suggestion"这三个字段。所以我们完全可以定义一个封装类来封装"cuts"、"details""suggestion"这三个字段,来对应"politician""pulp""terror""antispam"这四个字段,代码如下:

TypeJson类

/**
 * @Author 小涛Tao
 * @Date: 2024/08/17/16:49
 * version 1.0 注释:TypeJson 表示【文本、视频和图片】审核结果中的审核类型,TypeJson 的属性为审核类型下的子部分。

 * 文本审核类型主要为 "antispam"
 * 视频和图片的审核类型主要为 "pulp" 、 "terror" 和 "politician"

 * 文本审核结果的 "antispam" 下有 details 和 suggestion
 * 视频审核结果的 "pulp" 和 "terror" 下有 cuts 和 suggestion ; 而 "politician" 下有 cuts 和 suggestion ,但 cuts 没有 details
 * 图片审核结果的 "pulp" 和 "terror" 下有 details 和 suggestion ; 而 "politician" 下只有 suggestion
 **/
@Data
@ToString
public class TypeJson implements Serializable {

    String suggestion; // 建议

    List<CutsJson> cuts; // 视频中不同时段的审核结果集合

    List<DetailsJson> details; // 详细信息

}

再定义一个类来封装 "politician"、"pulp"、"terror"和"antispam"这四个字段,代码如下:

 ScenesJson类

/**
 * @Author 小涛Tao
 * @Date: 2024/08/17/17:01
 * version 1.0 注释:JSON审核结果中 "result" 下的 "scenes"
 * "scenes" 下有哪些审核类型得看是【文本、图片和视频】哪一种审核
 **/
@Data
@ToString
public class ScenesJson implements Serializable {

    private TypeJson terror; // 恐怖内容,鉴恐

    private TypeJson politician; // 敏感人物识别,涉政

    private TypeJson pulp; // 低俗色情内容,鉴黄

    private TypeJson antispam; // 文本反垃圾,过滤垃圾

}

再像前面一样往上分析,继续定义类。
ResultChildJson类(视频JSON结果中 "result" 中的 "result")

/**
 * @Author 小涛Tao
 * @Date: 2024/08/17/17:14
 * version 1.0 注释:视频JSON结果中 "result" 中的 "result"
 * 同时,文本和图片的返回结果中的 result 就用这个来转换成 JSON 结构
 **/
@Data
@ToString
public class ResultChildJson implements Serializable {

    String suggestion; // 建议

    ScenesJson scenes; // 场景 scenes 下包含具体的审核类型(场景)结果

}

ResultJson类(视频JSON结果中 最外层的"result")

/**
 * @Author 小涛Tao
 * @Date: 2024/08/17/17:19
 * version 1.0 注释:视频JSON结果中 最外层的"result"
 **/
@Data
@ToString
public class ResultJson implements Serializable {

    Integer code; // 状态码

    String message; // 提示信息

    ResultChildJson resultChile; // 结果体 resultChile

}

BodyJson类:封装视频审核结果,同时提供getPolitician()方法、getTerror()方法和getPulp()方法来获取对应场景下的DetailsJson集合,然后就可以通过遍历这些DetailsJson集合来处理里面的score属性,这些处理的代码可以根据自己的一个想法来编写。

/**
 * @Author 小涛Tao
 * @Date: 2024/08/17/17:24
 * version 1.0 注释:
 **/
@Data
@ToString
public class BodyJson implements Serializable {

    String id; // 这次视频审核请求任务的唯一标识符

    String status; // 这个审核任务的状态,有没有完成

    ResultJson result; // 结果JSON结果中的 "result"

    // 比较 value 是否在 min 和 max 之间
    public boolean compare(Double min, Double max, Double value) {
        return value >= min && value <= max;
    }

    // 检查结果中所有 detail 中的 score 是否在 min 和 max 中,只要里面有一个这样的情况,就算中了
    public boolean checkViolation(List<CutsJson> types, Double min, Double max) {
        for (CutsJson cutsJson : types) {
            if (!ObjectUtils.isEmpty(cutsJson.details)) {
                for (DetailsJson detail : cutsJson.details) {
                    if (compare(min, max, detail.score)) {
                        return true;
                    }
                }
            }
        }
        return false;
    }

    // 获取图片或视频审核结果中的 Terror 审核类型下的信息,视频直接就是 Cuts ,图片为 details 和 suggestion
    public List<CutsJson> getTerror() {
        final TypeJson terror = result.getResultChile().getScenes().getTerror();

        // 如果这是视频审核结果,那么结果中的 Terror 审核类型下就有 Cuts ,直接返回这个 Cuts
        if (!ObjectUtils.isEmpty(terror.getCuts())) {
            return terror.getCuts();
        }

        // 否则证明这是图片的审核结果,因为图片审核结果中的 Terror 审核类型下没有 Cuts
        // 那么就创建一个 CutsJson 来封装图片 Terror 审核类型下的 details 和 suggestion
        final CutsJson cutsJson = new CutsJson();
        cutsJson.setDetails(terror.getDetails());
        cutsJson.setSuggestion(terror.getSuggestion());
        return Collections.singletonList(cutsJson); // 设置为只有一个元素的集合来返回
    }


    // 获取图片或视频审核结果中的 Politician 审核类型下的信息
    public List<CutsJson> getPolitician(){
        final TypeJson politician = result.getResultChile().getScenes().getPolitician();
        if (!ObjectUtils.isEmpty(politician.getCuts())){
            return politician.getCuts();
        }

        // 我:如果是图片的审核结果,politician(TypeJson) 下没有 cuts(CutsJson),所以直接设置 details 和 suggestion
        final CutsJson cutsJson = new CutsJson();
        cutsJson.setDetails(politician.getDetails());
        cutsJson.setSuggestion(politician.getSuggestion());

        return Collections.singletonList(cutsJson);
    }


    // 获取图片或视频审核结果中的 Pulp 审核类型下的信息
    public List<CutsJson> getPulp(){
        final TypeJson pulp = result.getResultChile().getScenes().getPulp();
        if (!ObjectUtils.isEmpty(pulp.getCuts())){
            return pulp.cuts;
        }

        final CutsJson cutsJson = new CutsJson();
        cutsJson.setDetails(pulp.getDetails());
        cutsJson.setSuggestion(pulp.getSuggestion());

        return Collections.singletonList(cutsJson);
    }

}

先写到这里,后续再写处理数据的流程和代码。

 

推荐: 

【内容审核】Java实现七牛云内容审核功能,文本、图片和视频的内容审核(鉴黄、鉴暴恐、敏感人物)_七牛 java 审核-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_65277261/article/details/140902624?spm=1001.2014.3001.5501

  • 14
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这里我给出一个 Python 版本的图片审核工具类,使用了百度的内容审核 API。注意,这里需要使用到百度的 API Key 和 Secret Key,请根据自己的实际情况进行替换。 ```python import requests import base64 class ImageModeration: def __init__(self, api_key, secret_key): self.api_key = api_key self.secret_key = secret_key self.access_token = self._get_access_token() def _get_access_token(self): url = 'https://aip.baidubce.com/oauth/2.0/token' params = { 'grant_type': 'client_credentials', 'client_id': self.api_key, 'client_secret': self.secret_key } response = requests.get(url, params=params).json() return response['access_token'] def _image_to_base64(self, image_path): with open(image_path, 'rb') as f: image_data = f.read() base64_data = base64.b64encode(image_data) return base64_data.decode('utf-8') def _request(self, url, data): headers = {'Content-Type': 'application/json'} params = {'access_token': self.access_token} response = requests.post(url, params=params, headers=headers, json=data).json() return response def image_moderation(self, image_path, image_type='BASE64', scenes=['antiporn'], threshold=0.95): if image_type == 'BASE64': image_data = self._image_to_base64(image_path) else: with open(image_path, 'rb') as f: image_data = f.read() url = f'https://aip.baidubce.com/rest/2.0/solution/v1/img_censor/v2/user_defined?access_token={self.access_token}' data = { 'image': image_data, 'image_type': image_type, 'scenes': scenes, 'threshold': threshold } response = self._request(url, data) return response ``` 该工具类的使用方法如下: ```python api_key = 'your_api_key' secret_key = 'your_secret_key' moderation = ImageModeration(api_key, secret_key) result = moderation.image_moderation('your_image_path') print(result) ``` 其中,`api_key` 和 `secret_key` 分别为你的百度 API Key 和 Secret Key,`your_image_path` 为待审核的图片路径。`image_moderation` 方法的返回值是一个 JSON 对象,包含了审核结果的详细信息。你可以根据需要对这些信息进行解析和处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值