2023 한이음 프로젝트

틈메이러·2024년 10월 4일

포트폴리오

목록 보기
10/11
post-thumbnail

🍅주제

AR과 인공지능을 활용한 과일 자동분류 및 신선도 확인 서비스 개발
GitHub Link


1. 개발환경

프로그래밍 언어: Java, Python
개발환경: IntellJ, AndroidStudio, Visual Studio Code
프레임워크: Spring Boot, Tensorflow Lite
기타: Unity, Teachable machine, Blender, AWS EC2


2. 개발배경

건강관리의 관심이 증대되면서 과일, 채소류를 섭취하는 사람들이 많아지고 있음
최근 국내 과일에 비해 수입 과일의 소비량이 더 증가하는 경향을 보이고 있음
다양한 개량품종 과일들의 등장으로 과일의 종류 및 효능들이 정말 다양해지고 있음
과일 소비자들은 생소한 수입과일이나 개량품종 과일들에 대한 지식이 부족


3. 나의 역할

프론트엔트로 UI 제작
AR 제작 및 어플리케이션과 연동


4. 기능

사용자 커뮤니티 : 과일의 맛, 좋은 과일을 보는tip, 과일을 맛본 후기 등 사용자들의 경험을 공유할 수 있는 커뮤니티
과일 추천 : 제철과일 추천 및 사용자 관심사를 통한 추천 서비스 제공
과일 정보제공 : AI카메라를 이용한 과일 분석을 통하여 과일에 대한 다양한 정보 제공
과일 증강 이미지 : 촬영한 과일에 대한 AR 이미지 형성을 통한 시각적 효과 증대

홈화면



과일 정보 화면


5. 프로젝트 흐름도


6. 기능별 흐름도

과일 정보 제공기능 Flow Chart


사용자 맞춤 과일 추천 FlowChart


과일 성숙도 제공기능 FlowChart


과일 숙기 판정 FlowChart


7. AR

Blender를 통해 직접 만들었다.



8. 시연 영상



🍅문제점 및 해결방법

프론트엔드에서 UI를 구성하는 부분에 있어서 큰 문제점은 없었다. 가장 큰 문제점은 AR을 제작하고 그것을 안드로이드 스튜디오와 연동을 하는 부분이었다.


1. Unity 연동 실패

AR 제작은 Blender에서 직접 만들고 그것을 내보내기(export)한 뒤에 Unity 및 안드로이드 스튜디오와 연동을 하는 방식으로 하려고 했다.

바로 안드로이드 스튜디오와 연동을 하지 않고 Unity에 먼저 연동을 하려고 했었는데, Unity를 통해 AR에 애니메이션이나 특수효과를 넣을 예정이었다.


첫번째 문제점

Blender에서 만든 AR을 Unity에 연동을 할 때에는 보통 ARCore라는 것을 사용한다. 하지만 버전 및 호환성의 문제(더 이상 지원을 안 함)때문에 아무리 시도해도 ARCore를 이용하여 Unity에 연동이 불가능했다.


두번째 문제점

그래서 Blender에서 자체적으로 애니메이션과 특수효과를 넣고 그것을 바로 안드로이드 스튜디오에 연동을 시도했다. 하지만 파일 확장자의 문제와 ARCore의 알 수 없는 문제로 인해 연동이 실패했다.


2. 해결 방법

공식 문서와 홈페이지를 보며 해결 방법을 찾던 중 파일 내보내기를 하면 .OBJ, .FBX등의 형식으로 나오게 되는데 특정 플러그인을 사용하면 JSON 형식으로 내보내기가 가능하다는 것을 알게되었다.

우리는 한 가지 가설을 세웠다. 위 JSON 파일을 서버에 업로드 한 뒤에 그것을 ARCore에서 제공하는 기능을 이용해 파일을 불러오는 방식이었다.


3. Sceneform

해당 방법이 바로 ARCore에서 3D 모델을 렌더링하기 위한 라이브러리 Sceneform이다.
이를 통해 GLTF 또는 JSON 기반의 3D 모델을 로드하는 기능을 제공할 수 있다.


사용 예시

1. Android 표준 JSON 라이브러리: JSONObject, JSONArray 등을 사용하여 JSON 파일을 읽고 데이터를 파싱한다.
JSON 파일을 assets 폴더에 넣고 불러와서 파싱할 수 있다.

InputStream is = getAssets().open("yourfile.json");
int size = is.available();
byte[] buffer = new byte[size];
is.read(buffer);
is.close();
String json = new String(buffer, "UTF-8");

JSONObject obj = new JSONObject(json);

2. GLTF(또는 GLB)와 함께 Sceneform: Sceneform은 3D 모델을 로드하고 렌더링하기 위해 GLTF 파일을 사용할 수 있었다. 이는 JSON 기반 3D 모델 형식이다.

Sceneform의 Renderable 클래스를 통해 GLTF 형식의 JSON 파일을 불러오고, 이를 ARCore에서 렌더링할 수 있다.

ModelRenderable.builder()
    .setSource(this, Uri.parse("model.gltf"))
    .build()
    .thenAccept(renderable -> {
        // 3D 모델을 씬에 추가
    });

4. HTTP 통신 기반 데이터 전송 오류

문제점

AR 기반 모바일 앱에서 AI 분석 서버와의 HTTP 통신을 통해 이미지 데이터와 텍스트 데이터를 함께 전송하려 했지만, 통신 과정에서 데이터를 정확하게 주고받지 못하는 문제가 발생함
특히 이미지가 서버에 전달되지 않거나, 파라미터가 누락되는 현상이 반복적으로 발생했음


원인 분석

HTTP에 대한 기초적인 이해 부족으로, HeaderBody 구조, Content-Type 설정 방식 등에 대한 정확한 설정이 이루어지지 않았음
특히 multipart/form-data, application/jsonContent-Type에 따라 Body의 구성 방식이 달라진다는 점을 명확히 알지 못해 데이터를 서버가 제대로 해석하지 못했던 것이 주요 원인이었음


해결 과정

HTTP 통신 구조(요청 방식, Header, Body)의 기본 개념부터 재정리
→ 특히 GET, POST 요청의 구조 차이, 각 Content-Type의 의미를 학습

multipart/form-data 방식으로 이미지와 텍스트를 함께 전송하는 예제 코드 작성
→ 이미지 파일은 FormData 객체에 Blob 형태로 첨부하고, 텍스트는 필드로 추가

Postman으로 요청 테스트를 반복하며 서버와의 통신 구조를 디버깅
→ 실제 요청 데이터가 서버에 어떻게 전달되는지를 시각적으로 확인하고 문제 수정


결과

이미지와 텍스트 데이터를 동시에 전송하는 로직을 안정적으로 구현할 수 있었으며,

HTTP 통신의 기본 구조와 요청 처리 방식에 대한 실질적인 이해를 갖추게 됨

이후 백엔드와의 API 연동 시 훨씬 구조적인 접근이 가능


5. 기본 카메라 사용 시 사용자 경험 저하

문제점

과일을 스캔하는 AR 기능을 위해 사용자가 직접 카메라를 활용해야 했는데, 처음에는 안드로이드 시스템에서 기본으로 제공하는 Camera 호출 방식(Intent 방식)을 사용
하지만 이 방식은 별도의 카메라 앱이 실행되면서 앱 화면에서 이탈하고, 이미지 촬영 후 다시 돌아오는 구조라 사용 흐름이 끊기고 앱 전환이 느려지는 문제가 발생


원인 분석

시스템 기본 카메라는 앱 외부 Activity로 실행되어, 촬영 전후 사용자 경험이 단절됨

UI가 튀어나갔다 들어오는 느낌이라, AR 기반 앱의 몰입도를 떨어뜨리고 UX 완성도가 떨어짐


해결 과정

CameraX 라이브러리 도입을 검토 및 적용
→ 안드로이드에서 제공하는 Jetpack 라이브러리로, 앱 내에서 카메라 기능을 직접 구성 가능

앱 내 화면 안에서 카메라 프리뷰를 띄우고, 별도 전환 없이 촬영 및 전송 흐름을 구현

AR과 연동되는 부분에서도 카메라 UI를 자연스럽게 녹여, 카메라와 앱 전환 간격 없이 유기적 연결


결과

사용자 입장에서 앱이 끊기지 않고 카메라 화면이 자연스럽게 이어지는 흐름이 구현됨

앱 전환 지연 없이 빠른 이미지 처리와 AR 인식 흐름 확보

전반적인 사용자 경험(UX)과 몰입감이 크게 개선되어, 앱 완성도와 반응성이 눈에 띄게 향상됨

profile
나는야 멋쟁이 토마토

0개의 댓글