不知道大家有沒有被最近的AlphaGo刷屏,反正我是看的心癢癢的。也不知道咋搞的就看到了百度雲的人工智能上面。閒來無事就試了試圖像識別。
百度雲圖像識別提供了多種語言的SDK各位根據自己的需求下載相應sdk就行了。此處以javaSDK爲例。
1.下載官方SDK包
2.導入項目的lib中
本以爲跟着文檔就行,哪隻採坑剛剛開始(流淚中……),下面詳細講講過程。官方java代碼已經公開,地址https://github.com/Baidu-AIP/java-sdk
本文做的是車型識別,根據文檔指引代碼是這樣的:
public class Sample {
//設置APPID/AK/SK
public static final String APP_ID = "你的 App ID";
public static final String API_KEY = "你的 Api Key";
public static final String SECRET_KEY = "你的 Secret Key";
public static void main(String[] args) {
// 初始化一個AipImageClassifyClient
AipImageClassifyClient client = new AipImageClassifyClient(APP_ID, API_KEY, SECRET_KEY);
// 可選:設置網絡連接參數
client.setConnectionTimeoutInMillis(2000);
client.setSocketTimeoutInMillis(60000);
// 可選:設置代理服務器地址, http和socket二選一,或者均不設置
client.setHttpProxy("proxy_host", proxy_port); // 設置http代理
client.setSocketProxy("proxy_host", proxy_port); // 設置socket代理
// 調用接口
String path = "test.jpg";
JSONObject res = client.objectDetect(path, new HashMap<String, String>());
System.out.println(res.toString(2));
}
}
but什麼鬼,AipImageClassifyClient找不到,剛開始我以爲我粗心下載錯了,還特意從新下載,發現還是沒有,沒辦法跑到github上查看官方公佈的代碼,並沒有找到。好吧找不到咱就直接掉api吧!(順道說下,我用車型識別的api全局找了下也沒找到,誰知道原因的說下,謝謝)
下面是直接調用api實現的代碼及結果:
public class MainActivity extends AppCompatActivity {
String access_token;
TextView result;
ImageView iv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button).setOnClickListener(listener);
result = (TextView) findViewById(R.id.textView);
iv = (ImageView) findViewById(R.id.iv);
Auth();
}
private void Auth() {
OkGo.<String>get("https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=你的應用key&client_secret=你的應用secret")
.tag(this)
.execute(new StringCallback() {
@Override
public void onSuccess(Response<String> response) {
try {
JSONObject jsonObject = new JSONObject(response.body());
access_token = jsonObject.getString("access_token");
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onError(Response<String> response) {
super.onError(response);
}
});
}
View.OnClickListener listener = new View.OnClickListener() {
@Override
public void onClick(View view) {
ImagePicker imagePicker = ImagePicker.getInstance();
imagePicker.setImageLoader(new GlideAlbumLoader());
imagePicker.setShowCamera(true);
imagePicker.setMultiMode(false);
imagePicker.setCrop(false);
Intent intent = new Intent(MainActivity.this, ImageGridActivity.class);
startActivityForResult(intent, 1002);
}
};
public void car(String path) {
String url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/car?access_token=" + access_token;
try {
String imgStr = file2String(new File(path));
OkGo.<String>post(url)
.tag(this)
.params("Content-Type", "application/x-www-form-urlencoded")//
.params("image", imgStr)//
.params("top_num", "20")//
.isMultipart(true)
.execute(new StringCallback() {
@Override
public void onSuccess(Response<String> response) {
CarBean bean = new Gson().fromJson(response.body(), CarBean.class);
if (!(bean.getResult() == null || bean.getResult().size() == 0)) {
DecimalFormat df = new DecimalFormat("###0.00");
result.setText("此車型有" + (df.format((Math.round(bean.getResult().get(0).getScore() / 1 * 10000) / 10000.0) * 100)) + "%的可能是:" + bean.getResult().get(0).getName());
} else {
Toast.makeText(MainActivity.this, "", Toast.LENGTH_LONG).show();
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
private String file2String(File file) {
byte[] buffer = new byte[0];
try {
FileInputStream inputFile = new FileInputStream(file);
buffer = new byte[(int) file.length()];
inputFile.read(buffer);
inputFile.close();
} catch (IOException e) {
e.printStackTrace();
}
return Base64.encodeToString(buffer, Base64.DEFAULT);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == ImagePicker.RESULT_CODE_ITEMS) {
if (data != null && requestCode == 1002) {
ArrayList<ImageItem> images = (ArrayList<ImageItem>) data.getSerializableExtra(ImagePicker.EXTRA_RESULT_ITEMS);
iv.setImageBitmap(BitmapFactory.decodeFile(images.get(0).path));
car(images.get(0).path);
} else {
Toast.makeText(this, "沒有數據", Toast.LENGTH_SHORT).show();
}
}
}
}
這裏面引入了imageloader與OkGo兩框架,具體使用請自行查看相應文檔.好啦!今天就這樣吧!哈哈,好沒得營養呀!有問題可以留言。