提交修改
This commit is contained in:
parent
5f35645a0c
commit
2e1dfe5d23
@ -63,13 +63,13 @@ public class AScanImageHandle extends AlibabaBaseHandle<AScanImageRequest, ScanI
|
||||
}
|
||||
|
||||
for (AScanImageRequestTask task : aScanImageRequest.getTasks()) {
|
||||
if (StringUtils.isNotBlank(task.getBase64())) {
|
||||
String url = ossFileUploadService.uploadFileContentByBase64(task.getBase64(),"jpg");
|
||||
if (StringUtils.isNotBlank(task.getImageBase64())) {
|
||||
String url = ossFileUploadService.uploadFileContentByBase64(task.getImageBase64(),"jpg");
|
||||
if (StringUtils.isBlank(url)) {
|
||||
log.error("AScanImageHandle oss file upload is null");
|
||||
return "你的base64内容有误";
|
||||
}
|
||||
task.setUrl(url);
|
||||
task.setImageUrl(url);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
@ -87,7 +87,7 @@ public class AScanImageHandle extends AlibabaBaseHandle<AScanImageRequest, ScanI
|
||||
ScanImageRequest.ScanImageRequestTask task1 = new ScanImageRequest.ScanImageRequestTask();
|
||||
|
||||
task1.setDataId(UUID.randomUUID().toString());
|
||||
task1.setImageURL(task.getUrl());
|
||||
task1.setImageURL(task.getImageUrl());
|
||||
task1.setImageTimeMillisecond(task.getImageTimeMillisecond());
|
||||
task1.setInterval(task.getInterval());
|
||||
task1.setMaxFrames(task.getMaxFrames());
|
||||
|
||||
@ -26,12 +26,12 @@ public class AScanImageRequestTask {
|
||||
* 示例值:
|
||||
* http://xxx.xxx.com/xxx.jpg
|
||||
*/
|
||||
public String url;
|
||||
public String imageUrl;
|
||||
|
||||
/**
|
||||
* 图片base64
|
||||
*/
|
||||
private String base64;
|
||||
private String imageBase64;
|
||||
|
||||
/**
|
||||
* 截帧频率,GIF 图或者长图检测专用。GIF 图可理解为图片数组,每 interval 张图片抽取一张进行检测。只有该值存在时,才会对 GIF 进行截帧。长图同时支持长竖图和长横图。
|
||||
@ -51,4 +51,12 @@ public class AScanImageRequestTask {
|
||||
* 1
|
||||
*/
|
||||
public Integer maxFrames;
|
||||
|
||||
/***
|
||||
* 数据 ID。需要保证在一次请求中所有的 ID 不重复。
|
||||
*
|
||||
* 示例值:
|
||||
* uuid-xxxx-xxxx-1234
|
||||
*/
|
||||
private String dataId;
|
||||
}
|
||||
|
||||
@ -81,7 +81,6 @@ public class ClassifyCommodityController extends BaseController {
|
||||
resp.add(classifyCommodityResp);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
return R.ok().setData(resp);
|
||||
|
||||
@ -0,0 +1,155 @@
|
||||
package com.heyu.api.controller.imageaudit;
|
||||
|
||||
|
||||
import com.aliyun.imageaudit20191230.models.ScanImageResponse;
|
||||
import com.aliyun.imageaudit20191230.models.ScanImageResponseBody;
|
||||
import com.heyu.api.alibaba.handle.imageaudit.AScanImageHandle;
|
||||
import com.heyu.api.alibaba.request.imageaudit.AScanImageRequest;
|
||||
import com.heyu.api.alibaba.request.imageaudit.AScanImageRequestTask;
|
||||
import com.heyu.api.controller.BaseController;
|
||||
import com.heyu.api.data.annotation.CacheResult;
|
||||
import com.heyu.api.data.annotation.NotIntercept;
|
||||
import com.heyu.api.data.utils.ApiR;
|
||||
import com.heyu.api.data.utils.R;
|
||||
import com.heyu.api.request.imageaudit.ScanImageReq;
|
||||
import com.heyu.api.resp.imageaudit.ScanImageResp;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.collections.CollectionUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/***
|
||||
*
|
||||
* https://next.api.aliyun.com/api/imageaudit/2019-12-30/ScanImage?RegionId=cn-shanghai
|
||||
*
|
||||
*图片内容安全 Scanlmage
|
||||
*
|
||||
*/
|
||||
@Slf4j
|
||||
@RestController
|
||||
@RequestMapping("/image")
|
||||
@NotIntercept
|
||||
public class ScanImageController extends BaseController {
|
||||
|
||||
|
||||
@Autowired
|
||||
private AScanImageHandle aScanImageHandle;
|
||||
|
||||
@RequestMapping("/scan")
|
||||
@CacheResult
|
||||
public R scan(ScanImageReq req) {
|
||||
|
||||
ScanImageResp resp = new ScanImageResp();
|
||||
AScanImageRequest request = new AScanImageRequest();
|
||||
|
||||
request.setScenes(req.getScenes());
|
||||
|
||||
List<AScanImageRequestTask> tasks = new ArrayList<>();
|
||||
AScanImageRequestTask task = new AScanImageRequestTask();
|
||||
|
||||
task.setImageUrl(req.getImageUrl());
|
||||
task.setImageBase64(req.getImageBase64());
|
||||
|
||||
tasks.add(task);
|
||||
request.setTasks(tasks);
|
||||
|
||||
ApiR<ScanImageResponse> aR = aScanImageHandle.handle(request);
|
||||
|
||||
if (aR.isSuccess() && isSuccessStatusCode(aR.getData().getStatusCode())) {
|
||||
|
||||
ScanImageResponseBody.ScanImageResponseBodyData responseBodyData = aR.getData().getBody().getData();
|
||||
if (CollectionUtils.isNotEmpty(responseBodyData.getResults())) {
|
||||
for (ScanImageResponseBody.ScanImageResponseBodyDataResults result : responseBodyData.getResults()) {
|
||||
List<ScanImageResponseBody.ScanImageResponseBodyDataResultsSubResults> subResults = result.getSubResults();
|
||||
resp.setImageURL(resp.getImageURL());
|
||||
List<ScanImageResp.SubResults> subResultsList = new ArrayList<>();
|
||||
for (ScanImageResponseBody.ScanImageResponseBodyDataResultsSubResults resultsSubResults : subResults) {
|
||||
ScanImageResp.SubResults subResult = new ScanImageResp.SubResults();
|
||||
|
||||
List<ScanImageResp.SubResultsFrames> subResultsFrames = new ArrayList<>();
|
||||
|
||||
List<ScanImageResponseBody.ScanImageResponseBodyDataResultsSubResultsFrames> resultsSubResultsFrames = resultsSubResults.getFrames();
|
||||
for (ScanImageResponseBody.ScanImageResponseBodyDataResultsSubResultsFrames resultsSubResultsFrame : resultsSubResultsFrames) {
|
||||
ScanImageResp.SubResultsFrames resultsFrames = new ScanImageResp.SubResultsFrames();
|
||||
|
||||
resultsFrames.setURL(resultsSubResultsFrame.getURL());
|
||||
resultsFrames.setRate(resultsSubResultsFrame.getRate());
|
||||
|
||||
subResultsFrames.add(resultsFrames);
|
||||
}
|
||||
|
||||
subResult.setSubResultsFrames(subResultsFrames);
|
||||
|
||||
List<ScanImageResp.SubResultsHintWordsInfoList> subResultsHintWordsInfoList = new ArrayList<>();
|
||||
for (ScanImageResponseBody.ScanImageResponseBodyDataResultsSubResultsHintWordsInfoList resultsSubResultsHintWordsInfoList : resultsSubResults.getHintWordsInfoList()) {
|
||||
|
||||
ScanImageResp.SubResultsHintWordsInfoList resultsHintWordsInfoList = new ScanImageResp.SubResultsHintWordsInfoList();
|
||||
resultsHintWordsInfoList.setContext(resultsSubResultsHintWordsInfoList.getContext());
|
||||
subResultsHintWordsInfoList.add(resultsHintWordsInfoList);
|
||||
}
|
||||
|
||||
subResult.setSubResultsHintWordsInfoList(subResultsHintWordsInfoList);
|
||||
|
||||
List<ScanImageResp.SubResultsLogoDataList> subResultsLogoDataList = new ArrayList<>();
|
||||
for (ScanImageResponseBody.ScanImageResponseBodyDataResultsSubResultsLogoDataList resultsSubResultsLogoDataList : resultsSubResults.getLogoDataList()) {
|
||||
|
||||
ScanImageResp.SubResultsLogoDataList resultsLogoDataList = new ScanImageResp.SubResultsLogoDataList();
|
||||
resultsLogoDataList.setX(resultsSubResultsLogoDataList.getX());
|
||||
resultsLogoDataList.setY(resultsSubResultsLogoDataList.getY());
|
||||
resultsLogoDataList.setWidth(resultsSubResultsLogoDataList.getWidth());
|
||||
resultsLogoDataList.setHeight(resultsSubResultsLogoDataList.getHeight());
|
||||
resultsLogoDataList.setName(resultsSubResultsLogoDataList.getName());
|
||||
resultsLogoDataList.setType(resultsSubResultsLogoDataList.getType());
|
||||
|
||||
subResultsLogoDataList.add(resultsLogoDataList);
|
||||
|
||||
}
|
||||
subResult.setSubResultsLogoDataList(subResultsLogoDataList);
|
||||
|
||||
subResult.setOCRDataList(resultsSubResults.getOCRDataList());
|
||||
|
||||
List<ScanImageResp.SubResultsProgramCodeDataList> subResultsProgramCodeDataListList = new ArrayList<>();
|
||||
for (ScanImageResponseBody.ScanImageResponseBodyDataResultsSubResultsProgramCodeDataList resultsSubResultsProgramCodeDataList : resultsSubResults.getProgramCodeDataList()) {
|
||||
ScanImageResp.SubResultsProgramCodeDataList resultsProgramCodeDataList = new ScanImageResp.SubResultsProgramCodeDataList();
|
||||
resultsProgramCodeDataList.setHeight(resultsSubResultsProgramCodeDataList.getHeight());
|
||||
resultsProgramCodeDataList.setWidth(resultsSubResultsProgramCodeDataList.getWidth());
|
||||
resultsProgramCodeDataList.setX(resultsSubResultsProgramCodeDataList.getX());
|
||||
resultsProgramCodeDataList.setY(resultsSubResultsProgramCodeDataList.getY());
|
||||
subResultsProgramCodeDataListList.add(resultsProgramCodeDataList);
|
||||
}
|
||||
subResult.setSubResultsProgramCodeDataListList(subResultsProgramCodeDataListList);
|
||||
|
||||
List<ScanImageResp.SubResultsSfaceDataList> sfaceDataList = new ArrayList<>();
|
||||
|
||||
for (ScanImageResponseBody.ScanImageResponseBodyDataResultsSubResultsSfaceDataList resultsSubResultsSfaceDataList : resultsSubResults.getSfaceDataList()) {
|
||||
ScanImageResp.SubResultsSfaceDataList resultsSfaceDataList = new ScanImageResp.SubResultsSfaceDataList();
|
||||
List<ScanImageResp.SubResultsSfaceDataListFaces> faces = new ArrayList<>();
|
||||
for (ScanImageResponseBody.ScanImageResponseBodyDataResultsSubResultsSfaceDataListFaces face : resultsSubResultsSfaceDataList.getFaces()) {
|
||||
ScanImageResp.SubResultsSfaceDataListFaces facesData = new ScanImageResp.SubResultsSfaceDataListFaces();
|
||||
facesData.setId(face.getId());
|
||||
facesData.setName(face.getName());
|
||||
facesData.setRate(face.getRate());
|
||||
faces.add(facesData);
|
||||
}
|
||||
resultsSfaceDataList.setFaces(faces);
|
||||
|
||||
sfaceDataList.add(resultsSfaceDataList);
|
||||
}
|
||||
|
||||
subResult.setSfaceDataList(sfaceDataList);
|
||||
subResultsList.add(subResult);
|
||||
}
|
||||
resp.setSubResults(subResultsList);
|
||||
return R.ok().setData(resp);
|
||||
}
|
||||
}
|
||||
}
|
||||
return R.error(aR.getErrorMsg());
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@ -0,0 +1,34 @@
|
||||
package com.heyu.api.request.imageaudit;
|
||||
|
||||
import com.heyu.api.request.CommonReq;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
|
||||
@Data
|
||||
public class ScanImageReq extends CommonReq {
|
||||
|
||||
/**
|
||||
* 指定图片检测的应用场景,可选值包括:
|
||||
* <p>
|
||||
* porn:图片智能鉴黄
|
||||
* <p>
|
||||
* terrorism:图片敏感内容识别、图片风险人物识别
|
||||
* <p>
|
||||
* ad:图片垃圾广告识别
|
||||
* <p>
|
||||
* live:图片不良场景识别
|
||||
* <p>
|
||||
* logo:图片 Logo 识别
|
||||
* <p>
|
||||
* 说明 支持多场景(scenes)一起检测。例如scenes=[“porn”, “terrorism”],即对一张图片同时进行鉴黄和涉恐识别,此时也会按照两个场景计费。
|
||||
* 示例值:
|
||||
* porn
|
||||
*/
|
||||
public List<String> scenes;
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
@ -0,0 +1,269 @@
|
||||
package com.heyu.api.resp.imageaudit;
|
||||
|
||||
|
||||
import com.heyu.api.data.dto.BaseResp;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/***
|
||||
*
|
||||
*
|
||||
* https://next.api.aliyun.com/api/imageaudit/2019-12-30/ScanImage?RegionId=cn-shanghai¶ms={%22Task%22:[{%22ImageURL%22:%22http://workbench-file-transfer.oss-cn-shanghai.aliyuncs.com/user-files/3d1ce4eb-1ff5-4210-adf1-8f4413cd39e7-Xnip2025-03-16_16-03-24.jpg?OSSAccessKeyId&Expires=1742112424&Signature=h5EZtZ5dk4hiLMKw7oEK1NsdSwQ%3D&response-content-disposition=attachment%22}]}&tab=DOC&lang=JAVA
|
||||
*
|
||||
*
|
||||
*
|
||||
*/
|
||||
@Data
|
||||
public class ScanImageResp extends BaseResp {
|
||||
|
||||
|
||||
/***
|
||||
* 图像 URL 地址。
|
||||
*
|
||||
* 示例值:
|
||||
* http://xxx.xxx.xxx/xxx.jpg
|
||||
*
|
||||
*/
|
||||
private String imageURL;
|
||||
|
||||
|
||||
private List<SubResults> subResults;
|
||||
|
||||
|
||||
/***
|
||||
* 单张图片的检测结果。
|
||||
*
|
||||
*/
|
||||
@Data
|
||||
public static class SubResults {
|
||||
/**
|
||||
* 如果待检测图片因为过长被截断,该参数返回截断后的每一帧图像的临时访问地址供您参考。
|
||||
* 被截断的图片的临时访问 URL,地址有效期是 5 分钟。
|
||||
*
|
||||
* 示例值:
|
||||
* http://xxx.xxx.com/xxx-0.jpg
|
||||
* Rate
|
||||
* number<float>
|
||||
* 结果为该分类的概率,取值范围为 0~100。值越高,表示越有可能属于该分类。
|
||||
*
|
||||
* 示例值:
|
||||
* 89.85
|
||||
*/
|
||||
private List<SubResultsFrames> subResultsFrames;
|
||||
|
||||
/***
|
||||
* 图片中含有广告时,返回图片中广告文字命中的风险关键词信息。格式为数组。
|
||||
*
|
||||
* 说明 仅适用于 ad 场景。示例值:”hintWordsInfo”:[{“context”:”敏感词”}]。
|
||||
*
|
||||
*/
|
||||
private List<SubResultsHintWordsInfoList> subResultsHintWordsInfoList;
|
||||
|
||||
/***
|
||||
* 图片中含有 Logo 时,返回识别出来的 Logo 信息。
|
||||
*
|
||||
* 说明 仅适用于 Logo 场景。
|
||||
*/
|
||||
private List<SubResultsLogoDataList> subResultsLogoDataList;
|
||||
|
||||
|
||||
/***
|
||||
* 识别到的图片中的完整文字信息。
|
||||
*
|
||||
* 示例值:
|
||||
* abc
|
||||
*
|
||||
*/
|
||||
public java.util.List<String> OCRDataList;
|
||||
|
||||
/***
|
||||
* 图片中含有小程序码时,返回小程序码的位置信息。
|
||||
*
|
||||
* 说明 仅适用于 qrcode 场景,且已通过钉钉群(23109592)联系我们开通了小程序码识别。
|
||||
*
|
||||
*/
|
||||
private List<SubResultsProgramCodeDataList> subResultsProgramCodeDataListList;
|
||||
|
||||
|
||||
public Float rate;
|
||||
|
||||
public String scene;
|
||||
|
||||
/***
|
||||
* 图片中包含暴恐敏感内容时,返回识别出来的暴恐敏感信息。
|
||||
*
|
||||
* 说明 仅适用于 terrorism 和 sface 场景。关于该参数在 sface 场景中的具体内容,请参见敏感人脸检测。
|
||||
*
|
||||
*/
|
||||
public java.util.List<SubResultsSfaceDataList> sfaceDataList;
|
||||
|
||||
/**
|
||||
* 建议您执行的操作。
|
||||
*
|
||||
* pass:图片正常,无需进行其余操作;或者未识别出目标对象。
|
||||
*
|
||||
* review:检测结果不确定,需要进行人工审核;或者未识别出目标对象。
|
||||
*
|
||||
* block:图片违规,建议执行进一步操作(如直接删除或做限制处理)。
|
||||
*
|
||||
* 示例值:
|
||||
* block
|
||||
*
|
||||
*/
|
||||
public String suggestion;
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Data
|
||||
public static class SubResultsFrames {
|
||||
public Float rate;
|
||||
|
||||
public String URL;
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Data
|
||||
public static class SubResultsHintWordsInfoList {
|
||||
|
||||
public String context;
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Data
|
||||
public static class SubResultsLogoDataList {
|
||||
/**
|
||||
* Logo 区域高度。
|
||||
*
|
||||
* 示例值:
|
||||
* 106
|
||||
*/
|
||||
public Float height;
|
||||
|
||||
/**
|
||||
* 识别出的 Logo 名称。
|
||||
*
|
||||
* 示例值:
|
||||
* abc
|
||||
*/
|
||||
public String name;
|
||||
|
||||
/**
|
||||
* 识别出的 logo 类型,取值为 TV(台标)。
|
||||
*
|
||||
* 示例值:
|
||||
* TV
|
||||
*/
|
||||
public String type;
|
||||
|
||||
/**
|
||||
* Logo 区域宽度。
|
||||
*
|
||||
* 示例值:
|
||||
* 106
|
||||
*
|
||||
*/
|
||||
public Float width;
|
||||
|
||||
/**
|
||||
* 以图片左上角为坐标原点,Logo 区域左上角到 x 轴距离。
|
||||
*
|
||||
* 示例值:
|
||||
* 68
|
||||
*/
|
||||
public Float x;
|
||||
|
||||
/**
|
||||
* 以图片左上角为坐标原点,Logo 区域左上角到 y 轴距离。
|
||||
*
|
||||
* 示例值:
|
||||
* 140
|
||||
*/
|
||||
public Float y;
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Data
|
||||
public static class SubResultsProgramCodeDataList {
|
||||
/**
|
||||
*小程序码区域高度。
|
||||
*
|
||||
* 示例值:
|
||||
* 413.0
|
||||
*/
|
||||
public Float height;
|
||||
/**
|
||||
* 小程序码区域宽度。
|
||||
*
|
||||
* 示例值:
|
||||
* 402.0
|
||||
*/
|
||||
public Float width;
|
||||
|
||||
/**
|
||||
* 以图片左上角为坐标原点,小程序码区域左上角到 y 轴距离。
|
||||
*
|
||||
* 示例值:
|
||||
* 11.0
|
||||
*
|
||||
*/
|
||||
public Float x;
|
||||
|
||||
/**
|
||||
* 以图片左上角为坐标原点,小程序码区域左上角到 x 轴距离。
|
||||
*
|
||||
* 示例值:
|
||||
* 0.0
|
||||
*/
|
||||
public Float y;
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Data
|
||||
public static class SubResultsSfaceDataListFaces {
|
||||
|
||||
/***
|
||||
* 人脸 ID。
|
||||
*
|
||||
* 示例值:
|
||||
* AliFace_0001234
|
||||
*/
|
||||
public String id;
|
||||
/**
|
||||
* 相似人物的名称。
|
||||
*
|
||||
* 示例值:
|
||||
* abc
|
||||
*/
|
||||
public String name;
|
||||
|
||||
/**
|
||||
* 相似概率。
|
||||
*
|
||||
* 示例值:
|
||||
* 91.54
|
||||
*/
|
||||
public Float rate;
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Data
|
||||
public static class SubResultsSfaceDataList {
|
||||
/**
|
||||
* 识别出的人脸信息。
|
||||
*/
|
||||
public List<SubResultsSfaceDataListFaces> faces;
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user