校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識(shí)庫 > 用python搭建一個(gè)花卉識(shí)別系統(tǒng)

用python搭建一個(gè)花卉識(shí)別系統(tǒng)

熱門標(biāo)簽:高德地圖標(biāo)注是免費(fèi)的嗎 北京電信外呼系統(tǒng)靠譜嗎 無錫客服外呼系統(tǒng)一般多少錢 地圖標(biāo)注視頻廣告 大連crm外呼系統(tǒng) 梅州外呼業(yè)務(wù)系統(tǒng) 百度地圖標(biāo)注位置怎么修改 老人電話機(jī)器人 洪澤縣地圖標(biāo)注

一.開源神經(jīng)網(wǎng)絡(luò)(AlexNet)

1.獲取數(shù)據(jù)集

使用步驟如下:
* (1)在data_set文件夾下創(chuàng)建新文件夾"flower_data"
* (2)點(diǎn)擊鏈接下載花分類數(shù)據(jù)集download.tensorflow.org/example\_im…
* (3)解壓數(shù)據(jù)集到flower_data文件夾下
* (4)執(zhí)行"split_data.py"腳本自動(dòng)將數(shù)據(jù)集劃分成訓(xùn)練集train和驗(yàn)證集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):
        # 如果文件夾存在,則先刪除原文件夾在重新創(chuàng)建
        rmtree(file_path)
    os.makedirs(file_path)
 
 
def main():
    # 保證隨機(jī)可復(fù)現(xiàn)
    random.seed(0)
 
    # 將數(shù)據(jù)集中10%的數(shù)據(jù)劃分到驗(yàn)證集中
    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))]
 
    # 建立保存訓(xùn)練集的文件夾
    train_root = os.path.join(data_root, "train")
    mk_file(train_root)
    for cla in flower_class:
        # 建立每個(gè)類別對(duì)應(yīng)的文件夾
        mk_file(os.path.join(train_root, cla))
 
    # 建立保存驗(yàn)證集的文件夾
    val_root = os.path.join(data_root, "val")
    mk_file(val_root)
    for cla in flower_class:
        # 建立每個(gè)類別對(duì)應(yīng)的文件夾
        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)
        # 隨機(jī)采樣驗(yàn)證集的索引
        eval_index = random.sample(images, k=int(num*split_rate))
        for index, image in enumerate(images):
            if image in eval_index:
                # 將分配至驗(yàn)證集中的文件復(fù)制到相應(yīng)目錄
                image_path = os.path.join(cla_path, image)
                new_path = os.path.join(val_root, cla)
                copy(image_path, new_path)
            else:
                # 將分配至訓(xùn)練集中的文件復(fù)制到相應(yīng)目錄
                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.神經(jīng)網(wǎng)絡(luò)模型

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()將網(wǎng)絡(luò)打包成一個(gè)模塊,精簡(jiǎn)代碼
        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), 									# 直接修改覆蓋原值,節(jié)省運(yùn)算內(nèi)存
            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(   # 全連接層對(duì)圖像分類
            nn.Dropout(p=0.5),			   # Dropout 隨機(jī)失活神經(jīng)元,默認(rèn)比例為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
        
	# 網(wǎng)絡(luò)權(quán)重初始化,實(shí)際上 pytorch 在構(gòu)建網(wǎng)絡(luò)時(shí)會(huì)自動(dòng)初始化權(quán)重
    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_法初始化權(quán)重
                                        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)    # 正態(tài)分布初始化
                nn.init.constant_(m.bias, 0)          # 初始化偏重為0

3.訓(xùn)練神經(jīng)網(wǎng)絡(luò)

train.py

# 導(dǎo)入包
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訓(xùn)練
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")
 
#數(shù)據(jù)預(yù)處理
data_transform = {
    "train": transforms.Compose([transforms.RandomResizedCrop(224),       # 隨機(jī)裁剪,再縮放成 224×224
                                 transforms.RandomHorizontalFlip(p=0.5),  # 水平方向隨機(jī)翻轉(zhuǎn),概率為 0.5, 即一半的概率翻轉(zhuǎn), 一半的概率不翻轉(zhuǎn)
                                 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))])}
 
#導(dǎo)入、加載 訓(xùn)練集
# 導(dǎo)入訓(xùn)練集
#train_set = torchvision.datasets.CIFAR10(root='./data', 	 # 數(shù)據(jù)集存放目錄
#										 train=True,		 # 表示是數(shù)據(jù)集中的訓(xùn)練集
#                                        download=True,  	 # 第一次運(yùn)行時(shí)為True,下載數(shù)據(jù)集,下載完成后改為False
#                                        transform=transform) # 預(yù)處理過程
# 加載訓(xùn)練集                              
#train_loader = torch.utils.data.DataLoader(train_set, 	  # 導(dǎo)入的訓(xùn)練集
#										   batch_size=50, # 每批訓(xùn)練的樣本數(shù)
#                                          shuffle=False,  # 是否打亂訓(xùn)練集
#                                          num_workers=0)  # num_workers在windows下設(shè)置為0
 
 
# 獲取圖像數(shù)據(jù)集的路徑
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
 
# 導(dǎo)入訓(xùn)練集并進(jìn)行預(yù)處理
train_dataset = datasets.ImageFolder(root=image_path + "/train",		
                                     transform=data_transform["train"])
train_num = len(train_dataset)
 
# 按batch_size分批次加載訓(xùn)練集
train_loader = torch.utils.data.DataLoader(train_dataset,	# 導(dǎo)入的訓(xùn)練集
                                           batch_size=32, 	# 每批訓(xùn)練的樣本數(shù)
                                           shuffle=True,	# 是否打亂訓(xùn)練集
                                           num_workers=0)	# 使用線程數(shù),在windows下設(shè)置為0
 
#導(dǎo)入、加載 驗(yàn)證集
# 導(dǎo)入驗(yàn)證集并進(jìn)行預(yù)處理
validate_dataset = datasets.ImageFolder(root=image_path + "/val",
                                        transform=data_transform["val"])
val_num = len(validate_dataset)
 
# 加載驗(yàn)證集
validate_loader = torch.utils.data.DataLoader(validate_dataset,	# 導(dǎo)入的驗(yàn)證集
                                              batch_size=32, 
                                              shuffle=True,
                                              num_workers=0)
 
# 存儲(chǔ) 索引:標(biāo)簽 的字典
# 字典,類別:索引 {'daisy':0, 'dandelion':1, 'roses':2, 'sunflower':3, 'tulips':4}
flower_list = train_dataset.class_to_idx
# 將 flower_list 中的 key 和 val 調(diào)換位置
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)
 
#訓(xùn)練過程
net = AlexNet(num_classes=5, init_weights=True)  	  # 實(shí)例化網(wǎng)絡(luò)(輸出類型為5,初始化權(quán)重)
net.to(device)									 	  # 分配網(wǎng)絡(luò)到指定的設(shè)備(GPU/CPU)訓(xùn)練
loss_function = nn.CrossEntropyLoss()			 	  # 交叉熵?fù)p失
optimizer = optim.Adam(net.parameters(), lr=0.0002)	  # 優(yōu)化器(訓(xùn)練參數(shù),學(xué)習(xí)率)
 
save_path = './AlexNet.pth'
best_acc = 0.0
 
for epoch in range(150):
    ########################################## train ###############################################
    net.train()     					# 訓(xùn)練過程中開啟 Dropout
    running_loss = 0.0					# 每個(gè) epoch 都會(huì)對(duì) running_loss  清零
    time_start = time.perf_counter()	# 對(duì)訓(xùn)練一個(gè) epoch 計(jì)時(shí)
    
    for step, data in enumerate(train_loader, start=0):  # 遍歷訓(xùn)練集,step從0開始計(jì)算
        images, labels = data   # 獲取訓(xùn)練集的圖像和標(biāo)簽
        optimizer.zero_grad()	# 清除歷史梯度
        
        outputs = net(images.to(device))				 # 正向傳播
        loss = loss_function(outputs, labels.to(device)) # 計(jì)算損失
        loss.backward()								     # 反向傳播
        optimizer.step()								 # 優(yōu)化器更新參數(shù)
        running_loss += loss.item()
        
        # 打印訓(xùn)練進(jìn)度(使訓(xùn)練過程可視化)
        rate = (step + 1) / len(train_loader)           # 當(dāng)前進(jìn)度 = 當(dāng)前step / 訓(xùn)練一輪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()    # 驗(yàn)證過程中關(guān)閉 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中值最大位置對(duì)應(yīng)的索引(標(biāo)簽)作為預(yù)測(cè)輸出
            acc += (predict_y == val_labels.to(device)).sum().item()    
        val_accurate = acc / val_num
        
        # 保存準(zhǔn)確率最高的那次網(wǎng)絡(luò)參數(shù)
        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')

訓(xùn)練結(jié)果后,準(zhǔn)確率是94%

訓(xùn)練日志如下:

4.對(duì)模型進(jìn)行預(yù)測(cè)

predict.py

import torch

接著對(duì)其中一個(gè)花卉圖片進(jìn)行識(shí)別,其結(jié)果如下:

可以看到只有一個(gè)識(shí)別結(jié)果(daisy雛菊)和準(zhǔn)確率1.0是100%(范圍是0~1,所以1對(duì)應(yīng)100%)

為了方便使用這個(gè)神經(jīng)網(wǎng)絡(luò),接著我們將其開發(fā)成一個(gè)可視化的界面操作

二、花卉識(shí)別系統(tǒng)搭建(flask)

1.構(gòu)建頁面:

2.調(diào)用神經(jīng)網(wǎng)絡(luò)模型

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'))
 
# 關(guān)閉 Dropout
model.eval()
 
###################
from datetime import timedelta
# 設(shè)置允許的文件格式
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__)
# 設(shè)置靜態(tài)文件緩存過期時(shí)間
app.send_file_max_age_default = timedelta(seconds=1)
 
#圖片裝換操作
def tran(img_path):
     # 預(yù)處理
    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": "請(qǐng)檢查上傳的圖片類型,僅限于png、PNG、jpg、JPG、bmp"})
 
        basepath = os.path.dirname(__file__)  # 當(dāng)前文件所在路徑
        path = secure_filename(f.filename)
        upload_path = os.path.join(basepath, 'static/images', secure_filename(f.filename))  # 注意:沒有的文件夾一定要先創(chuàng)建,不然會(huì)提示沒有該路徑
        # upload_path = os.path.join(basepath, 'static/images','test.jpg')  #注意:沒有的文件夾一定要先創(chuàng)建,不然會(huì)提示沒有該路徑
        print(path)
 
        img = tran('static/images'+path)
        ##########################
        #預(yù)測(cè)圖片
        with torch.no_grad():
            # predict class
            output = torch.squeeze(model(img))     # 將輸出壓縮,即壓縮掉 batch 這個(gè)維度
            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.系統(tǒng)識(shí)別結(jié)果

!DOCTYPE html>
html lang="en">
head>
    meta charset="UTF-8">
    title>李運(yùn)辰-花卉識(shí)別系統(tǒng)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">李運(yùn)辰-花卉識(shí)別系統(tǒng)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;">識(shí)別結(jié)果:{{res_chinese}}/p>
	/br>
	p  style="size:15px;color:red;">準(zhǔn)確率:{{pred}}%/p>
    img src="{{ './static/images/'+path }}" width="400" height="400" alt=""/>
	/div>
/body>
/html>

4.啟動(dòng)系統(tǒng):

python main.py

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

http://127.0.0.1/upload

出現(xiàn)如下界面:

最后來一個(gè)識(shí)別過程的動(dòng)圖

三、總結(jié)

ok,這個(gè)花卉系統(tǒng)就已經(jīng)搭建完成了,是不是超級(jí)簡(jiǎn)單,我也是趁著修了這個(gè)機(jī)器視覺這么課,才弄這么一個(gè)系統(tǒng),回顧一下之前的知識(shí),哈哈哈。

以上就是用python搭建一個(gè)花卉識(shí)別系統(tǒng)的詳細(xì)內(nèi)容,更多關(guān)于python 花卉識(shí)別系統(tǒng)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • Python深度學(xué)習(xí)之實(shí)現(xiàn)卷積神經(jīng)網(wǎng)絡(luò)
  • python 使用Tensorflow訓(xùn)練BP神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)鳶尾花分類
  • python神經(jīng)網(wǎng)絡(luò)編程之手寫數(shù)字識(shí)別
  • Python利用numpy實(shí)現(xiàn)三層神經(jīng)網(wǎng)絡(luò)的示例代碼
  • python機(jī)器學(xué)習(xí)之神經(jīng)網(wǎng)絡(luò)
  • Python如何使用神經(jīng)網(wǎng)絡(luò)進(jìn)行簡(jiǎn)單文本分類
  • Python創(chuàng)建簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò)實(shí)例講解
  • 如何用Python 實(shí)現(xiàn)全連接神經(jīng)網(wǎng)絡(luò)(Multi-layer Perceptron)
  • Python實(shí)現(xiàn)Keras搭建神經(jīng)網(wǎng)絡(luò)訓(xùn)練分類模型教程
  • python神經(jīng)網(wǎng)絡(luò)編程實(shí)現(xiàn)手寫數(shù)字識(shí)別
  • python實(shí)現(xiàn)BP神經(jīng)網(wǎng)絡(luò)回歸預(yù)測(cè)模型

標(biāo)簽:安慶 怒江 清遠(yuǎn) 洛陽 長(zhǎng)春 岳陽 泉州 吉林

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《用python搭建一個(gè)花卉識(shí)別系統(tǒng)》,本文關(guān)鍵詞  用,python,搭建,一個(gè),花卉,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《用python搭建一個(gè)花卉識(shí)別系統(tǒng)》相關(guān)的同類信息!
  • 本頁收集關(guān)于用python搭建一個(gè)花卉識(shí)別系統(tǒng)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    日韩亚洲国产中文字幕欧美| 亚洲va在线va天堂| 国产成人精品午夜视频免费| 久久久久国色av免费看影院| 国产成人精品综合在线观看| 亚洲同性gay激情无套| 欧美亚洲动漫另类| 奇米777欧美一区二区| 久久女同性恋中文字幕| 成人app在线| 亚洲成人免费观看| 久久综合999| 91亚洲精品久久久蜜桃网站| 亚洲福利视频一区| 久久久久久夜精品精品免费| 成人精品视频一区二区三区| 亚洲影院在线观看| 欧美mv和日韩mv的网站| 国产99久久久国产精品免费看| 亚洲精品久久久久久国产精华液| 欧美精品免费视频| 国产在线播放一区三区四| 亚洲精品一二三| 欧美岛国在线观看| 91美女蜜桃在线| 看国产成人h片视频| 国产精品国产自产拍高清av| 欧美久久久久免费| 成人激情黄色小说| 日韩成人一区二区| 亚洲欧洲国产日本综合| 制服丝袜中文字幕亚洲| 白白色 亚洲乱淫| 蜜臀精品久久久久久蜜臀| 国产精品热久久久久夜色精品三区| 欧美日韩高清不卡| 成人动漫一区二区三区| 免费成人在线观看视频| 尤物视频一区二区| 国产精品毛片久久久久久久| 91精品啪在线观看国产60岁| 99久久夜色精品国产网站| 蜜桃久久久久久| 亚洲综合激情网| 国产精品国产精品国产专区不蜜 | 日本高清不卡视频| 国产在线观看一区二区| 亚洲bt欧美bt精品777| 国产精品高潮呻吟久久| 精品国产乱码久久久久久1区2区| 欧美性一级生活| 99精品国产热久久91蜜凸| 国产精品夜夜嗨| 捆绑变态av一区二区三区| 亚洲va天堂va国产va久| 亚洲精品午夜久久久| 美女视频网站久久| 一本一道波多野结衣一区二区| 91在线视频播放地址| 玉米视频成人免费看| 国产欧美一区二区精品性| 日韩视频一区二区三区 | 水蜜桃久久夜色精品一区的特点 | 欧美年轻男男videosbes| 91蜜桃传媒精品久久久一区二区| 国产成人亚洲综合a∨婷婷| 日本伊人色综合网| 天天做天天摸天天爽国产一区 | 国产精品素人视频| 久久在线观看免费| 精品久久久久久久久久久院品网 | 日日噜噜夜夜狠狠视频欧美人| 在线观看免费视频综合| 91丨porny丨户外露出| 国产91富婆露脸刺激对白| 国产一区999| 国产精品亚洲成人| 国产黄色精品网站| 国产成人在线免费| 成人免费va视频| 99国内精品久久| 在线观看亚洲a| 欧美视频第二页| 欧美日韩亚洲国产综合| 69堂亚洲精品首页| 日韩欧美视频一区| 久久久久久久久蜜桃| 国产精品欧美经典| 亚洲精品v日韩精品| 亚洲国产人成综合网站| 日韩国产欧美在线视频| 久久爱另类一区二区小说| 国产一区二区精品在线观看| 成人污污视频在线观看| 一本久久a久久精品亚洲| 欧美日韩欧美一区二区| 日韩精品中午字幕| 日本一区二区三区国色天香| 亚洲视频综合在线| 午夜欧美视频在线观看| 国内精品国产成人| 成人av在线资源网站| 在线一区二区三区| 91精品国产免费| 日本一区二区三区高清不卡| 欧美性生活大片视频| 久久综合国产精品| 在线观看三级视频欧美| 91精品国产乱码久久蜜臀| 久久蜜桃一区二区| 亚洲综合成人在线视频| 精品一区二区免费在线观看| gogogo免费视频观看亚洲一| 欧美另类高清zo欧美| 337p日本欧洲亚洲大胆精品 | 日韩高清不卡一区二区| 国产精品亚洲午夜一区二区三区 | 精品久久国产97色综合| 中文字幕中文乱码欧美一区二区| 午夜久久久影院| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 日韩三级中文字幕| 中文字幕在线播放不卡一区| 午夜激情综合网| av电影在线观看不卡| 久久精品国产亚洲5555| 亚洲欧美在线视频观看| 国产精品美女一区二区| 亚洲女人****多毛耸耸8| 免费观看在线色综合| 成人黄色免费短视频| 日韩欧美一区二区久久婷婷| 亚洲视频网在线直播| 久久精品国产精品亚洲红杏| 色婷婷激情一区二区三区| 精品国产一区二区三区久久久蜜月| 亚洲视频香蕉人妖| 国产白丝网站精品污在线入口 | 日韩视频中午一区| 一区二区三区中文字幕精品精品 | 91精品国产综合久久香蕉麻豆 | 久久久久99精品国产片| 一区二区三区四区乱视频| 国产99久久精品| 久久嫩草精品久久久精品一| 三级久久三级久久| 日本韩国一区二区三区| 国产精品另类一区| 国产一区二区三区av电影| 日韩午夜激情免费电影| 青椒成人免费视频| 欧美精品 国产精品| 亚洲午夜久久久久久久久电影院 | 亚洲一区二区三区在线看| 成人av资源站| 欧美国产禁国产网站cc| 国产九色sp调教91| 国产丝袜欧美中文另类| 国产在线视频一区二区三区| 欧美成人福利视频| 久久91精品国产91久久小草| 日韩欧美国产wwwww| 久久精品国产在热久久| 精品国产乱码久久久久久1区2区| 免费xxxx性欧美18vr| 欧美一级电影网站| 蜜桃一区二区三区在线观看| 91精品国产综合久久婷婷香蕉| 3d动漫精品啪啪一区二区竹菊| 国产成人在线视频免费播放| 精品影视av免费| 欧美写真视频网站| 五月激情综合网| 91麻豆精品国产91久久久久| 美女任你摸久久| 久久青草国产手机看片福利盒子 | 国产欧美一区视频| 国产乱码精品一品二品| 欧美极品另类videosde| 成人在线视频一区| 亚洲欧美电影一区二区| 欧美喷水一区二区| 久久99蜜桃精品| 国产日韩欧美在线一区| 一本色道亚洲精品aⅴ| 亚洲一卡二卡三卡四卡无卡久久 | 色综合久久久久久久久| 亚洲一区二区精品视频| 91精品福利在线一区二区三区| 狠狠色综合日日| 亚洲视频精选在线| 欧美另类高清zo欧美| 国产在线看一区| 国产精品久久久久久久久果冻传媒| 91国偷自产一区二区开放时间 | 99久久精品99国产精品 | 久久麻豆一区二区| 91日韩在线专区| 日本不卡的三区四区五区| 国产日产亚洲精品系列|