VNDetectTextRectanglesRequest: 기계 학습을 사용하여 일본어 단어의 영역을 감지합니다.
Vision 정보:
"Vision"은 이미지 및 동영상과 같은 입력을 처리할 수 있는 많은 기계 학습 알고리즘을 포함하는 프레임워크입니다. 텍스트를 처리하는 기존 함수 "VNRecognizeTextRequest"가 있지만, 이것은 영어만 지원합니다. 또한 'Qitta'에서 'VNRecognizeTextRequest'를 검색하면 이에 대한 기사가 이미 나와 있습니다.
이 기사에서는 감지된 일본어 텍스트 주위에 직사각형을 그리는 방법을 설명합니다.
프레임워크 구성요소
VNDocumentCameraViewController (VisionKit):
iOS 프레임워크에 내장된 스캐너 지원으로 용지의 직사각형 영역을 자동으로 감지합니다. 그런 다음 사용자는 버튼을 클릭하여 문서의 이미지를 캡처하고 대리자에서 해당 이미지 데이터를 받을 수 있습니다.
VNDetectTextRectanglesRequest
Vision 프레임워크의 함수에서 텍스트가 있는 영역의 경계 상자를 가져올 수 있습니다.
VNDetectTextRectanglesRequest를 사용하는 이유
VNRecognizeTextRequest
는 일본어를 지원하지 않기 때문입니다.VNDetectTextRectanglesRequest
로 인식된 영역을 자르고 그 결과를 자신의 텍스트 인식 알고리즘에 입력할 수 있습니다. 이 경우 VNDetectTextRectanglesRequest
에 문자별로 결과를 표시하도록 요청하면 각 문자를 인식할 수 있습니다. 자, 시작하자.
문서 스캔
VNDocumentCameraViewController
구현은 간단합니다 :import VisionKit
@IBAction func actionPresentVision(){
let documentCameraViewController = VNDocumentCameraViewController()
documentCameraViewController.delegate = self
present(documentCameraViewController, animated: true)
//以前に追加したレイヤーを削除する
for layer in imageView.layer.sublayers ?? [] {
layer.removeFromSuperlayer()
}
}
사용자가 촬영한 이미지를 받는 프로그램 대리자도 구현해야 합니다.
extension ViewController: VNDocumentCameraViewControllerDelegate {
func documentCameraViewController(_ controller: VNDocumentCameraViewController, didFinishWith scan: VNDocumentCameraScan) {
if let firstImage = scan.imageOfPage(at: 0).cgImage {
//TODO
processImage(input: firstImage)
controller.dismiss(animated: true, completion: nil)
}
}
func documentCameraViewControllerDidCancel(_ controller: VNDocumentCameraViewController) {
controller.dismiss(animated: true, completion: nil)
}
}
누르면 "actionPresentVision"을 호출합니다.
UIButton
를 Storyboard에 추가합니다. 그리고 화면에 이미지를 표시 processImage
함수를 설정합니다.@IBOutlet weak var imageView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
imageView.contentMode = .scaleToFill
}
func processImage(input: CGImage) {
let image = UIImage(cgImage: input)
imageView.image = image
}
(Keep Scan -> Save)
이미지 부분이 생겼으므로 기계 학습 부분에 걸어 봅시다.
기계 학습을 사용하여 텍스트 인식
먼저 프레임워크를 가져옵니다.
import Vision
그런 다음 이전 기사에서 쓴 것처럼 기계 학습 결과를 처리하기 위한 핸들러를 설정하고
VNImageRequestHandler
를 사용하여 이미지 데이터를 요청에 입력해야 합니다.애니메이션 이미지의 낮 / 밤 인식 시스템 생성 : (2/3) 모델과 "Vision"프레임 워크를 사용하여 새로운 이미지에서 레이블을 얻습니다.
앞의 기사에서는
VNCoreMLRequest
를 사용하고 있지만 여기에서는 VNDetectTextRectanglesRequest
func processImage(input: CGImage) {
let request = VNDetectTextRectanglesRequest { (request, error) in
//ここに結果が表示されます
if let results = request.results as? [VNTextObservation] {
print(results)
}
}
//次にリクエストに画像を受け渡します
let handler = VNImageRequestHandler(cgImage: input, options: [:])
DispatchQueue.global(qos: .userInteractive).async {
do {
try handler.perform([request])
} catch {
print(error)
}
}
}
여기를 얻은 결과입니다.
[
<VNTextObservation: 0x282a34fa0> CCD5518B-FC57-42E2-8475-7E4883F3782A requestRevision=1 confidence=1.000000 boundingBox=[0.186391, 0.678969, 0.568047, 0.0543175],
<VNTextObservation: 0x282a348c0> DCEC8A13-FC2F-4D55-A2C0-D88EAEAF304C requestRevision=1 confidence=1.000000 boundingBox=[0.363905, 0.550836, 0.224852, 0.0557103],
<VNTextObservation: 0x282a34d20> 93FEE50E-D6B6-49F4-983E-C8025D45A4EC requestRevision=1 confidence=1.000000 boundingBox=[0.381657, 0.39624, 0.198225, 0.051532],
<VNTextObservation: 0x282a34aa0> 2215CEAB-09B5-40E2-86C0-5DC33F354057 requestRevision=1 confidence=1.000000 boundingBox=[0.372781, 0.236072, 0.210059, 0.051532],
<VNTextObservation: 0x282a34c80> E88AA596-EF6E-4CD1-B19B-AC7EE7A30936 requestRevision=1 confidence=1.000000 boundingBox=[0.372781, 0.0759053, 0.215976, 0.0501393]
]
종이에는 단지 5개의 단어가 적혀 있습니다! 각 "VNTextObservation"은 이미지의 각 단어의 경계 상자를 나타냅니다.
그런 다음 결과를 화면에 시각적으로 표시할 수 있습니다. :
시각적으로 표시
func drawBoundingBox(forResult: VNTextObservation) {
let outline = CALayer()
//バウンディングボックスの座標はパーセンテージとして与えられます。実際の画面の座標に変換する必要があります
let x = forResult.topLeft.x * imageView.frame.width
let y = (1 - forResult.topLeft.y) * imageView.frame.height
///横幅と高さは「boundingBox」から取得できます
let width = forResult.boundingBox.width * imageView.frame.width
let height = forResult.boundingBox.height * imageView.frame.height
outline.frame = CGRect(x: x, y: y, width: width, height: height)
outline.borderColor = UIColor.green.cgColor
outline.borderWidth = 3
imageView.layer.addSublayer(outline)
}
또한 'drawBoundingBox'를 호출하도록 요청을 변경하는 것을 잊지 마십시오.
let request = VNDetectTextRectanglesRequest { (request, error) in
if let results = request.results as? [VNTextObservation] {
for result in results {
DispatchQueue.main.async {
self.imageView.image = UIImage(cgImage: input)
self.drawBoundingBox(forResult: result)
}
}
}
}
여기가 결과입니다. :
매개 변수를 forResult.characterBoxes로 변경하면 drawBoundingBox의 동일한 코드를 사용하여 각 문자의 경계 상자를 그릴 수 있습니다.
일부 경계 상자가 표시되지 않을 수 있지만 이는 정상입니다. 기계 학습에는 한계가 있어, 빛의 맞는 상태가 적절하지 않으면 부정확한 데이터를 돌려버리는 일이 있기 때문입니다.
코드
코드는 여기에 있습니다 : htps : // 기주 b. 코 m / ms 조 펜 소 r 세 / ぃ 시온 xt에서 c 치온
다음 단계
일본어 문자 인식 기계 학습 모델을 교육하고 "forResult.characterBoxes"의 각 문자의 이미지를 사용하여 각 문자를 인식할 수 있습니다. 이 방법은 이미 다른 기사에서 작성되었습니다.
1. "Core ML"모델을 "Create ML"로 기존의 라벨이 부착된 애니메이션 이미지를 입력으로서 이용하여 트레이닝한다.
2. 모델과 Vision 프레임 워크를 사용하여 새 이미지에서 레이블을 얻습니다.
트위터 @MszPro
내 게시된 Qiita 기사 목록을 카테고리별로 확인할 수 있습니다.
Reference
이 문제에 관하여(VNDetectTextRectanglesRequest: 기계 학습을 사용하여 일본어 단어의 영역을 감지합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/MaShunzhe/items/d2f82bd920eeb2e82167텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)