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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > 目标检测 >内容正文

目标检测

Jetson nano部署Yolov5目标检测 + Tensor RT加速(超级详细版)

發布時間:2024/1/18 目标检测 60 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Jetson nano部署Yolov5目标检测 + Tensor RT加速(超级详细版) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ? ? ? 一、準備工具

??二、燒錄

????????三、搭配環境

????????四、試跑Yolov5

????????五、tensorRT部署yolov5


前言:

在工作或學習中我們需要進行部署,下面這篇文章是我親自部署jetson nano之后做出的總結,包括自己遇到一些報錯和踩坑,希望對你們有所幫助 :?)

一、準備工具

  • 讀卡器
  • SD卡?
  • 小螺絲刀
  • 網線(更改語言需要網絡)
  • 二、燒錄

    燒錄鏡像就是要把SD卡里的東西給完全清除,好比我們電腦重裝系統一樣,把SD卡格式化。

    ?插上讀卡器后會自動識別U盤,我的電腦會識別很多,彈出很多個U盤選項,這個是正?,F象,只格式化一個就可以了。

    1. 在本地的電腦上下載燒錄的鏡像,可以去官網自行下載,下載的時候需要看好版本,不然會出問題,我下載的版本是4.4.1,下載的網址如下:

    ??JetPack SDK 4.4.1 archive | NVIDIA Developer

    2. 下載好之后進行解壓:

    3.?然后我們需要下載燒錄SD卡的工具,網址如下:

    Get Started With Jetson Nano Developer Kit | NVIDIA Developer

    下載完之后是一個.exe可執行文件,運行安裝就可以了。

    4. 開始燒錄鏡像

    運行上面下載好的Etcher之后是這樣的,選擇完鏡像之后會自動識別SD卡,讓后點擊flash

    ?這個是正在燒錄的界面,會自動燒錄2遍(大約20分鐘左右)

    5.燒錄完成,彈出讀卡器,插卡開機。

    6.開機之后,簡單設置一下(密碼、地區、時間),然后會就是和我們本地電腦Ubuntu界面差不多。

    三、搭配環境

    1.??配置CUDA

    首先打開終端(ctrl+alt+t),輸入以下命令:

    sudo gedit ~/.bashrc

    輸入密碼后進入文檔:

    鼠標滾輪滾到文檔最下面,輸入下面命令,然后按ctrl+s保存:

    export CUDA_HOME=/usr/local/cuda-10.2 export LD_LIBRARY_PATH=/usr/local/cuda-10.2/lib64:$LD_LIBRARY_PATH export PATH=/usr/local/cuda-10.2/bin:$PATH

    驗證CUDA是否安裝配置成功 :

    nvcc -V

    出現這個就證明配置成功了。

    ?*報錯*

    我輸出之后會出現讀取異常,或者不允許保存的提示,然后運行nvcc -V的時候顯示命令不可執行,這個多輸入幾次或者關閉終端再輸入幾次命令

    2.? 配置conda

    jetson nanoB01的架構是aarch64,與windows和liunx不同不同,所以不能安裝Anaconda,可以安裝一個替代它的archiconda。

    在終端輸入以下下載命令:

    wget https://github.com/Archiconda/build-tools/releases/download/0.2.3/Archiconda3-0.2.3-Linux-aarch64.sh

    下載成功。?

    * 報錯*

    遇到下載一半或者下載到99%之后報錯的問題。

    這個問題是因為堆棧小的原因,改一下堆棧大小就可以了。

    先查一以下自己的系統堆棧大小,用這個命令:

    ulimit -a

    stack size是堆棧的大小,我原來是8192,需要改成102400

    ?

    直接用代碼 ulimit -s 102400 修改,改完之后:

    下載好之后運行這個命令:

    bash Archiconda3-0.2.3-Linux-aarch64.sh

    接下來就是傻瓜式的安裝:

    安裝完之后配置環境變量:?

    sudo gedit ~/.bashrc

    在最初打開的文檔里的最后一行加上這個命令:?

    export PATH=~/archiconda3/bin:$PATH

    查看conda的版本號:

    conda -V

    3. 創建你自己的虛擬環境:

    conda create -n xxx(虛擬環境名) python=3.6 #創建一個python3.6的虛擬環境 conda activate xxx #進入虛擬環境 conda deactivate #(退出虛擬環境)

    4. 換源

    首先需要備份一下sources.list文件,執行后終端沒有響應

    sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

    進入sources.list內部

    sudo gedit /etc/apt/sources.list

    進入之后,ctrl+a刪除所有內容,之后將以下內容復制進去保存退出。

    deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic main multiverse restricted universe deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-security main multiverse restricted universe deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-updates main multiverse restricted universe deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-backports main multiverse restricted universe deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic main multiverse restricted universe deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-security main multiverse restricted universe deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-updates main multiverse restricted universe deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-backports main multiverse restricted universe

    ?然后更新軟件列表,保存到本地:

    sudo apt-get update

    ?更新軟件:

    sudo apt-get upgrade

    升級所有的安裝包,并解決依賴關系

    sudo apt-get dist-upgrade

    5. 安裝pip

    sudo apt-get install python3-pip libopenblas-base libopenmpi-dev

    更新pip到最新版本

    pip3 install --upgrade pip #如果pip已是最新,可不執行

    ?6. 下載torch和torchvision

    nano上安裝需要去英偉達官網下載所需版本,我這里是1.8.0,網址如下:

    PyTorch for Jetson - version 1.10 now available - Jetson Nano - NVIDIA Developer Forums

    下載好后,這里推薦一個工具(MobaXterm)用于連接板子進行互傳,當然你也可以直接下載到U盤,用U盤實現互傳。

    具體操作可以看這個博主的博客:MobaXterm(終端工具)下載&安裝&使用教程_蝸牛也不慢......的博客-CSDN博客

    連接成功后把可以在本地下載的東西解壓后,傳過去,建議傳到home目錄下。
    ?

    7. 安裝torch

    torchvision文件夾的目錄下右鍵,進入終端,然后進入你創建的虛擬環境,輸入以下命令:

    sudo apt-get install python3-pip libopenblas-base libopenmpi-dev

    pip install torch-1.8.0-cp36-cp36m-linux_aarch64.whl

    ?如果遇到網絡問題下載不了,就在第二個命令下載后面加上清華下載鏡像:

    -i https://pypi.tuna.tsinghua.edu.cn/simple

    安裝torch時,一定要安裝numpy,不然的話顯示你安裝torch成功,但是你conda list是找不到的。

    sudo apt install python3-numpy

    ?測試torch是否安裝成功:

    import torch print(torch.__version__)

    *報錯*

    在測試torch是否安裝成功時報錯:非法指令(核心已轉儲)。

    export OPENBLAS_CORETYPE=ARMV8

    8. 安裝torchvision,逐個執行以下命令(如果執行第三個命令報錯,繼續執行第四第五行命令,如果不報錯就直接cd ..)

    cd torchvisionexport BUILD_VERSION=0.9.0sudo python setup.py install python setup.py buildpython setup.py installcd .. #(中間有個空格)

    *報錯*

    在測試時如果報錯PIL,就安裝pillow,命令如下(在第二步如果報權限錯誤,就在開頭加sudo,或在結尾加--user)

    sudo apt-get install libjpeg8 libjpeg62-dev libfreetype6 libfreetype6-devpython3 -m pip install -i https://mirrors.aliyun.com/pypi/simple pillow

    ??

    ?到這里為止環境就全部搭建完畢了,下面開始部署Yolo5。

    ?四、試跑Yolov5

    1. 去官網上下載需要的版本,我這里下載的是5.0版本,下載的時候要把對應的權重也要下載。網址如下:

    ultralytics/yolov5 at v5.0 (github.com)

    在這里選擇版本:

    權重網址如下:

    Releases · ultralytics/yolov5 (github.com)

    2. 下載完或者使用工具將yolo5和權重文件拖到主目錄之后,使用cd進入yolo5文件目錄下,在終端下載依賴項:

    pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

    ?*報錯*

    遇到下面的問題是因為numpy版本過高導致的,降低以下版本就可以了。

    把版本降低到1.19.4:

    pip install numpy==1.19.4 -i https://pypi.tuna.tsinghua.edu.cn/simple

    ?解決完報錯之后,在運行上面的命令,會自動下載需要的安裝包,其他的都是很快的,但是到opencv的時候需要花費很長很長很長很長的時間......,當安裝opencv時會出現Building wheel for opencv-python (pyroject.toml)...? 這種情況正?,F象,是opencv在編譯,繼續等就可以了,我編譯了2個多小時...

    3. 經過N長時間的等待,安裝好所有依賴包后,將權重文件拖到yolov5文件夾根目錄下,在yolov5的根目錄下打開終端,執行以下命令:

    python3 detect.py --weights yolov5s.pt

    測試一下是沒問題的,接下來我們開始部署yolov5。

    五、tensorRT部署yolov5

    1. tensorRT官網下載yolov5,網址如下,確定下載是v5.0版本:

    mirrors / wang-xinyu / tensorrtx · GitCode

    mirrors / wang-xinyu / tensorrtx · GitCodeImplementation of popular deep learning networks with TensorRT network definition API 🚀 Github 鏡像倉庫 🚀 源項目地址https://gitcode.net/mirrors/wang-xinyu/tensorrtx?utm_source=csdn_github_accelerator

    2. 下載完畢之后在文件夾里找到gen_wts.py,然后復制到yolov5文件夾下,右鍵打開終端,執行命令后生成yolov5.wts文件:

    python3 gen_wts.py --w yolov5s.pt

    注:每個人的文件路徑不同,這個根據自己的途權重路徑而改變,一般路徑都在tensorrtx-yolov5-v5.0 -> yolov5 -> gen_wts.pt。

    ?3. 找到yololayer.h文件,打開修改類別數量(根據自己的情況而定),和輸入圖片大小(修改是盡量是32的倍數)

    4. 在當前目錄下創建文件build,命令如下:

    maker build #創建build文件夾cd build #進入buildcmake .. #構建項目#將我們上面生成的.wts文件復制到build文件夾中make

    5. 將上面生成的yolov5.wts文件拖到tensortx/yolov5下,右鍵打開終端:

    sudo ./yolov5 -s yolov5s.wts yolov5s.engine s

    6. 在tensorrtx-yolov5-v5.0\yolov5下新建sample文件夾,在里面放一張需要測試的圖片(盡量放人的圖片)進行測試,命令如下?:

    sudo ./yolov5 -d yolov5s.engine ../sample

    注:運行之后 ,在build文件夾下會生成一張檢測過的圖片,但是效果不是很好,這個是正?,F象。

    7.?測試圖片看不出效果,并且真正部署到生產環境,交付給用戶使用.是通過調用攝像頭.所以要改一下tensorrtx-yolov5-v5.0 -> yolov5.cpp,可以參考網上大神的教程:

    #include <iostream> #include <chrono> #include "cuda_utils.h" #include "logging.h" #include "common.hpp" #include "utils.h" #include "calibrator.h"#define USE_FP16 // set USE_INT8 or USE_FP16 or USE_FP32 #define DEVICE 0 // GPU id #define NMS_THRESH 0.4 #define CONF_THRESH 0.5 #define BATCH_SIZE 1// stuff we know about the network and the input/output blobs static const int INPUT_H = Yolo::INPUT_H; static const int INPUT_W = Yolo::INPUT_W; static const int CLASS_NUM = Yolo::CLASS_NUM; static const int OUTPUT_SIZE = Yolo::MAX_OUTPUT_BBOX_COUNT * sizeof(Yolo::Detection) / sizeof(float) + 1; // we assume the yololayer outputs no more than MAX_OUTPUT_BBOX_COUNT boxes that conf >= 0.1 const char* INPUT_BLOB_NAME = "data"; const char* OUTPUT_BLOB_NAME = "prob"; static Logger gLogger;//修改為自己的類別 char *my_classes[]={ "person", "bicycle", "car", "motorcycle", "airplane", "bus", "train", "truck", "boat", "traffic light","fire hydrant", "stop sign", "parking meter", "bench", "bird", "cat", "dog", "horse", "sheep", "cow","elephant", "bear", "zebra", "giraffe", "backpack", "umbrella", "handbag", "tie", "suitcase", "frisbee","skis", "snowboard", "sports ball", "kite", "baseball bat", "baseball glove", "skateboard","surfboard","tennis racket", "bottle", "wine glass", "cup", "fork", "knife", "spoon", "bowl", "banana", "apple","sandwich", "orange", "broccoli", "carrot", "hot dog", "pizza", "donut", "cake", "chair", "couch","potted plant", "bed", "dining table", "toilet", "tv", "laptop", "mouse", "remote", "keyboard", "cell phone","microwave", "oven", "toaster", "sink", "refrigerator", "book", "clock", "vase", "scissors", "teddy bear","hair drier", "toothbrush" };static int get_width(int x, float gw, int divisor = 8) {//return math.ceil(x / divisor) * divisorif (int(x * gw) % divisor == 0) {return int(x * gw);}return (int(x * gw / divisor) + 1) * divisor; }static int get_depth(int x, float gd) {if (x == 1) {return 1;}else {return round(x * gd) > 1 ? round(x * gd) : 1;} }//#創建engine和network ICudaEngine* build_engine(unsigned int maxBatchSize, IBuilder* builder, IBuilderConfig* config, DataType dt, float& gd, float& gw, std::string& wts_name) {INetworkDefinition* network = builder->createNetworkV2(0U);// Create input tensor of shape {3, INPUT_H, INPUT_W} with name INPUT_BLOB_NAMEITensor* data = network->addInput(INPUT_BLOB_NAME, dt, Dims3{ 3, INPUT_H, INPUT_W });assert(data);std::map<std::string, Weights> weightMap = loadWeights(wts_name);/* ------ yolov5 backbone------ */auto focus0 = focus(network, weightMap, *data, 3, get_width(64, gw), 3, "model.0");auto conv1 = convBlock(network, weightMap, *focus0->getOutput(0), get_width(128, gw), 3, 2, 1, "model.1");auto bottleneck_CSP2 = C3(network, weightMap, *conv1->getOutput(0), get_width(128, gw), get_width(128, gw), get_depth(3, gd), true, 1, 0.5, "model.2");auto conv3 = convBlock(network, weightMap, *bottleneck_CSP2->getOutput(0), get_width(256, gw), 3, 2, 1, "model.3");auto bottleneck_csp4 = C3(network, weightMap, *conv3->getOutput(0), get_width(256, gw), get_width(256, gw), get_depth(9, gd), true, 1, 0.5, "model.4");auto conv5 = convBlock(network, weightMap, *bottleneck_csp4->getOutput(0), get_width(512, gw), 3, 2, 1, "model.5");auto bottleneck_csp6 = C3(network, weightMap, *conv5->getOutput(0), get_width(512, gw), get_width(512, gw), get_depth(9, gd), true, 1, 0.5, "model.6");auto conv7 = convBlock(network, weightMap, *bottleneck_csp6->getOutput(0), get_width(1024, gw), 3, 2, 1, "model.7");auto spp8 = SPP(network, weightMap, *conv7->getOutput(0), get_width(1024, gw), get_width(1024, gw), 5, 9, 13, "model.8");/* ------ yolov5 head ------ */auto bottleneck_csp9 = C3(network, weightMap, *spp8->getOutput(0), get_width(1024, gw), get_width(1024, gw), get_depth(3, gd), false, 1, 0.5, "model.9");auto conv10 = convBlock(network, weightMap, *bottleneck_csp9->getOutput(0), get_width(512, gw), 1, 1, 1, "model.10");auto upsample11 = network->addResize(*conv10->getOutput(0));assert(upsample11);upsample11->setResizeMode(ResizeMode::kNEAREST);upsample11->setOutputDimensions(bottleneck_csp6->getOutput(0)->getDimensions());ITensor* inputTensors12[] = { upsample11->getOutput(0), bottleneck_csp6->getOutput(0) };auto cat12 = network->addConcatenation(inputTensors12, 2);auto bottleneck_csp13 = C3(network, weightMap, *cat12->getOutput(0), get_width(1024, gw), get_width(512, gw), get_depth(3, gd), false, 1, 0.5, "model.13");auto conv14 = convBlock(network, weightMap, *bottleneck_csp13->getOutput(0), get_width(256, gw), 1, 1, 1, "model.14");auto upsample15 = network->addResize(*conv14->getOutput(0));assert(upsample15);upsample15->setResizeMode(ResizeMode::kNEAREST);upsample15->setOutputDimensions(bottleneck_csp4->getOutput(0)->getDimensions());ITensor* inputTensors16[] = { upsample15->getOutput(0), bottleneck_csp4->getOutput(0) };auto cat16 = network->addConcatenation(inputTensors16, 2);auto bottleneck_csp17 = C3(network, weightMap, *cat16->getOutput(0), get_width(512, gw), get_width(256, gw), get_depth(3, gd), false, 1, 0.5, "model.17");// yolo layer 0IConvolutionLayer* det0 = network->addConvolutionNd(*bottleneck_csp17->getOutput(0), 3 * (Yolo::CLASS_NUM + 5), DimsHW{ 1, 1 }, weightMap["model.24.m.0.weight"], weightMap["model.24.m.0.bias"]);auto conv18 = convBlock(network, weightMap, *bottleneck_csp17->getOutput(0), get_width(256, gw), 3, 2, 1, "model.18");ITensor* inputTensors19[] = { conv18->getOutput(0), conv14->getOutput(0) };auto cat19 = network->addConcatenation(inputTensors19, 2);auto bottleneck_csp20 = C3(network, weightMap, *cat19->getOutput(0), get_width(512, gw), get_width(512, gw), get_depth(3, gd), false, 1, 0.5, "model.20");//yolo layer 1IConvolutionLayer* det1 = network->addConvolutionNd(*bottleneck_csp20->getOutput(0), 3 * (Yolo::CLASS_NUM + 5), DimsHW{ 1, 1 }, weightMap["model.24.m.1.weight"], weightMap["model.24.m.1.bias"]);auto conv21 = convBlock(network, weightMap, *bottleneck_csp20->getOutput(0), get_width(512, gw), 3, 2, 1, "model.21");ITensor* inputTensors22[] = { conv21->getOutput(0), conv10->getOutput(0) };auto cat22 = network->addConcatenation(inputTensors22, 2);auto bottleneck_csp23 = C3(network, weightMap, *cat22->getOutput(0), get_width(1024, gw), get_width(1024, gw), get_depth(3, gd), false, 1, 0.5, "model.23");IConvolutionLayer* det2 = network->addConvolutionNd(*bottleneck_csp23->getOutput(0), 3 * (Yolo::CLASS_NUM + 5), DimsHW{ 1, 1 }, weightMap["model.24.m.2.weight"], weightMap["model.24.m.2.bias"]);auto yolo = addYoLoLayer(network, weightMap, "model.24", std::vector<IConvolutionLayer*>{det0, det1, det2});yolo->getOutput(0)->setName(OUTPUT_BLOB_NAME);network->markOutput(*yolo->getOutput(0));// Build enginebuilder->setMaxBatchSize(maxBatchSize);config->setMaxWorkspaceSize(16 * (1 << 20)); // 16MB #if defined(USE_FP16)config->setFlag(BuilderFlag::kFP16); #elif defined(USE_INT8)std::cout << "Your platform support int8: " << (builder->platformHasFastInt8() ? "true" : "false") << std::endl;assert(builder->platformHasFastInt8());config->setFlag(BuilderFlag::kINT8);Int8EntropyCalibrator2* calibrator = new Int8EntropyCalibrator2(1, INPUT_W, INPUT_H, "./coco_calib/", "int8calib.table", INPUT_BLOB_NAME);config->setInt8Calibrator(calibrator); #endifstd::cout << "Building engine, please wait for a while..." << std::endl;ICudaEngine* engine = builder->buildEngineWithConfig(*network, *config);std::cout << "Build engine successfully!" << std::endl;// Don't need the network any morenetwork->destroy();// Release host memoryfor (auto& mem : weightMap){free((void*)(mem.second.values));}return engine; }ICudaEngine* build_engine_p6(unsigned int maxBatchSize, IBuilder* builder, IBuilderConfig* config, DataType dt, float& gd, float& gw, std::string& wts_name) {INetworkDefinition* network = builder->createNetworkV2(0U);// Create input tensor of shape {3, INPUT_H, INPUT_W} with name INPUT_BLOB_NAMEITensor* data = network->addInput(INPUT_BLOB_NAME, dt, Dims3{ 3, INPUT_H, INPUT_W });assert(data);std::map<std::string, Weights> weightMap = loadWeights(wts_name);/* ------ yolov5 backbone------ */auto focus0 = focus(network, weightMap, *data, 3, get_width(64, gw), 3, "model.0");auto conv1 = convBlock(network, weightMap, *focus0->getOutput(0), get_width(128, gw), 3, 2, 1, "model.1");auto c3_2 = C3(network, weightMap, *conv1->getOutput(0), get_width(128, gw), get_width(128, gw), get_depth(3, gd), true, 1, 0.5, "model.2");auto conv3 = convBlock(network, weightMap, *c3_2->getOutput(0), get_width(256, gw), 3, 2, 1, "model.3");auto c3_4 = C3(network, weightMap, *conv3->getOutput(0), get_width(256, gw), get_width(256, gw), get_depth(9, gd), true, 1, 0.5, "model.4");auto conv5 = convBlock(network, weightMap, *c3_4->getOutput(0), get_width(512, gw), 3, 2, 1, "model.5");auto c3_6 = C3(network, weightMap, *conv5->getOutput(0), get_width(512, gw), get_width(512, gw), get_depth(9, gd), true, 1, 0.5, "model.6");auto conv7 = convBlock(network, weightMap, *c3_6->getOutput(0), get_width(768, gw), 3, 2, 1, "model.7");auto c3_8 = C3(network, weightMap, *conv7->getOutput(0), get_width(768, gw), get_width(768, gw), get_depth(3, gd), true, 1, 0.5, "model.8");auto conv9 = convBlock(network, weightMap, *c3_8->getOutput(0), get_width(1024, gw), 3, 2, 1, "model.9");auto spp10 = SPP(network, weightMap, *conv9->getOutput(0), get_width(1024, gw), get_width(1024, gw), 3, 5, 7, "model.10");auto c3_11 = C3(network, weightMap, *spp10->getOutput(0), get_width(1024, gw), get_width(1024, gw), get_depth(3, gd), false, 1, 0.5, "model.11");/* ------ yolov5 head ------ */auto conv12 = convBlock(network, weightMap, *c3_11->getOutput(0), get_width(768, gw), 1, 1, 1, "model.12");auto upsample13 = network->addResize(*conv12->getOutput(0));assert(upsample13);upsample13->setResizeMode(ResizeMode::kNEAREST);upsample13->setOutputDimensions(c3_8->getOutput(0)->getDimensions());ITensor* inputTensors14[] = { upsample13->getOutput(0), c3_8->getOutput(0) };auto cat14 = network->addConcatenation(inputTensors14, 2);auto c3_15 = C3(network, weightMap, *cat14->getOutput(0), get_width(1536, gw), get_width(768, gw), get_depth(3, gd), false, 1, 0.5, "model.15");auto conv16 = convBlock(network, weightMap, *c3_15->getOutput(0), get_width(512, gw), 1, 1, 1, "model.16");auto upsample17 = network->addResize(*conv16->getOutput(0));assert(upsample17);upsample17->setResizeMode(ResizeMode::kNEAREST);upsample17->setOutputDimensions(c3_6->getOutput(0)->getDimensions());ITensor* inputTensors18[] = { upsample17->getOutput(0), c3_6->getOutput(0) };auto cat18 = network->addConcatenation(inputTensors18, 2);auto c3_19 = C3(network, weightMap, *cat18->getOutput(0), get_width(1024, gw), get_width(512, gw), get_depth(3, gd), false, 1, 0.5, "model.19");auto conv20 = convBlock(network, weightMap, *c3_19->getOutput(0), get_width(256, gw), 1, 1, 1, "model.20");auto upsample21 = network->addResize(*conv20->getOutput(0));assert(upsample21);upsample21->setResizeMode(ResizeMode::kNEAREST);upsample21->setOutputDimensions(c3_4->getOutput(0)->getDimensions());ITensor* inputTensors21[] = { upsample21->getOutput(0), c3_4->getOutput(0) };auto cat22 = network->addConcatenation(inputTensors21, 2);auto c3_23 = C3(network, weightMap, *cat22->getOutput(0), get_width(512, gw), get_width(256, gw), get_depth(3, gd), false, 1, 0.5, "model.23");auto conv24 = convBlock(network, weightMap, *c3_23->getOutput(0), get_width(256, gw), 3, 2, 1, "model.24");ITensor* inputTensors25[] = { conv24->getOutput(0), conv20->getOutput(0) };auto cat25 = network->addConcatenation(inputTensors25, 2);auto c3_26 = C3(network, weightMap, *cat25->getOutput(0), get_width(1024, gw), get_width(512, gw), get_depth(3, gd), false, 1, 0.5, "model.26");auto conv27 = convBlock(network, weightMap, *c3_26->getOutput(0), get_width(512, gw), 3, 2, 1, "model.27");ITensor* inputTensors28[] = { conv27->getOutput(0), conv16->getOutput(0) };auto cat28 = network->addConcatenation(inputTensors28, 2);auto c3_29 = C3(network, weightMap, *cat28->getOutput(0), get_width(1536, gw), get_width(768, gw), get_depth(3, gd), false, 1, 0.5, "model.29");auto conv30 = convBlock(network, weightMap, *c3_29->getOutput(0), get_width(768, gw), 3, 2, 1, "model.30");ITensor* inputTensors31[] = { conv30->getOutput(0), conv12->getOutput(0) };auto cat31 = network->addConcatenation(inputTensors31, 2);auto c3_32 = C3(network, weightMap, *cat31->getOutput(0), get_width(2048, gw), get_width(1024, gw), get_depth(3, gd), false, 1, 0.5, "model.32");/* ------ detect ------ */IConvolutionLayer* det0 = network->addConvolutionNd(*c3_23->getOutput(0), 3 * (Yolo::CLASS_NUM + 5), DimsHW{ 1, 1 }, weightMap["model.33.m.0.weight"], weightMap["model.33.m.0.bias"]);IConvolutionLayer* det1 = network->addConvolutionNd(*c3_26->getOutput(0), 3 * (Yolo::CLASS_NUM + 5), DimsHW{ 1, 1 }, weightMap["model.33.m.1.weight"], weightMap["model.33.m.1.bias"]);IConvolutionLayer* det2 = network->addConvolutionNd(*c3_29->getOutput(0), 3 * (Yolo::CLASS_NUM + 5), DimsHW{ 1, 1 }, weightMap["model.33.m.2.weight"], weightMap["model.33.m.2.bias"]);IConvolutionLayer* det3 = network->addConvolutionNd(*c3_32->getOutput(0), 3 * (Yolo::CLASS_NUM + 5), DimsHW{ 1, 1 }, weightMap["model.33.m.3.weight"], weightMap["model.33.m.3.bias"]);auto yolo = addYoLoLayer(network, weightMap, "model.33", std::vector<IConvolutionLayer*>{det0, det1, det2, det3});yolo->getOutput(0)->setName(OUTPUT_BLOB_NAME);network->markOutput(*yolo->getOutput(0));// Build enginebuilder->setMaxBatchSize(maxBatchSize);config->setMaxWorkspaceSize(16 * (1 << 20)); // 16MB #if defined(USE_FP16)config->setFlag(BuilderFlag::kFP16); #elif defined(USE_INT8)std::cout << "Your platform support int8: " << (builder->platformHasFastInt8() ? "true" : "false") << std::endl;assert(builder->platformHasFastInt8());config->setFlag(BuilderFlag::kINT8);Int8EntropyCalibrator2* calibrator = new Int8EntropyCalibrator2(1, INPUT_W, INPUT_H, "./coco_calib/", "int8calib.table", INPUT_BLOB_NAME);config->setInt8Calibrator(calibrator); #endifstd::cout << "Building engine, please wait for a while..." << std::endl;ICudaEngine* engine = builder->buildEngineWithConfig(*network, *config);std::cout << "Build engine successfully!" << std::endl;// Don't need the network any morenetwork->destroy();// Release host memoryfor (auto& mem : weightMap){free((void*)(mem.second.values));}return engine; }void APIToModel(unsigned int maxBatchSize, IHostMemory** modelStream, float& gd, float& gw, std::string& wts_name) {// Create builderIBuilder* builder = createInferBuilder(gLogger);IBuilderConfig* config = builder->createBuilderConfig();// Create model to populate the network, then set the outputs and create an engineICudaEngine* engine = build_engine(maxBatchSize, builder, config, DataType::kFLOAT, gd, gw, wts_name);assert(engine != nullptr);// Serialize the engine(*modelStream) = engine->serialize();// Close everything downengine->destroy();builder->destroy();config->destroy(); }void doInference(IExecutionContext& context, cudaStream_t& stream, void** buffers, float* input, float* output, int batchSize) {// DMA input batch data to device, infer on the batch asynchronously, and DMA output back to hostCUDA_CHECK(cudaMemcpyAsync(buffers[0], input, batchSize * 3 * INPUT_H * INPUT_W * sizeof(float), cudaMemcpyHostToDevice, stream));context.enqueue(batchSize, buffers, stream, nullptr);CUDA_CHECK(cudaMemcpyAsync(output, buffers[1], batchSize * OUTPUT_SIZE * sizeof(float), cudaMemcpyDeviceToHost, stream));cudaStreamSynchronize(stream); }bool parse_args(int argc, char** argv, std::string& engine) {if (argc < 3) return false;if (std::string(argv[1]) == "-v" && argc == 3) {engine = std::string(argv[2]);}else {return false;}return true; }int main(int argc, char** argv) {cudaSetDevice(DEVICE);//std::string wts_name = "";std::string engine_name = "";//float gd = 0.0f, gw = 0.0f;//std::string img_dir;if (!parse_args(argc, argv, engine_name)) {std::cerr << "arguments not right!" << std::endl;std::cerr << "./yolov5 -v [.engine] // run inference with camera" << std::endl;return -1;}std::ifstream file(engine_name, std::ios::binary);if (!file.good()) {std::cerr << " read " << engine_name << " error! " << std::endl;return -1;}char* trtModelStream{ nullptr };size_t size = 0;file.seekg(0, file.end);size = file.tellg();file.seekg(0, file.beg);trtModelStream = new char[size];assert(trtModelStream);file.read(trtModelStream, size);file.close();// prepare input data ---------------------------static float data[BATCH_SIZE * 3 * INPUT_H * INPUT_W];//for (int i = 0; i < 3 * INPUT_H * INPUT_W; i++)// data[i] = 1.0;static float prob[BATCH_SIZE * OUTPUT_SIZE];IRuntime* runtime = createInferRuntime(gLogger);assert(runtime != nullptr);ICudaEngine* engine = runtime->deserializeCudaEngine(trtModelStream, size);assert(engine != nullptr);IExecutionContext* context = engine->createExecutionContext();assert(context != nullptr);delete[] trtModelStream;assert(engine->getNbBindings() == 2);void* buffers[2];// In order to bind the buffers, we need to know the names of the input and output tensors.// Note that indices are guaranteed to be less than IEngine::getNbBindings()const int inputIndex = engine->getBindingIndex(INPUT_BLOB_NAME);const int outputIndex = engine->getBindingIndex(OUTPUT_BLOB_NAME);assert(inputIndex == 0);assert(outputIndex == 1);// Create GPU buffers on deviceCUDA_CHECK(cudaMalloc(&buffers[inputIndex], BATCH_SIZE * 3 * INPUT_H * INPUT_W * sizeof(float)));CUDA_CHECK(cudaMalloc(&buffers[outputIndex], BATCH_SIZE * OUTPUT_SIZE * sizeof(float)));// Create streamcudaStream_t stream;CUDA_CHECK(cudaStreamCreate(&stream));//#讀取本地視頻//cv::VideoCapture capture("/home/nano/Videos/video.mp4");//#調用本地usb攝像頭,我的默認參數為1,如果1報錯,可修改為0.cv::VideoCapture capture(1);if (!capture.isOpened()) {std::cout << "Error opening video stream or file" << std::endl;return -1;}int key;int fcount = 0;while (1){cv::Mat frame;capture >> frame;if (frame.empty()){std::cout << "Fail to read image from camera!" << std::endl;break;}fcount++;//if (fcount < BATCH_SIZE && f + 1 != (int)file_names.size()) continue;for (int b = 0; b < fcount; b++) {//cv::Mat img = cv::imread(img_dir + "/" + file_names[f - fcount + 1 + b]);cv::Mat img = frame;if (img.empty()) continue;cv::Mat pr_img = preprocess_img(img, INPUT_W, INPUT_H); // letterbox BGR to RGBint i = 0;for (int row = 0; row < INPUT_H; ++row) {uchar* uc_pixel = pr_img.data + row * pr_img.step;for (int col = 0; col < INPUT_W; ++col) {data[b * 3 * INPUT_H * INPUT_W + i] = (float)uc_pixel[2] / 255.0;data[b * 3 * INPUT_H * INPUT_W + i + INPUT_H * INPUT_W] = (float)uc_pixel[1] / 255.0;data[b * 3 * INPUT_H * INPUT_W + i + 2 * INPUT_H * INPUT_W] = (float)uc_pixel[0] / 255.0;uc_pixel += 3;++i;}}}// Run inferenceauto start = std::chrono::system_clock::now();//#獲取模型推理開始時間doInference(*context, stream, buffers, data, prob, BATCH_SIZE);auto end = std::chrono::system_clock::now();//#結束時間//std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() << "ms" << std::endl;int fps = 1000.0 / std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();std::vector<std::vector<Yolo::Detection>> batch_res(fcount);for (int b = 0; b < fcount; b++) {auto& res = batch_res[b];nms(res, &prob[b * OUTPUT_SIZE], CONF_THRESH, NMS_THRESH);}for (int b = 0; b < fcount; b++) {auto& res = batch_res[b];//std::cout << res.size() << std::endl;//cv::Mat img = cv::imread(img_dir + "/" + file_names[f - fcount + 1 + b]);for (size_t j = 0; j < res.size(); j++) {cv::Rect r = get_rect(frame, res[j].bbox);cv::rectangle(frame, r, cv::Scalar(0x27, 0xC1, 0x36), 2);std::string label = my_classes[(int)res[j].class_id];cv::putText(frame, label, cv::Point(r.x, r.y - 1), cv::FONT_HERSHEY_PLAIN, 1.2, cv::Scalar(0xFF, 0xFF, 0xFF), 2);std::string jetson_fps = "FPS: " + std::to_string(fps);cv::putText(frame, jetson_fps, cv::Point(11, 80), cv::FONT_HERSHEY_PLAIN, 3, cv::Scalar(0, 0, 255), 2, cv::LINE_AA);}//cv::imwrite("_" + file_names[f - fcount + 1 + b], img);}cv::imshow("yolov5", frame);key = cv::waitKey(1);if (key == 'q') {break;}fcount = 0;}capture.release();// Release stream and bufferscudaStreamDestroy(stream);CUDA_CHECK(cudaFree(buffers[inputIndex]));CUDA_CHECK(cudaFree(buffers[outputIndex]));// Destroy the enginecontext->destroy();engine->destroy();runtime->destroy();return 0; }

    修改完.cpp代碼之后,tensorrtx-yolov5-v5.0 -> yolov5 - > build文件夾下,運行以下命令:

    make sudo ./yolov5 -v yolov5s.engine

    運行之后攝像頭調用成功,效果如下:

    到此我們就大功告成了,以上就是Jeston nano完整的部署過程,希望對你們有所幫助,請大家多多支持。創作不易,希望得到你們的鼓勵~

    總結

    以上是生活随笔為你收集整理的Jetson nano部署Yolov5目标检测 + Tensor RT加速(超级详细版)的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    国产精品久久伊人 | 香蕉视频亚洲 | 日日躁天天躁 | 99久久久久久久 | 精品视频成人 | 97超碰在线视 | 成人黄色免费在线观看 | 国产精品久久久久久久7电影 | 亚洲成人午夜av | 免费观看91视频大全 | 草莓视频在线观看免费观看 | 日韩视频免费观看高清完整版在线 | 国产精品久久久网站 | 成人在线视频你懂的 | 精品欧美小视频在线观看 | 婷婷日日 | 亚洲精品资源在线观看 | 美女国产 | 日日干日日操 | 国产福利一区二区在线 | 日韩精品久久一区二区三区 | 在线国产小视频 | 精品国产乱码久久久久久久 | 久久黄色a级片 | 亚洲情影院| 久久成人综合视频 | 日韩欧美一二三 | 超碰97人人射妻 | 黄色片视频免费 | 最新国产精品亚洲 | 久久久久免费精品国产小说色大师 | 中文字幕视频在线播放 | 久久久久久久久久久电影 | 成人中文字幕+乱码+中文字幕 | 亚洲激情在线视频 | 操操操夜夜操 | 国产美女视频免费观看的网站 | 精品色综合 | 国产精品国产三级国产aⅴ入口 | 国产精品视频专区 | 超碰国产人人 | 黄色小网站在线观看 | 国产小视频福利在线 | 日日综合 | 国产色视频123区 | 91在线蜜桃臀 | 日本女人在线观看 | 精品在线一区二区三区 | 国产精品九九热 | 日b视频国产 | 中文字幕日韩在线播放 | 久久与婷婷 | 日韩精品一区二区三区第95 | 精品久久久久久一区二区里番 | 久草香蕉在线 | 黄色网址国产 | 成人va视频 | 精品国产伦一区二区三区观看方式 | 在线视频精品播放 | 中文字幕av播放 | 国产免费a| 久久福利剧场 | 天天天干 | 久久精品之 | 国产在线视频导航 | a在线v| 亚洲欧美在线视频免费 | 国语自产偷拍精品视频偷 | 色综合婷婷久久 | 亚洲天天干 | 日本在线观看一区 | 91精品视频在线免费观看 | 成人免费电影 | 久久久久久国产精品美女 | 激情综合久久 | 国内精品久久久久影院男同志 | 亚洲精品日韩在线观看 | 免费看黄色毛片 | 国产一线二线三线性视频 | 手机看片国产日韩 | 在线视频成人 | 国产成人综合精品 | 中文字幕在线不卡国产视频 | 国产免费作爱视频 | 久久伊人91| 欧美成人在线免费 | 91精品国产成人www | 日韩欧美成 | 免费毛片一区二区三区久久久 | 99久久精品国产观看 | 黄色aaaaa| 色综合久久五月天 | 久久久久成人精品 | 亚洲区另类春色综合小说校园片 | 国产专区免费 | 国产精品久久一区二区无卡 | 久久深夜福利免费观看 | 一区二区三区免费在线观看视频 | 国产69精品久久久久9999apgf | 97香蕉超级碰碰久久免费软件 | 久久五月情影视 | 中文字幕在线观看完整版 | 69av在线视频 | 久久国产精品免费一区 | 精品久久一区二区 | 欧美久久久久久 | 日韩在线观看视频在线 | 国产涩涩网站 | 欧美调教网站 | 精品在线一区二区三区 | 久久99日韩 | 日韩 精品 一区 国产 麻豆 | 国产精品视频内 | 成人av午夜 | 九九免费在线观看视频 | 精品99免费视频 | 欧美a视频在线观看 | 成人在线观看资源 | 日本三级人妇 | 欧美视频在线观看免费网址 | 少妇视频在线播放 | 精品嫩模福利一区二区蜜臀 | 久久久久久久久久久久久影院 | 性色av一区二区三区在线观看 | 天天视频色 | 婷婷av网 | 国偷自产视频一区二区久 | 天天艹天天 | 日韩精品一区二区在线观看 | 久久av高清 | 国产精品久久网 | 黄色一级在线免费观看 | 在线播放 日韩专区 | 精品女同一区二区三区在线观看 | 欧美一级欧美一级 | 久草在线免费播放 | 亚洲区色 | 国产区高清在线 | 一区二区精品视频 | 99视频在线免费观看 | 欧美一级高清片 | 国产精品18久久久久vr手机版特色 | 在线观看国产成人av片 | 免费午夜网站 | 国产偷在线 | 婷婷香蕉| 亚洲黄色在线免费观看 | 天天爱天天干天天爽 | 99久久99视频只有精品 | 国产高清无av久久 | 亚洲黄色精品 | 日韩午夜小视频 | 久久草精品 | 国产精品综合久久久久久 | 国产一区二区精品 | 狠狠色丁香婷综合久久 | 国产精品美女视频网站 | 亚洲精品一区二区18漫画 | 欧美日韩国产页 | 开心激情网五月天 | 国产成免费视频 | 欧美韩国日本在线 | 18久久久久久 | 免费视频二区 | 欧美天天综合 | 国产精品亚洲视频 | 成人久久影院 | 国产在线91在线电影 | av中文天堂在线 | 欧美一级片在线播放 | 婷婷色在线观看 | 欧美日韩高清免费 | 久久成人亚洲欧美电影 | 丁香六月网| 国产精品第72页 | 丁香花中文字幕 | 91九色porny蝌蚪主页 | 国产免费亚洲高清 | 久久久久成人精品免费播放动漫 | 久久综合精品国产一区二区三区 | 成人在线视频观看 | 久久理论电影网 | 久久综合给合久久狠狠色 | 少妇资源站 | 国产精品专区h在线观看 | 久草线| 免费人成在线观看 | 国产区免费在线 | 少妇av网| 午夜精品一区二区三区四区 | 欧美片网站yy | 一区二区三区在线观看中文字幕 | 91传媒在线观看 | 在线观看你懂的网址 | 九九九毛片 | 国产视频一区二区在线 | 亚洲国产电影在线观看 | 天天干天天干天天操 | 一区在线观看 | 伊人丁香 | 国产成人99av超碰超爽 | 国产第一页在线播放 | 综合国产在线观看 | 国产一区二区精品91 | 亚洲精品av中文字幕在线在线 | 亚洲精品久久在线 | 亚洲精品www久久久久久 | 在线观看中文字幕一区 | 日韩高清免费无专码区 | 九九免费在线观看 | 99精品视频免费全部在线 | 91精品国产网站 | 五月激情天 | 中文在线中文a | 日韩精品一卡 | 日本99精品| 999在线精品 | 国产美女视频黄a视频免费 久久综合九色欧美综合狠狠 | 不卡的av片 | 久久综合九色欧美综合狠狠 | 亚洲成人av一区二区 | 激情综合网五月激情 | 四虎在线观看视频 | 国产精品第一视频 | 国产中文字幕国产 | 97精产国品一二三产区在线 | 99久久精品国产亚洲 | 福利视频午夜 | 天天操天天舔天天干 | av黄色一级片 | 亚洲激情在线视频 | 亚洲爱视频 | 久久刺激视频 | 中文字幕在线不卡国产视频 | 久99精品| 九色在线视频 | 久久夜视频 | av中文字幕av| 久久亚洲福利 | 日韩在线观看三区 | 干 操 插 | 中文字幕乱偷在线 | 欧美日韩免费一区二区三区 | 久久这里有 | 国产精品在线看 | 91人人在线 | 99久久精品电影 | 五月婷婷一区二区三区 | 日韩资源在线播放 | 国内精品小视频 | www.国产视频 | 蜜臀av性久久久久蜜臀aⅴ四虎 | 欧美激情视频三区 | 久操视频在线观看 | 欧美伊人网 | 国产精品久久久久永久免费看 | 黄色日本免费 | 国产成人综 | 国产一级二级在线播放 | 欧洲一区精品 | 婷婷av综合 | 日韩大片在线看 | 天天爱天天 | 久久久国产精品成人免费 | 国产免费片 | 亚洲精品国产精品国自产在线 | 1000部18岁以下禁看视频 | 视频一区在线播放 | 五月天堂网 | 欧美亚洲另类在线视频 | 成人影视免费看 | 国产美女精品久久久 | 精品99视频 | 狠狠色狠狠综合久久 | 久久精品欧美一 | 韩国视频一区二区三区 | av免费网站观看 | 麻豆一区在线观看 | 私人av| 香蕉网在线播放 | 99久久久久 | 久久欧美在线电影 | 91久久久国产精品 | 日本久久久精品视频 | 免费av小说 | 探花视频免费在线观看 | 色香蕉网 | 日韩av男人的天堂 | 色人久久 | 视频一区在线免费观看 | 91麻豆精品国产91久久久使用方法 | 一级黄色免费 | 久章草在线 | 免费99| 久久午夜免费观看 | 九色精品免费永久在线 | 亚洲乱码一区 | av观看网站 | 久久区二区 | 免费进去里的视频 | 91免费观看视频网站 | 91精品日韩 | 国产在线最新 | 美女视频免费精品 | 亚洲a色 | 欧美ⅹxxxxxx | www激情网 | 久久精品中文 | 97国产大学生情侣白嫩酒店 | 国产欧美精品一区二区三区 | 国产精品自产拍在线观看 | 一区二区理论片 | 日韩av高清 | 亚洲精品在线一区二区 | 一区二区三区中文字幕在线观看 | 久久久午夜剧场 | 欧美日韩99 | 亚洲波多野结衣 | 国产区精品区 | 亚洲黄色软件 | 国产91丝袜在线播放动漫 | 国产香蕉视频 | 国产第一页精品 | 国内久久久久久 | 日韩网站一区 | 国产成人一区二区三区在线观看 | 欧美日韩二区在线 | 亚洲免费国产 | 一区二区视频网站 | 国产一卡二卡四卡国 | 国产精品99久久久久久久久 | 久久系列 | 国产精品成人自拍 | 亚洲天天 | 亚洲欧美国产精品va在线观看 | 人人艹视频 | a天堂最新版中文在线地址 久久99久久精品国产 | 天天干天天干天天干 | 欧美日韩国产精品一区二区 | 成人香蕉视频 | 成年人免费在线播放 | 久草资源免费 | 在线黄色毛片 | 97干com| 日本黄区免费视频观看 | www黄免费 | 久久国产精品二国产精品中国洋人 | 久久精品亚洲精品国产欧美 | 欧美黑人性爽 | 黄色亚洲片 | 日韩欧美不卡 | 国产亚洲综合在线 | 婷婷草| 国产欧美最新羞羞视频在线观看 | 久久精品三级 | 亚洲黄色软件 | 黄色在线观看免费 | 欧美日韩在线电影 | 国产一区在线看 | 91桃色视频 | 久久96 | 在线观看完整版免费 | 麻豆91精品91久久久 | 日本在线观看中文字幕 | 久久99电影| 日批在线观看 | 中文字幕一区av | 狠狠狠狠狠狠操 | 麻豆视频在线 | 国产精品美女在线观看 | 色在线免费 | 91漂亮少妇露脸在线播放 | 99热999 | 国产视频精选 | 天天狠狠干 | 91久久丝袜国产露脸动漫 | 国产五月婷婷 | 国产一级一片免费播放放 | 成人国产精品入口 | 婷婷亚洲最大 | 91亚洲精| 麻豆视频免费在线 | 久久爱资源网 | 国产精品美女视频 | 中文字幕乱码亚洲精品一区 | 人九九精品 | 国产亚州精品视频 | 亚洲精品视频免费看 | 亚洲资源在线 | a黄色影院 | 国产中文字幕视频在线 | 碰超在线97人人 | 91人人爱 | 黄色毛片视频免费 | 黄色电影网站在线观看 | 欧美日韩一区二区免费在线观看 | 国产福利中文字幕 | 在线观看岛国av | 亚洲视频 视频在线 | 欧美日韩高清一区二区 | 九九九在线观看 | 精品久久片 | 欧美日韩69 | 最近最新mv字幕免费观看 | 蜜臀av性久久久久蜜臀aⅴ涩爱 | 精品国产乱码久久久久久天美 | 国产精品永久免费视频 | 国产一区二区三区高清播放 | 九九热久久免费视频 | 日本二区三区在线 | www.久久免费 | 黄色三级视频片 | 国产精品不卡在线观看 | 成人黄色电影在线 | 国产97视频在线 | 香蕉在线影院 | 亚洲国产资源 | 999亚洲国产996395 | 国产精品免费小视频 | 国产精品 日韩精品 | 激情综合五月婷婷 | 国产在线精品一区二区不卡了 | 在线观看日本高清mv视频 | 一级黄色毛片 | 国产小视频在线观看免费 | 国产一级黄| 国产精品久久久久久久久久久久久久 | 久久综合久久伊人 | 国产无限资源在线观看 | av电影免费看| 亚洲理论电影网 | av电影中文字幕在线观看 | 超碰99在线 | 99亚洲视频 | 蜜臀av网址 | 国产美女免费观看 | 亚洲成人精品av | 在线观看中文字幕第一页 | 国产成人精品一区一区一区 | 国产精品黄色av | 久久久久免费精品国产小说色大师 | 热久久免费视频精品 | 有没有在线观看av | 久久精久久精 | 丁香九月激情 | 色婷婷国产精品一区在线观看 | 国产高清亚洲 | 日本精品久久久一区二区三区 | 中文字幕你懂的 | 国产精品久久久久久久久久直播 | 黄色影院在线播放 | 色婷婷激情四射 | jizzjizzjizz亚洲| 成人久久久精品国产乱码一区二区 | 97麻豆视频 | 国产一区二区精品久久 | 国产精品欧美久久久久天天影视 | 精品久久网站 | 久久久精品 | 国产最新精品视频 | 在线观看视频国产一区 | 亚洲专区免费观看 | 在线播放av网址 | 日本少妇久久久 | 国产麻豆精品免费视频 | 91精品一区二区三区蜜臀 | 国产护士在线 | 9ⅰ精品久久久久久久久中文字幕 | av免费电影在线观看 | 在线观看精品一区 | 国产丝袜 | 在线精品视频免费观看 | 国产日韩欧美在线播放 | 国产一区二区三区视频在线 | 久久精品国产亚洲精品 | 在线观看精品一区 | 国产午夜精品一区二区三区在线观看 | 欧美综合久久久 | 久久激情电影 | 国产精品伦一区二区三区视频 | 成人97视频一区二区 | 超碰人人乐 | 久久亚洲在线 | 中文字幕一区二区三区四区 | 一区二区三区在线影院 | 免费视频资源 | 欧美日韩亚洲第一 | 久久精品福利视频 | 亚洲精品在线看 | 国产免费视频一区二区裸体 | a级片网站| 三级黄色在线 | 综合国产视频 | 久久免费在线视频 | 天天色天天射综合网 | 国产一级大片在线观看 | 久草手机视频 | 久久久婷 | 国产成人61精品免费看片 | 97国产精品一区二区 | 久热免费在线 | 在线高清 | 黄毛片在线观看 | 天天做日日做天天爽视频免费 | 在线观看日韩 | 中文字幕 影院 | 亚洲成a人片在线www | 欧美精品成人在线 | 日日爽 | www在线观看国产 | 日日摸日日添日日躁av | 五月亚洲综合 | 国产精品网红福利 | 一区二区三区四区在线 | 婷婷成人亚洲综合国产xv88 | 日韩免费视频线观看 | 奇米影音四色 | 精品视频99 | 亚洲精品中文在线资源 | 色婷婷综合久久久久 | 国产中文在线视频 | 免费看十八岁美女 | 久人人 | 三级a视频 | 国产视频在线免费观看 | 午夜视频日本 | 日韩系列在线观看 | 国产精品2018| 911香蕉| 人人爽人人乐 | 超碰av免费 | 97网在线观看 | 99久久影院| 免费十分钟 | 国产亚洲精品精品精品 | 久草免费新视频 | 黄色一级性片 | 亚洲理论在线观看 | 91最新在线观看 | 一级免费片 | 婷婷中文在线 | 一级α片 | 99热精品国产 | 黄色国产在线观看 | 成人一区二区三区在线 | 亚洲美女视频在线观看 | 亚洲成av人片在线观看无 | 成人午夜性影院 | 丁香伊人网 | 久久精品草 | 亚洲成人精品久久 | 色九九视频 | 99久久国产免费免费 | 久久成人一区二区 | 日韩视频一区二区在线 | 免费www视频 | 久草视频免费 | 97色资源 | 国产99在线播放 | 在线精品亚洲一区二区 | 黄色一级大片在线观看 | 一级a毛片高清视频 | 成片人卡1卡2卡3手机免费看 | 久久久久免费精品国产 | 在线观看网站你懂的 | 成人在线视频你懂的 | 91看成人| 欧美大香线蕉线伊人久久 | 中文字幕在线观看第二页 | 亚洲精品资源 | 中文字幕av全部资源www中文字幕在线观看 | 999国内精品永久免费视频 | 全久久久久久久久久久电影 | 香蕉网站在线观看 | 91成人精品视频 | 丁香六月久久综合狠狠色 | 国产香蕉在线 | 99在线视频免费观看 | 国产成人无码AⅤ片在线观 日韩av不卡在线 | 九九欧美| 亚洲特级片 | av一区二区在线观看中文字幕 | 六月婷婷久香在线视频 | 欧美精品亚洲二区 | 91九色国产| 国产黄在线免费观看 | 亚洲精品美女在线 | 91丨九色丨高潮丰满 | 欧美性成人| 五月婷婷黄色网 | 黄色一级大片在线免费看产 | 日韩高清不卡在线 | 91大神免费在线观看 | 国产午夜精品一区二区三区四区 | 超碰在线观看99 | 成人一级在线 | 久久九九影院 | 99久久99久久精品免费 | 在线电影a | 亚洲精品美女免费 | 久久免费国产精品 | 日韩精品久久久久久久电影竹菊 | 激情在线五月天 | 精品国产一区二区三区不卡 | 99久久精品国产系列 | 久久综合操 | 九九精品久久久 | 国产九九热视频 | 色吊丝在线永久观看最新版本 | 国产精品99蜜臀久久不卡二区 | 免费av在线 | 免费视频久久久久久久 | 成人av电影免费在线播放 | 欧美日韩国产一二三区 | 亚洲va欧美va人人爽 | 日韩欧美高清在线 | 婷婷激情久久 | 久久久精华网 | 激情狠狠干 | 伊人欧美 | 中文日韩在线视频 | 久久精品高清 | 8x成人在线 | 成人久久18免费网站 | 国产黄色a| 亚洲涩涩涩涩涩涩 | 国产99在线播放 | 成人午夜剧场在线观看 | 欧美性粗大hdvideo | 色婷婷精品大在线视频 | 国产高清不卡一区二区三区 | 国产精品久久99 | 成人a免费 | 亚一亚二国产专区 | 曰本三级在线 | 国产精品美女久久久久久久久久久 | 黄色av电影 | 国产1区2区 | 成人av网站在线观看 | 九九九九热精品免费视频点播观看 | 三级av免费观看 | 成人久久久电影 | 一级片免费视频 | 久草在线视频看看 | 91精品国产自产老师啪 | 中文字幕av在线播放 | 伊人精品影院 | 国产精品18久久久久久久 | 精品久久美女 | 白丝av在线 | av解说在线 | 啪啪小视频网站 | 中文字幕在线观看三区 | 久久亚洲区 | 91九色成人 | 国产视频一区二区在线观看 | 国产一级二级在线 | 国产精品久久久久久久毛片 | 婷婷色在线播放 | 国产亚洲情侣一区二区无 | 色婷五月天| 久久99亚洲网美利坚合众国 | 欧美午夜性 | 蜜桃视频成人在线观看 | 亚洲视频一区二区三区在线观看 | 国产精品视频免费 | 在线免费黄网站 | 在线亚洲日本 | 亚洲精选在线 | 日韩电影在线观看中文字幕 | 亚洲精品一区中文字幕乱码 | 亚洲美女视频网 | 九九在线高清精品视频 | 天天曰夜夜操 | 国产99精品在线观看 | 国产永久免费高清在线观看视频 | 天天撸夜夜操 | 国产精品美女毛片真酒店 | h视频在线看 | 久久久久久久久久久久久久免费看 | 免费看国产a | 最近中文字幕免费视频 | 亚洲特级毛片 | 成 人 黄 色 片 在线播放 | 婷婷激情影院 | 9999精品视频| 一区二区不卡视频在线观看 | 国产专区日韩专区 | 国产精品黄色影片导航在线观看 | 国产精品视频你懂的 | 99热精品在线观看 | 黄色av免费在线 | 伊人丁香| 亚洲mv大片欧洲mv大片免费 | 91香蕉视频 mp4 | 成人免费观看在线视频 | 国产精品1区2区 | 黄色99视频 | 日韩大片在线免费观看 | 国产精品6999成人免费视频 | 午夜精品久久久99热福利 | 四虎国产精品永久在线国在线 | 中文一二区 | 午夜精品一区二区国产 | 中文字幕一区二区三区在线观看 | 亚洲成人在线免费 | 成人羞羞免费 | 欧美少妇的秘密 | 美女网站色免费 | 五月天久久 | 国产精品九色 | 欧美激情视频一区 | 久久久久久高清 | 亚洲一区二区视频在线播放 | 久草在线网址 | 一本色道久久精品 | 日韩精品一区二区三区外面 | 亚洲欧洲美洲av | 欧美久久久久久久 | 91成人在线视频观看 | 久久99热这里只有精品 | 欧美a级在线播放 | 久久久久国产成人精品亚洲午夜 | av激情五月 | 色婷婷综合视频在线观看 | 久久久久久高潮国产精品视 | 在线 视频 亚洲 | 成人免费视频观看 | 在线免费黄色av | 在线有码中文字幕 | 色婷婷狠狠五月综合天色拍 | 免费www视频 | 蜜桃av人人夜夜澡人人爽 | 欧美日本啪啪无遮挡网站 | 亚洲成a人片综合在线 | 亚洲精品成人免费 | 免费观看视频的网站 | www五月天 | 天天干天天摸 | 天天碰天天操 | 在线观看日韩中文字幕 | 国产视频一区在线 | 黄色三级久久 | 亚洲国产99 | 狠狠gao | 成人毛片在线视频 | 波多野结衣一区 | 国产在线不卡一区 | 成片人卡1卡2卡3手机免费看 | 91中文在线视频 | 成人午夜影院 | 婷婷五天天在线视频 | av资源在线观看 | 美女av在线免费 | 综合黄色网 | 亚洲片在线观看 | 久久视频在线免费观看 | 亚洲成a人片在线www | 日韩三级在线 | 日韩久久一区二区 | 国产精品专区在线观看 | 免费av大片 | 999视频网站 | 最近中文字幕在线中文高清版 | 播五月婷婷 | 国产手机精品视频 | 97人人添人澡人人爽超碰动图 | 国产伦精品一区二区三区四区视频 | 精品美女在线观看 | 精品国产诱惑 | 国产免费高清视频 | 久久久免费高清视频 | 99自拍视频在线观看 | 99高清视频有精品视频 | 首页中文字幕 | 天天人人 | 欧美色图另类 | 日韩免费观看一区二区 | 中国一级片在线播放 | 三级免费黄色 | 久久久久麻豆v国产 | 成人黄色资源 | 国产69精品久久99的直播节目 | 欧美超碰在线 | 欧美一区二区三区在线看 | 伊人国产视频 | 免费色视频网站 | 狠狠干激情 | 国产一区二区在线播放 | 免费av高清 | 国产成人精品电影久久久 | 国产精品久久片 | 中文字幕久久精品亚洲乱码 | 国产精品久久久久久久久久免费看 | 在线视频 亚洲 | 国产一级在线看 | 午夜视频导航 | 国产成人一区二区在线观看 | 中文字幕一区二区三区在线观看 | 91.麻豆视频| 96在线| 97av视频 | av看片在线观看 | 国产免费小视频 | 一区二区视频在线看 | 麻豆91小视频 | 国产视 | 久久久99国产精品免费 | 五月天婷婷丁香花 | av片一区二区 | 国产免费观看久久黄 | 亚洲国产偷 | 国产福利精品在线观看 | 日本少妇久久久 | 国产精品系列在线观看 | 成人播放器 | 99国产免费网址 | a视频在线观看免费 | 久草视频免费看 | 激情综合网婷婷 | 久久成人18免费网站 | 久久久免费毛片 | 国产一区二区高清 | av千婊在线免费观看 | 国内成人精品视频 | 青青河边草免费直播 | 久久综合福利 | 蜜桃传媒一区二区 | 97超碰在线人人 | 日韩免费电影网 | 中文字幕亚洲欧美 | 久久这里只有精品1 | 国产一区二区三区黄 | 九九热免费在线视频 | 一级黄色片在线免费观看 | 婷婷精品在线视频 | 久久久片 | 日韩免费观看av | 91视频高清完整版 | 久久久久免费网 | 亚洲国产欧美一区二区三区丁香婷 | 色999精品| 97在线观视频免费观看 | 国产真实精品久久二三区 | 国产亚洲精品美女久久 | 亚洲aaa毛片 | 亚洲乱码久久久 | 久久久久成人精品免费播放动漫 | 天天艹天天爽 | 热久久免费国产视频 | 国产福利精品在线观看 | 狠狠久久婷婷 | 欧美日韩国产三级 | 国产婷婷vvvv激情久 | 国产亚洲精品免费 | 狠狠88综合久久久久综合网 | 国产精品男女视频 | 亚洲午夜精品一区二区三区电影院 | 国产视频手机在线 | 在线三级中文 | 五月婷婷天堂 | 日产乱码一二三区别在线 | 国内揄拍国内精品 | 波多野结衣动态图 | 欧美日韩一区二区三区在线观看视频 | 成人国产电影在线观看 | 午夜久久电影网 | 亚洲欧美日韩精品一区二区 | 久久国产经典视频 | 中文字幕电影网 | 日日久视频 | av在线8| 日韩美一区二区三区 | 97成人在线视频 | 天天爽人人爽夜夜爽 | 成人毛片在线观看 | 国产黄色片一级 | 麻豆视频成人 | 少妇激情久久 | 色天天综合久久久久综合片 | 久久草草热国产精品直播 | 日本在线免费看 | 国产真实在线 | 国产精品久久久久久超碰 | 色a在线观看 | 亚洲国产精品成人女人久久 | 日韩三区在线观看 | 500部大龄熟乱视频使用方法 | 在线观看精品 | 亚洲精品国产精品久久99 | 久久视频免费在线观看 | 999国内精品永久免费视频 | 久久久久久久久久久精 | 国产一级特黄毛片在线毛片 | 亚洲精品av在线 | 色婷婷激情四射 | 亚洲成人中文在线 | av 在线观看 | 亚洲综合成人婷婷小说 | 日日夜夜添 | 久久久精品 一区二区三区 国产99视频在线观看 | 91免费在线视频 | 国产又粗又猛又黄又爽的视频 | 久章草在线观看 | 亚洲精品国产高清 | 日韩欧美精品在线 | 久久综合色播五月 | 国色综合 | 婷婷在线色 | 亚洲精品国精品久久99热 | 91免费国产在线观看 | 亚洲 中文 在线 精品 | 久青草影院 | 亚洲1区在线 | 久插视频 | 丁香婷婷综合五月 | 亚洲视频1 | 免费男女羞羞的视频网站中文字幕 | 日本三级不卡 | 91福利视频久久久久 | 91免费高清视频 | 天天色成人 | 色鬼综合网 | 日韩电影在线观看一区二区三区 | 久影院| 欧美91片 | 精品国产一区在线观看 | 国产在线一区二区三区播放 | 日本中文字幕在线 | 日本精品一区二区三区在线播放视频 | 超级碰视频| 国产一区欧美一区 | 91麻豆精品国产91 | 国产亚洲一区二区在线观看 | 99精品国产99久久久久久97 | 国产在线欧美日韩 | 911久久香蕉国产线看观看 | 91精品国产入口 | 国产麻豆果冻传媒在线观看 | 在线激情av电影 | 亚洲国产一区二区精品专区 | 日韩丝袜 | 久草免费在线 | 五月婷婷丁香网 | 在线观看一 | 亚洲天堂网在线视频观看 | 国产成人黄色 | 激情视频网页 | 久久毛片网站 | 一区二区不卡视频在线观看 | 成人动漫视频在线 | 国产剧在线观看片 | 国产一区二区久久精品 | 国产亚洲一区二区在线观看 | 国产成人av一区二区三区在线观看 | 九九久久久久久久久激情 | 激情自拍av | 国产成人免费高清 | 99精品欧美一区二区三区 | 久操视频在线播放 | 国内久久| 蜜臀av性久久久久蜜臀av | japanese黑人亚洲人4k | 欧美a级在线免费观看 | 亚洲精品国产日韩 | 免费看污片 | 99999精品| 欧美日韩天堂 | 国产91aaa | 日韩视频在线观看视频 | 久久夜色精品亚洲噜噜国4 午夜视频在线观看欧美 | 国产亚洲一区二区三区 | 四虎永久精品在线 | 国产黄a三级三级三级三级三级 | 国产a视频免费观看 | 色婷婷综合久久久 | 天堂在线免费视频 | 国产这里只有精品 | av免费片 | 国产婷婷一区二区 | 国产黄在线 | 国产精品视频地址 | 日韩极品视频在线观看 | 色五丁香 | 伊人超碰在线 | 日韩二区三区在线 | 黄色精品一区 | 丁香婷婷久久久综合精品国产 | 夜夜操网站 | 欧美日韩精品在线观看视频 | 久久美女视频 | 欧美国产日韩一区二区 | 国产成在线观看免费视频 | 国产成人av在线影院 | 五月丁香 | 国产精品自拍av | japanesefreesex中国少妇 | 久久久久久国产精品 |