0

J'ai une instance Amazon EC2 avec Linux configurée et exécutée pour que mon application Web Java consomme des requêtes REST. Le problème est que j'essaie d'utiliser Google Cloud Vision dans cette application pour reconnaître la violence/nudité dans les images des utilisateurs.Les informations d'identification de l'application Google sont définies et non trouvées.

Accès au EC2 dans mon terminal, je mets les GOOGLE_APPLICATION_CREDENTIALS par la commande suivante, que je trouve dans la documentation:

export GOOGLE_APPLICATION_CREDENTIALS=<my_json_path.json> 

vient ici mon premier problème: Lorsque je redémarre mon serveur, et a couru « echo $ GOOGLE_APPLICATION_CREDENTIALS 'la variable a disparu. Ok, je l'ai mis dans bash_profile et bashrc et maintenant c'est ok.

Mais, quand je courais ma demande, la consommation du code ci-dessus, pour obtenir le statut d'adulte et la violence de mon image, je me suis l'erreur suivante:

java.io.IOException: The Application Default Credentials are not available. They are available if running in Google Compute Engine. Otherwise, the environment variable GOOGLE_APPLICATION_CREDENTIALS must be defined pointing to a file defining the credentials. See https://developers.google.com/accounts/docs/application-default-credentials for more information. 

Mon code est le suivant:

contrôleur:

 if(SafeSearchDetection.isSafe(user.getId())) { 
      if(UserDB.updateUserProfile(user)==false){ 
       throw new SQLException("Failed to Update"); 
      } 
     } else { 
      throw new IOException("Explicit Content"); 
     } 

SafeSearchDetection.isSafe (int idUser):

String path = IMAGES_PATH + idUser + ".jpg"; 

    try { 
     mAdultMedicalViolence = detectSafeSearch(path); 
     if(mAdultMedicalViolence.get(0) > 3) 
      return false; 
     else if(mAdultMedicalViolence.get(1) > 3) 
      return false; 
     else if(mAdultMedicalViolence.get(2) > 3) 
      return false; 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return true; 

detectSafeSearch (String path):

List<AnnotateImageRequest> requests = new ArrayList<AnnotateImageRequest>(); 
    ArrayList<Integer> adultMedicalViolence = new ArrayList<Integer>(); 

    ByteString imgBytes = ByteString.readFrom(new FileInputStream(path)); 

    Image img = Image.newBuilder().setContent(imgBytes).build(); 
    Feature feat = Feature.newBuilder().setType(Type.SAFE_SEARCH_DETECTION).build(); 
    AnnotateImageRequest request = AnnotateImageRequest.newBuilder().addFeatures(feat).setImage(img).build(); 
    requests.add(request); 

    ImageAnnotatorClient client = ImageAnnotatorClient.create(); 

    BatchAnnotateImagesResponse response = client.batchAnnotateImages(requests); 
    List<AnnotateImageResponse> responses = response.getResponsesList(); 

    for (AnnotateImageResponse res : responses) { 
     if (res.hasError()) { 
      System.out.println("Error: "+res.getError().getMessage()+"\n"); 
      return null; 
     } 

     SafeSearchAnnotation annotation = res.getSafeSearchAnnotation(); 
     adultMedicalViolence.add(annotation.getAdultValue()); 
     adultMedicalViolence.add(annotation.getMedicalValue()); 
     adultMedicalViolence.add(annotation.getViolenceValue()); 

    } 
    for(int content : adultMedicalViolence) 
     System.out.println(content + "\n"); 

    return adultMedicalViolence; 

Répondre

0

Mon application REST a été construit au-dessus d'un Tomcat8. Après échec de l'exécution de la commande:

System.getenv("GOOGLE_APPLICATION_CREDENTIALS") 

Je me rends compte que mon problème était dans l'installation Variables d'environnement à Tomcat. Pour corriger cela, je viens de créer un nouveau fichier setenv.sh dans mon/bin avec le contenu:

GOOGLE_APPLICATION_CREDENTIALS=<my_json_path.json> 

Et ça a marché!