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

【深度學習系列】用PaddlePaddle和Tensorflow進行圖像分類

人工智能 開發工具
上個月發布了四篇文章,主要講了深度學習中的“hello world”----mnist圖像識別,以及卷積神經網絡的原理詳解,包括基本原理、自己手寫CNN和paddlepaddle的源碼解析。這篇主要跟大家講講如何用PaddlePaddle和Tensorflow做圖像分類。

上個月發布了四篇文章,主要講了深度學習中的“hello world”----mnist圖像識別,以及卷積神經網絡的原理詳解,包括基本原理、自己手寫CNN和paddlepaddle的源碼解析。這篇主要跟大家講講如何用PaddlePaddle和Tensorflow做圖像分類。所有程序都在我的github里,可以自行下載訓練。

  在卷積神經網絡中,有五大經典模型,分別是:LeNet-5,AlexNet,GoogleNet,Vgg和ResNet。本文首先自己設計一個小型CNN網絡結構來對圖像進行分類,再了解一下LeNet-5網絡結構對圖像做分類,并用比較流行的Tensorflow框架和百度的PaddlePaddle實現LeNet-5網絡結構,并對結果對比。


 什么是圖像分類

   圖像分類是根據圖像的語義信息將不同類別圖像區分開來,是計算機視覺中重要的基本問題,也是圖像檢測、圖像分割、物體跟蹤、行為分析等其他高層視覺任務的基礎。圖像分類在很多領域有廣泛應用,包括安防領域的人臉識別和智能視頻分析等,交通領域的交通場景識別,互聯網領域基于內容的圖像檢索和相冊自動歸類,醫學領域的圖像識別等(引用自官網)

  cifar-10數據集

  CIFAR-10分類問題是機器學習領域的一個通用基準,由60000張32*32的RGB彩色圖片構成,共10個分類。50000張用于訓練集,10000張用于測試集。其問題是將32X32像素的RGB圖像分類成10種類別:飛機手機鹿青蛙卡車。更多信息可以參考CIFAR-10Alex Krizhevsky的演講報告。常見的還有cifar-100,分類物體達到100類,以及ILSVRC比賽的100類。

  


自己設計CNN

  了解CNN的基本網絡結構后,首先自己設計一個簡單的CNN網絡結構對cifar-10數據進行分類。

  網絡結構

  代碼實現

1. 網絡結構:simple_cnn.py

 
 1 #coding:utf-8
 2 '''
 3 Created by huxiaoman 2017.11.27
 4 simple_cnn.py:自己設計的一個簡單的cnn網絡結構
 5 '''
 6 
 7 import os
 8 from PIL import Image
 9 import numpy as np
10 import paddle.v2 as paddle
11 from paddle.trainer_config_helpers import *
12 
13 with_gpu = os.getenv('WITH_GPU', '0') != '1'
14 
15 def simple_cnn(img):
16     conv_pool_1 = paddle.networks.simple_img_conv_pool(
17         input=img,
18         filter_size=5,
19         num_filters=20,
20         num_channel=3,
21         pool_size=2,
22         pool_stride=2,
23         act=paddle.activation.Relu())
24     conv_pool_2 = paddle.networks.simple_img_conv_pool(
25         input=conv_pool_1,
26         filter_size=5,
27         num_filters=50,
28         num_channel=20,
29         pool_size=2,
30         pool_stride=2,
31         act=paddle.activation.Relu())
32     fc = paddle.layer.fc(
33         input=conv_pool_2, size=512, act=paddle.activation.Softmax())

 

2. 訓練程序:train_simple_cnn.py

 
  1 #coding:utf-8
  2 '''
  3 Created by huxiaoman 2017.11.27
  4 train_simple—_cnn.py:訓練simple_cnn對cifar10數據集進行分類
  5 '''
  6 import sys, os
  7 
  8 import paddle.v2 as paddle
  9 from simple_cnn import simple_cnn
 10 
 11 with_gpu = os.getenv('WITH_GPU', '0') != '1'
 12 
 13 
 14 def main():
 15     datadim = 3 * 32 * 32
 16     classdim = 10
 17 
 18     # PaddlePaddle init
 19     paddle.init(use_gpu=with_gpu, trainer_count=7)
 20 
 21     image = paddle.layer.data(
 22         name="image", type=paddle.data_type.dense_vector(datadim))
 23 
 24     # Add neural network config
 25     # option 1. resnet
 26     # net = resnet_cifar10(image, depth=32)
 27     # option 2. vgg
 28     net = simple_cnn(image)
 29 
 30     out = paddle.layer.fc(
 31         input=net, size=classdim, act=paddle.activation.Softmax())
 32 
 33     lbl = paddle.layer.data(
 34         name="label", type=paddle.data_type.integer_value(classdim))
 35     cost = paddle.layer.classification_cost(input=out, label=lbl)
 36 
 37     # Create parameters
 38     parameters = paddle.parameters.create(cost)
 39 
 40     # Create optimizer
 41     momentum_optimizer = paddle.optimizer.Momentum(
 42         momentum=0.9,
 43         regularization=paddle.optimizer.L2Regularization(rate=0.0002 * 128),
 44         learning_rate=0.1 / 128.0,
 45         learning_rate_decay_a=0.1,
 46         learning_rate_decay_b=50000 * 100,
 47         learning_rate_schedule='discexp')
 48 
 49     # End batch and end pass event handler
 50     def event_handler(event):
 51         if isinstance(event, paddle.event.EndIteration):
 52             if event.batch_id % 100 == 0:
 53                 print "\nPass %d, Batch %d, Cost %f, %s" % (
 54                     event.pass_id, event.batch_id, event.cost, event.metrics)
 55             else:
 56                 sys.stdout.write('.')
 57                 sys.stdout.flush()
 58         if isinstance(event, paddle.event.EndPass):
 59             # save parameters
 60             with open('params_pass_%d.tar' % event.pass_id, 'w') as f:
 61                 parameters.to_tar(f)
 62 
 63             result = trainer.test(
 64                 reader=paddle.batch(
 65                     paddle.dataset.cifar.test10(), batch_size=128),
 66                 feeding={'image': 0,
 67                          'label': 1})
 68             print "\nTest with Pass %d, %s" % (event.pass_id, result.metrics)
 69 
 70     # Create trainer
 71     trainer = paddle.trainer.SGD(
 72         cost=cost, parameters=parameters, update_equation=momentum_optimizer)
 73 
 74     # Save the inference topology to protobuf.
 75     inference_topology = paddle.topology.Topology(layers=out)
 76     with open("inference_topology.pkl", 'wb') as f:
 77         inference_topology.serialize_for_inference(f)
 78 
 79     trainer.train(
 80         reader=paddle.batch(
 81             paddle.reader.shuffle(
 82                 paddle.dataset.cifar.train10(), buf_size=50000),
 83             batch_size=128),
 84         num_passes=200,
 85         event_handler=event_handler,
 86         feeding={'image': 0,
 87                  'label': 1})
 88 
 89     # inference
 90     from PIL import Image
 91     import numpy as np
 92     import os
 93 
 94     def load_image(file):
 95         im = Image.open(file)
 96         im = im.resize((32, 32), Image.ANTIALIAS)
 97         im = np.array(im).astype(np.float32)
 98         # The storage order of the loaded image is W(widht),
 99         # H(height), C(channel). PaddlePaddle requires
100         # the CHW order, so transpose them.
101         im = im.transpose((2, 0, 1))  # CHW
102         # In the training phase, the channel order of CIFAR
103         # image is B(Blue), G(green), R(Red). But PIL open
104         # image in RGB mode. It must swap the channel order.
105         im = im[(2, 1, 0), :, :]  # BGR
106         im = im.flatten()
107         im = im / 255.0
108         return im
109 
110     test_data = []
111     cur_dir = os.path.dirname(os.path.realpath(__file__))
112     test_data.append((load_image(cur_dir + '/image/dog.png'), ))
113 
114     # users can remove the comments and change the model name
115     # with open('params_pass_50.tar', 'r') as f:
116     #    parameters = paddle.parameters.Parameters.from_tar(f)
117 
118     probs = paddle.infer(
119         output_layer=out, parameters=parameters, input=test_data)
120     lab = np.argsort(-probs)  # probs and lab are the results of one batch data
121     print "Label of image/dog.png is: %d" % lab[0][0]
122 
123 
124 if __name__ == '__main__':
125     main()

3. 結果輸出

 
 1 I1128 21:44:30.218085 14733 Util.cpp:166] commandline:  --use_gpu=True --trainer_count=7
 2 [INFO 2017-11-28 21:44:35,874 layers.py:2539] output for __conv_pool_0___conv: c = 20, h = 28, w = 28, size = 15680
 3 [INFO 2017-11-28 21:44:35,874 layers.py:2667] output for __conv_pool_0___pool: c = 20, h = 14, w = 14, size = 3920
 4 [INFO 2017-11-28 21:44:35,875 layers.py:2539] output for __conv_pool_1___conv: c = 50, h = 10, w = 10, size = 5000
 5 [INFO 2017-11-28 21:44:35,876 layers.py:2667] output for __conv_pool_1___pool: c = 50, h = 5, w = 5, size = 1250
 6 I1128 21:44:35.881502 14733 MultiGradientMachine.cpp:99] numLogicalDevices=1 numThreads=7 numDevices=8
 7 I1128 21:44:35.928449 14733 GradientMachine.cpp:85] Initing parameters..
 8 I1128 21:44:36.056259 14733 GradientMachine.cpp:92] Init parameters done.
 9 
10 Pass 0, Batch 0, Cost 2.302628, {'classification_error_evaluator': 0.9296875}
11 ................................................................................
12 ```
13 Pass 199, Batch 200, Cost 0.869726, {'classification_error_evaluator': 0.3671875}
14 ...................................................................................................
15 Pass 199, Batch 300, Cost 0.801396, {'classification_error_evaluator': 0.3046875}
16 ..........................................................................................I1128 23:21:39.443141 14733 MultiGradientMachine.cpp:99] numLogicalDevices=1 numThreads=7 numDevices=8
17 
18 Test with Pass 199, {'classification_error_evaluator': 0.5248000025749207}
19 Label of image/dog.png is: 9
 

  我開了7個線程,用了8個Tesla K80 GPU訓練,batch_size = 128,迭代次數200次,耗時1h37min,錯誤分類率為0.5248,這個結果,emm,不算很高,我們可以把它作為一個baseline,后面對其進行調優。

 


LeNet-5網絡結構

  Lenet-5網絡結構來源于Yan LeCun提出的,原文為《Gradient-based learning applied to document recognition》,論文里使用的是mnist手寫數字作為輸入數據(32 * 32)進行驗證。我們來看一下網絡結構。

  LeNet-5一共有8層: 1個輸入層+3個卷積層(C1、C3、C5)+2個下采樣層(S2、S4)+1個全連接層(F6)+1個輸出層,每層有多個feature map(自動提取的多組特征)。

  Input輸入層

 cifar10 數據集,每一張圖片尺寸:32 * 32

  C1 卷積層

  •  6個feature_map,卷積核大小 5 * 5 ,feature_map尺寸:28 * 28
  • 每個卷積神經元的參數數目:5 * 5 = 25個和一個bias參數
  • 連接數目:(5*5+1)* 6 *(28*28) = 122,304 
  • 參數共享:每個feature_map內共享參數,共(5*5+1)*6 = 156個參數

  S2 下采樣層(池化層)

  • 6個14*14的feature_map,pooling大小 2* 2
  • 每個單元與上一層的feature_map中的一個2*2的滑動窗口連接,不重疊,因此S2每個feature_map大小是C1中feature_map大小的1/4
  • 連接數:(2*2+1)*1*14*14*6 = 5880個
  • 參數共享:每個feature_map內共享參數,有2 * 6 = 12個訓練參數

  C3 卷積層

  這層略微復雜,S2神經元與C3是多對多的關系,比如最簡單方式:用S2的所有feature map與C3的所有feature map做全連接(也可以對S2抽樣幾個feature map出來與C3某個feature map連接),這種全連接方式下:6個S2的feature map使用6個獨立的5×5卷積核得到C3中1個feature map(生成每個feature map時對應一個bias),C3中共有16個feature map,所以該層需要學習的參數個數為:(5×5×6+1)×16=2416個,神經元連接數為:2416×8×8=154624個。

  S4 下采樣層

  同S2,如果采用Max Pooling/Mean Pooling,則該層需要學習的參數個數為0個,神經元連接數為:(2×2+1)×16×4×4=1280個。

  C5卷積層

  類似C3,用S4的所有feature map與C5的所有feature map做全連接,這種全連接方式下:16個S4的feature map使用16個獨立的1×1卷積核得到C5中1個feature map(生成每個feature map時對應一個bias),C5中共有120個feature map,所以該層需要學習的參數個數為:(1×1×16+1)×120=2040個,神經元連接數為:2040個。

  F6 全連接層

  將C5層展開得到4×4×120=1920個節點,并接一個全連接層,考慮bias,該層需要學習的參數和連接個數為:(1920+1)*84=161364個。

  輸出層

  該問題是個10分類問題,所以有10個輸出單元,通過softmax做概率歸一化,每個分類的輸出單元對應84個輸入。

 


 LeNet-5的PaddlePaddle實現

1. 網絡結構 lenet.py

 
 1 #coding:utf-8
 2 '''
 3 Created by huxiaoman 2017.11.27
 4 lenet.py:LeNet-5
 5 '''
 6 
 7 import os
 8 from PIL import Image
 9 import numpy as np
10 import paddle.v2 as paddle
11 from paddle.trainer_config_helpers import *
12 
13 with_gpu = os.getenv('WITH_GPU', '0') != '1'
14 
15 def lenet(img):
16     conv_pool_1 = paddle.networks.simple_img_conv_pool(
17         input=img,
18         filter_size=5,
19         num_filters=6,
20         num_channel=3,
21         pool_size=2,
22         pool_stride=2,
23         act=paddle.activation.Relu())
24     conv_pool_2 = paddle.networks.simple_img_conv_pool(
25         input=conv_pool_1,
26         filter_size=5,
27         num_filters=16,
28         pool_size=2,
29         pool_stride=2,
30         act=paddle.activation.Relu())
31     conv_3 = img_conv_layer(
32         input = conv_pool_2,
33         filter_size = 1,
34         num_filters = 120,
35         stride = 1)
36     fc = paddle.layer.fc(
37         input=conv_3, size=84, act=paddle.activation.Sigmoid())
38     return fc

 

2. 訓練代碼 train_lenet.py

 
  1 #coding:utf-8
  2 '''
  3 Created by huxiaoman 2017.11.27
  4 train_lenet.py:訓練LeNet-5對cifar10數據集進行分類
  5 '''
  6 
  7 import sys, os
  8 
  9 import paddle.v2 as paddle
 10 from lenet import lenet
 11 
 12 with_gpu = os.getenv('WITH_GPU', '0') != '1'
 13 
 14 
 15 def main():
 16     datadim = 3 * 32 * 32
 17     classdim = 10
 18 
 19     # PaddlePaddle init
 20     paddle.init(use_gpu=with_gpu, trainer_count=7)
 21 
 22     image = paddle.layer.data(
 23         name="image", type=paddle.data_type.dense_vector(datadim))
 24 
 25     # Add neural network config
 26     # option 1. resnet
 27     # net = resnet_cifar10(image, depth=32)
 28     # option 2. vgg
 29     net = lenet(image)
 30 
 31     out = paddle.layer.fc(
 32         input=net, size=classdim, act=paddle.activation.Softmax())
 33 
 34     lbl = paddle.layer.data(
 35         name="label", type=paddle.data_type.integer_value(classdim))
 36     cost = paddle.layer.classification_cost(input=out, label=lbl)
 37 
 38     # Create parameters
 39     parameters = paddle.parameters.create(cost)
 40 
 41     # Create optimizer
 42     momentum_optimizer = paddle.optimizer.Momentum(
 43         momentum=0.9,
 44         regularization=paddle.optimizer.L2Regularization(rate=0.0002 * 128),
 45         learning_rate=0.1 / 128.0,
 46         learning_rate_decay_a=0.1,
 47         learning_rate_decay_b=50000 * 100,
 48         learning_rate_schedule='discexp')
 49 
 50     # End batch and end pass event handler
 51     def event_handler(event):
 52         if isinstance(event, paddle.event.EndIteration):
 53             if event.batch_id % 100 == 0:
 54                 print "\nPass %d, Batch %d, Cost %f, %s" % (
 55                     event.pass_id, event.batch_id, event.cost, event.metrics)
 56             else:
 57                 sys.stdout.write('.')
 58                 sys.stdout.flush()
 59         if isinstance(event, paddle.event.EndPass):
 60             # save parameters
 61             with open('params_pass_%d.tar' % event.pass_id, 'w') as f:
 62                 parameters.to_tar(f)
 63 
 64             result = trainer.test(
 65                 reader=paddle.batch(
 66                     paddle.dataset.cifar.test10(), batch_size=128),
 67                 feeding={'image': 0,
 68                          'label': 1})
 69             print "\nTest with Pass %d, %s" % (event.pass_id, result.metrics)
 70 
 71     # Create trainer
 72     trainer = paddle.trainer.SGD(
 73         cost=cost, parameters=parameters, update_equation=momentum_optimizer)
 74 
 75     # Save the inference topology to protobuf.
 76     inference_topology = paddle.topology.Topology(layers=out)
 77     with open("inference_topology.pkl", 'wb') as f:
 78         inference_topology.serialize_for_inference(f)
 79 
 80     trainer.train(
 81         reader=paddle.batch(
 82             paddle.reader.shuffle(
 83                 paddle.dataset.cifar.train10(), buf_size=50000),
 84             batch_size=128),
 85         num_passes=200,
 86         event_handler=event_handler,
 87         feeding={'image': 0,
 88                  'label': 1})
 89 
 90     # inference
 91     from PIL import Image
 92     import numpy as np
 93     import os
 94 
 95     def load_image(file):
 96         im = Image.open(file)
 97         im = im.resize((32, 32), Image.ANTIALIAS)
 98         im = np.array(im).astype(np.float32)
 99         # The storage order of the loaded image is W(widht),
100         # H(height), C(channel). PaddlePaddle requires
101         # the CHW order, so transpose them.
102         im = im.transpose((2, 0, 1))  # CHW
103         # In the training phase, the channel order of CIFAR
104         # image is B(Blue), G(green), R(Red). But PIL open
105         # image in RGB mode. It must swap the channel order.
106         im = im[(2, 1, 0), :, :]  # BGR
107         im = im.flatten()
108         im = im / 255.0
109         return im
110 
111     test_data = []
112     cur_dir = os.path.dirname(os.path.realpath(__file__))
113     test_data.append((load_image(cur_dir + '/image/dog.png'), ))
114 
115     # users can remove the comments and change the model name
116     # with open('params_pass_50.tar', 'r') as f:
117     #    parameters = paddle.parameters.Parameters.from_tar(f)
118 
119     probs = paddle.infer(
120         output_layer=out, parameters=parameters, input=test_data)
121     lab = np.argsort(-probs)  # probs and lab are the results of one batch data
122     print "Label of image/dog.png is: %d" % lab[0][0]
123 
124 
125 if __name__ == '__main__':
126     main()

 

3. 結果輸出 

 
 1 I1129 14:52:44.314946 15153 Util.cpp:166] commandline:  --use_gpu=True --trainer_count=7
 2 [INFO 2017-11-29 14:52:50,490 layers.py:2539] output for __conv_pool_0___conv: c = 6, h = 28, w = 28, size = 4704
 3 [INFO 2017-11-29 14:52:50,491 layers.py:2667] output for __conv_pool_0___pool: c = 6, h = 14, w = 14, size = 1176
 4 [INFO 2017-11-29 14:52:50,491 layers.py:2539] output for __conv_pool_1___conv: c = 16, h = 10, w = 10, size = 1600
 5 [INFO 2017-11-29 14:52:50,492 layers.py:2667] output for __conv_pool_1___pool: c = 16, h = 5, w = 5, size = 400
 6 [INFO 2017-11-29 14:52:50,493 layers.py:2539] output for __conv_0__: c = 120, h = 5, w = 5, size = 3000
 7 I1129 14:52:50.498749 15153 MultiGradientMachine.cpp:99] numLogicalDevices=1 numThreads=7 numDevices=8
 8 I1129 14:52:50.545882 15153 GradientMachine.cpp:85] Initing parameters..
 9 I1129 14:52:50.651103 15153 GradientMachine.cpp:92] Init parameters done.
10 
11 Pass 0, Batch 0, Cost 2.331898, {'classification_error_evaluator': 0.9609375}
12 ```
13 ......
14 Pass 199, Batch 300, Cost 0.004373, {'classification_error_evaluator': 0.0}
15 ..........................................................................................I1129 16:17:08.678097 15153 MultiGradientMachine.cpp:99] numLogicalDevices=1 numThreads=7 numDevices=8
16 
17 Test with Pass 199, {'classification_error_evaluator': 0.39579999446868896}
18 Label of image/dog.png is: 7
 

   同樣是7個線程,8個Tesla K80 GPU,batch_size = 128,迭代次數200次,耗時1h25min,錯誤分類率為0.3957,相比與simple_cnn的0.5248提高了12.91%。當然,這個結果也并不是很好,如果輸出詳細的日志,可以看到在訓練的過程中loss先降后升,說明有一定程度的過擬合,對于如何防止過擬合,我們在后面會詳細講解。

 

  有一個可視化CNN的網站可以對mnist和cifar10分類的網絡結構進行可視化,這是cifar-10 BaseCNN的網絡結構:


 LeNet-5的Tensorflow實現

   tensorflow版本的LeNet-5版本的可以參照models/tutorials/image/cifar10/(https://github.com/tensorflow/models/tree/master/tutorials/image/cifar10)的步驟來訓練,不過這里面的代碼包含了很多數據處理、權重衰減以及正則化的一些方法防止過擬合。按照官方寫的,batch_size=128時在Tesla K40上迭代10w次需要4小時,準確率能達到86%。不過如果不對數據做處理,直接跑的話,效果應該沒有這么好。不過可以仔細借鑒cifar10_inputs.py里的distorted_inouts函數對數據預處理增大數據集的思想,以及cifar10.py里對于權重和偏置的衰減設置等。目前迭代到1w次左右,cost是0.98,acc是78.4%

  對于未進行數據處理的cifar10我準備也跑一次,看看效果如何,與paddle的結果對比一下。不過得等到周末再補上了 = =

 


總結

  本節用常規的cifar-10數據集做圖像分類,用了三種實現方式,第一種是自己設計的一個簡單的cnn,第二種是LeNet-5,第三種是Tensorflow實現的LeNet-5,對比速度可以見一下表格:

 

   可以看到LeNet-5相比于原始的simple_cnn在準確率和速度方面都有一定的的提升,等tensorflow版本跑完后可以把結果加上去再對比一下。不過用Lenet-5網絡結構后,結果雖然有一定的提升,但是還是不夠理想,在日志里看到loss的信息基本可以推斷出是過擬合,對于神經網絡訓練過程中出現的過擬合情況我們應該如何避免,下期我們講著重講解。此外在下一節將介紹AlexNet,并對分類做一個實驗,對比其效果。

 

參考文獻

1.LeNet-5論文:《Gradient-based learning applied to document recognition

2.可視化CNN:http://shixialiu.com/publications/cnnvis/demo/

責任編輯:張燕妮 來源: www.cnblogs.com
相關推薦

2018-04-16 11:30:32

深度學習

2018-04-17 09:40:22

深度學習

2018-04-11 09:30:41

深度學習

2018-03-26 20:14:32

深度學習

2017-08-10 15:31:57

Apache Spar TensorFlow

2018-04-18 09:39:07

深度學習

2022-06-29 09:00:00

前端圖像分類模型SQL

2018-04-04 10:19:32

深度學習

2018-04-02 10:45:11

深度學習PaddlePaddl手寫數字識別

2018-03-26 20:07:25

深度學習

2018-03-26 20:49:08

圖像分類

2017-05-22 13:15:45

TensorFlow深度學習

2018-03-26 21:31:30

深度學習

2018-03-26 21:26:50

深度學習

2023-05-14 22:35:24

TensorFlowKeras深度學習

2017-05-12 16:25:44

深度學習圖像補全tensorflow

2018-03-26 20:00:32

深度學習

2017-12-01 15:24:04

TensorFlow深度學習教程

2022-10-30 15:00:40

小樣本學習數據集機器學習

2022-12-30 08:00:00

深度學習集成模型
點贊
收藏

51CTO技術棧公眾號

亚洲免费成人网| 色噜噜久久综合伊人一本| 91高清在线免费观看| 中文字幕欧美人妻精品一区| 国产欧美综合视频 | 亚洲国产日韩a在线播放性色| 97碰在线观看| av地址在线观看| 欧美日韩xx| 精品九九在线| 国产成人精品一区二区三区四区| 亚洲香蕉在线观看| 欧美三级一级片| 精品人妻一区二区三区四区不卡 | 精品一区二区精品| 一区二区三区回区在观看免费视频| 无罩大乳的熟妇正在播放| 亚洲国产精品久久久久久6q| 久久久久久久久久久久久久久久久久 | 国产网红女主播精品视频| 久久精品国产亚洲高清剧情介绍| 亚洲无线码在线一区观看| 亚洲综合在线一区二区| а√天堂官网中文在线| 国产一区二区三区免费看| 精品国产自在精品国产浪潮| 一本岛在线视频| 91免费在线| 精品在线免费视频| 欧美乱大交做爰xxxⅹ性3| 国产高清999| 久久久成人av毛片免费观看| 国产欧美中文在线| 国产日韩av在线播放| 成人信息集中地| 久久wwww| 亚洲一区在线播放| 精品欧美一区二区精品久久| 久久久久久免费观看| 激情小说亚洲色图| 色婷婷综合久久久中文字幕| 欧美一区二区三区在线免费观看 | 国产精品v一区二区三区| 日韩精品一区二区三区在线| 一二三四视频社区在线| 青青操在线视频| 香蕉久久久久久久av网站| 亚洲男人第一av网站| 超碰av在线免费观看| 国产福利在线播放麻豆| 国产精品网站在线观看| 91精品天堂| 国产一级片播放| 中文字幕精品影院| 欧美久久久久久蜜桃| 黄色三级中文字幕| 欧美捆绑视频| 国产在线一区二区综合免费视频| 国产精品久久婷婷六月丁香| 欧美激情图片小说| 久久免费视频66| 亚洲国产成人一区| 欧美成人三级在线播放| √天堂8资源中文在线| 欧美经典一区二区| 亚洲永久激情精品| www精品国产| 懂色av中文字幕一区二区三区| 欧美综合第一页| av激情在线观看| 女人香蕉久久**毛片精品| 亚洲欧美第一页| 黄色片网站免费| 第四色中文综合网| 欧美日韩国产免费一区二区| 国产在线播放观看| 嫩草在线视频| 亚洲精品中文字幕在线观看| 欧洲精品久久| 久草中文在线观看| 国产精品视频一二| 97神马电影| 人妻91麻豆一区二区三区| 极品尤物av久久免费看| 91一区二区三区| 天堂中文在线视频| 粉嫩av一区二区三区粉嫩| 国语精品免费视频| av电影在线观看| 一区二区三区欧美久久| 久久99精品久久久久久久青青日本 | 三大队在线观看| 色先锋久久影院av| 欧美大片在线观看一区二区| 91av在线免费| 久久丝袜视频| 色综合亚洲精品激情狠狠| 国产亚洲精品久久久久久打不开| 欧美亚洲一区| 51国产成人精品午夜福中文下载 | 欧美激情图片区| 黄色精品视频在线观看| 欧美日韩一区二区三区视频播放| 深夜福利一区二区| 日本一级片免费看| 在线综合亚洲| 青草热久免费精品视频| 国产免费高清视频| 久久久99精品久久| 品久久久久久久久久96高清| 最新国产在线拍揄自揄视频| 亚洲色图视频网站| 色乱码一区二区三区熟女| 一区二区三区视频在线观看视频| 国产午夜亚洲精品羞羞网站| 欧美日韩在线不卡一区| 欧美zozo| 亚洲无人区一区| 97人人爽人人| 日韩激情综合| 亚洲аv电影天堂网| 久久一区二区电影| 啄木系列成人av电影| 欧美成人免费一级人片100| 国产va在线播放| 欧美午夜电影在线观看| 午夜精品三级视频福利| 国产又粗又黄又爽的视频| 狠狠色狠狠色综合| 日韩中文一区| 成人video亚洲精品| 欧美亚洲愉拍一区二区| 91亚洲免费视频| 自拍偷拍精品| 欧美在线不卡区| 日韩不卡高清视频| 国内一区二区视频| 午夜精品一区二区三区四区| 免费av网站在线观看| 色婷婷亚洲婷婷| 在线免费观看麻豆| 国产精品99在线观看| 欧美成人精品在线观看| 一级黄色片在线观看| 国产精品美女久久久久久久网站| 国产成人精品无码播放| 99tv成人影院| 亚洲国产精品网站| 成人精品一二三区| 青青青伊人色综合久久| 99国产高清| 精品乱码一区二区三四区视频| 国产精品乱人伦| 日韩欧美国产片| 久久在线免费| 668精品在线视频| 亚洲av成人精品毛片| 国产精品伦理在线| 久久久久久久久久一区| 亚洲九九视频| 国产99视频精品免视看7| 99久久精品免费看国产交换| 亚洲人123区| 岛国av免费观看| 欧美大片aaaa| 亚洲一区中文字幕在线观看| 欧美日韩激情视频一区二区三区| 色婷婷久久久久swag精品| 波多野吉衣中文字幕| 91精品国产乱码久久久久久| 3d动漫啪啪精品一区二区免费| 大黄网站在线观看| 日韩精品视频在线观看网址 | 国产精品白浆| 欧洲成人在线观看| 日本在线看片免费人成视1000| 日韩一区二区三区四区五区六区 | 美女毛片一区二区三区四区| 欧美精品免费在线观看| 天天操天天干天天爱| 日韩美女视频一区| 日本美女高潮视频| 亚洲成人免费| 久久久久久九九| 亚洲一区导航| 91国产精品电影| 日韩伦理在线电影| 亚洲成年人在线| 中文字幕自拍偷拍| 久久久久久97三级| 免费成人黄色大片| 国产精品尤物| 久久精品成人一区二区三区蜜臀| 日韩网站中文字幕| 亚洲免费一在线| 国产丝袜在线视频| 日本韩国视频一区二区| 不卡一区二区在线观看| 亚洲久久一区二区| 国产综合18久久久久久| 99爱在线观看| 色爱精品视频一区| 五月婷婷六月色| 欧美一区二区三级| 久久国产精品国语对白| 国产中文字幕一区| www.玖玖玖| 韩国亚洲精品| 小说区视频区图片区| 久操成人av| 国产一区二区高清不卡| 国产剧情一区二区在线观看| 久久躁狠狠躁夜夜爽| 国产av无码专区亚洲av| 亚洲精品久久久蜜桃| 蜜臀久久99精品久久久久久| jlzzjlzz亚洲日本少妇| 国产老熟妇精品观看| 欧美在线视屏| 小说区视频区图片区| 成人av资源电影网站| 成人免费视频97| www国产在线观看| 正在播放国产一区| 国产三级小视频| 欧美调教femdomvk| 国产免费av一区| 中文字幕欧美日韩一区| 在线观看国产免费视频| 成人午夜激情视频| 92看片淫黄大片一级| 精品美女久久| 欧美伦理一区二区| 亚洲第一论坛sis| 精品一区在线播放| 久久资源综合| 国产一区二区三区免费不卡| 国产成人澳门| 国产精品三区www17con| 欧美在线极品| 中文字幕亚洲激情| 国产免费a∨片在线观看不卡| 欧美日韩精品一区二区天天拍小说 | 一本一道波多野结衣一区二区| 久久精品欧美一区二区| 亚欧色一区w666天堂| 国产人妻大战黑人20p| 99re免费视频精品全部| jizz大全欧美jizzcom| 视频一区欧美日韩| 成人一区二区av| 中文字幕精品影院| 欧美资源一区| 欧美电影《轻佻寡妇》| 欧美性视频在线播放| 亚洲精品电影| 日韩在线观看a| 亚洲啪啪91| www.浪潮av.com| 水野朝阳av一区二区三区| 亚洲精品视频导航| 久久99精品国产麻豆婷婷| 肉色超薄丝袜脚交| 成人在线综合网| 欧美狂猛xxxxx乱大交3| 中文字幕不卡在线观看| 日韩三级在线观看视频| 亚洲精品视频在线看| 国产精品美女毛片真酒店| 中文字幕一区三区| www.久久国产| 亚洲国产精品传媒在线观看| 黄色录像一级片| 亚洲在线中文字幕| 久草视频一区二区| 亚洲一区中文在线| 国产无遮挡呻吟娇喘视频| 欧美主播一区二区三区| 午夜婷婷在线观看| 欧美日韩亚洲不卡| 国产一级淫片a视频免费观看| 在线观看亚洲专区| 精品乱子伦一区二区| 日韩精品在线影院| 日本精品久久久久久| 亚洲三级av在线| 青青久在线视频免费观看| 中文字幕欧美精品日韩中文字幕| av在线网址观看| 日韩av电影手机在线观看| 疯狂欧洲av久久成人av电影| 精品一区二区三区国产| 91综合久久一区二区| 黄色大片中文字幕| 寂寞少妇一区二区三区| 成人精品在线观看视频| 亚洲精品少妇30p| 精品成人无码久久久久久| 日韩欧美精品在线观看| 国产污污视频在线观看 | www.亚洲免费av| 综合 欧美 亚洲日本| 国产欧美日韩在线观看| 黄色一级片在线| 亚洲一区在线电影| 中文字幕777| 亚洲第一区第二区| 黄网页在线观看| 国产成人免费av电影| 电影天堂国产精品| 国产精品theporn88| 鲁大师精品99久久久| 中文字幕色一区二区| 2023国产精品久久久精品双| 欧美成人xxxxx| 成人性色生活片免费看爆迷你毛片| 国产在线综合视频| 狠狠爱在线视频一区| 国产精品视频123| 精品盗摄一区二区三区| 国产欧美黑人| 国产伦精品一区二区三区精品视频| 久久天堂影院| 成人精品视频99在线观看免费 | 久草精品视频在线观看| 日韩一本二本av| 超碰在线观看免费| 91精品国产综合久久久久久久久| 国产一区二区在线| 在线观看欧美亚洲| 日本欧美一区二区| 欧美性猛交xxxx乱| 欧美视频在线免费| 男人的天堂在线视频| 1769国内精品视频在线播放| 久久久免费毛片| 久久久亚洲精品无码| 成人毛片老司机大片| 国产一级片网址| 精品久久久久久久久久久久久久久久久| 欧美一区二不卡视频| 久久久久久久久久亚洲| 高潮按摩久久久久久av免费| 四虎免费在线观看视频| 国内成+人亚洲+欧美+综合在线| 亚洲女人久久久| 日韩一区二区三区在线视频| 手机在线免费看av| 国产精品电影一区| 精品一区二区三区中文字幕在线 | 久久精品国产77777蜜臀| 精品一区二区在线观看视频| 欧美精选午夜久久久乱码6080| 黄色一级片在线观看| 3d动漫啪啪精品一区二区免费 | 国产xxxxx视频| 国产色产综合产在线视频| 国产精品高清无码| 日韩一区二区精品在线观看| 在线欧美三级| 国产一区二区不卡视频| 久久性色av| 5566中文字幕| 日韩欧美国产成人一区二区| 操喷在线视频| 三级三级久久三级久久18| 精品制服美女久久| 日本天堂在线视频| 亚洲欧美日韩高清| 性欧美video另类hd尤物| 久久超碰亚洲| 爽爽淫人综合网网站| 一级免费黄色录像| 欧美成人女星排名| 亚洲欧洲高清| 精品国产91亚洲一区二区三区www 精品国产_亚洲人成在线 | 91精品国产高潮对白| 亚洲欧美国产一区二区三区| 99久久久国产精品免费调教网站| 国产精品一区二区三区免费| 性欧美videos另类喷潮| 香蕉久久久久久久| 欧美成人精品二区三区99精品| 亚洲十八**毛片| 国产又大又长又粗又黄| 99国产精品久| 国产精品一区二区av白丝下载| 精品亚洲一区二区| 日韩黄色碟片| 国产免费黄色av| 亚洲美女免费视频| 黄色在线观看网| 成人羞羞视频免费| 日韩国产在线观看| 先锋影音av在线| 欧美大片在线观看| 欧美videos粗暴| 免费在线激情视频| 亚洲另类一区二区| 国产精品99999|