當我嘗試比較我的 s3 存盤桶中的兩個影像時出現此錯誤,我遵循函式規則從 S3Object 獲取具有正確名稱和 s3 存盤桶名稱的影像,但我拋出了無效的影像格式例外。也許它必須是 base64 或位元組緩沖區?我不明白為什么要從 S3Object 獲取函式。
我的代碼很簡單,如下所示:
String reference = "reference.jpg";
String target = "selfie.jpg";
String bucket = "pruebas";
CompareFacesRequest request = new CompareFacesRequest()
.withSourceImage(new Image().withS3Object(new S3Object()
.withName(reference).withBucket(bucket)))
.withTargetImage(new Image().withS3Object(new S3Object()
.withName(target).withBucket(bucket)))
.withSimilarityThreshold(similarityThreshold);
AmazonRekognition rekognitionClient = AmazonRekognitionClientBuilder.standard()
.withRegion(Regions.US_EAST_1).build();
CompareFacesResult compareFacesResult= rekognitionClient.compareFaces(request);
在 compareFaces(request) 最后一行拋出例外。
這是錯誤的主要部分:
Exception in thread "main" com.amazonaws.services.rekognition.model.InvalidImageFormatException: Request has invalid image format (Service: AmazonRekognition; Status Code: 400; Error Code: InvalidImageFormatException;
這些影像位于 AWS S3 中,我的 rekognition 憑證有權從 S3 讀取。所以在那部分不是錯誤。
更新代碼:
public static void main(String[] args) throws FileNotFoundException {
Float similarityThreshold = 70F;
String reference = "reference.jpg";
String target = "target.jpg";
String bucket = "pruebas";
ProfileCredentialsProvider credentialsProvider = ProfileCredentialsProvider.builder().profileName("S3").build();
Region region = Region.US_EAST_1;
S3Client s3 = S3Client.builder()
.region(region)
.credentialsProvider(credentialsProvider)
.build();
byte[] sourceStream = getObjectBytes(s3, bucket,reference);
byte[] tarStream = getObjectBytes(s3, bucket, target);
SdkBytes sourceBytes = SdkBytes.fromByteArrayUnsafe(sourceStream);
SdkBytes targetBytes = SdkBytes.fromByteArrayUnsafe(tarStream);
Image souImage = Image.builder()
.bytes(sourceBytes)
.build();
Image tarImage = Image.builder()
.bytes(targetBytes)
.build();
CompareFacesRequest request = CompareFacesRequest.builder()
.sourceImage(souImage)
.targetImage(tarImage)
.similarityThreshold(similarityThreshold).build();
RekognitionClient rekognitionClient = RekognitionClient.builder()
.region(Region.US_EAST_2).build();
CompareFacesResponse compareFacesResult= rekognitionClient.compareFaces(request);
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());
}
public static byte[] getObjectBytes (S3Client s3, String bucketName, String keyName) {
try {
GetObjectRequest objectRequest = GetObjectRequest
.builder()
.key(keyName)
.bucket(bucketName)
.build();
ResponseBytes<GetObjectResponse> objectBytes = s3.getObjectAsBytes(objectRequest);
return objectBytes.asByteArray();
} catch (S3Exception e) {
System.err.println(e.awsErrorDetails().errorMessage());
System.exit(1);
}
return null;
}
uj5u.com熱心網友回復:
嘗試使用適用于 Java V2 的 AWS 開發工具包- 而不是舊的 V1 庫。強烈建議使用 V2 而不是 V1,這是最佳實踐。
這是用于比較人臉的 V2 代碼。在此示例中,請注意您必須將影像放入SdkBytes物件中。只要將影像放入SDKBytes中,影像的位置就無關緊要。影像可以位于本地檔案系統 S3 存盤桶中。等等
您可以在此處的 AWS Github 存盤庫中找到此 V2 Reckonation 示例:

更新
我通常根本不接觸 V1 代碼;但是,我很好奇。此代碼有效....
package aws.example.rekognition.image;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.rekognition.AmazonRekognition;
import com.amazonaws.services.rekognition.AmazonRekognitionClientBuilder;
import com.amazonaws.services.rekognition.model.Image;
import com.amazonaws.services.rekognition.model.BoundingBox;
import com.amazonaws.services.rekognition.model.CompareFacesMatch;
import com.amazonaws.services.rekognition.model.CompareFacesRequest;
import com.amazonaws.services.rekognition.model.CompareFacesResult;
import com.amazonaws.services.rekognition.model.ComparedFace;
import java.util.List;
import com.amazonaws.services.rekognition.model.S3Object;
public class CompareFacesBucket {
public static void main(String[] args) throws Exception{
Float similarityThreshold = 70F;
AmazonRekognition rekognitionClient = AmazonRekognitionClientBuilder.standard()
.withRegion(Regions.US_WEST_2)
.build();
String reference = "Lam1.jpg";
String target = "Lam2.jpg";
String bucket = "<MyBucket>";
CompareFacesRequest request = new CompareFacesRequest()
.withSourceImage(new Image().withS3Object(new S3Object()
.withName(reference).withBucket(bucket)))
.withTargetImage(new Image().withS3Object(new S3Object()
.withName(target).withBucket(bucket)))
.withSimilarityThreshold(similarityThreshold);
// Call operation
CompareFacesResult compareFacesResult = rekognitionClient.compareFaces(request);
// Display results
List <CompareFacesMatch> faceDetails = compareFacesResult.getFaceMatches();
for (CompareFacesMatch match: faceDetails){
ComparedFace face= match.getFace();
BoundingBox position = face.getBoundingBox();
System.out.println("Face at " position.getLeft().toString()
" " position.getTop()
" matches with " face.getConfidence().toString()
"% confidence.");
}
List<ComparedFace> uncompared = compareFacesResult.getUnmatchedFaces();
System.out.println("There was " uncompared.size()
" face(s) that did not match");
System.out.println("Source image rotation: " compareFacesResult.getSourceImageOrientationCorrection());
System.out.println("target image rotation: " compareFacesResult.getTargetImageOrientationCorrection());
}
}
輸出:

我能想到的最后一件事是我的 V1 代碼適用于 JPG 影像,而您的卻不是,您的 JPG 影像檔案可能已損壞或其他原因。我想用你的圖片測驗這段代碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/511512.html
上一篇:有什么方法可以將lambda匯出到S3的日志結合起來嗎?
下一篇:AWSIAMS3下載策略
