Android / iOS应用程序未检测到由iOS / Android应用程序索引的面孔-AWS Rekognition

时间:2018-10-26 07:42:53

标签: android ios amazon-web-services aws-sdk amazon-rekognition

因此,我一直在研究一种产品(首先是Android,然后是iOS),该产品使用AWS Rekognition索引人们的面孔,并在以后再次对其进行扫描时可以对其进行识别。 当我从Android设备索引人脸然后尝试使用Android设备搜索时,效果很好。但是,如果稍后尝试在iOS应用上搜索它,则找不到它。如果我走另一条路,结果也是一样。使用iOS进行索引,使用Android搜索,未找到。 在两个设备上进行索引和搜索时,集合ID相同。我不知道怎么可能在其他设备上找不到按一种操作系统类型,相同区域,相同集合索引的人脸。

如果这里有人可以尝试帮助我解决此问题,请这样做。我会非常感激。

更新1:我在iOS和Android应用程序上都调用了“ listCollections”功能。他们两个都显示不同的收藏夹列表。这就是问题。但是我不知道为什么会这样。两者的身份池和区域相同。

这是我的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){}
    }

2 个答案:

答案 0 :(得分:1)

创建一个集合,并将图像添加到该集合并创建索引。我怀疑您的设置和代码中没有几件事。

1)身份池ID,适用于iOS和Android的AWS区域

2)使用的集合名称(注意集合名称中使用的分隔符)

Android:

date

iOS:

创建Cognito凭据提供程序

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());
        }
    }

使用相同的身份池ID和区域(us-east-1)。

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

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

[AWSServiceManager defaultServiceManager].defaultServiceConfiguration = configuration;

请在评论中发表问题,我们可以在那里进行讨论。

答案 1 :(得分:0)

好,因此问题变得很不相同,解决方案非常简单。当发现相同问题时,我发布了另一个有关同一问题的问题,我也发布了答案。 这里是: https://stackoverflow.com/a/53128777/4395264