Usar TF Lite MobileNet SSD trasplantado al cliente Android
- 1. Configuración
- 2. Preparación
- 3. Formación MobileNet SSD cuantificado modelo
- 4. Conversión de modelo pb tflite
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:
- 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 - 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
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)
- Depth_multiplier modificar valores de parámetros (modelo comprime a 30%)
- 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)
- 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.
4. Modificar num_classes
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:
Salida:
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
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
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)
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
TF_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
IMAGE_MEAN y IMAGE_STD: mean_values Toco = 128 comandos y parámetros std_values = 128
porque 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)
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
contenido 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
Una semana de duración, laborioso, estado casi colapsado de la mente
- bazel cuando el hoyo mismo, un poco de paciencia, un poco engorroso proceso.
- 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.
- 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