草庐IT

android - Android/iOS 应用程序未检测到由 iOS/Android 应用程序索引的人脸 - AWS Rekognition

coder 2024-01-22 原文

因此,我长期以来一直致力于开发一种产品(首先是 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){}
    }

最佳答案

创建一个集合并将图像添加到集合中并创建一个索引。我怀疑您的设置和代码中没有什么东西。

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

苹果:

创建 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 - Android/iOS 应用程序未检测到由 iOS/Android 应用程序索引的人脸 - AWS Rekognition,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53003814/

有关android - Android/iOS 应用程序未检测到由 iOS/Android 应用程序索引的人脸 - AWS Rekognition的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  3. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  4. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  5. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  6. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  7. ruby-on-rails - Rails 应用程序中的 Rails : How are you using application_controller. rb 是新手吗? - 2

    刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr

  8. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  9. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  10. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

随机推荐