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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人工智能 > ChatGpt >内容正文

ChatGpt

边缘计算 ai_在边缘探索AI!

發(fā)布時間:2023/11/29 ChatGpt 137 豆豆
生活随笔 收集整理的這篇文章主要介紹了 边缘计算 ai_在边缘探索AI! 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

邊緣計算 ai

介紹 (Introduction)

What is Edge (or Fog) Computing?

什么是邊緣(或霧)計算?

Gartner defines edge computing as: “a part of a distributed computing topology in which information processing is located close to the edge — where things and people produce or consume that information.”

Gartner將邊緣計算定義為:“分布式計算拓?fù)涞囊徊糠?#xff0c;其中信息處理位于邊緣附近-事物和人在此處生成或消費該信息。”

In other words, edge computing brings computation (and some data storage) closer to the devices where it’s data are being generated or consumed (especially in real-time), rather than relying on a cloud-based central system far away. With this approach, data does not suffer latency issues, reducing the amount of cost in transmission and processing. In a way, it is a kind of “return to the recent past,” where all the computational work was done locally on a desktop and not in the cloud.

換句話說,邊緣計算使計算(和一些數(shù)據(jù)存儲)更靠近要生成或使用其數(shù)據(jù)(特別是實時)的設(shè)備,而不是依賴于遙遠的基于云的中央系統(tǒng)。 使用這種方法,數(shù)據(jù)不會出現(xiàn)延遲問題,從而減少了傳輸和處理的成本。 從某種意義上說,這是一種“回到最近的過去”,其中所有計算工作都在桌面上而不是在云中本地完成。

Edge computing was developed due to the exponential growth of IoT devices connected to the internet for either receiving information from the cloud or delivering data back to the cloud. And many Internet of Things (IoT) devices generate enormous amounts of data during their operations.

邊緣計算的開發(fā)是由于連接到Internet的IoT設(shè)備呈指數(shù)級增長,以便從云中接收信息或?qū)?shù)據(jù)傳遞回云中。 許多物聯(lián)網(wǎng)(IoT)設(shè)備在其運行期間會生成大量數(shù)據(jù)。

Edge computing provides new possibilities in IoT applications, particularly for those relying on machine learning (ML) for tasks such as object and pose detection, image (and face) recognition, language processing, and obstacle avoidance. Image data is an excellent addition to IoT, but also a significant resource consumer (as power, memory, and processing). Image processing “at the Edge”, running classics AI/ML models, is a great leap!

邊緣計算為物聯(lián)網(wǎng)應(yīng)用提供了新的可能性,尤其是對于那些依靠機器學(xué)習(xí)(ML)完成諸如對象和姿態(tài)檢測,圖像(和面部)識別,語言處理以及避障等任務(wù)的應(yīng)用。 圖像數(shù)據(jù)是IoT的絕佳補充,同時也是重要的資源消耗者(如電源,內(nèi)存和處理)。 運行經(jīng)典AI / ML模型的“邊緣”圖像處理是一個巨大的飛躍!

Tensorflow Lite-機器學(xué)習(xí)(ML)處于邊緣!! (Tensorflow Lite - Machine Learning (ML) at the edge!!)

Machine Learning Training versus Inference — Gartner機器學(xué)習(xí)訓(xùn)練與推理 — Gartner

Machine Learning can be divided into two separated process: Training and Inference, as explained in Gartner Blog:

機器學(xué)習(xí)可以分為兩個獨立的過程:訓(xùn)練和推理,如Gartner Blog中所述 :

  • Training: Training refers to the process of creating a machine learning algorithm. Training involves using a deep-learning framework (e.g., TensorFlow) and training dataset (see the left-hand side of the above figure). IoT data provides a source of training data that data scientists and engineers can use to train machine learning models for various cases, from failure detection to consumer intelligence.

    培訓(xùn):培訓(xùn)是指創(chuàng)建機器學(xué)習(xí)算法的過程。 培訓(xùn)涉及使用深度學(xué)習(xí)框架(例如TensorFlow)和培訓(xùn)數(shù)據(jù)集(請參見上圖的左側(cè))。 物聯(lián)網(wǎng)數(shù)據(jù)提供了訓(xùn)練數(shù)據(jù)的來源,數(shù)據(jù)科學(xué)家和工程師可以使用該數(shù)據(jù)來訓(xùn)練從故障檢測到消費者智能的各種情況下的機器學(xué)習(xí)模型。

  • Inference: Inference refers to the process of using a trained machine-learning algorithm to make a prediction. IoT data can be used as the input to a trained machine learning model, enabling predictions that can guide decision logic on the device, at the edge gateway, or elsewhere in the IoT system (see the right-hand side of the above figure).

    推論:推論是指使用經(jīng)過訓(xùn)練的機器學(xué)習(xí)算法進行預(yù)測的過程。 IoT數(shù)據(jù)可以用作訓(xùn)練有素的機器學(xué)習(xí)模型的輸入,從而啟用可以指導(dǎo)設(shè)備,邊緣網(wǎng)關(guān)或IoT系統(tǒng)中其他位置的決策邏輯的預(yù)測(請參見上圖的右側(cè))。

TensorFlow Lite is an open-source deep learning framework that enables on-device machine learning inference with low latency and small binary size. It is designed to make it easy to perform machine learning on devices, “at the edge” of the network, instead of sending data back and forth from a server.

TensorFlow Lite是一個開源深度學(xué)習(xí)框架,可實現(xiàn)低延遲和小二進制大小的設(shè)備上機器學(xué)習(xí)推理 。 它旨在簡化在“網(wǎng)絡(luò)邊緣”的設(shè)備上執(zhí)行機器學(xué)習(xí)的過程,而不是從服務(wù)器來回發(fā)送數(shù)據(jù)。

Performing machine learning on-device can help to improve:

在設(shè)備上執(zhí)行機器學(xué)習(xí)可以幫助改善:

  • Latency: there’s no round-trip to a server

    延遲:服務(wù)器之間沒有往返

  • Privacy: no data needs to leave the device

    隱私權(quán):無需任何數(shù)據(jù)即可離開設(shè)備

  • Connectivity: an Internet connection isn’t required

    連接性:不需要Internet連接

  • Power consumption: network connections are power-hungry

    功耗:網(wǎng)絡(luò)連接耗電

TensorFlow Lite (TFLite) consists of two main components:

TensorFlow Lite(TFLite)包含兩個主要組件:

  • The TFLite converter, which converts TensorFlow models into an efficient form for use by the interpreter, and can introduce optimizations to improve binary size and performance.

    TFLite轉(zhuǎn)換器將TensorFlow模型轉(zhuǎn)換為供解釋器使用的有效形式,并且可以引入優(yōu)化以改善二進制大小和性能。

  • The TFLite interpreter runs with specially optimized models on many different hardware types, including mobile phones, embedded Linux devices, and microcontrollers.

    TFLite解釋器在許多不同的硬件類型(包括移動電話,嵌入式Linux設(shè)備和微控制器)上以經(jīng)過特殊優(yōu)化的模型運行。

Image source: TensorFlow Lite — Deploying model at the edge devices圖片來源:TensorFlow Lite —在邊緣設(shè)備上部署模型

In summary, a trained and saved TensorFlow model (like model.h5) can be converted using TFLite Converter in a TFLite FlatBuffer (like model.tflite) that will be used by TF Lite Interpreter inside the Edge device (as a Raspberry Pi), to perform inference on a new data.

總之,可以在TFLite FlatBuffer(例如model.tflite )中使用TFLite Converter轉(zhuǎn)換經(jīng)過訓(xùn)練并保存的TensorFlow模型(例如model.h5 ),該工具將由Edge設(shè)備(作為Raspberry Pi)中的TF Lite Interpreter使用,對新數(shù)據(jù)進行推斷。

For example, I trained from scratch a simple CNN Image Classification model in my Mac (the “Server” on the above figure). The final model had 225,610 parameters to be trained, using as input the CIFAR10 dataset: 60,000 images (shape: 32, 32, 3). The trained model (cifar10_model.h5) had a size of 2.7Mb. Using the TFLite Converter, the model used on Raspberry Pi (model_cifar10.tflite) became with 905Kb (around 1/3 of original size). Making inference with both models (.h5 at Mac and .tflite at RPi) leaves the same results. Both notebooks can be found at GitHub.

例如,我從頭開始在Mac中訓(xùn)練了一個簡單的CNN圖像分類模型(上圖為“服務(wù)器”)。 最終模型具有225,610個要訓(xùn)練的參數(shù),使用CIFAR10數(shù)據(jù)集作為輸入:60,000張圖像(形狀:32、32、3)。 經(jīng)過訓(xùn)練的模型( cifar10_model.h5 )的大小為2.7Mb。 使用TFLite Converter,在Raspberry Pi上使用的模型( model_cifar10.tflite )變?yōu)?05Kb(約為原始大小的1/3)。 兩種模型(Mac上為.h5,RPi上為.tflite)進行推斷,結(jié)果相同。 這兩個筆記本都可以在GitHub上找到 。

Images source: Author Notebooks圖片來源:作者筆記本

Raspberry Pi — TFLite安裝 (Raspberry Pi — TFLite Installation)

It is also possible to train models from scratch at Raspberry Pi, and for that, the full TensorFlow package is needed. But once what we will do is only the inference part, we will install just the TensorFlow Lite interpreter.

還可以在Raspberry Pi上從頭開始訓(xùn)練模型,為此,需要完整的TensorFlow軟件包。 但是一旦我們要做的只是推理部分,我們將僅安裝TensorFlow Lite解釋器。

The interpreter-only package is a fraction the size of the full TensorFlow package and includes the bare minimum code required to run inferences with TensorFlow Lite. It includes only the tf.lite.InterpreterPython class, used to execute .tflite models.

僅限解釋器的軟件包僅是完整TensorFlow軟件包的一小部分,并且包括使用TensorFlow Lite進行推理所需的最少代碼。 它僅包含用于執(zhí)行.tflite模型的tf.lite.Interpreter Python類。

Let’s open the terminal at Raspberry Pi and install the Python wheel needed for your specific system configuration. The options can be found on this link: Python Quickstart. For example, in my case, I am running Linux ARM32 (Raspbian Buster — Python 3.7), so the command line is:

讓我們在Raspberry Pi上打開終端并安裝特定系統(tǒng)配置所需的Python輪子 。 可在以下鏈接上找到這些選項: Python Quickstart 。 例如,以我為例,我正在運行Linux ARM32(Raspbian Buster-Python 3.7),因此命令行為:

$ sudo pip3 install https://dl.google.com/coral/python/tflite_runtime-2.1.0.post1-cp37-cp37m-linux_armv7l.whl

If you want to double-check what OS version you have in your Raspberry Pi, run the command:

如果要仔細檢查Raspberry Pi中的操作系統(tǒng)版本,請運行以下命令:

$ uname -

As shown on image below, if you get …arm7l…, the operating system is a 32bits Linux.

如下圖所示,如果得到… arm7l… ,則操作系統(tǒng)是32位Linux。

Installing the Python wheel is the only requirement for having TFLite interpreter working in a Raspberry Pi. It is possible to double-check if the installation is OK, calling the TFLite interpreter at the terminal, as below. If no errors appear, we are good.

在Raspberry Pi中運行TFLite解釋器是安裝Python輪子的唯一要求。 如下所示,可以在終端上調(diào)用TFLite解釋器來仔細檢查安裝是否正常。 如果沒有錯誤出現(xiàn),那就很好。

影像分類 (Image Classification)

介紹 (Introduction)

One of the more classic tasks of IA applied to Computer Vision (CV) is Image Classification. Starting on 2012, IA and Deep Learning (DL) changed forever, when a convolutional neural network (CNN) called AlexNet (in honor of its leading developer, Alex Krizhevsky), achieved a top-5 error of 15.3% in the ImageNet 2012 Challenge. According to The Economist, “Suddenly people started to pay attention (in DL), not just within the AI community but across the technology industry as a whole

IA應(yīng)用于計算機視覺(CV)的最經(jīng)典的任務(wù)之一是圖像分類。 從2012年開始,IA和深度學(xué)習(xí)(DL)發(fā)生了翻天覆地的變化,當(dāng)時稱為AlexNet的卷積神經(jīng)網(wǎng)絡(luò) (CNN)(以其領(lǐng)先的開發(fā)人員Alex Krizhevsky表示敬意)在ImageNet 2012挑戰(zhàn)賽中獲得前5名錯誤,錯誤率達15.??3% 。 根據(jù)《經(jīng)濟學(xué)人 》雜志的說法,“突然之間,人們開始關(guān)注(DL),不僅是在AI社區(qū)內(nèi)部,而且是整個技術(shù)行業(yè)

This project, almost eight years after Alex Krizhevsk, a more modern architecture (MobileNet), was also pre-trained over millions of images, using the same dataset ImageNet, resulting in 1,000 different classes. This pre-trained and quantized model was so, converted in a .tflite and used here.

這個項目比Alex Krizhevsk(一種更現(xiàn)代的體系結(jié)構(gòu),即MobileNet )落后了將近八年,它使用相同的數(shù)據(jù)集ImageNet對數(shù)百萬張圖像進行了預(yù)訓(xùn)練,產(chǎn)生了1,000個不同的類。 這樣就對這個經(jīng)過預(yù)先訓(xùn)練和量化的模型進行了轉(zhuǎn)換,將其轉(zhuǎn)換為.tflite并在此處使用。

Image source: Author creation圖片來源:作者創(chuàng)作

First, let’s on Raspberry Pi move to a working directory (for example, Image_Recognition). Next, it is essential to create two subdirectories, one for models and another for images:

首先,讓我們在Raspberry Pi上移動到工作目錄(例如Image_Recognition )。 接下來,必須創(chuàng)建兩個子目錄,一個用于模型,另一個用于圖像:

$ mkdir images
$ mkdir models

Once inside the model’s directory, let’s download the pre-trained model (in this link, it is possible to download several different models). We will use a quantized Mobilenet V1 model, pre-trained with images of 224x224 pixels. The zip file that can be downloaded from TensorFlow Lite Image classification, using wget:

進入模型目錄后,讓我們下載預(yù)先訓(xùn)練的模型(在此鏈接中 ,可以下載幾個不同的模型)。 我們將使用量化的Mobilenet V1模型,該模型預(yù)先訓(xùn)練有224x224像素的圖像。 可以使用wget從TensorFlow Lite圖像分類下載的zip文件:

$ cd models
$ wget https://storage.googleapis.com/download.tensorflow.org/models/tflite/mobilenet_v1_1.0_224_quant_and_labels.zip

Next, unzip the file:

接下來,解壓縮文件:

$ unzip mobilenet_v1_1.0_224_quant_and_labels

Two files are downloaded:

已下載兩個文件:

  • mobilenet_v1_1.0_224_quant.tflite: TensorFlow-Lite transformed model

    mobilenet_v1_1.0_224_quant.tflite :TensorFlow-Lite轉(zhuǎn)換模型

  • labels_mobilenet_quant_v1_224.txt: The ImageNet dataset 1,000 Classes Labels

    labels_mobilenet_quant_v1_224.txt :ImageNet數(shù)據(jù)集1,000個類的標(biāo)簽

Now, get some images (for example, .png, .jpg) and save them on the created images subdirectory.

現(xiàn)在,獲取一些圖像(例如,.png,.jpg)并將其保存在創(chuàng)建的圖像子目錄中。

On GitHub, it is possible to find the images used on this tutorial.

在GitHub上 ,可以找到本教程中使用的圖像。

Raspberry Pi OpenCV和Jupyter Notebook安裝 (Raspberry Pi OpenCV and Jupyter Notebook installation)

OpenCV (Open Source Computer Vision Library) is an open-source computer vision and machine learning software library. It is beneficial as a support when working with images. If very simple to install it on a Mac or PC is a little bit “trick” to do it on a Raspberry Pi, but I recommend to use it.

OpenCV(開源計算機視覺庫)是一個開源計算機視覺和機器學(xué)習(xí)軟件庫。 在處理圖像時作為支持很有用。 如果在Mac或PC上安裝它非常簡單,那么在Raspberry Pi上安裝它有點“技巧”,但是我建議您使用它。

Please follow this great tutorial from Q-Engineering to install OpenCV on your Raspberry Pi: Install OpenCV 4.4.0 on Raspberry Pi 4. Although written for the Raspberry Pi 4, the guide can also be used without any change for the Raspberry 3 or 2.

請按照Q-Engineering的出色教程在Raspberry Pi上安裝OpenCV:在Raspberry Pi 4上安裝OpenCV 4.4.0。盡管是為Raspberry Pi 4編寫的,但該指南也可用于Raspberry 3或2而無需做任何更改。 。

Next, Install Jupyter Notebook. It will be our development platform.

接下來,安裝Jupyter Notebook。 這將是我們的發(fā)展平臺。

$ sudo pip3 install jupyter
$ jupyter notebook

Also, during OpenCV installation, NumPy should have been installed, if not do it now, same with MatPlotLib.

另外,在OpenCV安裝過程中,應(yīng)該立即安裝NumPy(如果現(xiàn)在不這樣做),與MatPlotLib相同。

$ sudo pip3 install numpy
$ sudo apt-get install python3-matplotlib

And it is done! We have everything in place to start our AI journey to the Edge!

完成了! 我們擁有一切準(zhǔn)備就緒,可以開始我們的AI邊緣之旅!

圖像分類推論 (Image Classification Inference)

Create a fresh Jupyter Notebook and follow bellow steps, or download the complete notebook from GitHub.

創(chuàng)建一個新的Jupyter Notebook,并按照以下步驟操作,或者從GitHub下載完整的筆記本。

Import Libraries:

導(dǎo)入庫:

import numpy as np
import matplotlib.pyplot as plt
import cv2
import tflite_runtime.interpreter as tflite

Load TFLite model and allocate tensors:

加載TFLite模型并分配張量:

interpreter = tflite.Interpreter(model_path=’./models/mobilenet_v1_1.0_224_quant.tflite’)
interpreter.allocate_tensors()

Get input and output tensors:

獲取輸入和輸出張量:

input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()

input details will give you the info needed about how the model should be feed with an image:

輸入詳細信息將為您提供有關(guān)應(yīng)如何向模型中添加圖像的信息:

The shape of (1, 224x224x3), informs that an image with dimensions: (224x224x3) should be input one by one (Batch Dimension: 1). The dtype uint8, tells that the values are 8bits integers

形狀為(1,224x224x3)的圖像應(yīng)尺寸為(224x224x3)的圖像一一輸入(批尺寸:1)。 dtype uint8告訴值是8位整數(shù)

The output details show that the inference will result in an array of 1,001 integer values (8 bits). Those values are the result of the image classification, where each value is the probability of that specific label be related to the image.

輸出詳細信息顯示,推斷將導(dǎo)致包含1,001個整數(shù)值(8位)的數(shù)組。 這些值是圖像分類的結(jié)果,其中每個值都是特定標(biāo)簽與圖像相關(guān)的概率。

For example, suppose that we want to classify an image wich shape is (1220, 1200, 3). First, we will need to reshape it to (224, 224, 3) and add a batch dimension of 1, as defined on input details: (1, 224, 224, 3). The inference result will be an array with 1001 size, as shown below:

例如,假設(shè)我們要對形狀為(1220,1200,3)的圖像進行分類。 首先,我們將需要將其重塑為(224,224,3)并添加批處理尺寸1(根據(jù)輸入詳細信息定義:(1,2,224,224,3))。 推斷結(jié)果將是一個大小為1001的數(shù)組,如下所示:

Image source: Author creation — Image Classification Main Steps圖像來源:作者創(chuàng)建—圖像分類的主要步驟

The steps to code those operations are:

對這些操作進行編碼的步驟是:

  • Input image and convert it to RGB (OpenCV reads an image as BGR):

    輸入圖像并將其轉(zhuǎn)換為RGB(OpenCV將圖像讀取為BGR):
  • image_path = './images/cat_2.jpg'
    image = cv2.imread(image_path)
    img = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

    2. Pre-process the image, reshaping and adding batch dimension:

    2.預(yù)處理圖像,重塑形狀并添加批次尺寸:

    img = cv2.resize(img, (224, 224))
    input_data = np.expand_dims(img, axis=0)

    3. Point the data to be used for testing and run the interpreter:

    3.指向要用于測試的數(shù)據(jù)并運行解釋器:

    interpreter.set_tensor(input_details[0]['index'], input_data)
    interpreter.invoke()

    4. Obtain results and map them to the classes:

    4.獲得結(jié)果并將其映射到類:

    predictions = interpreter.get_tensor(output_details[0][‘index’])[0]

    The output values (predictions) varies from 0 to 255 (max value of an 8bit integer). To obtain a prediction that will range from 0 to 1, the output value should be divided by 255. The array’s index, related to the highest value, is the most probable classification of such an image.

    輸出值(預(yù)測值)從0到255(8位整數(shù)的最大值)變化。 要獲得范圍從0到1的預(yù)測,應(yīng)將輸出值除以255。與最大值相關(guān)的數(shù)組索引是此類圖像最可能的分類。

    Having the index, we must find to what class it appoint (such as car, cat, or dog). The text file downloaded with the model has a label associated with each index that goes from 0 to 1,000.

    有了索引,我們必須找到它指定的類別(例如汽車,貓或狗)。 與模型一起下載的文本文件具有與每個索引相關(guān)聯(lián)的標(biāo)簽,范圍從0到1,000。

    Let’s first create a function to load the .txt file as a dictionary:

    讓我們首先創(chuàng)建一個函數(shù)以將.txt文件加載為字典:

    def load_labels(path):
    with open(path, 'r') as f:
    return {i: line.strip() for i, line in enumerate(f.readlines())}

    And create a dictionary named labels and inspecting some of them:

    并創(chuàng)建一個名為標(biāo)簽的字典并檢查其中的一些標(biāo)簽 :

    labels = load_labels('./models/labels_mobilenet_quant_v1_224.txt')

    Returning to our example, let’s get the top 3 results (highest probabilities):

    回到我們的示例,讓我們獲得前3個結(jié)果(最高概率):

    top_k_indices = 3
    top_k_indices = np.argsort(predictions)[::-1][:top_k_results]

    We can see that the 3 top indices are related to cats. The prediction content is the probability associated with each one of the labels. As explained before, dividing by 255., we can get a value from 0 to 1. Let’s create a loop to go over the top results, printing label and probabilities:

    我們可以看到3個頂級指數(shù)與貓有關(guān)。 預(yù)測內(nèi)容是與每個標(biāo)簽關(guān)聯(lián)的概率。 如前所述,除以255,我們可以得到一個0到1的值。讓我們創(chuàng)建一個循環(huán)以遍歷頂部結(jié)果,打印標(biāo)簽和概率:

    for i in range(top_k_results):
    print("\t{:20}: {}%".format(
    labels[top_k_indices[i]],
    int((predictions[top_k_indices[i]] / 255.0) * 100)))

    Let’s create a function, to perform inference on different images smoothly:

    讓我們創(chuàng)建一個函數(shù),以平滑地對不同的圖像進行推斷:

    def image_classification(image_path, labels, top_k_results=3):
    image = cv2.imread(image_path)
    img = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    plt.imshow(img)img = cv2.resize(img, (w, h))
    input_data = np.expand_dims(img, axis=0)interpreter.set_tensor(input_details[0]['index'], input_data)
    interpreter.invoke()
    predictions = interpreter.get_tensor(output_details[0]['index'])[0]top_k_indices = np.argsort(predictions)[::-1][:top_k_results]print("\n\t[PREDICTION] [Prob]\n")
    for i in range(top_k_results):
    print("\t{:20}: {}%".format(
    labels[top_k_indices[i]],
    int((predictions[top_k_indices[i]] / 255.0) * 100)))

    The figure below shows some tests using the function:

    下圖顯示了使用該功能的一些測試:

    Images source: Author creation from public dataset圖片來源:從公共數(shù)據(jù)集中創(chuàng)建作者

    The overall performance is astonishing! From the instant that you enter with the image path in the memory card, until the time that that result is printed out, all process took less than half a second, with high precision!

    整體表現(xiàn)驚人! 從您輸入存儲卡中的圖像路徑的那一刻起,直到打印出該結(jié)果為止,所有過程都花費了不到半秒的時間,而且非常精確!

    The function can be easily applied to frames on videos or live camera. The notebook for that and the complete code discussed in this section can be downloaded from GitHub.

    該功能可輕松應(yīng)用于視頻或?qū)崟r攝像機上的幀。 可以從GitHub下載該筆記本以及本節(jié)中討論的完整代碼。

    物體檢測 (Object Detection)

    With Image Classification, we can detect what the dominant subject of such an image is. But what happens if several objects are dominant and of interest on the same image? To solve it, we can use an Object Detection model!

    通過圖像分類,我們可以檢測出此類圖像的主要主題。 但是,如果幾個對象在同一圖像上占主導(dǎo)地位并且感興趣,會發(fā)生什么? 為了解決這個問題,我們可以使用對象檢測模型!

    Given an image or a video stream, an object detection model can identify which of a known set of objects might be present and provide information about their positions within the image.

    給定圖像或視頻流,對象檢測模型可以識別可能存在的一組已知對象,并提供有關(guān)它們在圖像中位置的信息。

    For this task, we will download a Mobilenet V1 model pre-trained using the COCO (Common Objects in Context) dataset. This dataset has more than 200,000 labeled images, in 91 categories.

    對于此任務(wù),我們將下載使用COCO(上下文中的公共對象)數(shù)據(jù)集進行預(yù)訓(xùn)練的Mobilenet V1模型。 該數(shù)據(jù)集有91個類別的200,000多張帶標(biāo)簽的圖像。

    Image source: Author creation圖片來源:作者創(chuàng)作

    下載型號和標(biāo)簽 (Downloading model and labels)

    On Raspberry terminal run the commands:

    在Raspberry終端上,運行以下命令:

    $ cd ./models
    $ curl -O http://storage.googleapis.com/download.tensorflow.org/models/tflite/coco_ssd_mobilenet_v1_1.0_quant_2018_06_29.zip
    $ unzip coco_ssd_mobilenet_v1_1.0_quant_2018_06_29.zip
    $ curl -O https://dl.google.com/coral/canned_models/coco_labels.txt$ rm coco_ssd_mobilenet_v1_1.0_quant_2018_06_29.zip
    $ rm labelmap.txt

    On models subdirectory, we should end with 2 new files:

    在models子目錄上,我們應(yīng)該以2個新文件結(jié)尾:

    coco_labels.txt
    detect.tflite

    The steps to perform inference on a new image, are very similar to those done with Image Classification, except that:

    對新圖像執(zhí)行推理的步驟與“圖像分類”所執(zhí)行的步驟非常相似,不同之處在于:

    • input: image must have a shape of 300x300 pixels

      輸入:圖片的形狀必須為300x300像素
    • output: include not only label and probability (“score”), but also the relative window position (“ Bounding Box”) about where the object is located on the image.

      輸出:不僅包括標(biāo)簽和概率(“分?jǐn)?shù)”),還包括有關(guān)對象在圖像上的位置的相對窗口位置(“邊界框”)。
    Image source: Author creation圖片來源:作者創(chuàng)作

    Now, we must load the labels and model, allocating tensors.

    現(xiàn)在,我們必須加載標(biāo)簽和模型,并分配張量。

    labels = load_labels('./models/coco_labels.txt')
    interpreter = Interpreter('./models/detect.tflite')
    interpreter.allocate_tensors()

    The input pre-process is the same as we did before, but the output should be worked to get a more readable output. The functions below will help with that:

    輸入的預(yù)處理與我們之前的相同,但是應(yīng)該對輸出進行處理以獲得更易讀的輸出。 以下功能將幫助您:

    def set_input_tensor(interpreter, image):
    """Sets the input tensor."""
    tensor_index = interpreter.get_input_details()[0]['index']
    input_tensor = interpreter.tensor(tensor_index)()[0]
    input_tensor[:, :] = imagedef get_output_tensor(interpreter, index):
    """Returns the output tensor at the given index."""
    output_details = interpreter.get_output_details()[index]
    tensor = np.squeeze(interpreter.get_tensor(output_details['index']))
    return tensor

    With the help of the above functions, detect_objects() will return the inference results:

    借助以上功能,detect_objects()將返回推斷結(jié)果:

    • object label id

      對象標(biāo)簽ID
    • score

      得分
    • the bounding box, that will show where the object is located.

      邊界框,它將顯示對象的位置。

    We have included a ‘threshold’ to avoid objects with a low probability of being correct. Usually, we should consider a score above 50%.

    我們包含了一個“閾值”,以避免物體正確的可能性很小。 通常,我們應(yīng)該考慮分?jǐn)?shù)高于50%。

    def detect_objects(interpreter, image, threshold):
    set_input_tensor(interpreter, image)
    interpreter.invoke()

    # Get all output details
    boxes = get_output_tensor(interpreter, 0)
    classes = get_output_tensor(interpreter, 1)
    scores = get_output_tensor(interpreter, 2)
    count = int(get_output_tensor(interpreter, 3)) results = []
    for i in range(count):
    if scores[i] >= threshold:
    result = {
    'bounding_box': boxes[i],
    'class_id': classes[i],
    'score': scores[i]
    }
    results.append(result)
    return results

    If we apply the above function to a reshaped image (same as used on classification example), we should get:

    如果將上述功能應(yīng)用于重塑圖像(與分類示例相同),則應(yīng)獲得:

    Great! In less than 200ms with 77% probability, an object with id 16 was detected on an area delimited by a ‘bounding box’: (0.028011084, 0.020121813, 0.9886069, 0.802299). Those four numbers are respectively related to ymin, xmin, ymax and xmax.

    大! 在不到200毫秒的時間內(nèi)以77%的概率在由“邊界框”界定的區(qū)域上檢測到ID為16的對象:(0.028011084、0.020121813、0.9886069、0.802299)。 這四個數(shù)字分別與ymin,xmin,ymax和xmax有關(guān)。

    Take into consideration that y goes from the top (ymin) to bottom (ymax) and x goes from left (xmin) to the right (xmax) as shown in figure below:

    考慮到y(tǒng)從頂部(ymin)到底部(ymax),x從左側(cè)(xmin)到右側(cè)(xmax),如下圖所示:

    Image source: Author creation圖片來源:作者創(chuàng)作

    Having the bounding box four values, we have, in fact, the coordinates of the top/left corner and the bottom/right one. With both edges and knowing the shape of the picture, it is possible to draw the rectangle around the object.

    邊界框有四個值,實際上,我們有上/左角和下/右角的坐標(biāo)。 有了兩條邊緣并知道圖片的形狀,就可以在對象周圍繪制矩形。

    Next, we should find what class_id equal to 16 means. Opening the file coco_labels.txt, as a dictionary, each of its elements has an index associated, and inspecting index 16, we get as expected, ‘cat.’ The probability is the value returning from the score.

    接下來,我們應(yīng)該找到等于16的class_id。 打開文件coco_labels.txt作為字典,它的每個元素都有一個關(guān)聯(lián)的索引,并檢查索引16,我們得到的是預(yù)期的“貓”。 概率是從分?jǐn)?shù)返回的值。

    Let’s create a general function to detect multiple objects on a single picture. The first function, starting from an image path, will execute the inference, returning the resized image and the results (multiples ids, each one with its scores and bounding boxes:

    讓我們創(chuàng)建一個常規(guī)功能來檢測單個圖片上的多個對象。 第一個函數(shù)從圖像路徑開始,將執(zhí)行推理,返回調(diào)整大小的圖像和結(jié)果(多個id,每個id都有其得分和邊界框:

    def detectObjImg_2(image_path, threshold = 0.51):img = cv2.imread(image_path)
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    image = cv2.resize(img, (width, height),
    fx=0.5,
    fy=0.5,
    interpolation=cv2.INTER_AREA)
    results = detect_objects(interpreter, image, threshold)return img, results

    Having the reshaped image, and inference results, the below function can be used to draw a rectangle around the objects, specifying for each one, its label and probability:

    具有重塑的圖像和推斷結(jié)果后,以下功能可用于在對象周圍繪制一個矩形,并為每個對象指定其標(biāo)簽和概率:

    def detect_mult_object_picture(img, results): HEIGHT, WIDTH, _ = img.shape
    aspect = WIDTH / HEIGHT
    WIDTH = 640
    HEIGHT = int(640 / aspect)
    dim = (WIDTH, HEIGHT) img = cv2.resize(img, dim, interpolation=cv2.INTER_AREA) for i in range(len(results)):
    id = int(results[i]['class_id'])
    prob = int(round(results[i]['score'], 2) * 100)

    ymin, xmin, ymax, xmax = results[i]['bounding_box']
    xmin = int(xmin * WIDTH)
    xmax = int(xmax * WIDTH)
    ymin = int(ymin * HEIGHT)
    ymax = int(ymax * HEIGHT) text = "{}: {}%".format(labels[id], prob) if ymin > 10: ytxt = ymin - 10
    else: ytxt = ymin + 15 img = cv2.rectangle(img, (xmin, ymin), (xmax, ymax),
    COLORS[id],
    thickness=2)
    img = cv2.putText(img, text, (xmin + 3, ytxt), FONT, 0.5, COLORS[id],
    2) return img

    Below some results:

    下面是一些結(jié)果:

    Image source: Author creation圖片來源:作者創(chuàng)作

    The complete code can be found at GitHub.

    完整的代碼可以在GitHub上找到 。

    使用相機進行物體檢測 (Object Detection using Camera)

    Image source: Raspberry Pi Foundation圖片來源:Raspberry Pi Foundation

    If you have a PiCam connected to Raspberry Pi, it is possible to capture a video and perform object recognition, frame by frame, using the same functions defined before. Please follow this tutorial if you do not have a working camera in your Pi: Getting started with the Camera Module.

    如果您將PiCam連接到Raspberry Pi,則可以使用之前定義的相同功能來捕獲視頻并逐幀執(zhí)行對象識別。 如果您的Pi中沒有可使用的相機,請按照本教程進行操作: 相機模塊入門 。

    First, it is essential to define the size of the frame to be captured by the camera. We will use 640x480.

    首先,必須定義相機要拍攝的畫面尺寸。 我們將使用640x480。

    WIDTH = 640
    HEIGHT = 480

    Next, you must iniciate the camera:

    接下來,您必須啟動攝像頭:

    cap = cv2.VideoCapture(0)
    cap.set(3, WIDTH)
    cap.set(4, HEIGHT)

    And run the below code in a loop. Until the key ‘q’ is pressed, the camera will capture the video, frame by frame, drawing the bounding box with its respective labels and probabilities.

    并循環(huán)運行以下代碼。 在按下鍵“ q”之前,攝像機將逐幀捕獲視頻,并繪制帶有相應(yīng)標(biāo)簽和概率的邊界框。

    while True: timer = cv2.getTickCount()
    success, img = cap.read()
    img = cv2.flip(img, 0)
    img = cv2.flip(img, 1) fps = cv2.getTickFrequency() / (cv2.getTickCount() - timer)
    cv2.putText(img, "FPS: " + str(int(fps)), (10, 470),
    cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2) image = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    image = cv2.resize(image, (width, height),
    fx=0.5,
    fy=0.5,
    interpolation=cv2.INTER_AREA)
    start_time = time.time()
    results = detect_objects(interpreter, image, 0.55)
    elapsed_ms = (time.time() - start_time) * 1000 img = detect_mult_object_picture(img, results)
    cv2.imshow("Image Recognition ==> Press [q] to Exit", img)if cv2.waitKey(1) & 0xFF == ord('q'):
    breakcap.release()
    cv2.destroyAllWindows()

    Below is possible to see the video running in real-time on the Raspberry Pi screen. Note that the video runs around 60 FPS (frames per second), which is pretty good!.

    下面可以在Raspberry Pi屏幕上實時觀看視頻。 請注意,視頻的運行速度約為60 FPS(每秒幀數(shù)),非常好!

    演示地址

    Here one screen-shot of the above video:

    以下是上述視頻的屏幕截圖:

    Image source: Author creation圖片來源:作者創(chuàng)作

    The complete code is available on GitHub.

    完整的代碼可在GitHub上獲得。

    姿勢估計 (Pose Estimation)

    One of the more exciting and critical areas of AI is to estimate a person’s real-time pose, enabling machines to understand what people are doing in images and videos. Pose estimation was deeply explored in my article Realtime Multiple Person 2D Pose Estimation using TensorFlow2.x, but here at the Edge, with a Raspberry Pi and with the help of TensorFlow Lite, it is possible to easily replicate almost the same that was done on a Mac.

    AI的一個更令人激動和關(guān)鍵的領(lǐng)域之一是估計一個人的實時姿勢,使機器能夠了解人們在圖像和視頻中正在做什么。 在我的文章中使用TensorFlow2.x進行了實時多人2D姿勢估計,對姿勢估計進行了深入探討,但是在Edge上,借助Raspberry Pi和TensorFlow Lite的幫助,可以輕松地復(fù)制幾乎與以前相同的姿勢 Mac。

    The model that we will use in this project is the PoseNet. We will do inference the same way done for Image Classification and Object Detection, where an image is fed through a pre-trained model. PoseNet comes with a few different versions of the model, corresponding to variances of MobileNet v1 architecture and ResNet50 architecture. In this project, the version pre-trained is the MobileNet V1, which is smaller, faster, but less accurate than ResNet. Also, there are separate models for single and multiple person pose detection. We will explore the model trained for a single person.

    我們將在此項目中使用的模型是PoseNet 。 我們將以與圖像分類和對象檢測相同的方式進行推理,其中圖像通過預(yù)訓(xùn)練的模型進行饋送。 PoseNet帶有一些模型的不同版本,對應(yīng)于MobileNet v1架構(gòu)和ResNet50架構(gòu)的差異。 在此項目中,預(yù)培訓(xùn)的版本是MobileNet V1,它比ResNet較小,更快,但準(zhǔn)確性較低。 此外,還有用于單人和多人姿勢檢測的單獨模型。 我們將探索為一個人訓(xùn)練的模型。

    In this site is possible to explore in real time and using a live camera, several PoseNet models and configurations.

    在此站點中,可以使用實時攝像機實時瀏覽多種PoseNet模型和配置。

    The libraries to execute Pose Estimation on a Raspberry Pi are the same used before. NumPy, MatPlotLib, OpenCV and TensorFlow Lite Interpreter.

    在Raspberry Pi上執(zhí)行姿勢估計的庫與以前使用的庫相同。 NumPy,MatPlotLib,OpenCV和TensorFlow Lite解釋器。

    The pre-trained model is the posenet_mobilenet_v1_100_257x257_multi_kpt_stripped.tflite, which can be downloaded from the above link or the TensorFlow Lite — Pose Estimation Overview website. The model should be saved in the models subdirectory.

    預(yù)先訓(xùn)練的模型是posenet_mobilenet_v1_100_257x257_multi_kpt_stripped.tflite ,可以從上面的鏈接或TensorFlow Lite- 姿勢估計概述網(wǎng)站下載 。 該模型應(yīng)保存在models子目錄中。

    Start loading TFLite model and allocating tensors:

    開始加載TFLite模型并分配張量:

    interpreter = tflite.Interpreter(model_path='./models/posenet_mobilenet_v1_100_257x257_multi_kpt_stripped.tflite')
    interpreter.allocate_tensors()

    Get input and output tensors:

    獲取輸入和輸出張量:

    input_details = interpreter.get_input_details()
    output_details = interpreter.get_output_details()

    Same as we did before, looking into the input_details, it is possible to see that the image to be used to pose estimation should be (1, 257, 257, 3), which means that images must be reshaped to 257x257 pixels.

    與我們之前所做的一樣,查看input_details,可以看到用于姿勢估計的圖像應(yīng)為(1,257,257,3),這意味著必須將圖像重塑為257x257像素。

    Let’s take as input a simple human figure, that will help us to analyze it:

    讓我們以一個簡單的人物作為輸入,這將幫助我們對其進行分析:

    The first step is to pre-process the image. This particular model was not quantized, which means that the dtype is float32. This information is essential to pre-process the input image, as shown with the below code

    第一步是預(yù)處理圖像。 此特定模型未量化,這意味著dtype為float32。 此信息對于預(yù)處理輸入圖像至關(guān)重要,如以下代碼所示

    image = cv2.resize(image, size)
    input_data = np.expand_dims(image, axis=0)
    input_data = input_data.astype(np.float32)
    input_data = (np.float32(input_data) - 127.5) / 127.5

    Having the image pre-processed, now it is time to perform the inference, feeding the tensor with the image and invoking the interpreter:

    對圖像進行預(yù)處理后,現(xiàn)在該執(zhí)行推理了,向張量提供圖像并調(diào)用解釋器:

    interpreter.set_tensor(input_details[0]['index'], input_data)
    interpreter.invoke()

    An article that helps a lot to understand how to work with PoseNet is the Ivan Kunyakin tutorial’s Pose estimation and matching with TensorFlow lite. There Ivan comments that on the output vector, what matters to find the key points, are:

    Ivan Kunyakin教程的Pose估計以及與TensorFlow lite的匹配,對幫助您理解如何使用PoseNet 很有幫助 。 Ivan評論說,在輸出向量上,找到關(guān)鍵點很重要:

    • Heatmaps 3D tensor of size (9,9,17), that corresponds to the probability of appearance of each one of the 17 keypoints (body joints) in the particular part of the image (9,9). It is used to locate the approximate position of the joint.

      熱圖大小為(9,9,17)的3D張量,它對應(yīng)于圖像的特定部分(9,9)中17個關(guān)鍵點(身體關(guān)節(jié))中的每一個出現(xiàn)的概率。 用于定位關(guān)節(jié)的大致位置。

    • Offset Vectors: 3D tensor of size (9,9,34) that is called offset vectors. It is used for more exact calculation of the keypoint’s position. The First 17 of the third dimension correspond to the x coordinates and the second 17 of them to the y coordinates.

      偏移向量:大小為(9,9,34)的3D張量,稱為偏移向量。 它用于更精確地計算關(guān)鍵點的位置。 三維的第一個17對應(yīng)于x坐標(biāo),第二個17對應(yīng)于y坐標(biāo)。

    output_details = interpreter.get_output_details()[0]
    heatmaps = np.squeeze(interpreter.get_tensor(output_details['index']))output_details = interpreter.get_output_details()[1]
    offsets = np.squeeze(interpreter.get_tensor(output_details['index']))

    Let’s create a function that will return an array with all 17 keypoints (or person's joints) based on heatmaps and offsets.

    讓我們創(chuàng)建一個函數(shù),該函數(shù)將根據(jù)熱圖和偏移量返回一個包含所有17個關(guān)鍵點(或人的關(guān)節(jié))的數(shù)組。

    def get_keypoints(heatmaps, offsets): joint_num = heatmaps.shape[-1]
    pose_kps = np.zeros((joint_num, 2), np.uint32)
    max_prob = np.zeros((joint_num, 1)) for i in range(joint_num):
    joint_heatmap = heatmaps[:,:,i]
    max_val_pos = np.squeeze(
    np.argwhere(joint_heatmap == np.max(joint_heatmap)))
    remap_pos = np.array(max_val_pos / 8 * 257, dtype=np.int32)
    pose_kps[i, 0] = int(remap_pos[0] +
    offsets[max_val_pos[0], max_val_pos[1], i])
    pose_kps[i, 1] = int(remap_pos[1] +
    offsets[max_val_pos[0], max_val_pos[1],
    i + joint_num])
    max_prob[i] = np.amax(joint_heatmap) return pose_kps, max_prob

    Using the above function with the heatmaps and offset vectors that were extracted from the output tensor, resultant of the image inference, we get:

    使用上面的函數(shù)和從輸出張量提取的熱圖和偏移矢量,即圖像推斷的結(jié)果,我們得到:

    The resultant array shows all 17 coordinates (y, x) regarding where the joints are located on an image of 257 x 257 pixels. Using the code below. It is possible to plot each one of the joints over the resized image. For reference, the array index is annotated, so it is easy to identify each joint:

    所得數(shù)組顯示有關(guān)關(guān)節(jié)在257 x 257像素的圖像上的位置的所有17個坐標(biāo)(y,x)。 使用下面的代碼。 可以在調(diào)整大小后的圖像上繪制每個關(guān)節(jié)。 作為參考,對數(shù)組索引進行了注釋,因此很容易識別每個關(guān)節(jié):

    y,x = zip(*keypts_array)
    plt.figure(figsize=(10,10))
    plt.axis([0, image.shape[1], 0, image.shape[0]])
    plt.scatter(x,y, s=300, color='orange', alpha=0.6)
    img = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    plt.imshow(img)
    ax=plt.gca()
    ax.set_ylim(ax.get_ylim()[::-1])
    ax.xaxis.tick_top()
    plt.grid();for i, txt in enumerate(keypts_array):
    ax.annotate(i, (keypts_array[i][1]-3, keypts_array[i][0]+1))

    As a result, we get the picure:

    結(jié)果,我們得到如下圖:

    Image source: Author creation圖片來源:作者創(chuàng)作

    Great, now it is time to create a general function to draw “the bones”, which is the joints’ connection. The bones will be drawn as lines, which are the connections among keypoints 5 to 16, as shown in the above figure. Independent circles will be used for keypoints 0 to 4, related to head:

    太好了,現(xiàn)在是時候創(chuàng)建繪制“骨骼”的通用功能了,這是關(guān)節(jié)的連接。 骨骼將繪制為線,即關(guān)鍵點5到16之間的連接,如上圖所示。 獨立的圓圈將用于與頭部相關(guān)的關(guān)鍵點0到4:

    def join_point(img, kps, color='white', bone_size=1):

    if color == 'blue' : color=(255, 0, 0)
    elif color == 'green': color=(0, 255, 0)
    elif color == 'red': color=(0, 0, 255)
    elif color == 'white': color=(255, 255, 255)
    else: color=(0, 0, 0) body_parts = [(5, 6), (5, 7), (6, 8), (7, 9), (8, 10), (11, 12), (5, 11),
    (6, 12), (11, 13), (12, 14), (13, 15), (14, 16)] for part in body_parts:
    cv2.line(img, (kps[part[0]][1], kps[part[0]][0]),
    (kps[part[1]][1], kps[part[1]][0]),
    color=color,
    lineType=cv2.LINE_AA,
    thickness=bone_size)

    for i in range(0,len(kps)):
    cv2.circle(img,(kps[i,1],kps[i,0]),2,(255,0,0),-1)

    Calling the function, we have the estimated pose of the body in the image:

    調(diào)用該函數(shù),我們可以在圖像中獲得人體的估計姿勢:

    join_point(img, keypts_array, bone_size=2)
    plt.figure(figsize=(10,10))
    plt.imshow(img);Image source: Author creation圖片來源:作者創(chuàng)作

    And last but not least, let’s create a general function to estimate posture having an image path as a start:

    最后但并非最不重要的一點,我們創(chuàng)建一個通用函數(shù)來估計以圖像路徑作為起點的姿勢:

    def plot_pose(img, keypts_array, joint_color='red', bone_color='blue', bone_size=1):
    join_point(img, keypts_array, bone_color, bone_size)
    y,x = zip(*keypts_array)
    plt.figure(figsize=(10,10))
    plt.axis([0, img.shape[1], 0, img.shape[0]])
    plt.scatter(x,y, s=100, color=joint_color)
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) plt.imshow(img)
    ax=plt.gca()
    ax.set_ylim(ax.get_ylim()[::-1])
    ax.xaxis.tick_top()
    plt.grid();
    return img
    def get_plot_pose(image_path, size, joint_color='red', bone_color='blue', bone_size=1):
    image_original = cv2.imread(image_path)
    image = cv2.resize(image_original, size)
    input_data = np.expand_dims(image, axis=0)
    input_data = input_data.astype(np.float32)
    input_data = (np.float32(input_data) - 127.5) / 127.5 interpreter.set_tensor(input_details[0]['index'], input_data)
    interpreter.invoke()

    output_details = interpreter.get_output_details()[0]
    heatmaps = np.squeeze(interpreter.get_tensor(output_details['index'])) output_details = interpreter.get_output_details()[1]
    offsets = np.squeeze(interpreter.get_tensor(output_details['index'])) keypts_array, max_prob = get_keypoints(heatmaps,offsets)
    orig_kps = get_original_pose_keypoints(image_original, keypts_array, size) img = plot_pose(image_original, orig_kps, joint_color, bone_color, bone_size)

    return orig_kps, max_prob, img

    At this point with only one line of code, it is possible to detect pose on images:

    此時,僅需一行代碼,就可以檢測圖像上的姿勢:

    keypts_array, max_prob, img = get_plot_pose(image_path, size, bone_size=3)

    All code developed on this section is available on GitHub.

    在本節(jié)中開發(fā)的所有代碼都可以在GitHub上找到 。

    Another easy step is to apply the function to frames from videos and live camera. I will leave it for you! ;-)

    另一個簡單的步驟是將功能應(yīng)用于視頻和實時攝像機的幀。 我會留給你的! ;-)

    結(jié)論 (Conclusion)

    TensorFlow Lite is a great framework to implement Artificial Intelligence (more precisely, ML) at the Edge. Here we explored ML models working on a Raspberry Pi, but TFLite is now more and more used at the "edge of the edge", on very small microcontrollers, in what has been called TinyML.

    TensorFlow Lite是在Edge上實施人工智能(更準(zhǔn)確地說是ML)的絕佳框架。 在這里,我們探索了在Raspberry Pi上運行的ML模型,但是現(xiàn)在TFLite越來越多地在稱為TinyML的非常小的微控制器上的“邊緣邊緣” 使用 。

    As always, I hope this article can inspire others to find their way in the fantastic world of AI!

    與往常一樣,我希望本文能夠激發(fā)其他人在夢幻般的AI世界中找到自己的路!

    All the codes used in this article are available for download on project GitHub: TFLite_IA_at_the_Edge.

    本文中使用的所有代碼都可以在GitHub項目TFLite_IA_at_the_Edge上下載。

    Regards from the South of the World!

    南方的問候!

    See you in my next article!

    下一篇再見!

    Thank you

    謝謝

    Marcelo

    馬塞洛

    翻譯自: https://towardsdatascience.com/exploring-ia-at-the-edge-b30a550456db

    邊緣計算 ai

    總結(jié)

    以上是生活随笔為你收集整理的边缘计算 ai_在边缘探索AI!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    国产一级视频在线 | 欧美成人播放 | 亚洲黄色app | 午夜美女福利直播 | 夜夜躁日日躁狠狠久久av | 久久久久国产一区二区 | 欧美精品一区二区在线播放 | 精品国偷自产在线 | 午夜精品一二三区 | 中午字幕在线观看 | 视频99爱| 91中文字幕在线 | 亚洲激情六月 | 天天天干天天射天天天操 | 久久精品91久久久久久再现 | 女人魂免费观看 | 五月天综合激情网 | 国产精品大尺度 | 99精品国产一区二区三区麻豆 | www.在线观看视频 | 日本一区二区三区免费观看 | 不卡精品视频 | 久久久影院官网 | 亚洲精品男人的天堂 | www蜜桃视频 | 国产亚洲成人网 | 91精品一区二区三区蜜桃 | 超碰大片 | 久久久亚洲影院 | 91av色| 中文字幕在线看 | 欧美精品乱码99久久影院 | 高清免费在线视频 | 九九热在线精品视频 | 黄色av电影在线 | 天天做夜夜做 | 一区二区精品在线 | 91九色最新地址 | 婷婷六月在线 | 国产亚洲精品久久久久动 | 色综合天天色综合 | 国产在线观看你懂得 | 特片网久久 | 这里有精品在线视频 | 天天插综合网 | 亚洲精品a区 | 99免在线观看免费视频高清 | 日韩视频在线观看视频 | 国产午夜小视频 | 国产精品v欧美精品v日韩 | 日韩欧美在线综合网 | 91成人在线看 | 久久九九精品久久 | 黄色软件在线观看免费 | se婷婷| 四季av综合网站 | 欧美男同视频网站 | 天天操天天射天天插 | 在线观看91视频 | 亚洲精品国久久99热 | 中文字幕在线视频一区 | 麻豆视频91 | 午夜精品电影一区二区在线 | 色视频网址 | 免费黄色在线播放 | 精品国产乱码久久久久久1区二区 | a级国产乱理伦片在线播放 久久久久国产精品一区 | 高清中文字幕av | 天天干天天操天天搞 | 特级西西444www大精品视频免费看 | 国产麻豆剧果冻传媒视频播放量 | 黄色视屏在线免费观看 | 天天操夜夜看 | 在线99视频 | 国产亚洲va综合人人澡精品 | 亚洲精品高清在线观看 | 免费在线中文字幕 | www天天操 | 特黄特色特刺激视频免费播放 | 欧美日bb | 日韩手机在线 | 夜夜躁天天躁很躁波 | 91精品入口 | 久草精品在线观看 | 999成人网| 色五月色开心色婷婷色丁香 | 特级大胆西西4444www | 日韩中文字幕a | 成人一区二区三区在线 | 欧美性春潮 | ,久久福利影视 | av在线h| 中文日韩在线视频 | 2019久久精品| 特级a老妇做爰全过程 | 国产精品综合在线 | 国产成人三级在线观看 | 亚洲影视九九影院在线观看 | 91福利视频在线 | 久久理论片| 精品视频中文字幕 | 91免费高清视频 | 成人禁用看黄a在线 | 91视频在线国产 | 久插视频 | av在线电影网站 | 中文字幕字幕中文 | 婷婷综合国产 | 天天干天天射天天插 | 亚洲视频,欧洲视频 | 欧美一级看片 | 97热久久免费频精品99 | 99精品一级欧美片免费播放 | 日韩在线精品 | 天天干天天爽 | 欧美日韩精品在线免费观看 | 在线亚洲人成电影网站色www | 国产黄色片免费 | 精品国产成人在线 | 狠狠干.com | 在线一二三四区 | 国产精品久久电影观看 | 欧美黄色成人 | 亚洲成人动漫在线观看 | 中文字幕在线人 | 蜜臀av性久久久久av蜜臀三区 | 91av小视频 | www久久com| 插久久 | 久久国产精品一区二区三区四区 | 日本最新中文字幕 | 国内少妇自拍视频一区 | 超碰在线公开 | 午夜精品久久久久久 | 在线观看mv的中文字幕网站 | 色老板在线 | 久久国产精品影片 | 久久久久久国产一区二区三区 | 激情综合色图 | 久久免费视频5 | 激情欧美xxxx | 一本到在线| 久久综合激情 | 综合色中文 | 久久黄页 | 黄色成人91 | 成人免费视频免费观看 | 久久91久久久久麻豆精品 | 91新人在线观看 | 丁香色综合 | 久久久久亚洲精品国产 | 国产精品久久久久999 | 亚洲一区二区三区精品在线观看 | 99久久综合狠狠综合久久 | 亚洲美女精品区人人人人 | 亚洲黄色在线免费观看 | 天天操天天干天天干 | 在线观看成人 | 天天干天天干天天操 | 四虎在线免费观看 | 日韩一区二区三区不卡 | 免费黄在线观看 | 81国产精品久久久久久久久久 | a级片韩国 | 国产高清在线观看av | 国产视频九色蝌蚪 | 国产高清在线精品 | 欧美中文字幕第一页 | 日韩精品久久久免费观看夜色 | 在线电影 一区 | 99国产一区二区三精品乱码 | 操操操干干干 | 国产一区福利在线 | 操夜夜操 | av 一区二区三区四区 | 色噜噜在线观看视频 | 日本中文字幕在线免费观看 | 日韩在线观看视频中文字幕 | 国产精品久久久久一区二区 | 亚洲精品乱码久久久久久久久久 | 成人精品视频 | 亚洲成人资源 | 亚洲天天看 | 天天操 夜夜操 | 九九在线免费视频 | 日日干,天天干 | 91麻豆精品国产91久久久久久久久 | 99精品久久久久 | 国产99久久精品 | 精品久久免费 | 黄色日本片| 综合精品久久久 | 国产视频日本 | 丝袜美女视频网站 | 在线免费中文字幕 | 91理论片午午伦夜理片久久 | 亚洲一区二区视频在线 | 国产一区二区三精品久久久无广告 | 亚洲国产色一区 | 特级毛片在线 | 国产高清免费 | 中文字幕高清视频 | 久久国产精品99久久久久久进口 | av色网站 | 国偷自产中文字幕亚洲手机在线 | 在线观看资源 | 欧美精品免费在线观看 | 亚洲成人在线免费 | 国产精品福利在线播放 | 91在线免费播放 | 欧美最猛性xxxxx免费 | 国产美女网站在线观看 | 日日夜夜国产 | 亚洲一区免费在线 | 黄色小说在线免费观看 | 中文字幕一区二区三区四区在线视频 | 久久久受www免费人成 | 国产免费成人av | 欧美成亚洲 | www免费网站在线观看 | 18女毛片 | 国产精品久久艹 | 黄色看片 | 天天干天天做 | 麻豆国产网站 | 国产97视频在线 | 亚洲国产三级在线观看 | 激情影院在线 | 国产精品视频免费看 | 国产精品美女久久久久久久网站 | 四虎影院在线观看av | 黄色三级网站在线观看 | 久久久免费观看 | 久久久久久久久久久免费av | 在线电影日韩 | 99热这里有 | 亚洲精品在线播放视频 | 成人试看120秒 | 国产91影院| 欧美性色19p| 成人在线视频免费看 | 亚洲开心激情 | 成人在线免费视频观看 | 在线观看网站你懂的 | 色www免费视频 | 亚洲精品99久久久久久 | 婷婷干五月 | 国产黄视频在线观看 | 四虎国产| 玖玖999| 97超碰成人在线 | 欧美最猛性xxx | 99久久夜色精品国产亚洲96 | 九九亚洲视频 | 在线观看视频黄色 | 成年人免费av | 娇妻呻吟一区二区三区 | 亚洲第一香蕉视频 | 国产精品密入口果冻 | 欧美在线一二 | 免费日韩三级 | 国产小视频在线免费观看 | 久产久精国产品 | 亚洲五月六月 | 国内精品久久久精品电影院 | 超碰在97| 国产精品免费视频一区二区 | 在线播放视频一区 | 国产不卡在线视频 | 一区二区三区四区五区在线视频 | 国产成人精品一区二区三区网站观看 | 中文字幕日韩国产 | 久久精品国产一区二区电影 | 久久99国产精品久久99 | 国产99亚洲 | 97天堂网 | 亚洲国产99 | 亚洲精品小区久久久久久 | 欧美 日韩 久久 | 精品国产电影一区二区 | 色综合久久久久久久久五月 | 国产九九精品视频 | a级国产乱理论片在线观看 特级毛片在线观看 | 国产成人av网址 | 日本黄区免费视频观看 | 国产精品成人国产乱一区 | 狠狠操操网 | 996久久国产精品线观看 | 在线中文字幕网站 | 日韩高清一区 | 国产在线毛片 | 国产麻豆精品95视频 | 一级性av | 欧美日韩一区二区在线观看 | 久草在线免费资源 | 日韩激情在线 | 成人一区二区三区在线观看 | 黄色日本片| 天天综合网~永久入口 | 久久不卡日韩美女 | av黄色一级片 | 狠狠色丁香婷婷综合久久片 | 在线看欧美 | 日韩欧美视频一区 | 欧美一区中文字幕 | 精品专区 | 9i看片成人免费看片 | 欧美日本一二三 | 91九色蝌蚪在线 | 亚洲精品乱码久久久久久高潮 | 九九热中文字幕 | 国产一区二区三区 在线 | 亚洲国产精品电影在线观看 | 久久精彩 | 国产流白浆高潮在线观看 | 五月激情丁香 | 天天干.com | 久久高清毛片 | 日韩av影视 | 人人干天天射 | 日韩欧美精品一区 | 三级黄色免费 | 亚洲最大成人免费网站 | 欧美午夜理伦三级在线观看 | 欧美日韩中文另类 | 日韩欧美在线观看 | 精品国产一区二区三区久久久 | 亚洲人成人99网站 | 日韩久久精品一区二区 | 亚洲精品美女免费 | 激情五月婷婷激情 | 一级久久久 | 国产亚洲精品久久久久久移动网络 | 96精品在线 | 超碰免费av | 国产高清99 | 国产伦精品一区二区三区免费 | 在线观看91精品视频 | 天天操综 | 99精品在线观看视频 | 中文字幕免费在线看 | 成人精品亚洲 | 日韩精品在线看 | 少妇搡bbbb搡bbb搡69 | 超碰97人| 黄色片视频免费 | 97精品视频在线播放 | 黄色www | 国产精品嫩草69影院 | 午夜在线观看 | 免费色黄| 久草久草在线观看 | 亚洲一级免费观看 | 日日夜夜免费精品 | 亚洲国产欧洲综合997久久, | 二区视频在线观看 | 99热手机在线 | 日韩免费一区二区在线观看 | 蜜臀久久99精品久久久久久网站 | 综合网久久 | 中文字幕国产精品一区二区 | 久久99国产精品自在自在app | 国产免费成人 | 精品久久久影院 | a在线观看视频 | 日韩精品中文字幕在线 | 日日躁夜夜躁aaaaxxxx | 亚洲网久久 | 国产一级不卡毛片 | 欧美日韩性视频在线 | 国产日韩欧美综合在线 | 日韩在线观看中文字幕 | 福利视频一区二区 | 日本久久成人中文字幕电影 | a在线免费观看视频 | 国产精品18videosex性欧美 | 久久精品免费播放 | 一级免费看视频 | av在线短片 | 人人插人人插 | 91亚洲精品在线 | 午夜视频二区 | 午夜黄网 | 麻豆91精品91久久久 | 99av在线视频| 五月天com | 亚洲综合欧美激情 | 成人小视频在线观看免费 | 国产成年免费视频 | 久久资源总站 | 三级av片| 亚洲不卡av一区二区三区 | 香蕉手机在线 | 婷婷网五月天 | 亚洲黄色app | 亚洲欧美日韩国产精品一区午夜 | 天堂成人在线 | 视频一区二区视频 | 91在线视频在线观看 | 最近中文字幕在线中文高清版 | 免费中文字幕在线观看 | 欧美日韩3p| 亚洲激情影院 | 国产二区av | 激情文学丁香 | 亚洲免费成人av电影 | 日韩在线视频网址 | 免费看精品久久片 | 999久久国精品免费观看网站 | 亚洲婷婷免费 | 国产精品手机视频 | 免费特级黄毛片 | 看毛片网站 | av在线免费网站 | 国产婷婷久久 | av线上看 | 在线观看免费av网站 | 日韩动漫免费观看高清完整版在线观看 | 99久久精品电影 | 最近2019好看的中文字幕免费 | 伊人天天综合 | 国产97在线视频 | 精品久久久免费视频 | 日本黄色大片儿 | 久久久久久中文字幕 | 五月婷婷六月丁香 | 美女黄濒 | aaa黄色毛片 | 天天超碰 | 在线观看精品一区 | 97精品在线观看 | 久久久蜜桃一区二区 | 免费看一级特黄a大片 | 免费亚洲精品 | 久久久久高清毛片一级 | 色综合咪咪久久网 | 美国av大片 | 日韩中文字幕在线看 | 国产精品视频最多的网站 | 好看的国产精品视频 | 国产精品福利小视频 | 一级成人免费 | 日韩一级精品 | 91精品国产乱码在线观看 | 国产一区在线免费 | 麻豆影视在线免费观看 | 成人在线观看影院 | 高清久久久 | 粉嫩一二三区 | 日本三级在线观看中文字 | 91综合色 | 久久综合九色综合97_ 久久久 | 一级黄色免费网站 | 免费三及片 | 欧美另类人妖 | 精品国产乱码一区二区三区在线 | 91精品亚洲影视在线观看 | 久草在线视频资源 | 肉色欧美久久久久久久免费看 | 操老逼免费视频 | 97在线精品国自产拍中文 | 久久免费一级片 | 久久久久久久久久久福利 | 亚洲精品xxxx | 亚洲va欧美va人人爽春色影视 | 国产精品久久久久永久免费观看 | 国产精品99久久久精品免费观看 | 国产精品久久久久久久久久久久久 | 91 在线视频播放 | 中文字幕有码在线观看 | 91精品在线免费观看 | 国产精品视频线看 | 午夜美女福利直播 | 在线观看黄av | 2024国产精品视频 | 成人黄色电影视频 | 亚洲在线视频免费 | 99精品在线免费 | 国产成人黄色片 | 成人在线电影观看 | 91综合久久一区二区 | 国产一区二区三区网站 | 天天干天天拍天天操 | 午夜久久久精品 | 看片一区二区三区 | 色偷偷88888欧美精品久久久 | 97精品视频在线播放 | 久久草精品 | 天天色天天爱天天射综合 | 九九日韩 | 视频成人永久免费视频 | 成年人视频在线免费播放 | 日韩精品中文字幕在线不卡尤物 | 91在线视频一区 | 亚洲欧洲日韩在线观看 | 伊人资源站 | 成人网在线免费视频 | 久久免费福利 | 在线看国产一区 | 精品极品在线 | 久久久久久久久久久国产精品 | 国产精品美女免费视频 | 久久婷婷开心 | 午夜免费在线观看 | 99精品国产在热久久 | 美女视频国产 | 久久综合综合久久综合 | 欧美小视频在线观看 | 91chinesexxx| 国产成人一区二区三区免费看 | 国产伦理久久精品久久久久_ | 激情综合色综合久久 | 久久99国产一区二区三区 | 国产v亚洲v | 麻豆系列在线观看 | 在线观看岛国 | 日本天天操 | 中文字幕二区在线观看 | 激情影院在线观看 | 最新超碰在线 | 精品国产一二三四区 | av一区二区在线观看中文字幕 | 国产精品久久久久久久久免费 | 麻豆视频91 | 一区二区成人国产精品 | 91视视频在线直接观看在线看网页在线看 | 成人亚洲免费 | 亚洲黄色片 | 亚洲一区二区91 | 色资源在线观看 | 丁香六月网| 国产日本亚洲高清 | 夜夜看av| 国产乱码精品一区二区蜜臀 | 精品三级av | 最近中文字幕久久 | 免费观看成人网 | 一区免费在线 | 天天干天天操天天拍 | 97人人模人人爽人人少妇 | 国产一区二区三区高清播放 | 精品国产三级a∨在线欧美 免费一级片在线观看 | 青青草国产精品 | 久久久久日本精品一区二区三区 | 久久99久久99精品免视看婷婷 | a级黄色片视频 | 久久人人爽人人爽人人 | 亚洲一区精品人人爽人人躁 | 精品美女久久 | 麻花豆传媒mv在线观看网站 | 国产 在线观看 | 99精品在线观看视频 | 国产97av | 亚洲91网站 | 操操碰 | 国产乱码精品一区二区蜜臀 | 精品成人久久 | 麻豆精品国产传媒 | 啪啪免费观看网站 | av福利网址导航 | 久久免费大片 | 丁香婷婷成人 | www.亚洲视频| 亚洲欧洲中文日韩久久av乱码 | 天堂网在线视频 | 日韩av图片 | 免费在线观看不卡av | 国产精品久久久久久久久久久久午夜片 | 精品9999| 一级片免费观看视频 | 久久久久这里只有精品 | 久久久久久久久电影 | 国产超碰在线观看 | 欧美精品久久久久久久久久久 | 国产精品久久久久久麻豆一区 | 在线观看蜜桃视频 | 亚洲精品视频大全 | 国产欧美三级 | 一级片免费在线 | www.亚洲黄| 久久精品首页 | 欧美激情视频在线观看免费 | 国产精品乱码久久久久 | 亚洲国产成人久久综合 | 国产中文视频 | 日日操夜 | 成人免费在线网 | 97成人免费 | 超碰人人国产 | 日批视频在线观看免费 | 久草97| 午夜在线国产 | 久久人人插 | 久久视频在线视频 | 一级欧美黄 | 婷婷综合国产 | 亚洲精品理论片 | 黄色片毛片 | 美女久久一区 | 91完整版观看 | 91精品欧美一区二区三区 | 2023av| 青青五月天 | 国产二区视频在线观看 | 五月婷婷影院 | www.天天干| 91爱爱免费观看 | 91精品久久久久久综合乱菊 | 精品国产美女在线 | avove黑丝| 久久伦理电影 | 日韩高清激情 | 久久久免费在线观看 | 久久99精品国产99久久6尤 | 国产麻豆果冻传媒在线观看 | 日本精品在线 | 91人人干| 亚洲国产网址 | 亚洲伊人第一页 | 日韩久久电影 | 国内精品亚洲 | 精品久久久一区二区 | 91视频免费播放 | 成人小视频在线播放 | 免费看三级网站 | 99精品欧美一区二区蜜桃免费 | 中文字幕观看av | 天天天天天天操 | 中文字幕日本电影 | 91精品第一页 | 深夜免费福利网站 | 国产精品一区二区免费在线观看 | 在线免费观看羞羞视频 | 中文字幕在线专区 | 久久国产成人午夜av影院潦草 | 国产黄色大片免费看 | 毛片网站在线看 | 黄色一级大片在线免费看产 | 在线播放 日韩专区 | 高清国产在线一区 | 天天操天天干天天干 | 国产一卡二卡在线 | 亚洲欧美日韩一级 | 亚洲免费国产视频 | 激情五月六月婷婷 | 国产精品视频大全 | 久久精品国产一区二区三 | 999电影免费在线观看2020 | 91精品国产一区 | 国产亚洲精品久久网站 | 四虎5151久久欧美毛片 | 91桃色在线观看视频 | 午夜精品久久久久久中宇69 | 亚洲成av人片在线观看香蕉 | 欧美精品三级在线观看 | 国产美女视频 | 最新中文字幕在线播放 | 欧美va日韩va | 特级黄色一级 | 欧美日韩一区二区三区不卡 | 96看片| 免费看片成人 | 国内精品免费 | 最近日韩免费视频 | 国产中文欧美日韩在线 | 免费av网址在线观看 | 手机看片中文字幕 | 日韩高清免费无专码区 | 日本午夜在线亚洲.国产 | 日韩另类在线 | 人人草在线视频 | 日韩二区在线观看 | 欧美日韩国产二区 | 国产自偷自拍 | 国产精品欧美久久久久久 | 国产丝袜一区二区三区 | 成人啪啪18免费游戏链接 | 91精品视频免费观看 | 成年人在线看片 | 国产在线看 | 欧美激情精品久久久久久变态 | 国产精品18久久久久白浆 | 成人午夜影院在线观看 | 色爱区综合激月婷婷 | 91精品久久久久久综合乱菊 | 久久这里只有精品1 | 久久久久福利视频 | 91精品国产自产在线观看 | 久久视讯| 91精品国产自产在线观看 | 一区二区三区三区在线 | 天天干天天操av | 欧美淫视频 | www.成人sex| 国精产品999国精产品视频 | av+在线播放在线播放 | 亚洲国产大片 | 在线激情av电影 | 婷婷伊人网| 国产四虎影院 | 美女黄频在线观看 | 日本中文字幕在线电影 | 在线精品视频在线观看高清 | 国产一区二区高清视频 | 狠狠干 狠狠操 | 国产麻豆剧果冻传媒视频播放量 | 天天躁日日躁狠狠躁 | 国产成人一区二区三区电影 | 免费看污在线观看 | 黄色av观看 | 国产成人精品综合久久久 | 亚洲一区视频免费观看 | 97视频网址 | 九九精品视频在线观看 | 91禁看片 | 激情网婷婷 | 亚洲综合在线一区二区三区 | 久久久精品视频成人 | 午夜久久影视 | 日韩欧美精品在线 | 国产精品美女www爽爽爽视频 | 久草电影在线 | av超碰免费在线 | 99精品视频在线播放观看 | 99亚洲精品在线 | 免费在线播放黄色 | 美女黄色网在线播放 | 欧美日韩综合在线观看 | www.夜夜操 | 精品在线观看一区二区三区 | 一区二区三区免费在线观看视频 | av免费试看 | 欧洲av在线| 欧美成人精品在线 | 欧美另类交在线观看 | 欧美日韩18 | 伊人天天综合 | 香蕉精品视频在线观看 | 丰满少妇在线观看网站 | 成人免费观看a | 国产成人99av超碰超爽 | 黄色a在线| 在线天堂亚洲 | 国产不卡一区二区视频 | 97在线视频免费看 | 色婷婷99| 国产字幕av| 成年人视频免费在线 | 国产日产精品一区二区三区四区的观看方式 | 成人一级片在线观看 | 视频在线99re| 中文字幕一区二区三区四区视频 | 国产在线理论片 | 夜夜视频欧洲 | 成人av片免费观看app下载 | 麻豆成人在线观看 | 在线 视频 一区二区 | 狠狠色丁香婷婷综合最新地址 | 天天爽天天射 | 99国产高清 | 7777精品伊人久久久大香线蕉 | 伊人五月在线 | 99精品在线免费视频 | 日本精品视频在线观看 | 色国产视频 | 四虎国产| 91精品视频在线 | 国产精品18久久久久久久久 | 九九热视频在线免费观看 | 色婷婷狠狠五月综合天色拍 | 日韩乱码中文字幕 | 成人网444ppp| 99久久综合狠狠综合久久 | 欧美精品久久久 | 成人在线电影观看 | 日韩在线观看三区 | 日韩久久精品一区二区 | 亚洲欧美国产精品va在线观看 | 操夜夜操 | 五月婷婷综合激情 | 国产精品美女久久久久久2018 | 视频在线观看入口黄最新永久免费国产 | 国产一区二区三区免费在线 | 亚洲精品福利在线 | 在线免费观看麻豆视频 | 五月婷婷色 | 四虎伊人 | 免费黄色a网站 | 乱男乱女www7788 | 精品久久久免费视频 | 国产一区二区三区免费在线 | 天天干天天玩天天操 | 日本一区二区不卡高清 | 久草综合视频 | 欧美另类交人妖 | 不卡精品 | 伊人伊成久久人综合网小说 | 亚洲激情在线观看 | 国产精品区在线观看 | 在线观看av免费 | 中文高清av| 国产成人久久精品77777综合 | 午夜av大片| 久久久久亚洲最大xxxx | 日韩精品一区二区在线 | 超碰在线人人97 | 激情婷婷久久 | 在线观看国产日韩欧美 | 999视频网 | 久草在线免费色站 | 最新精品视频在线 | 国产色就色 | 日本公妇在线观看 | 色资源网在线观看 | 香蕉久久国产 | 欧美日韩视频一区二区三区 | 国产视频在线免费 | 日本久久久亚洲精品 | 免费观看国产精品视频 | 人人干人人超 | 久久国产美女 | 综合网天天色 | 美女视频一区二区 | 就要色综合 | 最近中文字幕在线 | 久久精品毛片 | 99精品视频中文字幕 | 久久超| 久久99免费| 大胆欧美gogo免费视频一二区 | 亚洲一区二区高潮无套美女 | 一级黄色毛片 | 亚洲精品午夜一区人人爽 | 日韩精品久久久久久中文字幕8 | 天堂av在线免费观看 | 中文字幕在线观看视频免费 | 免费观看丰满少妇做爰 | 日韩黄色大片在线观看 | 99热这里只有精品免费 | 国产电影黄色av | 亚洲精选视频免费看 | 草久久影院 | 欧美 国产 视频 | 国产伦精品一区二区三区无广告 | 亚洲干| 国产精品免费麻豆入口 | 日韩在线视频网站 | 国产精品麻豆三级一区视频 | 国产精品久久久久一区二区三区共 | 毛片888 | av免费网 | 国产成人一区二区三区电影 | 91精品在线视频观看 | 狠狠干 狠狠操 | japanese黑人亚洲人4k | 成人国产一区二区 | 成片免费观看视频999 | 亚洲一区在线看 | 久久久久久国产精品免费 | 日韩电影在线观看一区二区 | 国产精品久久久久永久免费观看 | 久久久久久高潮国产精品视 | 免费激情网 | 国产精品久久久久久久久久免费 | 777视频在线观看 | 日韩电影在线一区二区 | 国产尤物视频在线 | 99精品免费久久久久久久久 | 亚洲一区久久久 | 日韩高清免费在线观看 | 久操伊人| 国产高清免费av | 色播亚洲婷婷 | 国产精品无 | 操操日| 天天艹天天爽 | 人人爽爽人人 | 九九热精品视频在线观看 | 国产日韩欧美中文 | 婷婷五情天综123 | 亚洲最新av在线网站 | 亚洲天天摸日日摸天天欢 | 青青河边草观看完整版高清 | 欧美精品乱码久久久久 | 国产亚洲精品久久久久秋 | 狠狠狠色丁香综合久久天下网 | 超碰精品在线观看 | 国产视频资源 | 国产精品你懂的在线观看 | 国产69精品久久99不卡的观看体验 | 欧美日韩99 | 96看片| 中文在线8资源库 | 国产精品久久久久久久婷婷 | 天天射色综合 | 免费观看的黄色 | 97成人啪啪网| 男女靠逼app | 狠狠色丁香婷婷综合视频 | 日韩欧美一区二区三区免费观看 | 91插插影库 | 国产精品免费在线播放 | 国产亚洲va综合人人澡精品 | 精壮的侍卫呻吟h | 午夜精品久久久 | 在线va网站| 日韩免费久久 | 色91在线| 色中文字幕在线观看 | 国产精品美女免费视频 | 国产另类xxxxhd高清 | 成人国产精品一区二区 | 国产中文字幕一区二区三区 | 精品理论片 | 六月婷操| av大全在线免费观看 | 午夜精品一区二区三区在线播放 | 五月婷婷在线观看视频 | 久久婷综合 | 高潮久久久久久久久 | 国产不卡精品 | 国产成人精品一区二区三区免费 | 欧美成人久久 | 国产精品美女久久久久久久久 | 狠狠的操你 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 美女在线观看网站 | 国产精品一区二区三区观看 | 国产.精品.日韩.另类.中文.在线.播放 | 婷婷精品国产欧美精品亚洲人人爽 | 色片网站在线观看 | 久草视频播放 | 亚洲精品午夜国产va久久成人 | 久久精品99精品国产香蕉 | 国产男男gay做爰 | 高清在线一区 | 国产另类xxxxhd高清 | 国产中文 | 国产精品美女网站 | 国产黄色片久久 | 福利视频 | 国产不卡网站 | 91久久精品日日躁夜夜躁国产 | 一级黄色免费 | 啪啪免费观看网站 | 亚洲91精品在线观看 | 波多野结衣网址 | 999久久久久 | 中文字幕在线精品 | 久久 一区 | 在线天堂v| 免费一级特黄毛大片 | 国产精品久久久久久久久久妇女 | 婷婷色中文字幕 | 又爽又黄在线观看 | 中文字幕国产视频 | 国产精品欧美久久久久无广告 | 国产精品久久久久久久久久妇女 | www.狠狠插.com | 久草精品视频 | 欧美精彩视频在线观看 | 色干综合 | 五月婷久 | 亚洲成年人免费网站 | www.伊人网 | 国产一区二区精品在线 | 国产成人99久久亚洲综合精品 | 国产综合视频在线观看 | 一区二区三区日韩精品 | 青青草在久久免费久久免费 | 特级西西www44高清大胆图片 | 国产精品国产亚洲精品看不卡15 | 最近日本韩国中文字幕 | 欧美激情视频三区 | 中文国产字幕在线观看 | 欧美一级艳片视频免费观看 | 最近中文字幕免费 | 午夜av免费在线观看 | 激情www | 黄色日视频 | 亚洲闷骚少妇在线观看网站 | 精品伦理一区二区三区 | 麻花豆传媒一二三产区 | 在线国产一区二区三区 | 国产精品视频在线看 | 国产精品久久99综合免费观看尤物 | 手机av电影在线 | 天天综合成人网 | 久在线观看视频 | 视频二区在线 | 亚州精品天堂中文字幕 | zzijzzij亚洲日本少妇熟睡 | 福利视频网址 | japanesefreesex中国少妇 | 麻豆 videos | 精品国产一区二区三区在线 | 一区二区不卡在线观看 | 日韩免费在线看 |