Ошибка Watson Visual Recognition Недопустимые данные изображения. Поддерживаемые форматы: JPG, PNG и GIF при загрузке изображения из Android Studio.

Я долго ломал себе голову над этим и был бы очень признателен, если бы кто-то, имеющий некоторое представление об этой проблеме, мог мне помочь!

Я пытаюсь загрузить изображение в Watson Visual Recognition API с помощью POST из Android Studio (сделав снимок с помощью камеры).

Мне удалось - сохранить изображение после съемки камерой - показать его как растровое изображение в приложении

и я пытаюсь загрузить файл в Watson API, но продолжаю получать эту ошибку

"description": "Недопустимые данные изображения. Поддерживаемые форматы: JPG, PNG и GIF."

Я был бы очень признателен, если бы кто-нибудь мог дать некоторое представление о том, что я делаю здесь не так. Заранее спасибо!

Я использую HttpUrlConnection и DataOutputStream для POST прямо сейчас, и код выглядит следующим образом:

imgName и imgPath все правильно определены, а name = "images_file" - это то, как Watson Visual Recognition API запрашивает имя

public void uploadImage(){
    HttpURLConnection conn = null;
    DataOutputStream dos = null;
    String lineEnd = "\r\n";
    String twoHyphens = "--";
    String boundary = "*****";
    int bytesRead, bytesAvailable, bufferSize;
    byte[] buffer;
    int maxBufferSize = 1 * 1024 * 1024;
    try{

        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();

        StrictMode.setThreadPolicy(policy);

        URL url = new URL("https://gateway-a.watsonplatform.net/visual-recognition/api/v3/classify?api_key=APIKEY&version=2016-05-20");
        conn= (HttpURLConnection) url.openConnection();
        FileInputStream fileInputStream = new FileInputStream(file);
        conn.setDoInput(true);
        conn.setDoOutput(true);
        conn.setUseCaches(false);
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Connection", "Keep-Alive");
        conn.setRequestProperty("ENCTYPE", "multipart/form-data");
        conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
        conn.setRequestProperty("images_file", imgPath);

        dos = new DataOutputStream(conn.getOutputStream());

        dos.writeBytes(twoHyphens + boundary + lineEnd);
        dos.writeBytes("Content-Disposition: form-data; name=\"images_file\"; filename = \"" + imgName + "\"" + lineEnd);
        dos.writeBytes(lineEnd);


        bytesAvailable = fileInputStream.available();
        bufferSize = Math.min(bytesAvailable, maxBufferSize);
        buffer = new byte[bufferSize];

        bytesRead = fileInputStream.read(buffer, 0, bufferSize);
        while (bytesRead > 0) {

            dos.write(buffer, 0, bufferSize);
            bytesAvailable = fileInputStream.available();
            bufferSize = Math.min(bytesAvailable, maxBufferSize);
            bytesRead = fileInputStream.read(buffer, 0, bufferSize);

        }

        // send multipart form data necesssary after file data...
        dos.writeBytes(lineEnd);
        dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

        // Responses from the server (code and message)
        serverResponseCode = conn.getResponseCode();
        String serverResponseMessage = conn.getResponseMessage();

        Log.i("uploadFile", "HTTP Response is : "
                + serverResponseMessage + ": " + serverResponseCode);

        if(serverResponseCode == 200){

            BufferedReader br = new BufferedReader(new InputStreamReader((conn.getInputStream())));
            StringBuilder sb = new StringBuilder();
            String output;
            while ((output = br.readLine()) !=null) {
                sb.append(output);
            }
            Log.d("debugging", sb.toString());

            runOnUiThread(new Runnable() {
                public void run() {

                    String msg = "File Upload Completed.\n\n See uploaded file here : \n\n"
                            +" http://www.androidexample.com/media/uploads/"
                            +imgName;


                    Toast.makeText(getApplicationContext(), "File Upload Complete.",
                            Toast.LENGTH_SHORT).show();


                }
            });
        }

        //close the streams //
        fileInputStream.close();
        dos.flush();
        dos.close();

    } catch (MalformedURLException ex) {

        ex.printStackTrace();

        runOnUiThread(new Runnable() {
            public void run() {
                Toast.makeText(getApplicationContext(), "MalformedURLException",
                        Toast.LENGTH_SHORT).show();
            }
        });

        Log.e("Upload file to server", "error: " + ex.getMessage(), ex);
    } catch (Exception e) {

        e.printStackTrace();

        runOnUiThread(new Runnable() {
            public void run() {
                Toast.makeText(getApplicationContext(), "Got Exception : see logcat ",
                        Toast.LENGTH_SHORT).show();
            }
        });
        Log.e("Debugging", "Exception : "
                + e.getMessage(), e);
    }
    Log.d("Debugging", "responseCode:" + serverResponseCode);
}

person nick.jw.park    schedule 07.08.2016    source источник


Ответы (2)


Visual Recognition имеет SDK (клиентскую библиотеку) на Java. Вам просто нужно добавить зависимость к вашему build.gradle.

  compile 'com.ibm.watson.developer_cloud:java-sdk:3.2.0'

потом

VisualRecognition service = new VisualRecognition(VisualRecognition.VERSION_DATE_2016_05_20);
service.setApiKey("<api-key>");

ClassifyImagesOptions options = new ClassifyImagesOptions.Builder()
  .images(new File("car.png"))
  .build();

VisualClassification result = service.classify(options)
  .enqueue(new ServiceCallback<List<Dialog>>() {
      @Override
      public void onResponse(List<Dialog> response) {
        System.out.println(response);
      }

      @Override
      public void onFailure(Exception e) {
      // on failure
      }}
  );

Это example содержит CameraHelper класс с служебными методами для получения пути к файлу или InputStream изображения в Android.

person German Attanasio    schedule 07.08.2016
comment
о, черт возьми, для этого был SDK? Не могу поверить, что я это пропустил! Я не могу попробовать это прямо сейчас, но я совершенно уверен, что этот подход сработает, поэтому я все равно отмечу его как ответ - надеюсь, он поможет кому-то еще, у кого есть проблемы с визуальным распознаванием Watson! F - person nick.jw.park; 08.08.2016

Еще одна вещь, которую нужно обязательно проверить, - это то, что imgName фактически заканчивается одним из этих расширений - иначе система не примет его в настоящее время.

person Matt Hill    schedule 08.08.2016