日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

pytorch时空数据处理4——图像转文本/字幕Image-Captionning(二)

發(fā)布時間:2023/12/31 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pytorch时空数据处理4——图像转文本/字幕Image-Captionning(二) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

pytorch時空數(shù)據(jù)處理4——圖像轉(zhuǎn)文本/字幕Image-Captionning(二)

  • pytorch時空數(shù)據(jù)處理4——圖像轉(zhuǎn)文本/字幕Image-Captionning(二)
    • Dataset
    • Inputs to model
    • Caption Lengths
    • Data pipeline
    • Encoder
    • Attention
    • Decoder
    • 代碼
      • 數(shù)據(jù)集初始化 create_input_files.py
      • 訓(xùn)練 train.py
      • 測試

pytorch時空數(shù)據(jù)處理4——圖像轉(zhuǎn)文本/字幕Image-Captionning(二)

書接上文,本篇主要講解工程代碼結(jié)構(gòu)和代碼運(yùn)行。
代碼來源:git

Dataset

我正在使用MSCOCO '14數(shù)據(jù)集。您需要下載訓(xùn)練(13GB)和驗(yàn)證(6GB)。
我們將使用安德烈·卡帕西的訓(xùn)練、驗(yàn)證和測試分割方法。這個壓縮文件包含標(biāo)題。您還可以找到FlushT 8K和FlushT 30K數(shù)據(jù)集的拆分和標(biāo)題,所以如果MSCOCO對您的計(jì)算機(jī)來說太大,請隨意使用它們來代替MSCOCO。

Inputs to model

圖像由于我們使用的是預(yù)處理編碼器,我們需要將圖像處理成預(yù)處理編碼器習(xí)慣的形式。
預(yù)訓(xùn)練的ImageNet模型可作為PyTorch的torchvision模塊的一部分。論文原文詳細(xì)說明了我們需要執(zhí)行的預(yù)處理或轉(zhuǎn)換——像素值必須在[0,1]范圍內(nèi),然后我們必須通過ImageNet圖像的RGB通道的平均值和標(biāo)準(zhǔn)偏差對圖像進(jìn)行歸一化。

mean = [0.485, 0.456, 0.406] std = [0.229, 0.224, 0.225]

此外,PyTorch遵循NCHW慣例,這意味著通道尺寸?必須在尺寸尺寸之前。我們將調(diào)整所有MSCOCO圖像的大小為256x256,以保持一致性。因此,饋送到模型的圖像必須是維度為N,3,256,256的浮動張量,并且必須通過前述的平均值和標(biāo)準(zhǔn)偏差進(jìn)行歸一化。n為批量大小。字幕字幕是解碼器的目標(biāo)和輸入,因?yàn)槊總€單詞都用來生成下一個單詞。然而,要生成第一個單詞,我們需要第零個單詞< start >。最后,我們應(yīng)該預(yù)測解碼器必須學(xué)會預(yù)測字幕的結(jié)束。這是必要的,因?yàn)槲覀冃枰涝谕评磉^程中什么時候停止解碼。
例如:<start> a man holds a football <end>
因?yàn)槲覀儗?biāo)題作為固定大小的張量傳遞,所以我們需要用< pad >標(biāo)記將標(biāo)題(自然長度可變)填充到相同的長度。
<start> a man holds a football <end> <pad> <pad> <pad>…
此外,我們創(chuàng)建一個word_map,它是語料庫中每個單詞的索引映射,包括<start>,<end>和<pad>標(biāo)記。像其他庫一樣,PyTorch也需要編碼為索引的單詞來為其查找嵌入或標(biāo)識其在預(yù)測單詞分?jǐn)?shù)中的位置。
例如:9876 1 5 120 1 5406 9877 9878 9878 9878…
因此,提供給模型的字幕必須是尺寸為N,L的Int張量,其中L是填充長度。

Caption Lengths

由于字幕是填充的,因此我們需要跟蹤每個字幕的長度。這是實(shí)際長度+ 2(對于和標(biāo)記)。
字幕長度也很重要,因?yàn)槟梢允褂肞yTorch構(gòu)建動態(tài)圖形。我們僅處理序列的長度,并且不會在上浪費(fèi)計(jì)算量。
因此,提供給模型的字幕長度必須是維度N的Int張量。

Data pipeline

請參閱utils.py中的create_input_files()。

  • 這將讀取下載的數(shù)據(jù)并保存以下文件–一個HDF5文件,該文件包含I,3、256、256張量中每個分割的圖像,其中I是分割中的圖像數(shù)。像素值仍在[0,255]范圍內(nèi),并存儲為無符號8位Ints。
  • 每個分割的JSON文件,其中包含N_c *I編碼的字幕列表,其中N_c是每個圖像采樣的字幕數(shù)量。這些標(biāo)題與HDF5文件中的圖像的順序相同。因此,第i個標(biāo)題將對應(yīng)于第i //N_cth個圖像。
  • 每個分割的JSON文件,其中包含N_c * I字幕長度列表。 ith值是ith標(biāo)題的長度,它對應(yīng)于i // N_cth圖像。
  • 一個包含word_map(單詞到索引的字典)的JSON文件。
  • 在我們保存這些文件,我們可以選擇只使用字幕是短于閾值,并且倉不太頻繁的話到標(biāo)記。
    我們將HDF5文件用于圖像,因?yàn)槲覀儗⒃谟?xùn)練/驗(yàn)證期間直接從磁盤讀取它們。它們太大了,無法一次放入RAM。但是我們確實(shí)將所有字幕及其長度加載到內(nèi)存中。
    請參閱datasets.py中的CaptionDataset。
    這是PyTorch數(shù)據(jù)集的子類。它需要定義一個__len__方法,該方法返回?cái)?shù)據(jù)集的大小,以及一個__getitem__方法,該方法返回第i個圖像,標(biāo)題和標(biāo)題長度。
    我們從磁盤讀取圖像,將像素轉(zhuǎn)換為[0,255],然后在此類內(nèi)對其進(jìn)行規(guī)范化。
    PyTorch DataLoader在train.py中將使用該數(shù)據(jù)集,以創(chuàng)建一批數(shù)據(jù)并將其饋送到模型中以進(jìn)行訓(xùn)練或驗(yàn)證。

    Encoder

    請參閱models.py中的編碼器。
    我們使用PyTorch的Torchvision模塊中已經(jīng)提供的經(jīng)過預(yù)訓(xùn)練的ResNet-101。丟棄最后兩層(池化層和線性層),因?yàn)槲覀冎恍枰獙D像進(jìn)行編碼,而無需對其進(jìn)行分類。
    我們確實(shí)添加了AdaptiveAvgPool2d()層,以將編碼大小調(diào)整為固定大小。這樣就可以將可變大小的圖像饋送到編碼器。 (但是,我們確實(shí)將輸入圖像的大小調(diào)整為256、256,因?yàn)槲覀儽仨殞⑺鼈兇鎯閱蝹€張量。)由于我們可能想對編碼器進(jìn)行微調(diào),因此我們添加了fine_tune()方法來啟用或禁用計(jì)算編碼器參數(shù)的梯度。我們僅在ResNet中微調(diào)卷積塊2到4,因?yàn)榈谝粋€卷積塊通常會學(xué)到一些非常重要的圖像處理基礎(chǔ)知識,例如檢測直線,邊緣,曲線等。我們不會打亂基準(zhǔn)特征。

    Attention

    請參閱models.py中的Attention。
    注意網(wǎng)絡(luò)很簡單–它僅由線性層和幾個激活組成。
    單獨(dú)的線性層將解碼器的編碼圖像(展平為N,14 * 14,2048)和隱藏狀態(tài)(輸出)都轉(zhuǎn)換為相同尺寸,即。注意大小。然后添加它們并激活ReLU。第三線性層將此結(jié)果轉(zhuǎn)換為1的維度,隨后我們應(yīng)用softmax生成權(quán)重alpha。

    Decoder

    請參閱models.py中的DecoderWithAttention。
    此處接收編碼器的輸出,并將其展平為N,14 * 14,2048尺寸。這很方便,并且避免了多次調(diào)整張量的形狀。
    我們使用init_hidden_??state()方法使用編碼圖像初始化LSTM的隱藏狀態(tài)和單元狀態(tài),該方法使用兩個單獨(dú)的線性層。
    首先,我們通過減少字幕長度來對N個圖像和字幕進(jìn)行排序。這樣一來,我們只能處理有效的時間步,即不能處理。

    我們可以遍歷每個時間步,僅處理有色區(qū)域,該區(qū)域是該時間步的有效批次大小N_t。通過排序,可以使任何時間步長的頂部N_t與上一步的輸出對齊。例如,在第三時間步,我們使用上一步的前5個輸出僅處理前5個圖像。
    使用PyTorch LSTMCell在for循環(huán)中手動執(zhí)行此迭代,而不是使用PyTorch LSTM在沒有循環(huán)的情況下自動迭代。這是因?yàn)槲覀冃枰诿總€解碼步驟之間執(zhí)行Attention機(jī)制。 LSTMCell是單個時間步操作,而LSTM將連續(xù)地在多個時間步上迭代并立即提供所有輸出。
    我們使用Attention網(wǎng)絡(luò)在每個時間步計(jì)算權(quán)重和注意力加權(quán)編碼。在論文的第4.2.1節(jié)中,他們建議通過濾波器或門傳遞注意力加權(quán)編碼。此門是解碼器先前隱藏狀態(tài)的S型激活線性變換。作者指出,這有助于Attention網(wǎng)絡(luò)將更多的重點(diǎn)放在圖像中的對象上。
    我們將過濾后的注意力加權(quán)編碼與上一個單詞的嵌入(開始)連接起來,然后運(yùn)行LSTMCell生成新的隱藏狀態(tài)(或輸出)。線性層將這種新的隱藏狀態(tài)轉(zhuǎn)換為詞匯表中每個單詞的分?jǐn)?shù),并將其存儲起來。
    我們還存儲每個時間步長的注意力網(wǎng)絡(luò)返回的權(quán)重。您會很快明白為什么。

    代碼

    數(shù)據(jù)集初始化 create_input_files.py

    為了快速訓(xùn)練和跑通
    選擇使用flickr8k數(shù)據(jù)集,樣本量較小,調(diào)整和訓(xùn)練都節(jié)約時間。

    from utils import create_input_filesif __name__ == '__main__':# Create input files (along with word map)create_input_files(dataset='flickr8k',karpathy_json_path='/home/wy/docker/resource/cocodataset/dataset_flickr8k.json',image_folder='/home/wy/docker/resource/cocodataset/Flickr8k/Flicker8k_Dataset',captions_per_image=5,min_word_freq=5,output_folder='/home/wy/docker/resource/cocodataset/Flickr8k/data',max_len=50)

    訓(xùn)練 train.py

    原文代碼pytorch0.4 這里的代碼是修改后可以在 pytorch1.0以后版本可以運(yùn)行的。

    import time import torch.backends.cudnn as cudnn import torch.optim import torch.utils.data import torchvision.transforms as transforms from torch import nn from torch.nn.utils.rnn import pack_padded_sequence from models import Encoder, DecoderWithAttention from datasets import * from utils import * from nltk.translate.bleu_score import corpus_bleu torch.cuda.set_device(9)# Data parameters data_folder = '/home/wy/docker/resource/cocodataset/Flickr8k/data' # folder with data files saved by create_input_files.py data_name = 'flickr8k_5_cap_per_img_5_min_word_freq' # base name shared by data files# Model parameters emb_dim = 512 # dimension of word embeddings attention_dim = 512 # dimension of attention linear layers decoder_dim = 512 # dimension of decoder RNN dropout = 0.5 device = torch.device("cuda" if torch.cuda.is_available() else "cpu") # sets device for model and PyTorch tensors cudnn.benchmark = True # set to true only if inputs to model are fixed size; otherwise lot of computational overhead# Training parameters start_epoch = 0 epochs = 10 # number of epochs to train for (if early stopping is not triggered) epochs_since_improvement = 0 # keeps track of number of epochs since there's been an improvement in validation BLEU batch_size = 32 workers = 1 # for data-loading; right now, only 1 works with h5py encoder_lr = 1e-4 # learning rate for encoder if fine-tuning decoder_lr = 4e-4 # learning rate for decoder grad_clip = 5. # clip gradients at an absolute value of alpha_c = 1. # regularization parameter for 'doubly stochastic attention', as in the paper best_bleu4 = 0. # BLEU-4 score right now print_freq = 100 # print training/validation stats every __ batches fine_tune_encoder = False # fine-tune encoder? checkpoint = None # path to checkpoint, None if nonedef main():"""Training and validation."""global best_bleu4, epochs_since_improvement, checkpoint, start_epoch, fine_tune_encoder, data_name, word_map# Read word mapword_map_file = os.path.join(data_folder, 'WORDMAP_' + data_name + '.json')with open(word_map_file, 'r') as j:word_map = json.load(j)# Initialize / load checkpointif checkpoint is None:decoder = DecoderWithAttention(attention_dim=attention_dim,embed_dim=emb_dim,decoder_dim=decoder_dim,vocab_size=len(word_map),dropout=dropout)decoder_optimizer = torch.optim.Adam(params=filter(lambda p: p.requires_grad, decoder.parameters()),lr=decoder_lr)encoder = Encoder()encoder.fine_tune(fine_tune_encoder)encoder_optimizer = torch.optim.Adam(params=filter(lambda p: p.requires_grad, encoder.parameters()),lr=encoder_lr) if fine_tune_encoder else Noneelse:checkpoint = torch.load(checkpoint)start_epoch = checkpoint['epoch'] + 1epochs_since_improvement = checkpoint['epochs_since_improvement']best_bleu4 = checkpoint['bleu-4']decoder = checkpoint['decoder']decoder_optimizer = checkpoint['decoder_optimizer']encoder = checkpoint['encoder']encoder_optimizer = checkpoint['encoder_optimizer']if fine_tune_encoder is True and encoder_optimizer is None:encoder.fine_tune(fine_tune_encoder)encoder_optimizer = torch.optim.Adam(params=filter(lambda p: p.requires_grad, encoder.parameters()),lr=encoder_lr)# Move to GPU, if availabledecoder = decoder.to(device)encoder = encoder.to(device)# Loss functioncriterion = nn.CrossEntropyLoss().to(device)# Custom dataloadersnormalize = transforms.Normalize(mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225])train_loader = torch.utils.data.DataLoader(CaptionDataset(data_folder, data_name, 'TRAIN', transform=transforms.Compose([normalize])),batch_size=batch_size, shuffle=True, num_workers=workers, pin_memory=True)val_loader = torch.utils.data.DataLoader(CaptionDataset(data_folder, data_name, 'VAL', transform=transforms.Compose([normalize])),batch_size=batch_size, shuffle=True, num_workers=workers, pin_memory=True)# Epochsfor epoch in range(start_epoch, epochs):# Decay learning rate if there is no improvement for 8 consecutive epochs, and terminate training after 20if epochs_since_improvement == 20:breakif epochs_since_improvement > 0 and epochs_since_improvement % 8 == 0:adjust_learning_rate(decoder_optimizer, 0.8)if fine_tune_encoder:adjust_learning_rate(encoder_optimizer, 0.8)# One epoch's trainingtrain(train_loader=train_loader,encoder=encoder,decoder=decoder,criterion=criterion,encoder_optimizer=encoder_optimizer,decoder_optimizer=decoder_optimizer,epoch=epoch)# One epoch's validationrecent_bleu4 = validate(val_loader=val_loader,encoder=encoder,decoder=decoder,criterion=criterion)# Check if there was an improvementis_best = recent_bleu4 > best_bleu4best_bleu4 = max(recent_bleu4, best_bleu4)if not is_best:epochs_since_improvement += 1print("\nEpochs since last improvement: %d\n" % (epochs_since_improvement,))else:epochs_since_improvement = 0# Save checkpoint 保存在utils包里面,全部倒導(dǎo)入的。save_checkpoint(data_name, epoch, epochs_since_improvement, encoder, decoder, encoder_optimizer,decoder_optimizer, recent_bleu4, is_best)def train(train_loader, encoder, decoder, criterion, encoder_optimizer, decoder_optimizer, epoch):"""Performs one epoch's training.:param train_loader: DataLoader for training data:param encoder: encoder model:param decoder: decoder model:param criterion: loss layer:param encoder_optimizer: optimizer to update encoder's weights (if fine-tuning):param decoder_optimizer: optimizer to update decoder's weights:param epoch: epoch number"""decoder.train() # train mode (dropout and batchnorm is used)encoder.train()#utils 方法 AverageMeterbatch_time = AverageMeter() # forward prop. + back prop. timedata_time = AverageMeter() # data loading timelosses = AverageMeter() # loss (per word decoded)top5accs = AverageMeter() # top5 accuracystart = time.time()# Batchesfor i, (imgs, caps, caplens) in enumerate(train_loader):data_time.update(time.time() - start)# Move to GPU, if availableimgs = imgs.to(device)caps = caps.to(device)caplens = caplens.to(device)# Forward prop.imgs = encoder(imgs)scores, caps_sorted, decode_lengths, alphas, sort_ind = decoder(imgs, caps, caplens)# Since we decoded starting with <start>, the targets are all words after <start>, up to <end>targets = caps_sorted[:, 1:]# Remove timesteps that we didn't decode at, or are pads# pack_padded_sequence is an easy trick to do thisscores = pack_padded_sequence(scores, decode_lengths, batch_first=True).datatargets = pack_padded_sequence(targets, decode_lengths, batch_first=True).data# Calculate lossloss = criterion(scores, targets)# Add doubly stochastic attention regularizationloss += alpha_c * ((1. - alphas.sum(dim=1)) ** 2).mean()# Back prop.decoder_optimizer.zero_grad()if encoder_optimizer is not None:encoder_optimizer.zero_grad()loss.backward()# Clip gradientsif grad_clip is not None:clip_gradient(decoder_optimizer, grad_clip)if encoder_optimizer is not None:clip_gradient(encoder_optimizer, grad_clip)# Update weightsdecoder_optimizer.step()if encoder_optimizer is not None:encoder_optimizer.step()# Keep track of metricstop5 = accuracy(scores, targets, 5)losses.update(loss.item(), sum(decode_lengths))top5accs.update(top5, sum(decode_lengths))batch_time.update(time.time() - start)start = time.time()# Print statusif i % print_freq == 0:print('Epoch: [{0}][{1}/{2}]\t''Batch Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t''Data Load Time {data_time.val:.3f} ({data_time.avg:.3f})\t''Loss {loss.val:.4f} ({loss.avg:.4f})\t''Top-5 Accuracy {top5.val:.3f} ({top5.avg:.3f})'.format(epoch, i, len(train_loader),batch_time=batch_time,data_time=data_time, loss=losses,top5=top5accs))def validate(val_loader, encoder, decoder, criterion):"""Performs one epoch's validation.:param val_loader: DataLoader for validation data.:param encoder: encoder model:param decoder: decoder model:param criterion: loss layer:return: BLEU-4 score"""decoder.eval() # eval mode (no dropout or batchnorm)if encoder is not None:encoder.eval()batch_time = AverageMeter()losses = AverageMeter()top5accs = AverageMeter()start = time.time()references = list() # references (true captions) for calculating BLEU-4 scorehypotheses = list() # hypotheses (predictions)# explicitly disable gradient calculation to avoid CUDA memory error# solves the issue #57with torch.no_grad():# Batchesfor i, (imgs, caps, caplens, allcaps) in enumerate(val_loader):# Move to device, if availableimgs = imgs.to(device)caps = caps.to(device)caplens = caplens.to(device)# Forward prop.if encoder is not None:imgs = encoder(imgs)scores, caps_sorted, decode_lengths, alphas, sort_ind = decoder(imgs, caps, caplens)# Since we decoded starting with <start>, the targets are all words after <start>, up to <end>targets = caps_sorted[:, 1:]# Remove timesteps that we didn't decode at, or are pads# pack_padded_sequence is an easy trick to do thisscores_copy = scores.clone()scores = pack_padded_sequence(scores, decode_lengths, batch_first=True).datatargets = pack_padded_sequence(targets, decode_lengths, batch_first=True).data# Calculate lossloss = criterion(scores, targets)# Add doubly stochastic attention regularizationloss += alpha_c * ((1. - alphas.sum(dim=1)) ** 2).mean()# Keep track of metricslosses.update(loss.item(), sum(decode_lengths))top5 = accuracy(scores, targets, 5)top5accs.update(top5, sum(decode_lengths))batch_time.update(time.time() - start)start = time.time()if i % print_freq == 0:print('Validation: [{0}/{1}]\t''Batch Time {batch_time.val:.3f} ({batch_time.avg:.3f})\t''Loss {loss.val:.4f} ({loss.avg:.4f})\t''Top-5 Accuracy {top5.val:.3f} ({top5.avg:.3f})\t'.format(i, len(val_loader), batch_time=batch_time,loss=losses, top5=top5accs))# Store references (true captions), and hypothesis (prediction) for each image# If for n images, we have n hypotheses, and references a, b, c... for each image, we need -# references = [[ref1a, ref1b, ref1c], [ref2a, ref2b], ...], hypotheses = [hyp1, hyp2, ...]# Referencesallcaps = allcaps[sort_ind] # because images were sorted in the decoderfor j in range(allcaps.shape[0]):img_caps = allcaps[j].tolist()img_captions = list(map(lambda c: [w for w in c if w not in {word_map['<start>'], word_map['<pad>']}],img_caps)) # remove <start> and padsreferences.append(img_captions)# Hypotheses_, preds = torch.max(scores_copy, dim=2)preds = preds.tolist()temp_preds = list()for j, p in enumerate(preds):temp_preds.append(preds[j][:decode_lengths[j]]) # remove padspreds = temp_predshypotheses.extend(preds)assert len(references) == len(hypotheses)# Calculate BLEU-4 scoresbleu4 = corpus_bleu(references, hypotheses)print('\n * LOSS - {loss.avg:.3f}, TOP-5 ACCURACY - {top5.avg:.3f}, BLEU-4 - {bleu}\n'.format(loss=losses,top5=top5accs,bleu=bleu4))return bleu4if __name__ == '__main__':main()

    測試

    使用了原git上提供的預(yù)訓(xùn)練模型

    import torch import torch.nn.functional as F import numpy as np import json import torchvision.transforms as transforms import matplotlib.pyplot as plt import matplotlib.cm as cm import skimage.transform import argparse from scipy.misc import imread, imresize from PIL import Imagetorch.cuda.set_device(9)device = torch.device("cuda" if torch.cuda.is_available() else "cpu") print(device)def caption_image_beam_search(encoder, decoder, image_path, word_map, beam_size=3):"""Reads an image and captions it with beam search.:param encoder: encoder model:param decoder: decoder model:param image_path: path to image:param word_map: word map:param beam_size: number of sequences to consider at each decode-step:return: caption, weights for visualization"""k = beam_sizevocab_size = len(word_map)# Read image and processimg = imread(image_path)#當(dāng)為單通道圖像時,轉(zhuǎn)化為三通道if len(img.shape) == 2:img = img[:, :, np.newaxis] #增加緯度img = np.concatenate([img, img, img], axis=2) #拼接為三通道img = imresize(img, (256, 256))img = img.transpose(2, 0, 1)#矩陣轉(zhuǎn)置 通道數(shù)放在前面img = img / 255.img = torch.FloatTensor(img).to(device)normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225])transform = transforms.Compose([normalize])image = transform(img) # (3, 256, 256)# Encodeimage = image.unsqueeze(0) # (1, 3, 256, 256)encoder_out = encoder(image) # (1, enc_image_size, enc_image_size, encoder_dim) 1,14,14,2048enc_image_size = encoder_out.size(1)print('enc_image_size:',enc_image_size)encoder_dim = encoder_out.size(3)print('encoder_dim:',encoder_dim)# Flatten encodingencoder_out = encoder_out.view(1, -1, encoder_dim) # (1, num_pixels, encoder_dim) 1,196,2048#表示了圖像的196個區(qū)域各自的特征# print('encoder_out:',encoder_out)num_pixels = encoder_out.size(1)#第二位 196 #print('num_pixels:',num_pixels)# We'll treat the problem as having a batch size of k#print(encoder_out.size())encoder_out = encoder_out.expand(k, num_pixels, encoder_dim) # (k, num_pixels, encoder_dim)1->k緯度擴(kuò)展,五份特征#print(encoder_out.size())# Tensor to store top k previous words at each step; now they're just <start>k_prev_words = torch.LongTensor([[word_map['<start>']]] * k).to(device) # (k, 1)#print('k_prev_words:',k_prev_words)# Tensor to store top k sequences; now they're just <start>seqs = k_prev_words # (k, 1)# Tensor to store top k sequences' scores; now they're just 0top_k_scores = torch.zeros(k, 1).to(device) # (k, 1)# Tensor to store top k sequences' alphas; now they're just 1s 這里其實(shí)就是存儲每個字對應(yīng)圖像上的關(guān)注區(qū)域,映射在14*14的張量上面seqs_alpha = torch.ones(k, 1, enc_image_size, enc_image_size).to(device) # (k, 1, enc_image_size, enc_image_size)# Lists to store completed sequences, their alphas and scorescomplete_seqs = list()complete_seqs_alpha = list()complete_seqs_scores = list()# Start decodingstep = 1h, c = decoder.init_hidden_state(encoder_out)#h0print('h, c',h.size(),c.size())# s is a number less than or equal to k, because sequences are removed from this process once they hit <end>while True:embeddings = decoder.embedding(k_prev_words).squeeze(1) # (s, embed_dim) (5,隱層512)print('embeddings',embeddings.size())#encode的圖片表示 和 隱狀態(tài)awe, alpha = decoder.attention(encoder_out, h) # (s, encoder_dim), (s, num_pixels)(5,2048(),5,196(attention 存儲字對應(yīng)圖像各部分的權(quán)重))print(' awe, alpha',awe.size(),alpha.size())#0/0alpha = alpha.view(-1, enc_image_size, enc_image_size) # (s, enc_image_size, enc_image_size)(5,14,14)gate = decoder.sigmoid(decoder.f_beta(h)) # gating scalar, (s, encoder_dim)awe = gate * awe#給特征賦予權(quán)重h, c = decoder.decode_step(torch.cat([embeddings, awe], dim=1), (h, c)) # (s, decoder_dim)輸入(512,2048),(512,512)帶權(quán)重的特征和上一次的lstm輸出和細(xì)胞狀態(tài)值scores = decoder.fc(h) # (s, vocab_size)scores = F.log_softmax(scores, dim=1)print('scores',scores.size())# Add 每一句 含有多少詞 更新scores = top_k_scores.expand_as(scores) + scores # (s, vocab_size)print('top_k_scores,scores',top_k_scores.size(),scores.size())# For the first step, all k points will have the same scores (since same k previous words, h, c)if step == 1:top_k_scores, top_k_words = scores[0].topk(k, 0, True, True) # (s)else:# Unroll and find top scores, and their unrolled indicestop_k_scores, top_k_words = scores.view(-1).topk(k, 0, True, True) # (s) 取詞,topprint('top_k_scores,top_k_words',top_k_scores.size(),top_k_words.size())# Convert unrolled indices to actual indices of scoresprev_word_inds = torch.floor_divide(top_k_words, vocab_size)#prev_word_inds = top_k_words / vocab_size # (s)next_word_inds = top_k_words % vocab_size # (s)print('top_k_scores,top_k_words,prev_word_inds,next_word_inds',top_k_words,top_k_scores,prev_word_inds,next_word_inds)# Add new words to sequences, alphasseqs = torch.cat([seqs[prev_word_inds], next_word_inds.unsqueeze(1)], dim=1) # (s, step+1)#詞加一seqs_alpha = torch.cat([seqs_alpha[prev_word_inds], alpha[prev_word_inds].unsqueeze(1)], #詞對應(yīng)圖像區(qū)域加一dim=1) # (s, step+1, enc_image_size, enc_image_size)# Which sequences are incomplete (didn't reach <end>)? 挑出這次循環(huán)完結(jié)的 句子incomplete_inds = [ind for ind, next_word in enumerate(next_word_inds) ifnext_word != word_map['<end>']]complete_inds = list(set(range(len(next_word_inds))) - set(incomplete_inds))# Set aside complete sequences 挑出完整序列if len(complete_inds) > 0:complete_seqs.extend(seqs[complete_inds].tolist()) #追加全部序列complete_seqs_alpha.extend(seqs_alpha[complete_inds].tolist())complete_seqs_scores.extend(top_k_scores[complete_inds])k -= len(complete_inds) # reduce beam length accordingly# Proceed with incomplete sequencesif k == 0:break#更新參數(shù) 只保留未完全序列參數(shù)seqs = seqs[incomplete_inds]seqs_alpha = seqs_alpha[incomplete_inds]h = h[prev_word_inds[incomplete_inds]]c = c[prev_word_inds[incomplete_inds]]encoder_out = encoder_out[prev_word_inds[incomplete_inds]]top_k_scores = top_k_scores[incomplete_inds].unsqueeze(1)k_prev_words = next_word_inds[incomplete_inds].unsqueeze(1)# Break if things have been going on too longif step > 50:breakstep += 1#標(biāo)記 scores分?jǐn)?shù)最高序列作為返回值。i = complete_seqs_scores.index(max(complete_seqs_scores))seq = complete_seqs[i]alphas = complete_seqs_alpha[i]return seq, alphasdef visualize_att(image_path, seq, alphas, rev_word_map, smooth=True):"""Visualizes caption with weights at every word.Adapted from paper authors' repo: https://github.com/kelvinxu/arctic-captions/blob/master/alpha_visualization.ipynb:param image_path: path to image that has been captioned:param seq: caption:param alphas: weights:param rev_word_map: reverse word mapping, i.e. ix2word:param smooth: smooth weights?"""image = Image.open(image_path)image = image.resize([14 * 12, 14 * 12], Image.LANCZOS)words = [rev_word_map[ind] for ind in seq]print(words)for t in range(len(words)):if t > 50:breakplt.subplot(np.ceil(len(words) / 5.), 5, t + 1)plt.text(0, 1, '%s' % (words[t]), color='black', backgroundcolor='white', fontsize=12)plt.imshow(image)current_alpha = alphas[t, :]if smooth:alpha = skimage.transform.pyramid_expand(current_alpha.numpy(), upscale=12, sigma=8)else:alpha = skimage.transform.resize(current_alpha.numpy(), [14 * 12, 14 * 12])if t == 0:plt.imshow(alpha, alpha=0)else:plt.imshow(alpha, alpha=0.8)plt.set_cmap(cm.Greys_r)plt.axis('off')plt.show()import scipyprint(scipy.__version__) checkpoint = torch.load('./BEST_checkpoint_coco_5_cap_per_img_5_min_word_freq.pth.tar', map_location=str(device)) decoder = checkpoint['decoder'] decoder = decoder.to(device) decoder.eval() encoder = checkpoint['encoder'] encoder = encoder.to(device) encoder.eval()# Load word map (word2ix) with open('./WORDMAP_coco_5_cap_per_img_5_min_word_freq.json', 'r') as j:word_map = json.load(j) rev_word_map = {v: k for k, v in word_map.items()} # ix2word # Encode, decode with attention and beam search seq, alphas = caption_image_beam_search(encoder, decoder,'img/q.jpg', word_map,5) alphas = torch.FloatTensor(alphas)# Visualize caption and attention of best sequence visualize_att('img/q.jpg', seq, alphas, rev_word_map,True)

    這里使用了齊天大圣作為測試圖片,輸出很有趣,一個長頭發(fā)的女人在看著相機(jī)。

    更多細(xì)節(jié)請查看原文和git。

    總結(jié)

    以上是生活随笔為你收集整理的pytorch时空数据处理4——图像转文本/字幕Image-Captionning(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    日韩精品中文字幕在线播放 | 久久超碰99 | 日本护士三级少妇三级999 | 玖玖综合网 | 欧美色图狠狠干 | 麻豆小视频在线观看 | 五月天久久综合网 | 97超碰国产精品 | 在线观av| 亚洲综合欧美激情 | 狠狠干成人 | 91黄色成人| 四虎影视久久久 | 亚洲欧美在线视频免费 | 国产女人18毛片水真多18精品 | 欧美a在线看 | 亚洲欧美视频网站 | 国产黄色片久久久 | 黄色小说在线观看视频 | 日本资源中文字幕在线 | 国产精品久久久久久久久久妇女 | 成人在线视频免费 | 亚洲国产精品视频 | 中文字幕婷婷 | 九九欧美视频 | 开心激情五月婷婷 | av日韩国产| 中文字幕免费观看视频 | 久久婷综合 | 欧美日韩网址 | 91在线www| 精品福利网站 | 深夜福利视频在线观看 | 亚洲一区不卡视频 | 999视频网 | 狠狠躁夜夜躁人人爽超碰91 | 国产一线二线三线在线观看 | 中文字幕在线视频国产 | 亚洲一区在线看 | 日韩免费不卡av | 一区二区三区高清在线 | 韩国av电影在线观看 | 男女精品久久 | 欧美十八| 在线天堂中文在线资源网 | 激情欧美xxxx| 国产精品videossex国产高清 | 国产综合片| 九九热1 | 国产资源 | 91精品国自产在线观看欧美 | 狠狠色丁香婷婷综合橹88 | 久色 网| 欧美大荫蒂xxx | 久久亚洲精品国产亚洲老地址 | 久久精品视频在线 | 玖玖玖在线 | 精品在线亚洲视频 | 国产精品美女免费 | 国产精品video爽爽爽爽 | 国产一二区精品 | 五月激情片| 亚洲欧美偷拍另类 | 成人蜜桃视频 | 99精品视频观看 | 激情小说 五月 | 国内外成人免费在线视频 | 日韩区欧美久久久无人区 | 国产手机av在线 | 欧美日韩中文在线视频 | 久久久久黄 | 成人性生交大片免费看中文网站 | 国产精品久久久久久影院 | 成x99人av在线www | 亚洲免费在线播放视频 | 中国一级片在线播放 | 欧美91视频 | 亚洲午夜久久久影院 | 91热爆视频 | 91色蜜桃| 在线观看免费一级片 | 久久国产精品99久久久久久丝袜 | 亚洲黄a| 免费看污的网站 | 亚洲3级 | 日韩激情综合 | 激情五月激情综合网 | 四虎在线观看精品视频 | 国产成人精品一区二区三区 | 国产精品高清免费在线观看 | 日本一区二区高清不卡 | 久久99久国产精品黄毛片入口 | 一区二区三区免费在线观看视频 | 中文国产成人精品久久一 | 亚洲日本精品视频 | 99精品乱码国产在线观看 | 亚洲天堂网在线播放 | 91香蕉国产 | 久艹在线免费观看 | 久久精品国产美女 | 欧美在线视频一区二区 | 婷婷色av | 色爱成人网 | 日韩99热 | 久久婷婷综合激情 | 就要色综合 | 少妇啪啪av入口 | 国产99久久久国产精品 | 午夜国产成人 | 免费观看完整版无人区 | 精品视频久久久 | 五月激情姐姐 | 欧美日韩国产伦理 | 国产精品入口久久 | 国产福利中文字幕 | 日韩高清av | 久久久久久久久久国产精品 | 黄色免费电影网站 | 亚洲精品视频免费看 | 亚洲永久精品一区 | 日韩精品影视 | 在线视频a | 日韩av专区| 精品久久1 | 黄色一级大片在线观看 | 国产成人精品区 | 天天综合网天天 | 亚洲色影爱久久精品 | 国产成人精品综合久久久 | 成人国产精品久久久久久亚洲 | 亚洲国产中文字幕在线 | 欧美国产一区在线 | 日日日操操 | 中文字幕一区在线 | 精品国产一区二区三区蜜臀 | 欧美激情视频在线观看免费 | 国产无限资源在线观看 | 97视频总站| 999久久国产精品免费观看网站 | 69精品视频| 天天色天天上天天操 | 一级大片在线观看 | 婷婷色吧| 免费视频色 | 欧美日在线观看 | 最近中文字幕大全 | 香蕉影院在线 | 精品日韩视频 | 国产精品 视频 | 久久97视频 | 精品国产99 | 欧美日韩亚洲一 | 激情视频综合网 | 91在线播放综合 | 狠狠干中文字幕 | 日韩黄色免费电影 | av免费看在线 | 国产特级毛片aaaaaa高清 | 玖玖精品在线 | 亚洲精品视频一二三 | 一 级 黄 色 片免费看的 | 欧美国产精品久久久久久免费 | 日韩av线观看 | 日本丶国产丶欧美色综合 | 久久天天躁夜夜躁狠狠85麻豆 | av一本久道久久波多野结衣 | 亚洲成人av一区 | 人人插人人艹 | av在线播放亚洲 | 国产视频在线观看一区 | 久久1电影院 | 狠狠久久婷婷 | 99re国产| 国产精品久久久久国产a级 激情综合中文娱乐网 | 欧美成人a在线 | 岛国片在线 | 97电影网手机版 | 啪啪激情网 | 少妇精品久久久一区二区免费 | 国产精品久久一区二区无卡 | 日韩r级电影在线观看 | 午夜美女网站 | 欧美a级免费视频 | 日韩色视频在线观看 | 欧美性色综合网 | 色婷婷激情综合 | 亚洲一二区视频 | 毛片随便看 | 中文不卡视频 | 天天爱天天操天天干 | 99综合影院在线 | 国产色视频网站 | 日日夜夜狠狠 | 欧美午夜a| 国产精品不卡在线观看 | 性色在线视频 | 三级黄色网址 | 久久综合中文字幕 | 久久久久国 | 久久综合久久八八 | 四虎永久网站 | 97超碰人人澡 | 久草网站| 91精品国自产在线观看欧美 | 国产xx视频 | 福利二区视频 | 欧美a视频 | 国产一级免费电影 | 国产精品国产三级国产不产一地 | 成全免费观看视频 | 中文字幕乱偷在线 | 99热日本| av福利在线看| 免费毛片一区二区三区久久久 | 久久国产精品99久久人人澡 | 久久夜夜操 | 视频在线播放国产 | 欧美特一级片 | 久久香蕉影视 | 成人97视频一区二区 | 免费国产视频 | 99精品在线看 | 一区二区三区在线观看免费视频 | 97精品国产91久久久久久 | 日韩成人一级大片 | 亚洲在线国产 | 日韩一区二区久久 | 在线综合色 | 人人干人人添 | 国产伦精品一区二区三区四区视频 | 国产黄色视| 中文字幕日韩高清 | 免费一级黄色 | 天天色天天草天天射 | 国产亚洲观看 | 色综合久久久久久久久五月 | 日日干狠狠操 | 成人一级电影在线观看 | 午夜精品视频一区 | 美女av在线免费 | av在线直接看 | 中文字幕在线观看国产 | 在线网址你懂得 | 国产 成人 久久 | 国产区欧美| 午夜av免费 | 国产99久久久精品视频 | 日韩综合视频在线观看 | 日韩网站免费观看 | av一区二区三区在线 | 国产成人精品午夜在线播放 | 亚洲美女在线国产 | 成人免费中文字幕 | 在线观看色视频 | 欧美在线1 | 亚洲最新av在线网站 | 国产精品美女久久久网av | 一区二区三区四区五区六区 | 日韩精品一区二区不卡 | 手机在线欧美 | 欧美大香线蕉线伊人久久 | 99久久国产免费,99久久国产免费大片 | 国产老熟 | 色综久久 | 五月天精品视频 | 婷婷色在线| 天天射天天爱天天干 | 久久国产欧美日韩 | 国产午夜精品av一区二区 | 日韩三区在线观看 | 久久国产精品网站 | 国产资源| avav片| 国产精品美女久久久久久免费 | 日韩二区三区 | 免费观看福利视频 | 亚洲国产69 | 国产在线毛片 | 国产精品成人免费 | 免费观看完整版无人区 | 香蕉久草 | 超碰免费观看 | 麻豆精品在线 | 999色视频 | 亚洲激情综合 | 亚洲精品国产精品久久99 | 精品91视频 | 国产一级二级在线观看 | 中文字幕在线观看1 | 国产一区在线播放 | 国产一区国产精品 | 91精品国产99久久久久久久 | 欧美日韩有码 | 欧美日韩在线免费观看 | 欧美夫妻生活视频 | 久久伊人综合 | 精品字幕在线 | 四虎影视成人永久免费观看亚洲欧美 | 日韩欧美一区二区三区免费观看 | 国产a国产a国产a | 久久成人国产 | 国产片免费在线观看视频 | 日韩精品久久久免费观看夜色 | 在线观看黄网站 | 免费在线色电影 | 狠狠狠色丁香婷婷综合久久88 | 狠狠插狠狠干 | 一区二区三区国产欧美 | 天天操天天怕 | 亚洲美女久久 | 亚洲在线国产 | 亚洲天堂精品 | 久久婷婷一区 | 国产精品一区二区av麻豆 | 99免费视频| 99久久99| 亚a在线| 国产视频一区二区三区在线 | 国产伦精品一区二区三区无广告 | 色婷婷综合激情 | 91网站免费观看 | 久久精品国产一区二区 | 中文网丁香综合网 | 66av99精品福利视频在线 | 欧美日韩精品区 | 国产精品区二区三区日本 | 六月丁香六月婷婷 | 韩国视频一区二区三区 | 精品播放 | 久久久999免费视频 日韩网站在线 | 亚洲国产中文字幕 | 亚洲精品乱码久久久久久蜜桃欧美 | 精品极品在线 | 黄网站色欧美视频 | 在线观看中文字幕 | 在线观看理论 | 欧美美女激情18p | 亚洲国产中文字幕在线观看 | 成人久久 | 人人爽人人爽人人爽人人爽 | 欧美一进一出抽搐大尺度视频 | 久久久免费精品 | 最新av免费在线 | 成人av资源网 | 色国产视频 | 草久热| 狠狠色综合网站久久久久久久 | 国产美女黄网站免费 | 久久露脸国产精品 | 深夜福利视频在线观看 | 五月激情婷婷丁香 | 超碰人人在线 | 色中文字幕在线观看 | 亚洲国产精品视频在线观看 | 精品久久99 | 日韩精品中文字幕在线观看 | 美女久久久久久 | 天天艹天天| 香蕉一区 | 人人澡人摸人人添学生av | 免费国产亚洲视频 | 可以免费看av | 综合色站| 91香蕉视频污在线 | 日韩在线电影一区 | 国产日韩欧美精品在线观看 | 99久久久国产精品免费99 | 国产精品大片在线观看 | 99久久超碰中文字幕伊人 | 黄网站色成年免费观看 | 亚洲综合成人专区片 | 国产精品手机看片 | 国产一级视频在线观看 | 久草久草在线观看 | 丁香电影小说免费视频观看 | 日韩视频免费在线观看 | 国产在线精品观看 | 久久亚洲私人国产精品va | 日韩精品久久久久久久电影竹菊 | 在线观看爱爱视频 | 精品一二区 | 国内外激情视频 | 日本在线视频网址 | 国内久久久久 | 91看片黄色 | 中文字幕五区 | 国产拍在线 | 亚洲欧美色婷婷 | 日日爽夜夜爽 | 成人在线播放视频 | 天天操天天拍 | 手机av网站 | 福利片视频区 | 日本久久久亚洲精品 | 国产精品免费久久久久久久久久中文 | 欧美视频不卡 | 麻豆国产精品视频 | 欧美一二三区在线观看 | 精品一区二区三区久久 | 99爱视频在线观看 | 日本二区三区在线 | 色婷婷亚洲 | 黄色一级片视频 | 国产色就色 | 99视频在线| 91亚洲精品久久久中文字幕 | 国产福利91精品 | 日韩一区二区免费播放 | av一级免费 | 三级av在线免费观看 | 亚洲欧美激情插 | 日韩久久精品一区 | 麻花传媒mv免费观看 | 成人在线一区二区三区 | 波多野结衣最新 | 麻豆一区在线观看 | 在线影院中文字幕 | 国产又黄又猛又粗 | 国产麻豆精品传媒av国产下载 | 久久久久久久久久久国产精品 | 五月天久久婷 | 日本在线精品视频 | 成人小视频在线免费观看 | 久久香蕉电影 | 国产精品 国产精品 | 91在线视频免费观看 | 国产69精品久久久久99尤 | 久久精品5 | 超碰在97 | 香蕉网在线 | 久久国产视屏 | 超碰97在线看 | 麻豆一区二区三区视频 | 国产一区二区三区四区大秀 | 久久er99热精品一区二区三区 | av中文字幕亚洲 | 久久久综合香蕉尹人综合网 | 欧美激情第一页xxx 午夜性福利 | 日韩久久精品一区二区三区下载 | 欧美一区,二区 | 久草在线免费看视频 | 97综合在线 | 在线香蕉视频 | 久免费视频 | 在线观看视频97 | 天天综合91 | 蜜臀av性久久久久蜜臀aⅴ四虎 | 国产精品久久久亚洲 | 97视频免费在线观看 | 中文字幕在线日 | 久久精品日产第一区二区三区乱码 | 懂色av一区二区在线播放 | 一区二区三区四区精品视频 | 99riav1国产精品视频 | 91香蕉视频色版 | 香蕉视频网址 | 特级黄色一级 | 国产精品毛片一区二区在线看 | 久久在线免费 | 国产经典av | 久久久不卡影院 | 午夜国产福利在线 | 免费观看一级成人毛片 | 波多野结衣在线视频免费观看 | 中文字幕 影院 | 99日精品 | 在线视频麻豆 | 天堂va在线观看 | 中文字幕日韩无 | 91成年人在线观看 | 91视频大全| 日韩va欧美va亚洲va久久 | 一区二区三区四区五区在线 | 一本一本久久a久久精品综合小说 | 亚洲韩国一区二区三区 | 欧美 日韩 性 | 精品美女视频 | 久久一区二区免费视频 | 免费看国产黄色 | 精品国产伦一区二区三区观看体验 | 99这里只有精品99 | 精品一区 精品二区 | 久久精品婷婷 | av日韩国产 | 中文字幕日韩电影 | 久草在线网址 | 国产精品久久久久久久久久尿 | 久久国产精品99久久人人澡 | 久草精品视频在线看网站免费 | 欧美日韩一区二区在线观看 | www.亚洲精品在线 | 日韩精品视频免费专区在线播放 | 日本激情中文字幕 | 一区二区三区四区在线免费观看 | 亚洲三级网 | 少妇高潮冒白浆 | 国产中文欧美日韩在线 | 国产成人精品综合 | 国产精品久久久久久a | 亚洲爱爱视频 | 久草在线手机视频 | 在线观看av中文字幕 | 成人精品影视 | 天天综合久久综合 | 久久爱导航 | 91av原创| 久久亚洲美女 | 97超碰色偷偷 | 国产自制av| 日韩美女av在线 | 91成人免费在线视频 | 亚洲综合导航 | 国产aaa毛片| 免费男女羞羞的视频网站中文字幕 | 亚洲欧美国内爽妇网 | 国产91精品久久久久 | 国产首页 | 欧美一级片免费在线观看 | 国产一区二区不卡在线 | 手机成人在线 | 欧美aⅴ在线观看 | 国产色视频一区二区三区qq号 | 中文字幕在线播放第一页 | 日本动漫做毛片一区二区 | 久艹视频在线观看 | 亚洲成a人片77777潘金莲 | 国产精品不卡在线观看 | 国产手机视频精品 | 国偷自产中文字幕亚洲手机在线 | 一级国产视频 | 日韩免费中文字幕 | 18久久久久久 | 五月婷婷色丁香 | 91毛片视频| 国产涩图| 午夜丰满寂寞少妇精品 | 亚州国产精品 | 日韩一区二区免费播放 | 成人av影院在线观看 | 美女视频国产 | 99麻豆视频| 中文视频在线看 | 五月婷激情 | 久久免费公开视频 | 爱av在线网 | 在线观看中文字幕视频 | 国产精品久久久久久久久久久久午 | 天天操伊人 | 欧美日本不卡 | 免费av大全 | 成人在线观看网址 | 四虎亚洲精品 | 久久久久久欧美二区电影网 | 国产97在线看 | 成人av av在线 | 久久婷婷国产色一区二区三区 | 国产三级视频在线 | 国产精品成人自产拍在线观看 | 亚洲男女精品 | 成年人在线看片 | 2023av| 在线观看的av | 日本不卡久久 | 在线看片日韩 | 天干啦夜天干天干在线线 | 亚洲黄色一级电影 | 亚洲尺码电影av久久 | 日韩欧美视频在线免费观看 | 91精品国产91久久久久久三级 | 一区二区三区四区五区在线 | 国产精品美女久久久网av | 99热精品国产一区二区在线观看 | 91在线影视 | 最近免费在线观看 | 天天做日日做天天爽视频免费 | 日韩影视在线 | 亚州精品国产 | 成人av电影免费 | 久久综合婷婷 | 天天草天天干天天射 | av网站免费线看精品 | 97人人人人| 亚洲精品在线免费观看视频 | 久久精品欧美日韩精品 | 精品国产理论片 | 奇米影视四色8888 | 久久久私人影院 | av久久在线 | 国产一区二区不卡在线 | 国产精品一区二区三区久久 | 久久激情影院 | 国产精品久久精品 | 婷婷丁香七月 | 国产一级二级在线观看 | 一区二区三区四区五区六区 | 精品毛片久久久久久 | 精品三级av | 超碰97人人爱 | 麻豆国产精品永久免费视频 | av片中文字幕 | 欧美激情精品 | 国语对白少妇爽91 | 99久久99热这里只有精品 | 狠狠狠色丁香婷婷综合久久五月 | 日韩免费看视频 | 成人97视频一区二区 | 国模精品一区二区三区 | 天天在线视频色 | 少妇bbw撒尿 | 91麻豆产精品久久久久久 | 国产黄色片免费在线观看 | 国内精品久久久 | 九九九九九国产 | 狠狠操狠狠干天天操 | bbw av| 国产精品视频内 | 精品视频在线免费观看 | 91福利在线导航 | 亚洲精选视频在线 | 91av官网 | 欧美日韩免费观看一区=区三区 | 在线观看国产一区二区 | 黄色1级毛片 | 在线免费黄色 | 欧美日韩精品国产 | 国产精品久久久久久久久久尿 | 色婷婷中文 | 国产日产精品一区二区三区四区 | 精品国产乱码久久久久久久 | 国产不卡视频在线 | 美女视频黄网站 | av一级在线观看 | 91麻豆精品国产91久久久久久 | 久久久91精品国产一区二区精品 | 在线看片一区 | 久久久久久蜜av免费网站 | 91视频免费看网站 | 久久全国免费视频 | 有码一区二区三区 | 欧美成人基地 | 国产福利91精品一区二区三区 | 国产精品高潮久久av | 波多野结衣一区 | 亚洲欧美视屏 | 国产成人av免费在线观看 | 成人在线视频网 | 国产四虎影院 | 成人影视片 | 国产精品麻豆三级一区视频 | 2018亚洲男人天堂 | 久久精品免费看 | 国产高清视频 | 亚洲美女视频网 | 99视频这里有精品 | 狠狠综合久久av | 在线观看黄色免费视频 | 超碰97人人在线 | 国产高潮久久 | 啪啪免费试看 | 麻豆传媒电影在线观看 | 久久久国产一区二区三区 | 黄色大片网 | 四虎永久精品在线 | 国产精品视频你懂的 | 欧美aaa一级| 日韩视频区 | 日韩电影在线观看一区二区三区 | 亚洲成a人片77777潘金莲 | 日韩在线色 | 91视频传媒| 亚洲精品大片www | 9在线观看免费 | 国产 中文 日韩 欧美 | 婷婷五情天综123 | 一区二区三区精品久久久 | 午夜精品久久久久久久99水蜜桃 | 97超碰国产精品 | 91精品一区在线观看 | 国产精品麻豆三级一区视频 | 成人网中文字幕 | 91亚洲成人 | 狠狠狠狠狠干 | 久久99国产精品自在自在app | av短片在线 | 国产一区二区三区免费视频 | 午夜av激情| 久草在线91 | 亚洲蜜桃在线 | 日韩精品免费一线在线观看 | 国产午夜小视频 | 丁香六月久久综合狠狠色 | 国产在线精品区 | 91色影院| 又黄又刺激又爽的视频 | 亚洲国产精品500在线观看 | 天天操天天操天天 | 99中文字幕视频 | 国产四虎影院 | 91香蕉国产 | 成人一级免费视频 | 99久久精品日本一区二区免费 | 最近中文字幕在线中文高清版 | 久久久国产影院 | 九九九视频在线 | 国产二区av | 麻豆综合网 | 精品国产不卡 | 久久精品婷婷 | 亚洲一二三久久 | 成人毛片在线观看 | 久久婷婷网 | 国产精品久久99 | 园产精品久久久久久久7电影 | 福利视频导航网址 | 国产99中文字幕 | 99精品成人 | 久久精品爱爱视频 | 97超碰资源站 | 欧美日韩不卡一区 | 在线免费高清视频 | 成人亚洲免费 | 99人成在线观看视频 | 波多野结衣理论片 | 国产精品毛片一区二区 | 国产视频不卡一区 | 色婷婷午夜 | 成人av在线一区二区 | 欧美性受极品xxxx喷水 | 涩涩伊人| 香蕉影院在线观看 | 一级片视频在线 | 免费看片网址 | 亚洲综合网站在线观看 | 黄色三级免费片 | 久久99亚洲精品久久久久 | www色片| 亚洲高清视频在线观看 | 欧美日韩一区三区 | 欧美成人精品欧美一级乱黄 | 久久精品一区二区三区视频 | 中文在线免费观看 | 日韩在线视频观看免费 | 中文字幕 国产视频 | 国产在线传媒 | 日日爽天天爽 | 成人资源在线观看 | 久久激情五月婷婷 | 亚洲四虎影院 | 亚洲人成人在线 | 国产精品永久在线观看 | 最新av在线网站 | 黄色91在线 | 91片黄在线观看 | 久久久999免费视频 日韩网站在线 | 天天色成人 | 97色在线观看 | 夜夜躁天天躁很躁波 | 波多野结依在线观看 | 999视频精品| 黄色免费国产 | 欧美福利网址 | 日本久久久久久久久 | 日韩理论电影在线观看 | 亚洲综合色激情五月 | 免费av免费观看 | 91精品视频免费在线观看 | 在线播放精品一区二区三区 | 91片黄在线观 | 久久国产精品久久精品国产演员表 | 久久视频99 | 中国一 片免费观看 | 亚洲激情一区二区三区 | 国产精品99久久免费黑人 | 国产字幕在线观看 | 欧美日韩免费看 | 国产高潮久久 | 91在线国内视频 | 中文字幕高清 | 国产成人精品一区二区三区网站观看 | 久久艹艹 | 一级片观看 | 久久网址| 九九九热精品 | 精品一区91 | 久久综合九色九九 | 久久成人久久 | 久久久久久国产精品免费 | 91丨九色丨国产丨porny精品 | 8x成人免费视频 | www日日夜夜 | 蜜臀av免费一区二区三区 | 久久久久久综合网天天 | 日本一区二区三区视频在线播放 | 999久久久免费视频 午夜国产在线观看 | 午夜久久久精品 | 91中文在线观看 | 黄色中文字幕 | 伊人网综合在线观看 | 国产免费黄色 | 精品黄色在线观看 | 波多野结衣精品视频 | 五月婷婷毛片 | 亚洲成人av片 | 亚洲精品在线看 | 欧美精品二 | 婷婷在线看| 亚洲视频在线视频 | 国产亚洲精品久久久久动 | www.日韩免费| aaa日本高清在线播放免费观看 | 天天射天天干天天操 | 国产一级做a爱片久久毛片a | 国产视频不卡 | 天天干夜夜擦 | 91av蜜桃| 又紧又大又爽精品一区二区 | 最近日本mv字幕免费观看 | 精品一区电影国产 | 日本精品在线 | 免费av在线网站 | 欧美日高清视频 | www.五月天婷婷 | 天天操天天操天天操 | 亚洲精品国 | 五月天国产精品 | 欧美日韩一级久久久久久免费看 | 91成人看片| 国产一二三在线视频 | 中文字幕一区二区三区在线观看 | 成年人在线视频观看 | 精品视频国产一区 | 免费高清国产 | 色婷婷88av视频一二三区 | 精久久久久 | 特级毛片aaa| 精品一区二区视频 | 美女又爽又黄 | 超级碰碰碰免费视频 | 天天干天天做 | 国产在线污 | 天天爱综合 | 狠狠狠色丁香婷婷综合久久五月 | 国产精品网站一区二区三区 | 久久精品看片 | 亚洲日韩精品欧美一区二区 | 日韩中文字幕国产精品 | 日韩 在线 | 国产精品久久久久久久久毛片 | 96视频在线 | 国产成人精品在线播放 | 91视频免费看片 | 激情图片qvod | 一区中文字幕电影 | 免费黄色在线 | 精品a视频| 涩av在线 | 2023亚洲精品国偷拍自产在线 | 国产精品xxxx18a99 | 亚洲国产精品500在线观看 | 91av欧美| 99色人| av成人在线网站 | 成人av直播| 亚洲日本va中文字幕 | 国产中文字幕91 | 色网站中文字幕 | 久久在线一区 | 免费看国产视频 | 国产福利一区二区三区在线观看 | 亚洲成人av片在线观看 | 91免费黄视频| 国产精品18久久久久久久 | 日韩字幕在线观看 | 亚洲视频在线观看免费 | 蜜桃视频色 | 黄色在线免费观看网站 | 日韩 精品 一区 国产 麻豆 | av高清免费| 成人小视频在线播放 | 久久国产精品免费一区二区三区 | 中文字幕国产视频 | 亚洲精品国产精品乱码在线观看 | 国产中文在线观看 | 99精品在线视频观看 | 国产高清不卡 | 性色av一区二区 | 欧美日韩三区二区 | 狠狠色丁香婷婷综合久久片 | 欧美日韩不卡在线 | 天天操狠狠操网站 | 国产精品一区久久久久 | 日韩欧美国产激情在线播放 | 色五月激情五月 | 日韩黄色软件 | 日韩av电影一区 | 制服丝袜一区二区 | 亚洲精品www久久久久久 | 日韩中文在线电影 | 在线观看视频中文字幕 | 婷婷六月综合网 | 五月婷婷一区 | 久久av一区二区三区亚洲 | 国产精品毛片一区二区 | 久久久久国产一区二区三区 | 在线日韩中文字幕 | 久久综合给合久久狠狠色 | 在线国产黄色 | 天天天天天操 | 偷拍福利视频一区二区三区 | 一区二区三区视频网站 | 国产成年免费视频 | 99麻豆视频 | 国产美女在线精品免费观看 | 国产精品久久久久久久久久 | 精品久久久久久综合日本 | 天操夜夜操 | 日韩xxxxxxxxx| 日韩精品一区二区三区三炮视频 | 麻豆传媒在线免费看 | 欧美日韩网址 | 欧美午夜久久久 | 日本在线精品视频 | 精品在线观看一区二区 | 久久激情精品 | 国产精品久久久久久999 | 久久免费黄色网址 | 亚洲综合少妇 | av丁香| 午夜的福利| 中文字幕在线视频免费播放 | 久久夜色精品国产亚洲aⅴ 91chinesexxx | 免费在线观看污网站 | 婷婷色网 | 91av视屏| 日本中文字幕高清 | 日本在线观看一区 | 欧美日韩久 | 麻豆高清免费国产一区 | 91资源在线观看 | 91专区在线观看 | 四虎欧美| 国产免费不卡 | 久久www免费人成看片高清 | 九九九九九国产 | 国产精品 9999 | 黄色大片免费网站 | 在线观看免费视频 | 在线视频中文字幕一区 | 久久国产一二区 | 久久久久综合网 | 91免费国产在线观看 | 国产精品麻豆视频 | 亚洲最大成人网4388xx | 亚洲精品视频观看 | 丁香一区二区 | 亚洲精品免费播放 | 一区二区三区在线观看中文字幕 | 伊人丁香 | 国产在线观看污片 | 天堂久久电影网 | 亚洲欧美经典 | 精品美女久久 | 99久热在线精品 | 欧美激情在线看 | 少妇bbb搡bbbb搡bbbb′ | 免费观看特级毛片 | 国产一区视频导航 | 国内精品毛片 | 欧美日韩不卡一区 | 亚洲成a人片77777潘金莲 | 91中文字幕视频 | 黄色一级免费电影 | 免费观看第二部31集 | 成 人 黄 色视频免费播放 | 中文字幕免费一区二区 | 久久精品一区二区三区视频 | 精品福利片 | 久要激情网 | 欧美精品久久久久久 | 成人黄色在线电影 | 深爱婷婷网 | 日本久久免费视频 | 国产精品久久久久久久av电影 | 中文字幕人成乱码在线观看 | 二区三区视频 | 在线观看国产永久免费视频 | 亚洲精品女人久久久 | 国产精品对白一区二区三区 | 久久久免费毛片 | 亚洲国产精品成人va在线观看 | 国产免费二区 | 午夜在线免费观看视频 | 久久久久久国产精品美女 | 日韩中文字幕免费视频 | 天天翘av| 国产色区| 精品久久久免费 | 精品国产一二三四区 |