安卓也能机器学习,安卓机器学习入门
最近的一段时间,人工智能话题火出了天边,各个互联网大厂都在将自己的产品往人工智能的方向挨近,好像不跟上AI的浪潮咱们就要掉队了。然而作为一名客户端开发,准确的说是一名安卓开发,好像AI和咱们较为遥远,其实不然,AI不仅仅是算法端的作业,咱们安卓其实也有能搞人工智能和机器学习的,接下来听我缓缓道来。
一、什么是机器学习
机器学习是人工智能的一个分支,是使核算机具有学习能力而无需进行明确编程的科学。听起来好像十分巨大上,说人话就是让核算机像人相同经过学习数据来做出决策。这儿有一个要害,如何让核算机像人相同拥有决策能力呢,这就需求核算机不断地搜集新数据、调整模型、评估功用以及练习预测新数据。
二、安卓端上干流的机器学习结构有哪些
1.TensorFlow Lite:这是Google开发的一个轻量级机器学习结构,专为移动和嵌入式设备设计。它答应开发者将机器学习模型嵌入到安卓运用中。
2.ML Kit:这是Google为Firebase开发的一个机器学习套件,供给了一系列API和SDK,使得开发者能够在安卓和iOS运用中轻松运用机器学习功用。
3.PyTorch Mobile:这是Facebook开发的一个深度学习结构,供给了一系列工具和库,使得开发者能够在移动设备上运转PyTorch模型。
4.Caffe2:Caffe2是Facebook的另一款开源机器学习结构,它专为移动设备优化,能够在Android设备上运转机器学习模型。
5.MNN:MNN是阿里巴巴开源的移动端神经网络核算引擎,它供给了一套完整的神经网络核算结构,包含模型转换工具、高效轻量的推理引擎以及便捷易用的前端接口,能够协助开发者轻松完成在移动端设备上进行神经网络模型的核算。
6.NCNN:NCNN是腾讯优图实验室开源的一个专为手机端优化的移动端神经网络核算库,NCNN现在现已运用到多款产品中,其间就有人人都在用的微信
还有十分多各类的安卓端机器学习结构,如小米的MACE、快手的KwaiNN、字节的ByteN等,可见咱们安卓端仍是有十分多机器学习结构供咱们运用的。
三、咱们安卓端在机器学习上能做什么?
安卓端在机器学习上仍是有十分广的运用场景的,包含但是不限于:
1.目标辨认:能够对图片或许摄像头中的物体目标检测和跟踪
2.人脸辨认:获取检测到的人脸的眼睛、耳朵、脸颊、鼻子和嘴巴的坐标,作为用户id
3.文本辨认:能够辨认文本不同国家言语、图片文字辨认等
4.语音辨认和语音组成:能够用于开发语音帮手,完成语音输入和语音输出,供给更天然的交互办法。
5.推荐体系:经过学习用户的行为和喜爱,能够推荐用户可能感兴趣的内容。例如,在音乐、电影、购物等运用中,都能够看到推荐体系的运用。
6.行为辨认:经过学习用户的行为模式,能够辨认用户的活动,例如走路、跑步、骑车等。这能够用于健康和健身运用。
7.预测模型:经过机器学习,能够建立预测模型,例如预测股票价格、天气等
8.安全防护:例如,经过学习正常的体系行为,能够辨认和阻止恶意行为,提高运用的安全性等等。
四、完成一个安卓端的机器学习
上面介绍了这么多机器学习相关的常识,是不是现已跃跃欲试预备大干一场安卓机器学习开发了,什么?听起来感觉太难了?不不不,要完成一个安卓端的机器学习运用那可太简略了,因为咱们有十分多的机器学习结构供咱们运用,就google自身的开发的机器学习结构TensorFlow Lite和ML Kit就十分适合咱们入门。
咱们假如要快速完成一个安卓端机器学习运用能够挑选ML Kit,因为ML Kit供给了一系列预练习的机器学习模型,以及供给了十分多常用的机器学习功用,如文本辨认、面部辨认、图画标签辨认、条形码扫描等。ML Kit的目标是让机器学习变得更加易用和可拜访,事实上也是如此,那咱们话不多说,直接经过代码简略体检一下ML Kit吧。
首要第一步:咱们需求将ML Kit的Android 版机器学习套件库的依赖项添加到模块的运用级 Gradle 文件。
咱们这次计划完成图画标签辨认的功用,所以挑选图画标签辨认的库
dependencies {
//图画标签辨认
implementation 'com.google.mlkit:image-labeling:17.0.7'
}
第二步:既然咱们是要完成图画标签辨认,那咱们就需求为ML Kit预备好图片并生成相对应的数据。
大致分为以下代码中的三步,获取图片的bitmap,获取图片的旋转视点,最后赋值给ML Kit的InputImage:
private void initImage() {
//1.获取图片的bitmap
Bitmap bitmap = getBitmap();
//2.获取图片的旋转视点
int rotate = getRotate(bitmap);
//3.赋值给ML Kit的InputImage
InputImage image = InputImage.fromBitmap(bitmap, rotate);
}
获取图片的bitmap,该办法ML Kit没有供给,需求自己完成,咱们也能够直接运用咱们的办法
private Bitmap getBitmap(){
Bitmap bitmap = null;
try {
// 获取 assets 目录下的图片
AssetManager assetManager = getAssets();
InputStream inputStream = assetManager.open("车.png");
bitmap = BitmapFactory.decodeStream(inputStream);
// 显现图片
ImageView imageView = (ImageView) findViewById(R.id.iv_ai_image);
imageView.setImageBitmap(bitmap);
} catch (IOException e) {
e.printStackTrace();
}
return bitmap;
}
获取图片的旋转视点,该办法ML Kit没有供给,需求自己完成,咱们也能够直接运用咱们的办法
private int getRotate(Bitmap bitmap){
//接下来获取图片旋转视点
FileOutputStream out = null;
File file = new File(getExternalFilesDir(null), "temp.jpg"); // 创立临时文件
try {
out = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.PNG, 100, out); // 将Bitmap保存为.png格局的图片
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (out != null) {
out.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
int rotate = 0;
ExifInterface exif = null;
try {
exif = new ExifInterface(file.getAbsolutePath());
int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_270:
rotate = 270;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
rotate = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_90:
rotate = 90;
break;
}
System.out.println("Rotation: " + rotate);
} catch (IOException e) {
e.printStackTrace();
}
return rotate;
}
当然除了运用 Bitmap传递图片数据给ML Kit,咱们还能够运用CameraX库、运用 ByteBuffer 或 ByteArray等,这儿就步一一列举了。
第三步,现在咱们有了图片的数据咱们就能够运用ML Kit的图片标签辨认了。
这儿咱们需求先获取一个 ImageLabeler 的实例:
ImageLabeler labeler = ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS);
然后就能够将图片信息传给process()办法:
labeler.process(image)
.addOnSuccessListener(new OnSuccessListener<List<ImageLabel>>() {
@Override
public void onSuccess(List<ImageLabel> imageLabels) {
// 辨认成功
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// 辨认失败
}
});
MLKit处理图片信息成功后返回给咱们的ListimageLabels内容格局如下:
[ImageLabel{text=Vehicle, confidence=0.9583442, index=316, mid=/m/07yv9}, ImageLabel{text=Car, confidence=0.8914178, index=423, mid=/m/0k4j}, ImageLabel{text=Bird, confidence=0.77239835, index=20, mid=/m/015p6}, ImageLabel{text=Bumper, confidence=0.7642555, index=172, mid=/m/02mnkq}, ImageLabel{text=Wheel, confidence=0.72052723, index=322, mid=/m/083wq}, ImageLabel{text=Windshield, confidence=0.533966, index=87, mid=/m/01lrnl}, ImageLabel{text=Metal, confidence=0.5333236, index=253, mid=/m/04t7l}]
其间value为“text”指的就是图片辨认的标签,value为“confidence”指的就是置信水平啦(能够理解为可能性,越接1则可能性越大) 咱们还能够对这些数据进行一下处理加工,让咱们看得更直观,代码如下:
public void setLabelerDetector() {
if (image == null) {
Toast.makeText(AIActivity.this,"image为空",Toast.LENGTH_SHORT).show();
return;
}
ImageLabeler labeler = ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS);
final ImageLabel[] imageLabel = {null};
StringBuffer stringBuffer = new StringBuffer();
labeler.process(image).addOnSuccessListener(new OnSuccessListener<List<ImageLabel>>() {
@Override
public void onSuccess(List<ImageLabel> imageLabels) {
Toast.makeText(AIActivity.this,"图片辨认成功",Toast.LENGTH_SHORT).show();
Log.d("ML_Kit", String.valueOf(imageLabels));
int len = imageLabels.size();
if (len > 0){
for (int i = 0; i < len; i++) {
Log.d("ML_Kit", String.valueOf(imageLabels.get(i)));
ImageLabel label = imageLabels.get(i);
if (i != 0) {
float last_confidence = imageLabel[0].getConfidence();
float next_confidence = label.getConfidence();
if (last_confidence < next_confidence) {
imageLabel[0] = label;
}
} else {
imageLabel[0] = label;
}
String text = label.getText();
float confidence = label.getConfidence();
stringBuffer.append("图片内容可能为"+text+",置信水平为"+confidence+"\n");
}
String result = "图片内容最有可能为" + imageLabel[0].getText();
stringBuffer.append(result);
Toast.makeText(AIActivity.this,result,Toast.LENGTH_SHORT).show();
mAi.setText(stringBuffer);//TextView,能够自己完成
}else {
mAi.setText("未能辨认到目标");//TextView,能够自己完成
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(AIActivity.this,"图标标签辨认失败",Toast.LENGTH_SHORT).show();
Log.e("ML_Kit", "图标标签辨认失败,e-->" + e);
}
});
}
作用如下:
咱们能够看到,ML Kit为咱们准确的辨认出图片的标签是Vehicle——车辆,甚至咱们还能来点更骚的,辨认一下表情包:
五、结语
怎么样,安卓端运用机器学习是不是很简略,假如不想用 ML Kit的预练习模型,想自己练习自己的机器学习模型还能够运用TensorFlow Lite,它答应开发者将机器学习模型转化为一种更小,更快,更高效的格局,使其能够在设备上运转,对模型有详细定制需求的开发者来说,TensorFlow Lite是一个很好的挑选,篇幅有限,这儿就不详细展开了,除此之外想进一步了解ML Kit的其他机器学习功用的能够到ML Kit的官网了解一下:developers.google.cn/ml-kit?hl=z…