본문 바로가기
멀티캠퍼스 풀스택 과정/AI

[CFR(Face Recognition)] 유명인 얼굴 인식 구현하기

by 이쟝 2022. 4. 6.

https://www.ncloud.com/ 에 접속해 로그인 후(메뉴 > 서비스 > 구현할 서비스 선택 후 이용 신청)

 

메뉴 > 서비스 > AI Service CLOVA Face Recognition > 사용가이드 > CFR API v1 바로가기(API 가이드로) > 왼쪽 메뉴 탭에서 celebrity(유명인 얼굴 인식) > API 예제에서 Java 복사하기

 

2022.04.06 - [멀티캠퍼스 풀스택 과정/AI] - [CFR(Face Recognition)] 얼굴인식 구현하기

지난 포스팅에서 쓰인 home.jsp 사용하기

1. home.jsp에 celebrity form 연결 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>home.jsp</title>
</head>
<body>
	<h1>Ai Service API</h1>
	<ol>
		<li><a href="/cfrform">CFRecognition:얼굴감지</a></li>
		<li><a href="/cfrform2">CFR(Celebrity):유명인감지</a></li>
	</ol>
</body>
</html>

2. Home에서 CFR(Celebrity)로 넘어갈 파일 생성 Clova_cfr_celebrity.jsp 

기존에 있던 Clova_cfr_recognition.jsp와 파일 구조는 동일

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>clova_cfr_celebrity</title>
</head>
<body>
<form method="post" id="uploadForm" enctype="multipart/form-data" >
	이미지 선택 : <input type="file" id="image" name="image"/><br/>
	<button>확인</button>
</form><br/>
<textarea id="text" rows="10" cols="100"></textarea>
</body>
</html>

데이터를 Ajax로 보내기 

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script>
	$(function(){
		$("#uploadForm").submit(function(){
			event.preventDefault();
			let data = new FormData($("#uploadForm")[0]); // 폼이 한 개 밖에 없어서
			$.ajax({
				type:"post",
				dataType:"text",
				url:"/cfrCelebrity", // PostMapping("/cfrCelebrity")
				processData:false,
				contentType:false,
				data:data,
				success:function(result){
					$("#text").val(result);
				}
			});
		});
	});
</script>
</head>
<body>
<form method="post" id="uploadForm" enctype="multipart/form-data" >
	이미지 선택 : <input type="file" id="image" name="image"/><br/>
	<button>확인</button>
</form><br/>
<textarea id="text" rows="10" cols="100"></textarea>
</body>
</html>

3. 맵핑할 Controller생성하기 

@GetMapping("/cfrform2")
	public String cfrForm() {
		return "clova_cfr_celebrity";
	}
	
	@PostMapping("/cfrCelebrity")
	@ResponseBody
	public String celebrity() {
    
    }
}

1) 애플리케이션 클라이언트 아이디값과 시크릿값을 구한다.

2) 경로를 구하고, 파일업로드할 메서드를 넣는다. (try-catch문에), imgFile = path + "/" + filename으로 변경

3) response 객체를 젼역변수로 설정하고 return값을 return.toString()으로 

@Controller
public class Clova_CFR_celebrity {
	
	@PostMapping("/cfrCelebrity")
	@ResponseBody
	public String celebrity(@RequestParam("image") MultipartFile file, HttpSession session) {
        StringBuffer reqStr = new StringBuffer();
        String clientId = "애플리케이션 클라이언트 아이디값";
        String clientSecret = "애플리케이션 클라이언트 시크릿값";
        String path = session.getServletContext().getRealPath("/file");
        
        StringBuffer response = new StringBuffer();
        
        try {
        	// 파일 업로드
        	String filename = ClovaFileUpload.fileUpload(path, file);

            String paramName = "image"; // 파라미터명은 image로 지정
            String imgFile = path+"/"+filename;
            File uploadFile = new File(imgFile);
            String apiURL = "https://naveropenapi.apigw.ntruss.com/vision/v1/celebrity"; // 유명인 얼굴 인식
            URL url = new URL(apiURL);
            HttpURLConnection con = (HttpURLConnection)url.openConnection();
            con.setUseCaches(false);
            con.setDoOutput(true);
            con.setDoInput(true);
            // multipart request
            String boundary = "---" + System.currentTimeMillis() + "---";
            con.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
            con.setRequestProperty("X-NCP-APIGW-API-KEY-ID", clientId);
            con.setRequestProperty("X-NCP-APIGW-API-KEY", clientSecret);
            OutputStream outputStream = con.getOutputStream();
            PrintWriter writer = new PrintWriter(new OutputStreamWriter(outputStream, "UTF-8"), true);
            String LINE_FEED = "\r\n";
            // file 추가
            String fileName = uploadFile.getName();
            writer.append("--" + boundary).append(LINE_FEED);
            writer.append("Content-Disposition: form-data; name=\"" + paramName + "\"; filename=\"" + fileName + "\"").append(LINE_FEED);
            writer.append("Content-Type: "  + URLConnection.guessContentTypeFromName(fileName)).append(LINE_FEED);
            writer.append(LINE_FEED);
            writer.flush();
            FileInputStream inputStream = new FileInputStream(uploadFile);
            byte[] buffer = new byte[4096];
            int bytesRead = -1;
            while ((bytesRead = inputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, bytesRead);
            }
            outputStream.flush();
            inputStream.close();
            writer.append(LINE_FEED).flush();
            writer.append("--" + boundary + "--").append(LINE_FEED);
            writer.close();
            BufferedReader br = null;
            int responseCode = con.getResponseCode();
            if(responseCode==200) { // 정상 호출
                br = new BufferedReader(new InputStreamReader(con.getInputStream()));
            } else {  // 오류 발생
                System.out.println("error!!!!!!! responseCode= " + responseCode);
                br = new BufferedReader(new InputStreamReader(con.getInputStream()));
            }
            String inputLine;
            if(br != null) {
                //StringBuffer response = new StringBuffer();
                while ((inputLine = br.readLine()) != null) {
                    response.append(inputLine);
                }
                br.close();
                System.out.println(response.toString());
            }
        } catch (Exception e) {
            System.out.println(e);
        }
		return response.toString();
	}
}

 

실행결과

 

만약 value값에 한글이 깨지면 Preferences > Workspace > Text file encoding에서 UTF-8로 바꿔야한다!

그 외에도 Web에 CSS Files, HTML Files, JSP Files, XML Files를 다 UTF-8로 바꾸기!

혹시라도 안되면 application.properties에 한글인코딩 추가하기!!

server.port=port숫자

spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

#한글인코딩
spring.mandatory-file-encoding=UTF-8
server.servlet.encoding.charset=UTF-8
server.servlet.encoding.enabled=true