Android は機械学習も行うことができます。Android 機械学習を始める

Android は機械学習も行うことができます。Android 機械学習を始める

最近、人工知能の話題が非常に盛り上がっており、大手インターネット企業はどこも自社の製品を人工知能の方向に近づけており、AIの流れについていかないと遅れを取ってしまうのではないかと思われます。しかし、クライアント開発者、正確に言えば Android 開発者にとって、AI は私たちにとって遠い存在であるように見えます。実際にはそうではありません。AI は単なるアルゴリズムの働きではありません。私たち Android も関与することができます。人工知能と機械学習の分野. 次へ ゆっくり聞いてください。

1. 機械学習とは何ですか?

人工知能の一分野である機械学習は、明示的にプログラムされずにコンピューターに学習能力を与える科学です。非常に高度なことのように聞こえますが、人間の言語を話すことは、人間と同じようにデータを学習してコンピューターに意思決定をさせることです。ここで重要なのは、コンピュータに人間と同じような意思決定能力を持たせる方法であり、そのためには、コンピュータが継続的に新しいデータを収集し、モデルを調整し、パフォーマンスを評価し、新しいデータを予測するためのトレーニングを行う必要があります。

2. Android で主流の機械学習フレームワークは何ですか?

1.TensorFlow Lite: これは、Google によって開発され、モバイルおよび組み込みデバイス向けに設計された軽量の機械学習フレームワークです。これにより、開発者は機械学習モデルを Android アプリに埋め込むことができます。

2. ML Kit: Google が Firebase 向けに開発した機械学習キットで、開発者が Android および iOS アプリケーションで機械学習機能を簡単に使用できるようにする一連の API と SDK を提供します。

3. PyTorch Mobile: Facebook が開発した深層学習フレームワークで、開発者がモバイル デバイス上で PyTorch モデルを実行できるようにする一連のツールとライブラリを提供します。

4.Caffe2: Caffe2 は Facebook のもう 1 つのオープンソース機械学習フレームワークで、モバイル デバイス向けに最適化されており、Android デバイス上で機械学習モデルを実行できます。

5. MNN: MNN は、Alibaba のオープンソース モバイル ニューラル ネットワーク コンピューティング エンジンであり、モデル変換ツール、効率的で軽量な推論エンジン、便利で使いやすいフロントエンド インターフェイスを含む、完全なニューラル ネットワーク コンピューティング フレームワークを提供します。 help 開発者は、モバイル デバイス上でニューラル ネットワーク モデルを簡単に計算できます。

6.NCNN: NCNN は、Tencent Youtu Lab によってオープンソース化されている携帯電話向けに最適化されたモバイル ニューラル ネットワーク コンピューティング ライブラリであり、誰もが使用する WeChat を含む多くの製品に適用されています。

Android 側にも、Xiaomi の MACE、Kuaishou の KwaiNN、Byte の ByteN など、多くの種類の機械学習フレームワークがあります。Android 側で使用できる機械学習フレームワークがまだたくさんあることがわかります。

3. Android 側では機械学習で何ができるでしょうか?

Android には、機械学習における幅広いアプリケーション シナリオがまだあります。これには次のものが含まれますが、これらに限定されません。

1. オブジェクト認識: 写真またはカメラ内のオブジェクトを検出および追跡できます。

2. 顔認識:検出した顔の目、耳、頬、鼻、口の座標をユーザーIDとして取得

3. テキスト認識: さまざまな国の言語のテキスト、画像テキスト認識などを認識できます。

4. 音声認識と音声合成: 音声アシスタントの開発、音声入力と音声出力の実現、より自然な対話方法の提供に使用できます。

5. レコメンドシステム:ユーザーの行動や好みを学習することで、ユーザーが興味を持ちそうなコンテンツをレコメンドします。たとえば、推奨システムの応用は、音楽、映画、ショッピング、その他のアプリケーションに見られます。

6. 行動認識:ユーザーの行動パターンを学習することで、ウォーキング、ランニング、サイクリングなどのユーザーのアクティビティを識別できます。これは、健康やフィットネスの用途に使用できます。

7. 予測モデル:機械学習を通じて、株価や天気などの予測などの予測モデルを確立できます。

8. セキュリティ保護: たとえば、通常のシステム動作を学習することで、悪意のある動作を特定してブロックし、アプリケーションのセキュリティを向上させることができます。

4. Android に機械学習を実装する

上記では機械学習に関連する多くの知識を紹介しましたが、Android 機械学習開発で大きな仕事をするための準備はすでに整っていますか? 難しすぎると思いませんか?いいえ、いいえ、Android に機械学習アプリケーションを実装するのは簡単すぎます。使用できる機械学習フレームワークがたくさんあるからです。Google が開発した機械学習フレームワーク TensorFlow Lite と ML Kit は、私たちが入手するのに非常に適しています。始めました。

Android に機械学習アプリケーションを迅速に実装したい場合は、ML Kit を選択できます。ML Kit には、一連の事前トレーニングされた機械学習モデルと、テキスト認識、顔認識、画像などの一般的に使用される多くの機械学習機能が用意されているためです。ラベル付け、識別、バーコードスキャンなど ML Kit の目標は、機械学習をより使いやすく、アクセスしやすくすることです。実際、それは同じです。それでは、これ以上の苦労はせずに、コードを通して ML Kit を簡単に確認してみましょう。

最初のステップ: ML Kit の Android バージョンの機械学習キット ライブラリの依存関係をモジュールのアプリケーション レベルの Gradle ファイルに追加する必要があります。

今回は画像タグ認識の機能を実装する予定なので、画像タグ認識用のライブラリを選択します

dependencies {
    //图像标签识别
    implementation 'com.google.mlkit:image-labeling:17.0.7'
}

ステップ 2: 画像タグ認識を実装したいため、ML Kit 用の画像を準備し、対応するデータを生成する必要があります。

以下のコードでは大きく3つのステップに分かれており、画像のビットマップを取得、画像の回転角度を取得、最後に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);
    }

画像のビットマップを取得します。このメソッドは 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 に転送することに加えて、ここで 1 つずつリストした CameraX ライブラリ、ByteBuffer または ByteArray などを使用することもできます。

ステップ 3. 画像データを取得したので、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) {
                // 识别失败
            }
        });

ML Kit が画像情報を正常に処理した後に返される List imageLabels のコンテンツ形式は次のとおりです。

[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);
            }
        });


    }

効果は次のとおりです。

d94887551d47bb1c0ecdc7d107b46c5c.jpeg

ML Kit が画像のラベルを車両として正確に識別していることがわかります。さらにクールなことをして絵文字を識別することもできます。

0d54e6ba75b085a02b59b4742f485cb5.jpeg

5。結論

Android で機械学習を使用するのはどうですか? 非常に簡単ではありませんか? ML Kit の事前トレーニング済みモデルを使用せず、独自の機械学習モデルをトレーニングしたい場合は、開発者が次のことを可能にする TensorFlow Lite を使用することもできます。機械学習モデルをより小さく、より高速で、より効率的な形式に変換すると、デバイス上で実行できるようになります。モデルの詳細なカスタマイズ ニーズがある開発者にとって、TensorFlow Lite は良い選択です。スペースが限られているため、ここでは説明しませんさらに、ML Kit の他の機械学習機能について詳しく知りたい場合は、ML Kit の公式 Web サイトにアクセスして詳細を確認できます: https://developers.google.cn/ml-kit? hl=zh-cn

著者: 37 モバイル ゲーム モバイル クライアント チーム
リンク: https://juejin.cn/post/7283152332622446652

より多くの知識を得る、または記事に貢献するには私をフォローしてください

a091dbbf2d2b4ca41276d500ba181be1.jpeg

4ef7a8eb24438f847f0ef01d56540ce2.jpeg

おすすめ

転載: blog.csdn.net/c6E5UlI1N/article/details/133396788