智能标注应用层代码 提交
This commit is contained in:
parent
9c89f087c8
commit
8cfdc1f082
|
|
@ -0,0 +1,33 @@
|
||||||
|
package com.bonus.ai.client.intelligentAnnotation;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author wangvivi
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class AnnotationRequest {
|
||||||
|
|
||||||
|
@JsonProperty("image_urls")
|
||||||
|
private List<String> imageUrls;
|
||||||
|
|
||||||
|
@JsonProperty("target_labels")
|
||||||
|
private List<String> targetLabels;
|
||||||
|
|
||||||
|
@JsonProperty("conf_threshold")
|
||||||
|
private Double confThreshold;
|
||||||
|
|
||||||
|
public static AnnotationRequest fromJson(String json) throws JsonProcessingException {
|
||||||
|
return new ObjectMapper().readValue(json, AnnotationRequest.class);
|
||||||
|
}
|
||||||
|
public String toJson() throws Exception {
|
||||||
|
ObjectMapper mapper = new ObjectMapper();
|
||||||
|
return mapper.writeValueAsString(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,49 @@
|
||||||
|
package com.bonus.ai.client.intelligentAnnotation;
|
||||||
|
|
||||||
|
import com.bonus.ai.client.ProjectParam;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author wangvivi
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class AnnotationResult {
|
||||||
|
|
||||||
|
@JsonProperty("annotations") // 指定 JSON 属性名
|
||||||
|
private Map<String, List<Annotation>> annotations;
|
||||||
|
|
||||||
|
// 内部类:表示每个图片路径下的标注信息
|
||||||
|
@Data
|
||||||
|
public static class Annotation {
|
||||||
|
|
||||||
|
@JsonProperty("label")
|
||||||
|
private String label;
|
||||||
|
|
||||||
|
@JsonProperty("x")
|
||||||
|
private double x;
|
||||||
|
|
||||||
|
@JsonProperty("y")
|
||||||
|
private double y;
|
||||||
|
|
||||||
|
@JsonProperty("width")
|
||||||
|
private double width;
|
||||||
|
|
||||||
|
@JsonProperty("height")
|
||||||
|
private double height;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static AnnotationResult fromJson(String json) throws JsonProcessingException {
|
||||||
|
return new ObjectMapper().readValue(json, AnnotationResult.class);
|
||||||
|
}
|
||||||
|
public String toJson() throws Exception {
|
||||||
|
ObjectMapper mapper = new ObjectMapper();
|
||||||
|
return mapper.writeValueAsString(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,62 @@
|
||||||
|
package com.bonus.ai.client.intelligentAnnotation;
|
||||||
|
|
||||||
|
import com.bonus.ai.client.ProjectInputParam;
|
||||||
|
import com.bonus.ai.client.ProjectParam;
|
||||||
|
import com.bonus.ai.client.TaskInputParam;
|
||||||
|
import com.bonus.ai.client.TaskParam;
|
||||||
|
import com.bonus.ai.config.OnlineAnnotateConfig;
|
||||||
|
import com.bonus.ai.domain.dataset.ReleaseVersionEntity;
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import okhttp3.*;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@Service
|
||||||
|
public class IntelligentAnnotationServiceOkHttp {
|
||||||
|
|
||||||
|
private static final OkHttpClient client = new OkHttpClient.Builder()
|
||||||
|
.connectTimeout(10, TimeUnit.SECONDS)
|
||||||
|
.readTimeout(60, TimeUnit.SECONDS)
|
||||||
|
.writeTimeout(60, TimeUnit.SECONDS).build();
|
||||||
|
|
||||||
|
private static final ObjectMapper objectMapper = new ObjectMapper(); // 用于JSON序列化和反序列化
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 调用智能标注服务进行标注
|
||||||
|
*/
|
||||||
|
// Create project
|
||||||
|
public AnnotationResult intelligentAnnotation(String serviceEndPoint, AnnotationRequest annotationParam) throws IOException {
|
||||||
|
String url = serviceEndPoint ;
|
||||||
|
String json = objectMapper.writeValueAsString(annotationParam);
|
||||||
|
|
||||||
|
RequestBody body = RequestBody.create(json, MediaType.parse("application/json"));
|
||||||
|
|
||||||
|
log.error("Request JSON: " + json);
|
||||||
|
Request request = new Request.Builder()
|
||||||
|
.url(url)
|
||||||
|
.post(body)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
String response = executeRequest(request);
|
||||||
|
return AnnotationResult.fromJson(response);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private String executeRequest(Request request) throws IOException {
|
||||||
|
try (Response response = client.newCall(request).execute()) {
|
||||||
|
if (!response.isSuccessful()) {
|
||||||
|
throw new IOException("Unexpected code " + response);
|
||||||
|
}
|
||||||
|
return response.body() != null ? response.body().string() : null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,87 @@
|
||||||
|
package com.bonus.ai.controller;
|
||||||
|
|
||||||
|
import com.bonus.ai.client.intelligentAnnotation.AnnotationRequest;
|
||||||
|
import com.bonus.ai.client.intelligentAnnotation.AnnotationResult;
|
||||||
|
import com.bonus.ai.client.intelligentAnnotation.IntelligentAnnotationServiceOkHttp;
|
||||||
|
import com.bonus.ai.domain.DataSetBasicFileEntity;
|
||||||
|
import com.bonus.ai.domain.dataset.AnnotationTaskAnnotatorEntity;
|
||||||
|
import com.bonus.ai.domain.dataset.AnnotationTaskEntity;
|
||||||
|
import com.bonus.ai.domain.dataset.IntelligentAnnotationServiceEntity;
|
||||||
|
import com.bonus.ai.service.DataSetTeamMemberService;
|
||||||
|
import com.bonus.ai.service.dataset.AnnotationTaskService;
|
||||||
|
import com.bonus.ai.service.dataset.IntelligentAnnotationService;
|
||||||
|
import com.bonus.ai.utils.MinioUtil;
|
||||||
|
import com.bonus.common.core.web.domain.AjaxResult;
|
||||||
|
import com.bonus.common.security.annotation.RequiresPermissions;
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
import org.apache.catalina.security.SecurityUtil;
|
||||||
|
import org.apache.commons.io.IOUtils;
|
||||||
|
import org.checkerframework.checker.units.qual.A;
|
||||||
|
import org.springframework.util.ObjectUtils;
|
||||||
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.zip.ZipEntry;
|
||||||
|
import java.util.zip.ZipOutputStream;
|
||||||
|
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/intelligentAnnotation")
|
||||||
|
public class IntelligentAnnotationController {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private IntelligentAnnotationService intelligentAnnotationService;
|
||||||
|
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private AnnotationTaskService annotationTaskService;
|
||||||
|
|
||||||
|
@RequiresPermissions("dataCenter:annotation:intelligentAnnotation:list")
|
||||||
|
@GetMapping("/service/list")
|
||||||
|
public AjaxResult getAIAnnotationServiceList() {
|
||||||
|
try {
|
||||||
|
List<IntelligentAnnotationServiceEntity> serviceList = intelligentAnnotationService.getAIAnnotationServiceList();
|
||||||
|
return AjaxResult.success(serviceList);
|
||||||
|
}catch (Exception e){
|
||||||
|
return AjaxResult.error("获取智能标注服务列表失败");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**智能标注,预留接口
|
||||||
|
* @param task 标注文件的信息
|
||||||
|
* @return 返回影响的行数或错误信,AnnotationTaskAnnotatorEntity
|
||||||
|
*/
|
||||||
|
@PostMapping("/annotate")
|
||||||
|
public AjaxResult aiAnnotate(@Validated @RequestBody AnnotationTaskEntity task) throws IOException {
|
||||||
|
try {
|
||||||
|
IntelligentAnnotationServiceEntity service = intelligentAnnotationService.getAIAnnotationServiceById(task.getIntelligentAnnotationServiceId());
|
||||||
|
if (ObjectUtils.isEmpty(service)) {
|
||||||
|
return AjaxResult.error("未找到指定的AI服务");
|
||||||
|
}
|
||||||
|
//获取标注任务id和标签信息
|
||||||
|
AnnotationTaskEntity taskInfo = annotationTaskService.getTaskInfo(task.getTaskId());
|
||||||
|
|
||||||
|
//根据任务id,获取由我标注的未标注的文件列表
|
||||||
|
List<DataSetBasicFileEntity> fileList = annotationTaskService.getMyAnnotaionTaskBasicFile(task.getTaskId(), "2");
|
||||||
|
|
||||||
|
//根据以上信息进行智能标注,并将标注结果保存数据库
|
||||||
|
intelligentAnnotationService.aiAnnotate(taskInfo, fileList, service);
|
||||||
|
|
||||||
|
return AjaxResult.success();
|
||||||
|
}catch (Exception e){
|
||||||
|
return AjaxResult.error();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -203,17 +203,6 @@ public class AnnotationTaskController extends BaseController {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**智能标注,预留接口
|
|
||||||
* @param subTask 标注文件的信息
|
|
||||||
* @return 返回影响的行数或错误信
|
|
||||||
*/
|
|
||||||
@PostMapping("/aiAnnotate")
|
|
||||||
public AjaxResult aiAnnotate(@Validated @RequestBody AnnotationTaskAnnotatorEntity subTask) {
|
|
||||||
|
|
||||||
annotationTaskService.aiAnnotate(subTask);
|
|
||||||
return AjaxResult.success();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**获取由我标注的未完成标注的任务列表
|
/**获取由我标注的未完成标注的任务列表
|
||||||
* @return 标注任务列表
|
* @return 标注任务列表
|
||||||
|
|
|
||||||
|
|
@ -79,6 +79,9 @@ public class AnnotationTaskEntity extends BaseEntity {
|
||||||
/**最新版本数*/
|
/**最新版本数*/
|
||||||
private String lastVersionName;
|
private String lastVersionName;
|
||||||
|
|
||||||
|
/**用于传入智能标注信息*/
|
||||||
|
private Long intelligentAnnotationServiceId;
|
||||||
|
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
public static class UserFileCount{
|
public static class UserFileCount{
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
package com.bonus.ai.domain.dataset;
|
||||||
|
|
||||||
|
import com.bonus.common.core.web.domain.BaseEntity;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class IntelligentAnnotationServiceEntity extends BaseEntity {
|
||||||
|
private Long serviceId;
|
||||||
|
private String serviceName;
|
||||||
|
private String serviceUrl;
|
||||||
|
private String annotationLabels;
|
||||||
|
/**删除标志(0代表存在 1代表删除) */
|
||||||
|
private String delFlag;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,48 @@
|
||||||
|
package com.bonus.ai.mapper;
|
||||||
|
|
||||||
|
import com.bonus.ai.domain.dataset.IntelligentAnnotationServiceEntity;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文件基础Mapper接口
|
||||||
|
*
|
||||||
|
* @author bonus
|
||||||
|
* @date 2024-11-14
|
||||||
|
*/
|
||||||
|
public interface IntelligentAnnotationMapper
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* 插入智能标注服务信息
|
||||||
|
* @param serviceInfo 智能标注服务信息
|
||||||
|
* @return 影响的行数
|
||||||
|
*/
|
||||||
|
int insertIntelligentAnnotationService(IntelligentAnnotationServiceEntity serviceInfo);
|
||||||
|
|
||||||
|
int deleteIntelligentAnnotationService(Long serviceId);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新智能标注服务信息
|
||||||
|
* @param serviceInfo 智能标注服务信息
|
||||||
|
* @return 影响的行数
|
||||||
|
*/
|
||||||
|
int updateIntelligentAnnotationService(IntelligentAnnotationServiceEntity serviceInfo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取所有未被删除的服务信息列表
|
||||||
|
* @return 服务信息
|
||||||
|
*/
|
||||||
|
List<IntelligentAnnotationServiceEntity> getIntelligentAnnotationService();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取所有未被删除的服务信息列表
|
||||||
|
* @return 服务信息
|
||||||
|
*/
|
||||||
|
IntelligentAnnotationServiceEntity getIntelligentAnnotationServiceById(Long serviceId);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,128 @@
|
||||||
|
package com.bonus.ai.service.Impl.dataset;
|
||||||
|
|
||||||
|
import com.bonus.ai.client.intelligentAnnotation.AnnotationRequest;
|
||||||
|
import com.bonus.ai.client.intelligentAnnotation.AnnotationResult;
|
||||||
|
import com.bonus.ai.client.intelligentAnnotation.IntelligentAnnotationServiceOkHttp;
|
||||||
|
import com.bonus.ai.config.MinioConfig;
|
||||||
|
import com.bonus.ai.domain.DataSetBasicFileEntity;
|
||||||
|
import com.bonus.ai.domain.dataset.AnnotationTaskAnnotatorEntity;
|
||||||
|
import com.bonus.ai.domain.dataset.AnnotationTaskEntity;
|
||||||
|
import com.bonus.ai.domain.dataset.IntelligentAnnotationServiceEntity;
|
||||||
|
import com.bonus.ai.mapper.AnnotationTaskMapper;
|
||||||
|
import com.bonus.ai.mapper.DatasetMapper;
|
||||||
|
import com.bonus.ai.mapper.IntelligentAnnotationMapper;
|
||||||
|
import com.bonus.ai.service.dataset.IntelligentAnnotationService;
|
||||||
|
import com.bonus.common.core.web.domain.AjaxResult;
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.util.ObjectUtils;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@Service
|
||||||
|
public class IntelligentAnnotationServiceImpl implements IntelligentAnnotationService {
|
||||||
|
@Resource
|
||||||
|
private IntelligentAnnotationMapper intelligentAnnotationMapper;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
IntelligentAnnotationServiceOkHttp intelligentAnnotationClient;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private AnnotationTaskMapper annotationTaskMapper;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private MinioConfig minioConfig;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<IntelligentAnnotationServiceEntity> getAIAnnotationServiceList() {
|
||||||
|
return intelligentAnnotationMapper.getIntelligentAnnotationService();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IntelligentAnnotationServiceEntity getAIAnnotationServiceById(Long serviceId) {
|
||||||
|
return intelligentAnnotationMapper.getIntelligentAnnotationServiceById(serviceId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AjaxResult aiAnnotate(AnnotationTaskEntity taskInfo, List<DataSetBasicFileEntity> fileList, IntelligentAnnotationServiceEntity aiAnnotationServiceInfo) {
|
||||||
|
try {
|
||||||
|
if (ObjectUtils.isEmpty(taskInfo) || ObjectUtils.isEmpty(fileList) || fileList.isEmpty() || ObjectUtils.isEmpty(aiAnnotationServiceInfo))
|
||||||
|
{
|
||||||
|
return AjaxResult.error("标注任务或智能标注服务不存在,或没有未标注文件");
|
||||||
|
}
|
||||||
|
List<String> imageUrls = new ArrayList<>();
|
||||||
|
String minioUrl =minioConfig.getEndpoint() + File.separator + minioConfig.getBucketName()+File.separator;
|
||||||
|
for (DataSetBasicFileEntity file : fileList) {
|
||||||
|
imageUrls.add(minioUrl + file.getFileUrl());
|
||||||
|
}
|
||||||
|
String serviceUrl = aiAnnotationServiceInfo.getServiceUrl();
|
||||||
|
AnnotationRequest request = new AnnotationRequest();
|
||||||
|
request.setConfThreshold(0.1);
|
||||||
|
request.setImageUrls(imageUrls);
|
||||||
|
request.setTargetLabels(ObjectUtils.isEmpty(taskInfo.getLabels()) ? new ArrayList<>() : Arrays.asList(taskInfo.getLabels().split(",")));
|
||||||
|
AnnotationResult result = intelligentAnnotationClient.intelligentAnnotation(serviceUrl, request);
|
||||||
|
if (ObjectUtils.isEmpty(result)){
|
||||||
|
log.error("远程调用智能标注服务,没有返回标注结果");
|
||||||
|
return AjaxResult.error("智能标注失败");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取 annotations 的值
|
||||||
|
Map<String, List<AnnotationResult.Annotation>> annotations = result.getAnnotations();
|
||||||
|
|
||||||
|
for (Map.Entry<String, List<AnnotationResult.Annotation>> entry : annotations.entrySet()) {
|
||||||
|
String imagePath = entry.getKey();
|
||||||
|
List<AnnotationResult.Annotation> annotationList = entry.getValue();
|
||||||
|
|
||||||
|
// 创建 ObjectMapper 实例
|
||||||
|
ObjectMapper objectMapper = new ObjectMapper();
|
||||||
|
System.out.println("Image Path: " + imagePath);
|
||||||
|
|
||||||
|
String jsonString = "";
|
||||||
|
// 遍历每个图片路径下的标注信息列表
|
||||||
|
if (annotationList != null) {
|
||||||
|
jsonString = objectMapper.writeValueAsString(annotationList);
|
||||||
|
log.info("智能标注结果:{} ", jsonString);
|
||||||
|
} else {
|
||||||
|
log.info("No annotations for image path, {}", imagePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
Long fileId = findFileIdByFileUrl(fileList, imagePath);
|
||||||
|
if (!ObjectUtils.isEmpty(fileId)) {
|
||||||
|
//TODO 将文件的标注信息存数据库
|
||||||
|
AnnotationTaskAnnotatorEntity annotationTaskAnnotatorEntity = new AnnotationTaskAnnotatorEntity();
|
||||||
|
annotationTaskAnnotatorEntity.setFileId(fileId);
|
||||||
|
annotationTaskAnnotatorEntity.setTaskId(taskInfo.getTaskId());
|
||||||
|
annotationTaskAnnotatorEntity.setAnnotationResource("1");
|
||||||
|
annotationTaskAnnotatorEntity.setAnnotationResult(jsonString);
|
||||||
|
annotationTaskMapper.updateAnnotationInfo(annotationTaskAnnotatorEntity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}catch (Exception e) {
|
||||||
|
log.error("智能标注异常,异常原因:{}", e.getMessage());
|
||||||
|
return AjaxResult.error("智能标注异常");
|
||||||
|
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 从 fileList 中根据 fileUrl 查找对应的 fileId。
|
||||||
|
*
|
||||||
|
* @param fileList 要查找的文件列表
|
||||||
|
* @param targetFileUrl 目标文件的URL
|
||||||
|
* @return 如果找到则返回对应的 fileId,否则返回 null
|
||||||
|
*/
|
||||||
|
public Long findFileIdByFileUrl(List<DataSetBasicFileEntity> fileList, String targetFileUrl) {
|
||||||
|
return fileList.stream()
|
||||||
|
.filter(fileEntity -> targetFileUrl.contains(fileEntity.getFileUrl()))
|
||||||
|
.map(DataSetBasicFileEntity::getFileId)
|
||||||
|
.findFirst()
|
||||||
|
.orElse(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
package com.bonus.ai.service.dataset;
|
||||||
|
|
||||||
|
import com.bonus.ai.client.intelligentAnnotation.AnnotationRequest;
|
||||||
|
import com.bonus.ai.domain.DataSetBasicFileEntity;
|
||||||
|
import com.bonus.ai.domain.dataset.AnnotationTaskEntity;
|
||||||
|
import com.bonus.ai.domain.dataset.DataSetEntity;
|
||||||
|
import com.bonus.ai.domain.dataset.IntelligentAnnotationServiceEntity;
|
||||||
|
import com.bonus.common.core.web.domain.AjaxResult;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public interface IntelligentAnnotationService {
|
||||||
|
|
||||||
|
List<IntelligentAnnotationServiceEntity> getAIAnnotationServiceList();
|
||||||
|
|
||||||
|
IntelligentAnnotationServiceEntity getAIAnnotationServiceById(Long serviceId);
|
||||||
|
|
||||||
|
AjaxResult aiAnnotate(AnnotationTaskEntity taskInfo,List<DataSetBasicFileEntity> filelist,IntelligentAnnotationServiceEntity aiAnnotationServiceInfo);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,77 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
<!DOCTYPE mapper
|
||||||
|
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||||
|
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
|
|
||||||
|
<mapper namespace="com.bonus.ai.mapper.IntelligentAnnotationMapper">
|
||||||
|
|
||||||
|
<!-- 定义 ResultMap -->
|
||||||
|
<resultMap id="IntelligentAnnotationServiceResultMap" type="com.bonus.ai.domain.dataset.IntelligentAnnotationServiceEntity">
|
||||||
|
<id property="serviceId" column="intelligent_annotation_service_id"/>
|
||||||
|
<result property="serviceName" column="intelligent_annotation_service_name"/>
|
||||||
|
<result property="serviceUrl" column="intelligent_annotation_service_url"/>
|
||||||
|
<result property="annotationLabels" column="intelligent_annotation_service_labels"/>
|
||||||
|
<result property="delFlag" column="del_flag"/>
|
||||||
|
<result property="createBy" column="create_by"/>
|
||||||
|
<result property="createTime" column="create_time"/>
|
||||||
|
<result property="updateBy" column="update_by"/>
|
||||||
|
<result property="updateTime" column="update_time"/>
|
||||||
|
</resultMap>
|
||||||
|
|
||||||
|
<!-- 插入 -->
|
||||||
|
<insert id="insertIntelligentAnnotationService" parameterType="com.bonus.ai.domain.dataset.IntelligentAnnotationServiceEntity" useGeneratedKeys="true" keyProperty="serviceId">
|
||||||
|
INSERT INTO ai_intelligent_annotation_service
|
||||||
|
<trim prefix="(" suffix=")" suffixOverrides=",">
|
||||||
|
<if test="serviceName != null and serviceName != ''">intelligent_annotation_service_name,</if>
|
||||||
|
<if test="serviceUrl != null and serviceUrl != ''">intelligent_annotation_service_url,</if>
|
||||||
|
<if test="annotationLabels != null and annotationLabels != ''">intelligent_annotation_service_labels,</if>
|
||||||
|
<if test="delFlag != null">del_flag,</if>
|
||||||
|
<if test="createBy != null">create_by,</if>
|
||||||
|
<if test="createTime != null">create_time,</if>
|
||||||
|
<if test="updateBy != null">update_by,</if>
|
||||||
|
<if test="updateTime != null">update_time,</if>
|
||||||
|
</trim>
|
||||||
|
<trim prefix="VALUES (" suffix=")" suffixOverrides=",">
|
||||||
|
<if test="serviceName != null and serviceName != ''">#{serviceName},</if>
|
||||||
|
<if test="serviceUrl != null and serviceUrl != ''">#{serviceUrl},</if>
|
||||||
|
<if test="annotationLabels != null and annotationLabels != ''">#{annotationLabels},</if>
|
||||||
|
<if test="delFlag != null">#{delFlag},</if>
|
||||||
|
<if test="createBy != null">#{createBy},</if>
|
||||||
|
<if test="createTime != null">#{createTime},</if>
|
||||||
|
<if test="updateBy != null">#{updateBy},</if>
|
||||||
|
<if test="updateTime != null">#{updateTime},</if>
|
||||||
|
</trim>
|
||||||
|
</insert>
|
||||||
|
|
||||||
|
<!-- 更新 -->
|
||||||
|
<update id="updateIntelligentAnnotationService">
|
||||||
|
UPDATE ai_intelligent_annotation_service
|
||||||
|
SET intelligent_annotation_service_name = #{serviceName},
|
||||||
|
intelligent_annotation_service_url = #{serviceUrl},
|
||||||
|
intelligent_annotation_service_labels = #{annotationLabels},
|
||||||
|
del_flag = #{delFlag},
|
||||||
|
update_by = #{updateBy},
|
||||||
|
update_time = #{updateTime}
|
||||||
|
WHERE intelligent_annotation_service_id = #{serviceId}
|
||||||
|
</update>
|
||||||
|
|
||||||
|
<update id="deleteIntelligentAnnotationService">
|
||||||
|
UPDATE ai_intelligent_annotation_service
|
||||||
|
SET del_flag = '1'
|
||||||
|
WHERE intelligent_annotation_service_id = #{serviceId}
|
||||||
|
</update>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- 按 ID 查询 -->
|
||||||
|
<select id="getIntelligentAnnotationServiceById" resultMap="IntelligentAnnotationServiceResultMap">
|
||||||
|
SELECT * FROM ai_intelligent_annotation_service
|
||||||
|
WHERE intelligent_annotation_service_id = #{serviceId}
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<!-- 查询所有有效记录 -->
|
||||||
|
<select id="getIntelligentAnnotationService" resultMap="IntelligentAnnotationServiceResultMap">
|
||||||
|
SELECT * FROM ai_intelligent_annotation_service
|
||||||
|
WHERE del_flag = '0'
|
||||||
|
</select>
|
||||||
|
|
||||||
|
</mapper>
|
||||||
|
|
@ -233,3 +233,41 @@ create table ai_version_file_map
|
||||||
)engine=innodb comment = '版本和文件关联表';
|
)engine=innodb comment = '版本和文件关联表';
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*==============================================================*/
|
||||||
|
/* Table: ai_intelligent_annotation_service */
|
||||||
|
/*==============================================================*/
|
||||||
|
drop table if exists ai_intelligent_annotation_service;
|
||||||
|
create table ai_intelligent_annotation_service
|
||||||
|
(
|
||||||
|
intelligent_annotation_service_id bigint(20) not null auto_increment,
|
||||||
|
intelligent_annotation_service_name varchar(128) default '' comment '智能标注服务名称',
|
||||||
|
intelligent_annotation_service_url varchar(128) default '' comment '智能标注服务url',
|
||||||
|
intelligent_annotation_service_labels varchar(128) default '' comment '智能标注服务标签',
|
||||||
|
del_flag char(1) default '0' comment '是否删除(0代表存在,1代表删除)',
|
||||||
|
create_by varchar(64) default '' comment '创建者',
|
||||||
|
update_by varchar(64) default '' comment '更新者',
|
||||||
|
update_time datetime default null comment '更新时间',
|
||||||
|
create_time datetime default null comment '创建时间',
|
||||||
|
primary key(intelligent_annotation_service_id)
|
||||||
|
)engine=innodb comment = '智能标注服务;
|
||||||
|
|
||||||
|
INSERT INTO ai_intelligent_annotation_service (
|
||||||
|
intelligent_annotation_service_name,
|
||||||
|
intelligent_annotation_service_url,
|
||||||
|
intelligent_annotation_service_labels,
|
||||||
|
del_flag,
|
||||||
|
create_by,
|
||||||
|
update_by,
|
||||||
|
update_time,
|
||||||
|
create_time
|
||||||
|
) VALUES (
|
||||||
|
'丝束缺陷检测', -- 智能标注服务名称
|
||||||
|
'http://192.168.0.21:8081/annotate', -- 智能标注服务URL
|
||||||
|
'tiaojuan,zhujiesi,yulinwen', -- 智能标注服务标签
|
||||||
|
'0', -- 是否删除 (0代表存在)
|
||||||
|
'admin', -- 创建者
|
||||||
|
'admin', -- 更新者
|
||||||
|
NOW(), -- 更新时间
|
||||||
|
NOW() -- 创建时间
|
||||||
|
);
|
||||||
Loading…
Reference in New Issue