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

基于Pytorch的從零開始的目標檢測 | 附源碼

開發
本文將討論圖像中只有一個感興趣的對象的情況。這里的重點更多是關于如何讀取圖像及其邊界框、調整大小和正確執行增強,而不是模型本身。

引言

目標檢測是計算機視覺中一個非常流行的任務,在這個任務中,給定一個圖像,你預測圖像中物體的包圍盒(通常是矩形的) ,并且識別物體的類型。在這個圖像中可能有多個對象,而且現在有各種先進的技術和框架來解決這個問題,例如 Faster-RCNN 和 YOLOv3。

本文將討論圖像中只有一個感興趣的對象的情況。這里的重點更多是關于如何讀取圖像及其邊界框、調整大小和正確執行增強,而不是模型本身。目標是很好地掌握對象檢測背后的基本思想,你可以對其進行擴展以更好地理解更復雜的技術。

本文中的所有代碼都在下面的鏈接中:https://jovian.ai/aakanksha-ns/road-signs-bounding-box-prediction。

問題陳述

給定一個由路標組成的圖像,預測路標周圍的包圍盒,并識別路標的類型。這些路標包括以下四種:

  • 紅綠燈
  • 停止
  • 車速限制
  • 人行橫道

這就是所謂的多任務學習問題,因為它涉及執行兩個任務: 1)回歸找到包圍盒坐標,2)分類識別道路標志的類型。

1.數據集

我使用了來自 Kaggle 的道路標志檢測數據集,鏈接如下:https://www.kaggle.com/andrewmvd/road-sign-detection

它由877張圖像組成。這是一個相當不平衡的數據集,大多數圖像屬于限速類,但由于我們更關注邊界框預測,因此可以忽略不平衡。

2.加載數據

每個圖像的注釋都存儲在單獨的 XML 文件中。我按照以下步驟創建了訓練數據集:

  • 遍歷訓練目錄以獲得所有.xml 文件的列表。
  • 使用xml.etree.ElementTree解析.xml文件。
  • 創建一個由文件路徑、寬度、高度、邊界框坐標( xmin 、 xmax 、 ymin 、 ymax )和每個圖像的類組成的字典,并將字典附加到列表中。
  • 使用圖像統計數據字典列表創建一個 Pandas 數據庫。
def filelist(root, file_type):
    """Returns a fully-qualified list of filenames under root directory"""
    return [os.path.join(directory_path, f) for directory_path, directory_name, 
            files in os.walk(root) for f in files if f.endswith(file_type)]

def generate_train_df (anno_path):
    annotations = filelist(anno_path, '.xml')
    anno_list = []
    for anno_path in annotations:
        root = ET.parse(anno_path).getroot()
        anno = {}
        anno['filename'] = Path(str(images_path) + '/'+ root.find("./filename").text)
        anno['width'] = root.find("./size/width").text
        anno['height'] = root.find("./size/height").text
        anno['class'] = root.find("./object/name").text
        anno['xmin'] = int(root.find("./object/bndbox/xmin").text)
        anno['ymin'] = int(root.find("./object/bndbox/ymin").text)
        anno['xmax'] = int(root.find("./object/bndbox/xmax").text)
        anno['ymax'] = int(root.find("./object/bndbox/ymax").text)
        anno_list.append(anno)
    return pd.DataFrame(anno_list)
  • 標簽編碼類列
#label encode target
class_dict = {'speedlimit': 0, 'stop': 1, 'crosswalk': 2, 'trafficlight': 3}
df_train['class'] = df_train['class'].apply(lambda x:  class_dict[x])

3.調整圖像和邊界框的大小

由于訓練一個計算機視覺模型需要的圖像是相同的大小,我們需要調整我們的圖像和他們相應的包圍盒。調整圖像的大小很簡單,但是調整包圍盒的大小有點棘手,因為每個包圍盒都與圖像及其尺寸相關。

下面是調整包圍盒大小的工作原理:

  • 將邊界框轉換為與其對應的圖像大小相同的圖像(稱為掩碼)。這個掩碼只有 0 表示背景,1 表示邊界框覆蓋的區域。

  • 將掩碼調整到所需的尺寸。

從調整完大小的掩碼中提取邊界框坐標。

def create_mask(bb, x):
    """Creates a mask for the bounding box of same shape as image"""
    rows,cols,*_ = x.shape
    Y = np.zeros((rows, cols))
    bb = bb.astype(np.int)
    Y[bb[0]:bb[2], bb[1]:bb[3]] = 1.
    return Y

def mask_to_bb(Y):
    """Convert mask Y to a bounding box, assumes 0 as background nonzero object"""
    cols, rows = np.nonzero(Y)
    if len(cols)==0: 
        return np.zeros(4, dtype=np.float32)
    top_row = np.min(rows)
    left_col = np.min(cols)
    bottom_row = np.max(rows)
    right_col = np.max(cols)
    return np.array([left_col, top_row, right_col, bottom_row], dtype=np.float32)

def create_bb_array(x):
    """Generates bounding box array from a train_df row"""
    return np.array([x[5],x[4],x[7],x[6]])
def resize_image_bb(read_path,write_path,bb,sz):
    """Resize an image and its bounding box and write image to new path"""
    im = read_image(read_path)
    im_resized = cv2.resize(im, (int(1.49*sz), sz))
    Y_resized = cv2.resize(create_mask(bb, im), (int(1.49*sz), sz))
    new_path = str(write_path/read_path.parts[-1])
    cv2.imwrite(new_path, cv2.cvtColor(im_resized, cv2.COLOR_RGB2BGR))
    return new_path, mask_to_bb(Y_resized)
#Populating Training DF with new paths and bounding boxes
new_paths = []
new_bbs = []
train_path_resized = Path('./road_signs/images_resized')
for index, row in df_train.iterrows():
    new_path,new_bb = resize_image_bb(row['filename'], train_path_resized, create_bb_array(row.values),300)
    new_paths.append(new_path)
    new_bbs.append(new_bb)
df_train['new_path'] = new_paths
df_train['new_bb'] = new_bbs

4.數據增強

數據增強是一種通過使用現有圖像的不同變體創建新的訓練圖像來更好地概括我們的模型的技術。我們當前的訓練集中只有 800 張圖像,因此數據增強對于確保我們的模型不會過擬合非常重要。

對于這個問題,我使用了翻轉、旋轉、中心裁剪和隨機裁剪。

這里唯一需要記住的是確保包圍盒也以與圖像相同的方式進行轉換。

# modified from fast.ai
def crop(im, r, c, target_r, target_c): 
    return im[r:r+target_r, c:c+target_c]

# random crop to the original size
def random_crop(x, r_pix=8):
    """ Returns a random crop"""
    r, c,*_ = x.shape
    c_pix = round(r_pix*c/r)
    rand_r = random.uniform(0, 1)
    rand_c = random.uniform(0, 1)
    start_r = np.floor(2*rand_r*r_pix).astype(int)
    start_c = np.floor(2*rand_c*c_pix).astype(int)
    return crop(x, start_r, start_c, r-2*r_pix, c-2*c_pix)

def center_crop(x, r_pix=8):
    r, c,*_ = x.shape
    c_pix = round(r_pix*c/r)
    return crop(x, r_pix, c_pix, r-2*r_pix, c-2*c_pix)
def rotate_cv(im, deg, y=False, mode=cv2.BORDER_REFLECT, interpolation=cv2.INTER_AREA):
    """ Rotates an image by deg degrees"""
    r,c,*_ = im.shape
    M = cv2.getRotationMatrix2D((c/2,r/2),deg,1)
    if y:
        return cv2.warpAffine(im, M,(c,r), borderMode=cv2.BORDER_CONSTANT)
    return cv2.warpAffine(im,M,(c,r), borderMode=mode, flags=cv2.WARP_FILL_OUTLIERS+interpolation)

def random_cropXY(x, Y, r_pix=8):
    """ Returns a random crop"""
    r, c,*_ = x.shape
    c_pix = round(r_pix*c/r)
    rand_r = random.uniform(0, 1)
    rand_c = random.uniform(0, 1)
    start_r = np.floor(2*rand_r*r_pix).astype(int)
    start_c = np.floor(2*rand_c*c_pix).astype(int)
    xx = crop(x, start_r, start_c, r-2*r_pix, c-2*c_pix)
    YY = crop(Y, start_r, start_c, r-2*r_pix, c-2*c_pix)
    return xx, YY

def transformsXY(path, bb, transforms):
    x = cv2.imread(str(path)).astype(np.float32)
    x = cv2.cvtColor(x, cv2.COLOR_BGR2RGB)/255
    Y = create_mask(bb, x)
    if transforms:
        rdeg = (np.random.random()-.50)*20
        x = rotate_cv(x, rdeg)
        Y = rotate_cv(Y, rdeg, y=True)
        if np.random.random() > 0.5: 
            x = np.fliplr(x).copy()
            Y = np.fliplr(Y).copy()
        x, Y = random_cropXY(x, Y)
    else:
        x, Y = center_crop(x), center_crop(Y)
    return x, mask_to_bb(Y)
def create_corner_rect(bb, color='red'):
    bb = np.array(bb, dtype=np.float32)
    return plt.Rectangle((bb[1], bb[0]), bb[3]-bb[1], bb[2]-bb[0], color=color,
                         fill=False, lw=3)

def show_corner_bb(im, bb):
    plt.imshow(im)
    plt.gca().add_patch(create_corner_rect(bb))

圖片圖片

5.PyTorch 數據集

現在我們已經有了數據增強,我們可以進行訓練驗證拆分并創建我們的 PyTorch 數據集。我們使用 ImageNet 統計數據對圖像進行標準化,因為我們使用的是預訓練的 ResNet 模型并在訓練時在我們的數據集中應用數據增強。

X_train, X_val, y_train, y_val = train_test_split(X, Y, test_size=0.2, random_state=42)
def normalize(im):
    """Normalizes images with Imagenet stats."""
    imagenet_stats = np.array([[0.485, 0.456, 0.406], [0.229, 0.224, 0.225]])
    return (im - imagenet_stats[0])/imagenet_stats[1]
class RoadDataset(Dataset):
    def __init__(self, paths, bb, y, transforms=False):
        self.transforms = transforms
        self.paths = paths.values
        self.bb = bb.values
        self.y = y.values
    def __len__(self):
        return len(self.paths)
    
    def __getitem__(self, idx):
        path = self.paths[idx]
        y_class = self.y[idx]
        x, y_bb = transformsXY(path, self.bb[idx], self.transforms)
        x = normalize(x)
        x = np.rollaxis(x, 2)
        return x, y_class, y_bb
train_ds = RoadDataset(X_train['new_path'],X_train['new_bb'] ,y_train, transforms=True)
valid_ds = RoadDataset(X_val['new_path'],X_val['new_bb'],y_val)
batch_size = 64
train_dl = DataLoader(train_ds, batch_size=batch_size, shuffle=True)
valid_dl = DataLoader(valid_ds, batch_size=batch_size)

6.PyTorch 模型

對于這個模型,我使用了一個非常簡單的預先訓練的 resNet-34模型。由于我們有兩個任務要完成,這里有兩個最后的層: 包圍盒回歸器和圖像分類器。

class BB_model(nn.Module):
    def __init__(self):
        super(BB_model, self).__init__()
        resnet = models.resnet34(pretrained=True)
        layers = list(resnet.children())[:8]
        self.features1 = nn.Sequential(*layers[:6])
        self.features2 = nn.Sequential(*layers[6:])
        self.classifier = nn.Sequential(nn.BatchNorm1d(512), nn.Linear(512, 4))
        self.bb = nn.Sequential(nn.BatchNorm1d(512), nn.Linear(512, 4))
        
    def forward(self, x):
        x = self.features1(x)
        x = self.features2(x)
        x = F.relu(x)
        x = nn.AdaptiveAvgPool2d((1,1))(x)
        x = x.view(x.shape[0], -1)
        return self.classifier(x), self.bb(x)

7.訓練

對于損失,我們需要同時考慮分類損失和邊界框回歸損失,因此我們使用交叉熵和 L1 損失(真實值和預測坐標之間的所有絕對差之和)的組合。我已經將 L1 損失縮放了 1000 倍,因為分類和回歸損失都在相似的范圍內。除此之外,它是一個標準的 PyTorch 訓練循環(使用 GPU):

def update_optimizer(optimizer, lr):
    for i, param_group in enumerate(optimizer.param_groups):
        param_group["lr"] = lr
def train_epocs(model, optimizer, train_dl, val_dl, epochs=10,C=1000):
    idx = 0
    for i in range(epochs):
        model.train()
        total = 0
        sum_loss = 0
        for x, y_class, y_bb in train_dl:
            batch = y_class.shape[0]
            x = x.cuda().float()
            y_class = y_class.cuda()
            y_bb = y_bb.cuda().float()
            out_class, out_bb = model(x)
            loss_class = F.cross_entropy(out_class, y_class, reduction="sum")
            loss_bb = F.l1_loss(out_bb, y_bb, reduction="none").sum(1)
            loss_bb = loss_bb.sum()
            loss = loss_class + loss_bb/C
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()
            idx += 1
            total += batch
            sum_loss += loss.item()
        train_loss = sum_loss/total
        val_loss, val_acc = val_metrics(model, valid_dl, C)
        print("train_loss %.3f val_loss %.3f val_acc %.3f" % (train_loss, val_loss, val_acc))
    return sum_loss/total

def val_metrics(model, valid_dl, C=1000):
    model.eval()
    total = 0
    sum_loss = 0
    correct = 0 
    for x, y_class, y_bb in valid_dl:
        batch = y_class.shape[0]
        x = x.cuda().float()
        y_class = y_class.cuda()
        y_bb = y_bb.cuda().float()
        out_class, out_bb = model(x)
        loss_class = F.cross_entropy(out_class, y_class, reduction="sum")
        loss_bb = F.l1_loss(out_bb, y_bb, reduction="none").sum(1)
        loss_bb = loss_bb.sum()
        loss = loss_class + loss_bb/C
        _, pred = torch.max(out_class, 1)
        correct += pred.eq(y_class).sum().item()
        sum_loss += loss.item()
        total += batch
    return sum_loss/total, correct/total
model = BB_model().cuda()
parameters = filter(lambda p: p.requires_grad, model.parameters())
optimizer = torch.optim.Adam(parameters, lr=0.006)
train_epocs(model, optimizer, train_dl, valid_dl, epochs=15)

8.測試

現在我們已經完成了訓練,我們可以選擇一個隨機圖像并在上面測試我們的模型。盡管我們只有相當少量的訓練圖像,但是我們最終在測試圖像上得到了一個相當不錯的預測。

使用手機拍攝真實照片并測試模型將是一項有趣的練習。另一個有趣的實驗是不執行任何數據增強并訓練模型并比較兩個模型。

# resizing test image
im = read_image('./road_signs/images_resized/road789.png')
im = cv2.resize(im, (int(1.49*300), 300))
cv2.imwrite('./road_signs/road_signs_test/road789.jpg', cv2.cvtColor(im, cv2.COLOR_RGB2BGR))
# test Dataset
test_ds = RoadDataset(pd.DataFrame([{'path':'./road_signs/road_signs_test/road789.jpg'}])['path'],pd.DataFrame([{'bb':np.array([0,0,0,0])}])['bb'],pd.DataFrame([{'y':[0]}])['y'])
x, y_class, y_bb = test_ds[0]
xx = torch.FloatTensor(x[None,])
xx.shape
# prediction
out_class, out_bb = model(xx.cuda())
out_class, out_bb

總結

現在我們已經介紹了目標檢測的基本原理,并從頭開始實現它,您可以將這些想法擴展到多對象情況,并嘗試更復雜的模型,如 RCNN 和 YOLO!

責任編輯:趙寧寧 來源: 小白玩轉Python
相關推薦

2024-11-18 17:31:27

2021-10-13 08:21:52

Java websocket Java 基礎

2015-11-17 16:11:07

Code Review

2019-01-18 12:39:45

云計算PaaS公有云

2018-04-18 07:01:59

Docker容器虛擬機

2024-12-06 17:02:26

2020-07-02 15:32:23

Kubernetes容器架構

2020-02-11 16:49:24

React前端代碼

2018-08-20 08:15:50

編程語言Go語言切片

2024-10-05 00:00:06

HTTP請求處理容器

2024-09-18 08:10:06

2017-03-14 14:04:24

Python機器學習

2018-11-27 11:58:34

Python人臉識別編程語言

2018-09-14 17:16:22

云計算軟件計算機網絡

2010-05-26 17:35:08

配置Xcode SVN

2018-04-16 16:31:56

前端開發從零開始

2024-11-27 16:25:54

JVMJIT編譯機制

2013-07-11 10:03:36

JavaScript框架

2024-05-15 14:29:45

2024-11-13 15:18:51

JITWatch開發
點贊
收藏

51CTO技術棧公眾號

久久综合亚洲精品| 亚洲在线观看视频网站| 欧美 日韩 成人| 成人在线精品| 精品福利在线视频| 亚洲狠狠婷婷综合久久久| av小说天堂网| 男女精品网站| 欧美成人午夜免费视在线看片| 香港三日本8a三级少妇三级99| 天天综合网天天| 一区二区三区四区视频精品免费 | 亚洲精品第一国产综合野| 国产一区二区在线网站 | 欧美日韩大片| 亚洲精品va在线观看| 欧美午夜精品久久久久久蜜| 国产成人精品一区二区无码呦 | 日韩美女主播视频| 18岁成人毛片| 日韩视频在线观看| 日韩电影中文字幕一区| 欧美视频亚洲图片| 欧美影视资讯| 欧美丝袜美女中出在线| 91亚洲精品国产| 日本福利在线| 日本一区二区三区在线观看| 精品国产一区二区三区四区vr| 国产精品久久久久久久免费看| 日韩高清在线观看| 欧美在线视频一区二区| 久久99久久久| 一区二区国产在线| 色婷婷综合久久久久中文字幕1| 人妻少妇精品视频一区二区三区| 日本精品在线观看| 91精品国产综合久久小美女| 91制片厂毛片| 三上悠亚亚洲一区| 欧美性猛交xxxx| 黄页网站大全在线观看| 色老头在线观看| 尤物在线观看一区| 欧美少妇在线观看| 最近中文字幕免费mv2018在线| 综合精品久久久| 正在播放国产精品| 麻豆视频在线播放| 136国产福利精品导航| 永久免费精品视频网站| av影片免费在线观看| 国产欧美1区2区3区| 日本中文不卡| 第一页在线观看| 国产蜜臀97一区二区三区| 亚洲欧美国产精品桃花| 自拍视频在线| 国产精品青草综合久久久久99| 亚欧精品在线| 日本美女在线中文版| 亚洲人成伊人成综合网小说| wwwjizzjizzcom| 国产丝袜视频在线播放| 亚洲午夜av在线| 国产精品又粗又长| 高清不卡亚洲| 欧美色精品天天在线观看视频| 免费在线观看污网站| 精品视频91| 亚洲国产精品一区二区久| 免费a v网站| 九九热爱视频精品视频| 这里只有视频精品| www深夜成人a√在线| 欧美精品黄色| 欧美中文在线观看国产| 中文字幕 国产| 国产精品一区二区久久不卡| 国产精品一级久久久| 欧美视频综合| 自拍偷拍亚洲欧美日韩| 免费人成自慰网站| 666av成人影院在线观看| 欧美精品免费视频| 亚洲国产精品第一页| 亚洲调教一区| 精品国偷自产在线视频| 国产成人无码精品亚洲| 青青国产91久久久久久| 成人91免费视频| 国产大片在线免费观看| 亚洲另类在线一区| aaa毛片在线观看| www久久久| 日韩久久免费电影| 日韩在线中文字幕视频| 免费在线观看成人av| 成人有码在线视频| 亚洲欧美色视频| 亚洲人精品一区| 欧美日韩激情视频在线观看| 亚洲精品一区av| 日韩精品免费在线视频观看| www欧美com| 性伦欧美刺激片在线观看| 3d动漫啪啪精品一区二区免费| 免费理论片在线观看播放老| 亚洲自拍偷拍欧美| 亚洲综合欧美激情| 九九亚洲视频| 欧美精品久久久久| 色综合久久久久久久久久久| 两女双腿交缠激烈磨豆腐| 国产日产一区| 91精品国产91久久久久久| 99久久婷婷国产一区二区三区| 久久亚洲欧美国产精品乐播| 少妇一晚三次一区二区三区| www.久久.com| 亚洲老头同性xxxxx| 久久影院一区二区| 国产精品综合av一区二区国产馆| 香蕉久久夜色| 欧美电影免费观看高清完整| 日韩av网站电影| 久久精品国产亚洲av麻豆色欲| 久色婷婷小香蕉久久| 日韩在线电影一区| 刘亦菲一区二区三区免费看| 日韩精品在线免费播放| 国产精品日日夜夜| 粉嫩aⅴ一区二区三区四区| 国产成人精品免费看在线播放| 三上悠亚国产精品一区二区三区| 精品视频www| 国产精品第9页| 99久久精品一区| 国产主播自拍av| 哺乳挤奶一区二区三区免费看| 色综合久久中文字幕综合网小说| 国产精品视频一二区| 国产精品久久久久天堂| 鲁一鲁一鲁一鲁一av| 不卡日本视频| 国产精品丝袜视频| 永久免费av片在线观看全网站| 欧美中文一区二区三区| 色婷婷国产精品免| 蜜桃视频在线观看一区二区| 亚洲精品成人自拍| 欧洲精品久久久久毛片完整版| 色噜噜狠狠狠综合曰曰曰88av | 中文字幕21页在线看| 精品无人区太爽高潮在线播放| 日韩一区二区视频在线| 久久久久亚洲蜜桃| 婷婷激情四射五月天| 99精品综合| 成人91视频| 天天综合av| 在线丨暗呦小u女国产精品| 在线播放一级片| 亚洲男人的天堂一区二区| 欧美人与性动交α欧美精品| 亚洲三级电影在线观看| 欧美精品成人一区二区在线观看| 天堂久久午夜av| 久久这里只有精品99| 丰满岳乱妇国产精品一区| 午夜a成v人精品| 日韩中文字幕有码| 国产美女精品一区二区三区| 妞干网视频在线观看| 亚洲精品无吗| 国产中文欧美精品| free性m.freesex欧美| 亚洲色在线视频| 国产精品久久久久久久免费看| 亚洲午夜av在线| 免费看黄色三级| 国产精品99精品久久免费| 免费毛片小视频| 99久久精品费精品国产风间由美| 国产精品久久波多野结衣| 欧美无毛视频| 欧美激情一区二区三区在线视频观看 | 麻豆久久久9性大片| 欧美风情在线视频| 羞羞色国产精品| 在线国产91| 亚洲第一av在线| 一本色道久久综合熟妇| 午夜激情久久久| 你懂得在线观看| 91视频91自| 一个人看的视频www| 秋霞午夜av一区二区三区| 免费看欧美黑人毛片| 欧美视频免费| 精品婷婷色一区二区三区蜜桃| 欧洲午夜精品| 国产精品99蜜臀久久不卡二区| 99热国产在线| 少妇av一区二区三区| 亚洲欧美日韩精品永久在线| 日韩欧美国产系列| 在线免费一级片| 日韩欧美在线中文字幕| 久久久久久久国产视频| 国产精品美女久久久久久久久久久| 中文字幕乱视频| 国产一区二区三区在线观看精品 | 久久久亚洲影院你懂的| 三级外国片在线观看视频| 精品亚洲国产成av人片传媒 | www.日本在线播放| 久久久久久久久久久妇女| 日韩欧美视频一区二区三区四区| 国产精品毛片av| 亚洲一区二区在线| 欧美激情啪啪| 国产精品揄拍一区二区| 不卡一二三区| 91sao在线观看国产| 国产嫩草在线视频| 久久九九热免费视频| 北岛玲一区二区三区| 亚洲视频在线观看免费| 日韩精品福利| 亚洲精品不卡在线| 秋霞网一区二区| 欧美成人三级在线| 国产www免费观看| 91精品国产综合久久国产大片 | 九一久久久久久| 麻豆一区二区三区视频| 久久蜜桃精品| 日韩精品无码一区二区三区免费| 久久国产成人| 蜜臀av午夜一区二区三区 | 午夜视频在线网站| 美日韩一区二区| 亚洲视频一二三四| 麻豆成人在线观看| 在线黄色免费看| 国产一区二区三区久久久| 日韩精品aaa| 国产乱码一区二区三区| 欧美专区第二页| 丁香激情综合五月| 97人妻精品一区二区三区免费| 成人免费毛片app| xxxx黄色片| 久久久久久97三级| 国产性猛交xx乱| 中文字幕一区在线观看视频| 永久看片925tv| 亚洲午夜激情网站| 亚洲va在线观看| 在线观看视频一区二区| 在线视频免费观看一区| 5月丁香婷婷综合| 亚洲精华国产精华精华液网站| 亚洲电影天堂av| 久久精品a一级国产免视看成人| 国产亚洲精品一区二555| 欧美18hd| 午夜精品久久久久久久99热 | 亚洲国产高清一区| 久久久久久久久久久视频| 久久综合影音| 国产不卡的av| 99精品在线免费| 成人无码av片在线观看| 亚洲精品国产成人久久av盗摄 | 欧美日韩中文一区| 一区二区久久精品66国产精品| 日韩视频不卡中文| 日本大片在线观看| 久久影视电视剧免费网站清宫辞电视| aa在线视频| 国产成人精品久久二区二区91| 日日夜夜亚洲| 精品国产乱码久久久久久88av| 成人影院在线| 人人妻人人澡人人爽欧美一区双 | 91大神在线网站| 欧美黄色片在线观看| 都市激情综合| 成人国产一区二区| 日韩精品dvd| 老太脱裤子让老头玩xxxxx| 久久精品久久精品| 日本黄色录像片| 亚洲少妇屁股交4| aaaaaa毛片| 精品免费视频一区二区| 超碰在线影院| 7m精品福利视频导航| 电影中文字幕一区二区| 日本电影一区二区三区| 欧美久久综合| 亚洲怡红院在线| 久久久久久久精| 国产亚洲第一页| 欧美女孩性生活视频| 天堂网www中文在线| 九九九热精品免费视频观看网站| 日韩一区二区三区免费视频| 快播日韩欧美| 激情另类综合| 国产在线视频三区| 国产精品区一区二区三区| 香蕉影院在线观看| 日韩av网址在线观看| 国产不卡在线| 国产日韩在线精品av| 国产精选一区| 欧美在线观看成人| 国产成人激情av| 私库av在线播放| 3d成人h动漫网站入口| av小片在线| 国产成人精品一区| 美女亚洲一区| 欧美黄色免费影院| av在线这里只有精品| 久久久久无码国产精品| 日韩欧美自拍偷拍| 爆操欧美美女| 亚洲精品欧美一区二区三区| 久久激情电影| 五月激情婷婷在线| 国产精品天天看| 夜夜嗨aⅴ一区二区三区| 伊人久久综合97精品| 成人看片网页| 亚洲精品国产精品久久| 美腿丝袜亚洲一区| 中文乱码字幕高清一区二区| 欧美日韩一区二区欧美激情| 在线看黄色av| 国产主播喷水一区二区| 999精品在线| 亚洲精品mv在线观看| 亚洲色图视频网| www.日韩高清| 欧美极品美女电影一区| 国产精品17p| www黄色日本| 欧美韩国日本综合| 在线黄色av网站| 欧美美女18p| 国偷自产av一区二区三区| 91猫先生在线| 国产精品美女久久久久久 | 亚洲护士老师的毛茸茸最新章节| 丁香花视频在线观看| 精品视频高清无人区区二区三区| 欧美中文日韩| 91动漫免费网站| 欧美成人一区二区三区在线观看 | 国产精品揄拍一区二区| 天天色综合色| 久久久久久久人妻无码中文字幕爆| 欧美日韩一区二区精品| 福利成人在线观看| 91色中文字幕| 亚洲日本成人| 欧美黄色高清视频| 日韩一区二区三区av| 日韩精品美女| 一区二区免费电影| 国产999精品久久久久久| 亚洲免费在线视频观看| 中文字幕精品一区二区精品| 日韩免费一级| 国产无套内射久久久国产| 亚洲欧洲一区二区在线播放| 成人午夜视频一区二区播放| 日本欧美一二三区| 91精品国产调教在线观看| 久久久久亚洲AV成人无码国产| 欧美性色黄大片手机版| 婷婷色在线资源| 欧美极品日韩| 国产高清不卡一区二区| 日本视频在线观看免费| 欧美成人合集magnet| 亚洲人成伊人成综合图片| 婷婷中文字幕在线观看| 狠狠色狠狠色综合日日五| 日本不卡三区| 欧美三级电影在线播放| 国产999精品久久久久久绿帽| 免费一级a毛片| 97在线免费观看| 亚洲女同一区| 极品蜜桃臀肥臀-x88av|