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

手勢圖像識別實戰(LeNet模型) 原創

發布于 2024-12-5 11:13
瀏覽
0收藏

前言

上一章內容我們初步了解了卷積、卷積神經網絡、卷積神經網絡的搭建過程以及經典的LeNet網絡結構,本篇內容將基于LeNet網絡結構,實現手勢識別。

手勢識別

數據集介紹

在開展手勢識別之前,我們需要先下載并初步了解數據集的情況。

數據下載地址

下載地址:手勢識別數據集

├── train                   # 訓練集
├── G0                  # 手勢0
├── IMG_1118.jpg    # 手勢0的圖片
├──...
├── G1                  # 手勢1
├── IMG_1119.jpg
├──...
├──...
├── G9                  # 手勢9
├──test# 測試集
├── G0
├──...
├── G9

手勢圖像識別實戰(LeNet模型)-AI.x社區

項目流程

在《【課程總結】Day8(上):深度學習基本流程》中,我們已了解到深度學習的基本流程為:

  1. 數據預處理 1.1 數據讀取 1.2 數據切分 1.3 數據規范化
  2. 批量化打包數據
  3. 模型搭建
  4. 籌備訓練
  5. 訓練模型 5.1 定義監控指標和方法 5.2 實現訓練過程 5.3 開始訓練

因此,本次項目也采用如上的基本流程。

數據預處理

由上述目錄結構可知,我們需要在訓練前使用DataLoader將數據集打包成適合訓練的格式,因此需要解決2個問題:

問題1:如何記錄標簽數據和圖片數據

解決方法:

  • 獲取標簽:上述目錄中的G0、G1、G2...G9文件夾名稱即為手勢標簽,因此我們可以通過os.listdir()函數獲取文件夾名稱。
  • 保存標簽:將上述遍歷的G0、G1、G2...G9文件夾名稱保存到列表??label_train??中,方便后續使用。
  • 獲取圖片路徑:通過os.listdir()函數獲取文件夾中的圖片名稱,從而獲取圖片路徑。
  • 保存圖片路徑:將上述遍歷的圖片路徑保存到列表??img_train??中,方便后續使用。

# 讀取gestures\train\G0目錄下的所有圖片路徑,添加至list中
import os
import random
import numpy as np
import cv2


defload_img_label(train_root):
    img_train =[]
    label_train =[]
for label in os.listdir(train_root):
        label_path = os.path.join(train_root, label)
# 排除掉.開頭的文件
if label.startswith('.'):
continue
for img_name in os.listdir(label_path):
            img_path = os.path.join(label_path, img_name)
            img_train.append(img_path)
            label_train.append(label)
return img_train, label_train

# 1,讀取基圖像的本信息
root ="gestures"

# 1,訓練集
train_root = os.path.join(root,'train')
train_img, train_label = load_img_label(train_root)


# 2,測試集
test_root = os.path.join(root,'test')
test_img, test_label = load_img_label(test_root)

lable_list =list(set(train_label))
lable_list.sort()

# 3,構建標簽字典
label2idx ={label: idx for idx, label inenumerate(lable_list)}
idx2label ={idx: label for idx, label inenumerate(lable_list)}
print(label2idx)
print(idx2label)

問題2:如何將圖片和標簽數據打包成適合訓練的格式

解決方法:

  • 構建自定義數據集類GesturesDataset
  • 重寫__getitem__(),len(),init()方法
  • 在__getitem__()方法中:
  1. 使用cv2.imread()讀取圖片
  2. 使用cv2.resize()調整圖片大小
  3. 將圖像轉為numpy數組
  4. 對矩陣數組中的數據進行歸一化處理,規范化為[-1, 1]
  5. 使用torch將數據轉為張量
  6. 將數據從圖片數據的[H(高度), W(寬度), C(通道數)]轉維度為[N(批量個數), H(高度), W(寬度), C(通道數)]
  7. 將標簽轉為數字,例如:G0 -> 0, G1 -> 1, G2 -> 2, ..., G9 -> 9
  8. 將標簽轉為張量

import torch
from torch.utils.data importDataset

classGesturesDataset(Dataset):
"""
    自定義數據集
    """
def__init__(self, X, y):
        self.X = X
        self.y = y

def__len__(self):
returnlen(self.X)

def__getitem__(self, idx):
        img_path = self.X[idx]
        img_label = self.y[idx]

# 1,讀取圖像
        img = cv2.imread(img_path)

# 2,圖像轉為32*32
        img = cv2.resize(img,(32,32))

# 3,圖像轉為numpy數組
        img = np.array(img)

# 4,數據規范化到 [-1, 1]
        img = img /255.0
        img =(img -0.5)/0.5

# 5,數據轉為torch張量
        img = torch.tensor(img, dtype=torch.float32)

# 6,數據轉維度 [H, W, C]
        img = img.permute(2,0,1)

# 7,標簽轉為數字
        label = label2idx[img_label]
        label = torch.tensor(label, dtype=torch.long)

return img, label

模型搭建

本次模型使用LeNet網絡結構,相關結構已在《【課程總結】Day10:卷積網絡的基本組件》闡述,本次過程不再贅述。

import torch
from torch import nn


classConvBlock(nn.Module):
"""
        一層卷積:
            - 卷積層
            - 批規范化層
            - 激活層
    """
def__init__(self, in_channels, out_channels, 
                 kernel_size=3, stride=1, padding=1):
super().__init__()
        self.conv = nn.Conv2d(in_channels=in_channels, out_channels=out_channels,
                             kernel_size=kernel_size, stride=stride,padding=padding)
        self.bn = nn.BatchNorm2d(num_features=out_channels)
        self.relu = nn.ReLU()

defforward(self, x):
        x = self.conv(x)
        x = self.bn(x)
        x = self.relu(x)
return x

classLeNet(nn.Module):
def__init__(self, num_classes=10):
super().__init__()
# 1, 特征抽取部分
        self.feature_extractor = nn.Sequential(
# 卷積層1
ConvBlock(in_channels=3,
                      out_channels=6,
                      kernel_size=5,
                      stride=1,
                      padding=0),

# 亞采樣(池化)
            nn.MaxPool2d(kernel_size=2, stride=2, padding=0),

# 卷積層2
ConvBlock(in_channels=6,
                      out_channels=16,
                      kernel_size=5,
                      stride=1,
                      padding=0),

# 亞采樣(池化)
            nn.MaxPool2d(kernel_size=2, stride=2, padding=0),

)

# 2, 分類
        self.classifier = nn.Sequential(
            nn.Flatten(),
            nn.Linear(in_features=400, out_features=120),
            nn.ReLU(),
            nn.Linear(in_features=120, out_features=84),
            nn.ReLU(),
            nn.Linear(in_features=84, out_features=num_classes)
)

defforward(self, x):
# 1, 提取特征
        x = self.feature_extractor(x)
# 2, 分類輸出
        x = self.classifier(x)
return x
  • 將以上代碼單獨封裝為model.py文件,方便后續直接import。
  • 在主程序中使用以下方式直接調用即可:??from models import LeNet
    model = LeNet()?
    ?

籌備訓練

由于計算的數據量較大,所以我們需要借助torch以及GPU來提升訓練速度。

# 檢測是否有可用的CUDA設備,如果有則使用第一個可用的CUDA設備,否則使用CPU
device ="cuda:0"if torch.cuda.is_available()else"cpu"

# 將模型移動到指定的設備(CUDA或CPU)
model.to(device=device)

# 設置訓練的總輪數
epochs =80

# 設置學習率
lr =1e-3

# 定義損失函數為交叉熵損失
loss_fn = nn.CrossEntropyLoss()

# 定義優化器為隨機梯度下降(SGD),傳入模型的參數和學習率
optimizer = torch.optim.SGD(params=model.parameters(), lr=lr)

模型評估

為了觀察訓練過程情況,定義模型評估函數:

# 準確率計算
defget_acc(data_loader):
    accs =[]
    model.eval()
with torch.no_grad():
for X, y in data_loader:
            X = X.to(device=device)
            y = y.to(device=device)
            y_pred = model(X)
            y_pred = y_pred.argmax(dim=-1)
            acc =(y_pred == y).to(torch.float32).mean().item()
            accs.append(acc)
    final_acc =round(number=sum(accs)/len(accs), ndigits=5)
return final_acc

實現訓練過程

# 訓練過程
deftrain():

    train_accs =[]
    test_accs =[]
    cur_test_acc =0

# 1,訓練之前,檢測一下準確率
    train_acc = get_acc(data_loader=train_dataloader)
    test_acc = get_acc(data_loader=test_dataloader)
    train_accs.append(train_acc)
    test_accs.append(test_acc)

print(f"訓練之前:train_acc: {train_acc},test_acc: {test_acc}")

# 每一輪次
for epoch inrange(epochs):
# 模型設置為 train 模式
        model.train()
# 計時
        start_train = time.time()
# 每一批量
for X, y in train_dataloader:
# 數據搬家
            X = X.to(device=device)
            y = y.to(device=device)
# 1,正向傳播
            y_pred = model(X)
# 2,計算損失
            loss = loss_fn(y_pred, y)
# 3,反向傳播
            loss.backward()
# 4,優化一步
            optimizer.step()
# 5,清空梯度
            optimizer.zero_grad()
# 計時結束
        stop_train = time.time()
# 測試準確率
        train_acc = get_acc(data_loader=train_dataloader)
        test_acc = get_acc(data_loader=test_dataloader)
        train_accs.append(train_acc)
        test_accs.append(test_acc)
# 保存模型
if cur_test_acc < test_acc:
            cur_test_acc = test_acc
# 保存最好模型
            torch.save(obj=model.state_dict(), f="lenet_best.pt")
# 保存最后模型
        torch.save(obj=model.state_dict(), f="lenet_last.pt")

# 格式化輸出日志
print(f"""
        當前是第 {epoch + 1} 輪:
        ------------------------------------------------------------
        | 訓練準確率 (train_acc) | 測試準確率 (test_acc) | 運行時間 (elapsed_time) |
        ------------------------------------------------------------
        | {train_acc:<18} | {test_acc:<17} | {round(number=stop_train - start_train, ndigits=3)} 秒    |
        ------------------------------------------------------------
        """)
return train_accs, test_accs

開始訓練

train_accs, test_accs = train()

圖形化監控數據

plt.plot(train_accs, label="train_acc")
plt.plot(test_accs, label="train_acc")
plt.legend()
plt.grid()
plt.xlabel(xlabel='epoch')
plt.ylabel(ylabel="acc")
plt.title(label="LeNet Training Process")

運行結果:

手勢圖像識別實戰(LeNet模型)-AI.x社區

手勢圖像識別實戰(LeNet模型)-AI.x社區

通過以上執行過程可以看到,經過80輪訓練后,LeNet模型在訓練集上的準確率達到99%,在測試集上的準確率達到94%。

模型預測

接下來,我們使用streamlit實現一個前端頁面,用戶在頁面上輸入圖片,模型會自動識別圖片中的手勢。

整體實現流程:

  1. 創建一個streamlit應用,并導入相關依賴。
  2. 顯示當前設備是GPU設備還是CPU
  3. 加載模型
  4. 使用streamlit.file_uploader顯示上傳圖片控件
  5. 使用streamlit.image顯示上傳的圖片
  6. 使用加載的模型進行預測 6.1 讀取圖像 6.2 圖像預處理 6.3 圖形轉為張量 6.4 轉換圖形的維度為[C, H, W] 6.5 新建一個批量維度[N, C, H, W] 6.6 數據搬家 6.7 模型設為評估模式 6.8 模型預測 6.9 預測結果轉為標簽 0 → G0, 1 → G1, 2 → G2, 3 → G3, 4 → G4, 5 → G5 6.10 返回標簽結果

import streamlit
import torch
import os
import numpy as np
from PIL importImage
from models importLeNet


# 生成idx2label字典,用于顯示預測結果
idx2label ={
0:'G0',
1:'G1',
2:'G2',
3:'G3',
4:'G4',
5:'G5',
6:'G6',
7:'G7',
8:'G8',
9:'G9'
}

definfer(img_path, model, device, idx2label):
"""
        輸入:圖像地址
        輸出:預測類別
    """
# 1,讀取圖像
ifnot os.path.exists(img_path):
raiseFileNotFoundError("文件沒找到")

# 2, 判斷當前局部變量中是否有model
# if "m1" not in globals() or not isinstance(globals()["m1"], LeNet):
#     raise ValueError("m1模型不存在")

# 3,讀取圖像
    img =Image.open(fp=img_path)

# 4,預處理
    img = img.resize((32,32))
    img = np.array(img)
    img = img /255
    img =(img -0.5)/0.5

# 5, 轉張量
    img = torch.tensor(data=img, dtype=torch.float32)

# 6, 轉換維度
    img = img.permute(dims=(2,0,1))

# 7, 新增一個批量維度
    img = img.unsqueeze(dim=0)

# 8,數據搬家
    img = img.to(device=device)

# 9,模型設為評估模式
    model.eval()

# 10,無梯度環境
with torch.no_grad():
# 11,正向傳播
        y_pred = m1(img)

# 12, 解析結果
        y_pred = y_pred.argmax(dim=-1).item()

# 13,標簽轉換
        label = idx2label.get(y_pred)

# 14, 返回結果
return label

if __name__ =="__main__":
# 1, 顯示當前設備是GPU設備還是CPU
# 檢測設備
    device ="cuda"if torch.cuda.is_available()else"cpu"
    streamlit.write(f"當前設備是{device}設備")


# 2, 加載模型
    m1 =LeNet()
    m1.to(device=device)
# 加載權重
    m1.load_state_dict(state_dict=torch.load(f="lenet_best.pt", map_locatinotallow=device),
                    strict=False)
ifnotisinstance(m1,LeNet):
raiseValueError("模型加載失敗")

# 3, 上傳一張圖片
    img_path = streamlit.file_uploader(label="上傳一張圖片",type=["png","jpg","jpeg"])
# 3.1, 將上傳的圖像文件保存到臨時文件
if img_path:
withopen(file="temp_img.jpg", mode="wb")as f:
            f.write(img_path.getvalue())
        img_path ="temp_img.jpg"
# 4, 顯示上傳的圖片
if img_path:
        img =Image.open(fp=img_path)
        streamlit.image(image=img, captinotallow="上傳的圖片", use_column_width=True)

# 5, 加載本地的lenet_best.pt模型
if img_path:
        label = infer(img_path=img_path, model=m1, device=device, idx2label=idx2label)
        streamlit.write(f"預測結果是{label}")

運行結果:

手勢圖像識別實戰(LeNet模型)-AI.x社區圖片

內容小結

  • 回顧深度學習的整體流程,仍然是:數據預處理→批量化打包數據→模型搭建→訓練模型→模型評估→模型預測
  • 圖片數據預處理時,批量化打包數據需要構造為[N, C, H, W]的格式
  • 預處理的過程大致為:讀取圖片→調整圖片大小→轉為numpy數組→歸一化→轉為張量→調整維度→標簽轉為數字→轉為張量,該過程需要在自定義數據集的__getitem__函數中完成
  • 模型構建使用的是LeNet模型,該模型定義可以單獨在models.py中實現,訓練代碼中直接import引用即可
  • 訓練過程以及訓練時的監控過程,與前兩章學習的深度學習訓練過程是一樣的


本文轉載自公眾號一起AI技術 作者:熱情的Dongming

原文鏈接:??https://mp.weixin.qq.com/s/uLcszdSP99AepL5d47e6ZQ??

?著作權歸作者所有,如需轉載,請注明出處,否則將追究法律責任
已于2024-12-5 11:14:19修改
收藏
回復
舉報
回復
相關推薦
豆花视频一区二区| 国产原创精品视频| 日本在线不卡一区| 欧美xxxx综合视频| 亚洲调教欧美在线| 国产亚洲一区二区手机在线观看| 国产精品美女视频| www.久久久| 欧美国产一级片| 综合国产精品| 中国日韩欧美久久久久久久久| 制服下的诱惑暮生| 经典三级一区二区| 亚洲宅男天堂在线观看无病毒| 欧美亚洲精品日韩| 精品人妻一区二区三区蜜桃| 免费在线亚洲欧美| 欧美成人第一页| av网站免费在线看| 9l亚洲国产成人精品一区二三| 在线区一区二视频| 91丨porny丨探花| 看女生喷水的网站在线观看| 国产亚洲综合av| 国产一区二区无遮挡| 91丨九色丨丰满| 视频一区欧美日韩| 97超级碰碰人国产在线观看| www欧美com| 欧美日韩一二三四| 日韩精品欧美激情| 艳妇乳肉豪妇荡乳xxx| 99亚洲男女激情在线观看| 色婷婷精品大视频在线蜜桃视频| 欧美视频免费看欧美视频| 日韩在线观看www| 国产午夜亚洲精品理论片色戒| 久久国产精品高清| 黄色小视频免费观看| 国产又黄又大久久| 成人av在线亚洲| 一级日韩一级欧美| 欧美aaaaaa午夜精品| 欧美一区二区色| 亚洲第一精品在线观看| 精品二区视频| 色中色综合影院手机版在线观看 | 99re视频这里只有精品| 亚洲xxxx在线| 国产手机精品视频| 国产在线看一区| 国产一区视频在线| 一区二区自拍偷拍| 久久精品国产成人一区二区三区| 国产精品亚洲激情| 91久久精品无码一区二区| 久久99精品国产| 成人在线视频网| 国产三级小视频| 国产精品白丝jk白祙喷水网站| 7777精品伊久久久大香线蕉语言| a天堂中文在线观看| 国产成人精品午夜视频免费| 成人在线视频网址| 亚洲 欧美 激情 小说 另类| 91免费看片在线观看| 欧美日韩精品免费看| 韩国三级在线观看久| 国产精品伦理在线| 国产一区一区三区| 日韩av毛片| 欧美日韩午夜视频在线观看| 97香蕉超级碰碰久久免费软件 | 成人av二区| 在线观看欧美成人| 999精品在线视频| 午夜精品av| 97av在线影院| 中文字幕一区二区久久人妻| 国产乱子伦视频一区二区三区| www日韩av| 性高潮久久久久久久久久| 久久久综合精品| 日本不卡一区二区三区视频| 欧美激情免费| 亚洲国产精品久久艾草纯爱| 凹凸国产熟女精品视频| 777午夜精品电影免费看| 这里只有精品电影| 无码人妻精品一区二区三| 国产一区二区精品福利地址| 色悠悠久久久久| 日韩成人一区二区三区| 日韩av在线免费观看不卡| 国产日韩av在线播放| 高清乱码毛片入口| 久久亚洲免费视频| 天堂а√在线中文在线| 在线一区av| 欧美变态凌虐bdsm| 久久国产柳州莫菁门| 最新国产精品| 国产精品热视频| 熟妇人妻中文av无码| 国产精品你懂的| 男人操女人免费软件| 精品视频在线播放一区二区三区 | 久久免费手机视频| 伊人久久婷婷| 91人成网站www| 精品久久av| 亚洲成人免费观看| 亚洲精品视频三区| 精品日本12videosex| 久久久亚洲福利精品午夜| 中文字幕激情视频| 91女神在线视频| 欧美人成在线观看| 国产成人久久精品一区二区三区| 亚洲欧美国产一本综合首页| 久久综合色综合| 狠狠久久亚洲欧美| 色噜噜狠狠一区二区三区| 极品美鲍一区| 精品国产1区2区3区| 一级黄色片日本| 免费观看在线综合| 日本亚洲自拍| 英国三级经典在线观看| 精品日产卡一卡二卡麻豆| 色www亚洲国产阿娇yao| 视频一区国产视频| 乱一区二区三区在线播放| 手机在线免费av| 日韩视频免费观看高清在线视频| 手机在线中文字幕| 奇米精品一区二区三区在线观看一| 精品亚洲第一| 免费在线小视频| 亚洲精品福利在线| 好吊操这里只有精品| 国产成人a级片| 国产精品一区在线免费观看| 青青国产精品| y97精品国产97久久久久久| 在线视频 中文字幕| 中文一区在线播放 | 国模少妇一区二区三区| 伊人狠狠色丁香综合尤物| 亚洲天堂1区| 伊人久久久久久久久久久| 国产黄色免费视频| 国产精品日韩精品欧美在线| 在线观看国产一级片| 欧美国产一区二区三区激情无套| 国产欧美日韩中文| 精品美女在线观看视频在线观看| 欧美精品三级在线观看| 精品无码一区二区三区蜜臀| 国产在线精品一区二区三区不卡| 一道本在线观看视频| 日韩综合一区二区三区| 久久久久久国产| 视频一区 中文字幕| 日韩欧美aⅴ综合网站发布| 97人妻精品一区二区免费| 日本午夜精品视频在线观看| 亚洲一卡二卡三卡四卡无卡网站在线看| 日韩成人在线一区| 欧美成人全部免费| 色网站免费观看| 日本高清不卡视频| 韩国一级黄色录像| 成人久久18免费网站麻豆| 日韩免费视频播放| 日韩夫妻性生活xx| 高清视频在线观看一区| 美女高潮在线观看| 中文综合在线观看| 狠狠躁日日躁夜夜躁av| 91福利小视频| 国语对白在线播放| 久久综合色播五月| 一本一道久久a久久综合蜜桃| 欧美激情五月| 欧美日韩在线观看一区二区三区| 国产精品一区二区免费福利视频| 欧美久久久精品| 日本电影一区二区在线观看| 91精品国产综合久久香蕉麻豆| 国产91av视频| 国产精品狼人久久影院观看方式| 激情小说欧美色图| 日本欧美一区二区| 僵尸世界大战2 在线播放| 秋霞欧美视频| 国产一区二区三区无遮挡| 日本黄色成人| 欧美在线不卡区| 国产精品久久麻豆| 国产视频精品免费播放| 国产黄色一级大片| 欧美性生活一区| 精品成人久久久| 亚洲精品亚洲人成人网在线播放| 国产真实乱人偷精品人妻| 国产精品小仙女| www.精品在线| 免费日韩精品中文字幕视频在线| 国产911在线观看| 国产一区二区三区网| 国产v亚洲v天堂无码| 国产精品一区二区免费福利视频 | www.激情网| 久久精品国产亚洲夜色av网站| 精品国产_亚洲人成在线| av日韩在线免费观看| 日本一区二区三区在线播放| 操喷在线视频| 欧美精品在线看| 一级毛片视频在线| 一区二区三区美女xx视频| 无码国产精品高潮久久99| 日韩欧美高清一区| 国产精品无码专区av免费播放| 色婷婷久久久综合中文字幕 | 精品伦精品一区二区三区视频密桃| 成人av网站在线| 色诱av手机版| 国产成人自拍网| 手机看片国产精品| 国产在线播放一区二区三区| 高潮一区二区三区| 日本视频一区二区三区| 日本男人操女人| 久久人人超碰| 国产一区亚洲二区三区| 亚洲在线电影| 各处沟厕大尺度偷拍女厕嘘嘘| 国产欧美激情| 大肉大捧一进一出好爽视频| 日韩一级大片| 每日在线更新av| 国产视频久久| 麻豆av免费在线| 日韩不卡一区二区三区| av污在线观看| 久久99精品久久久| 日韩精品aaa| 国产主播一区二区| 深夜做爰性大片蜜桃| 国产高清精品在线| 亚洲日本久久久| www.欧美精品一二区| 极品粉嫩小仙女高潮喷水久久| www.色精品| 中文字幕丰满孑伦无码专区| 久久九九国产精品| 免费成人深夜天涯网站| 国产精品成人免费在线| 高h视频免费观看| 亚洲一区二区三区四区中文字幕| 日韩免费一级片| 日韩欧美精品中文字幕| 欧美三级网站在线观看| 欧美日韩激情一区二区三区| 99热这里是精品| 精品国产乱码久久久久久老虎 | xxxx欧美18另类的高清| av免费在线网站| 国语自产精品视频在线看| 625成人欧美午夜电影| 国产玖玖精品视频| 香蕉免费一区二区三区在线观看 | 国产精品久久久久无码av| 欧美另类videos| 国产欧美日韩一区二区三区在线| 九色porny91| 国产乱子轮精品视频| 黄色录像a级片| 国产精品毛片无遮挡高清| 精品在线免费观看视频| 色天使色偷偷av一区二区| 国产裸体无遮挡| 亚洲欧洲高清在线| 成人在线视频亚洲| 青青久久av北条麻妃黑人| 国产aⅴ精品一区二区四区| 精品国产乱码久久久久久郑州公司| 国产伦精品一区二区三区视频| 偷拍盗摄高潮叫床对白清晰| 国产精品亚洲欧美| 三日本三级少妇三级99| 久久色在线观看| 老妇女50岁三级| 在线一区二区三区做爰视频网站| 国内精品偷拍视频| 国产亚洲免费的视频看| 波多野结衣精品| 国产精品久久久久国产a级| eeuss国产一区二区三区四区| 视频一区二区在线观看| 亚洲美女毛片| 99精品视频国产| 欧美激情一区二区三区四区| 国产真实的和子乱拍在线观看| 欧美老年两性高潮| 色吊丝在线永久观看最新版本| 欧美久久久精品| 久久夜夜久久| 欧美日本韩国国产| 伊人久久久大香线蕉综合直播 | 91啪亚洲精品| 国产一级片免费看| 欧美一级日韩免费不卡| 亚洲1卡2卡3卡4卡乱码精品| 青青久久av北条麻妃海外网| 精品久久ai电影| 99re6这里有精品热视频| 人人狠狠综合久久亚洲| 国产ts丝袜人妖系列视频| 一区二区三区不卡视频在线观看 | 在线国产99| 日本欧洲一区二区| 久久久久久久久久久久| 日韩欧美在线看| 日韩在线观看视频一区二区三区| 欧美日韩国产成人在线| 美国十次综合久久| 亚洲毛片aa| 免费xxxx性欧美18vr| 少妇av片在线观看| 色婷婷激情久久| 国产美女性感在线观看懂色av| 琪琪第一精品导航| 婷婷亚洲精品| 国产熟女高潮视频| 91免费视频大全| 在线观看日本视频| 精品亚洲va在线va天堂资源站| 不卡一本毛片| 黄色小网站91| 国产精品外国| 中文字幕在线看高清电影| 一本到高清视频免费精品| 欧洲毛片在线| 国产精品扒开腿做爽爽爽男男 | 日本一区影院| 男人添女人下部视频免费| 国产福利一区在线| 久青草视频在线观看| 亚洲电影中文字幕| 蜜桃视频在线观看播放| 欧美日韩一区二| 免费精品99久久国产综合精品| 国产精品视频在| 7799精品视频| 黄色小说在线播放| 久久久精品动漫| 日韩激情一二三区| 91动漫免费网站| 日韩午夜av一区| 黄色在线免费观看网站| 久久久久久国产精品mv| 日本欧美韩国一区三区| 中文字幕在线观看2018| 欧美tickling网站挠脚心| 天堂网在线最新版www中文网| 日韩一区免费观看| 国产一区二区在线看| 国产精品成人aaaa在线| 亚洲天堂久久av| 国产午夜久久av| 波多野结衣家庭教师在线播放| 久久老女人爱爱| 99久久亚洲精品日本无码| 海角国产乱辈乱精品视频| 中文有码一区| 在线观看网站黄| 欧美日韩加勒比精品一区| 亚洲免费视频一区二区三区| 99久久精品无码一区二区毛片| 亚洲一区二区伦理| 久艹在线观看视频| 亚洲精品福利免费在线观看| 日韩在线电影| a√天堂在线观看| 日韩美女啊v在线免费观看| 天天干在线观看| 91精品视频在线看| 午夜宅男久久久| 欧美精品99久久久| 国产一区二区三区在线视频| 玖玖精品一区| 爆乳熟妇一区二区三区霸乳| 亚洲精品v日韩精品| 国产www.大片在线| 国产精品一区免费观看| 久久www免费人成看片高清| 综合激情网五月|