【问题标题】:Faces indexed by iOS/Android app are not detected by Android/iOS App - AWS RekognitionAndroid/iOS 应用程序未检测到由 iOS/Android 应用程序索引的人脸 - AWS Rekognition
【发布时间】:2018-11-03 13:51:14
【问题描述】:

因此,我长期以来一直致力于开发一种产品(首先是 Android,然后是 iOS),该产品可以索引使用 AWS Rekognition 的人的面孔,并且当他们稍后再次被扫描时,它会识别出他们。 当我从 Android 设备索引人脸然后尝试使用 Android 设备搜索它时,它工作得很好。但如果我稍后尝试在 iOS 应用程序上搜索它,它不会找到它。如果我反过来,结果也是一样。用 iOS 索引,用 Android 搜索,没有找到。 在两个设备上进行索引和搜索时,集合 ID 相同。我不知道在其他设备上找不到由一种操作系统类型、相同区域、相同集合索引的面孔。

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

更新 1:我在 iOS 和 android 应用程序上都调用了“listCollections”函数。他们都显示了不同的收藏列表。这就是问题所在。但我无法弄清楚我们为什么会这样。两者的身份池和区域相同。

这是我访问 Rekognition 的 Android 代码:

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

这是我访问 Rekognition 的 iOS 代码:

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){}
    }

【问题讨论】:

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


    【解决方案1】:

    创建一个集合并将图像添加到集合中并创建一个索引。我怀疑您的设置和代码中存在一些问题。

    1) 身份池 ID,跨 iOS 和 Android 使用的 AWS 区域

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

    安卓:

    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;
    

    使用相同的身份池 ID 和区域 (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")
        }
    }
    

    请在评论中提出问题,我们可以在那里讨论。

    【讨论】:

    • 我在 Android 和 iOS 中多次交叉检查了区域和身份池 ID。它们完全相同。该区域是 us-east-2。集合名称也完全相同。当我在 android 和 iOS 上调用 listCollections 函数时,它们都显示不同的集合列表。 (我在 iOS 上创建了一个测试集合,在 android 上创建了一个测试集合(不同的名称),它们没有显示在 listCollections 函数的结果中。
    • 你能把你在iOS上的完整代码sn-p贴出来吗?
    • 我已经更新了安卓和 iOS 的代码 sn-ps。 Android 功能基本上将人脸索引到集合并将图像上传到 S3 存储桶。然而,iOS 功能只是对集合进行索引。 S3 逻辑是单独实现的,但这不是我们现在关心的问题。我已经检查了来自 iOS 和 android 的图像,并在 S3 中找到了正确的目录。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-30
      • 1970-01-01
      • 2013-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多