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

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

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

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

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

    1. เปิดโปรเจ็กต์แอปใน Xcode แล้วไปที่ไฟล์ > เพิ่มแพ็กเกจ
    2. เมื่อได้รับข้อความแจ้ง ให้เพิ่มที่เก็บ Firebase SDK สำหรับแพลตฟอร์ม Apple ดังนี้
    3.   https://github.com/firebase/firebase-ios-sdk.git
    4. เลือกคลัง Firebase ML
    5. เพิ่ม Flag -ObjC ลงในส่วน Other Linker Flags ของการตั้งค่าบิลด์เป้าหมาย
    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 อาจเหมาะกับการสแกนนามบัตรที่กินพื้นที่เต็มความกว้างของรูปภาพ หากต้องการสแกนเอกสารที่พิมพ์บนกระดาษขนาดจดหมาย คุณอาจต้องใช้รูปภาพขนาด 720x1280 พิกเซล

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


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

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

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

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

  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. รูปภาพต้องอยู่ในรูปแบบสตริงที่เข้ารหัส Base64 จึงจะเรียกใช้ Cloud Vision ได้ วิธีประมวลผล 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 อย่างน้อย 1 รายการ

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

สําหรับออบเจ็กต์ 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 ดังกล่าวเพื่อสแกนเอกสารแทนได้โดยกำหนดค่าโปรแกรมจดจำข้อความบนระบบคลาวด์ให้ใช้โมเดลข้อความแบบหนาแน่น

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

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

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

  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. รูปภาพต้องอยู่ในรูปแบบสตริงที่เข้ารหัส Base64 จึงจะเรียกใช้ Cloud Vision ได้ วิธีประมวลผล 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;
      }
    }
  }
}

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