전문가: Android 앱에서 ML Kit(Product Visual Search API)와 함께 RxAndroid 및 MVVM을 사용하여 의사와 상담하세요.

12111 단어
개요
이 기사에서는 ML Product Visual Search Api의 통합과 함께 Doctor Consult 데모 앱을 만들 것입니다. 의사와 상담하기 쉬운 인터페이스를 제공합니다. 사용자는 Product Visual Search API를 사용하여 처방전을 스캔할 수 있습니다.

이전 기사 링크:
https://forums.developer.huawei.com/forumPortal/en/topic/0201829733289720014?fid=0101187876626530001
https://forums.developer.huawei.com/forumPortal/en/topic/0201817617825540005?fid=0101187876626530001
https://forums.developer.huawei.com/forumPortal/en/topic/0201811543541800017?fid=0101187876626530001

HMS Core Map 서비스 소개
ML Kit를 사용하면 앱이 Huawei의 기계 학습 분야에서 오랫동안 입증된 전문 지식을 쉽게 활용하여 광범위한 산업에서 다양한 인공 지능(AI) 애플리케이션을 지원할 수 있습니다. Huawei의 기술 축적 ​​덕분에 ML Kit는 사용하기 쉬운 다양한 선도적인 기계 학습 기능을 제공하여 다양한 AI 앱을 개발할 수 있도록 지원합니다.
상품 비주얼 검색: 사용자가 촬영한 상품 사진을 기반으로 기 설정된 상품 이미지 라이브러리에서 동일하거나 유사한 상품을 검색하고 해당 상품의 ID와 관련 정보를 반환하는 서비스입니다. 또한 실시간 상품 관리를 위해 오프라인 상품 수입, 온라인 상품 추가, 삭제, 수정, 조회, 상품 유통을 지원하는 서비스입니다.

전제 조건
1.Huawei 전화 EMUI 3.0 이상.
2. Android 4.4 이상(API 레벨 19 이상)을 사용하는 타사 휴대폰.
3. 안드로이드 스튜디오.
4.AppGallery 계정.

앱 갤러리 통합 프로세스
1. AppGallery Connect 포털에서 로그인하고 프로젝트를 생성하거나 선택합니다.
2. 프로젝트 설정으로 이동하여 구성 파일을 다운로드합니다.
3.일반 정보로 이동한 다음 데이터 저장소 위치를 제공합니다.

앱 개발
1. 새 프로젝트를 만듭니다.
2. 프로젝트 Gradle을 구성합니다.

buildscript {
    repositories {
        google()
        jcenter()
        maven {url 'https://developer.huawei.com/repo/'}
    }
    dependencies {
        classpath "com.android.tools.build:gradle:4.0.1"
        classpath 'com.huawei.agconnect:agcp:1.4.2.300'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
        maven {url 'https://developer.huawei.com/repo/'}
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}



3.앱 Gradle을 구성합니다.

implementation 'com.github.bumptech.glide:glide:4.11.0'

implementation 'com.huawei.hms:ml-computer-vision-cloud:2.0.1.300'
implementation 'com.huawei.hms:ml-computer-vision-object-detection-model:2.0.1.300'



4. AndroidManifest.xml을 구성합니다.

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />



5. XML UI로 활동 클래스를 만듭니다.
ScanData활동:

package com.hms.doctorconsultdemo.ml;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.databinding.DataBindingUtil;

import com.hms.doctorconsultdemo.R;
import com.hms.doctorconsultdemo.databinding.ActivityScanBinding;
import com.huawei.hms.mlsdk.productvisionsearch.MLVisionSearchProductImage;

import java.util.ArrayList;
import java.util.List;

public class ScanDataActivity extends BaseActivity {

    private static List<Item> items;
    private ActivityScanBinding mActivityScanBinding;
    private DoctorAdapter mDoctorAdapter;

    public static void start(@NonNull Context context, List<MLVisionSearchProductImage> products) {
        if (context instanceof AppCompatActivity) {
            Intent intent = new Intent(context, ScanMainActivity.class);
            context.startActivity(intent);
            startActivityAnimation(context);
            items = new ArrayList<>();
            for (MLVisionSearchProductImage product : products) {
                Item item = new Item();
                item.setFruitName(product.getProductId());
                item.setImageUrl(product.getImageId());
                item.setPrice(8500);
                items.add(item);
            }
        }
    }

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mActivityScanBinding = DataBindingUtil.setContentView(this, R.layout.activity_scan);
        init();
    }

    private void init() {
        Toolbar toolbar = findViewById(R.id.toolbar);
        toolbar.setTitle("Scan Prescription");
        setSupportActionBar(toolbar);
        mDoctorAdapter = new DoctorAdapter(this, items, item4 -> {
        });
        mActivityScanBinding.rvStore.setAdapter(mDoctorAdapter);

    }
}


ScanMainActivity:

package com.hms.doctorconsultdemo.ml;

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;

import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat;

import com.huawei.hmf.tasks.Task;
import com.huawei.hms.mlsdk.MLAnalyzerFactory;
import com.huawei.hms.mlsdk.common.MLException;
import com.huawei.hms.mlsdk.common.MLFrame;
import com.huawei.hms.mlsdk.productvisionsearch.MLProductVisionSearch;
import com.huawei.hms.mlsdk.productvisionsearch.MLVisionSearchProduct;
import com.huawei.hms.mlsdk.productvisionsearch.MLVisionSearchProductImage;
import com.huawei.hms.mlsdk.productvisionsearch.cloud.MLRemoteProductVisionSearchAnalyzer;
import com.huawei.hms.mlsdk.productvisionsearch.cloud.MLRemoteProductVisionSearchAnalyzerSetting;

import java.util.ArrayList;
import java.util.List;


public class ScanMainActivity extends BaseActivity {

    private static final String TAG = ScanMainActivity.class.getName();
    private static final int CAMERA_PERMISSION_CODE = 100;

    MLRemoteProductVisionSearchAnalyzer analyzer;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        init();
        initializeProductVisionSearch();
    }

    private void init() {
        if (!(ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
                == PackageManager.PERMISSION_GRANTED)) {
            this.requestCameraPermission();
        }
        initializeProductVisionSearch();
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(intent, 101);
    }

    private void requestCameraPermission() {
        final String[] permissions = new String[]{Manifest.permission.CAMERA};

        if (!ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
            ActivityCompat.requestPermissions(this, permissions, this.CAMERA_PERMISSION_CODE);
            return;
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 101) {
            if (resultCode == RESULT_OK) {
                Bitmap bitmap = (Bitmap) data.getExtras().get("data");
                if (bitmap != null) {
                    MLFrame mlFrame = new MLFrame.Creator().setBitmap(bitmap).create();
                    mlImageDetection(mlFrame);
                }

            }

        }
    }

    private void mlImageDetection(MLFrame mlFrame) {

        Task<List<MLProductVisionSearch>> task = analyzer.asyncAnalyseFrame(mlFrame);
        task.addOnSuccessListener(products -> {
            Log.d(TAG, "success");
            displaySuccess(products);
        })
                .addOnFailureListener(e -> {
                    try {
                        MLException mlException = (MLException) e;
                        int errorCode = mlException.getErrCode();
                        String errorMessage = mlException.getMessage();
                    } catch (Exception error) {
                        // Handle the conversion error.
                    }
                });
    }

    private void initializeProductVisionSearch() {
        MLRemoteProductVisionSearchAnalyzerSetting settings = new MLRemoteProductVisionSearchAnalyzerSetting.Factory()
                .setLargestNumOfReturns(16)
                .setRegion(MLRemoteProductVisionSearchAnalyzerSetting.REGION_DR_CHINA)
                .create();
        analyzer
                = MLAnalyzerFactory.getInstance().getRemoteProductVisionSearchAnalyzer(settings);
    }

    private void displaySuccess(List<MLProductVisionSearch> productVisionSearchList) {
        List<MLVisionSearchProductImage> productImageList = new ArrayList<>();
        String prodcutType = "";
        for (MLProductVisionSearch productVisionSearch : productVisionSearchList) {
            Log.d(TAG, "type: " + productVisionSearch.getType());
            prodcutType = productVisionSearch.getType();
            for (MLVisionSearchProduct product : productVisionSearch.getProductList()) {
                productImageList.addAll(product.getImageList());
                Log.d(TAG, "custom content: " + product.getCustomContent());
            }
        }
        StringBuffer buffer = new StringBuffer();
        for (MLVisionSearchProductImage productImage : productImageList) {
            String str = "ProductID: " + productImage.getProductId() + "\nImageID: " + productImage.getImageId() + "\nPossibility: " + productImage.getPossibility();
            buffer.append(str);
            buffer.append("\n");
        }
        Log.d(TAG, "display success: " + buffer.toString());
        ScanDataActivity.start(this, productImageList);
    }

}


앱 빌드 결과

Uploading image

팁과 요령
PNG, JPG, JPEG 및 BMP 형식의 이미지가 지원됩니다. GIF 이미지는 지원되지 않습니다.
ML Kit는 데이터 처리에 대한 GDPR 요구 사항을 준수합니다.
얼굴 감지에는 Arm 아키텍처가 있는 Android 휴대폰이 필요합니다.

결론
이번 글에서는 안드로이드 어플리케이션에서 Product Visual Search Api를 이용하여 HMS ML Kit를 연동하는 방법에 대해 알아보았습니다. 이 기사를 완전히 읽은 후 사용자는 Product Visual Search Api를 사용하여 HMS ML Kit를 쉽게 구현할 수 있습니다. 사용자가 Product Visual Search API를 사용하여 처방전을 스캔할 수 있도록 합니다.
이 기사를 읽어 주셔서 감사합니다. 이 글이 도움이 되셨다면 좋아요와 댓글을 꼭 남겨주세요. 그건 나에게 큰 의미 야.

참조
HMS ML 문서:
https://developer.huawei.com/consumer/en/doc/development/hiai-Guides/service-introduction-0000001050040017
HMS 교육 비디오:
https://developer.huawei.com/consumer/en/training/

좋은 웹페이지 즐겨찾기