国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

基于Pytorch的從零開始的目標(biāo)檢測(cè) | 附源碼

開發(fā)
本文將討論圖像中只有一個(gè)感興趣的對(duì)象的情況。這里的重點(diǎn)更多是關(guān)于如何讀取圖像及其邊界框、調(diào)整大小和正確執(zhí)行增強(qiáng),而不是模型本身。

引言

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

本文將討論圖像中只有一個(gè)感興趣的對(duì)象的情況。這里的重點(diǎn)更多是關(guān)于如何讀取圖像及其邊界框、調(diào)整大小和正確執(zhí)行增強(qiáng),而不是模型本身。目標(biāo)是很好地掌握對(duì)象檢測(cè)背后的基本思想,你可以對(duì)其進(jìn)行擴(kuò)展以更好地理解更復(fù)雜的技術(shù)。

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

問題陳述

給定一個(gè)由路標(biāo)組成的圖像,預(yù)測(cè)路標(biāo)周圍的包圍盒,并識(shí)別路標(biāo)的類型。這些路標(biāo)包括以下四種:

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

這就是所謂的多任務(wù)學(xué)習(xí)問題,因?yàn)樗婕皥?zhí)行兩個(gè)任務(wù): 1)回歸找到包圍盒坐標(biāo),2)分類識(shí)別道路標(biāo)志的類型。

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

我使用了來自 Kaggle 的道路標(biāo)志檢測(cè)數(shù)據(jù)集,鏈接如下:https://www.kaggle.com/andrewmvd/road-sign-detection

它由877張圖像組成。這是一個(gè)相當(dāng)不平衡的數(shù)據(jù)集,大多數(shù)圖像屬于限速類,但由于我們更關(guān)注邊界框預(yù)測(cè),因此可以忽略不平衡。

2.加載數(shù)據(jù)

每個(gè)圖像的注釋都存儲(chǔ)在單獨(dú)的 XML 文件中。我按照以下步驟創(chuàng)建了訓(xùn)練數(shù)據(jù)集:

  • 遍歷訓(xùn)練目錄以獲得所有.xml 文件的列表。
  • 使用xml.etree.ElementTree解析.xml文件。
  • 創(chuàng)建一個(gè)由文件路徑、寬度、高度、邊界框坐標(biāo)( xmin 、 xmax 、 ymin 、 ymax )和每個(gè)圖像的類組成的字典,并將字典附加到列表中。
  • 使用圖像統(tǒng)計(jì)數(shù)據(jù)字典列表創(chuàng)建一個(gè) Pandas 數(shù)據(jù)庫。
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)
  • 標(biāo)簽編碼類列
#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.調(diào)整圖像和邊界框的大小

由于訓(xùn)練一個(gè)計(jì)算機(jī)視覺模型需要的圖像是相同的大小,我們需要調(diào)整我們的圖像和他們相應(yīng)的包圍盒。調(diào)整圖像的大小很簡(jiǎn)單,但是調(diào)整包圍盒的大小有點(diǎn)棘手,因?yàn)槊總€(gè)包圍盒都與圖像及其尺寸相關(guān)。

下面是調(diào)整包圍盒大小的工作原理:

  • 將邊界框轉(zhuǎn)換為與其對(duì)應(yīng)的圖像大小相同的圖像(稱為掩碼)。這個(gè)掩碼只有 0 表示背景,1 表示邊界框覆蓋的區(qū)域。

  • 將掩碼調(diào)整到所需的尺寸。

從調(diào)整完大小的掩碼中提取邊界框坐標(biāo)。

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.數(shù)據(jù)增強(qiáng)

數(shù)據(jù)增強(qiáng)是一種通過使用現(xiàn)有圖像的不同變體創(chuàng)建新的訓(xùn)練圖像來更好地概括我們的模型的技術(shù)。我們當(dāng)前的訓(xùn)練集中只有 800 張圖像,因此數(shù)據(jù)增強(qiáng)對(duì)于確保我們的模型不會(huì)過擬合非常重要。

對(duì)于這個(gè)問題,我使用了翻轉(zhuǎn)、旋轉(zhuǎn)、中心裁剪和隨機(jī)裁剪。

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

# 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 數(shù)據(jù)集

現(xiàn)在我們已經(jīng)有了數(shù)據(jù)增強(qiáng),我們可以進(jìn)行訓(xùn)練驗(yàn)證拆分并創(chuàng)建我們的 PyTorch 數(shù)據(jù)集。我們使用 ImageNet 統(tǒng)計(jì)數(shù)據(jù)對(duì)圖像進(jìn)行標(biāo)準(zhǔn)化,因?yàn)槲覀兪褂玫氖穷A(yù)訓(xùn)練的 ResNet 模型并在訓(xùn)練時(shí)在我們的數(shù)據(jù)集中應(yīng)用數(shù)據(jù)增強(qiáng)。

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 模型

對(duì)于這個(gè)模型,我使用了一個(gè)非常簡(jiǎn)單的預(yù)先訓(xùn)練的 resNet-34模型。由于我們有兩個(gè)任務(wù)要完成,這里有兩個(gè)最后的層: 包圍盒回歸器和圖像分類器。

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.訓(xùn)練

對(duì)于損失,我們需要同時(shí)考慮分類損失和邊界框回歸損失,因此我們使用交叉熵和 L1 損失(真實(shí)值和預(yù)測(cè)坐標(biāo)之間的所有絕對(duì)差之和)的組合。我已經(jīng)將 L1 損失縮放了 1000 倍,因?yàn)榉诸惡突貧w損失都在相似的范圍內(nèi)。除此之外,它是一個(gè)標(biāo)準(zhǔn)的 PyTorch 訓(xùn)練循環(huán)(使用 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.測(cè)試

現(xiàn)在我們已經(jīng)完成了訓(xùn)練,我們可以選擇一個(gè)隨機(jī)圖像并在上面測(cè)試我們的模型。盡管我們只有相當(dāng)少量的訓(xùn)練圖像,但是我們最終在測(cè)試圖像上得到了一個(gè)相當(dāng)不錯(cuò)的預(yù)測(cè)。

使用手機(jī)拍攝真實(shí)照片并測(cè)試模型將是一項(xiàng)有趣的練習(xí)。另一個(gè)有趣的實(shí)驗(yàn)是不執(zhí)行任何數(shù)據(jù)增強(qiáng)并訓(xùn)練模型并比較兩個(gè)模型。

# 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

總結(jié)

現(xiàn)在我們已經(jīng)介紹了目標(biāo)檢測(cè)的基本原理,并從頭開始實(shí)現(xiàn)它,您可以將這些想法擴(kuò)展到多對(duì)象情況,并嘗試更復(fù)雜的模型,如 RCNN 和 YOLO!

責(zé)任編輯:趙寧寧 來源: 小白玩轉(zhuǎn)Python
相關(guān)推薦

2024-11-18 17:31:27

2021-10-13 08:21:52

Java websocket Java 基礎(chǔ)

2015-11-17 16:11:07

Code Review

2019-01-18 12:39:45

云計(jì)算PaaS公有云

2018-04-18 07:01:59

Docker容器虛擬機(jī)

2024-12-06 17:02:26

2020-07-02 15:32:23

Kubernetes容器架構(gòu)

2020-02-11 16:49:24

React前端代碼

2018-08-20 08:15:50

編程語言Go語言切片

2024-09-18 08:10:06

2024-10-05 00:00:06

HTTP請(qǐng)求處理容器

2018-11-27 11:58:34

Python人臉識(shí)別編程語言

2010-05-26 17:35:08

配置Xcode SVN

2018-09-14 17:16:22

云計(jì)算軟件計(jì)算機(jī)網(wǎng)絡(luò)

2013-07-11 10:03:36

JavaScript框架

2018-04-16 16:31:56

前端開發(fā)從零開始

2024-11-27 16:25:54

JVMJIT編譯機(jī)制

2017-03-14 14:04:24

Python機(jī)器學(xué)習(xí)

2024-05-15 14:29:45

2013-07-10 10:38:48

JavaScript框
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

一本久道久久久| gogogo免费视频观看亚洲一| 国产日韩精品视频| 亚洲精品自拍| 中文字幕日韩在线观看| 色综合久久久| 97人人爽人人喊人人模波多| 欧美h版在线观看| 成人激情视频在线| 六月丁香婷婷色狠狠久久| 免费在线观看的av网站| 午夜不卡在线视频| 天堂√中文最新版在线| 欧美中文字幕一区二区三区| 色的视频在线免费看| 日韩精品高清在线观看| 日本天堂在线观看| 中文字幕日韩免费视频| 精品国产aⅴ| 天堂а√在线中文在线| 欧美亚洲国产一区在线观看网站| 日韩经典一区| 国产成人亚洲欧美| 国产成人午夜99999| 日韩欧美亚洲v片| 牛牛影视久久网| 日韩电影天堂视频一区二区| 亚洲一区在线观看视频| 拍真实国产伦偷精品| 美女扒开尿口让男人操亚洲视频网站| 色婷婷热久久| 99热手机在线| 在线亚洲一区二区| 午夜激情在线播放| 91久久精品一区| 亚洲久草在线视频| 成人性生交大片免费看96| 91精品啪在线观看麻豆免费| 日韩黄色免费网站| 可播放的18gay1069| 日韩欧美成人免费视频| 欧美日韩xxxx| 天天干天天玩天天操| 国产视频欧美视频| 亚洲激情二区| 性欧美video高清bbw| 国产亚洲情侣一区二区无| kk眼镜猥琐国模调教系列一区二区| 超鹏97在线| 一级二级三级欧美| 亚洲国语精品自产拍在线观看| 老司机精品视频网站| 亚洲jizzjizz妇女| 国产精国产精品| 精品久久久久久久久久久久久| 精品淫伦v久久水蜜桃| 国产网站免费观看| 国产一区私人高清影院| 亚洲精品乱码久久久久久久久 | 一区二区三区四区在线视频| 精品国产伦理网| 成人福利电影精品一区二区在线观看| 91视频成人| 免费av网页| 日韩影院一区| 欧美日韩国产成人在线观看| 亚洲综合在线第一页| 中文乱码免费一区二区三区下载| av激情在线| 奇米777影视成人四色| 欧美日韩国产美| 欧美亚洲高清| 性视频一区二区三区| 在线一区高清| 国产成人午夜视频网址| 亚洲精品一二三四区| 在线综合欧美| av成人资源| 亚洲国产精品va在线观看黑人| 99re免费视频精品全部| 亚洲激情社区| 老司机成人在线| 后进极品白嫩翘臀在线播放| 一本久道中文无码字幕av| 国产一级二级三级精品| 久久精品成人欧美大片古装| 色综合久久天天| 免费精品99久久国产综合精品| 大型av综合网站| 日韩精品专区| 成人高清免费观看mv| 午夜a成v人精品| 国产呦精品一区二区三区网站| 欧美亚洲福利| 日本免费不卡| 色多多视频在线播放| 在线综合视频网站| 亚洲淫片在线视频| 日韩电影毛片| 夜色福利资源站www国产在线视频| 视频在线一区二区三区| 国产欧美一区二区三区在线看| 午夜久久久影院| 久久久久综合网| 久久精品国产68国产精品亚洲| 欧美xxx网站| 国产夫妻在线视频| 国产精品拍拍拍| 免费网站在线观看视频| 青青草成人激情在线| 欧美精品制服第一页| 亚洲免费福利视频| 亚洲香蕉成人av网站在线观看| 欧美岛国在线观看| 在线一区二区观看| 久久av中文字幕片| 蜜臀va亚洲va欧美va天堂| 伊人精品视频| 综合一区av| 婷婷精品进入| 欧美顶级大胆免费视频| 成人在线中文| www.久久东京| 2023国产精品久久久精品双| 国产精品日韩| 国产麻豆精品视频| 欧美精品激情| 成人毛片在线| 国产精品探花在线观看| 亚洲91精品| 欧美日韩国产传媒| 国产毛片久久| 成+人+亚洲+综合天堂| 亚洲国产日韩在线一区模特| 欧美精品日韩一本| 欧美成人亚洲成人日韩成人| 国产精品一区久久久| 精品一区日韩成人| 五月天婷婷激情视频| 成人在线观看网站| 四虎影视成人| 亚洲第一论坛sis| 日韩国产欧美在线观看| 久久久久久久综合日本| 午夜精品成人在线视频| 亚洲精品国产福利| 国产成人精品电影久久久| www.久久草| 成人免费视频网站在线看| 欧美黄色小说| 精品少妇一区| 丁香婷婷综合五月| 亚洲日本韩国一区| 亚洲图片欧美午夜| 欧美激情论坛| 成人av影视| 黄色软件视频在线观看| 国内成人自拍| 亚洲欧洲色图综合| 91精品国产91热久久久做人人| 国产精品高清在线观看| 精品国产免费久久久久久尖叫| 91九色国产ts另类人妖| 日本不卡视频一区二区| 国产一二区在线| 亚洲国产网址| 亚洲国产精品传媒在线观看| 91精品国产综合久久久久| 久久久久久久久亚洲| 91动漫在线看| 绿色成人影院| 嫩呦国产一区二区三区av| 久久精品国产www456c0m| 亚洲成人免费看| 国产精品久久99久久| 精品国产一区二区三区无码| 日本不卡网站| 国产91久久精品一区二区| 天堂午夜影视日韩欧美一区二区| 欧美亚洲综合色| 成人黄色片网站| 最新中文字幕在线观看| 搜成人激情视频| 美女视频黄 久久| 欧美这里有精品| 亚洲图片小说在线| 50度灰在线| 午夜国产一区二区| 欧美日韩免费在线观看| 国产精品入口免费视| 热久久精品免费视频| 亚洲国产尤物| 青青草原综合久久大伊人精品优势 | 97色伦亚洲国产| www浪潮av99com| 91久久青草| 精品日韩中文字幕| 美女视频久久| 色猫av在线| 91久久夜色精品国产按摩|