จดจำจุดสังเกตได้อย่างปลอดภัยด้วย Cloud Vision โดยใช้การตรวจสอบสิทธิ์และฟังก์ชัน Firebase บนแพลตฟอร์ม Apple

หากต้องการเรียกใช้ Google Cloud API จากแอป คุณต้องสร้าง REST API ระดับกลางที่จัดการการให้สิทธิ์และปกป้องค่าลับ เช่น คีย์ API จากนั้นคุณต้องเขียนโค้ดในแอปบนอุปกรณ์เคลื่อนที่เพื่อตรวจสอบสิทธิ์และสื่อสารกับบริการสื่อกลางนี้

วิธีหนึ่งในการสร้าง REST API นี้คือการใช้ Firebase Authentication และ Functions ซึ่งจะให้เกตเวย์แบบไม่มีเซิร์ฟเวอร์ที่มีการจัดการสำหรับ Google Cloud API ที่จัดการการตรวจสอบสิทธิ์และเรียกใช้ได้จากแอปบนอุปกรณ์เคลื่อนที่ด้วย SDK ที่สร้างขึ้นล่วงหน้า

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

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

กำหนดค่าโปรเจ็กต์

หากยังไม่ได้เพิ่ม 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;

ขั้นตอนการกำหนดค่าอีก 2-3 ขั้นตอน แล้วเราก็จะพร้อมใช้งาน

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

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

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

    3. หากยังไม่ได้เปิดใช้ API ที่อยู่ในระบบคลาวด์ ให้คลิกเปิดใช้ API ที่อยู่ในระบบคลาวด์
  2. กำหนดค่าคีย์ Firebase API ที่มีอยู่เพื่อไม่ให้สิทธิ์เข้าถึง Cloud Vision API โดยทำดังนี้
    1. เปิดหน้าข้อมูลเข้าสู่ระบบของ Cloud Console
    2. สําหรับคีย์ API แต่ละรายการในรายการ ให้เปิดมุมมองการแก้ไข และในส่วนข้อจํากัดของคีย์ ให้เพิ่ม API ทั้งหมดที่ใช้ได้ยกเว้น Cloud Vision API ลงในรายการ

ทำให้ฟังก์ชันที่เรียกใช้ได้ใช้งานได้

จากนั้นให้ทําให้ Cloud Function ที่คุณจะใช้เป็นบริดจ์ระหว่างแอปกับ Cloud Vision API ใช้งานได้ ที่เก็บข้อมูล functions-samples มีตัวอย่างที่คุณใช้ได้

โดยค่าเริ่มต้น การเข้าถึง Cloud Vision API ผ่านฟังก์ชันนี้จะอนุญาตให้มีเพียงผู้ใช้ที่ผ่านการตรวจสอบสิทธิ์ของแอปเท่านั้นที่เข้าถึง Cloud Vision API ได้ คุณสามารถแก้ไขฟังก์ชันตามข้อกําหนดที่แตกต่างกันได้

วิธีทำให้ฟังก์ชันใช้งานได้

  1. โคลนหรือดาวน์โหลด functions-samples repo และเปลี่ยนเป็นไดเรกทอรี Node-1st-gen/vision-annotate-image
    git clone https://github.com/firebase/functions-samples
    cd Node-1st-gen/vision-annotate-image
    
  2. ติดตั้งการอ้างอิง
    cd functions
    npm install
    cd ..
  3. หากไม่มี Firebase CLI ให้ติดตั้ง
  4. เริ่มต้นโปรเจ็กต์ Firebase ในไดเรกทอรี vision-annotate-image เมื่อได้รับข้อความแจ้ง ให้เลือกโปรเจ็กต์ในรายการ
    firebase init
  5. ทำให้ฟังก์ชันใช้งานได้โดยทำดังนี้
    firebase deploy --only functions:annotateImage

เพิ่ม Firebase Auth ไปยังแอป

ฟังก์ชันที่เรียกใช้ได้ซึ่งติดตั้งใช้งานด้านบนจะปฏิเสธคําขอจากผู้ใช้แอปที่ไม่ได้ตรวจสอบสิทธิ์ คุณจะต้องเพิ่ม Firebase Auth ลงในแอป หากยังไม่ได้ดำเนินการ

เพิ่มการพึ่งพาที่จำเป็นลงในแอป

ใช้ Swift Package Manager เพื่อติดตั้งไลบรารี Cloud Functions for Firebase

1. เตรียมรูปภาพอินพุต

รูปภาพต้องอยู่ในรูปแบบสตริงที่เข้ารหัส 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];

2. เรียกใช้ฟังก์ชันที่เรียกใช้ได้เพื่อจดจําจุดสังเกต

หากต้องการจดจำจุดสังเกตในรูปภาพ ให้เรียกใช้ฟังก์ชันที่เรียกใช้ได้โดยส่งคำขอ JSON Cloud Vision

  1. ก่อนอื่น ให้เริ่มต้นอินสแตนซ์ของ Cloud Functions โดยทำดังนี้

    Swift

    lazy var functions = Functions.functions()
    

    Objective-C

    @property(strong, nonatomic) FIRFunctions *functions;
    
  2. สร้างคำขอโดยตั้งค่าประเภทเป็น LANDMARK_DETECTION

    Swift

    let requestData = [
      "image": ["content": base64encodedImage],
      "features": ["maxResults": 5, "type": "LANDMARK_DETECTION"]
    ]
    

    Objective-C

    NSDictionary *requestData = @{
      @"image": @{@"content": base64encodedImage},
      @"features": @{@"maxResults": @5, @"type": @"LANDMARK_DETECTION"}
    };
    
  3. สุดท้าย ให้เรียกใช้ฟังก์ชัน

    Swift

    do {
      let result = try await functions.httpsCallable("annotateImage").call(requestData)
      print(result)
    } catch {
      if let error = error as NSError? {
        if error.domain == FunctionsErrorDomain {
          let code = FunctionsErrorCode(rawValue: error.code)
          let message = error.localizedDescription
          let details = error.userInfo[FunctionsErrorDetailsKey]
        }
        // ...
      }
    }
    

    Objective-C

    [[_functions HTTPSCallableWithName:@"annotateImage"]
                              callWithObject:requestData
                                  completion:^(FIRHTTPSCallableResult * _Nullable result, NSError * _Nullable error) {
            if (error) {
              if ([error.domain isEqualToString:@"com.firebase.functions"]) {
                FIRFunctionsErrorCode code = error.code;
                NSString *message = error.localizedDescription;
                NSObject *details = error.userInfo[@"details"];
              }
              // ...
            }
            // Function completed succesfully
            // Get information about labeled objects
    
          }];
    

3. ดูข้อมูลเกี่ยวกับจุดสังเกตที่ระบบจดจำได้

หากการดําเนินการจดจําสถานที่สำคัญสําเร็จ ระบบจะแสดงผลการตอบกลับ JSON ของ BatchAnnotateImagesResponse ในผลลัพธ์ของงาน แต่ละออบเจ็กต์ในอาร์เรย์ landmarkAnnotations แสดงถึงจุดสังเกตที่ระบบจดจำได้ในรูปภาพ สำหรับจุดสังเกตแต่ละจุด คุณจะได้รับพิกัดขอบเขตในรูปภาพอินพุต ชื่อจุดสังเกต ละติจูดและลองจิจูด รหัสเอนทิตี Knowledge Graph (หากมี) และคะแนนความเชื่อมั่นของการจับคู่ เช่น

Swift

if let labelArray = (result?.data as? [String: Any])?["landmarkAnnotations"] as? [[String:Any]] {
  for labelObj in labelArray {
    let landmarkName = labelObj["description"]
    let entityId = labelObj["mid"]
    let score = labelObj["score"]
    let bounds = labelObj["boundingPoly"]
    // Multiple locations are possible, e.g., the location of the depicted
    // landmark and the location the picture was taken.
    guard let locations = labelObj["locations"] as? [[String: [String: Any]]] else { continue }
    for location in locations {
      let latitude = location["latLng"]?["latitude"]
      let longitude = location["latLng"]?["longitude"]
    }
  }
}

Objective-C

NSArray *labelArray = result.data[@"landmarkAnnotations"];
for (NSDictionary *labelObj in labelArray) {
  NSString *landmarkName = labelObj[@"description"];
  NSString *entityId = labelObj[@"mid"];
  NSNumber *score = labelObj[@"score"];
  NSArray *bounds = labelObj[@"boundingPoly"];
  // Multiple locations are possible, e.g., the location of the depicted
  // landmark and the location the picture was taken.
  NSArray *locations = labelObj[@"locations"];
  for (NSDictionary *location in locations) {
    NSNumber *latitude = location[@"latLng"][@"latitude"];
    NSNumber *longitude = location[@"latLng"][@"longitude"];
  }
}