Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 64 additions & 0 deletions src/main/java/com/kau/capstone/entity/AI/CatEyes.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package com.kau.capstone.entity.AI;

import com.kau.capstone.entity.pet.Pet;
import com.kau.capstone.v2.ai.dto.response.CatEyeRes;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.Comment;

@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class CatEyes {

@Id
@Comment("안구질환 식별자")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Comment("각막궤양")
private float cornealUlcer;

@Comment("각막부골편")
private float cornealDystcatrophy;

@Comment("결막염")
private float conjunctivitis;

@Comment("안검염")
private float blepharitis;

@Comment("비궤양성 각막질환")
private float nonUlcerativeKeratitis;

@ManyToOne
@JoinColumn(name = "pet_id")
private Pet pet;

private CatEyes(float cornealUlcer, float cornealDystcatrophy, float conjunctivitis,
float blepharitis, float nonUlcerativeKeratitis, Pet pet){
this.cornealUlcer = cornealUlcer;
this.cornealDystcatrophy = cornealDystcatrophy;
this.conjunctivitis = conjunctivitis;
this.blepharitis = blepharitis;
this.nonUlcerativeKeratitis = nonUlcerativeKeratitis;
this.pet = pet;
}

public static CatEyes of(CatEyeRes eyeRes, Pet pet){
return new CatEyes(eyeRes.cornealUlcer(),
eyeRes.cornealDystcatrophy(),
eyeRes.conjunctivitis(),
eyeRes.blepharitis(),
eyeRes.nonUlcerativeKeratitis(),
pet);
}

}
84 changes: 84 additions & 0 deletions src/main/java/com/kau/capstone/entity/AI/DogEyes.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
package com.kau.capstone.entity.AI;

import com.kau.capstone.entity.pet.Pet;
import com.kau.capstone.v2.ai.dto.response.DogEyeRes;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.Comment;

@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class DogEyes {

@Id
@Comment("안구질환 식별자")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Comment("궤양성 각막질환")
private float ulcerativeKeratitis;

@Comment("백내장")
private float cataract;

@Comment("색소침착성각막염")
private float pigmentaryKeratitis;

@Comment("안검내반증")
private float entropion;

@Comment("안검종양")
private float eyelidTumor;

@Comment("유루증")
private float incontinence;

@Comment("핵경화")
private float nuclearSclerosis;

@Comment("결막염")
private float conjunctivitis;

@Comment("안검염")
private float blepharitis;

@Comment("비궤양성 각막질환")
private float nonUlcerativeKeratitis;

@ManyToOne
@JoinColumn(name = "pet_id")
private Pet pet;

private DogEyes(float ulcerativeKeratitis, float cataract, float pigmentaryKeratitis,
float entropion, float eyelidTumor, float incontinence, float nuclearSclerosis,
float conjunctivitis, float blepharitis, float nonUlcerativeKeratitis, Pet pet) {
this.ulcerativeKeratitis = ulcerativeKeratitis;
this.cataract = cataract;
this.pigmentaryKeratitis = pigmentaryKeratitis;
this.entropion = entropion;
this.eyelidTumor = eyelidTumor;
this.incontinence = incontinence;
this.nuclearSclerosis = nuclearSclerosis;
this.conjunctivitis = conjunctivitis;
this.blepharitis = blepharitis;
this.nonUlcerativeKeratitis = nonUlcerativeKeratitis;
this.pet = pet;
}

public static DogEyes of(DogEyeRes eyeRes, Pet pet) {
return new DogEyes(eyeRes.ulcerativeKeratitis(), eyeRes.cataract(),
eyeRes.pigmentaryKeratitis(),
eyeRes.entropion(), eyeRes.eyelidTumor(), eyeRes.incontinence(),
eyeRes.nuclearSclerosis(),
eyeRes.conjunctivitis(), eyeRes.blepharitis(), eyeRes.nonUlcerativeKeratitis(), pet);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.kau.capstone.entity.AI.Repository;

import com.kau.capstone.entity.AI.CatEyes;
import org.springframework.data.jpa.repository.JpaRepository;

public interface CatEyesRepository extends JpaRepository<CatEyes, Long> {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.kau.capstone.entity.AI.Repository;

import com.kau.capstone.entity.AI.DogEyes;
import org.springframework.data.jpa.repository.JpaRepository;

public interface DogEyesRepository extends JpaRepository<DogEyes, Long> {

}
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
package com.kau.capstone.v1.ai.client;
package com.kau.capstone.global.aiModel;

import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
Expand All @@ -22,12 +23,15 @@
@RequiredArgsConstructor
public class AIModelClient {

@Value("${ai.url}")
private String aiModelUrl;

private final RestTemplate restTemplate = new RestTemplate();

public Map<String, Object> analyzeImage(String imageUrl, String petType) {
String aiModelUrl = "http://43.201.197.176:5000/eye";

UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromHttpUrl(aiModelUrl)
public Map<String, Object> analyzeImage(String imageUrl, String petType) {
String url = aiModelUrl + "/eye";
UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromHttpUrl(url)
.queryParam("imageUrl", imageUrl)
.queryParam("petType", petType);

Expand All @@ -42,7 +46,7 @@ public Map<String, Object> analyzeImage(String imageUrl, String petType) {
uriBuilder.toUriString(),
HttpMethod.GET,
requestEntity,
new ParameterizedTypeReference<Map<String, Object>>() {
new ParameterizedTypeReference<>() {
}
);
return response.getBody();
Expand All @@ -65,8 +69,8 @@ public Map<String, Object> analyzeImage(String imageUrl, String petType) {
}

public String registNoseImage(String imageUrl, Long petId) {
String aiModelUrl = "http://3.35.41.30:5000/nose/train";
UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromHttpUrl(aiModelUrl)
String url = aiModelUrl + "/nose/train";
UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromHttpUrl(url)
.queryParam("imageUrl", imageUrl)
.queryParam("petId", petId);

Expand Down Expand Up @@ -103,8 +107,8 @@ public String registNoseImage(String imageUrl, Long petId) {
}

public Map<String, Object> testNoseImage(String imageUrl) {
String aiModelUrl = "http://3.35.41.30:5000/nose/test";
UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromHttpUrl(aiModelUrl)
String url = aiModelUrl + "/nose/test";
UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromHttpUrl(url)
.queryParam("imageUrl", imageUrl);

HttpHeaders headers = new HttpHeaders();
Expand All @@ -117,7 +121,7 @@ public Map<String, Object> testNoseImage(String imageUrl) {
uriBuilder.toUriString(),
HttpMethod.GET,
requestEntity,
new ParameterizedTypeReference<Map<String, Object>>() {
new ParameterizedTypeReference<>() {
}
);
return response.getBody();
Expand Down
50 changes: 0 additions & 50 deletions src/main/java/com/kau/capstone/v1/ai/infra/S3StorageService.java

This file was deleted.

24 changes: 14 additions & 10 deletions src/main/java/com/kau/capstone/v1/ai/service/AIService.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.kau.capstone.v1.ai.service;


import com.kau.capstone.global.aiModel.AIModelClient;
import com.kau.capstone.global.common.s3.FileService;
import com.kau.capstone.v1.ai.AIImage;
import com.kau.capstone.v1.ai.client.AIModelClient;
import com.kau.capstone.v1.ai.infra.S3StorageService;
import java.util.Map;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
Expand All @@ -15,39 +15,43 @@
@RequiredArgsConstructor
public class AIService {

private final S3StorageService s3StorageService;
private final AIModelClient aiModelClient;
private final FileService fileService;

// 이미지를 저장하고 AI 모델에 요청을 보내는 로직
public Map<String, Object> analyzePetImage(MultipartFile imageFile, String petType) {
// S3에 이미지 저장
AIImage savedImage = s3StorageService.uploadImage(imageFile);
String imageUrl = fileService.uploadImage(imageFile, "ai/eyes/");
AIImage savedImage = new AIImage(imageFile.getOriginalFilename(), imageUrl);

// AI 모델 서버로 이미지 URL 전송
Map<String, Object> aiResponse = aiModelClient.analyzeImage(savedImage.getUrl(), petType);

// S3에서 이미지 삭제
s3StorageService.deleteImage(savedImage.getUrl());
fileService.deleteImage(savedImage.getUrl());

return aiResponse;
}

public String registPetNose(MultipartFile image, Long petId) {
// S3에 이미지 저장
AIImage savedImage = s3StorageService.uploadImage(image);
String imageUrl = fileService.uploadImage(image, "ai/nose/train");
AIImage savedImage = new AIImage(image.getOriginalFilename(), imageUrl);

String response = aiModelClient.registNoseImage(savedImage.getUrl(), petId);

// S3에서 이미지 삭제
s3StorageService.deleteImage(savedImage.getUrl());
fileService.deleteImage(savedImage.getUrl());

return response;
}

public Map<String, Object> testPetNose(MultipartFile image){
AIImage savedImage = s3StorageService.uploadImage(image);
public Map<String, Object> testPetNose(MultipartFile image) {
String imageUrl = fileService.uploadImage(image, "ai/nose/test");
AIImage savedImage = new AIImage(image.getOriginalFilename(), imageUrl);

Map<String, Object> response = aiModelClient.testNoseImage(savedImage.getUrl());
s3StorageService.deleteImage(savedImage.getUrl());
fileService.deleteImage(savedImage.getUrl());
return response;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.kau.capstone.v2.ai.controller;

import com.kau.capstone._core.dto.ApiResponse;
import com.kau.capstone.v1.auth.dto.LoginInfo;
import com.kau.capstone.v1.auth.util.LoginUser;
import com.kau.capstone.v2.ai.service.AIServiceV2;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

@RestController
@RequestMapping("api/v2/ai")
@RequiredArgsConstructor
public class AiRestControllerV2 {

private final AIServiceV2 aiService;

@PostMapping("/eye/{petId}")
public ResponseEntity<ApiResponse<Object>> analyzeEye(
@LoginUser LoginInfo loginInfo,
@PathVariable Long petId,
@RequestPart("AnimalImage") MultipartFile image
) {
Object eyeProbs = aiService.analyzeEye(loginInfo, petId, image);
return ApiResponse.ok(eyeProbs);
}


}
Loading
Loading