Cuantificar la versión - usando TF Lite detección de blancos MobileNet SSD trasplantado al cliente Android

1. Configuración

La configuración básica El número de versión
UPC Intel® Core ™ i5-8400 CPU @ 2.80GHz × 6
GPU GeForce RTX 2070 ESTUPENDO / PCIe / SSE2
LA Ubuntu18.04
OpenJDK 1.8.0_242
pitón 3.6.9
Basilea 0.21.0
gcc 4.8.5
g ++ 4.8.5

insinuación:

  1. bazel será utilizado cuando el modelo de conversión, tengo otro blog hablando acerca de cómo configurar.
    https://blog.csdn.net/weixin_43056275/article/details/105124979
  2. bazel tiempo de compilación, necesidades gcc y g ++ versión para ser consistente.

2. Preparación

2.1 Descargar

2.1.1 modelos-1.12.0 descarga

https://github.com/tensorflow/models/tree/v1.12.0
en ~ / .bashrc adición de configuración
de exportación del PYTHONPATH la PYTHONPATH = $: pwd: pwd/ Delgado

2.1.2 modelo de descarga

https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md
Aquí Insertar imagen Descripción modelo de caja roja para el modelo necesita ser cuantificada

2.1.3 Descargar fuente tensorflow-r1.13

https://github.com/tensorflow/tensorflow/tree/r1.13

2,2 bazel fuente compilado tensorflow-r1.13

Mi Blog otro escrito con gran detalle
https://blog.csdn.net/weixin_43056275/article/details/105124979

3. Formación MobileNet SSD cuantificado modelo

Cómo obtener y marcas de registro se omite conjunto de archivos de registro de datos

3.1 Configuración config

Encuentra ./models/models-1.12.0/research/object_detection/samples/configs/ssd_mobilenet_v1_0.75_depth_quantized_300x300_coco14_sync.config
copiar el archivo de configuración para ./models/models-1.12.0/research/object_detection/training (propia Nueva carpeta)

  1. Depth_multiplier modificar valores de parámetros (modelo comprime a 30%)
    Aquí Insertar imagen Descripción
  2. Modificar el tamaño del modelo de entrada de imágenes de entrenamiento (modelo de la imagen de entrada para reducir la resolución puede mejorarse asimismo la eficiencia del modelo de razonamiento)
    Aquí Insertar imagen Descripción
  3. Descargar el modelo de la trayectoria modificada de pre-formación, entrenamiento y prueba de grabación y pbtxt, eval_config en num_examples en su número de carta de ajuste.
    Aquí Insertar imagen Descripción4. Modificar num_classes
    Aquí Insertar imagen Descripción

formación 3.2 inicio

En ./models/models-1.12.0/research Nueva train.sh, dice lo siguiente

PIPELINE_CONFIG_PATH=/home/ying/usb/models/models-1.12.0/research/object_detection/training/ssd_mobilenet_v1_0.75_depth_quantized_300x300_coco14_sync.config
MODEL_DIR=/home/ying/usb/models/models-1.12.0/research/object_detection/train
NUM_TRAIN_STEPS=20000
SAMPLE_1_OF_N_EVAL_EXAMPLES=1
python object_detection/model_main.py \
    --pipeline_config_path=${PIPELINE_CONFIG_PATH} \
    --model_dir=${MODEL_DIR} \
    --num_train_steps=${NUM_TRAIN_STEPS} \
    --sample_1_of_n_eval_examples=$SAMPLE_1_OF_N_EVAL_EXAMPLES \
    --logtostderr

pipeline_config_path: config ruta
model_dir: salida del modelo itinerario de formación
de ejecución train.sh

bash train.sh

3.2.1 Conversión de modelo CKPT a pb

En ./models/models-1.12.0/research Nueva export_tflite_ssd_graph.sh, dice lo siguiente

PIPELINE_CONFIG_PATH=/home/ying/usb/models/models-1.12.0/research/object_detection/training/ssd_mobilenet_v1_0.75_depth_quantized_300x300_coco14_sync.config
TRAINED_CKPT_PREFIX=/home/ying/usb/models/models-1.12.0/research/object_detection/train/model.ckpt-20000
EXPORT_DIR=/home/ying/usb/models/models-1.12.0/research/object_detection/eval

python object_detection/export_tflite_ssd_graph.py \
    --pipeline_config_path=${PIPELINE_CONFIG_PATH} \
    --trained_checkpoint_prefix=${TRAINED_CKPT_PREFIX}    \
    --output_directory=${EXPORT_DIR}  \
    --add_postprocessing_op=true

Pb modelo generado se almacena en output_directory
get file pb plazo export_tflite_ssd_graph.sh

4. Conversión de modelo pb tflite

De acuerdo al blog proporciono 2.2 para compilar bazel, utilice el siguiente comando para bazel.

4.1 pb consiguen archivo de entrada y de salida

Hay dos maneras

4.1.1 Por netron

https://lutzroeder.github.io/netron/
se pueden cargar modelo en línea, obtener la entrada y salida
Entrada:
Aquí Insertar imagen DescripciónSalida:
Aquí Insertar imagen Descripción

4.1.2 Por orden summarize_graph

En la operación ./tensorflow-r1.13

bazel build tensorflow/tools/graph_transforms:summarize_graph
bazel-bin/tensorflow/tools/graph_transforms/summarize_graph \
  --in_graph=/home/ying/usb/models/models-1.12.0/research/object_detection/eval/tflite_graph.pb

obtener
Aquí Insertar imagen Descripción

4.2 iniciar el modelo de conversión

En la operación ./tensorflow-r1.13

bazel run --config=opt tensorflow/lite/toco:toco -- \
--input_file=/home/ying/usb/models/models-1.12.0/research/object_detection/eval/tflite_graph.pb \
--output_file=/home/ying/usb/models/models-1.12.0/research/object_detection/eval/detect1.tflite \
--input_shapes=1,192,192,3 \ (根据训练图片的大小)
--input_arrays=normalized_input_image_tensor \
--output_arrays='TFLite_Detection_PostProcess','TFLite_Detection_PostProcess:1','TFLite_Detection_PostProcess:2','TFLite_Detection_PostProcess:3' \
--inference_type=QUANTIZED_UINT8 \  (量化模型的时候使用QUANTIZED_UINT8)
--mean_values=128 \
--std_values=128 \
--change_concat_input_ranges=false \
--allow_custom_ops

Finalmente obtener tflite modelo cuantitativo
Aquí Insertar imagen Descripción

4.3 PC modelo de prueba lado

#-*- coding:utf-8 -*-
import numpy as np
import os
import six.moves.urllib as urllib
import sys
import tarfile
import tensorflow as tf
import zipfile

from PIL import Image
import cv2
import time
import random
'''
    tflite 获取视频每帧推理
'''


# This is needed since the notebook is stored in the object_detection folder.
sys.path.append("..")
#改为自己的量化模型的路径
PATH_TO_CKPT = r'./models/models-1.12.0/research/object_detection/eval/detect1.tflite'
#改为自己训练图片的大小
image_size = 192

def tflite_run_main(frame):
    interpreter = tf.lite.Interpreter(model_path=PATH_TO_CKPT)
    interpreter.allocate_tensors()
    # Get input and output tensors.
    input_details = interpreter.get_input_details()
    output_details = interpreter.get_output_details()

    print(str(input_details))
    print(str(output_details))

    image_np = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    crop_width, crop_height = image_np.shape[:2]
    image_np = image_np.astype(np.uint8)
    image_np = cv2.resize(image_np, (image_size, image_size))
    image_np_expanded = np.expand_dims(image_np, axis=0)
    print('len', len(image_np_expanded))

    start_time = time.time()

    interpreter.set_tensor(input_details[0]['index'], image_np_expanded)
    interpreter.invoke()
    scores = interpreter.get_tensor(output_details[2]['index'])
    bboxes = interpreter.get_tensor(output_details[0]['index'])

    print('infrence_time', (time.time() - start_time))

    # print('argmax', np.argmax(scores[0]))

    idx = np.argmax(scores[0])
    print('score = ', scores[0][idx])

    ymin, xmin, ymax, xmax = bboxes[0][idx]

    if scores[0][idx] > 0.65:
        cv2.rectangle(frame, (int(xmin * crop_height), int(ymin * crop_width)),
                      (int(xmax * crop_height), int(ymax * crop_width)), (0, 255, 0))

    cv2.imshow("video_test", frame)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
if __name__ == "__main__":
#改为自己测试图片的路径
    img = cv2.imread('./98new.jpg')
    tflite_run_main(img)

Aquí Insertar imagen Descripción

modelo de implementación a Android 4.4

Abrir ./tensorflow-r1.13/tensorflow/lite/examples/android
tflite voluntad y archivos txt en ./tensorflow-r1.13/tensorflow/lite/examples/android/app/src/main/assets

4.4.1 modificar el archivo

1. DetectorActivity.java

Aquí Insertar imagen DescripciónTF_API_INPUT_SIZE: cambiar el tamaño de la imagen de la formación
TF_OD_API_IS_QUANTIZED: porque es un modelo cuantitativo, por lo que a la verdadera
TF_OD_API_MODEL_FILE y TF_OD_API_LABELS_FILE: Modelo txt y la ruta de etiquetas

2. TFLiteObjectDetectionAPIModel.java

Aquí Insertar imagen DescripciónIMAGE_MEAN y IMAGE_STD: mean_values Toco = 128 comandos y parámetros std_values = 128
Aquí Insertar imagen Descripciónporque dove.txt etiquetas en la primera fila, el desplazamiento en el código del mosto etiqueta 0.
Hay también un método para cambiar la etiqueta la primera línea del archivo no tiene que cambiar su propio sello, labelOffset 1 puede ser pensamiento

El siguiente es cambiar el archivo de configuración

3. fichero de configuración build.gradle Cambio (Proyecto: androide)

Aquí Insertar imagen Descripción

4. Cambiar el perfil build.gradle (Módulo: app)

apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    buildToolsVersion '28.0.3'
    defaultConfig {
        applicationId "org.tensorflow.lite.demo"
        minSdkVersion 21
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"

        // Remove this block.
//        jackOptions {
//            enabled true
//        }
    }
    lintOptions {
        abortOnError false
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    aaptOptions {
        noCompress "tflite"
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

repositories {
    maven {
        url 'https://google.bintray.com/tensorflow'
    }
}

// import DownloadModels task
project.ext.ASSET_DIR = projectDir.toString() + '/src/main/assets'
project.ext.TMP_DIR   = project.buildDir.toString() + '/downloads'

// Download default models; if you wish to use your own models then
// place them in the "assets" directory and comment out this line.
apply from: "download-models.gradle"

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'org.tensorflow:tensorflow-lite:0.1.2-nightly'
    implementation 'org.tensorflow:tensorflow-lite:2.0.0'
}

5. Cambiar el perfil AndroidManifest.xml

Aquí Insertar imagen Descripcióncontenido de la aplicación de comentario a cabo la clasificación y el habla, dejando sólo la detección de blancos.

aterrizaje 4.4.2 lado del dispositivo

Aquí Insertar imagen Descripción

Una semana de duración, laborioso, estado casi colapsado de la mente

  1. bazel cuando el hoyo mismo, un poco de paciencia, un poco engorroso proceso.
  2. Al convertir a tflite modelo, enredado desde hace mucho tiempo para establecer los parámetros del modelo ya está empezando la conversión es completa, pero al final ha desplegado a bug de Android, siempre pensó que era un modelo del problema, y ​​tomar una gran cantidad de desvíos.
  3. Bienvenido a preguntas de aumento, orientación y aprender unos de otros -

感谢Liangjun
https://blog.csdn.net/qq_26535271/article/details/83031412#comments
https://blog.csdn.net/qq_26535271/article/details/84930868#commentBox

En el siguiente blog para ver no ven
https://blog.csdn.net/qq_16564093/article/details/78996563
https://blog.csdn.net/qq_33200967/article/details/82773677#comments

Publicado 56 artículos originales · ganado elogios 11 · vistas 2345

Supongo que te gusta

Origin blog.csdn.net/weixin_43056275/article/details/105225089
Recomendado
Clasificación