Clarifai异常:获取默认模型的最大尝试次数

时间:2017-09-21 04:29:33

标签: java android clarifai

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

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

1 - 确保手机上有与互联网的数据连接。

2 - 在onCreate中构建clarifai客户端

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

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

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

可以抛出此异常的Clarifai Library类可用HERE

我在请求活动的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();

    }

}

拍摄照片后,请求对Clarifai的ActivityResult:

@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)

1 个答案:

答案 0 :(得分:0)

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

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

同时,你可以做两件事之一。之一:

  • 为您的API密钥添加模型:获取权限。您可以转到API keys page,修改API密钥,点击范围下的高级并选中模型:获取来执行此操作。您可能已经检查了预测权限。
  • 或直接在预测调用中使用模型ID。我已将食品默认型号ID(您也可以在上面发布的DefaultModels.java链接中看到)插入到预测电话中:client.predict("bd367be194cf45149e75f01d59f77ba7").withInputs(...).executeSync();