精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

將 YOLOv10 部署至 LiteRT:在 Android 上使用 Google AI Edge 進行目標檢測

人工智能
本文介紹如何將 Ultralytics 的最新 YOLOv10 目標檢測模型轉換和量化為 LiteRT(前稱 TensorFlow Lite)格式,在生成的 LiteRT 模型上運行推理,并將其部署在 Android 上進行實時檢測。

在大型語言模型(LLMs)興起之前,邊緣 AI 是一個熱門話題,這得益于其在設備上直接運行機器學習模型的顯著能力。這并不是說這個話題已經失去了相關性;事實上,許多科技巨頭現在正將注意力轉向在移動平臺上部署 LLMs。

雖然我們今天不會討論生成性 AI,但我們將重新審視經典的計算機視覺任務——目標檢測。這篇博客提供了一個全面的教程,介紹如何將 Ultralytics 的最新 YOLOv10 目標檢測模型轉換和量化為 LiteRT(前稱 TensorFlow Lite)格式,在生成的 LiteRT 模型上運行推理,并將其部署在 Android 上進行實時檢測。

如果你有目標檢測和在設備上部署模型的經驗,你可能想知道為什么 MobileNet SSD 或 EfficientDet Lite 不是最佳選擇。原因如下:

為什么選擇 YOLOv10 而不是其他?

雖然 MobileNet SSD 和 EfficientDet Lite 表現良好,但它們在檢測較小物體時存在困難。然而,YOLOv10 可以快速有效地檢測到較小的物體。

在我們開始之前,讓我們簡要了解一下 YOLOv10 模型以及 LiteRT 是什么。

YOLOv10

作為 YOLO 模型家族的高級版本,YOLOv10 是實時目標檢測任務的最新首選。其增強的架構和訓練技術使其特別適合邊緣部署。

 YOLOv10 模型變體

在所有變體中,納米版本(YOLOv10-N)最適合移動部署,因為它能夠在資源受限的環境中運行。在此處了解更多關于 YOLOv10 的信息。

注意:我們將使用在 COCO 數據集上訓練過的預訓練 YOLOv10-N 模型。

LiteRT

LiteRT,前稱 TensorFlow Lite,是 Google 的高性能設備上 AI 運行時。它允許你輕松地將 TensorFlow、PyTorch 和 JAX 模型轉換并以 TFLite 格式運行。現在你已經有了概覽,讓我們深入編碼部分。這是我們項目的流程:

流程:在 Android 上將 YOLOv10-N 轉換為 LiteRT

步驟 1:模型轉換

幾年前,將 YOLO 模型轉換為 TF Lite 是相當具有挑戰性的,因為模型的復雜步驟和顯著的架構差異。然而,現在情況已不再如此,因為 Ultralytics 現在為你處理了所有的繁重工作。

通過克隆此倉庫開始獲取全部代碼:https://github.com/NSTiwari/YOLOv10-LiteRT-Android

# Install Ultralytics.
!pip install ultralytics

# Load the YOLOv10n model.
model = YOLO("yolov10n.pt")

# Export the model to LiteRT (TF Lite) format.
model.export(format="tflite")

export() 函數接受以下參數:

  • format:模型的輸出格式,如 tflite、onnx、tfjs、openvino、torchscript 等。
  • imgsz:模型輸入的期望圖像大小(高度、寬度)。默認為 640 x 640。
  • int8:啟用模型的 INT8 量化以加快推理速度。默認設置為 false。

你可以根據用例調整許多其他參數,但上面提到的參數現在應該足夠好了。在僅僅兩行代碼中,你可以完全將 YOLO PyTorch 模型轉換為 LiteRT 格式。以下是轉換過程的背景:PyTorch → ONNX 圖 → TensorFlow SavedModel → LiteRT。

步驟 2:解釋 LiteRT 模型

Google AI Edge 提供了模型探索器,這是一個類似于 Netron 的模型可視化工具,提供對模型圖和架構的詳細洞察。

# Install Model Explorer.
!pip install ai-edge-model-explorer

LITE_RT_EXPORT_PATH = "yolov10n_saved_model/" # @param {type : 'string'}
LITE_RT_MODEL = "yolov10n_float16.tflite" # @param {type : 'string'}

LITE_RT_MODEL_PATH = LITE_RT_EXPORT_PATH + LITE_RT_MODEL

# Load the LiteRT model in Model Explorer.
model_explorer.visualize(LITE_RT_MODEL_PATH)

在模型探索器上可視化的 yolov10_float16.tflite

如果你查看輸出張量,你會看到只有一個節點(Identity),形狀為 [1, 300, 6],與 MobileNet SSD 模型不同,后者通常有四個輸出張量。你也可以使用 AI Edge LiteRT 庫來解釋模型。

# Install Google AI Edge LiteRT
!pip install ai-edge-litert

# Load the TF Lite model.
interpreter = Interpreter(model_path = LITE_RT_MODEL_PATH)
interpreter.allocate_tensors()

# Get input and output details.
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()

print(f"Model input size: {input_size}")
print(f"Output tensor shape: {output_details[0]['shape']}")

模型輸入大小為 640,輸出張量形狀 [1, 300, 6] 表示批次大小(1)、每張圖片的最大檢測數量(300)以及值 [xmin, ymin, xmax, ymax, score, class]。

步驟 3:推理轉換后的 LiteRT 模型

現在是推理時間。現在我們已經解釋了模型的架構,我們可以繼續在 Python 上使用 OpenCV 進行推理。

注意:導出的 LiteRT 模型的結果需要后處理,包括歸一化邊界框坐標并將類 ID 映射到相應的標簽。

在 Colab 筆記本中,我包含了一些實用函數來處理所有必需的后處理步驟。

def detect(input_data, is_video_frame=False):
    input_size = input_details[0]['shape'][1]

    if is_video_frame:
        original_height, original_width = input_data.shape[:2]
        image = cv2.cvtColor(input_data, cv2.COLOR_BGR2RGB)
        image = cv2.resize(image, (input_size, input_size))
        image = image / 255.0
    else:
        image, (original_height, original_width) = load_image(input_data, input_size)

    interpreter.set_tensor(input_details[0]['index'], np.expand_dims(image, axis=0).astype(np.float32))
    interpreter.invoke()

    output_data = [interpreter.get_tensor(detail['index']) for detail in output_details]
    return output_data, (original_height, original_width)



# Postprocess the output.
def postprocess_output(output_data, original_dims, labels, confidence_threshold):
  output_tensor = output_data[0]
  detections = []
  original_height, original_width = original_dims

  for i in range(output_tensor.shape[1]):
    box = output_tensor[0, i, :4]
    confidence = output_tensor[0, i, 4]
    class_id = int(output_tensor[0, i, 5])

    if confidence > confidence_threshold:
      x_min = int(box[0] * original_width)
      y_min = int(box[1] * original_height)
      x_max = int(box[2] * original_width)
      y_max = int(box[3] * original_height)

      label_name = labels.get(str(class_id), "Unknown")

      detections.append({
          "box": [y_min, x_min, y_max, x_max],
          "score": confidence,
          "class": class_id,
          "label": label_name
      })

  return detections

Colab 筆記本支持對圖像和視頻進行推理。以下是我獲得的一些結果。

在圖像上的推理

在圖像上的推理

在視頻上的推理

令人印象深刻的是,轉換后的 LiteRT 模型在量化后仍然表現出色,有效地檢測到即使是很小的物體。現在,我們準備將模型部署在 Android 上進行設備上推理。

步驟 4:在 Android 上部署模型

在步驟 1 中,我們克隆了倉庫來運行 Colab 筆記本,其中也包括了一個示例 Android 應用。筆記本中的最后一步讓你可以下載 LiteRT 模型。下載后,將其復制到 Android 應用的 assets 文件夾中。默認文件名為 yolov10n_float16.tflite。如果你使用不同的文件名,請確保相應地更新 Constants.kt 文件中的第 4 行。

// Change this with your TF Lite model name.
const val MODEL_PATH = "yolov10n_float16.tflite" 

Detector.kt 文件包含執行推理的邏輯,以及提取檢測到的對象的邊界框、置信度得分和標簽。

// Detects the objects.
class Detector(
    private val context: Context,
    private val modelPath: String,
    private val labelPath: String?,
    private val detectorListener: DetectorListener,
    private val message: (String) -> Unit
) {
    private var interpreter: Interpreter
    private var labels = mutableListOf<String>()

    private var tensorWidth = 0
    private var tensorHeight = 0
    private var numChannel = 0
    private var numElements = 0

    private val imageProcessor = ImageProcessor.Builder()
        .add(NormalizeOp(INPUT_MEAN, INPUT_STANDARD_DEVIATION))
        .add(CastOp(INPUT_IMAGE_TYPE))
        .build()

    init {
        val options = Interpreter.Options().apply{
            this.setNumThreads(4)
        }

        val model = FileUtil.loadMappedFile(context, modelPath)
        interpreter = Interpreter(model, options)

        labels.addAll(extractNamesFromMetadata(model))
        if (labels.isEmpty()) {
            if (labelPath == null) {
                message("Model not contains metadata, provide LABELS_PATH in Constants.kt")
                labels.addAll(MetaData.TEMP_CLASSES)
            } else {
                labels.addAll(extractNamesFromLabelFile(context, labelPath))
            }
        }

        labels.forEach(::println)

        val inputShape = interpreter.getInputTensor(0)?.shape()
        val outputShape = interpreter.getOutputTensor(0)?.shape()

        if (inputShape != null) {
            tensorWidth = inputShape[1]
            tensorHeight = inputShape[2]

            // If in case input shape is in format of [1, 3, ..., ...]
            if (inputShape[1] == 3) {
                tensorWidth = inputShape[2]
                tensorHeight = inputShape[3]
            }
        }

        if (outputShape != null) {
            numElements = outputShape[1]
            numChannel = outputShape[2]
        }
    }

// Extracts bounding box, label, confidence.
private fun bestBox(array: FloatArray) : List<BoundingBox> {
    val boundingBoxes = mutableListOf<BoundingBox>()
    for (r in 0 until numElements) {
        val cnf = array[r * numChannel + 4]
        if (cnf > CONFIDENCE_THRESHOLD) {
            val x1 = array[r * numChannel]
            val y1 = array[r * numChannel + 1]
            val x2 = array[r * numChannel + 2]
            val y2 = array[r * numChannel + 3]
            val cls = array[r * numChannel + 5].toInt()
            val clsName = labels[cls]
            boundingBoxes.add(
                BoundingBox(
                    x1 = x1, y1 = y1, x2 = x2, y2 = y2,
                    cnf = cnf, cls = cls, clsName = clsName
                )
            )
        }
    }
    return boundingBoxes
}

之后,OverlayView.kt 歸一化邊界框坐標并將它們疊加在攝像頭流上以可視化結果。

class OverlayView(context: Context?, attrs: AttributeSet?) : View(context, attrs) {

    private var results = listOf<BoundingBox>()
    private val boxPaint = Paint()
    private val textBackgroundPaint = Paint()
    private val textPaint = Paint()

    private var bounds = Rect()
    private val colorMap = mutableMapOf<String, Int>()

    init {
        initPaints()
    }

    fun clear() {
        results = listOf()
        textPaint.reset()
        textBackgroundPaint.reset()
        boxPaint.reset()
        invalidate()
        initPaints()
    }

    private fun initPaints() {
        textBackgroundPaint.color = Color.WHITE
        textBackgroundPaint.style = Paint.Style.FILL
        textBackgroundPaint.textSize = 42f

        textPaint.color = Color.WHITE
        textPaint.style = Paint.Style.FILL
        textPaint.textSize = 42f
    }

    override fun draw(canvas: Canvas) {
        super.draw(canvas)

        results.forEach { boundingBox ->
            // Get or create a color for this label
            val color = getColorForLabel(boundingBox.clsName)
            boxPaint.color = color
            boxPaint.strokeWidth = 8F
            boxPaint.style = Paint.Style.STROKE

            val left = boundingBox.x1 * width
            val top = boundingBox.y1 * height
            val right = boundingBox.x2 * width
            val bottom = boundingBox.y2 * height

            canvas.drawRoundRect(left, top, right, bottom, 16f, 16f, boxPaint)

            val drawableText = "${boundingBox.clsName} ${Math.round(boundingBox.cnf * 100.0) / 100.0}"

            textBackgroundPaint.getTextBounds(drawableText, 0, drawableText.length, bounds)
            val textWidth = bounds.width()
            val textHeight = bounds.height()

            val textBackgroundRect = RectF(
                left,
                top,
                left + textWidth + BOUNDING_RECT_TEXT_PADDING,
                top + textHeight + BOUNDING_RECT_TEXT_PADDING
            )
            textBackgroundPaint.color = color // Set background color same as bounding box
            canvas.drawRoundRect(textBackgroundRect, 8f, 8f, textBackgroundPaint)

            canvas.drawText(drawableText, left, top + textHeight, textPaint)
        }
    }

    private fun getColorForLabel(label: String): Int {
        return colorMap.getOrPut(label) {
            // Generate a random color or you can use a predefined set of colors
            Color.rgb((0..255).random(), (0..255).random(), (0..255).random())
        }
    }

    fun setResults(boundingBoxes: List<BoundingBox>) {
        results = boundingBoxes
        invalidate()
    }

    companion object {
        private const val BOUNDING_RECT_TEXT_PADDING = 8
    }
}

最后,在 Android Studio 中打開項目,構建它,然后將手機連接起來安裝應用。這是 Android 上的最終輸出。推理時間接近 300 毫秒。

Android 上的實時目標檢測

責任編輯:趙寧寧 來源: 小白玩轉Python
相關推薦

2024-08-22 12:49:02

2024-07-03 09:39:52

2024-05-27 09:27:02

2024-09-09 16:35:10

YOLO模型

2024-12-03 15:25:27

2024-05-29 09:25:38

2023-05-09 10:16:42

人工智能python版本

2024-11-29 16:10:31

2024-11-27 16:06:12

2025-01-06 08:20:00

YOLOv11目標檢測Python

2025-01-22 11:10:34

2025-02-18 08:00:00

C++YOLO目標檢測

2024-10-14 17:43:05

2024-11-06 16:56:51

2024-05-28 14:46:00

2022-10-14 16:18:40

MobileNetAndroid端模型訓練

2024-11-08 15:37:47

2024-07-22 13:49:38

YOLOv8目標檢測開發

2024-05-06 13:34:28

WireGoogleGo

2023-05-11 11:27:49

AI 助手谷歌
點贊
收藏

51CTO技術棧公眾號

成人免费看的视频| 成人免费播放视频| 蜜桃av免费看| 免费在线毛片网站| 欧美交a欧美精品喷水| 国产精品区一区二区三区| 欧美激情免费看| 亚洲一区二区三区涩| 国产午夜福利一区二区| 欧美视频精品全部免费观看| 国产亚洲人成网站| 国内免费精品永久在线视频| 亚洲精品乱码久久久久久动漫| 免费一级在线观看播放网址| 野花国产精品入口| 欧美精品一区二区三区蜜臀| 国产在线观看欧美| 精品国产av一区二区| 99精品美女| 精品1区2区3区| 日韩资源av在线| xxxx日本少妇| 久久精品九色| 色屁屁一区二区| 欧美久久在线| 亚洲欧美综合另类| 国产精品一区高清| 色综合天天天天做夜夜夜夜做| 精品一区二区国产| 日韩少妇裸体做爰视频| 高潮按摩久久久久久av免费| 亚洲制服欧美中文字幕中文字幕| 99免费在线观看视频| 久草网在线观看| 91精品啪在线观看国产手机 | 色综合色综合色综合| 精品无码av无码免费专区| 国产午夜在线视频| 蜜桃一区二区三区在线| 最近2019中文免费高清视频观看www99 | 国产精品av电影| 波多野结衣av在线观看| 亚州一区二区三区| 中文字幕精品—区二区四季| 国产精品网红直播| 日本黄色片免费观看| 综合欧美亚洲| 91精品欧美综合在线观看最新 | 99国产超薄肉色丝袜交足的后果 | 黄色aa久久| 91丨国产丨九色丨pron| 欧美亚洲另类在线| 老牛影视av老牛影视av| 欧美性生活一级片| 亚洲第一精品夜夜躁人人爽| 波多野结衣家庭教师在线| 裸体xxxx视频在线| 久久先锋资源网| 国产欧美精品一区二区三区介绍| 在线观看国产区| 欧美1区2区| 亚洲精品自拍第一页| 日韩手机在线观看视频| 麻豆传媒在线观看| 国产精品久久久久久久久快鸭 | 91精品国产91久久| 国产精品一二三区在线观看| 亚洲伊人春色| 91精品国产综合久久福利| 免费av手机在线观看| 成人综合影院| 成人永久免费视频| 韩国成人一区| 黄视频在线观看免费| 国产精品综合二区| 欧美一区亚洲一区| 国产午夜无码视频在线观看| 欧美午夜不卡影院在线观看完整版免费| 亚洲国产精品久久91精品| 又黄又爽的网站| 91精品国产一区二区在线观看| 亚洲国产成人av网| 宅男噜噜99国产精品观看免费| 日韩一级片免费看| 麻豆免费在线观看| 国产xxxxhd| 亚洲一区在线观| 欧美日韩123| 欧美调教femdomvk| 2022亚洲天堂| www在线视频| 国产农村妇女精品| 精品视频第一区| www日韩tube| 亚洲精品国产一区二区精华液| 久久久久一区二区| 草草视频在线播放| 91美女片黄在线观看| 亚洲精品欧美精品| 国产人妻精品午夜福利免费| 久久99精品久久久久久青青日本| 免费视频网站在线观看入口| 久久er精品视频| 欧美性受xxxx白人性爽| 中文字幕理论片| 欧美亚洲二区| 国产成人无码专区| 尤蜜粉嫩av国产一区二区三区| 韩国欧美亚洲国产| 国产日韩在线观看av| 久久久久成人网站| 看黄网站在线| 中文字幕无码不卡免费视频| 免费看毛片的网址| 日韩欧美三级在线观看| 久久国产视频精品| av资源站久久亚洲| 亚洲精品国产91| 午夜精品视频| 538国产精品视频一区二区| 日本丰满少妇做爰爽爽| 成人一区二区在线观看| 水蜜桃亚洲精品| 男女做爰猛烈刺激| 欧美亚洲国产激情| 日韩一区二区视频| 亚洲免费一级视频| 亚洲成人va| 欧美亚洲国产一区二区三区va| 成人做爰69片免费| 我不卡神马影院| 国产精品中文久久久久久久| 欧洲免费在线视频| 久久久久88色偷偷免费| 色一情一乱一伦一区二区三区丨 | 中文字幕久久精品一区二区| 中文字幕日韩有码| 亚洲精品自拍视频在线观看| 国产精品成人a在线观看| 国产91精品黑色丝袜高跟鞋| 动漫av一区二区三区| 成人av在线影院| 久久综合入口| 在线观看免费版| 日韩毛片高清在线播放| 亚洲视频精品一区| 美女18一级毛片一品久道久久综合| 色狠狠色噜噜噜综合网| 波多野结衣视频播放| 欧美精品一卡| 5566中文字幕一区二区| 免费看av毛片| 亚洲一区二区av在线| 黄色免费观看视频网站| 嫩草国产精品入口| 国语自产精品视频在线看| 丰满人妻一区二区三区无码av| 亚洲精品高清视频在线观看| 伊人国产精品视频| 国产精品大片| 国产精品欧美日韩一区二区| www.久久成人| 亚洲已满18点击进入久久| 天堂va欧美va亚洲va老司机| 国产综合网站| 久久亚洲国产精品日日av夜夜| 性爽视频在线| 91精品国产乱码| 亚洲精品日韩在线观看| 在线视频不卡国产| av电影在线网| 欧美日韩精品一区二区三区| 成人免费视频久久| 日韩免费高清视频网站| 亚洲毛片在线看| 手机在线看片1024| 国产福利91精品一区| 蜜桃日韩视频| 影视一区二区三区| 久久精品国产精品亚洲| 中文字幕一区在线播放| 久久精品视频免费| 狠狠操狠狠干视频| 亚洲肉体裸体xxxx137| 国产精品aaa| 成人ww免费完整版在线观看| 精品国产123| 黄色片视频免费| 成人欧美一区二区三区1314 | 另类小说视频一区二区| 国产欧美日韩在线播放| jizzjizz亚洲| 亚洲精品456在线播放狼人| 久久国产波多野结衣| 国产成人在线看| 波多野结衣作品集| 欧美+日本+国产+在线a∨观看| 女同一区二区| 日韩精品视频中文字幕| 国产91精品最新在线播放| 国产91绿帽单男绿奴| 狠狠色噜噜狠狠狠狠97| 国产成人精品无码片区在线| 久久国产欧美日韩精品| 免费不卡av在线| caoporn成人免费视频在线| 爱福利视频一区| 伊人网中文字幕| 香港成人在线视频| 中文字幕一区二区三区乱码不卡| 欧美 亚欧 日韩视频在线 | 午夜av一区| 欧美成人第一区| 91夜夜蜜桃臀一区二区三区| 国产精品久久久久久久久久久新郎 | 在线中文免费视频| 日韩一级视频免费观看在线| 波多野结衣 久久| 亚洲制服丝袜在线| 小早川怜子一区二区的演员表| 久久国产精品免费| 国产 福利 在线| 正在播放日韩欧美一页| 91久久精品国产91久久性色tv | 欧美不卡一区| 亚洲人一区二区| 国产亚洲一区| 麻豆91av| 九九热hot精品视频在线播放| 欧美精品激情在线| 无码国精品一区二区免费蜜桃| 欧美日韩亚洲91| 国产在线视频卡一卡二| 亚洲欧美另类在线| 亚洲免费观看在线| 国产免费成人| 午夜精品亚洲一区二区三区嫩草 | 久久香蕉综合色| 久久综合社区| 国产乱码精品一区二区三区日韩精品| 男人av在线播放| 尤物tv国产一区| 国产美女永久免费| 午夜精品久久久久久久久| 久久久久久久久久久久久女过产乱| 日本一区免费视频| 中文字幕高清视频| 麻豆精品在线看| 搡女人真爽免费午夜网站| 另类国产ts人妖高潮视频| 亚洲精品国产一区| 久久精品国产99久久| aaa级精品久久久国产片| 久久丁香四色| www.久久草| 久久久久影视| 久久精品成人一区二区三区蜜臀 | 一区二区视频免费看| 亚洲另类中文字| 欧美激情精品久久| 亚洲国产精品嫩草影院| 国产成人无码精品亚洲| 欧美性猛交丰臀xxxxx网站| 亚洲色图27p| 亚洲精品中文字幕乱码三区 | 欧美在线视屏| 日韩小视频网站| 亚洲综合丁香| 日本一道在线观看| 国产成人三级| 五月天国产一区| 久久久9色精品国产一区二区三区| 国产日韩精品推荐| 亚洲资源网你懂的| 亚洲日本欧美在线| 91精品精品| 欧美啪啪免费视频| 日本aⅴ亚洲精品中文乱码| www污在线观看| 亚洲欧美日韩国产一区二区| 国产免费视频传媒| 国产精品99久| 国产精品毛片一区二区| 国产精品国产成人国产三级| 丰满少妇高潮久久三区| 中文字幕第一区二区| 欧美成欧美va| 一本色道久久加勒比精品| 亚洲无码久久久久| 欧美精品一区二区三区久久久 | 久久久久久久综合色一本| 在线观看天堂av| 天天影视涩香欲综合网| 免费无遮挡无码永久在线观看视频| 欧美日韩国产精品专区 | 午夜精产品一区二区在线观看的| 中文字幕一区二区不卡| 日韩精品一区二区av| 亚洲影院理伦片| 国产精品欧美综合| 精品久久久久久久久久久久包黑料| 99久久亚洲精品日本无码| 一本色道综合亚洲| 国产丰满果冻videossex| 精品亚洲一区二区三区在线观看| 男人天堂久久久| 欧美激情奇米色| 亚洲午夜国产成人| 久久综合九色欧美狠狠| 国产在线成人| 成年人三级黄色片| 久久只精品国产| 精品97人妻无码中文永久在线| 欧美中文字幕久久| 中文字幕福利视频| 日韩精品黄色网| 日韩精品视频无播放器在线看 | 日韩欧美国产小视频| av一级黄色片| 国产一区二区成人| 成人免费视频| 88xx成人精品| 菁菁伊人国产精品| 小泽玛利亚av在线| 麻豆免费看一区二区三区| 天堂久久久久久| 久久精品亚洲精品国产欧美kt∨| 69av.com| 欧美一级在线观看| 色网站免费在线观看| 色偷偷88888欧美精品久久久| 亚洲一区资源| 国产专区一区二区三区| 欧美破处大片在线视频| 中文字幕第三区| 亚洲欧美另类久久久精品2019| 中文字幕一区二区免费| 亚洲视频在线免费观看| 三级外国片在线观看视频| 国产精品av电影| 国产一区二区三区四区| 日韩一级免费在线观看| 久久久91精品国产一区二区三区| 人妻 日韩精品 中文字幕| 亚洲精品一区在线观看香蕉| 午夜激情电影在线播放| 久久亚裔精品欧美| 蜜桃av综合| 国产又粗又猛又爽又黄的视频四季| 亚洲同性gay激情无套| 中文字幕欧美人妻精品一区蜜臀| 亚洲亚裔videos黑人hd| 日本h片久久| 一本一道久久a久久综合精品| 美国十次了思思久久精品导航| 黄色片在线观看免费| 一区二区三区视频在线观看| 国产免费高清av| 免费不卡在线观看av| av日韩中文| 成人黄色av播放免费| 偷拍一区二区| 亚洲精品偷拍视频| 久久午夜精品| 古装做爰无遮挡三级聊斋艳谭| 97国产一区二区| 紧身裙女教师波多野结衣| 日韩视频免费观看高清在线视频| 99在线视频观看| www.成人av.com| 国产偷自视频区视频一区二区| 丰满少妇高潮一区二区| 欧美视频在线一区| 成人免费观看视频大全| 国产精品国产亚洲精品看不卡15| 亚洲美女色禁图| 538精品视频| 欧美日韩免费在线| 国产在线高清| 91在线看www| 色婷婷色综合| 无码人妻丰满熟妇区五十路百度| 日本一区二区三区dvd视频在线| 91黄色在线视频| 中文字幕一区日韩电影| 在线视频亚洲欧美中文| 丝袜老师办公室里做好紧好爽| 国产精品污www在线观看| 精品国产九九九| 国产精品av免费在线观看| 自拍欧美日韩| 90岁老太婆乱淫| 欧美刺激脚交jootjob| 午夜日韩成人影院| 免费一区二区三区在在线视频| 麻豆91在线播放免费| 日本三级片在线观看| 俺也去精品视频在线观看| 久久亚州av| 国内av一区二区|