[TIL] VisionKit, OCR 이 무엇인가요?

한철희·2024년 5월 30일
0

TIL

목록 보기
49/57

이번 최종 프로젝트 때 VisionKitOCR를 사용하게됐다
해당 기술을 사용하기에 앞서 처음 접해보는 기술이어서
먼저 공부하며 알아보려고 한다!


우선 알아봐야할 프레임워크는 VisionKitVision 이 두개다.
VisionKit은 Apple에서 개발한 OCR Api

VisionKit과 Vision의 출시 시기

Vision 프레임워크

  • 출시 시기: Vision 프레임워크는 iOS 11과 함께 2017년에 처음 도입되었습니다.
  • 주요 기능: 이미지 분석, 텍스트 인식, 얼굴 인식, 객체 인식 등.

VisionKit 프레임워크

  • 출시 시기: VisionKit은 iOS 13과 함께 2019년에 도입되었습니다.
  • 주요 기능: 문서 스캔, 이미지 보정, 문서 경계 감지 및 크롭 등.

최신 기술의 내포

Vision 프레임워크

Vision 프레임워크는 다양한 이미지 분석 기능을 제공하며, 다음과 같은 최신 기술들을 내포하고 있습니다:

  • 텍스트 인식 (OCR): 머신 러닝 모델을 사용하여 이미지에서 텍스트를 인식합니다.
  • 얼굴 인식: 얼굴을 감지하고, 얼굴의 특징점을 인식합니다.
  • 객체 인식: Core ML 모델을 통합하여 이미지 내 객체를 인식합니다.
  • 이미지 분석: 이미지 등록, 정렬, 특징점 검출 등 다양한 이미지 처리 기능을 제공합니다.

VisionKit 프레임워크

VisionKit은 문서 스캔을 주로 다루며, 다음과 같은 최신 기술들을 포함하고 있습니다:

  • 문서 경계 감지: 이미지에서 문서의 경계를 자동으로 감지합니다.
  • 이미지 보정: 스캔한 문서를 보정하여 더욱 선명한 이미지를 제공합니다.
  • 자동 크롭: 문서의 경계를 감지하여 자동으로 크롭합니다.

최신 기술 비교

  • Vision 프레임워크: 더 넓은 범위의 이미지 분석 기능을 제공하며, 텍스트 인식, 얼굴 인식, 객체 인식 등 다양한 기능을 포함하고 있습니다. 최신의 머신 러닝 및 컴퓨터 비전 기술을 사용합니다.
  • VisionKit 프레임워크: 문서 스캔과 관련된 기능에 특화되어 있으며, 문서 경계 감지 및 이미지 보정 기술을 포함하고 있습니다. 주로 문서 처리와 관련된 최신 기술을 내포하고 있습니다.

결론

  • Vision 프레임워크는 더 오래되었지만, 지속적으로 업데이트되며 최신의 이미지 분석 기술을 포함하고 있습니다.
  • VisionKit 프레임워크는 더 최근에 도입되었으며, 문서 스캔 및 처리에 특화된 최신 기술을 포함하고 있습니다.

따라서, 두 프레임워크는 각각의 용도에 맞게 최신 기술을 내포하고 있으며, 특정 작업에 대해 더 적합한 기술을 제공할 수 있습니다. 문서 스캔과 이미지 보정을 필요로 하는 경우 VisionKit이, 이미지 분석과 텍스트 인식을 필요로 하는 경우 Vision이 적합합니다.


사용 방법

사용하는 방식은 크게 다음과 같은 단계로 이뤄집니다.

1. 카메라 사용 권한 허가

<key>NSCameraUsageDescription</key>
<string>이 앱은 문서 스캔을 위해 카메라를 사용합니다.</string>

허가를 해줘야 카메라를 사용할 수 있습니다!
info.plist 파일에 작성해줍니다

2. 필요한 라이브러리 Import

import VisionKit
import Vision

라이브러리가 있어야 기능을 사용할 수 있겠죠?
사용하려는 뷰컨트롤러에 Import 해줍니다

3. CGImage로 이미지 타입 변환

// Get the CGImage on which to perform requests.
guard let cgImage = UIImage(named: "snapshot")?.cgImage else { return }

VNImageRequestHandler 에서 이미지 인식 요청을 하므로
UIImage를 cgImage로 변경해줘야한다.
return 자리에는 에러처리가 추가될 수 있다.

4. VNRecognizeTextRequest 인스턴스 생성

// handler 인스턴스 생성
let handler = VNImageRequestHandler(cgImage: cgImage, options: [:])
// request 인스턴스 생성
let request = VNRecognizeTextRequest{ [weak self]request, error in
    
    guard let observations = request.results as? [VNRecognizedTextObservation],
          error == nil else{
        return
    }
    
    // 한 줄이 끝나는 부분마다 \n
    let text = observations.compactMap({
        $0.topCandidates(1).first?.string
    }).joined(separator: "\n")

	// ui 변경은 main thread에서만 가능
    DispatchQueue.main.async {
        self?.label.text = text
        print(text)
    }
}

VNRecognizeTextRequest 클래스의 인스턴스가 클로저를 매개변수로 하여 생성됩니다. 클로저는 텍스트 인식이 완료되었을 때 호출되는 콜백을 정의합니다.

5. Vision 설정

VNRecognizeTextRequest는 여러가지 설정을 해줄 수 있습니다
우선 코드부터 보실까요

if #available(iOS 16.0, *) {
        let revision3 = VNRecognizeTextRequestRevision3
        request.revision = revision3
        request.recognitionLevel = .accurate
        request.recognitionLanguages = ["ko-KR"]
        request.usesLanguageCorrection = true
            
        do {
            let possibleLanguages = try request.supportedRecognitionLanguages()
            print(possibleLanguages)
        } catch {
            print("Error getting the supported languages.")
        }
    } else {
        // Fallback on earlier versions
        request.recognitionLanguages = ["en-US"]
        request.usesLanguageCorrection = true
    }

위 코드에선 버전, 정확도, 번역할 언어를 설정했다.

  • revision은 VNRecognizeTextRequest의 버전
  • recognitionLevel은 인식의 정확도
  • recognitionLanguages은 번역할 언어를 선택한 것이다.

그리고 do 구문에 있는 supportedRecognitionLanguages()함수는 호출시
번역 가능한 언어를 출력해 확인할 수 있다.

6. Request Handler 동작

// handler 동작
do{
    try handler.perform([request])
} catch {
	// 에러 처리
    label.text = "\(error)"
    print(error)
}

생성해준 handler, request를 동작한다

7. 결과 확인

profile
초보 개발자 살아남기

0개의 댓글