Лица, проиндексированные приложением iOS / Android, не обнаруживаются приложением Android / iOS - AWS Rekognition

Итак, я долгое время работал над продуктом (сначала Android, а затем iOS), который индексирует лица людей, использующих AWS Rekognition, и когда они снова сканируются позже, он их идентифицирует. Он отлично работает, когда я индексирую лицо с устройства Android, а затем пытаюсь найти его с помощью устройства Android. Но если я попытаюсь найти его позже в приложении для iOS, оно не найдет. Тот же результат, если я пойду другим путем. Индексировать с iOS, искать с Android, не найдено. Идентификатор коллекции одинаковый при индексировании и поиске на обоих устройствах. Я не мог понять, как это возможно, чтобы лицо, проиндексированное одним типом ОС, тем же регионом, той же коллекцией, не могло быть найдено на другом устройстве.

Если кто-нибудь из присутствующих может попытаться помочь мне с этой проблемой, сделайте это. Я буду очень благодарен.

Обновление 1: я вызвал функцию «listCollections» в приложениях для iOS и Android. Оба они показывают разный список коллекций. Вот в чем проблема. Но я не могу понять, почему это происходит. Пул удостоверений и регион одинаковы для них обоих.

Вот мой Android-код для доступа к Rekognition:

mCredentialsProvider = new CognitoCachingCredentialsProvider(
        mContext,
        "us-east-2:xbxfxexf-x5x5-xax7-x9xf-x5x0xexfx1xb", // Identity pool ID
        Regions.US_EAST_2 // Region
);

mUUID = UUID.randomUUID().toString().replace("-", "");

mAmazonS3Client = new AmazonS3Client(mCredentialsProvider);
mAmazonS3Client.setRegion(Region.getRegion(Regions.US_EAST_2));
mAmazonRekognitionClient = new AmazonRekognitionClient(mCredentialsProvider);

if(!mAmazonS3Client.doesBucketExist(mFacesBucket)) {
    mAmazonS3Client.createBucket(mFacesBucket);
}

Log.i(TAG, "Uploading image to S3 Bucket");
mAmazonS3Client.putObject(mFacesBucket, getS3ObjectName(), new File(data[0].toString()));
Log.i(TAG, "Image Uploaded");

Image image = new Image();
try {
    image.setBytes(ByteBuffer.wrap(Files.toByteArray(new File(data[0].toString()))));
} catch (IOException e) {
    e.printStackTrace();
}

Log.i(TAG, "Indexing image");
IndexFacesRequest indexFacesRequest =new IndexFacesRequest()
        .withCollectionId(mFacesCollection)
        .withImage(image)
        .withExternalImageId(mUUID)
        .withDetectionAttributes("ALL");

mAmazonRekognitionClient.indexFaces(indexFacesRequest);

Вот мой код iOS для доступа к Rekognition:

func uploadToCollection(img: UIImage)
    {
        let myIdentityPoolId="us-east-2:xbxfxexf-x5x5-xax7-x9xf-x5x0xexfx1xb"

        let credentialsProvider = AWSCognitoCredentialsProvider(regionType: .USEast2, identityPoolId: myIdentityPoolId)
        //store photo in s3()
        let configuration = AWSServiceConfiguration(region: .USEast2, credentialsProvider: credentialsProvider)

        AWSServiceManager.default().defaultServiceConfiguration = configuration
        rekognitionClient = AWSRekognition.default()

        guard let request = AWSRekognitionIndexFacesRequest() else
        {
            puts("Unable to initialize AWSRekognitionindexFaceRequest.")
            return
        }
        var go=false
        request.collectionId = "i_faces" + self.firebaseID.lowercased() //here iosCollection will be replaced by firebase Current UserID
        request.detectionAttributes = ["ALL", "DEFAULT"]
        request.externalImageId = self.UUID //this should be mUUID, passed as parameter to this function
        let sourceImage = img
        let image = AWSRekognitionImage()
        image!.bytes = sourceImage.jpegData(compressionQuality: 0.7)
        request.image = image
        self.rekognitionClient.indexFaces(request) { (response:AWSRekognitionIndexFacesResponse?, error:Error?) in
            if error == nil
            {
                print("Upload to Collection Complete")
            }
            go=true
            return
        }
        while(go==false){}
    }

person Hashir Baig    schedule 26.10.2018    source источник


Ответы (2)


Создайте коллекцию и добавьте изображения в коллекцию и создайте индекс. Я подозреваю несколько вещей в вашей настройке и коде.

1) Идентификатор пула идентификаторов, регион AWS, используемый в iOS и Android.

2) Имя используемой коллекции (обратите внимание на разделители, используемые в имени коллекции)

Android:

CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(appContext, "MyPoolID", Regions.US_EAST_1);

public void searchFacesByImage() {
        Image source = new Image().withS3Object(new S3Object().withBucket("us-east-1-bucket").withName("ms.jpg"));
        Image ms2 = new Image().withS3Object(new S3Object().withBucket("us-east-1-bucket").withName("ms-2.jpg"));
        Image ms3 = new Image().withS3Object(new S3Object().withBucket("us-east-1-bucket").withName("ms-3.jpg"));
        Image ms4 = new Image().withS3Object(new S3Object().withBucket("us-east-1-bucket").withName("ms-4.jpg"));

        String collectionId = "MyCollectionID";
        AmazonRekognitionClient client = new AmazonRekognitionClient(credentialsProvider);

        try {
            System.out.println("Creating collection: " + collectionId );
            CreateCollectionRequest request = new CreateCollectionRequest().withCollectionId(collectionId);
            CreateCollectionResult createCollectionResult = client.createCollection(request);
            System.out.println("CollectionArn : " + createCollectionResult.getCollectionArn());
            System.out.println("Status code : " + createCollectionResult.getStatusCode().toString());
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        IndexFacesRequest indexFacesRequest = new IndexFacesRequest();
        indexFacesRequest.setImage(source);
        indexFacesRequest.setCollectionId(collectionId);
        client.indexFaces(indexFacesRequest);

        indexFacesRequest = new IndexFacesRequest();
        indexFacesRequest.setImage(ms2);
        indexFacesRequest.setCollectionId(collectionId);
        client.indexFaces(indexFacesRequest);

        indexFacesRequest = new IndexFacesRequest();
        indexFacesRequest.setImage(ms4);
        indexFacesRequest.setCollectionId(collectionId);
        client.indexFaces(indexFacesRequest);

        SearchFacesByImageRequest searchFacesByImageRequest = new SearchFacesByImageRequest();
        searchFacesByImageRequest
                .withCollectionId(collectionId)
                .withImage(ms3)
                .withFaceMatchThreshold(80F);

        SearchFacesByImageResult searchFacesByImageResult =
                client.searchFacesByImage(searchFacesByImageRequest);

        List <FaceMatch> faceImageMatches = searchFacesByImageResult.getFaceMatches();
        for (FaceMatch face: faceImageMatches) {
            Log.d(TAG, face.toString());
        }
    }

iOS:

Создайте поставщик учетных данных Cognito

AWSCognitoCredentialsProvider *credentialsProvider = [[AWSCognitoCredentialsProvider alloc] initWithRegionType:AWSRegionUSEast1                                                                                                        identityPoolId: @"MyPoolID"];

AWSServiceConfiguration *configuration = [[AWSServiceConfiguration alloc] initWithRegion:AWSRegionUSEast1                                                                          credentialsProvider:credentialsProvider];

[AWSServiceManager defaultServiceManager].defaultServiceConfiguration = configuration;

Используйте тот же идентификатор пула идентификаторов и регион (us-east-1).

func faceIndexNoFacesSearch() {
    let rekognition = AWSRekognition.default()
    let faceRequest = AWSRekognitionSearchFacesByImageRequest()
    do {
        let image = AWSRekognitionImage()
        image?.s3Object = AWSRekognitionS3Object()
        image?.s3Object?.bucket = "us-east-1-bucket"
        image?.s3Object?.name = "ms-2.jpg"
        faceRequest!.image = image
        faceRequest!.collectionId = "MyCollectionID"

        rekognition.searchFaces(byImage: faceRequest!).continueWith { (response) -> Any? in
            XCTAssertNil(response.error)
            XCTAssertNotNil(response.result)
            if let result = response.result {
                XCTAssertNotNil(result.faceMatches)
            }
            return nil
            }.waitUntilFinished()

    } catch  {
        print("exception")
    }
}

Пожалуйста, задавайте вопросы в комментариях, и мы сможем обсудить их там.

person Karthikeyan    schedule 29.10.2018
comment
Я много раз проверял регионы и идентификаторы пула идентификаторов как на Android, так и на iOS. Они точно такие же. Регион США-Восток-2. Название коллекции тоже такое же. Когда я вызываю функцию listCollections на Android и iOS, они оба показывают разные списки коллекций. (Я создал тестовые коллекции на iOS и тестовые коллекции на android (разные имена), и они не отображаются в результате функции listCollections. - person Hashir Baig; 30.10.2018
comment
Можете ли вы опубликовать полный фрагмент кода для iOS? - person Karthikeyan; 30.10.2018
comment
Я обновил фрагменты кода для Android и iOS. Функция Android в основном индексирует лицо в коллекцию и загружает изображение в корзину S3. Однако функция iOS просто индексирует лицо для коллекции. Логика S3 реализована отдельно, но сейчас нас это не касается. Я проверил и изображения как с iOS, так и с Android, и собираюсь исправить каталог в S3. - person Hashir Baig; 30.10.2018

Итак, проблема оказалась совсем другой, и решение было довольно простым. Я разместил еще один вопрос по той же проблеме, когда обнаружил, что он немного отличается, и я также опубликовал ответ. Вот он: https://stackoverflow.com/a/53128777/4395264

person Hashir Baig    schedule 03.11.2018