จดจำข้อความในรูปภาพด้วย Firebase ML บน iOS

คุณใช้ Firebase ML เพื่อจดจำข้อความในรูปภาพได้ Firebase ML มี ทั้ง API แบบอเนกประสงค์ที่เหมาะสำหรับการจดจำข้อความในรูปภาพ เช่น ข้อความของป้ายถนน และ API ที่เพิ่มประสิทธิภาพสำหรับการจดจำข้อความของ เอกสาร

ก่อนเริ่มต้น

    หากยังไม่ได้เพิ่ม Firebase ลงในแอป ให้เพิ่มโดยทำตาม ขั้นตอนในคู่มือเริ่มต้นใช้งาน

    ใช้ Swift Package Manager เพื่อติดตั้งและจัดการทรัพยากร Dependency ของ Firebase

    1. เปิดโปรเจ็กต์แอปใน Xcode แล้วไปที่File > Add Packages
    2. เมื่อได้รับข้อความแจ้ง ให้เพิ่มที่เก็บ SDK ของแพลตฟอร์ม Apple ของ Firebase ดังนี้
    3.   https://github.com/firebase/firebase-ios-sdk.git
    4. เลือกFirebase ML คลัง
    5. เพิ่มแฟล็ก -ObjC ลงในส่วนแฟล็ก Linker อื่นๆ ของการตั้งค่าบิลด์ของเป้าหมาย
    6. เมื่อเสร็จแล้ว Xcode จะเริ่มจับคู่ข้อมูลและดาวน์โหลดทรัพยากร Dependency ในเบื้องหลังโดยอัตโนมัติ

    จากนั้นทำการตั้งค่าในแอปดังนี้

    1. ในแอป ให้นำเข้า Firebase ดังนี้

      Swift

      import FirebaseMLModelDownloader

      Objective-C

      @import FirebaseMLModelDownloader;
  1. หากยังไม่ได้เปิดใช้ API บนระบบคลาวด์สำหรับโปรเจ็กต์ ให้ทำดังนี้ ตอนนี้

    1. เปิดFirebase ML หน้า API ในคอนโซล Firebase
    2. หากยังไม่ได้อัปเกรดโปรเจ็กต์เป็นแพ็กเกจราคา Blaze แบบจ่ายตามการใช้งาน ให้คลิกอัปเกรดเพื่อดำเนินการ (ระบบจะแจ้งให้คุณอัปเกรดก็ต่อเมื่อโปรเจ็กต์ไม่ได้ใช้แพ็กเกจราคา Blaze)

      เฉพาะโปรเจ็กต์ในแพ็กเกจการเรียกเก็บเงิน Blaze เท่านั้นที่ใช้ API บนระบบคลาวด์ได้

    3. หากยังไม่ได้เปิดใช้ API บนระบบคลาวด์ ให้คลิก เปิดใช้ API บนระบบคลาวด์

ตอนนี้คุณพร้อมที่จะเริ่มจดจำข้อความในรูปภาพแล้ว

หลักเกณฑ์เกี่ยวกับรูปภาพที่ป้อน

  • Firebase ML เพื่อให้จดจำข้อความได้อย่างถูกต้อง รูปภาพที่ป้อนต้องมีข้อความที่แสดงด้วยข้อมูลพิกเซลที่เพียงพอ ข้อความละติน แต่ละอักขระควรมีขนาดอย่างน้อย 16x16 พิกเซล สำหรับข้อความภาษาจีน ญี่ปุ่น และเกาหลี อักขระแต่ละตัวควรมีขนาด 24x24 พิกเซล โดยทั่วไปแล้ว สำหรับทุกภาษา การมีอักขระขนาดใหญ่กว่า 24x24 พิกเซล ไม่ได้ช่วยเพิ่มความแม่นยำ

    เช่น รูปภาพขนาด 640x480 อาจเหมาะกับการสแกนนามบัตร ที่กินพื้นที่ความกว้างทั้งหมดของรูปภาพ หากต้องการสแกนเอกสารที่พิมพ์บน กระดาษขนาด Letter คุณอาจต้องใช้รูปภาพขนาด 720x1280 พิกเซล

  • โฟกัสของรูปภาพไม่ดีอาจส่งผลต่อความถูกต้องของการจดจำข้อความ หากคุณไม่ได้รับผลลัพธ์ที่ยอมรับได้ ให้ลองขอให้ผู้ใช้ถ่ายภาพใหม่


การรู้จำข้อความในรูปภาพ

หากต้องการจดจำข้อความในรูปภาพ ให้เรียกใช้ตัวจดจำข้อความตามที่อธิบายไว้ ด้านล่าง

1. เรียกใช้โปรแกรมจดจำข้อความ

ส่งรูปภาพเป็น UIImage หรือ CMSampleBufferRef ไปยังเมธอด VisionTextRecognizer ของ process(_:completion:)

  1. รับอินสแตนซ์ของ VisionTextRecognizer โดยการเรียกใช้ cloudTextRecognizer:

    Swift

    let vision = Vision.vision()
    let textRecognizer = vision.cloudTextRecognizer()
    
    // Or, to provide language hints to assist with language detection:
    // See https://cloud.google.com/vision/docs/languages for supported languages
    let options = VisionCloudTextRecognizerOptions()
    options.languageHints = ["en", "hi"]
    let textRecognizer = vision.cloudTextRecognizer(options: options)

    Objective-C

    FIRVision *vision = [FIRVision vision];
    FIRVisionTextRecognizer *textRecognizer = [vision cloudTextRecognizer];
    
    // Or, to provide language hints to assist with language detection:
    // See https://cloud.google.com/vision/docs/languages for supported languages
    FIRVisionCloudTextRecognizerOptions *options =
            [[FIRVisionCloudTextRecognizerOptions alloc] init];
    options.languageHints = @[@"en", @"hi"];
    FIRVisionTextRecognizer *textRecognizer = [vision cloudTextRecognizerWithOptions:options];
  2. หากต้องการเรียกใช้ Cloud Vision รูปภาพต้องจัดรูปแบบเป็นสตริงที่เข้ารหัสฐาน 64 วิธีประมวลผล UIImage

    Swift

    guard let imageData = uiImage.jpegData(compressionQuality: 1.0) else { return }
    let base64encodedImage = imageData.base64EncodedString()

    Objective-C

    NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f);
    NSString *base64encodedImage =
      [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
  3. จากนั้นส่งรูปภาพไปยังเมธอด process(_:completion:) ดังนี้

    Swift

    textRecognizer.process(visionImage) { result, error in
      guard error == nil, let result = result else {
        // ...
        return
      }
    
      // Recognized text
    }

    Objective-C

    [textRecognizer processImage:image
                      completion:^(FIRVisionText *_Nullable result,
                                   NSError *_Nullable error) {
      if (error != nil || result == nil) {
        // ...
        return;
      }
    
      // Recognized text
    }];

2. แยกข้อความจากบล็อกข้อความที่ระบบจดจำ

หากการดำเนินการจดจำข้อความสำเร็จ ระบบจะแสดงออบเจ็กต์ VisionText ออบเจ็กต์ VisionText มีข้อความทั้งหมด ที่ระบบจดจำในรูปภาพ และมีออบเจ็กต์ VisionTextBlock ตั้งแต่ 0 รายการขึ้นไป

แต่ละ VisionTextBlock แสดงถึงบล็อกข้อความสี่เหลี่ยมผืนผ้า ซึ่งมีออบเจ็กต์ VisionTextLine ตั้งแต่ 0 รายการขึ้นไป VisionTextLine แต่ละออบเจ็กต์มีออบเจ็กต์ VisionTextElement ตั้งแต่ 0 รายการขึ้นไป ซึ่งแสดงถึงคำและเอนทิตีที่คล้ายคำ (วันที่ ตัวเลข และอื่นๆ)

สำหรับออบเจ็กต์ VisionTextBlock, VisionTextLine และ VisionTextElement แต่ละรายการ คุณจะได้รับข้อความที่ระบบจดจำในภูมิภาคและพิกัดขอบเขตของ ภูมิภาค

เช่น

Swift

let resultText = result.text
for block in result.blocks {
    let blockText = block.text
    let blockConfidence = block.confidence
    let blockLanguages = block.recognizedLanguages
    let blockCornerPoints = block.cornerPoints
    let blockFrame = block.frame
    for line in block.lines {
        let lineText = line.text
        let lineConfidence = line.confidence
        let lineLanguages = line.recognizedLanguages
        let lineCornerPoints = line.cornerPoints
        let lineFrame = line.frame
        for element in line.elements {
            let elementText = element.text
            let elementConfidence = element.confidence
            let elementLanguages = element.recognizedLanguages
            let elementCornerPoints = element.cornerPoints
            let elementFrame = element.frame
        }
    }
}

Objective-C

NSString *resultText = result.text;
for (FIRVisionTextBlock *block in result.blocks) {
  NSString *blockText = block.text;
  NSNumber *blockConfidence = block.confidence;
  NSArray<FIRVisionTextRecognizedLanguage *> *blockLanguages = block.recognizedLanguages;
  NSArray<NSValue *> *blockCornerPoints = block.cornerPoints;
  CGRect blockFrame = block.frame;
  for (FIRVisionTextLine *line in block.lines) {
    NSString *lineText = line.text;
    NSNumber *lineConfidence = line.confidence;
    NSArray<FIRVisionTextRecognizedLanguage *> *lineLanguages = line.recognizedLanguages;
    NSArray<NSValue *> *lineCornerPoints = line.cornerPoints;
    CGRect lineFrame = line.frame;
    for (FIRVisionTextElement *element in line.elements) {
      NSString *elementText = element.text;
      NSNumber *elementConfidence = element.confidence;
      NSArray<FIRVisionTextRecognizedLanguage *> *elementLanguages = element.recognizedLanguages;
      NSArray<NSValue *> *elementCornerPoints = element.cornerPoints;
      CGRect elementFrame = element.frame;
    }
  }
}

ขั้นตอนถัดไป


จดจำข้อความในรูปภาพของเอกสาร

หากต้องการจดจำข้อความในเอกสาร ให้กำหนดค่าและเรียกใช้ เครื่องมือจดจำข้อความในเอกสารตามที่อธิบายไว้ด้านล่าง

API การจดจำข้อความในเอกสารที่อธิบายไว้ด้านล่างมีอินเทอร์เฟซที่ ออกแบบมาเพื่อให้ทำงานกับรูปภาพของเอกสารได้สะดวกยิ่งขึ้น อย่างไรก็ตาม หากต้องการใช้อินเทอร์เฟซที่ API ข้อความแบบกระจัดกระจายมีให้ คุณสามารถใช้แทนเพื่อสแกนเอกสารได้โดยกำหนดค่าเครื่องมือจดจำข้อความบนคลาวด์ให้ใช้โมเดลข้อความแบบหนาแน่น

วิธีใช้ API การจดจำข้อความในเอกสาร

1. เรียกใช้โปรแกรมจดจำข้อความ

ส่งรูปภาพเป็น UIImage หรือ CMSampleBufferRef ไปยังเมธอด VisionDocumentTextRecognizer ของ process(_:completion:)

  1. รับอินสแตนซ์ของ VisionDocumentTextRecognizer โดยการเรียกใช้ cloudDocumentTextRecognizer:

    Swift

    let vision = Vision.vision()
    let textRecognizer = vision.cloudDocumentTextRecognizer()
    
    // Or, to provide language hints to assist with language detection:
    // See https://cloud.google.com/vision/docs/languages for supported languages
    let options = VisionCloudDocumentTextRecognizerOptions()
    options.languageHints = ["en", "hi"]
    let textRecognizer = vision.cloudDocumentTextRecognizer(options: options)

    Objective-C

    FIRVision *vision = [FIRVision vision];
    FIRVisionDocumentTextRecognizer *textRecognizer = [vision cloudDocumentTextRecognizer];
    
    // Or, to provide language hints to assist with language detection:
    // See https://cloud.google.com/vision/docs/languages for supported languages
    FIRVisionCloudDocumentTextRecognizerOptions *options =
            [[FIRVisionCloudDocumentTextRecognizerOptions alloc] init];
    options.languageHints = @[@"en", @"hi"];
    FIRVisionDocumentTextRecognizer *textRecognizer = [vision cloudDocumentTextRecognizerWithOptions:options];
  2. หากต้องการเรียกใช้ Cloud Vision รูปภาพต้องจัดรูปแบบเป็นสตริงที่เข้ารหัสฐาน 64 วิธีประมวลผล UIImage

    Swift

    guard let imageData = uiImage.jpegData(compressionQuality: 1.0) else { return }
    let base64encodedImage = imageData.base64EncodedString()

    Objective-C

    NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f);
    NSString *base64encodedImage =
      [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
  3. จากนั้นส่งรูปภาพไปยังเมธอด process(_:completion:) ดังนี้

    Swift

    textRecognizer.process(visionImage) { result, error in
      guard error == nil, let result = result else {
        // ...
        return
      }
    
      // Recognized text
    }

    Objective-C

    [textRecognizer processImage:image
                      completion:^(FIRVisionDocumentText *_Nullable result,
                                   NSError *_Nullable error) {
      if (error != nil || result == nil) {
        // ...
        return;
      }
    
        // Recognized text
    }];

2. แยกข้อความจากบล็อกข้อความที่ระบบจดจำ

หากการดำเนินการจดจำข้อความสำเร็จ ระบบจะแสดงออบเจ็กต์ VisionDocumentText ออบเจ็กต์ VisionDocumentText มีข้อความทั้งหมดที่ระบบจดจำในรูปภาพและลำดับชั้นของออบเจ็กต์ที่ แสดงโครงสร้างของเอกสารที่จดจำได้

สำหรับออบเจ็กต์ VisionDocumentTextBlock, VisionDocumentTextParagraph, VisionDocumentTextWord และ VisionDocumentTextSymbol แต่ละรายการ คุณจะรับข้อความที่ระบบจดจำในภูมิภาคและพิกัดขอบเขตของภูมิภาคได้

เช่น

Swift

let resultText = result.text
for block in result.blocks {
    let blockText = block.text
    let blockConfidence = block.confidence
    let blockRecognizedLanguages = block.recognizedLanguages
    let blockBreak = block.recognizedBreak
    let blockCornerPoints = block.cornerPoints
    let blockFrame = block.frame
    for paragraph in block.paragraphs {
        let paragraphText = paragraph.text
        let paragraphConfidence = paragraph.confidence
        let paragraphRecognizedLanguages = paragraph.recognizedLanguages
        let paragraphBreak = paragraph.recognizedBreak
        let paragraphCornerPoints = paragraph.cornerPoints
        let paragraphFrame = paragraph.frame
        for word in paragraph.words {
            let wordText = word.text
            let wordConfidence = word.confidence
            let wordRecognizedLanguages = word.recognizedLanguages
            let wordBreak = word.recognizedBreak
            let wordCornerPoints = word.cornerPoints
            let wordFrame = word.frame
            for symbol in word.symbols {
                let symbolText = symbol.text
                let symbolConfidence = symbol.confidence
                let symbolRecognizedLanguages = symbol.recognizedLanguages
                let symbolBreak = symbol.recognizedBreak
                let symbolCornerPoints = symbol.cornerPoints
                let symbolFrame = symbol.frame
            }
        }
    }
}

Objective-C

NSString *resultText = result.text;
for (FIRVisionDocumentTextBlock *block in result.blocks) {
  NSString *blockText = block.text;
  NSNumber *blockConfidence = block.confidence;
  NSArray<FIRVisionTextRecognizedLanguage *> *blockRecognizedLanguages = block.recognizedLanguages;
  FIRVisionTextRecognizedBreak *blockBreak = block.recognizedBreak;
  CGRect blockFrame = block.frame;
  for (FIRVisionDocumentTextParagraph *paragraph in block.paragraphs) {
    NSString *paragraphText = paragraph.text;
    NSNumber *paragraphConfidence = paragraph.confidence;
    NSArray<FIRVisionTextRecognizedLanguage *> *paragraphRecognizedLanguages = paragraph.recognizedLanguages;
    FIRVisionTextRecognizedBreak *paragraphBreak = paragraph.recognizedBreak;
    CGRect paragraphFrame = paragraph.frame;
    for (FIRVisionDocumentTextWord *word in paragraph.words) {
      NSString *wordText = word.text;
      NSNumber *wordConfidence = word.confidence;
      NSArray<FIRVisionTextRecognizedLanguage *> *wordRecognizedLanguages = word.recognizedLanguages;
      FIRVisionTextRecognizedBreak *wordBreak = word.recognizedBreak;
      CGRect wordFrame = word.frame;
      for (FIRVisionDocumentTextSymbol *symbol in word.symbols) {
        NSString *symbolText = symbol.text;
        NSNumber *symbolConfidence = symbol.confidence;
        NSArray<FIRVisionTextRecognizedLanguage *> *symbolRecognizedLanguages = symbol.recognizedLanguages;
        FIRVisionTextRecognizedBreak *symbolBreak = symbol.recognizedBreak;
        CGRect symbolFrame = symbol.frame;
      }
    }
  }
}

ขั้นตอนถัดไป