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

深度學習/計算機視覺常見的8個錯誤總結及避坑指南

新聞 深度學習
人類并不是完美的,我們經常在編寫軟件的時候犯錯誤。有時這些錯誤很容易找到:你的代碼根本不工作,你的應用程序會崩潰。但有些 bug 是隱藏的,很難發(fā)現(xiàn),這使它們更加危險。

 本文轉自雷鋒網,如需轉載請至雷鋒網官網申請授權。

人類并不是完美的,我們經常在編寫軟件的時候犯錯誤。有時這些錯誤很容易找到:你的代碼根本不工作,你的應用程序會崩潰。但有些 bug 是隱藏的,很難發(fā)現(xiàn),這使它們更加危險。

在處理深度學習問題時,由于某些不確定性,很容易產生此類錯誤:很容易看到 web 應用的端點路由請求是否正確,但卻不容易檢查梯度下降步驟是否正確。然而,在深度學習實踐例程中有很多 bug 是可以避免的。

我想和大家分享一下我在過去兩年的計算機視覺工作中所發(fā)現(xiàn)或產生的錯誤的一些經驗。我在會議上談到過這個話題,很多人在會后告訴我:「是的,老兄,我也有很多這樣的 bug?!刮蚁M业奈恼履軒椭惚苊馄渲械囊恍﹩栴}。

1.翻轉圖像和關鍵點

假設有人在研究關鍵點檢測問題。它們的數據看起來像一對圖像和一系列關鍵點元組,例如 [(0,1),(2,2)],其中每個關鍵點是一對 x 和 y 坐標。

讓我們對這些數據編進行基本的增強:

  1. def flip_img_and_keypoints(img: np.ndarray, kpts:  
  2.  
  3. Sequence[Sequence[int]]):  
  4.  
  5.         img = np.fliplr(img)  
  6.  
  7.         h, w, *_ = img.shape  
  8.  
  9.         kpts = [(y, w - x) for y, x in kpts]  
  10.  
  11.         return img, kpts 

上面的代碼看起來很對,是不是?接下來,讓我們對它進行可視化。

  1. image = np.ones((1010), dtype=np.float32)  
  2.  
  3. kpts = [(01), (22)]  
  4.  
  5. image_flipped, kpts_flipped = flip_img_and_keypoints(image, kpts)  
  6.  
  7. img1 = image.copy()  
  8.  
  9. for y, x in kpts:  
  10.  
  11.         img1[y, x] = 0  
  12.  
  13. img2 = image_flipped.copy()  
  14.  
  15. for y, x in kpts_flipped:  
  16.  
  17.         img2[y, x] = 0  
  18.  
  19. _ = plt.imshow(np.hstack((img1, img2))) 

這個圖是不對稱的,看起來很奇怪!如果我們檢查極值呢?

  1. image = np.ones((1010), dtype=np.float32)  
  2.  
  3. kpts = [(00), (11)]  
  4.  
  5. image_flipped, kpts_flipped = flip_img_and_keypoints(image, kpts)  
  6.  
  7. img1 = image.copy()  
  8.  
  9. for y, x in kpts:  
  10.  
  11.        img1[y, x] = 0  
  12.  
  13. img2 = image_flipped.copy()  
  14.  
  15. for y, x in kpts_flipped: 
  16.  
  17.        img2[y, x] = 0  
  18.  
  19. -------------------------------------------------------------------- -------  
  20.  
  21. IndexError  
  22.  
  23. Traceback (most recent call last)  
  24.  
  25. <ipython-input-5-997162463eae> in <module>  
  26.  
  27. 8 img2 = image_flipped.copy()  
  28.  
  29. 9 for y, x in kpts_flipped: 
  30.  
  31. ---> 10 img2[y, x] = 0  
  32.  
  33. IndexError: index 10 is out of bounds for axis 1 with size 10 

不好!這是一個典型的錯誤。正確的代碼如下:

  1. def flip_img_and_keypoints(img: np.ndarray, kpts: Sequence[Sequence[int]]):  
  2.  
  3.        img = np.fliplr(img)  
  4.  
  5.        h, w, *_ = img.shape  
  6.  
  7.        kpts = [(y, w - x - 1for y, x in kpts]  
  8.  
  9.        return img, kpts 

我們已經通過可視化檢測到這個問題,但是,使用 x=0 點的單元測試也會有幫助。一個有趣的事實是:我們團隊三個人(包括我自己)各自獨立地犯了幾乎相同的錯誤。

2.繼續(xù)談談關鍵點

即使上述函數已修復,也存在危險。接下來更多的是關于語義,而不僅僅是一段代碼。

假設一個人需要用兩只手掌來增強圖像??雌饋砗馨踩?mdash;—手在左右翻轉后會還是手。

但是等等!我們對關鍵點語義一無所知。如果關鍵點真的是這樣的意思呢:

  1. kpts = [  
  2.  
  3. (2020), # left pinky  
  4.  
  5. (20200), # right pinky 
  6.  
  7. ... 
  8.  

這意味著增強實際上改變了語義:left 變?yōu)?right,right 變?yōu)?left,但是我們不交換數組中的 keypoints 索引。它會給訓練帶來巨大的噪音和更糟糕的指標。

這里應該吸取教訓:

  • 在應用增強或其他特性之前,了解并考慮數據結構和語義;

  • 保持你的實驗的獨立性:添加一個小的變化(例如,一個新的轉換),檢查它是如何進行的,如果分數提高了再合并。

3.自定義損失函數

熟悉語義分割問題的人可能知道 IoU (intersection over union)度量。不幸的是,我們不能直接用 SGD 來優(yōu)化它,所以一個常見的技巧是用可微損失函數來逼近它。讓我們編寫相關代碼!

  1. def iou_continuous_loss(y_pred, y_true):  
  2.  
  3.         eps = 1e-6  
  4.  
  5.        def _sum(x):  
  6.  
  7.               return x.sum(-1).sum(-1)  
  8.  
  9.        numerator = (_sum(y_true * y_pred) + eps)  
  10.  
  11.        denominator = (_sum(y_true ** 2) + _sum(y_pred ** 2) -  
  12.  
  13.               _sum(y_true * y_pred) + eps)  
  14.  
  15.        return (numerator / denominator).mean() 

看起來很不錯,讓我們做一個小小的檢查:

  1. In [3]: ones = np.ones((131010))  
  2.  
  3.        ...: x1 = iou_continuous_loss(ones * 0.01, ones)  
  4.  
  5.        ...: x2 = iou_continuous_loss(ones * 0.99, ones)  
  6.  
  7. In [4]: x1, x2  
  8.  
  9. Out[4]: (0.0100999998979901030.9998990001020204

在 x1 中,我們計算了與標準答案完全不同的損失,x2 是非常接近標準答案的函數的結果。我們預計 x1 會很大,因為預測結果并不好,x2 應該接近于零。這其中發(fā)生了什么?

上面的函數是度量的一個很好的近似。度量不是損失:它通常越高越好。因為我們要用 SGD 把損失降到最低,我們真的應該采用用相反的方法: 

  1. v> def iou_continuous(y_pred, y_true):  
  2.  
  3.         eps = 1e-6  
  4.  
  5.        def _sum(x):  
  6.  
  7.               return x.sum(-1).sum(-1)  
  8.  
  9.        numerator = (_sum(y_true * y_pred) + eps)  
  10.  
  11.        denominator = (_sum(y_true ** 2) + _sum(y_pred ** 2)  
  12.  
  13.                                    - _sum(y_true * y_pred) + eps)  
  14.  
  15.        return (numerator / denominator).mean()  
  16.  
  17. def iou_continuous_loss(y_pred, y_true):  
  18.  
  19.        return 1 - iou_continuous(y_pred, y_true) 

這些問題可以通過兩種方式確定:

  • 編寫一個單元測試來檢查損失的方向:形式化地表示一個期望,即更接近實際的東西應該輸出更低的損失;

  • 做一個全面的檢查,嘗試過擬合你的模型的 batch。

4.使用 Pytorch

假設一個人有一個預先訓練好的模型,并且是一個時序模型。我們基于 ceevee api 編寫預測類。

  1. from ceevee.base import AbstractPredictor  
  2.  
  3. class MySuperPredictor(AbstractPredictor):  
  4.  
  5.         def __init__(self, weights_path: str, ):  
  6.  
  7.               super().__init__()  
  8.  
  9.               self.model = self._load_model(weights_path=weights_path) 
  10.  
  11.        def process(self, x, *kw):  
  12.  
  13.               with torch.no_grad():  
  14.  
  15.                      res = self.model(x)  
  16.  
  17.               return res  
  18.  
  19.        @staticmethod  
  20.  
  21.        def _load_model(weights_path):  
  22.  
  23.               model = ModelClass()  
  24.  
  25.               weights = torch.load(weights_path, map_location='cpu')  
  26.  
  27.               model.load_state_dict(weights)  
  28.  
  29.               return model 

這個密碼正確嗎?也許吧!對某些模型來說確實是正確的。例如,當模型沒有規(guī)范層時,例如 torch.nn.BatchNorm2d;或者當模型需要為每個圖像使用實際的 norm 統(tǒng)計信息時(例如,許多基于 pix2pix 的架構需要它)。

但是對于大多數計算機視覺應用程序來說,代碼遺漏了一些重要的東西:切換到評估模式。

如果試圖將動態(tài) pytorch 圖轉換為靜態(tài) pytorch 圖,則很容易識別此問題。有一個 torch.jit 模塊是用于這種轉換的。

一個簡單的修復:

  1. In [4]: model = nn.Sequential(  
  2.  
  3.         ...: nn.Linear(1010),  
  4.  
  5.        ..: nn.Dropout(.5)  
  6.  
  7.        ...: ) 
  8.  
  9.        ...: 
  10.  
  11.         ...: traced_model = torch.jit.trace(model.eval(), torch.rand(10))  
  12.  
  13.        # No more warnings! 

此時,torch.jit.trace 多次運行模型并比較結果。這里看起來似乎沒有區(qū)別。

然而,這里的 torch.jit.trace 不是萬能的。這是一種應該知道并記住的細微差別。

5.復制粘貼問題

很多東西都是成對存在的:訓練和驗證、寬度和高度、緯度和經度……如果仔細閱讀,你可以很容易地發(fā)現(xiàn)由一對成員之間的復制粘貼引起的錯誤:

  1. v> def make_dataloaders(train_cfg, val_cfg, batch_size):  
  2.  
  3.        train = Dataset.from_config(train_cfg)  
  4.  
  5.        val = Dataset.from_config(val_cfg)  
  6.  
  7.        shared_params = {'batch_size': batch_size, 'shuffle': True,  
  8.  
  9. 'num_workers': cpu_count()}  
  10.  
  11.        train = DataLoader(train, **shared_params)  
  12.  
  13.        val = DataLoader(train, **shared_params)  
  14.  
  15.        return train, val 

不僅僅是我犯了愚蠢的錯誤。在流行庫中也有類似的錯誤。 

  1.  
  2. https://github.com/albu/albumentations/blob/0.3.0/albumentations/aug mentations/transforms.py  
  3.  
  4. def apply_to_keypoint(self, keypoint, crop_height=0, crop_width=0, h_start=0, w_start=  0, rows=0, cols=0, **params):  
  5.  
  6.         keypoint = F.keypoint_random_crop(keypoint, crop_height, crop_width, h_start, w_start, rows, cols)  
  7.  
  8.         scale_x = self.width / crop_height 
  9.  
  10.         scale_y = self.height / crop_height  
  11.  
  12.         keypoint = F.keypoint_scale(keypoint, scale_x, scale_y) return keypoint 

別擔心,這個錯誤已經修復了。如何避免?不要復制粘貼代碼,盡量以不要以復制粘貼的方式進行編碼。

  1. datasets = []  
  2.  
  3. data_a = get_dataset(MyDataset(config['dataset_a']), config['shared_param'], param_a) datasets.append(data_a)  
  4.  
  5. data_b = get_dataset(MyDataset(config['dataset_b']), config['shared_param'], param_b) datasets.append(data_b) 
  6.  
  7. datasets = []  
  8.  
  9. for name, param in zip(('dataset_a''dataset_b'), (param_a, param_b), ):  
  10.  
  11.         datasets.append(get_dataset(MyDataset(config[name]), config['shared_param'], param)) 

6.合適的數據類型

讓我們再做一個增強:

  1. def add_noise(img: np.ndarray) -> np.ndarray:  
  2.  
  3.         mask = np.random.rand(*img.shape) + .5  
  4.  
  5.         img = img.astype('float32') * mask  
  6.  
  7.         return img.astype('uint8'

圖像已經改變了。這是我們期望的嗎?嗯,也許改變太多了。

這里有一個危險的操作:將 float32 轉到 uint8。這可能導致溢出:

  1. def add_noise(img: np.ndarray) -> np.ndarray:  
  2.  
  3.         mask = np.random.rand(*img.shape) + .5  
  4.  
  5.        img = img.astype('float32') * mask  
  6.  
  7.        return np.clip(img, 0255).astype('uint8')  
  8.  
  9. img = add_noise(cv2.imread('two_hands.jpg')[:, :, ::-1]) _ = plt.imshow(img) 

看起來好多了,是吧?

順便說一句,還有一個方法可以避免這個問題:不要重新發(fā)明輪子,可以在前人的基礎上,修改代碼。例如:albumentations.augmentations.transforms.GaussNoise 。

我又產生了同樣來源的 bug。

這里出了什么問題?首先,使用三次插值調整 mask 的大小是個壞主意。將 float32 轉換為 uint8 也存在同樣的問題:三次插值可以輸出大于輸入的值,并導致溢出。

我發(fā)現(xiàn)了這個問題。在你的循環(huán)里面有斷言也是一個好主意。

7.打字錯誤

假設需要對全卷積網絡(如語義分割問題)和一幅巨大的圖像進行處理。圖像太大了,你沒有機會把它放進你的 gpu 中——例如,它可以是一個醫(yī)學或衛(wèi)星圖像。

在這種情況下,可以將圖像分割成一個網格,獨立地對每一塊進行推理,最后合并。另外,一些預測交集可以用來平滑邊界附近的偽影。

我們來編碼吧!

  1. from tqdm import tqdm  
  2.  
  3. class GridPredictor:  
  4.  
  5. """ This class can be used to predict a segmentation mask for the big image when you have GPU memory limitation """  
  6.  
  7.         def __init__(self, predictor: AbstractPredictor, size: int, stride: Optional[int] = None):               self.predictor = predictor  
  8.  
  9.               self.size = size  
  10.  
  11.               self.stride = stride if stride is not None else size // 2  
  12.  
  13.        def __call__(self, x: np.ndarray):  
  14.  
  15.               h, w, _ = x.shape  
  16.  
  17.               mask = np.zeros((h, w, 1), dtype='float32')  
  18.  
  19.               weights = mask.copy()  
  20.  
  21.               for i in tqdm(range(0, h - 1, self.stride)):  
  22.  
  23.                      for j in range(0, w - 1, self.stride):  
  24.  
  25.                             a, b, c, d = i, min(h, i + self.size), j, min(w, j + self.size)  
  26.  
  27.                             patch = x[a:b, c:d, :]  
  28.  
  29.                             mask[a:b, c:d, :] += np.expand_dims(self.predictor(patch), -1) weights[a:b, c:d, :] = 1  
  30.  
  31.               return mask / weights 

有一個符號輸入錯誤,代碼片段足夠大,因此可以很容易地找到它。我懷疑僅僅通過代碼就可以快速識別它,很容易檢查代碼是否正確:

  1. class Model(nn.Module):  
  2.  
  3.         def forward(self, x):  
  4.  
  5.               return x.mean(axis=-1)  
  6.  
  7. model = Model()  
  8.  
  9. grid_predictor = GridPredictor(model, size=128, stride=64)  
  10.  
  11. simple_pred = np.expand_dims(model(img), -1)  
  12.  
  13. grid_pred = grid_predictor(img)  
  14.  
  15. np.testing.assert_allclose(simple_pred, grid_pred, atol=.001

調用方法的正確版本如下:

  1. def __call__(self, x: np.ndarray):  
  2.  
  3.        h, w, _ = x.shape  
  4.  
  5.        mask = np.zeros((h, w, 1), dtype='float32')  
  6.  
  7.        weights = mask.copy()  
  8.  
  9.        for i in tqdm(range(0, h - 1, self.stride)):  
  10.  
  11.               for j in range(0, w - 1, self.stride): a, b, c, d = i, min(h, i + self.size), j, min(w, j + self.size)  
  12.  
  13.                      patch = x[a:b, c:d, :]  
  14.  
  15.                      mask[a:b, c:d, :] += np.expand_dims(self.predictor(patch), -1)  
  16.  
  17.                      weights[a:b, c:d, :] += 1  
  18.  
  19.        return mask / weights 

如果你仍然沒有看出問題所在,請注意線寬 [a:b,c:d,:]+=1。

8.ImageNet 規(guī)范化

當一個人需要進行遷移學習時,通常最好像訓練 ImageNet 時那樣對圖像進行標準化。

讓我們使用我們已經熟悉的 albumentations 庫。

  1. from albumentations import Normalize  
  2.  
  3. norm = Normalize()  
  4.  
  5. img = cv2.imread('img_small.jpg')  
  6.  
  7. mask = cv2.imread('mask_small.png', cv2.IMREAD_GRAYSCALE)  
  8.  
  9. mask = np.expand_dims(mask, -1) # shape (6464) -> shape (64641
  10.  
  11. normed = norm(image=img, mask=mask)  
  12.  
  13. img, mask = [normed[x] for x in ['image''mask']]  
  14.  
  15. def img_to_batch(x):  
  16.  
  17.         x = np.transpose(x, (201)).astype('float32'
  18.  
  19.        return torch.from_numpy(np.expand_dims(x, 0))  
  20.  
  21. img, mask = map(img_to_batch, (img, mask))  
  22.  
  23. criterion = F.binary_cross_entropy 

現(xiàn)在是時候訓練一個網絡并使其過擬合某一張圖像了——正如我所提到的,這是一種很好的調試技術:

  1. model_a = UNet(31)  
  2.  
  3. optimizer = torch.optim.Adam(model_a.parameters(), lr=1e-3)  
  4.  
  5. losses = []  
  6.  
  7. for t in tqdm(range(20)):  
  8.  
  9.         loss = criterion(model_a(img), mask)  
  10.  
  11.        losses.append(loss.item())  
  12.  
  13.        optimizer.zero_grad()  
  14.  
  15.        loss.backward()  
  16.  
  17.        optimizer.step()  
  18.  
  19. _ = plt.plot(losses) 

曲率看起來很好,但交叉熵的損失值預計不會是 -300。這是怎么了?

圖像的標準化效果很好,需要手動將其縮放到 [0,1]。

  1. model_b = UNet(31)  
  2.  
  3. optimizer = torch.optim.Adam(model_b.parameters(), lr=1e-3)  
  4.  
  5. losses = []  
  6.  
  7. for t in tqdm(range(20)):  
  8.  
  9.         loss = criterion(model_b(img), mask / 255.)  
  10.  
  11.        losses.append(loss.item())  
  12.  
  13.        optimizer.zero_grad()  
  14.  
  15.        loss.backward()  
  16.  
  17.        optimizer.step()  
  18.  
  19. _ = plt.plot(losses) 

訓練循環(huán)中一個簡單的斷言(例如 assert mask.max()<=1)會很快檢測到問題。同樣,單元測試也可以檢測到問題。

總而言之:

  • 測試很重要;

  • 運行斷言可以用于訓練管道;

  • 可視化是一種不錯的手段;

  • 抄襲是一種詛咒;

  • 沒有什么是靈丹妙藥,機器學習工程師必須時刻小心。 

 

責任編輯:張燕妮 來源: 雷鋒網
相關推薦

2019-12-11 13:24:57

深度學習數據結構軟件

2023-11-01 15:32:58

2024-04-03 12:30:00

C++開發(fā)

2023-03-28 15:21:54

深度學習計算機視覺

2023-11-20 22:14:16

計算機視覺人工智能

2020-12-16 19:28:07

深度學習計算機視覺Python庫

2020-12-15 15:40:18

深度學習Python人工智能

2022-01-23 14:29:25

C語言編程語言

2025-09-28 07:23:46

2017-11-30 12:53:21

深度學習原理視覺

2020-10-15 14:33:07

機器學習人工智能計算機

2018-01-20 20:46:33

2020-04-26 17:20:53

深度學習人工智能計算機視覺

2021-03-29 11:52:08

人工智能深度學習

2024-12-31 15:52:43

2025-03-26 02:00:00

API工具開發(fā)

2020-06-12 11:03:22

Python開發(fā)工具

2020-09-13 09:19:10

LinuxPython3.6

2024-03-28 12:51:00

Spring異步多線程

2021-07-15 08:00:00

人工智能深度學習技術
點贊
收藏

51CTO技術棧公眾號

欧美va久久久噜噜噜久久| 老色鬼在线视频| 成人网ww555视频免费看| 99re成人在线| 国产z一区二区三区| 国产精久久一区二区三区| 国产成人精品一区二三区在线观看| 欧美激情自拍偷拍| 欧美美女15p| 久久久久久久人妻无码中文字幕爆| av免费不卡| 国产日韩三级在线| 91久久国产精品| av2014天堂网| 成人av色网站| 亚洲一卡二卡三卡四卡| 欧美高清视频一区| 国产精品午夜福利| 亚洲手机视频| 欧美一区二区在线看| 欧美国产视频一区| 麻豆国产在线播放| 国产在线精品一区二区三区不卡| 日韩经典中文字幕| 国产成人三级视频| 五月婷婷在线播放| 九九久久精品视频| 91精品国产高清久久久久久91 | 人人草在线视频| 国产精品理伦片| 精品在线不卡| 国产色综合视频| 精品国产一区二区三区久久久樱花 | 亚洲一级免费在线观看| 福利成人导航| 亚洲视频 欧洲视频| 日本视频精品一区| 黄色aaa毛片| 韩日av一区二区| 日韩免费av在线| 国产性生活网站| heyzo欧美激情| 欧美在线免费观看亚洲| 亚欧无线一线二线三线区别| 国产日产一区二区| 国产一区在线观看麻豆| 国产成一区二区| 91九色丨porny丨肉丝| 欧美激情在线| 久热精品视频在线| 91香蕉视频污在线观看| 欧美日韩激情在线一区二区三区| 亚洲精品国产电影| 中文字幕第九页| 视频一区在线| 日韩一二三四区| www激情五月| 9999在线精品视频| 欧美精品久久99| 欧美日韩中文不卡| 精品三级在线| 欧美美女bb生活片| 日本肉体xxxx裸体xxx免费| 最新日韩一区| 在线观看亚洲精品| 国产激情在线观看视频| 日韩高清中文字幕一区二区| 色中色一区二区| 日本不卡一区二区三区在线观看 | 亚洲第一免费网站| 国产国语老龄妇女a片| 亚洲一区网址| 精品盗摄一区二区三区| 亚洲av熟女高潮一区二区| 激情视频极品美女日韩| 亚洲精品国产精品久久清纯直播| av网站有哪些| 波多野结衣在线观看一区二区| 中文字幕在线观看亚洲| 中国xxxx性xxxx产国| 六月丁香久久丫| 亚洲精品永久免费精品| 国产小视频自拍| 欧美丰满日韩| 欧美国产一区二区三区| 国产成人精品a视频一区| 久久精品免费| 国产精品日韩一区| 亚洲欧美激情在线观看| 91蜜桃网址入口| 亚洲欧洲精品一区| 黄污视频在线观看| 色8久久精品久久久久久蜜| 99国产精品久久久久久| 都市激情亚洲欧美| 在线精品播放av| 欧美毛片在线观看| 日日欢夜夜爽一区| 亚洲一区二区三区视频播放| 黄色片一区二区三区| 国产一区二区看久久| 国产精品theporn88| 日本午夜在线视频| 中文字幕一区二区三区色视频| 日韩免费av电影| 99在线视频观看| 婷婷开心激情综合| 一区二区三区四区国产| 黄色一级a毛片| 91在线播放网址| 亚洲v国产v| 黄页网站在线| 欧美体内she精视频| 日本成人在线免费| 欧美限制电影| 九九热精品视频在线播放| 国产午夜精品无码一区二区| 午夜亚洲影视| 91视频九色网站| 亚洲日本香蕉视频| 亚洲婷婷国产精品电影人久久| 欧美大黑帍在线播放| 日本黄色一区| 精品久久人人做人人爽| 一级黄色录像毛片| 影音先锋在线一区| 国产人妖伪娘一区91| 免费黄网站在线观看| 中文字幕综合网| 国产女人18毛片| 播放一区二区| 精品小视频在线| 久久成人国产精品入口| 日本不卡一区二区| 精品一区二区三区视频日产| av网站大全在线| 欧美少妇xxx| 欧美 变态 另类 人妖| 综合久久婷婷| 国产日韩欧美视频| 二区在线视频| 欧美日韩中文在线| 中文字幕一二三区| 欧美韩国日本在线观看| 日韩免费av在线| 欧美一区二区黄片| 一区二区三区在线免费| 中文字幕第100页| 亚洲精品456| 97精品视频在线| 一区二区三区精彩视频| 国产精品久久久久aaaa樱花| 免费在线观看日韩视频| 极品束缚调教一区二区网站| 欧美成人一二三| 国产精品综合在线| 亚洲欧美一区二区三区孕妇| 亚洲综合日韩欧美| 国产在视频线精品视频www666| 久久男人av资源网站| 国产富婆一级全黄大片| 亚洲欧美日韩国产中文在线| 热久久精品免费视频| 波多野结衣在线播放一区| 国产成人精品电影久久久| 日韩偷拍自拍| 欧美日韩精品国产| 西西大胆午夜视频| 国产精品日韩久久久| αv一区二区三区| 亚洲伦理在线观看| 亚洲激情网站免费观看| 亚洲在线观看网站| 欧美不卡一区| www.av一区视频| 136福利第一导航国产在线| 日韩成人在线电影网| 国产精品黄色网| jiyouzz国产精品久久| 国产va亚洲va在线va| 精品视频在线你懂得| 韩日欧美一区二区| 深夜福利在线观看直播| 久久亚洲私人国产精品va媚药| 黄色免费视频大全| 亚洲精品小区久久久久久| 日本91av在线播放| 国产免费a∨片在线观看不卡| 欧亚一区二区三区| www成人啪啪18软件| 激情综合五月婷婷| 日韩欧美国产综合在线| 国产日产一区| 国产精品白嫩美女在线观看 | 成人激情视屏| 久久精品视频亚洲| 日本中文字幕网| 99热精品国产| 三级在线免费看| 99re6这里只有精品| 91在线视频免费| sm在线观看| 国产一区二区动漫| 国产情侣自拍小视频| 亚洲精品视频在线| 亚洲精品乱码久久久久久久久久久久| 男女男精品网站| 日韩中文在线字幕| 欧美调教在线| 国产综合在线观看视频| 国产粉嫩在线观看| 日韩av在线网站| 亚洲天堂视频在线| 亚洲v日本v欧美v久久精品| 级毛片内射视频| 国产精选一区二区三区| 无码人妻丰满熟妇区96| 欧美极品一区二区三区| 欧洲在线视频一区| 亚洲国产aⅴ精品一区二区| 欧亚精品中文字幕| 天天色天天射天天综合网| 亚洲全黄一级网站| 中文字幕+乱码+中文字幕明步 | 国产精品专区免费| 北条麻妃久久精品| 亚洲欧洲视频在线观看| 欧美一区二区黄| 国产情侣免费视频| 午夜精品久久久久久久99水蜜桃| 青青操在线视频观看| 91丝袜呻吟高潮美腿白嫩在线观看| 伊人网在线综合| 性感少妇一区| 欧美国产日韩激情| 亚洲色图88| 樱空桃在线播放| 大色综合视频网站在线播放| 精品乱码一区| 91成人福利| 91欧美日韩一区| 在线日韩三级| 国产精品视频26uuu| 在线观看欧美日韩电影| 久久久之久亚州精品露出| 国产视频在线播放| 蜜臀久久99精品久久久无需会员| 国产一区二区三区不卡在线| 日韩久久免费av| 国产v片在线观看| 欧美一区二区三区在线| 中文字幕久久网| 欧美性高清videossexo| 亚洲 欧美 中文字幕| 日本韩国欧美三级| 国产剧情在线视频| 色哟哟在线观看一区二区三区| 在线观看 中文字幕| 欧美日韩一二三四五区| 狠狠人妻久久久久久| 精品欧美一区二区三区| 草久久免费视频| 日韩欧美中文第一页| 欧美一区免费看| 91高清在线观看| ,一级淫片a看免费| 欧美精品久久天天躁| 亚洲视频一区二区三区四区| 在线免费观看不卡av| 国产视频1区2区| 一本色道**综合亚洲精品蜜桃冫| 久久一区二区三区视频| 精品国产999| 亚洲 欧美 视频| 欧美午夜www高清视频| 日本中文字幕第一页| 色94色欧美sute亚洲线路一久 | 午夜亚洲福利| 丝袜人妻一区二区三区| 中日韩男男gay无套| 蜜臀精品一区二区| 国产模特精品视频久久久久| 妞干网在线免费视频| 裸体一区二区三区| 男男受被啪到高潮自述| 国产成人精品综合在线观看| 国产综合内射日韩久| 91麻豆国产香蕉久久精品| 激情五月深爱五月| 一区二区三区精品久久久| 日韩高清精品免费观看| 日韩欧美在线国产| 青青视频在线免费观看| 欧美狂野另类xxxxoooo| 动漫av一区二区三区| 国产丝袜精品视频| 日本黄色片在线观看| 中文字幕欧美视频在线| 欧美黄色视屏| 欧美尤物巨大精品爽| 日本免费在线视频| 久热精品视频在线| 理论片午夜视频在线观看| 国产精品一区二区久久国产| 日韩精品中文字幕一区二区| 蜜桃欧美视频| 国产精品毛片一区二区在线看| 成人在线免费高清视频| 日韩国产精品久久| 中文字幕在线视频一区二区| av毛片久久久久**hd| 久久视频一区二区三区| 婷婷久久综合九色国产成人| 在线观看亚洲国产| 亚洲国产欧美一区| 秋霞影院午夜丰满少妇在线视频| 欧美日韩福利视频| 亚洲一区二区av| 久久av一区二区| 亚洲精品一区二区妖精| 91国视频在线| 黄页网站大全一区二区| av直播在线观看| 亚洲欧美另类小说| 综合久久中文字幕| 欧美va亚洲va| 黄色国产网站在线播放| 日本伊人精品一区二区三区介绍| 免费看一区二区三区| 日本免费高清不卡| 久久国产精品久久久久久电车| 久久久久无码精品| 国产精品久久久久久亚洲伦| 九一国产在线观看| 日韩av在线直播| 色爱综合区网| 国产欧美日韩丝袜精品一区| 色愁久久久久久| 国产69精品久久久久久久| 国产一区二区视频在线| 国产又粗又猛又爽又黄av| 精品二区三区线观看| 丰满肉嫩西川结衣av| 久久人人爽人人爽爽久久| 经典三级一区二区| 久久精品成人一区二区三区蜜臀 | www国产无套内射com| 麻豆91精品视频| 日本二区在线观看| 日韩欧美国产网站| 蜜臀久久精品久久久久| 欧美成人午夜激情视频| 色综合久久久| 亚洲综合首页| 国产精品久久久久久久久久妞妞| 一级欧美一级日韩片| 亚洲高清视频中文字幕| japanese国产| 欧美成年人视频网站欧美| 欧美一区在线观看视频| 看一级黄色录像| 国产在线精品一区二区| 男人的午夜天堂| 欧美一区二区精品在线| 亚洲色图美国十次| 99久久99久久| 狠狠爱成人网| 性色av蜜臀av色欲av| 狠狠做深爱婷婷久久综合一区| 性xxxx视频播放免费| 国精产品一区一区三区有限在线| 嫩草国产精品入口| 黑人糟蹋人妻hd中文字幕 | 99理论电影网| 国产精品豆花视频| 在线播放av网址| 精品久久久精品| 日本一卡二卡四卡精品| 日韩美女av在线免费观看| 亚洲欧洲美洲国产香蕉| 欧美日韩在线免费播放| 中文字幕一区二区三区四区不卡| 国产又爽又黄免费软件| 久久手机免费视频| 美女扒开腿让男人桶爽久久动漫| 无码精品a∨在线观看中文| 久久夜色精品国产欧美乱极品| 中文字幕一区二区在线视频 | 你懂得网站在线| 国产精品久久中文| 欧美日韩中字| 精产国品一区二区三区| 欧美日韩国产丝袜美女| 国产女主播在线写真| 国产精品久久久久999| 欧美精品导航| 泷泽萝拉在线播放| 欧美亚男人的天堂| 在线观看三级视频| 久久av一区二区|