Java Can';t从IntelliJ连接到AWS rekognition API
我一直在使用来自Amazon的新rekognition API,在IntelliJ上运行Java应用程序时遇到了问题。我正在使用Maven构建项目,并在我的Java Can';t从IntelliJ连接到AWS rekognition API,java,maven,amazon-web-services,intellij-idea,amazon-rekognition,Java,Maven,Amazon Web Services,Intellij Idea,Amazon Rekognition,我一直在使用来自Amazon的新rekognition API,在IntelliJ上运行Java应用程序时遇到了问题。我正在使用Maven构建项目,并在我的pom.xml中包含了AWS SDK,如下所示: <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk</artifactId> <version>${aws-
pom.xml
中包含了AWS SDK,如下所示:
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk</artifactId>
<version>${aws-java-sdk.version}</version>
</dependency>
…我得到的错误是:
com.amazonaws.services.rekognition.model.AmazonRekognitionException: null (Service: AmazonRekognition; Status Code: 400; Error Code: null; Request ID: null)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1545)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1183)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:964)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:676)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:650)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:633)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$300(AmazonHttpClient.java:601)
at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:583)
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:447)
at com.amazonaws.services.rekognition.AmazonRekognitionClient.doInvoke(AmazonRekognitionClient.java:1130)
at com.amazonaws.services.rekognition.AmazonRekognitionClient.invoke(AmazonRekognitionClient.java:1106)
at com.amazonaws.services.rekognition.AmazonRekognitionClient.detectFaces(AmazonRekognitionClient.java:599)
at com.github.jhenningsgaard.DetectFaces.main(DetectFaces.java:39)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
我还应该注意到,我在AWS CLI中运行了该操作(请参见下文),并且操作成功
aws rekognition detect-faces \
--image '{"S3Object":{"Bucket":"Bucketname","Name":"s3ObjectKey"}}' \
--attributes "ALL" \
--region us-east-1 \
--profile adminuser
您可以使用以下代码创建rekognition客户端的实例:
AWSCredentials credentials;
try {
credentials = new ProfileCredentialsProvider("default").getCredentials();
} catch (Exception e) {
throw new AmazonClientException("Cannot load the credentials from the credential profiles file. "
+ "Please make sure that your credentials file is at the correct "
+ "location (/Users/<userid>/.aws/credentials), and is in a valid format.", e);
}
AmazonRekognitionClient rekognitionClient = new AmazonRekognitionClient(credentials)
.withEndpoint("rekognition.eu-west-1.amazonaws.com");
rekognitionClient.setSignerRegionOverride("eu-west-1");
AWSCredentials凭证;
试一试{
凭据=新的ProfileCredentialsProvider(“默认”).getCredentials();
}捕获(例外e){
抛出新的AmazonClientException(“无法从凭据配置文件文件加载凭据。”
+“请确保您的凭据文件位于正确的位置”
+“位置(/Users/.aws/credentials),且格式有效。”,e);
}
AmazonRekognitionClient rekognitionClient=新的AmazonRekognitionClient(凭据)
.withEndpoint(“rekognition.eu-west-1.amazonaws.com”);
rekognitionClient.setSignerRegionOverride(“eu-west-1”);
下面是一个完整的代码示例,使用软件.amazon.awssdk.services.rekognion.RekognitionClient对象(API的第2版)来比较两个面
您可以在AWS文档中找到更多使用RekognitionClient版本2的示例
此外,要从IntelliJ运行这些示例,您需要确保具有正确的POM。在AWS Github示例中,始终列出相应的POM
package com.example.rekognition;
// snippet-start:[rekognition.java2.compare_faces.import]
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.rekognition.RekognitionClient;
import software.amazon.awssdk.services.rekognition.model.RekognitionException;
import software.amazon.awssdk.services.rekognition.model.Image;
import software.amazon.awssdk.services.rekognition.model.CompareFacesRequest;
import software.amazon.awssdk.services.rekognition.model.CompareFacesResponse;
import software.amazon.awssdk.services.rekognition.model.CompareFacesMatch;
import software.amazon.awssdk.services.rekognition.model.ComparedFace;
import software.amazon.awssdk.services.rekognition.model.BoundingBox;
import software.amazon.awssdk.core.SdkBytes;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.List;
// snippet-end:[rekognition.java2.compare_faces.import]
public class CompareFaces {
public static void main(String[] args) {
final String USAGE = "\n" +
"CompareFaces - how to compare two faces in two images\n\n" +
"Usage: CompareFaces <pathSource> <pathTarget>\n\n" +
"Where:\n" +
"pathSource - the path to the source image (ie, C:\\AWS\\pic1.png) \n " +
"pathTarget - the path to the target image (ie, C:\\AWS\\pic2.png) \n\n";
Float similarityThreshold = 70F;
String sourceImage = args[0];
String targetImage = args[1];
Region region = Region.US_EAST_2;
RekognitionClient rekClient = RekognitionClient.builder()
.region(region)
.build();
compareTwoFaces(rekClient, similarityThreshold, sourceImage, targetImage);
}
// snippet-start:[rekognition.java2.compare_faces.main]
public static void compareTwoFaces(RekognitionClient rekClient, Float similarityThreshold, String sourceImage, String targetImage) {
try {
InputStream sourceStream = new FileInputStream(new File(sourceImage));
InputStream tarStream = new FileInputStream(new File(targetImage));
SdkBytes sourceBytes = SdkBytes.fromInputStream(sourceStream);
SdkBytes targetBytes = SdkBytes.fromInputStream(tarStream);
// Create an Image object for the source image
Image souImage = Image.builder()
.bytes(sourceBytes)
.build();
// Create an Image object for the target image
Image tarImage = Image.builder()
.bytes(targetBytes)
.build();
// Create a CompareFacesRequest object
CompareFacesRequest facesRequest = CompareFacesRequest.builder()
.sourceImage(souImage)
.targetImage(tarImage)
.similarityThreshold(similarityThreshold)
.build();
// Compare the two images
CompareFacesResponse compareFacesResult = rekClient.compareFaces(facesRequest);
// Display results
List<CompareFacesMatch> faceDetails = compareFacesResult.faceMatches();
for (CompareFacesMatch match: faceDetails){
ComparedFace face= match.face();
BoundingBox position = face.boundingBox();
System.out.println("Face at " + position.left().toString()
+ " " + position.top()
+ " matches with " + face.confidence().toString()
+ "% confidence.");
}
List<ComparedFace> uncompared = compareFacesResult.unmatchedFaces();
System.out.println("There was " + uncompared.size()
+ " face(s) that did not match");
System.out.println("Source image rotation: " + compareFacesResult.sourceImageOrientationCorrection());
System.out.println("target image rotation: " + compareFacesResult.targetImageOrientationCorrection());
} catch(RekognitionException | FileNotFoundException e) {
System.out.println("Failed to load source image " + sourceImage);
System.exit(1);
}
// snippet-end:[rekognition.java2.compare_faces.main]
}
}
package com.example.rekognion;
//代码段开始:[rekognition.java2.compare_faces.import]
导入software.amazon.awssdk.regions.Region;
导入software.amazon.awssdk.services.rekognition.RekognitionClient;
导入software.amazon.awssdk.services.rekognition.model.RekognitionException;
导入software.amazon.awssdk.services.rekognion.model.Image;
导入software.amazon.awssdk.services.rekognion.model.CompareFacesRequest;
导入software.amazon.awssdk.services.rekognion.model.CompareFacesResponse;
导入software.amazon.awssdk.services.rekognion.model.CompareFacesMatch;
导入software.amazon.awssdk.services.rekognion.model.ComparedFace;
导入software.amazon.awssdk.services.rekognion.model.BoundingBox;
导入software.amazon.awssdk.core.SdkBytes;
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.FileNotFoundException;
导入java.io.InputStream;
导入java.util.List;
//代码段结尾:[rekognition.java2.compare_faces.import]
公共类比较{
公共静态void main(字符串[]args){
最终字符串用法=“\n”+
“比较-如何比较两个图像中的两个面\n\n”+
“用法:比较\n\n”+
“其中:\n”+
pathSource-到源映像的路径(即,C:\\AWS\\pic1.png)\n+
“pathTarget-目标图像的路径(即,C:\\AWS\\pic2.png)\n\n”;
浮点相似阈值=70F;
字符串sourceImage=args[0];
字符串targetImage=args[1];
Region Region=Region.US_EAST_2;
RekognitionClient rekClient=RekognitionClient.builder()
.地区(地区)
.build();
比较面(rekClient、相似性阈值、源图像、目标图像);
}
//代码段开始:[rekognition.java2.compare_faces.main]
公共静态无效比较面(RekognitionClient rekClient、浮点相似性阈值、字符串源映像、字符串目标映像){
试一试{
InputStream sourceStream=新文件InputStream(新文件(sourceImage));
InputStream tarStream=新文件InputStream(新文件(targetImage));
SdkBytes sourceBytes=SdkBytes.fromInputStream(sourceStream);
SdkBytes targetBytes=SdkBytes.fromInputStream(tarStream);
//为源图像创建图像对象
Image souImage=Image.builder()
.bytes(源字节)
.build();
//为目标图像创建图像对象
Image tarImage=Image.builder()
.bytes(targetBytes)
.build();
//创建CompareFacesRequest对象
CompareFacesRequest facesRequest=CompareFacesRequest.builder()
.sourceImage(souImage)
.targetImage(tarImage)
.相似性阈值(相似性阈值)
.build();
//比较两幅图像
CompareFacesResponse compareFacesResult=rekClient.compareFaces(facesRequest);
//显示结果
List faceDetails=compareFacesResult.faceMatches();
用于(比较匹配:faceDetails){
ComparedFace=match.face();
BoundingBox位置=face.BoundingBox();
System.out.println(“位于“+位置的面.left().toString())
+“”+位置。顶部()
+与“+face.confidence().toString()匹配”
+百分之百的信心;;
}
List uncompared=compareFacesResult.unmatchedFaces();
System.out.println(“有”+uncompare.size()
+“不匹配的面”);
System.out.println(“源图像旋转:+compareFacesResult.sourceImageOrientationCorrection());
System.out.println(“目标图像旋转:+compareFacesResult.targetImageOrientationCorrection());
}捕获(RekognitionException | FileNotFoundException e){
System.out.println(“加载源映像失败”+源映像);
系统出口(1);
}
//代码段结尾:[rekognition.java2.compare_faces.main]
}
}
您可以在这里找到Java V2的完整示例:能否显示您的
请求
?我的请求:{Image:{S3Ob
package com.example.rekognition;
// snippet-start:[rekognition.java2.compare_faces.import]
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.rekognition.RekognitionClient;
import software.amazon.awssdk.services.rekognition.model.RekognitionException;
import software.amazon.awssdk.services.rekognition.model.Image;
import software.amazon.awssdk.services.rekognition.model.CompareFacesRequest;
import software.amazon.awssdk.services.rekognition.model.CompareFacesResponse;
import software.amazon.awssdk.services.rekognition.model.CompareFacesMatch;
import software.amazon.awssdk.services.rekognition.model.ComparedFace;
import software.amazon.awssdk.services.rekognition.model.BoundingBox;
import software.amazon.awssdk.core.SdkBytes;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.List;
// snippet-end:[rekognition.java2.compare_faces.import]
public class CompareFaces {
public static void main(String[] args) {
final String USAGE = "\n" +
"CompareFaces - how to compare two faces in two images\n\n" +
"Usage: CompareFaces <pathSource> <pathTarget>\n\n" +
"Where:\n" +
"pathSource - the path to the source image (ie, C:\\AWS\\pic1.png) \n " +
"pathTarget - the path to the target image (ie, C:\\AWS\\pic2.png) \n\n";
Float similarityThreshold = 70F;
String sourceImage = args[0];
String targetImage = args[1];
Region region = Region.US_EAST_2;
RekognitionClient rekClient = RekognitionClient.builder()
.region(region)
.build();
compareTwoFaces(rekClient, similarityThreshold, sourceImage, targetImage);
}
// snippet-start:[rekognition.java2.compare_faces.main]
public static void compareTwoFaces(RekognitionClient rekClient, Float similarityThreshold, String sourceImage, String targetImage) {
try {
InputStream sourceStream = new FileInputStream(new File(sourceImage));
InputStream tarStream = new FileInputStream(new File(targetImage));
SdkBytes sourceBytes = SdkBytes.fromInputStream(sourceStream);
SdkBytes targetBytes = SdkBytes.fromInputStream(tarStream);
// Create an Image object for the source image
Image souImage = Image.builder()
.bytes(sourceBytes)
.build();
// Create an Image object for the target image
Image tarImage = Image.builder()
.bytes(targetBytes)
.build();
// Create a CompareFacesRequest object
CompareFacesRequest facesRequest = CompareFacesRequest.builder()
.sourceImage(souImage)
.targetImage(tarImage)
.similarityThreshold(similarityThreshold)
.build();
// Compare the two images
CompareFacesResponse compareFacesResult = rekClient.compareFaces(facesRequest);
// Display results
List<CompareFacesMatch> faceDetails = compareFacesResult.faceMatches();
for (CompareFacesMatch match: faceDetails){
ComparedFace face= match.face();
BoundingBox position = face.boundingBox();
System.out.println("Face at " + position.left().toString()
+ " " + position.top()
+ " matches with " + face.confidence().toString()
+ "% confidence.");
}
List<ComparedFace> uncompared = compareFacesResult.unmatchedFaces();
System.out.println("There was " + uncompared.size()
+ " face(s) that did not match");
System.out.println("Source image rotation: " + compareFacesResult.sourceImageOrientationCorrection());
System.out.println("target image rotation: " + compareFacesResult.targetImageOrientationCorrection());
} catch(RekognitionException | FileNotFoundException e) {
System.out.println("Failed to load source image " + sourceImage);
System.exit(1);
}
// snippet-end:[rekognition.java2.compare_faces.main]
}
}