前言
我们现在很多系统都会允许用户上传图片,但是有些用户经常会上传一些低俗的图片,如果要一张张人工审核,显然是审核不过来的,所以需要有系统自动审核鉴别低俗图片的功能,我们可以自己开发,但是这种成本太高,一般是推荐使用第三方的成熟产品,这里我们推荐使用的是UCloud提供的API接口来实现低俗图片鉴别功能。
UCloud
UCloud内容审核产品,基于海量训练数据,结合深度学习识别技术,基于UCloud底层云服务,提供99.9%的服务稳定性保障。能够精准识别图片、视频中的低俗内容,适用于各类用户的鉴黄审核需求,帮助您在业务层面降低违规风险,同时应用算法服务,也大大减轻了人工审核的投入成本。
最主要的是,鉴黄识别服务在2023年6月30日前,均免费试用。即使到期以后,小伙伴们也不用太担心,鉴黄识别服务定价采取阶梯定价方式,每日2000张免费调用额度,剩余部分不累积。日2000张,尔等也只有仰望的份了。
申请
地址:
www.ucloud.cn/site/product/uaicensor.html
创建UAI Censor AI内容审核应用
获取账户公私钥,鉴黄必备
总之很简单,都是中文文档,三五分钟就可以搞定的事情。
代码案例
比较扯淡的是官方只提供了Python 和 PHP 版本的生成签名代码,难道我大Java不是宇宙第一语言?于是趁着夜深人静只能自己撸一把了!
application.properties 引入以下配置
# ===================================
# UCloud鉴黄
# ===================================
ucloud.yellow.flag = true
ucloud.publicKey = **********
ucloud.privateKey = **********
ucloud.resourceId= **********
ucloud.url= http://api.uai.ucloud.cn/v1/image/scan
鉴黄工具类:
/**
* 堆代码 duidaima.com
* ucloud 鉴黄
* @param imageUrl
* @return
* 返回值
* RetCode 0 标识正常 其余一律异常
* Suggestion 建议, pass-放行, forbid-封禁, check-人工审核
*/
public String check(String imageUrl) {
try {
//图片绝对路径
imageUrl = toolsUrl + imageUrl;
RestTemplate rest = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
/**
* 生成signature,首字母排序
*/
String timestamp = System.currentTimeMillis()+"";
SortedMap<Object, Object> packageParams = new TreeMap<>();
packageParams.put("PublicKey", publicKey);
packageParams.put("ResourceId", resourceId);
packageParams.put("Timestamp", timestamp);
packageParams.put("Url", imageUrl);
String signature = UCloudUtil.createSign(packageParams,privateKey );
/**
* 参数
*/
MultiValueMap<String, Object> param = new LinkedMultiValueMap<>();
param.add("Scenes", "porn");
param.add("Method", "url");
param.add("Url", imageUrl);
/**
* headers 参数
*/
headers.setContentType(MediaType.parseMediaType("multipart/form-data; charset=UTF-8"));
headers.set("PublicKey", publicKey);
headers.set("Signature",signature);
headers.set("ResourceId",resourceId);
headers.set("Timestamp", timestamp);
HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<>(param, headers);
ResponseEntity<String> responseEntity = rest.exchange(ucloudUrl, HttpMethod.POST, httpEntity, String.class);
return responseEntity.getBody();
} catch (Exception e) {
e.printStackTrace();
return "";
}
}
生成Signature签名算法流程包括四步:
1.将请求参数按照名进行升序排列;
2.构造被签名参数串;
3.计算签名;
4.使用签名组合HTTP请求。
代码案例:
/**
* 堆代码 duidaima.com
* 生成签名
*/
public class UCloudUtil {
/**
* sign签名
*/
public static String createSign(SortedMap<Object, Object> packageParams,
String privateKey) throws Exception {
StringBuffer sb = new StringBuffer();
Set es = packageParams.entrySet();
Iterator it = es.iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
String k = (String) entry.getKey();
String v = (String)entry.getValue();
sb.append(k + v);
}
sb.append(privateKey);
String sign = shaEncode(sb.toString());
return sign;
}
public static String shaEncode(String inStr) throws Exception {
MessageDigest sha = null;
try {
sha = MessageDigest.getInstance("SHA");
} catch (Exception e) {
System.out.println(e.toString());
e.printStackTrace();
return "";
}
byte[] byteArray = inStr.getBytes("UTF-8");
byte[] md5Bytes = sha.digest(byteArray);
StringBuffer hexValue = new StringBuffer();
for (int i = 0; i < md5Bytes.length; i++) {
int val = ((int) md5Bytes[i]) & 0xff;
if (val < 16) {
hexValue.append("0");
}
hexValue.append(Integer.toHexString(val));
}
return hexValue.toString();
}
}
返回结果:
{
"RetCode": 0,
"Message": "",
"Timestamp": 1574821854,
"Status": "Success",
"StartTime": 1574821852685,
"EndTime": 1574821854,
"Result": {
"Porn": {
"Suggestion": "pass",
"Score": 0.00187
},
"Politician": {
"Suggestion": "",
"Score": 0
},
"Terror": {
"Suggestion": "",
"Score": 0
}
}
}
我们只需要关心RetCode和Porn这两个参数就可以了,RetCode 为0说明API调用正常,Porn中的参数Suggestion为pass说明通过。
小结
以上就是基于JAVA语言实现的调用ucloud API进行低俗图片鉴别的案例。如有疑问,欢迎在评论区留言评论。