1. 앞서 학습한 yolo tiny model을 이식하기 위한 방법을 조사했다.
내가 조사한 방법으로는 2가지가 존재했다.
1) Tensorflow
이식하기 위해 모델을 pb확장자로 변경해야한다.
pb확장자 변환기가 오픈소스로 존재했지만 해당 변환기는 우리가 학습한 버전의 모델은 지원하지 않았다.
그리고, 변환 시 모델의 성능감소 가능성이 있다.
2) OpenCV
cfg, weight파일을 그대로 사용할 수 있다.
2. 위의 조사 결과로 OpenCV를 사용해 모델을 탑재하기로 결정했다. 우선 안드로이드에서 OpenCV를 사용하기위한 환경 설정 과정이 필요했다.
1) opencv의 android sdk(3.4버전) 다운로드
2) 안드로이드 스튜디오에서 모듈을 import해 sdk파일을 불러온 후, dependency 수정
3) jniLibs 파일 업로드 (openCV의 lib파일을 넣는다)
3. 코드 작성
cfg파일과 weight파일을 assets에 넣어 경로를 불러오는 방식으로 사용했다.
Dnn.NMSBoxes메서드 작성 시 boxes 관련 변수 타입으로 Rect2d와 MatOfRect2d를 사용했다.
그리고, 우리 모델의 모든 클래스 명을 학습했던 순서대로 넣어주었다.
4. 테스트
OpenCV Native라이브러리를 추가 후 테스트를 진행했다.
우리가 학습한 yolo-tiny.cfg파일과 weight파일을 넣어 안드로이드 앱을 실행해보았다.
(안드로이드에서 돌리기 전에 cmd로 해당 파일들이 잘 동작하는지 확인 하였다.)
이때, 두 가지 문제가 발생했다.
1) 화면이 파랗게 뜬다.
2) 안드로이드 폰이 없어 에뮬레이터의 기본 카메라 화면을 사용해 음직 이미지를 테스트할 방법이 없을까?
우선, 이미지에 대한 테스트 방법을 생각하다가 카메라 화면 내부의 월페이퍼 이미지를 설정했다.
그 결과 음식을 잘 인식했다.
3) 하지만, 해당 음식과 라벨의 음식 명이 맞지 않았다. 원인을 파악해보니 라벨명을 담은 배열의 인덱스가 밀린 것이었다.
이 문제들을 해결하고 파란 화면 에러를 해결하기 위해 여러가지를 시도했다.
a. 먼저 에뮬레이터 문제인지 기본 카메라 앱 확인
b. 카메라와 관련된 모든 코드 주석처리 해보았지만 아님
c. 색과 관련된 모든 코드 수정해보기
이 코드에서 기존 RGBA2RGB를 BGR로 수정했더니 고쳐졌다.
그 결과, 해당 음식이 어떤 음식인지 라벨도 잘 뜨고, 영역도 정확히 캐치하며, 퍼센트도 확인할 수 있다.
5. 이미지를 불러와 검출하도록 만들기
해당 부분은 구글링을 통해서도 예제를 찾지 못했다. 대부분 비디오를 이용한 실시간 검출 방법만을 소개했다.
따라서 이를 구현하기위해 먼저 코드를 분석했다.
분석을 토대로 코드를 수정해보았지만 아무런 에러도 나지 않으면서 출력도 되지 않았다.
최고의 고비..
그러다가 결국 성공했다.
코드는 기존 자바 카메라뷰를 지우고, Mat와 Bitmap을 변환하여 이미지를 띄우도록 했다.
음식이 아닌 이미지를 구분하는 코드도 추가했다.
'Project > Capstone' 카테고리의 다른 글
[졸업작품 프로젝트] 애플리케이션 완성하기 (0) | 2021.11.13 |
---|---|
[졸업작품 프로젝트] 갤러리의 모든 사진 중 음식 이미지만 보여주기 (0) | 2021.11.13 |
[졸업작품 프로젝트] Object Detection 모델 만들기 (0) | 2021.11.12 |