تاریخ را ذخیره کنید! Google I / O 18-20 مه بازمی گردد اکنون ثبت نام کنید
این صفحه به‌وسیله ‏Cloud Translation API‏ ترجمه شده است.
Switch to English

داده های ورودی و خروجی را با کتابخانه پشتیبانی TensorFlow Lite پردازش کنید

توسعه دهندگان برنامه های تلفن همراه به طور معمول با اشیا ty تایپ شده مانند نقشه های بیتی یا بدوی مانند عدد صحیح ارتباط برقرار می کنند. با این حال ، TensorFlow Lite Interpreter که مدل یادگیری ماشین روی دستگاه را اجرا می کند از سنسورهایی به شکل ByteBuffer استفاده می کند ، که اشکال زدایی و دستکاری آنها دشوار است. کتابخانه پشتیبانی Android TensorFlow Lite برای کمک به پردازش ورودی و خروجی مدل های TensorFlow Lite و سهولت استفاده از مفسر TensorFlow Lite طراحی شده است.

شروع شدن

وابستگی Gradle و سایر تنظیمات را وارد کنید

فایل مدل .tflite را در فهرست دارایی های ماژول Android که مدل در آن اجرا می شود کپی کنید. مشخص کنید که فایل نباید فشرده شود و کتابخانه build.gradle Lite را به پرونده build.gradle ماژول build.gradle کنید:

android {
    // Other settings

    // Specify tflite file should not be compressed for the app apk
    aaptOptions {
        noCompress "tflite"
    }

}

dependencies {
    // Other dependencies

    // Import tflite dependencies
    implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly-SNAPSHOT'
    // The GPU delegate library is optional. Depend on it as needed.
    implementation 'org.tensorflow:tensorflow-lite-gpu:0.0.0-nightly-SNAPSHOT'
    implementation 'org.tensorflow:tensorflow-lite-support:0.0.0-nightly-SNAPSHOT'
}

کتابخانه پشتیبانی TensorFlow Lite AAR را که برای نسخه های مختلف کتابخانه پشتیبانی در JCenter برگزار می شود ، کاوش کنید .

دستکاری و تبدیل تصویر اصلی

کتابخانه پشتیبانی TensorFlow Lite مجموعه ای از روشهای اساسی دستکاری تصویر مانند برش و تغییر اندازه را دارد. برای استفاده از آن ، یک ImagePreprocessor ایجاد کنید و عملیات مورد نیاز را اضافه کنید. برای تبدیل تصویر به قالب تنسور مورد نیاز مفسر TensorImage Lite ، یک TensorImage ایجاد کنید تا به عنوان ورودی استفاده شود:

import org.tensorflow.lite.support.image.ImageProcessor;
import org.tensorflow.lite.support.image.TensorImage;
import org.tensorflow.lite.support.image.ops.ResizeOp;

// Initialization code
// Create an ImageProcessor with all ops required. For more ops, please
// refer to the ImageProcessor Architecture section in this README.
ImageProcessor imageProcessor =
    new ImageProcessor.Builder()
        .add(new ResizeOp(224, 224, ResizeOp.ResizeMethod.BILINEAR))
        .build();

// Create a TensorImage object. This creates the tensor of the corresponding
// tensor type (uint8 in this case) that the TensorFlow Lite interpreter needs.
TensorImage tImage = new TensorImage(DataType.UINT8);

// Analysis code for every frame
// Preprocess the image
tImage.load(bitmap);
tImage = imageProcessor.process(tImage);

DataType یک تانسور می تواند از طریق خواندن فراداده کتابخانه exractor و همچنین دیگر اطلاعات مدل.

اشیا output خروجی ایجاد کنید و مدل را اجرا کنید

قبل از اجرای مدل ، باید اشیا container ظرفی را ایجاد کنیم که نتیجه را ذخیره کند:

import org.tensorflow.lite.support.tensorbuffer.TensorBuffer;

// Create a container for the result and specify that this is a quantized model.
// Hence, the 'DataType' is defined as UINT8 (8-bit unsigned integer)
TensorBuffer probabilityBuffer =
    TensorBuffer.createFixedSize(new int[]{1, 1001}, DataType.UINT8);

بارگذاری مدل و اجرای استنباط:

import org.tensorflow.lite.support.model.Model;

// Initialise the model
try{
    MappedByteBuffer tfliteModel
        = FileUtil.loadMappedFile(activity,
            "mobilenet_v1_1.0_224_quant.tflite");
    Interpreter tflite = new Interpreter(tfliteModel)
} catch (IOException e){
    Log.e("tfliteSupport", "Error reading model", e);
}

// Running inference
if(null != tflite) {
    tflite.run(tImage.getBuffer(), probabilityBuffer.getBuffer());
}

دسترسی به نتیجه

توسعه دهندگان می توانند مستقیماً از طریق probabilityBuffer.getFloatArray() به خروجی دسترسی پیدا کنند. اگر مدل یک خروجی کوانتیزه تولید می کند ، به یاد داشته باشید که نتیجه را تبدیل کنید. برای مدل کوانتیزه شده MobileNet ، توسعه دهنده باید هر مقدار خروجی را بر 255 تقسیم کند تا احتمال دامنه آن را از 0 (کمترین احتمال) تا 1 (با احتمال زیاد) برای هر گروه بدست آورد.

اختیاری: نگاشت نتایج به برچسب ها

برنامه نویسان همچنین می توانند به صورت اختیاری نتایج را برچسب گذاری کنند. ابتدا فایل متنی حاوی برچسب ها را در فهرست دارایی های ماژول کپی کنید. بعد ، فایل برچسب را با استفاده از کد زیر بارگیری کنید:

import org.tensorflow.lite.support.common.FileUtil;

final String ASSOCIATED_AXIS_LABELS = "labels.txt";
List<String> associatedAxisLabels = null;

try {
    associatedAxisLabels = FileUtil.loadLabels(this, ASSOCIATED_AXIS_LABELS);
} catch (IOException e) {
    Log.e("tfliteSupport", "Error reading label file", e);
}

قطعه زیر نحوه مرتبط سازی احتمالات با برچسب های دسته را نشان می دهد:

import org.tensorflow.lite.support.common.TensorProcessor;
import org.tensorflow.lite.support.label.TensorLabel;

// Post-processor which dequantize the result
TensorProcessor probabilityProcessor =
    new TensorProcessor.Builder().add(new NormalizeOp(0, 255)).build();

if (null != associatedAxisLabels) {
    // Map of labels and their corresponding probability
    TensorLabel labels = new TensorLabel(associatedAxisLabels,
        probabilityProcessor.process(probabilityBuffer));

    // Create a map to access the result based on label
    Map<String, Float> floatMap = labels.getMapWithFloatValue();
}

پوشش مورد استفاده فعلی

نسخه فعلی کتابخانه پشتیبانی TensorFlow Lite شامل موارد زیر است:

  • انواع داده های متداول (float ، uint8 ، تصاویر و آرایه این اشیا) به عنوان ورودی و خروجی مدل های tflite.
  • عملیات اصلی تصویر (برش تصویر ، تغییر اندازه و چرخش).
  • عادی سازی و کمی سازی
  • فایل استفاده می کند

نسخه های آینده پشتیبانی از برنامه های مرتبط با متن را بهبود می بخشند.

ImageProcessor Architecture

طراحی ImageProcessor اجازه می داد تا عملیات دستکاری تصویر از جلو تعریف شده و در طی مراحل ساخت بهینه شود. ImageProcessor در حال حاضر از سه عملیات اساسی پیش پردازش پشتیبانی می کند:

int width = bitmap.getWidth();
int height = bitmap.getHeight();

int size = height > width ? width : height;

ImageProcessor imageProcessor =
    new ImageProcessor.Builder()
        // Center crop the image to the largest square possible
        .add(new ResizeWithCropOrPadOp(size, size))
        // Resize using Bilinear or Nearest neighbour
        .add(new ResizeOp(224, 224, ResizeOp.ResizeMethod.BILINEAR));
        // Rotation counter-clockwise in 90 degree increments
        .add(new Rot90Op(rotateDegrees / 90))
        .add(new NormalizeOp(127.5, 127.5))
        .add(new QuantizeOp(128.0, 1/128.0))
        .build();

جزئیات بیشتر در مورد نرمال سازی و کمی سازی را در اینجا مشاهده کنید.

هدف نهایی کتابخانه پشتیبانی پشتیبانی از همه تحولات tf.image . این بدان معنی است که تحول همان TensorFlow خواهد بود و اجرای آن مستقل از سیستم عامل خواهد بود.

توسعه دهندگان همچنین از ایجاد پردازنده های سفارشی استقبال می کنند. در این موارد مهم است که با روند آموزش همسو باشید - یعنی پیش پردازش یکسان باید برای آموزش و استنباط برای افزایش قابلیت تکرار استفاده شود.

کمی سازی

هنگام شروع اشیا input ورودی یا خروجی مانند TensorImage یا TensorBuffer باید انواع آنها را DataType.UINT8 یا DataType.FLOAT32 .

TensorImage tImage = new TensorImage(DataType.UINT8);
TensorBuffer probabilityBuffer =
    TensorBuffer.createFixedSize(new int[]{1, 1001}, DataType.UINT8);

از TensorProcessor می توان برای تعیین میزان سنسورهای ورودی و یا کاهش میزان سنسورهای خروجی استفاده کرد. به عنوان مثال ، هنگام پردازش یک خروجی کوانتیزه شده TensorBuffer ، توسعه دهنده می تواند با استفاده از DequantizeOp نتیجه را به مقدار احتمال شناور بین 0 و 1 تقلیل دهد:

import org.tensorflow.lite.support.common.TensorProcessor;

// Post-processor which dequantize the result
TensorProcessor probabilityProcessor =
    new TensorProcessor.Builder().add(new DequantizeOp(0, 1/255.0)).build();
TensorBuffer dequantizedBuffer = probabilityProcessor.process(probabilityBuffer);

پارامترهای کمی سازی یک تنسور را می توان از طریق کتابخانه استخراج فراداده خواند .