前言
当我们在实际开发中,在用户创建时实现头像上传 设置昵称等环节 你是否会想到一个问题 我们在上传头像或者在设置用户名称时是否合法呢 如何校验其合法性! 这就要涉及到深度学习 对文本和图像进行处理 这或许对我们来说太麻烦了 这里我们介绍一下阿里云的内容安全服务 内容安全产品提供图片、视频、语音、文字等多媒体内容风险检测的能力,帮助用户发现色情、暴力、惊悚、敏感、禁限、辱骂等风险内容或元素,可以大幅度降低人工审核成本,提升内容质量,改善平台秩序和用户体验 阿里云已经通过微调和训练模型 实现了对图片文本视频的内容安全检测 我们只需要实现官方SDK 就能够享受到该服务 接下来我将详细地讲解一下 如何实现阿里云内容安全API的调用
官方链接:https://www.aliyun.com/
步骤一:开通服务
访问开通服务页面,开通文本审核增强版服务。
开通文本增强版服务后,默认付费方式是按量后付费,且按照实际用量结算当日费用,不调用服务不收费。接口接入使用后系统会按使用量自动出账。您也可以购买按量抵扣资源包,资源包相较于后付费存在一定阶梯折扣,适合使用量级可预期和较大的用户。个人用户建议按量付费
步骤二:为RAM用户授权
在接入SDK或者API之前,确定是否创建了RAM用户,如果创建了 只需要在确保开通内容安全服务的前提下 为RAM用户授予管理使用内容安全的权限 如果没有创建
RAM用户 请先创建后再执行前面的操作 如图所示
步骤三:安装并接入SDK
Java SDK
Python SDK
PHP SDK
Go SDK
这里以Java SDK为例子 其他请参考官方文档
支持以下三种类型的图片检测。
对公网可访问图片进行检测
对本地图片进行检测
对OSS图片进行检测
我们这里举例公网图片检查
在pom.xml中添加如下依赖安装Java SDK,即可以在Maven工程中使用SDK。
1、在dependencies中添加如下依赖。
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>green20220302</artifactId>
<version>2.20.0</version>
</dependency>
2、接入Java SDK 代码示例。
同步接口接入示例
import com.alibaba.fastjson.JSON;
import com.aliyun.green20220302.Client;
import com.aliyun.green20220302.models.ImageModerationRequest;
import com.aliyun.green20220302.models.ImageModerationResponse;
import com.aliyun.green20220302.models.ImageModerationResponseBody;
import com.aliyun.green20220302.models.ImageModerationResponseBody.ImageModerationResponseBodyData;
import com.aliyun.green20220302.models.ImageModerationResponseBody.ImageModerationResponseBodyDataResult;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
public class ImageUrlDemo {
/**
* 创建请求客户端
*
* @param accessKeyId
* @param accessKeySecret
* @param endpoint
* @return
* @throws Exception
*/
public static Client createClient(String accessKeyId, String accessKeySecret, String endpoint) throws Exception {
Config config = new Config();
config.setAccessKeyId(accessKeyId);
config.setAccessKeySecret(accessKeySecret);
// 设置http代理。
//config.setHttpProxy("http://10.10.xx.xx:xxxx");
// 设置https代理。
//config.setHttpsProxy("https://10.10.xx.xx:xxxx");
// 接入区域和地址请根据实际情况修改
// 接入地址列表:https://help.aliyun.com/document_detail/467828.html?#section-uib-qkw-0c8
config.setEndpoint(endpoint);
return new Client(config);
}
public static ImageModerationResponse invokeFunction(String accessKeyId, String accessKeySecret, String endpoint) throws Exception {
//注意,此处实例化的client请尽可能重复使用,避免重复建立连接,提升检测性能。
Client client = createClient(accessKeyId, accessKeySecret, endpoint);
// 创建RuntimeObject实例并设置运行参数
RuntimeOptions runtime = new RuntimeOptions();
// 检测参数构造。
Map<String, String> serviceParameters = new HashMap<>();
//公网可访问的URL。
serviceParameters.put("imageUrl", "https://img.alicdn.com/tfs/xxxxxxxxxx001.png");
//待检测数据唯一标识
serviceParameters.put("dataId", UUID.randomUUID().toString());
ImageModerationRequest request = new ImageModerationRequest();
// 图片检测service:内容安全控制台图片增强版规则配置的serviceCode,示例:baselineCheck
// 支持service请参考:https://help.aliyun.com/document_detail/467826.html?0#p-23b-o19-gff
request.setService("baselineCheck");
request.setServiceParameters(JSON.toJSONString(serviceParameters));
ImageModerationResponse response = null;
try {
response = client.imageModerationWithOptions(request, runtime);
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
public static void main(String[] args) throws Exception {
/**
* 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。
* 常见获取环境变量方式:
* 方式一:
* 获取RAM用户AccessKey ID:System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
* 获取RAM用户AccessKey Secret:System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
* 方式二:
* 获取RAM用户AccessKey ID:System.getProperty("ALIBABA_CLOUD_ACCESS_KEY_ID");
* 获取RAM用户AccessKey Secret:System.getProperty("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
*/
String accessKeyId = "建议从环境变量中获取RAM用户AccessKey ID";
String accessKeySecret = "建议从环境变量中获取RAM用户AccessKey Secret";
// 接入区域和地址请根据实际情况修改。
ImageModerationResponse response = invokeFunction(accessKeyId, accessKeySecret, "green-cip.cn-shanghai.aliyuncs.com");
try {
// 自动路由。
if (response != null) {
//区域切换到cn-beijing。
if (500 == response.getStatusCode() || (response.getBody() != null && 500 == (response.getBody().getCode()))) {
// 接入区域和地址请根据实际情况修改。
response = invokeFunction(accessKeyId, accessKeySecret, "green-cip.cn-beijing.aliyuncs.com");
}
}
// 打印检测结果。
if (response != null) {
if (response.getStatusCode() == 200) {
ImageModerationResponseBody body = response.getBody();
System.out.println("requestId=" + body.getRequestId());
System.out.println("code=" + body.getCode());
System.out.println("msg=" + body.getMsg());
if (body.getCode() == 200) {
ImageModerationResponseBodyData data = body.getData();
System.out.println("dataId=" + data.getDataId());
List<ImageModerationResponseBodyDataResult> results = data.getResult();
for (ImageModerationResponseBodyDataResult result : results) {
System.out.println("label=" + result.getLabel());
System.out.println("confidence=" + result.getConfidence());
}
} else {
System.out.println("image moderation not success. code:" + body.getCode());
}
} else {
System.out.println("response not success. status:" + response.getStatusCode());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
异步接口接入示例
import com.alibaba.fastjson.JSON;
import com.aliyun.green20220302.Client;
import com.aliyun.green20220302.models.ImageAsyncModerationRequest;
import com.aliyun.green20220302.models.ImageAsyncModerationResponse;
import com.aliyun.green20220302.models.ImageAsyncModerationResponseBody;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
public class ImageAsyncModerationDemo {
public static Client createClient(String accessKeyId, String accessKeySecret, String endpoint) throws Exception {
Config config = new Config();
config.setAccessKeyId(accessKeyId);
config.setAccessKeySecret(accessKeySecret);
config.setEndpoint(endpoint);
return new Client(config);
}
public static ImageAsyncModerationResponse invokeFunction(String accessKeyId, String accessKeySecret, String
endpoint) throws Exception {
Client client = createClient(accessKeyId, accessKeySecret, endpoint);
RuntimeOptions runtime = new RuntimeOptions();
Map<String, String> serviceParameters = new HashMap<>();
serviceParameters.put("imageUrl", "https://img.alicdn.com/tfs/xxxxxxxxxx001.png");
serviceParameters.put("dataId", UUID.randomUUID().toString());
ImageAsyncModerationRequest imageAsyncModerationRequest = new ImageAsyncModerationRequest();
imageAsyncModerationRequest.setService("baselineCheck");
imageAsyncModerationRequest.setServiceParameters(JSON.toJSONString(serviceParameters));
ImageAsyncModerationResponse response = null;
try {
response = client.imageAsyncModerationWithOptions(imageAsyncModerationRequest, runtime);
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
public static void main(String[] args) throws Exception {
String accessKeyId = "建议从环境变量中获取RAM用户AccessKey ID";
String accessKeySecret = "建议从环境变量中获取RAM用户AccessKey Secret";
ImageAsyncModerationResponse response = invokeFunction(accessKeyId, accessKeySecret, "green-cip.cn-shanghai.aliyuncs.com");
if (response != null) {
if (response.getStatusCode() == 200) {
ImageAsyncModerationResponseBody body = response.getBody();
System.out.println("requestId=" + body.getRequestId());
System.out.println("code=" + body.getCode());
System.out.println("msg=" + body.getMsg());
if (body.getCode() == 200) {
ImageAsyncModerationResponseBody.ImageAsyncModerationResponseBodyData data = body.getData();
System.out.println("dataId=" + data.getDataId());
System.out.println("requestId = [" + data.getReqId() + "]");
} else {
System.out.println("image asyncmoderation not success. code:" + body.getCode());
}
} else {
System.out.println("response not success. status:" + response.getStatusCode());
}
}
}
}
将accessKeyId和accessKeySecret 替换成自己的即可(在创建RAM用户时 会自动创建)(为了安全建议采用环境变量的形式引入)
将该url改为你要检查的图片的公网url地址
这样我们就完成了SDK的搭建
当需要审核的图片可通过公网链接访问时,图片审核增强版服务可通过图片URL获取文件后进行审核
正确运行控制台参考
requestId 是阿里云自动生成的请求唯一标识 为了区分每一次检测
code 为响应状态
msg 为响应携带的信息
dataId 为UUID随机化编码 用来当作数据标识
label 为该图片属于哪类标签
confidence 信用值 0-100 越大越危险越不合法
接下来再介绍一下 该服务的具体使用细节
图片分析服务有很多种 可以在SDK中设置专门的检查服务类别 可以根据自己的业务 设置对应的参数 通用则可设置baselineChek
点击设置规则 就可以开启对于某些具体类型图片的检测 我们可以手动开启
这里还要介绍的是自定义图库
我们可以自定义的创建图库 自定义设置图片 非法类型 当我们的图片放入图库时 当检测图片时 如果该图片在图库中 也会判为非法 (注意我们要在设置规则时 要导入相应的图库)
其实该内容安全服务 不仅可以检测图片 还能检查 视频 文本 等 具体可以查看阿里云官方文档 :https://www.aliyun.com/