App 카메라 최적화
얼굴 인식 성능 최적화: App 카메라 최적화 사례
프로젝트 개요
react-native-vision-camera
라이브러리를 활용하여 얼굴 인식을 구현하였다. 하지만 전체 화면에서 얼굴 인식을 수행할 때 성능 저하가 발생하여, 이를 해결하기 위한 최적화 작업을 진행하였다.
문제점
얼굴 인식을 전체 화면에서 진행할 경우 발생한 문제:
- 연산 부하: 많은 양의 이미지 데이터를 처리해야 하며, 이로 인해 메모리 사용량이 증가.
- 속도 저하: 얼굴 인식 속도가 느려지고, 전체 앱 성능이 저하됨.
해결 방법
이 문제를 해결하기 위해 다음과 같은 방법을 적용했다:
1. 영역 제한
문제: 전체 화면에서 얼굴 인식을 수행할 경우 데이터 처리량이 많아 성능이 저하됨.
해결 방법: 얼굴 인식을 전체 화면이 아닌 특정 영역에만 수행하도록 최적화. 이 접근 방식으로 데이터 처리량을 줄였다.
구현 코드:
카메라 프리뷰에서 ROI 설정:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
import { Camera, useCameraDevices } from 'react-native-vision-camera'; const App = () => { const devices = useCameraDevices(); const device = devices.front; return ( device != null && ( <Camera device={device} isActive={true} style= frameProcessor={frame => { // 설정한 영역을 기준으로 얼굴 인식을 수행 const roi = { x: 100, y: 100, width: 200, height: 200 }; const croppedFrame = cropFrame(frame, roi); detectFace(croppedFrame); }} frameProcessorFps={5} // 처리 주기를 설정 /> ) ); }; const cropFrame = (frame, roi) => { // ROI에 맞게 이미지를 자르는 함수 // 하단 코드 참고 }; const detectFace = (frame) => { // 얼굴 인식을 수행하는 함수 // 하단 코드 참고 };
인식할 영역만을 정의하고 해당 영역의 데이터만 처리했다.
2. 빈도 조절 및 영역 내 인식
문제: 얼굴 인식의 빈도가 높아 불필요한 연산이 발생했다.
해결 방법: 얼굴 인식 빈도를 조절하고, 얼굴이 지정된 영역 내에 있을 때만 인식을 수행하도록 개선했다.
구현 코드:
빈도 조절:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
import { useRef } from 'react'; import { Camera } from 'react-native-vision-camera'; const App = () => { const lastDetectionTime = useRef(Date.now()); return ( <Camera // 카메라 설정 frameProcessor={frame => { const now = Date.now(); if (now - lastDetectionTime.current > 500) { // 500ms마다 인식 lastDetectionTime.current = now; const roi = { x: 100, y: 100, width: 200, height: 200 }; const croppedFrame = cropFrame(frame, roi); detectFace(croppedFrame); } }} /> ); };
영역 내 인식:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
typescriptCopy code const detectFace = (frame) => { // 얼굴 인식 로직 const faces = detectFacesInFrame(frame); faces.forEach(face => { if (isFaceInROI(face, { x: 100, y: 100, width: 200, height: 200 })) { // ROI 내의 얼굴만 처리한다. } }); }; const isFaceInROI = (face, roi) => { // 얼굴이 ROI 내에 있는지 확인 };
1. detectFace
함수
이 함수는 이미지 프레임에서 얼굴을 인식하고, 인식된 얼굴이 ROI(관심 영역) 내에 있는지 확인하는 역할을 합니다. 아래는 detectFace
함수의 자세한 구현 예시입니다:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
const detectFace = (frame: ImageFrame) => {
// 얼굴 인식 로직
// `detectFacesInFrame` 함수는 프레임에서 얼굴을 탐지하여 얼굴 정보 배열을 반환.
const faces = detectFacesInFrame(frame);
// ROI 설정 (x, y, width, height)
const roi = { x: 100, y: 100, width: 200, height: 200 };
faces.forEach(face => {
// `isFaceInROI` 함수는 얼굴이 설정한 ROI 내에 있는지 확인
if (isFaceInROI(face, roi)) {
// ROI 내의 얼굴만 처리
// 여기에서 얼굴 인식 후의 추가 작업을 수행할 수 있다.
console.log("Detected face in ROI:", face);
}
});
};
detectFacesInFrame(frame)
: 프레임에서 얼굴을 탐지하여 얼굴 정보가 담긴 배열을 반환하는 함수. 얼굴 인식 라이브러리의 API를 호출하여 구현.roi
: 관심 영역을 설정하는 객체입니다. 이 영역 내에서만 얼굴 인식을 수행.isFaceInROI(face, roi)
: 각 얼굴이 설정한 ROI 내에 있는지 확인.
2. isFaceInROI
함수
이 함수는 얼굴이 주어진 ROI 내에 있는지 확인합니다. 다음은 isFaceInROI
함수의 자세한 구현 예시입니다:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
interface Face {
x: number; // 얼굴의 x 좌표
y: number; // 얼굴의 y 좌표
width: number; // 얼굴의 너비
height: number; // 얼굴의 높이
}
interface ROI {
x: number; // ROI의 x 좌표
y: number; // ROI의 y 좌표
width: number; // ROI의 너비
height: number; // ROI의 높이
}
const isFaceInROI = (face: Face, roi: ROI): boolean => {
// 얼굴의 경계
const faceLeft = face.x;
const faceRight = face.x + face.width;
const faceTop = face.y;
const faceBottom = face.y + face.height;
// ROI의 경계
const roiLeft = roi.x;
const roiRight = roi.x + roi.width;
const roiTop = roi.y;
const roiBottom = roi.y + roi.height;
// 얼굴이 ROI 내에 있는지 확인
return !(faceRight < roiLeft ||
faceLeft > roiRight ||
faceBottom < roiTop ||
faceTop > roiBottom);
};
Face
인터페이스: 얼굴의 위치와 크기를 정의다. 이 값들은 얼굴 인식 라이브러리에서 제공하는 데이터에 따라 달라질 수 있음.ROI
인터페이스: 관심 영역의 위치와 크기를 정의.isFaceInROI
함수: 얼굴이 ROI 내에 포함되어 있는지 검사한다. ROI와 얼굴의 경계를 비교하여 얼굴이 ROI의 경계 안에 있는지를 확인.
성과
- 속도 개선: 얼굴 인식 속도가 15fps에서 20fps로 개선되었다.
- 성능 향상: 전체 앱의 성능이 향상되어, 사용자 경험이 개선되었다.
결론
이번 최적화 작업을 통해 성능을 크게 향상시킬 수 있었습니다. ROI 설정, 빈도 조절, 영역 내 인식과 같은 최적화 방법을 통해 데이터 처리의 효율성을 높이고, 사용자 경험을 개선했다.
This post is licensed under CC BY 4.0 by the author.