SceneMarkShapeServiceImpl.java 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. package com.fdkankan.scene.service.impl;
  2. import cn.hutool.core.io.FileUtil;
  3. import cn.hutool.core.lang.UUID;
  4. import cn.hutool.core.util.ObjectUtil;
  5. import cn.hutool.core.util.StrUtil;
  6. import com.alibaba.fastjson.JSON;
  7. import com.alibaba.fastjson.JSONObject;
  8. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  9. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  10. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  11. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  12. import com.fdkankan.common.constant.ErrorCode;
  13. import com.fdkankan.model.constants.ConstantFilePath;
  14. import com.fdkankan.rabbitmq.util.RabbitMqProducer;
  15. import com.fdkankan.scene.entity.SceneMarkShape;
  16. import com.fdkankan.scene.mapper.MarkShapeMapper;
  17. import com.fdkankan.scene.service.ISceneMarkShapeService;
  18. import com.fdkankan.scene.util.ConverxyUtil;
  19. import com.fdkankan.scene.vo.SceneMarkShapeParamVO;
  20. import com.fdkankan.scene.vo.SceneMarkShapeReDetectParamVO;
  21. import com.fdkankan.web.response.ResultData;
  22. import lombok.extern.slf4j.Slf4j;
  23. import org.springframework.beans.factory.annotation.Autowired;
  24. import org.springframework.beans.factory.annotation.Value;
  25. import org.springframework.stereotype.Service;
  26. import org.springframework.web.multipart.MultipartFile;
  27. import java.io.File;
  28. import java.io.IOException;
  29. import java.util.ArrayList;
  30. import java.util.Date;
  31. import java.util.List;
  32. /**
  33. * Created by Xiewj on 2021/11/23 0026 10:14
  34. */
  35. @Slf4j
  36. @Service
  37. public class SceneMarkShapeServiceImpl extends ServiceImpl<MarkShapeMapper, SceneMarkShape> implements ISceneMarkShapeService {
  38. @Autowired
  39. private RabbitMqProducer rabbitMqProducer;
  40. @Value("${queue.scene.yolov5-train-queue}")
  41. private String yolov5TrainQueue;
  42. @Value("${main.url}")
  43. private String mainUrl;
  44. @Override
  45. public void editTrainStatus(SceneMarkShapeParamVO param) {
  46. SceneMarkShape byNumAndImagePath = findByNumAndImagePath(param.getNum(), param.getImagePath());
  47. if (ObjectUtil.isNotNull(byNumAndImagePath)){
  48. byNumAndImagePath.setReTrain(0);
  49. byNumAndImagePath.setToTrain(1);
  50. updateById(byNumAndImagePath);
  51. }
  52. }
  53. @Override
  54. public List<SceneMarkShape> findByReTrainStatus(Integer reTrain){
  55. LambdaQueryWrapper<SceneMarkShape> wrapper = Wrappers.lambdaQuery();
  56. wrapper.eq(SceneMarkShape::getReTrain,reTrain);
  57. return list(wrapper);
  58. }
  59. @Override
  60. public List<SceneMarkShape> findByToTrainStatus(Integer toTrain) {
  61. QueryWrapper queryWrapper = new QueryWrapper();
  62. queryWrapper.select("DISTINCT num")
  63. .eq("to_train",toTrain) ;
  64. return getBaseMapper().selectList(queryWrapper);
  65. }
  66. @Override
  67. public void trainScene(SceneMarkShapeReDetectParamVO param) {
  68. //查询需要重新训练的图片
  69. List<SceneMarkShape> reDetectStatuList = findByReTrainStatus(1);
  70. for (SceneMarkShape shape : reDetectStatuList) {
  71. SceneMarkShapeReDetectParamVO paramVO=new SceneMarkShapeReDetectParamVO();
  72. paramVO.setWebSite(mainUrl);
  73. if (StrUtil.isNotEmpty(param.getSaveDir())){
  74. paramVO.setSaveDir(param.getSaveDir());
  75. }
  76. paramVO.setNum(shape.getNum());
  77. paramVO.setImagePath(shape.getImagePath());
  78. paramVO.setDetectType(1);
  79. rabbitMqProducer.sendByWorkQueue(yolov5TrainQueue,paramVO);
  80. }
  81. //查询需要进入训练的场景
  82. List<SceneMarkShape> byToDetectStatus = findByToTrainStatus(0);
  83. for (SceneMarkShape shape : byToDetectStatus) {
  84. SceneMarkShapeReDetectParamVO paramVO=new SceneMarkShapeReDetectParamVO();
  85. paramVO.setWebSite(mainUrl);
  86. if (StrUtil.isNotEmpty(param.getSaveDir())){
  87. paramVO.setSaveDir(param.getSaveDir());
  88. }
  89. paramVO.setNum(shape.getNum());
  90. paramVO.setDetectType(2);
  91. rabbitMqProducer.sendByWorkQueue(yolov5TrainQueue,paramVO);
  92. }
  93. }
  94. @Override
  95. public ResultData editLabelByFile(String num, String imgPath, MultipartFile file) throws IOException {
  96. SceneMarkShape shape = findByNumAndImagePath(num, imgPath);
  97. if (ObjectUtil.isNotNull(shape)){
  98. String uuid = UUID.randomUUID().toString();
  99. String fileName = file.getOriginalFilename();
  100. String extName = FileUtil.extName(fileName);
  101. String tempFileName = uuid + "." + extName;
  102. String srcPath = ConstantFilePath.SCENE_V4_PATH + num + "/markShapes/" + tempFileName;
  103. File tempFile = new File(srcPath);
  104. if(!tempFile.getParentFile().exists()){
  105. tempFile.getParentFile().mkdirs();
  106. }
  107. file.transferTo(tempFile);
  108. List<String> s = FileUtil.readUtf8Lines(tempFile);
  109. List<JSONObject> shapeJsons=new ArrayList<>();
  110. //转换labelimg标注处理的结果
  111. log.info("转换labelimg标注处理的结果开始");
  112. for (String s1 : s) {
  113. int[] ints = ConverxyUtil.centerWh2xyxy(s1, 4096,2048);
  114. String[] s2 = s1.split(" ");
  115. JSONObject shapeJson=new JSONObject();
  116. shapeJson.put("bbox",ints);
  117. shapeJson.put("color",ConverxyUtil.getColor(s2[0]));
  118. shapeJson.put("label",s1);
  119. shapeJson.put("category",ConverxyUtil.getLabelVal(s2[0]));
  120. shapeJson.put("score",0);
  121. shapeJsons.add(shapeJson);
  122. }
  123. log.info("转换labelimg标注处理的结果结束,{}",shapeJsons);
  124. shape.setShapes(shapeJsons);
  125. shape.setReTrain(1);
  126. shape.setUpdateTime(new Date());
  127. updateById(shape);
  128. return ResultData.ok(shape);
  129. }else {
  130. return ResultData.error(ErrorCode.NOT_RECORD);
  131. }
  132. }
  133. @Override
  134. public SceneMarkShape findByNumAndImagePath(String num, String imagePath) {
  135. LambdaQueryWrapper<SceneMarkShape> wrapper = Wrappers.lambdaQuery();
  136. wrapper.eq(SceneMarkShape::getNum,num);
  137. wrapper.eq(SceneMarkShape::getImagePath,imagePath);
  138. return getOne(wrapper);
  139. }
  140. @Override
  141. public void saveFileToDB(MultipartFile file, String num) throws IOException {
  142. String uuid = UUID.randomUUID().toString();
  143. String fileName = file.getOriginalFilename();
  144. String extName = cn.hutool.core.io.FileUtil.extName(fileName);
  145. String tempFileName = uuid + "." + extName;
  146. String srcPath = ConstantFilePath.SCENE_V4_PATH + num + "/markShapes/" + tempFileName;
  147. File tempFile = new File(srcPath);
  148. if(!tempFile.getParentFile().exists()){
  149. tempFile.getParentFile().mkdirs();
  150. }
  151. file.transferTo(tempFile);
  152. String s = FileUtil.readUtf8String(tempFile);
  153. JSONObject jsonObject = JSONObject.parseObject(s);
  154. tempFile.delete();
  155. SceneMarkShape sceneMarkShape= JSON.toJavaObject(jsonObject,SceneMarkShape.class);
  156. sceneMarkShape.setNum(num);
  157. SceneMarkShape shape = findByNumAndImagePath(sceneMarkShape.getNum(), sceneMarkShape.getImagePath());
  158. if (ObjectUtil.isNotNull(shape)){
  159. log.info("shape-替换id修改---{}",sceneMarkShape);
  160. sceneMarkShape.setId(shape.getId());
  161. updateById(sceneMarkShape);
  162. }else {
  163. log.info("新增-替换id修改---{}",sceneMarkShape);
  164. log.info("MarkShapeMapper---{}",sceneMarkShape);
  165. save(sceneMarkShape);
  166. }
  167. }
  168. @Override
  169. public List<SceneMarkShape> findByNumAndType(String num,Integer type) {
  170. LambdaQueryWrapper<SceneMarkShape> wrapper = Wrappers.lambdaQuery();
  171. wrapper.eq(SceneMarkShape::getNum,num);
  172. wrapper.eq(SceneMarkShape::getType,type);
  173. return list(wrapper);
  174. }
  175. @Override
  176. public List<SceneMarkShape> findByNum(String num) {
  177. LambdaQueryWrapper<SceneMarkShape> wrapper = Wrappers.lambdaQuery();
  178. wrapper.eq(SceneMarkShape::getNum,num);
  179. return list(wrapper);
  180. }
  181. }