精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

免费大片在线观看| 国产伦精品一区二区三区高清| 免费观看av网站| 国产乱码精品一区二三赶尸艳谈| 成人少妇影院yyyy| 日韩中文字幕精品视频| www.久久久久久久久久久| 91麻豆免费在线视频| 国产精品一区二区三区乱码| 久久久久999| 日本人妻一区二区三区| 成人在线高清免费| 国产三级精品三级在线专区| 国模视频一区二区三区| 香蕉视频黄色在线观看| 桃子视频成人app| 亚洲少妇屁股交4| 国产欧美日韩伦理| 日韩 欧美 亚洲| 精品国产一级毛片| 国产乱码精品一区二区三区av | 国产又黄又爽又色| 精品国产欧美日韩| 日韩亚洲欧美中文三级| 日韩av高清在线看片| 黄色电影免费在线看| 国产一区二区不卡老阿姨| 久久久久一本一区二区青青蜜月 | 日本道在线观看| 色天天久久综合婷婷女18| 精品久久免费看| 91av俱乐部| 麻豆视频在线观看免费网站| 99久久婷婷国产综合精品电影| 国产精品美女www| 日本少妇激情舌吻| 久久精品欧美一区| 精品亚洲国产视频| 久久综合在线观看| 两个人看的在线视频www| 国产精品成人网| 免费在线成人av| 精品久久久中文字幕人妻| 视频一区在线播放| 欧美黄网免费在线观看| 日本一卡二卡在线播放| 极品束缚调教一区二区网站 | 在线成人免费网站| 你懂得在线视频| 国产精品美女久久久久| 五月天精品一区二区三区| 国产91av视频在线观看| 男女污污视频在线观看| 国产在线不卡一卡二卡三卡四卡| 欧美洲成人男女午夜视频| 国产亚洲精久久久久久无码77777| 秋霞欧美视频| 国产香蕉精品视频一区二区三区| 成人在线电影网站| 一区二区三区四区精品视频| 欧美亚洲日本国产| 成年人视频在线免费| 黄色在线免费观看网站| 亚洲国产精品久久艾草纯爱| 国产奶头好大揉着好爽视频| 欧美69xxxx| 国产精品视频一二| 无遮挡亚洲一区| 神宫寺奈绪一区二区三区| 国产成人av电影在线| 成人久久一区二区| 夜夜躁狠狠躁日日躁av| 美女在线一区二区| 国产精品中文久久久久久久| 正在播放亚洲精品| 日韩av中文字幕一区二区三区 | 久久久久久久久久久久久久久久av| 亚洲第一页在线观看| 韩国三级中文字幕hd久久精品| 国产精品国产三级国产aⅴ浪潮| www.国产毛片| 日本 国产 欧美色综合| 国产精品久久久久久亚洲调教| 亚洲天堂自拍偷拍| 国产精品99久久久久久宅男| 好吊色欧美一区二区三区四区| 欧美日本网站| 亚洲欧美日韩一区二区| 日韩激情免费视频| 精品久久99| 欧美精品一区二区三区蜜桃| 久久精品成人av| 夜间精品视频| 精品免费日韩av| 亚洲第一成人网站| 欧美黄污视频| 国产成人精品电影久久久| 国产精品视频一二区| 成人福利在线看| 亚洲精品一区二区三区蜜桃久| 呦呦在线视频| 在线观看中文字幕不卡| 国产69视频在线观看| 欧洲激情视频| 2019精品视频| 国产福利资源在线| 国产精品私人影院| www黄色av| 午夜日韩影院| 中文字幕在线日韩| 一级片中文字幕| 国模娜娜一区二区三区| 欧美一区二区视频17c| 污污在线观看| 4438成人网| 亚洲区免费视频| 亚洲日韩视频| 成人激情av在线| 国产免费a∨片在线观看不卡| 亚洲一区二区av电影| 亚洲精品自拍网| 伊人久久大香线蕉综合网蜜芽| 欧美极品少妇与黑人| 国产乱码精品一区二区三区精东| 久久精品人人做人人综合 | 精品国产乱码久久久久久蜜臀| 韩国三级hd中文字幕| 日韩视频一区| 国产精品.com| 男女免费观看在线爽爽爽视频| 56国语精品自产拍在线观看| 亚洲天堂最新地址| 三级亚洲高清视频| 久久综合一区| 天堂√8在线中文| 精品成人一区二区三区四区| 欧美日韩人妻精品一区二区三区| 经典一区二区三区| 免费观看中文字幕| 精品国产乱码一区二区三区 | 亚洲缚视频在线观看| 在线观看天堂av| 日韩精品1区2区3区| 欧洲精品亚洲精品| 精品视频一区二区三区四区五区| 亚洲欧美一区二区三区情侣bbw| 国产精品黄色大片| 久久综合九色综合久久久精品综合| 国产素人在线观看| 日韩欧美中文字幕电影| 欧美一区二区三区……| 美女做暖暖视频免费在线观看全部网址91| 欧美日韩中文字幕| 亚洲一区二区三区蜜桃| 天堂成人免费av电影一区| 日本高清不卡一区二区三| 欧美精品高清| 日韩中文视频免费在线观看| 99草在线视频| 99久久久国产精品| 成年人视频观看| 精品一区免费| 国产精品视频一| 黄色免费网站在线| 欧美mv日韩mv国产网站| 日本少妇性高潮| 国产夜色精品一区二区av| 欧美大尺度做爰床戏| 国产韩国精品一区二区三区| 亚洲综合色av| 538在线观看| 国产亚洲激情视频在线| 国产精品欧美激情在线| 亚洲在线视频免费观看| 国产毛片久久久久久久| 精品亚洲aⅴ乱码一区二区三区| 欧美一级爱爱视频| 日韩有码一区| 成人黄色免费片| 两个人看的在线视频www| 中文字幕av一区| www.蜜桃av.com| 在线观看一区二区视频| 一级黄色录像视频| 久久视频一区二区| 精品国产午夜福利在线观看| 一本一本久久| 欧美性受xxxx黑人猛交88| 精品国产导航| 国产一区深夜福利| 色在线中文字幕| 久久深夜福利免费观看| 亚洲av成人精品一区二区三区在线播放| 91久久精品日日躁夜夜躁欧美| 日日噜噜夜夜狠狠久久波多野| av不卡一区二区三区| 999在线精品视频| 亚洲免费中文| 天堂а√在线中文在线 | 亚洲精品永久免费精品| 国产精品人妻一区二区三区| 天天综合色天天综合| 久久成人小视频| 99国内精品久久| 国偷自产av一区二区三区麻豆| 日韩中文字幕一区二区三区| 99久久久精品视频| 999精品色在线播放| 久久久久欧美| silk一区二区三区精品视频| 国产日韩在线看| 婷婷午夜社区一区| 97色在线观看免费视频| 国产激情在线| 在线成人中文字幕| 男同在线观看| 日韩av在线免播放器| 久久国产在线观看| 欧美国产一区二区在线观看 | 欧美交a欧美精品喷水| 成人黄色在线免费| 国产91精品在线| 欧美专区第一页| 理论片午夜视频在线观看| 欧美剧在线观看| 精品国产99久久久久久| 深夜精品寂寞黄网站在线观看| 凸凹人妻人人澡人人添| 精品毛片乱码1区2区3区| 999久久久久| 91精品国产综合久久久久久久| 无码久久精品国产亚洲av影片| 欧美日韩一区二区精品| 亚欧视频在线观看| 亚洲成人黄色影院| 国产无码精品在线观看| 一区二区三区精品视频在线| 日韩精品一区二区亚洲av性色| 国产精品久久看| 精品少妇一区二区三区密爱| 国产精品毛片久久久久久| 欧美黄色高清视频| 国产精品日韩精品欧美在线| 黑人と日本人の交わりビデオ| 国产欧美一区二区精品秋霞影院| 国精产品一区二区三区| 久久久国产午夜精品| 蜜桃无码一区二区三区| 久久网站最新地址| 欧美熟妇激情一区二区三区| 日本一区二区三区四区 | 亚洲福利视频导航| 国产大片中文字幕在线观看| 亚洲国产sm捆绑调教视频| 免费观看一级视频| 粉嫩av一区二区三区免费野| 久久久久久久久久久久久av| 色综合视频在线观看| 中文资源在线播放| 5566中文字幕一区二区电影| 精品国产无码一区二区| 精品国产91九色蝌蚪| 色中色在线视频| 永久免费精品影视网站| 黄网页在线观看| 欧美高清激情视频| 在线天堂资源www在线污| 国产成人鲁鲁免费视频a| 久久人人视频| 国产精品视频免费一区二区三区| 亚洲视频分类| 欧美aaa在线观看| 99视频在线精品国自产拍免费观看| 北条麻妃在线观看| 久久精品久久99精品久久| www.日本久久| 337p粉嫩大胆噜噜噜噜噜91av| 久久久视频6r| 亚洲精品免费一二三区| 欧美三级一区二区三区| 欧美亚洲国产一区在线观看网站| 国产aⅴ一区二区三区| 日韩av影片在线观看| 久久日韩视频| 91av视频在线免费观看| 天天综合在线观看| 九九九九精品| 亚洲成av人片乱码色午夜| 乱妇乱女熟妇熟女网站| 美国一区二区三区在线播放| av不卡中文字幕| 欧美国产综合一区二区| 国产成人亚洲欧洲在线| 91精品国产免费| 人成在线免费视频| 欧美精品一二区| 日本一区二区电影| 久久艹中文字幕| 亚洲一区二区日韩| 狠狠综合久久av一区二区小说| 在线播放日韩欧美| 欧美激情二区| 欧美怡春院一区二区三区| 人人爱人人干婷婷丁香亚洲| 欧美另类一区| 亚洲精品1234| 久久发布国产伦子伦精品| 国产日韩综合av| 韩国av中文字幕| 日韩精品一区在线| 日本www在线| 国产国语刺激对白av不卡| 久久久亚洲欧洲日产| 一级黄色录像免费看| 青青草国产精品亚洲专区无| 法国伦理少妇愉情| 午夜视频久久久久久| av网站免费播放| 日日骚av一区| 欧洲成人一区| 欧美一区视久久| 麻豆久久婷婷| 久久人人爽人人爽人人片 | 男生操女生视频在线观看| 久久婷婷色综合| 国产原创视频在线| 亚洲精品美女久久久久| 久久亚洲导航| 超碰在线观看97| 国产精品mm| 无码人妻一区二区三区精品视频| 中文字幕亚洲不卡| 一级黄色短视频| 日韩中文在线中文网在线观看| 成人精品电影在线| 日本精品一区二区三区高清 久久| 亚洲深夜影院| 黄色一级免费大片| 26uuu欧美| www.国产色| 日韩精品中文字幕久久臀| 福利影院在线看| 精品视频导航| 免费日韩精品中文字幕视频在线| 色噜噜在线观看| 色94色欧美sute亚洲13| 国产福利免费在线观看| 国产精品女人网站| 久久网站免费观看| 17c国产在线| 亚洲欧美韩国综合色| www.桃色av嫩草.com| 午夜精品久久17c| 亚洲国产最新| 日本激情综合网| 综合婷婷亚洲小说| 成人福利小视频| 97国产一区二区精品久久呦| 亚洲理论电影| 亚洲xxx在线观看| 亚洲色图欧美在线| 嫩草影院一区二区| 欧美一区亚洲一区| 精品国产一区二区三区噜噜噜 | 国产精品免费观看视频| 中文字幕第一页在线播放| 日韩视频亚洲视频| 99a精品视频在线观看| 免费av观看网址| 中文字幕精品一区二区精品绿巨人| 一区二区三区播放| 久久久久久久久91| 国际精品欧美精品| 在线能看的av网站| 午夜久久久久久电影| 久草视频在线看| 99一区二区| 日韩黄色小视频| 欧美日韩国产精品一区二区三区| 亚洲国产中文字幕在线观看| 亚洲成人av观看| 国产精品免费看久久久无码| 久久免费国产精品| 国产熟女一区二区丰满| 97色在线观看| 国产精品精品国产一区二区| 污片免费在线观看| 欧美日韩精品欧美日韩精品一综合| 伊人春色在线观看| 视频二区一区| 成人教育av在线| 亚洲精品无码久久久久| 欧美日韩福利在线观看| 伊甸园亚洲一区| 国产乱淫av片| 欧美福利一区二区| h片精品在线观看| 综合操久久久| 欧美国产禁国产网站cc| 丰满熟妇乱又伦|