婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 用python搭建一個花卉識別系統

用python搭建一個花卉識別系統

熱門標簽:高德地圖標注是免費的嗎 北京電信外呼系統靠譜嗎 無錫客服外呼系統一般多少錢 地圖標注視頻廣告 大連crm外呼系統 梅州外呼業務系統 百度地圖標注位置怎么修改 老人電話機器人 洪澤縣地圖標注

一.開源神經網絡(AlexNet)

1.獲取數據集

使用步驟如下:
* (1)在data_set文件夾下創建新文件夾"flower_data"
* (2)點擊鏈接下載花分類數據集download.tensorflow.org/example\_im…
* (3)解壓數據集到flower_data文件夾下
* (4)執行"split_data.py"腳本自動將數據集劃分成訓練集train和驗證集val 

split_data.py

import os
from shutil import copy, rmtree
import random
 
 
def mk_file(file_path: str):
    if os.path.exists(file_path):
        # 如果文件夾存在,則先刪除原文件夾在重新創建
        rmtree(file_path)
    os.makedirs(file_path)
 
 
def main():
    # 保證隨機可復現
    random.seed(0)
 
    # 將數據集中10%的數據劃分到驗證集中
    split_rate = 0.1
 
    # 指向你解壓后的flower_photos文件夾
    cwd = os.getcwd()
    data_root = os.path.join(cwd, "flower_data")
    origin_flower_path = os.path.join(data_root, "flower_photos")
    assert os.path.exists(origin_flower_path)
    flower_class = [cla for cla in os.listdir(origin_flower_path)
                    if os.path.isdir(os.path.join(origin_flower_path, cla))]
 
    # 建立保存訓練集的文件夾
    train_root = os.path.join(data_root, "train")
    mk_file(train_root)
    for cla in flower_class:
        # 建立每個類別對應的文件夾
        mk_file(os.path.join(train_root, cla))
 
    # 建立保存驗證集的文件夾
    val_root = os.path.join(data_root, "val")
    mk_file(val_root)
    for cla in flower_class:
        # 建立每個類別對應的文件夾
        mk_file(os.path.join(val_root, cla))
 
    for cla in flower_class:
        cla_path = os.path.join(origin_flower_path, cla)
        images = os.listdir(cla_path)
        num = len(images)
        # 隨機采樣驗證集的索引
        eval_index = random.sample(images, k=int(num*split_rate))
        for index, image in enumerate(images):
            if image in eval_index:
                # 將分配至驗證集中的文件復制到相應目錄
                image_path = os.path.join(cla_path, image)
                new_path = os.path.join(val_root, cla)
                copy(image_path, new_path)
            else:
                # 將分配至訓練集中的文件復制到相應目錄
                image_path = os.path.join(cla_path, image)
                new_path = os.path.join(train_root, cla)
                copy(image_path, new_path)
            print("\r[{}] processing [{}/{}]".format(cla, index+1, num), end="")  # processing bar
        print()
 
    print("processing done!")
 
 
if __name__ == '__main__':
    main()

2.神經網絡模型

model.py

import torch.nn as nn
import torch
 
class AlexNet(nn.Module):
    def __init__(self, num_classes=1000, init_weights=False):
        super(AlexNet, self).__init__()
        # 用nn.Sequential()將網絡打包成一個模塊,精簡代碼
        self.features = nn.Sequential(   # 卷積層提取圖像特征
            nn.Conv2d(3, 48, kernel_size=11, stride=4, padding=2),  # input[3, 224, 224]  output[48, 55, 55]
            nn.ReLU(inplace=True), 									# 直接修改覆蓋原值,節省運算內存
            nn.MaxPool2d(kernel_size=3, stride=2),                  # output[48, 27, 27]
            nn.Conv2d(48, 128, kernel_size=5, padding=2),           # output[128, 27, 27]
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3, stride=2),                  # output[128, 13, 13]
            nn.Conv2d(128, 192, kernel_size=3, padding=1),          # output[192, 13, 13]
            nn.ReLU(inplace=True),
            nn.Conv2d(192, 192, kernel_size=3, padding=1),          # output[192, 13, 13]
            nn.ReLU(inplace=True),
            nn.Conv2d(192, 128, kernel_size=3, padding=1),          # output[128, 13, 13]
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3, stride=2),                  # output[128, 6, 6]
        )
        self.classifier = nn.Sequential(   # 全連接層對圖像分類
            nn.Dropout(p=0.5),			   # Dropout 隨機失活神經元,默認比例為0.5
            nn.Linear(128 * 6 * 6, 2048),
            nn.ReLU(inplace=True),
            nn.Dropout(p=0.5),
            nn.Linear(2048, 2048),
            nn.ReLU(inplace=True),
            nn.Linear(2048, num_classes),
        )
        if init_weights:
            self._initialize_weights()
            
	# 前向傳播過程
    def forward(self, x):
        x = self.features(x)
        x = torch.flatten(x, start_dim=1)	# 展平后再傳入全連接層
        x = self.classifier(x)
        return x
        
	# 網絡權重初始化,實際上 pytorch 在構建網絡時會自動初始化權重
    def _initialize_weights(self):
        for m in self.modules():
            if isinstance(m, nn.Conv2d):                            # 若是卷積層
                nn.init.kaiming_normal_(m.weight, mode='fan_out',   # 用(何)kaiming_normal_法初始化權重
                                        nonlinearity='relu')
                if m.bias is not None:
                    nn.init.constant_(m.bias, 0)                    # 初始化偏重為0
            elif isinstance(m, nn.Linear):            # 若是全連接層
                nn.init.normal_(m.weight, 0, 0.01)    # 正態分布初始化
                nn.init.constant_(m.bias, 0)          # 初始化偏重為0

3.訓練神經網絡

train.py

# 導入包
import torch
import torch.nn as nn
from torchvision import transforms, datasets, utils
import matplotlib.pyplot as plt
import numpy as np
import torch.optim as optim
from model import AlexNet
import os
import json
import time
 
# 使用GPU訓練
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
with open(os.path.join("train.log"), "a") as log:
    log.write(str(device)+"\n")
 
#數據預處理
data_transform = {
    "train": transforms.Compose([transforms.RandomResizedCrop(224),       # 隨機裁剪,再縮放成 224×224
                                 transforms.RandomHorizontalFlip(p=0.5),  # 水平方向隨機翻轉,概率為 0.5, 即一半的概率翻轉, 一半的概率不翻轉
                                 transforms.ToTensor(),
                                 transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]),
 
    "val": transforms.Compose([transforms.Resize((224, 224)),  # cannot 224, must (224, 224)
                               transforms.ToTensor(),
                               transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])}
 
#導入、加載 訓練集
# 導入訓練集
#train_set = torchvision.datasets.CIFAR10(root='./data', 	 # 數據集存放目錄
#										 train=True,		 # 表示是數據集中的訓練集
#                                        download=True,  	 # 第一次運行時為True,下載數據集,下載完成后改為False
#                                        transform=transform) # 預處理過程
# 加載訓練集                              
#train_loader = torch.utils.data.DataLoader(train_set, 	  # 導入的訓練集
#										   batch_size=50, # 每批訓練的樣本數
#                                          shuffle=False,  # 是否打亂訓練集
#                                          num_workers=0)  # num_workers在windows下設置為0
 
 
# 獲取圖像數據集的路徑
data_root = os.path.abspath(os.path.join(os.getcwd(), "../.."))  		# get data root path 返回上上層目錄
image_path = data_root + "/jqsj/data_set/flower_data/"  				 		# flower data_set path
 
# 導入訓練集并進行預處理
train_dataset = datasets.ImageFolder(root=image_path + "/train",		
                                     transform=data_transform["train"])
train_num = len(train_dataset)
 
# 按batch_size分批次加載訓練集
train_loader = torch.utils.data.DataLoader(train_dataset,	# 導入的訓練集
                                           batch_size=32, 	# 每批訓練的樣本數
                                           shuffle=True,	# 是否打亂訓練集
                                           num_workers=0)	# 使用線程數,在windows下設置為0
 
#導入、加載 驗證集
# 導入驗證集并進行預處理
validate_dataset = datasets.ImageFolder(root=image_path + "/val",
                                        transform=data_transform["val"])
val_num = len(validate_dataset)
 
# 加載驗證集
validate_loader = torch.utils.data.DataLoader(validate_dataset,	# 導入的驗證集
                                              batch_size=32, 
                                              shuffle=True,
                                              num_workers=0)
 
# 存儲 索引:標簽 的字典
# 字典,類別:索引 {'daisy':0, 'dandelion':1, 'roses':2, 'sunflower':3, 'tulips':4}
flower_list = train_dataset.class_to_idx
# 將 flower_list 中的 key 和 val 調換位置
cla_dict = dict((val, key) for key, val in flower_list.items())
 
# 將 cla_dict 寫入 json 文件中
json_str = json.dumps(cla_dict, indent=4)
with open('class_indices.json', 'w') as json_file:
    json_file.write(json_str)
 
#訓練過程
net = AlexNet(num_classes=5, init_weights=True)  	  # 實例化網絡(輸出類型為5,初始化權重)
net.to(device)									 	  # 分配網絡到指定的設備(GPU/CPU)訓練
loss_function = nn.CrossEntropyLoss()			 	  # 交叉熵損失
optimizer = optim.Adam(net.parameters(), lr=0.0002)	  # 優化器(訓練參數,學習率)
 
save_path = './AlexNet.pth'
best_acc = 0.0
 
for epoch in range(150):
    ########################################## train ###############################################
    net.train()     					# 訓練過程中開啟 Dropout
    running_loss = 0.0					# 每個 epoch 都會對 running_loss  清零
    time_start = time.perf_counter()	# 對訓練一個 epoch 計時
    
    for step, data in enumerate(train_loader, start=0):  # 遍歷訓練集,step從0開始計算
        images, labels = data   # 獲取訓練集的圖像和標簽
        optimizer.zero_grad()	# 清除歷史梯度
        
        outputs = net(images.to(device))				 # 正向傳播
        loss = loss_function(outputs, labels.to(device)) # 計算損失
        loss.backward()								     # 反向傳播
        optimizer.step()								 # 優化器更新參數
        running_loss += loss.item()
        
        # 打印訓練進度(使訓練過程可視化)
        rate = (step + 1) / len(train_loader)           # 當前進度 = 當前step / 訓練一輪epoch所需總step
        a = "*" * int(rate * 50)
        b = "." * int((1 - rate) * 50)
        with open(os.path.join("train.log"), "a") as log:
              log.write(str("\rtrain loss: {:^3.0f}%[{}->{}]{:.3f}".format(int(rate * 100), a, b, loss))+"\n")
        print("\rtrain loss: {:^3.0f}%[{}->{}]{:.3f}".format(int(rate * 100), a, b, loss), end="")
    print()
    with open(os.path.join("train.log"), "a") as log:
              log.write(str('%f s' % (time.perf_counter()-time_start))+"\n")
    print('%f s' % (time.perf_counter()-time_start))
 
    ########################################### validate ###########################################
    net.eval()    # 驗證過程中關閉 Dropout
    acc = 0.0  
    with torch.no_grad():
        for val_data in validate_loader:
            val_images, val_labels = val_data
            outputs = net(val_images.to(device))
            predict_y = torch.max(outputs, dim=1)[1]  # 以output中值最大位置對應的索引(標簽)作為預測輸出
            acc += (predict_y == val_labels.to(device)).sum().item()    
        val_accurate = acc / val_num
        
        # 保存準確率最高的那次網絡參數
        if val_accurate > best_acc:
            best_acc = val_accurate
            torch.save(net.state_dict(), save_path)
        with open(os.path.join("train.log"), "a") as log:
              log.write(str('[epoch %d] train_loss: %.3f  test_accuracy: %.3f \n' %
              (epoch + 1, running_loss / step, val_accurate))+"\n")
        print('[epoch %d] train_loss: %.3f  test_accuracy: %.3f \n' %
              (epoch + 1, running_loss / step, val_accurate))
with open(os.path.join("train.log"), "a") as log:
      log.write(str('Finished Training')+"\n")
print('Finished Training')

訓練結果后,準確率是94%

訓練日志如下:

4.對模型進行預測

predict.py

import torch

接著對其中一個花卉圖片進行識別,其結果如下:

可以看到只有一個識別結果(daisy雛菊)和準確率1.0是100%(范圍是0~1,所以1對應100%)

為了方便使用這個神經網絡,接著我們將其開發成一個可視化的界面操作

二、花卉識別系統搭建(flask)

1.構建頁面:

2.調用神經網絡模型

main.py

# coding:utf-8
 
from flask import Flask, render_template, request, redirect, url_for, make_response, jsonify
from werkzeug.utils import secure_filename
import os
import time
 
 
###################
#模型所需庫包
import torch
from model import AlexNet
from PIL import Image
from torchvision import transforms
import matplotlib.pyplot as plt
import json
 
# read class_indict
try:
    json_file = open('./class_indices.json', 'r')
    class_indict = json.load(json_file)
except Exception as e:
    print(e)
    exit(-1)
 
# create model
model = AlexNet(num_classes=5)
# load model weights
model_weight_path = "./AlexNet.pth"
#, map_location='cpu'
model.load_state_dict(torch.load(model_weight_path, map_location='cpu'))
 
# 關閉 Dropout
model.eval()
 
###################
from datetime import timedelta
# 設置允許的文件格式
ALLOWED_EXTENSIONS = set(['png', 'jpg', 'JPG', 'PNG', 'bmp'])
 
def allowed_file(filename):
    return '.' in filename and filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS
 
app = Flask(__name__)
# 設置靜態文件緩存過期時間
app.send_file_max_age_default = timedelta(seconds=1)
 
#圖片裝換操作
def tran(img_path):
     # 預處理
    data_transform = transforms.Compose(
        [transforms.Resize((224, 224)),
         transforms.ToTensor(),
         transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
 
    # load image
    img = Image.open("pgy2.jpg")
    #plt.imshow(img)
    # [N, C, H, W]
    img = data_transform(img)
    # expand batch dimension
    img = torch.unsqueeze(img, dim=0)
    return img
    
 
@app.route('/upload', methods=['POST', 'GET'])  # 添加路由
def upload():
    path=""
    if request.method == 'POST':
        f = request.files['file']
        if not (f and allowed_file(f.filename)):
            return jsonify({"error": 1001, "msg": "請檢查上傳的圖片類型,僅限于png、PNG、jpg、JPG、bmp"})
 
        basepath = os.path.dirname(__file__)  # 當前文件所在路徑
        path = secure_filename(f.filename)
        upload_path = os.path.join(basepath, 'static/images', secure_filename(f.filename))  # 注意:沒有的文件夾一定要先創建,不然會提示沒有該路徑
        # upload_path = os.path.join(basepath, 'static/images','test.jpg')  #注意:沒有的文件夾一定要先創建,不然會提示沒有該路徑
        print(path)
 
        img = tran('static/images'+path)
        ##########################
        #預測圖片
        with torch.no_grad():
            # predict class
            output = torch.squeeze(model(img))     # 將輸出壓縮,即壓縮掉 batch 這個維度
            predict = torch.softmax(output, dim=0)
            predict_cla = torch.argmax(predict).numpy()
            res = class_indict[str(predict_cla)]
            pred = predict[predict_cla].item()
            #print(class_indict[str(predict_cla)], predict[predict_cla].item())
        res_chinese = ""
        if res=="daisy":
            res_chinese="雛菊"
        if res=="dandelion":
            res_chinese="蒲公英"
        if res=="roses":
            res_chinese="玫瑰"
        if res=="sunflower":
            res_chinese="向日葵"
        if res=="tulips":
            res_chinese="郁金香"
 
        #print('result:', class_indict[str(predict_class)], 'accuracy:', prediction[predict_class])
        ##########################
        f.save(upload_path)
        pred = pred*100
        return render_template('upload_ok.html', path=path, res_chinese=res_chinese,pred = pred, val1=time.time())
 
    return render_template('upload.html')
 
if __name__ == '__main__':
    # app.debug = True
    app.run(host='127.0.0.1', port=80,debug = True)

3.系統識別結果

!DOCTYPE html>
html lang="en">
head>
    meta charset="UTF-8">
    title>李運辰-花卉識別系統v1.0/title>
	link rel="stylesheet" type="text/css" href="../static/css/bootstrap.min.css" rel="external nofollow" >
	link rel="stylesheet" type="text/css" href="../static/css/fileinput.css" rel="external nofollow" >
    script src="../static/js/jquery-2.1.4.min.js">/script>
	
    script src="../static/js/bootstrap.min.js">/script> 
	script src="../static/js/fileinput.js">/script> 
	script src="../static/js/locales/zh.js">/script> 
/head>
body>
    h1  align="center">李運辰-花卉識別系統v1.0/h1>
	div align="center">
    form action="" enctype='multipart/form-data' method='POST'>
        input type="file" name="file" class="file"  data-show-preview="false" style="margin-top:20px;"/>
        br>
        input type="submit" value="上傳" class="button-new btn btn-primary" style="margin-top:15px;"/>
    /form>
	p  style="size:15px;color:blue;">識別結果:{{res_chinese}}/p>
	/br>
	p  style="size:15px;color:red;">準確率:{{pred}}%/p>
    img src="{{ './static/images/'+path }}" width="400" height="400" alt=""/>
	/div>
/body>
/html>

4.啟動系統:

python main.py

接著在瀏覽器在瀏覽器里面訪問

http://127.0.0.1/upload

出現如下界面:

最后來一個識別過程的動圖

三、總結

ok,這個花卉系統就已經搭建完成了,是不是超級簡單,我也是趁著修了這個機器視覺這么課,才弄這么一個系統,回顧一下之前的知識,哈哈哈。

以上就是用python搭建一個花卉識別系統的詳細內容,更多關于python 花卉識別系統的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • Python深度學習之實現卷積神經網絡
  • python 使用Tensorflow訓練BP神經網絡實現鳶尾花分類
  • python神經網絡編程之手寫數字識別
  • Python利用numpy實現三層神經網絡的示例代碼
  • python機器學習之神經網絡
  • Python如何使用神經網絡進行簡單文本分類
  • Python創建簡單的神經網絡實例講解
  • 如何用Python 實現全連接神經網絡(Multi-layer Perceptron)
  • Python實現Keras搭建神經網絡訓練分類模型教程
  • python神經網絡編程實現手寫數字識別
  • python實現BP神經網絡回歸預測模型

標簽:安慶 怒江 清遠 洛陽 長春 岳陽 泉州 吉林

巨人網絡通訊聲明:本文標題《用python搭建一個花卉識別系統》,本文關鍵詞  用,python,搭建,一個,花卉,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《用python搭建一個花卉識別系統》相關的同類信息!
  • 本頁收集關于用python搭建一個花卉識別系統的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    狠狠狠色丁香婷婷综合激情| 一区二区在线观看视频| 欧美少妇性性性| 欧美色爱综合网| 欧美性一级生活| 欧美日韩成人综合| 91精品国产aⅴ一区二区| 欧美一区二区精品在线| 精品动漫一区二区三区在线观看| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 宅男噜噜噜66一区二区66| 欧美丰满嫩嫩电影| 日韩欧美综合在线| 精品久久久三级丝袜| 久久久www成人免费毛片麻豆| 国产清纯美女被跳蛋高潮一区二区久久w | 日韩高清不卡一区二区三区| 日韩国产在线一| 黄色资源网久久资源365| 成人丝袜视频网| 欧美性色黄大片| 精品国产一区久久| 国产精品少妇自拍| 首页国产欧美久久| 国产精品小仙女| 欧美日韩在线播| 久久中文字幕电影| 一区二区三区在线免费视频 | 一区二区不卡在线播放 | 色综合天天综合给合国产| 欧美日韩国产小视频在线观看| 久久综合色天天久久综合图片| 国产精品不卡在线| 五月综合激情日本mⅴ| 成人白浆超碰人人人人| 欧美男女性生活在线直播观看| 国产日韩欧美不卡在线| 日韩vs国产vs欧美| 99国产欧美久久久精品| 欧美成人三级在线| 亚洲图片自拍偷拍| 国产91精品一区二区| 欧美电影一区二区| 亚洲伦在线观看| 波多野结衣中文字幕一区二区三区| 欧美日韩精品福利| 亚洲精品欧美综合四区| 风间由美一区二区av101| 日韩精品一区二区三区在线观看 | 精品一区二区三区免费毛片爱| www.久久久久久久久| 欧美一区二区高清| 亚洲国产精品人人做人人爽| av在线一区二区| 欧美高清在线视频| 国内精品伊人久久久久av影院 | 久久综合五月天婷婷伊人| 亚洲一区中文日韩| 91丨九色丨尤物| 最新国产の精品合集bt伙计| 国产不卡高清在线观看视频| 精品免费99久久| 男人的天堂久久精品| 欧美日韩国产成人在线91| 亚洲精品日韩一| 91在线观看地址| 亚洲免费观看视频| 一本大道久久a久久综合| 亚洲色图都市小说| 色综合久久天天| 一区二区三区中文在线观看| 色综合天天综合网天天看片| 亚洲精品一二三| 欧日韩精品视频| 亚洲高清视频在线| 欧美老人xxxx18| 青青草国产精品97视觉盛宴| 精品国产一区二区三区四区四| 国产精品丝袜在线| 91麻豆免费看| 亚洲午夜羞羞片| 欧美一二三区在线观看| 国内精品不卡在线| 国产精品黄色在线观看| 色婷婷亚洲一区二区三区| 亚洲一区二区精品久久av| 欧美日本乱大交xxxxx| 久久国产精品第一页| 中文字幕免费一区| 一本到不卡精品视频在线观看| 亚洲综合一二三区| 日韩欧美色综合| 国产精品一区在线| 一区二区三区四区亚洲| 91精品国产免费| 成人手机在线视频| 亚洲大尺度视频在线观看| 久久综合久久综合亚洲| 91视频在线看| 久久99国产精品免费网站| 亚洲国产精品av| 欧美狂野另类xxxxoooo| 国产成人av电影在线观看| 夜夜爽夜夜爽精品视频| 2023国产精品自拍| 欧美色窝79yyyycom| 国产精品亚洲专一区二区三区| 中文字幕在线不卡国产视频| 欧美日免费三级在线| 国产99久久精品| 蜜桃免费网站一区二区三区| 综合自拍亚洲综合图不卡区| 日韩精品一区二区三区swag| 一本色道久久综合亚洲aⅴ蜜桃 | 国产亚洲综合性久久久影院| 欧美体内she精高潮| 国产成人亚洲综合a∨猫咪| 亚洲伊人色欲综合网| 中文字幕av在线一区二区三区| 欧美日韩国产大片| 99在线精品视频| 国产激情视频一区二区三区欧美 | 久久99精品视频| 亚洲自拍另类综合| 国产精品视频一区二区三区不卡| 欧美一级精品在线| 欧美午夜一区二区三区 | 国产精品一区专区| 免费久久精品视频| 日韩精品一区第一页| 亚洲伊人伊色伊影伊综合网| 欧美国产激情一区二区三区蜜月| 精品对白一区国产伦| 日韩欧美一二三区| 日韩一区二区三区电影 | 国产精品不卡在线| 中国av一区二区三区| 久久伊人中文字幕| 久久久午夜精品| 久久久蜜臀国产一区二区| 久久综合狠狠综合久久综合88| 日韩午夜精品电影| 欧美大片免费久久精品三p| 欧美一区二区三区免费视频| 欧美日韩在线一区二区| 精品污污网站免费看| 欧美日韩一区高清| 制服丝袜国产精品| 欧美成人欧美edvon| 久久久久久久久岛国免费| 欧美经典一区二区| 国产精品福利电影一区二区三区四区| 国产日韩欧美综合一区| 国产精品乱人伦| 亚洲视频在线一区| 亚洲国产精品天堂| 日本aⅴ亚洲精品中文乱码| 久久av资源站| 顶级嫩模精品视频在线看| 成人av电影在线观看| 日本丰满少妇一区二区三区| 欧美老女人第四色| 久久久久久9999| 亚洲视频一区二区在线观看| 亚洲妇女屁股眼交7| 美国毛片一区二区| 成人一级黄色片| 欧美在线观看18| 精品免费国产一区二区三区四区| 久久美女艺术照精彩视频福利播放 | 一区二区高清免费观看影视大全| 午夜精品福利在线| 国产麻豆精品视频| 色婷婷综合久久久久中文一区二区| 欧美日韩中文字幕一区二区| 精品国产一区二区三区av性色| 国产精品国产三级国产aⅴ原创 | 国产女人水真多18毛片18精品视频 | 国产精品久久久久久久第一福利| 亚洲欧美一区二区三区国产精品| 爽好多水快深点欧美视频| 国产成人综合视频| 欧美日韩亚洲国产综合| 国产日韩欧美制服另类| 午夜精品久久久久久久久久久| 国产91精品久久久久久久网曝门 | 91精品国产高清一区二区三区| 国产视频一区在线观看| 一区二区三区欧美| 成人黄色综合网站| 日韩一区二区电影网| 亚洲乱码国产乱码精品精小说| 国产综合久久久久久久久久久久| 欧美日韩一区在线| 国产精品免费视频观看| 麻豆免费看一区二区三区| 欧美三级乱人伦电影| 亚洲卡通动漫在线| 成a人片国产精品| 久久这里只精品最新地址|