|
@@ -1,31 +1,40 @@
|
|
|
package com.taais.biz.service.impl;
|
|
|
|
|
|
+import java.io.File;
|
|
|
+import java.io.IOException;
|
|
|
import java.util.Arrays;
|
|
|
import java.util.List;
|
|
|
+import java.util.Random;
|
|
|
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
|
+import com.esotericsoftware.minlog.Log;
|
|
|
import com.mybatisflex.core.paginate.Page;
|
|
|
import com.mybatisflex.core.query.QueryWrapper;
|
|
|
import com.taais.biz.constant.BizConstant;
|
|
|
+import com.taais.biz.domain.TargetIdentificationSubtask;
|
|
|
import com.taais.biz.domain.bo.TargetIdentificationSubtaskBo;
|
|
|
import com.taais.biz.domain.bo.TargetIdentificationSubtaskDetailsBo;
|
|
|
import com.taais.biz.domain.dto.task.CreateTargetIdentificationTaskDto;
|
|
|
import com.taais.biz.domain.dto.task.TaskDto;
|
|
|
-import com.taais.biz.service.ITargetIdentificationSubtaskDetailsService;
|
|
|
-import com.taais.biz.service.ITargetIdentificationSubtaskService;
|
|
|
+import com.taais.biz.domain.vo.AlgorithmModelVo;
|
|
|
+import com.taais.biz.domain.vo.AlgorithmTaskConfigurationVo;
|
|
|
+import com.taais.biz.domain.vo.DataVo;
|
|
|
+import com.taais.biz.service.*;
|
|
|
import com.taais.common.core.utils.MapstructUtils;
|
|
|
import com.taais.common.core.utils.StringUtils;
|
|
|
+import com.taais.common.core.utils.uuid.UUID;
|
|
|
import com.taais.common.orm.core.page.PageQuery;
|
|
|
import com.taais.common.core.core.page.PageResult;
|
|
|
import com.taais.common.orm.core.service.impl.BaseServiceImpl;
|
|
|
import jakarta.annotation.Resource;
|
|
|
+import org.apache.commons.io.FileUtils;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
import com.taais.biz.mapper.TargetIdentificationTaskMapper;
|
|
|
import com.taais.biz.domain.TargetIdentificationTask;
|
|
|
import com.taais.biz.domain.bo.TargetIdentificationTaskBo;
|
|
|
import com.taais.biz.domain.vo.TargetIdentificationTaskVo;
|
|
|
-import com.taais.biz.service.ITargetIdentificationTaskService;
|
|
|
+
|
|
|
import static com.taais.biz.domain.table.TargetIdentificationTaskTableDef.TARGET_IDENTIFICATION_TASK;
|
|
|
|
|
|
/**
|
|
@@ -44,6 +53,12 @@ public class TargetIdentificationTaskServiceImpl extends BaseServiceImpl<TargetI
|
|
|
@Resource
|
|
|
private ITargetIdentificationSubtaskDetailsService subtaskDetailsService;
|
|
|
|
|
|
+ @Resource
|
|
|
+ private IAlgorithmTaskConfigurationService algorithmTaskConfigurationService;
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private DataServiceImpl dataService;
|
|
|
+
|
|
|
@Override
|
|
|
public QueryWrapper query() {
|
|
|
return super.query().from(TARGET_IDENTIFICATION_TASK);
|
|
@@ -106,8 +121,23 @@ public class TargetIdentificationTaskServiceImpl extends BaseServiceImpl<TargetI
|
|
|
@Override
|
|
|
public boolean insert(TargetIdentificationTaskBo targetIdentificationTaskBo) {
|
|
|
TargetIdentificationTask targetIdentificationTask =MapstructUtils.convert(targetIdentificationTaskBo, TargetIdentificationTask. class);
|
|
|
+ System.out.println("Insert task: " + targetIdentificationTask);
|
|
|
+
|
|
|
+ boolean result = this.save(targetIdentificationTask);//使用全局配置的雪花算法主键生成器生成ID值
|
|
|
+
|
|
|
+ System.out.println("Insert task: " + targetIdentificationTask);
|
|
|
|
|
|
- return this.save(targetIdentificationTask);//使用全局配置的雪花算法主键生成器生成ID值
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ public TargetIdentificationTask insertTask(TargetIdentificationTaskBo targetIdentificationTaskBo) {
|
|
|
+ TargetIdentificationTask targetIdentificationTask =MapstructUtils.convert(targetIdentificationTaskBo, TargetIdentificationTask. class);
|
|
|
+
|
|
|
+ boolean result = this.save(targetIdentificationTask);//使用全局配置的雪花算法主键生成器生成ID值
|
|
|
+
|
|
|
+ System.out.println("Insert task: " + targetIdentificationTask);
|
|
|
+
|
|
|
+ return targetIdentificationTask;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -138,6 +168,15 @@ public class TargetIdentificationTaskServiceImpl extends BaseServiceImpl<TargetI
|
|
|
return this.removeByIds(Arrays.asList(ids));
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public void taskRun() {
|
|
|
+ TargetIdentificationTask task = targetIdentificationTaskMapper.getAvailableTask();
|
|
|
+ if (task == null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ subtaskService.taskRun(task);
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
@Transactional
|
|
|
public String createTask(CreateTargetIdentificationTaskDto taskDto) {
|
|
@@ -152,8 +191,9 @@ public class TargetIdentificationTaskServiceImpl extends BaseServiceImpl<TargetI
|
|
|
TargetIdentificationTaskBo taskBo = new TargetIdentificationTaskBo();
|
|
|
taskBo.setName(taskDto.getTaskName());
|
|
|
taskBo.setStatus(BizConstant.TASK_STATUS_PENDING);
|
|
|
- // todo 确保保存后有id
|
|
|
- this.insert(taskBo);
|
|
|
+ TargetIdentificationTask task = this.insertTask(taskBo);
|
|
|
+ taskBo.setId(task.getId());
|
|
|
+ System.out.println("taskBo is: " + taskBo);
|
|
|
|
|
|
// 创建训练子任务
|
|
|
if(taskDto.getTaskItemList().contains(CreateTargetIdentificationTaskDto.TASK_TYPE_SINGLE_DATA_AND_MORE_ALGORITHM)){
|
|
@@ -166,47 +206,167 @@ public class TargetIdentificationTaskServiceImpl extends BaseServiceImpl<TargetI
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
- private void createTestTask(Long taskId, CreateTargetIdentificationTaskDto taskDto) {
|
|
|
+ private void createTrainTask(Long taskId, CreateTargetIdentificationTaskDto taskDto) {
|
|
|
List<TaskDto> algTaskList = taskDto.getAlgTaskList();
|
|
|
- List<String> testBatchNumList = taskDto.getTestBatchNumList();
|
|
|
+ List<String> trainBatchNumList = taskDto.getTrainBatchNumList();
|
|
|
+ if (trainBatchNumList.isEmpty()) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
TargetIdentificationSubtaskBo subtask = new TargetIdentificationSubtaskBo();
|
|
|
- subtask.setName("测试");
|
|
|
+ subtask.setName("训练");
|
|
|
subtask.setStatus(BizConstant.TASK_STATUS_PENDING);
|
|
|
subtask.setTaskId(taskId);
|
|
|
- // todo set others params
|
|
|
-
|
|
|
- // todo 保证有主键id
|
|
|
+ subtask.setRemarks("DEFAULT_REMARK");
|
|
|
|
|
|
- subtaskService.insert(subtask);
|
|
|
+ TargetIdentificationSubtask savedTask = subtaskService.insertSubtask(subtask);
|
|
|
+ subtask.setId(savedTask.getId());
|
|
|
+ System.out.println("subtask is: " + subtask);
|
|
|
|
|
|
for (TaskDto algTask : algTaskList) {
|
|
|
// 通过算法id 获取算法配置
|
|
|
Long algorithmId = algTask.getAlgorithmId();
|
|
|
- // todo
|
|
|
- String algUrl = "";
|
|
|
- String algName = "";
|
|
|
- // algConfig = xxxService.getById(algorithmId)
|
|
|
- // alg algUrl = algConfig.getTestUrl()
|
|
|
- // alg algName = algConfig.getName()
|
|
|
-
|
|
|
- for (String batchNum : testBatchNumList) {
|
|
|
- createSubTaskDetails(subtask, algUrl,algName, algTask, testBatchNumList);
|
|
|
+ AlgorithmTaskConfigurationVo algorithmModelVo = algorithmTaskConfigurationService.selectById(algorithmId);
|
|
|
+
|
|
|
+ String algUrl = algorithmModelVo.getTestUrl();
|
|
|
+ String algName = algorithmModelVo.getName();
|
|
|
+ List<String> params = List.of(algTask.getParams().split(";;;"));
|
|
|
+
|
|
|
+ for (int i = 0; i < trainBatchNumList.size(); i++) {
|
|
|
+ String batchNum = trainBatchNumList.get(i);
|
|
|
+ TargetIdentificationSubtaskDetailsBo subtaskDetail = new TargetIdentificationSubtaskDetailsBo();
|
|
|
+ // 通过算法id获取算法配置
|
|
|
+ subtaskDetail.setSubtaskId(subtask.getId());
|
|
|
+ subtaskDetail.setName(algName);
|
|
|
+ subtaskDetail.setStatus(BizConstant.TASK_STATUS_PENDING);
|
|
|
+ subtaskDetail.setAlgorithmId(algTask.getAlgorithmId());
|
|
|
+ subtaskDetail.setType(algUrl);
|
|
|
+ subtaskDetail.setDataBatchNums(batchNum);
|
|
|
+ subtaskDetail.setParameters(params.get(0));
|
|
|
+ // todo 获取预处理路径
|
|
|
+ String subtaskPath = "/" + UUID.randomUUID().toString().replace("-", "_");
|
|
|
+ subtaskDetail.setPreprocessPath(subtaskPath);
|
|
|
+ subtaskDetail.setResultPath(subtaskPath + "/result");
|
|
|
+ subtaskDetail.setIndex((long) i);
|
|
|
+ copyFilesToPath(batchNum, subtaskPath);
|
|
|
+
|
|
|
+ subtaskDetailsService.insert(subtaskDetail);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private void createSubTaskDetails(TargetIdentificationSubtaskBo subtask, String algUrl, String algName, TaskDto algTask, List<String> testBatchNumList) {
|
|
|
- //
|
|
|
- TargetIdentificationSubtaskDetailsBo subtaskDetail = new TargetIdentificationSubtaskDetailsBo();
|
|
|
- // 通过算法id获取算法配置
|
|
|
- subtaskDetail.setName(algName);
|
|
|
- subtaskDetailsService.insert(subtaskDetail);
|
|
|
+ public static final String PATH_PREFIX = "ObjectDetection_Web/task";
|
|
|
+ /**
|
|
|
+ * 移动文件到对应文件夹
|
|
|
+ * @param batch
|
|
|
+ * @param path
|
|
|
+ */
|
|
|
+ private void copyFilesToPath(String batch, String path) {
|
|
|
+ String[] batches = batch.split(",");
|
|
|
+
|
|
|
+ File dir = new File(PATH_PREFIX + path);
|
|
|
+ if (!dir.exists()) {
|
|
|
+ dir.mkdirs();
|
|
|
+ }
|
|
|
+ dir = new File(PATH_PREFIX + path + "/images");
|
|
|
+ if (!dir.exists()) {
|
|
|
+ dir.mkdirs();
|
|
|
+ }
|
|
|
+ dir = new File(PATH_PREFIX + path + "/labels");
|
|
|
+ if (!dir.exists()) {
|
|
|
+ dir.mkdirs();
|
|
|
+ }
|
|
|
+ dir = new File(PATH_PREFIX + path + "/result");
|
|
|
+ if (!dir.exists()) {
|
|
|
+ dir.mkdirs();
|
|
|
+ }
|
|
|
+
|
|
|
+ System.out.println(dir.getAbsolutePath());
|
|
|
+
|
|
|
+ for (String batchNum : batches) {
|
|
|
+ List<DataVo> dataVoList = dataService.getDataByBatchNum(batchNum);
|
|
|
+ for (DataVo dataVo : dataVoList) {
|
|
|
+ String[] strings = dataVo.getUrl().split("/profile");
|
|
|
+ String relativePath = "ObjectDetection_Web" + strings[strings.length - 1];
|
|
|
+ File file = new File(relativePath);
|
|
|
+ System.out.println(file.getAbsolutePath());
|
|
|
+ if (file.exists()) {
|
|
|
+ try {
|
|
|
+ File dist = new File(PATH_PREFIX + path + "/images/" + file.getName());
|
|
|
+ FileUtils.copyFile(file, dist);
|
|
|
+ System.out.println("file dist: " + dist.getAbsolutePath());
|
|
|
+ } catch (IOException e) {
|
|
|
+ Log.debug("bug found");
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (dataVo.getLabelurl() != null) {
|
|
|
+ strings = dataVo.getLabelurl().split("/profile");
|
|
|
+ relativePath = "ObjectDetection_Web" + strings[strings.length - 1];
|
|
|
+ file = new File(relativePath);
|
|
|
+ if (file.exists()) {
|
|
|
+ try {
|
|
|
+ File dist = new File(PATH_PREFIX + path + "/labels/" + file.getName());
|
|
|
+ FileUtils.copyFile(file, dist);
|
|
|
+ System.out.println("file dist: " + dist.getAbsolutePath());
|
|
|
+ } catch (IOException e) {
|
|
|
+ Log.debug("bug found");
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- private void createTrainTask(Long taskId, CreateTargetIdentificationTaskDto taskDto) {
|
|
|
+ private void createTestTask(Long taskId, CreateTargetIdentificationTaskDto taskDto) {
|
|
|
+ List<TaskDto> algTaskList = taskDto.getAlgTaskList();
|
|
|
+ List<String> testBatchNumList = taskDto.getTestBatchNumList();
|
|
|
+ if (testBatchNumList.isEmpty()) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ TargetIdentificationSubtaskBo subtask = new TargetIdentificationSubtaskBo();
|
|
|
+ subtask.setName("测试");
|
|
|
+ subtask.setStatus(BizConstant.TASK_STATUS_PENDING);
|
|
|
+ subtask.setTaskId(taskId);
|
|
|
+ subtask.setRemarks("DEFAULT_REMARK");
|
|
|
+
|
|
|
+ TargetIdentificationSubtask savedTask = subtaskService.insertSubtask(subtask);
|
|
|
+ subtask.setId(savedTask.getId());
|
|
|
+ System.out.println("subtask is: " + subtask);
|
|
|
+
|
|
|
+ for (TaskDto algTask : algTaskList) {
|
|
|
+ // 通过算法id 获取算法配置
|
|
|
+ Long algorithmId = algTask.getAlgorithmId();
|
|
|
+ AlgorithmTaskConfigurationVo algorithmModelVo = algorithmTaskConfigurationService.selectById(algorithmId);
|
|
|
+
|
|
|
+ String algUrl = algorithmModelVo.getTestUrl();
|
|
|
+ String algName = algorithmModelVo.getName();
|
|
|
+ List<String> params = List.of(algTask.getParams().split(";;;"));
|
|
|
+
|
|
|
+ for (int i = 0; i < testBatchNumList.size(); i++) {
|
|
|
+ String batchNum = testBatchNumList.get(i);
|
|
|
+ TargetIdentificationSubtaskDetailsBo subtaskDetail = new TargetIdentificationSubtaskDetailsBo();
|
|
|
+ // 通过算法id获取算法配置
|
|
|
+ subtaskDetail.setSubtaskId(subtask.getId());
|
|
|
+ subtaskDetail.setName(algName);
|
|
|
+ subtaskDetail.setStatus(BizConstant.TASK_STATUS_PENDING);
|
|
|
+ subtaskDetail.setAlgorithmId(algTask.getAlgorithmId());
|
|
|
+ subtaskDetail.setType(algUrl);
|
|
|
+ subtaskDetail.setDataBatchNums(batchNum);
|
|
|
+ subtaskDetail.setParameters(params.get(2));
|
|
|
+ // todo 获取预处理路径
|
|
|
+ String subtaskPath = "/" + UUID.randomUUID().toString().replace("-", "_");
|
|
|
+ subtaskDetail.setPreprocessPath(subtaskPath);
|
|
|
+ subtaskDetail.setResultPath(subtaskPath + "/result");
|
|
|
+ subtaskDetail.setIndex((long) i);
|
|
|
+ copyFilesToPath(batchNum, subtaskPath);
|
|
|
|
|
|
+ subtaskDetailsService.insert(subtaskDetail);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
+
|
|
|
// todo 检查数据是否有问题
|
|
|
private String checkTask(CreateTargetIdentificationTaskDto taskDto) {
|
|
|
return null;
|