0

我的日志中出现此异常:“clarifai2.exception.ClarifaiException:获得默认模型的最大尝试次数。” 这是由我的大量 android 应用程序用户生成的,但我无法复制异常或确定导致它的原因。有关如何重新创建甚至更好地防止此异常发生的任何帮助都将非常有帮助。

更新:我发现了问题并且能够按需重现,如果没有可用的 Internet 连接,Clarifai 库会抛出此异常,则不会检查库内的网络连接状态。我可以在构建 clarifai 客户端之前检查我的应用程序中的网络连接,但是如果在构建客户端后网络连接丢失,则会生成此异常,关于如何防止这种情况的任何想法?谢谢你。

1 - 确保手机上可以连接到互联网的数据。

2 - 在 onCreate 中构建 clarifai 客户端

3 - 向食物模型发送 clarifai 预测请求

4 - 禁用手机上的 wifi 和移动数据连接

5 - 等待 10 到 15 秒,可以导航到其他活动,然后 clarifai 抛出“Clarifai 异常:获取默认模型的最大尝试次数”并使应用程序崩溃。

可以在此处获得可以抛出此异常的 Clarifai 库类

我在请求活动的 onCreate 中调用了下面的 buildClarifaiClient 方法。

private void buildClarifaiClient(){

    if(clarifaiClient == null){

        clarifaiClient = new ClarifaiBuilder("KeyString")
                .client(new OkHttpClient.Builder()
                        .connectTimeout(60, TimeUnit.SECONDS)
                        .readTimeout(60, TimeUnit.SECONDS)
                        .writeTimeout(60, TimeUnit.SECONDS)
                        //.addInterceptor(new HttpLoggingInterceptor(logger::info).setLevel(HttpLoggingInterceptor.Level.BASIC))
                        .build()
                )
                .buildSync();

    }

}

拍照后在 ActivityResult 上向 Clarifai 请求:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {


        if(clarifaiClient != null) {

            snapSearchActivityResult = true;

            taskClarifaiRequest = new AsyncTask<Void, Void, ClarifaiResponse<List<ClarifaiOutput<Concept>>>>() {

                @Override
                protected void onPreExecute() {


                }

                @Override
                protected ClarifaiResponse<List<ClarifaiOutput<Concept>>> doInBackground(Void... params) {
                    // The default Clarifai model that identifies concepts in images

                    // Use this model to predict, with the image that the user just selected as the input
                    return clarifaiClient.getDefaultModels().foodModel().predict()
                            .withInputs(ClarifaiInput.forImage(ClarifaiImage.of(getPicByteData())))
                            .executeSync();
                }


                @Override
                protected void onPostExecute(ClarifaiResponse<List<ClarifaiOutput<Concept>>> response) {
                    //setBusy(false);
                    if (!response.isSuccessful()) {
                        showErrorSnackbar(getString(R.string.clarifaiAPIContactError));

                        return;
                    }
                    final List<ClarifaiOutput<Concept>> predictions = response.get();
                    if (predictions.isEmpty()) {
                        showErrorSnackbar(getString(R.string.clarifaiAPIResultsError));

                        return;
                    }

                    List<Concept> concepts = predictions.get(0).data();

                    int conceptsSize = concepts.size();

                    Log.d("conceptsSize", String.valueOf(conceptsSize));



                    for (Concept c : concepts) {
                        // Do something with the value

                        Log.d("foodName", String.valueOf(c.name()));
                        Log.d("foodProb", String.valueOf(c.value()));

                    }

                    }

                private void showErrorSnackbar(String errorString) {
                    Snackbar.make(
                            parentLayout,
                            errorString,
                            Snackbar.LENGTH_LONG
                    ).show();
                }
            };

            taskClarifaiRequest.execute();

        } else {

            Snackbar.make(
                    parentLayout,
                    "Unable to connect to Image API, try again.",
                    Snackbar.LENGTH_LONG
            ).show();


            buildClarifaiClient();

        }
      }

堆栈跟踪:

Exception clarifai2.exception.ClarifaiException: Maximum attempts 
reached of getting a default model.
clarifai2.dto.model.DefaultModels.update ()
clarifai2.dto.model.DefaultModels.access$000 ()
clarifai2.dto.model.DefaultModels$1.run ()
java.util.concurrent.ThreadPoolExecutor.runWorker 
(ThreadPoolExecutor.java:1113)
java.util.concurrent.ThreadPoolExecutor$Worker.run 
(ThreadPoolExecutor.java:588)
java.lang.Thread.run (Thread.java:818)
4

1 回答 1

0

我想说您在这里使用的 API 密钥没有执行获取模型请求的权限。当您通过 访问食物模型时getDefaultModels(),首先更新模型(通过获取模型请求),然后才运行预测请求。如果第一个失败,第二个不会运行。

在下周即将发布的 Java API 客户端 2.3 中,调用getDefaultModels()将不再发起获取模型请求,因为大多数时候您只需要一个默认模型的 ID,而不需要获取模型请求返回的完整模型数据。由于只会执行预测请求,因此您不需要获取 API 密钥的模型请求权限。

同时,您可以做两件事之一。任何一个:

  • 添加模型:获取API 密钥的权限。为此,您可以转到API 密钥页面,编辑您的 API 密钥,单击Scopes下的ADVANCED并检查Models:Get。您可能已经检查了预测权限。
  • 或者直接在预测调用上使用模型 ID。我已将食物默认模型 ID(您也可以在DefaultModels.java上面发布的链接中看到)插入到 predict 调用中:client.predict("bd367be194cf45149e75f01d59f77ba7").withInputs(...).executeSync();
于 2017-09-22T14:36:58.020 回答