日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

卷积神经网络模型部署到移动设备

發布時間:2024/1/1 96 豆豆
生活随笔 收集整理的這篇文章主要介紹了 卷积神经网络模型部署到移动设备 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

截止到今年,已經有超過 20 億活躍的安卓設備。安卓手機的迅速普及很大程度上是因為各式各樣的智能 app,從地圖到圖片編輯器應有盡有。隨著深度學習的出現,我們的手機 app 將變得更加智能。下一代由深度學習驅動的手機 app 將可以學習并為你定制功能。一個很顯著的例子是「Microsoft Swiftkey」,這是一個鍵盤 app, 能通過學習你常用的單詞和詞組來幫助你快速打字。?

計算機視覺,自然語言處理,語音識別和語音合成等技術能夠大大改善用戶在移動應用方面的體驗。幸運的是,在移動應用方面,有很多工具開發成可以簡化深度學習模型的部署和管理。在這篇文章中,我將闡釋如何使用 TensorFlow mobile 將 PyTorch 和 Keras 部署到移動設備。

用 TensorFlow mobile 部署模型到安卓設備分為三個步驟:

  • 將你的訓練模式轉換到 TensorFlow
  • 在安卓應用中添加 TensorFlow mobile 作為附加功能
  • 在你的應用中使用 TensorFlow 模式寫 Java 代碼執行推理。

在這篇文章中,我將介紹整個過程,最后完成一個植入圖像識別功能的安卓應用。

??安裝

本教程會用到 PyTorch 和 Keras 兩個框架-遵循下列指導安裝你想使用的機器學習框架。安裝哪個由你選擇。

首先,安裝 TensorFlow:

pip3?install?tensorflow

如果你是?PyTorch 的開發者,確保你安裝的是?PyTorch 的最新版本。關于安裝?PyTorch 的指導文件,請查閱我之前的文章:

https://heartbeat.fritz.ai/basics-of-image-classification-with-pytorch-2f8973c51864

如果你是?Keras 的開發者,使用以下命令安裝:

pip3?install?keras
pip3?
install?h5py

Android Studio(至少3.0 的版本)
?

https://developer.android.com/studio

?

??將 PyTorch 模式轉成 Keras 模式

這部分僅適用于 PyTorch 開發者。如果你使用的是 Keras,你可以跳到 “將 Keras 模式轉成 TensorFlow 模式”章節。

首先我們要做的是將我們的 PyTorch 模式參數轉成 Keras 中的同等參數。

為了簡化這個過程,我創建了一個腳本來自動運行轉化。在此教程中,我們將使用 Squeezenet 。這是一種很小但具備合理精確度的移動架構。在這兒下載預訓練模式(只有5M!)。

在轉權值之前,我們需要在 PyTorch 和 Keras 中定義 Squeezenet 模型。

如下圖所示,在這兩種框架下定義 Squeezenet,然后將 PyTorch 權值轉成 Keras。

創建文件 convert.py,包括下面的代碼并運行腳本。

import?torch
import?torch.nn?as?nn
from?torch.autograd?import?Variable
import?keras.backend?as?K
from?keras.models?import?*
from?keras.layers?import?*

import?torch
from?torchvision.models?import?squeezenet1_1


class?PytorchToKeras(object):
? ?
def?__init__(self,pModel,kModel):
? ? ? ?super(PytorchToKeras,self)
? ? ? ?self.__source_layers = []
? ? ? ?self.__target_layers = []
? ? ? ?self.pModel = pModel
? ? ? ?self.kModel = kModel

? ? ? ?K.set_learning_phase(
0)

? ?
def?__retrieve_k_layers(self):

? ? ? ?
for?i,layer?in?enumerate(self.kModel.layers):
? ? ? ? ? ?
if?len(layer.weights) >?0:
? ? ? ? ? ? ? ?self.__target_layers.append(i)

? ?
def?__retrieve_p_layers(self,input_size):

? ? ? ?input = torch.randn(input_size)

? ? ? ?input = Variable(input.unsqueeze(
0))

? ? ? ?hooks = []

? ? ? ?
def?add_hooks(module):

? ? ? ? ? ?
def?hook(module, input, output):
? ? ? ? ? ? ? ?
if?hasattr(module,"weight"):
? ? ? ? ? ? ? ? ? ?self.__source_layers.append(module)

? ? ? ? ? ?
if?not?isinstance(module, nn.ModuleList)?and?not?isinstance(module,nn.Sequential)?and?module != self.pModel:
? ? ? ? ? ? ? ?hooks.append(module.register_forward_hook(hook))

? ? ? ?self.pModel.apply(add_hooks)


? ? ? ?self.pModel(input)
? ? ? ?
for?hook?in?hooks:
? ? ? ? ? ?hook.remove()

? ?
def?convert(self,input_size):
? ? ? ?self.__retrieve_k_layers()
? ? ? ?self.__retrieve_p_layers(input_size)

? ? ? ?
for?i,(source_layer,target_layer)?in?enumerate(zip(self.__source_layers,self.__target_layers)):

? ? ? ? ? ?weight_size = len(source_layer.weight.data.size())

? ? ? ? ? ?transpose_dims = []

? ? ? ? ? ?
for?i?in?range(weight_size):
? ? ? ? ? ? ? ?transpose_dims.append(weight_size - i -?
1)

? ? ? ? ? ?self.kModel.layers[target_layer].set_weights([source_layer.weight.data.numpy().transpose(transpose_dims), source_layer.bias.data.numpy()])

? ?
def?save_model(self,output_file):
? ? ? ?self.kModel.save(output_file)
? ?
def?save_weights(self,output_file):
? ? ? ?self.kModel.save_weights(output_file)




"""
We explicitly redefine the Squeezent architecture since Keras has no predefined Squeezent
"""


def?squeezenet_fire_module(input, input_channel_small=16, input_channel_large=64):

? ?channel_axis =?
3

? ?input = Conv2D(input_channel_small, (1,1), padding="valid"?)(input)
? ?input = Activation(
"relu")(input)

? ?input_branch_1 = Conv2D(input_channel_large, (
1,1), padding="valid"?)(input)
? ?input_branch_1 = Activation(
"relu")(input_branch_1)

? ?input_branch_2 = Conv2D(input_channel_large, (
3,?3), padding="same")(input)
? ?input_branch_2 = Activation(
"relu")(input_branch_2)

? ?input = concatenate([input_branch_1, input_branch_2], axis=channel_axis)

? ?
return?input


def?SqueezeNet(input_shape=(224,224,3)):



? ?image_input = Input(shape=input_shape)


? ?network = Conv2D(
64, (3,3), strides=(2,2), padding="valid")(image_input)
? ?network = Activation(
"relu")(network)
? ?network = MaxPool2D( pool_size=(
3,3) , strides=(2,2))(network)

? ?network = squeezenet_fire_module(input=network, input_channel_small=
16, input_channel_large=64)
? ?network = squeezenet_fire_module(input=network, input_channel_small=
16, input_channel_large=64)
? ?network = MaxPool2D(pool_size=(
3,3), strides=(2,2))(network)

? ?network = squeezenet_fire_module(input=network, input_channel_small=
32, input_channel_large=128)
? ?network = squeezenet_fire_module(input=network, input_channel_small=
32, input_channel_large=128)
? ?network = MaxPool2D(pool_size=(
3,?3), strides=(2,?2))(network)

? ?network = squeezenet_fire_module(input=network, input_channel_small=
48, input_channel_large=192)
? ?network = squeezenet_fire_module(input=network, input_channel_small=
48, input_channel_large=192)
? ?network = squeezenet_fire_module(input=network, input_channel_small=
64, input_channel_large=256)
? ?network = squeezenet_fire_module(input=network, input_channel_small=
64, input_channel_large=256)

? ?
#Remove layers like Dropout and BatchNormalization, they are only needed in training
? ?#network = Dropout(0.5)(network)

? ?network = Conv2D(1000, kernel_size=(1,1), padding="valid", name="last_conv")(network)
? ?network = Activation(
"relu")(network)

? ?network = GlobalAvgPool2D()(network)
? ?network = Activation(
"softmax",name="output")(network)


? ?input_image = image_input
? ?model = Model(inputs=input_image, outputs=network)

? ?
return?model


keras_model = SqueezeNet()



#Lucky for us, PyTorch includes a predefined Squeezenet
pytorch_model = squeezenet1_1()

#Load the pretrained model
pytorch_model.load_state_dict(torch.load("squeezenet.pth"))

#Time to transfer weights

converter = PytorchToKeras(pytorch_model,keras_model)
converter.convert((
3,224,224))

#Save the weights of the converted keras model for later use
converter.save_weights("squeezenet.h5")

上面是已經轉好權值的,你所需要做的是將 Keras 模型保存為 squeezenet.h5。到這一步,我們可以拋棄 PyTorch 模型,繼續下一步了。

?

??將 Keras 轉成 TensorFlow 模式

到這一步,你已經有了 Keras 模式,無論是從 PyTorch 轉化而來的還是直接用 Keras 訓練而獲得的。你可以在這兒下載預訓練的 Keras Squeezenet 模式。下一步是將我們整個的模型架構和權值轉成可運行的 TensorFlow 模型。

創建一個新文件 ConvertToTensorflow.py 并添加以下代碼。

from?keras.models?import?Model
from?keras.layers?import?*
import?os
import?tensorflow?as?tf


def?keras_to_tensorflow(keras_model, output_dir, model_name,out_prefix="output_", log_tensorboard=True):

? ?
if?os.path.exists(output_dir) ==?False:
? ? ? ?os.mkdir(output_dir)

? ?out_nodes = []

? ?
for?i?in?range(len(keras_model.outputs)):
? ? ? ?out_nodes.append(out_prefix + str(i +?
1))
? ? ? ?tf.identity(keras_model.output[i], out_prefix + str(i +?
1))

? ?sess = K.get_session()

? ?
from?tensorflow.python.framework?import?graph_util, graph_io

? ?init_graph = sess.graph.as_graph_def()

? ?main_graph = graph_util.convert_variables_to_constants(sess, init_graph, out_nodes)

? ?graph_io.write_graph(main_graph, output_dir, name=model_name, as_text=
False)

? ?
if?log_tensorboard:
? ? ? ?
from?tensorflow.python.tools?import?import_pb_to_tensorboard

? ? ? ?import_pb_to_tensorboard.import_to_tensorboard(
? ? ? ? ? ?os.path.join(output_dir, model_name),
? ? ? ? ? ?output_dir)



"""
We explicitly redefine the Squeezent architecture since Keras has no predefined Squeezenet
"""


def?squeezenet_fire_module(input, input_channel_small=16, input_channel_large=64):

? ?channel_axis =?
3

? ?input = Conv2D(input_channel_small, (1,1), padding="valid"?)(input)
? ?input = Activation(
"relu")(input)

? ?input_branch_1 = Conv2D(input_channel_large, (
1,1), padding="valid"?)(input)
? ?input_branch_1 = Activation(
"relu")(input_branch_1)

? ?input_branch_2 = Conv2D(input_channel_large, (
3,?3), padding="same")(input)
? ?input_branch_2 = Activation(
"relu")(input_branch_2)

? ?input = concatenate([input_branch_1, input_branch_2], axis=channel_axis)

? ?
return?input


def?SqueezeNet(input_shape=(224,224,3)):



? ?image_input = Input(shape=input_shape)


? ?network = Conv2D(
64, (3,3), strides=(2,2), padding="valid")(image_input)
? ?network = Activation(
"relu")(network)
? ?network = MaxPool2D( pool_size=(
3,3) , strides=(2,2))(network)

? ?network = squeezenet_fire_module(input=network, input_channel_small=
16, input_channel_large=64)
? ?network = squeezenet_fire_module(input=network, input_channel_small=
16, input_channel_large=64)
? ?network = MaxPool2D(pool_size=(
3,3), strides=(2,2))(network)

? ?network = squeezenet_fire_module(input=network, input_channel_small=
32, input_channel_large=128)
? ?network = squeezenet_fire_module(input=network, input_channel_small=
32, input_channel_large=128)
? ?network = MaxPool2D(pool_size=(
3,?3), strides=(2,?2))(network)

? ?network = squeezenet_fire_module(input=network, input_channel_small=
48, input_channel_large=192)
? ?network = squeezenet_fire_module(input=network, input_channel_small=
48, input_channel_large=192)
? ?network = squeezenet_fire_module(input=network, input_channel_small=
64, input_channel_large=256)
? ?network = squeezenet_fire_module(input=network, input_channel_small=
64, input_channel_large=256)

? ?
#Remove layers like Dropout and BatchNormalization, they are only needed in training
? ?#network = Dropout(0.5)(network)

? ?network = Conv2D(1000, kernel_size=(1,1), padding="valid", name="last_conv")(network)
? ?network = Activation(
"relu")(network)

? ?network = GlobalAvgPool2D()(network)
? ?network = Activation(
"softmax",name="output")(network)


? ?input_image = image_input
? ?model = Model(inputs=input_image, outputs=network)

? ?
return?model


keras_model = SqueezeNet()

keras_model.load_weights(
"squeezenet.h5")


output_dir = os.path.join(os.getcwd(),
"checkpoint")

keras_to_tensorflow(keras_model,output_dir=output_dir,model_name=
"squeezenet.pb")

print(
"MODEL SAVED")

上面的代碼將我們的 squeezenet.pb 保存到了 output_dir 中。并在同一文件夾中創建 了 TensorBoard 事件。

為了更加清晰地理解你的模型,你可以用 TensorBoard 將它可視化。

打開命令行并輸入

tensorboard –logdir=output_dir_path

output_dir_path would?
be?the path?to?your output_dir.

一旦?TensorBoard 成功啟動,你將看到提示讓你打開如下 url?COMPUTER_NAME:6006

?

將 URL 地址輸入到瀏覽器中,將顯示以下界面。?

?

為了可視化你的模式,雙擊?IMPORT.

仔細看下該模型并記下輸入和輸出節點的名字(框架中的第一個和最后一個)。

如果你的命名和我之前代碼一樣的話,他們就應該是?input_1?和output_1??。

到這一步, 我們的模型就可以調用了。

?

??將 TensorFlow Mobile 添加到你的項目中

TensorFlow 有 2 個針對移動設備的庫,分別是「TensorFlow Mobile」和「TensorFlow Lite.」Lite 版本設計得非常小,所有的依賴庫大約只有 1M。它的模型也更優化。另外,在安卓 8 以上的設備中,還可以用神經網絡 API 加速。與「TensorFlow Mobile」不同,「TensorFlow Lite.」目前還不太完善,有些層并不能實現預期的效果。此外,windows 系統還不支持編譯庫和將模式轉成原生格式的操作。因此,在這個教程里,我堅持用 TensorFlow Mobile。

如果沒有現存項目的話,使用 Android Studio,創建一個新的安卓項目。然后添加TensorFlow Mobile 依賴庫到你的build.gradle?文件。

implementation?‘org.tensorflow:tensorflow-android:+

Android studio ?將提示你同步 gradle,點擊?Sync Now?等待同步完成。

到這一步項目就創建完成了。

?

??在你的移動 App 上執行推理

在用代碼執行推理前,你需要將轉化的模式 (squeezenet.pb) ?添加到你的應用的資源文件夾里。

在 Android Studio 中右擊你的項目,鼠標移到「添加文件夾」選項,然后選擇「資源文件夾」。這時會在你的 app 目錄下創建一個資源文件夾。然后,拷貝你的模式到此目錄下。

點擊 here 下載標簽類,并拷貝文件到資源目錄。

現在你的項目包含了分類圖像的所有工具。

添加一個新的 Java 類到你的項目的主包中,取名為 ImageUtils , 然后將以下代碼拷貝到其中。

package?com.specpal.mobileai;
import?android.content.res.AssetManager;
import?android.graphics.Bitmap;
import?android.graphics.Canvas;
import?android.graphics.Matrix;
import?android.os.Environment;
import?java.io.File;
import?java.io.FileOutputStream;
import?java.io.InputStream;
import?org.json.*;

/**
* Utility class for manipulating images.
**/

public?class?ImageUtils?{
? ?
/**
? ? * Returns a transformation matrix from one reference frame into another.
? ? * Handles cropping (if maintaining aspect ratio is desired) and rotation.
? ? *
? ? *?
@param?srcWidth Width of source frame.
? ? *?
@param?srcHeight Height of source frame.
? ? *?
@param?dstWidth Width of destination frame.
? ? *?
@param?dstHeight Height of destination frame.
? ? *?
@param?applyRotation Amount of rotation to apply from one frame to another.
? ? * ?Must be a multiple of 90.
? ? *?
@param?maintainAspectRatio If true, will ensure that scaling in x and y remains constant,
? ? * cropping the image if necessary.
? ? *?
@return?The transformation fulfilling the desired requirements.
? ? */

? ?public?static?Matrix?getTransformationMatrix(
? ? ? ? ? ?
final?int?srcWidth,
? ? ? ? ? ?
final?int?srcHeight,
? ? ? ? ? ?
final?int?dstWidth,
? ? ? ? ? ?
final?int?dstHeight,
? ? ? ? ? ?
final?int?applyRotation,
? ? ? ? ? ?
final?boolean?maintainAspectRatio)?{
? ? ? ?
final?Matrix matrix =?new?Matrix();

? ? ? ?
if?(applyRotation !=?0) {
? ? ? ? ? ?
// Translate so center of image is at origin.
? ? ? ? ? ?matrix.postTranslate(-srcWidth /?2.0f, -srcHeight /?2.0f);

? ? ? ? ? ?
// Rotate around origin.
? ? ? ? ? ?matrix.postRotate(applyRotation);
? ? ? ?}

? ? ? ?
// Account for the already applied rotation, if any, and then determine how
? ? ? ?// much scaling is needed for each axis.
? ? ? ?final?boolean?transpose = (Math.abs(applyRotation) +?90) %?180?==?0;

? ? ? ?
final?int?inWidth = transpose ? srcHeight : srcWidth;
? ? ? ?
final?int?inHeight = transpose ? srcWidth : srcHeight;

? ? ? ?
// Apply scaling if necessary.
? ? ? ?if?(inWidth != dstWidth || inHeight != dstHeight) {
? ? ? ? ? ?
final?float?scaleFactorX = dstWidth / (float) inWidth;
? ? ? ? ? ?
final?float?scaleFactorY = dstHeight / (float) inHeight;

? ? ? ? ? ?
if?(maintainAspectRatio) {
? ? ? ? ? ? ? ?
// Scale by minimum factor so that dst is filled completely while
? ? ? ? ? ? ? ?// maintaining the aspect ratio. Some image may fall off the edge.
? ? ? ? ? ? ? ?final?float?scaleFactor = Math.max(scaleFactorX, scaleFactorY);
? ? ? ? ? ? ? ?matrix.postScale(scaleFactor, scaleFactor);
? ? ? ? ? ?}?
else?{
? ? ? ? ? ? ? ?
// Scale exactly to fill dst from src.
? ? ? ? ? ? ? ?matrix.postScale(scaleFactorX, scaleFactorY);
? ? ? ? ? ?}
? ? ? ?}

? ? ? ?
if?(applyRotation !=?0) {
? ? ? ? ? ?
// Translate back from origin centered reference to destination frame.
? ? ? ? ? ?matrix.postTranslate(dstWidth /?2.0f, dstHeight /?2.0f);
? ? ? ?}

? ? ? ?
return?matrix;
? ?}


? ?
public?static?Bitmap?processBitmap(Bitmap source,int?size){

? ? ? ?
int?image_height = source.getHeight();
? ? ? ?
int?image_width = source.getWidth();

? ? ? ?Bitmap croppedBitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);

? ? ? ?Matrix frameToCropTransformations = getTransformationMatrix(image_width,image_height,size,size,
0,false);
? ? ? ?Matrix cropToFrameTransformations =?
new?Matrix();
? ? ? ?frameToCropTransformations.invert(cropToFrameTransformations);

? ? ? ?
final?Canvas canvas =?new?Canvas(croppedBitmap);
? ? ? ?canvas.drawBitmap(source, frameToCropTransformations,?
null);

? ? ? ?
return?croppedBitmap;


? ?}

? ?
public?static?float[] normalizeBitmap(Bitmap source,int?size,float?mean,float?std){

? ? ? ?
float[] output =?new?float[size * size *?3];

? ? ? ?
int[] intValues =?new?int[source.getHeight() * source.getWidth()];

? ? ? ?source.getPixels(intValues,?
0, source.getWidth(),?0,?0, source.getWidth(), source.getHeight());
? ? ? ?
for?(int?i =?0; i < intValues.length; ++i) {
? ? ? ? ? ?
final?int?val = intValues[i];
? ? ? ? ? ?output[i *?
3] = (((val >>?16) &?0xFF) - mean)/std;
? ? ? ? ? ?output[i *?
3?+?1] = (((val >>?8) &?0xFF) - mean)/std;
? ? ? ? ? ?output[i *?
3?+?2] = ((val &?0xFF) - mean)/std;
? ? ? ?}

? ? ? ?
return?output;

? ?}

? ?
public?static?Object[] argmax(float[] array){


? ? ? ?
int?best = -1;
? ? ? ?
float?best_confidence =?0.0f;

? ? ? ?
for(int?i =?0;i < array.length;i++){

? ? ? ? ? ?
float?value = array[i];

? ? ? ? ? ?
if?(value > best_confidence){

? ? ? ? ? ? ? ?best_confidence = value;
? ? ? ? ? ? ? ?best = i;
? ? ? ? ? ?}
? ? ? ?}



? ? ? ?
return?new?Object[]{best,best_confidence};


? ?}


? ?
public?static?String?getLabel( InputStream jsonStream,int?index){
? ? ? ?String label =?
"";
? ? ? ?
try?{

? ? ? ? ? ?
byte[] jsonData =?new?byte[jsonStream.available()];
? ? ? ? ? ?jsonStream.read(jsonData);
? ? ? ? ? ?jsonStream.close();

? ? ? ? ? ?String jsonString =?
new?String(jsonData,"utf-8");

? ? ? ? ? ?JSONObject object =?
new?JSONObject(jsonString);

? ? ? ? ? ?label = object.getString(String.valueOf(index));



? ? ? ?}
? ? ? ?
catch?(Exception e){


? ? ? ?}
? ? ? ?
return?label;
? ?}
}

如果不理解上面的代碼也沒關系,這是一些未在核心 TensorFlow-Mobile 庫中實現的功能。因此,在參考了一些官方樣例后,我寫了這些代碼以方便后續工作。

在你的主活動中,創建一個 ImageView?和一個 TextView ,這將被用來顯示圖像和其預測結果。

在你的主活動中,你需要加載 TensorFlow-inference ?庫和初始化一些類變量。在你的 onCreate 方法前添加以下內容:

//Load the tensorflow inference library
? ?static?{
? ? ? ?System.loadLibrary(
"tensorflow_inference");
? ?}

? ?
//PATH TO OUR MODEL FILE AND NAMES OF THE INPUT AND OUTPUT NODES
? ?private?String MODEL_PATH =?"file:///android_asset/squeezenet.pb";
? ?
private?String INPUT_NAME =?"input_1";
? ?
private?String OUTPUT_NAME =?"output_1";
? ?
private?TensorFlowInferenceInterface tf;

? ?
//ARRAY TO HOLD THE PREDICTIONS AND FLOAT VALUES TO HOLD THE IMAGE DATA
? ?float[] PREDICTIONS =?new?float[1000];
? ?
private?float[] floatValues;
? ?
private?int[] INPUT_SIZE = {224,224,3};

? ?ImageView imageView;
? ?TextView resultView;
? ?Snackbar progressBar;

添加一個計算預測類的函數:

//FUNCTION TO COMPUTE THE MAXIMUM PREDICTION AND ITS CONFIDENCE
? ?public?Object[]?argmax(float[] array){


? ? ? ?
int?best =?-1;
? ? ? ?
float?best_confidence =?0.0f;

? ? ? ?
for(int?i =?0;i < array.length;i++){

? ? ? ? ? ?
float?value?= array[i];

? ? ? ? ? ?
if?(value?> best_confidence){

? ? ? ? ? ? ? ?best_confidence =?
value;
? ? ? ? ? ? ? ?best = i;
? ? ? ? ? ?}
? ? ? ?}

? ? ? ?
return?new?Object[]{best,best_confidence};


? ?}

添加函數來接收 Image Bitmap 并在其上執行推理:

public?void?predict(final?Bitmap bitmap){


? ? ? ?
//Runs inference in background thread
? ? ? ?new?AsyncTask<Integer,Integer,Integer>(){

? ? ? ? ? ?
@Override

? ? ? ? ? ?protected?Integer?doInBackground(Integer ...params){

? ? ? ? ? ? ? ?
//Resize the image into 224 x 224
? ? ? ? ? ? ? ?Bitmap resized_image = ImageUtils.processBitmap(bitmap,224);

? ? ? ? ? ? ? ?
//Normalize the pixels
? ? ? ? ? ? ? ?floatValues = ImageUtils.normalizeBitmap(resized_image,224,127.5f,1.0f);

? ? ? ? ? ? ? ?
//Pass input into the tensorflow
? ? ? ? ? ? ? ?tf.feed(INPUT_NAME,floatValues,1,224,224,3);

? ? ? ? ? ? ? ?
//compute predictions
? ? ? ? ? ? ? ?tf.run(new?String[]{OUTPUT_NAME});

? ? ? ? ? ? ? ?
//copy the output into the PREDICTIONS array
? ? ? ? ? ? ? ?tf.fetch(OUTPUT_NAME,PREDICTIONS);

? ? ? ? ? ? ? ?
//Obtained highest prediction
? ? ? ? ? ? ? ?Object[] results = argmax(PREDICTIONS);


? ? ? ? ? ? ? ?
int?class_index = (Integer) results[0];
? ? ? ? ? ? ? ?
float?confidence = (Float) results[1];


? ? ? ? ? ? ? ?
try{

? ? ? ? ? ? ? ? ? ?
final?String conf = String.valueOf(confidence *?100).substring(0,5);

? ? ? ? ? ? ? ? ? ?
//Convert predicted class index into actual label name
? ? ? ? ? ? ? ? ??final?String label = ImageUtils.getLabel(getAssets().open("labels.json"),class_index);



? ? ? ? ? ? ? ? ??
//Display result on UI
? ? ? ? ? ? ? ? ? ?runOnUiThread(new?Runnable() {
? ? ? ? ? ? ? ? ? ? ? ?
@Override
? ? ? ? ? ? ? ? ? ? ? ?public?void?run()?{

? ? ? ? ? ? ? ? ? ? ? ? ? ?progressBar.dismiss();
? ? ? ? ? ? ? ? ? ? ? ? ? ?resultView.setText(label +?
" : "?+ conf +?"%");

? ? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ? ? ?});

? ? ? ? ? ? ? ?}

? ? ? ? ? ? ? ?
catch?(Exception e){


? ? ? ? ? ? ? ?}


? ? ? ? ? ? ? ?
return?0;
? ? ? ? ? ?}



? ? ? ?}.execute(
0);

? ?}

以上代碼在后臺線程中運行預測,并將預測的類和它的評估得分寫到我們之前定義的?TextView?中。

注意在主 UI 線程運行推理時可能會掛起。記住一個原則 :“永遠在你的后臺線程運行推理!”

本教程的重點是圖像識別,為此我在資源文件夾中添加了一只小鳥的圖像。在標準應用程序中,你要用代碼從文件系統加載圖像。

添加任何你想做預測的圖像到資源文件夾中。為了方便的運行算法,在下列的代碼中,我們在一個按鈕上添加了一個點擊監聽。該監聽可以加載該圖像并調用預測功能。

@Override
? ?protected?void?onCreate(Bundle savedInstanceState)?{
? ? ? ?
super.onCreate(savedInstanceState);
? ? ? ?setContentView(R.layout.activity_main);


? ? ? ?Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
? ? ? ?setSupportActionBar(toolbar);


? ? ? ?
//initialize tensorflow with the AssetManager and the Model
? ? ? ?tf =?new?TensorFlowInferenceInterface(getAssets(),MODEL_PATH);

? ? ? ?imageView = (ImageView) findViewById(R.id.imageview);
? ? ? ?resultView = (TextView) findViewById(R.id.results);

? ? ? ?progressBar = Snackbar.make(imageView,
"PROCESSING IMAGE",Snackbar.LENGTH_INDEFINITE);


? ? ? ?
final?FloatingActionButton predict = (FloatingActionButton) findViewById(R.id.predict);
? ? ? ?predict.setOnClickListener(
new?View.OnClickListener() {
? ? ? ? ? ?
@Override
? ? ? ? ? ?public?void?onClick(View view)?{


? ? ? ? ? ? ? ?
try{

? ? ? ? ? ? ? ? ? ?
//READ THE IMAGE FROM ASSETS FOLDER
? ? ? ? ? ? ? ? ? ?InputStream imageStream = getAssets().open("testimage.jpg");

? ? ? ? ? ? ? ? ? ?Bitmap bitmap = BitmapFactory.decodeStream(imageStream);

? ? ? ? ? ? ? ? ? ?imageView.setImageBitmap(bitmap);

? ? ? ? ? ? ? ? ? ?progressBar.show();

? ? ? ? ? ? ? ? ? ?predict(bitmap);
? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ?
catch?(Exception e){

? ? ? ? ? ? ? ?}

? ? ? ? ? ?}
? ? ? ?});
? ?}

很好!所有步驟都已完成!雙擊檢驗一下,如果都沒有問題。點擊「Bulid APK.」按鈕

APK很快就創建完成了,之后在設備上安裝并運行App.

結果如下圖所示:

為了得到更新奇的體驗,你的 App 應當從安卓文件系統加載圖像或用攝像頭抓取圖像,而不是從資源文件夾加載。

?

??總結

移動端的深度學習框架將最終轉變我們開發和使用 app 的方式。使用上述代碼,你能輕松導出你訓練的 PyTorch 和 Keras 模型到 TensorFlow。運用 TensorFlow Mobile 和這篇文章中介紹的步驟,你可以將卓越的 AI 功能完美的植入到你的移動端應用中。

安卓項目的完整代碼和模型轉換工具在我的?GitHub?上可以找到:

https://github.com/paulpanwang/YOLO-Android

下一篇:YOLO 與 增強現實

總結

以上是生活随笔為你收集整理的卷积神经网络模型部署到移动设备的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

99精品国产免费久久久久久下载 | 婷婷综合导航 | 99在线精品免费视频九九视 | 免费亚洲黄色 | 久久久片 | 亚洲在线视频免费 | 免费国产ww | 99国产一区二区三精品乱码 | 日韩成人欧美 | 午夜精品99久久免费 | 国产精品久久一区二区无卡 | 日韩高清免费在线观看 | 狠狠操狠狠干天天操 | 久久久久久久免费 | 夜夜爽夜夜操 | 国产色视频一区二区三区qq号 | 天堂在线v| 国产一区免费看 | 美女禁18| 在线观看www. | 国产五月色婷婷六月丁香视频 | 手机色站 | 亚洲精品福利在线观看 | 久久综合网色—综合色88 | 天天干夜夜擦 | 日韩精品免费一区二区在线观看 | 美女天天操 | 久久久久久久久久久久电影 | 天天av资源| 国产最顶级的黄色片在线免费观看 | 国产高清不卡在线 | 99久高清在线观看视频99精品热在线观看视频 | 91视频免费网站 | 四虎最新域名 | 久久国产免费看 | 久久精品999 | 日本久久精 | 国产日产精品一区二区三区四区的观看方式 | www天天干com | 99草视频在线观看 | 国产精品久久网站 | 免费看污在线观看 | 亚洲精品一区二区精华 | 中文字幕免费观看视频 | 在线91视频 | 欧美性极品xxxx做受 | 久久久网站 | 性色视频在线 | 国产精品 欧美 日韩 | av三级在线免费观看 | 黄色免费观看视频 | avove黑丝 | 国产亚洲久一区二区 | 特级西西人体444是什么意思 | 我要色综合天天 | 欧美日韩91| 久久久天堂 | 国产精品2018 | 欧美片网站yy| 精品国产乱码久久久久久三级人 | 久久久三级视频 | 亚州黄色一级 | 色综合久久综合网 | 中文字幕一区二区三区四区 | 日本午夜免费福利视频 | 国产福利在线不卡 | 二区三区毛片 | 久久天堂亚洲 | 欧美性做爰猛烈叫床潮 | 久久久受www免费人成 | 97精品国自产拍在线观看 | 天天插综合网 | 中文字幕在线观看一区 | 亚洲一二三区精品 | 久久久久久久久久久久国产精品 | 婷婷国产v亚洲v欧美久久 | 婷婷九月丁香 | 草久久久久久久 | 午夜av片| 97在线视频网站 | 2019国产精品 | 久久成人一区 | 五月天九九 | 日韩天堂在线观看 | 91精品久久久久久久久久久久久 | 在线播放国产一区二区三区 | 天天做日日做天天爽视频免费 | 国产美女精彩久久 | av一级在线观看 | 99久久综合国产精品二区 | 国产探花 | 中文字幕一区二区在线播放 | 在线观看日韩免费视频 | 黄色在线看网站 | 国产精品999久久久 久产久精国产品 | 亚洲三级视频 | 久久99精品久久久久久 | 国产亚洲精品美女 | 一二三区视频在线 | 国产无遮挡又黄又爽在线观看 | 国产中文字幕在线观看 | 久草香蕉在线视频 | 五月av在线 | 久久久精品在线观看 | 精品人人人人 | 91大神免费在线观看 | 亚洲精品在线看 | 久操操 | 手机av资源 | 亚洲国产精品一区二区久久hs | 久久99国产精品久久99 | 狠狠干美女 | 日日干影院| 日韩毛片在线一区二区毛片 | 日韩av在线免费播放 | 免费看黄色大全 | 国产精品99久久久久的智能播放 | 91精品啪在线观看国产81旧版 | 高清精品视频 | 国产偷在线 | 免费十分钟 | 又黄又爽的视频在线观看网站 | 91精品国产自产在线观看 | 五月激情婷婷丁香 | 国内久久视频 | 久久免费在线观看 | 久久视频99 | 看片的网址 | 中文字幕av最新 | 国产成人99久久亚洲综合精品 | 久久亚洲热 | 日韩com | 最新国产精品亚洲 | 福利视频 | 一本一本久久a久久精品综合妖精 | av在线亚洲天堂 | 免费在线观看av不卡 | www毛片com| 欧美成人黄色 | 久久高清视频免费 | 国产精品视频永久免费播放 | 伊人成人激情 | 黄色影院在线免费观看 | 欧美在线视频二区 | 99视频在线观看免费 | 天堂久色 | 免费观看视频黄 | 国产在线观看,日本 | 天天干天天做天天爱 | 美女黄色网在线播放 | 91免费国产在线观看 | 久久久久久久久久久免费 | 成人理论电影 | www.夜夜夜| 91精品久久久久久久99蜜桃 | 亚洲精品视频免费在线观看 | 九九九在线观看视频 | 成人av在线影院 | 超碰在线99 | 婷婷久久婷婷 | 日日夜夜精品 | 亚洲丝袜一区二区 | 亚洲一二区精品 | 国产亚洲精品美女 | 成片免费观看视频大全 | 欧美精品日韩 | 色在线视频网 | 人人草人| 亚洲不卡av一区二区三区 | 国产精品专区h在线观看 | 精品久久久久_ | 国产精品国产精品 | 99中文字幕视频 | 色老板在线视频 | 91麻豆精品国产91久久久更新时间 | 日韩欧美高清一区二区三区 | 国际精品久久 | 日韩国产精品久久久久久亚洲 | 日韩一片| 日韩在线视频网站 | 日韩电影中文,亚洲精品乱码 | 狠狠色丁香九九婷婷综合五月 | 国产精品粉嫩 | 日韩高清一二区 | 久久久久久高潮国产精品视 | 国产视频色 | 草在线视频 | 99精品久久只有精品 | 99久久久国产免费 | 激情丁香在线 | 国产乱老熟视频网88av | 免费观看午夜视频 | 亚洲精品成人av在线 | 伊人久久国产 | 亚洲一区精品二人人爽久久 | av免费网| 亚洲成人免费 | 果冻av在线| 日本资源中文字幕在线 | 亚洲国内精品视频 | 亚洲成人精品久久久 | 中文在线√天堂 | 色综合天天在线 | 色噜噜狠狠狠狠色综合久不 | 麻豆精品视频 | 一区二区在线影院 | 免费电影一区二区三区 | 日韩欧美电影 | 亚洲激情在线观看 | 日韩免费不卡视频 | 91视频 - x99av| 麻豆首页| 久久99久国产精品黄毛片入口 | 看av在线 | www色com| 国产免费观看久久黄 | 狠狠ri| 精品久久久久久久久久久久久久久久 | 亚洲精品国产品国语在线 | 国产不卡一二三区 | 一区在线播放 | 黄色在线免费观看网站 | 国产不卡片 | 中文字幕乱偷在线 | 免费在线激情电影 | 成人免费在线观看av | 久草在线欧美 | 中文字幕第一页在线播放 | 国产高清视频免费最新在线 | 久久久受www免费人成 | 欧美激情精品久久久久久变态 | 波多野结衣日韩 | 国内精品久久久久久久久久久 | 国产成人99av超碰超爽 | 韩国三级在线一区 | 五月激情六月丁香 | 有码一区二区三区 | 日韩午夜三级 | 国产中的精品av小宝探花 | 精品国产乱码久久久久久浪潮 | 国产精品视频资源 | 曰本免费av | 免费男女羞羞的视频网站中文字幕 | 精品福利片 | 亚洲国产中文字幕在线 | 日本一区二区高清不卡 | 国产精品一区欧美 | 黄网站色 | 亚洲黄色av网址 | 日韩在线播放欧美字幕 | 久久一区二区免费视频 | 成人av动漫在线观看 | av电影在线观看完整版一区二区 | 成人av电影免费观看 | 亚洲精品女人久久久 | 91精品久久久久久综合五月天 | 黄网站免费看 | 国产福利91精品一区二区三区 | 麻豆国产精品一区二区三区 | 婷婷天天色 | 国产高清专区 | 亚洲精品字幕在线 | 国产无套视频 | av三级av | 国产精品成久久久久三级 | 人人射av| 久久久国产精品一区二区三区 | 亚洲精品tv久久久久久久久久 | 99热国产在线观看 | 99热这里有| 日韩午夜电影 | 黄色一级影院 | 麻花豆传媒mv在线观看网站 | 免费观看黄 | 国产五月婷| 免费视频97 | av网站在线观看播放 | 天天操操 | 国产亚洲精品精品精品 | 五月婷婷在线综合 | 最新日韩精品 | 又黄又刺激又爽的视频 | 午夜在线日韩 | 日韩中文字幕免费视频 | 国产精品私拍 | 久久久久久久久久久黄色 | 狠狠做六月爱婷婷综合aⅴ 日本高清免费中文字幕 | 国产成在线观看免费视频 | 亚洲精品动漫在线 | 国产精品久久久久久久久免费 | 日韩专区中文字幕 | 久久激情综合网 | 亚洲激情五月 | 成人免费观看a | 在线免费观看羞羞视频 | 十八岁以下禁止观看的1000个网站 | 狠狠躁日日躁夜夜躁av | 久久免费美女视频 | a级国产乱理伦片在线播放 久久久久国产精品一区 | 黄色的网站在线 | 丁香花在线观看免费完整版视频 | a视频在线 | 精品视频免费久久久看 | 亚洲 欧美 日韩 综合 | 胖bbbb搡bbbb擦bbbb| 91精品夜夜 | 黄色一级在线免费观看 | 国产精品国产三级国产aⅴ9色 | 日色在线视频 | 色狠狠一区二区 | 午夜精品99久久免费 | 91九色在线| 四虎影视www| 国产最新精品视频 | 成人一区在线观看 | 夜夜视频欧洲 | 国产生活一级片 | 欧美性大战| 五月天开心 | 中文字幕91 | av大全免费在线观看 | 亚洲精品动漫久久久久 | 久久国产二区 | 久久精品导航 | 欧美在线观看视频 | 91精品视频免费看 | 中文字幕精品一区久久久久 | 91大神免费在线观看 | 亚洲欧美乱综合图片区小说区 | 日韩欧美v | 免费观看一区 | 综合久久久久久久 | 日韩大陆欧美高清视频区 | 欧美视频网址 | 天天干婷婷 | 超碰97网站| 久久视频免费在线 | 综合五月| 美女黄频网站 | 久久综合五月 | 久久精品一区二区三 | 亚洲一区久久久 | 国产自制av | 国产中文字幕在线观看 | 欧美一级特黄高清视频 | 999久久久免费视频 午夜国产在线观看 | 欧美一级专区免费大片 | 日韩精品无码一区二区三区 | 午夜精品久久久久久久99热影院 | 夜夜爽夜夜操 | 日韩高清在线看 | 久久一级片 | 亚洲国产精品久久久久婷婷884 | 久久国产麻豆 | 丁香激情五月婷婷 | 欧美少妇bbwhd | 久久永久免费视频 | 波多野结衣在线观看视频 | 中文字幕免费成人 | 国产精品一区二区免费在线观看 | 五月婷婷开心 | 久久不见久久见免费影院 | 最新亚洲视频 | 黄av在线| 欧美日韩在线视频一区二区 | 美女视频黄免费网站 | 91视频88av| 香蕉国产91 | 日韩一区二区免费在线观看 | 蜜臀aⅴ精品一区二区三区 久久视屏网 | 视频在线99re | 国产h片在线观看 | 在线观看免费 | 久久电影中文字幕视频 | 在线色吧 | 久草免费在线视频观看 | 亚洲天堂精品视频在线观看 | 操碰av| 欧美激情视频一区 | 国产精品一区二区免费在线观看 | 国产欧美久久久精品影院 | 国产一区欧美在线 | 在线中文字幕观看 | 久久视频这里只有精品 | av大全在线 | 丁香六月天婷婷 | 国产在线最新 | 日本精品视频一区二区 | 日韩精品一区二区三区免费观看视频 | 欧美aa级| 亚一亚二国产专区 | 欧美专区日韩专区 | 国产精品国产三级国产不产一地 | 精品国产观看 | 成人av观看| 波多野结衣视频一区二区 | 成人三级网站在线观看 | 国产精品久久久免费 | 日本成人免费在线观看 | 久久天天躁 | 国内精品免费 | 99免费在线播放99久久免费 | 人人插超碰 | 国际精品久久久 | 国内视频| 国产精品伦一区二区三区视频 | 亚洲成人频道 | 久久久网站 | 亚洲视频1| 精品视频一区在线观看 | 黄色app网站在线观看 | 久久成人国产精品入口 | 福利视频一区二区 | 日韩午夜网站 | 久久久免费毛片 | 黄色网址av | 国产品久精国精产拍 | 99精品黄色| 福利视频一区二区 | 国产区免费在线 | 日韩欧美精品在线 | 国产一区私人高清影院 | 久久成人国产精品免费软件 | 国产一区二区免费在线观看 | 欧美大片在线看免费观看 | 亚洲成av人片在线观看无 | 波多野结衣一区三区 | 午夜男人影院 | 天天操天天色天天射 | 久久99视频免费 | 久久av福利| 韩国av不卡 | 91av福利视频| 天天操天天摸天天干 | 国产午夜精品一区二区三区 | 在线观看福利网站 | 国产三级午夜理伦三级 | www.夜夜爱| 91精品区| avwww在线观看| 丝袜美腿在线播放 | 99热精品视 | 欧美日韩国产一区二区三区在线观看 | 久久综合狠狠综合久久狠狠色综合 | 91中文字幕视频 | 国产99久久久精品 | 国产精品 视频 | 国产亚洲婷婷免费 | 91福利社在线观看 | 天天操天天射天天舔 | 色综合久久88色综合天天免费 | 色a在线观看 | 久久精品香蕉视频 | 中文在线字幕免费观 | 国内精品久久久久久久影视麻豆 | 免费亚洲婷婷 | 玖玖爱国产在线 | 久久精品美女视频网站 | 久久免费大片 | 激情五月婷婷综合网 | 成人国产电影在线观看 | 五月天中文字幕mv在线 | 欧美一区在线看 | 久久人人爽人人片av | 午夜丁香视频在线观看 | 亚洲精品国精品久久99热 | 天天射天天操天天色 | 色狠狠综合 | 欧美无极色 | 91中文字幕网 | 国产这里只有精品 | 日本不卡一区二区 | 精品国产一二三 | 免费国产ww | 久久好看 | 国产亚洲小视频 | aaa日本高清在线播放免费观看 | 黄色成人在线观看 | 在线国产日本 | 国产大陆亚洲精品国产 | 亚洲最新在线 | 国产免费一区二区三区网站免费 | 婷婷99| 999成人网 | 国产视频1区2区3区 久久夜视频 | 亚洲一级片在线观看 | 日本中文字幕在线一区 | 中文字幕在线观看完整版 | 一区二区三区手机在线观看 | 久久天天拍| 国产精品第一视频 | 黄色软件在线看 | 欧美一级免费黄色片 | 91精品国产综合久久福利不卡 | 日韩黄色一级电影 | 久久综合久久综合这里只有精品 | 亚洲视频免费视频 | 黄色国产高清 | 97国产情侣爱久久免费观看 | 久久亚洲日本 | 国产在线中文字幕 | 99视频在线免费 | 99在线观看免费视频精品观看 | 成人免费在线观看电影 | 久久久国产成人 | 日韩欧美在线第一页 | 美女网站黄在线观看 | 色噜噜噜噜 | 亚洲精品在线网站 | 日韩在线视频精品 | 日日夜夜91 | 国产在线精品国自产拍影院 | 色综合五月天 | 久色小说| 国产热re99久久6国产精品 | 久久久精品午夜 | 天天天干夜夜夜操 | 五月婷婷综 | 欧美日韩不卡在线视频 | 亚洲欧洲精品一区二区 | 国产精品毛片久久久久久久久久99999999 | 亚州av一区 | 青青久视频| 国产精品一区二区精品视频免费看 | 天天曰天天 | 久久在线视频精品 | 亚洲va欧洲va国产va不卡 | 国产在线看一区 | www.夜色.com| 国产视频丨精品|在线观看 国产精品久久久久久久久久久久午夜 | 国产精品大片免费观看 | 国产99久久久国产精品成人免费 | 国产精品一区二区 91 | 99国产精品一区二区 | 91麻豆精品国产91久久久久久久久 | 欧美精品一区二区在线播放 | 国产美女黄网站免费 | 国产露脸91国语对白 | 狠狠色丁香九九婷婷综合五月 | 国产剧情在线一区 | 三级黄色免费片 | 亚洲人精品午夜 | 91热精品 | 亚洲 欧洲 国产 精品 | 992tv人人草 黄色国产区 | 特片网久久| 国产免码va在线观看免费 | 亚洲区精品 | 久久五月情影视 | 最近中文字幕mv免费高清在线 | 国产xx在线 | 欧美大片在线看免费观看 | 亚洲区另类春色综合小说校园片 | 日韩美av在线 | 日本中文字幕网站 | 久久6精品 | 成人免费视频观看 | 96香蕉视频 | 欧美 日韩 久久 | 成人av电影在线观看 | 亚洲一级黄色 | 一级性视频 | 日韩中文字幕亚洲一区二区va在线 | 99一区二区三区 | 亚洲一级二级三级 | av成人在线播放 | 国产在线一线 | 欧美日本啪啪无遮挡网站 | 国产成人a亚洲精品 | 欧美激情综合网 | 在线看国产 | 91av超碰| 亚洲一区久久 | 九色91在线 | 欧美日韩国产色综合一二三四 | 激情五月在线观看 | 丁香九月激情 | 蜜桃av久久久亚洲精品 | 国产伦理久久精品久久久久_ | 久久99免费 | 综合久久精品 | 久久人人插 | 欧美在线视频一区二区三区 | 天天干.com | 国产真实精品久久二三区 | 成人在线视频观看 | 亚洲视频免费视频 | 天天操天天干天天操天天干 | 美女天天操 | 在线亚洲高清视频 | 一区二区三区视频 | 三级午夜片| 欧美一级特黄aaaaaa大片在线观看 | 在线天堂日本 | 中文字幕视频三区 | 国产精品精品久久久久久 | 人人澡人人爽欧一区 | 丁香激情综合久久伊人久久 | 久久综合九色综合97_ 久久久 | 亚一亚二国产专区 | 国产黄色一级大片 | 久久少妇av | av在线看网站 | 日本免费一二三区 | 婷婷开心久久网 | 伊人一级| 国产黄在线播放 | 欧美国产精品一区二区 | 免费看黄20分钟 | 日韩精品一区电影 | 日本久久久久久久久 | 中文字幕在线成人 | 亚洲丁香久久久 | 国产97碰免费视频 | 丁香久久综合 | 国内三级在线观看 | 午夜精品一区二区三区在线播放 | 日本在线观看中文字幕 | 欧美不卡视频在线 | 精选久久 | 在线欧美a | 激情中文在线 | 国产视频69| 国产精品大片免费观看 | 天天躁日日躁狠狠躁av麻豆 | 国产视频在线免费观看 | 国产一级黄色免费看 | 久草剧场 | av福利第一导航 | 人人爽人人乐 | 人人爽网站 | 中文字幕丰满人伦在线 | 亚洲码国产日韩欧美高潮在线播放 | 亚洲一本视频 | 韩国av免费在线 | 超碰成人网 | 就操操久久 | 亚洲日日日 | av在线一级 | 中日韩三级视频 | 福利片免费看 | 精品99久久久久久 | 黄色软件视频大全免费下载 | 国产精品福利小视频 | 狠狠色综合网站久久久久久久 | 日韩免费一区二区在线观看 | 国产午夜精品福利视频 | 久草视频免费在线播放 | 91亚洲精品久久久蜜桃 | 天天干,夜夜操 | 久久国际影院 | 五月婷网 | 91九色视频国产 | 在线视频黄 | 国产视频 久久久 | 欧美少妇bbwhd| 免费电影一区二区三区 | 国产精品专区一 | av黄网站| 日本夜夜草视频网站 | 狠狠干夜夜爽 | 在线观看国产麻豆 | 五月婷婷丁香激情 | 日本黄色免费在线 | 一区二区精品在线视频 | 日韩美女久久 | 久久久久久久久免费视频 | 国产成人一区二区三区影院在线 | 国产99在线 | 色婷婷综合成人av | 视频一区二区三区视频 | 国产精品观看在线亚洲人成网 | 精品一二三四五区 | 五月婷婷在线观看 | ,午夜性刺激免费看视频 | 亚洲综合一区二区精品导航 | av永久网址| 97人人视频 | 国产黄网站在线观看 | 手机看片 | 操操操av| 精品久久久久免费极品大片 | 国产精品一区二区久久精品爱涩 | 色婷婷久久久综合中文字幕 | 日韩专区在线 | 亚洲老妇xxxxxx | 手机看片99 | 亚洲精品在线观 | 亚洲天天在线日亚洲洲精 | 91精品久久久久久粉嫩 | 久久不射电影院 | 天天曰天天曰 | 黄色片视频在线观看 | 久热av在线 | 日韩黄色影院 | 免费看一级黄色大全 | 国产色影院 | 午夜美女wwww| 国产a视频免费观看 | 久久草在线视频国产 | 在线国产一区二区三区 | 日韩精品一区二区三区视频播放 | 日韩亚洲国产精品 | 操操操日日日干干干 | 精品一二区 | 亚洲精品国产区 | 久久99久久99精品免视看婷婷 | 久久久久久久久久久黄色 | 亚洲欧美乱综合图片区小说区 | 黄色av一区二区 | 少妇自拍av| 五月天中文在线 | 久久人人爽 | 日韩免费在线网站 | 国产精品97| 亚洲一片黄 | 国产精品嫩草69影院 | 亚洲精品美女久久久久 | 国产99一区二区 | 天天色成人网 | 91精彩在线视频 | av手机版| 91看片网址 | 青青河边草免费观看完整版高清 | 日产乱码一二三区别在线 | 波多野结依在线观看 | 夜又临在线观看 | 亚洲一区二区三区四区精品 | 欧美精品在线一区二区 | 五月天婷亚洲天综合网鲁鲁鲁 | 一区二区三区在线播放 | 国产精品成人一区 | 黄污网站在线 | 成人午夜av电影 | 91视频-88av| 人九九精品 | 欧美a性 | 久久在线免费视频 | 久久精品国产第一区二区三区 | 91热爆视频 | 欧美aa一级 | 久久精品韩国 | 国产拍揄自揄精品视频麻豆 | 特级黄录像视频 | 中文字幕在线免费看线人 | 97成人精品视频在线播放 | 国产高清在线免费 | 国产在线观看中文字幕 | 欧美精品乱码99久久影院 | 欧美日韩后 | 四虎成人免费影院 | 五月天激情婷婷 | 在线国产能看的 | 久久另类小说 | 国产免费视频一区二区裸体 | 狠狠狠色 | 狠狠黄| 免费成人短视频 | 日韩av区 | 亚洲精品国产综合99久久夜夜嗨 | 亚洲欧美偷拍另类 | 国产精品久久久久久久久免费看 | 夜夜躁天天躁很躁波 | 免费视频久久久久 | 99中文在线 | www免费网站在线观看 | 欧美性高跟鞋xxxxhd | 亚洲精品视频在线观看免费视频 | 国产精美视频 | 99这里只有久久精品视频 | 黄色精品在线看 | 91人人澡人人爽人人精品 | 午夜精品福利一区二区 | 91中文字幕 | 久久久国产精品久久久 | 国内视频1区 | 日韩激情三级 | 久久国产一区二区三区 | 久久久网 | 日本视频精品 | 国产精品美女视频网站 | 99这里有精品 | 久久伦理电影网 | 国产精品欧美一区二区 | 97夜夜澡人人双人人人喊 | 国产精品va最新国产精品视频 | 久久久久高清 | 久草在线免 | 97超碰人人澡人人爱学生 | 色综合久久中文字幕综合网 | 亚洲免费一级 | 99久久综合精品五月天 | 久久人人添人人爽添人人88v | 综合色站导航 | 免费日韩一区二区三区 | 久草视频免费观 | 欧美色精品天天在线观看视频 | 欧美成人h版在线观看 | 国产精品av一区二区 | 91av蜜桃| 亚洲精品电影在线 | 国产精品无av码在线观看 | 免费在线观看成人小视频 | 成人小视频在线观看免费 | 久久久久网站 | 456成人精品影院 | 天天操夜夜操天天射 | ,午夜性刺激免费看视频 | 九九免费观看全部免费视频 | 国产视频在| 久久天天操 | 一区三区在线欧 | 精品国自产在线观看 | 国产丝袜一区二区三区 | ,午夜性刺激免费看视频 | 综合网天天色 | 精品96久久久久久中文字幕无 | 国产婷婷久久 | 日韩在线视频免费播放 | 97色在线观看 | 香蕉视频最新网址 | 看全黄大色黄大片 | 337p日本欧洲亚洲大胆裸体艺术 | 久久国产精品影视 | 天天操天天插 | 天天操一操 | 操少妇视频 | 亚洲精品视频在线 | 国产精品久久在线观看 | 免费人人干 | 国产香蕉在线 | 日韩色高清 | 亚洲精品色婷婷 | 天天操婷婷 | 国产成人精品一区二区三区网站观看 | 蜜桃传媒一区二区 | 亚洲视频h | 久操视频在线免费看 | 国产视频丨精品|在线观看 国产精品久久久久久久久久久久午夜 | 麻豆播放 | 亚洲精品乱码久久久久久蜜桃不爽 | 探花视频免费观看高清视频 | 久久免费视频播放 | 精品美女视频 | 国内精品亚洲 | 中文字幕在线观看视频一区 | a级国产乱理论片在线观看 伊人宗合网 | 中文av在线播放 | 91av视频 | 精品一区二区三区四区在线 | 91精品久久久久久粉嫩 | 久久精品国产免费看久久精品 | 草久在线观看 | 日韩h在线观看 | 亚洲精品自拍视频在线观看 | 91精品婷婷国产综合久久蝌蚪 | 日韩网站一区二区 | 色av资源网 | 亚洲精品乱码久久久久久蜜桃动漫 | 人人爱人人爽 | 亚洲精品小视频在线观看 | 91在线国内视频 | av免费在线观看1 | 亚洲免费资源 | 中文字幕在线中文 | 久久人人爽人人人人片 | 片网站 | 99久久精品免费看国产免费软件 | 久久综合色综合88 | 美女啪啪图片 | 亚洲欧美综合 | 日韩国产欧美在线视频 | 人人澡人人添人人爽一区二区 | 免费av在线网 | 黄色av电影网 | 欧美日韩大片在线观看 | 成人国产精品一区 | 精品视频网站 | 蜜臀久久99精品久久久酒店新书 | 国产日韩精品一区二区三区在线 | 一区二区三区播放 | 欧美精品久久久久久久免费 | 成人免费一级片 | 国产精品成人一区二区 | 91视频在线免费观看 | 国产精品99久久久久久久久 | 99视频网址 | 亚洲每日更新 | 久久网页| 国产精品久久久久av福利动漫 | 国产男女免费完整视频 | 欧美日韩视频免费 | 国产色网站 | 视频二区在线视频 | 日本中文字幕一二区观 | 色在线网 | 国产乱对白刺激视频在线观看女王 | 亚洲精品tv | 婷婷开心久久网 | 四虎成人免费观看 | 久久在线看 | 国产精品永久久久久久久久久 | 天天操天天综合网 | 中文字幕在线观看第三页 | 91看片网址 | 日韩精品视频免费专区在线播放 | 精品国产伦一区二区三区 | 色婷婷狠狠五月综合天色拍 | 久久免费电影网 | 久久激情五月婷婷 | 午夜av一区二区三区 | 免费av福利 | 一区二区视频电影在线观看 | 久久久免费观看 | 日日草天天干 | 国产精品一区二区av麻豆 | 日韩视频中文字幕 | 蜜臀久久99精品久久久酒店新书 | 日韩欧美高清免费 | 人人爱人人射 | 亚洲资源在线观看 | 日本特黄特色aaa大片免费 | 久久国产免费看 | 欧美一区二区三区四区夜夜大片 | 久久激情小说 | 一区二区久久久久 | 国产aaa免费视频 | 久操视频在线播放 | 国产精品久久片 | 欧美极品少妇xbxb性爽爽视频 | 丰满少妇对白在线偷拍 | 欧美一级片免费在线观看 | 四虎永久免费 | 乱子伦av| 亚洲男男gⅴgay双龙 | 91视频免费看网站 | 日韩中文字幕国产 | 国产精品久久久久久久久久久免费看 | 天堂在线成人 | 9在线观看免费高清完整版 玖玖爱免费视频 | 中文字幕丰满人伦在线 | 97理论片 | 欧美激情综合五月色丁香 | 久久久久久久久福利 | 欧美日韩精品在线 | 日日天天狠狠 | 日本精品在线 | 久久精品三级 | 中日韩三级视频 | 日韩网站免费观看 | 免费av小说 | 一区二区av | 揉bbb玩bbb少妇bbb | 国产高清在线免费观看 | 亚洲中字幕 | 福利网址在线观看 | 久久久精品国产一区二区电影四季 | 精品免费久久 | 丁香五月亚洲综合在线 | 777视频在线观看 | 久久久久女教师免费一区 | 国产破处视频在线播放 | 成人中心免费视频 | 五月婷婷综合激情网 | 日本护士三级少妇三级999 | 久久精品亚洲一区二区三区观看模式 | 久久专区 | 欧美一区二视频在线免费观看 | 免费高清国产 | 精品国产aⅴ麻豆 | 欧美一级久久久久 | 精品一区二区免费视频 | 国产精品久久久777 成人手机在线视频 | 96av麻豆蜜桃一区二区 | 日韩在线播放av | 日韩在线二区 | 亚洲国产美女久久久久 | 99久久精品国产亚洲 | 久久视频精品在线 | 最新中文字幕在线播放 | 国产精品成人一区二区三区吃奶 | 久久美女高清视频 | 中文字幕一区二区三区视频 | 亚洲春色综合另类校园电影 | 亚洲第一区在线播放 | 免费在线看成人av | 成人久久电影 | 日本高清xxxx | 婷婷综合 | 免费观看成年人视频 | 狠狠躁日日躁狂躁夜夜躁 | 亚洲精品视频在线免费播放 | 久久五月网 | 天天色天天操综合网 | 日韩91av | 女人18毛片a级毛片一区二区 | 69精品在线观看 | 欧美少妇bbwhd |