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

字節跳動2步突破,復雜文檔布局解析,為啥如此驚艷?

發布于 2025-5-26 00:43
瀏覽
0收藏

一、現有方案的局限性

現有的文檔圖像解析解決方案主要分為兩大類:基于集成的方法和端到端的方法。

  • 基于集成的方法通過將多個專家模型組裝到一個多階段的流水線中來實現文檔解析,這些方法雖然在特定任務上表現出色,但需要對每個模型進行獨立優化,并且在組件間協調方面面臨挑戰。
  • 端到端的方法則利用通用或專家視覺語言模型(VLMs)直接自回歸地生成頁面級內容,雖然能夠捕捉頁面級語義,但在解析長文檔和復雜布局時,常常會遇到布局結構退化和效率瓶頸的問題。

Dolphin案例展示

  • 版式識別、閱讀順序識別字節跳動2步突破,復雜文檔布局解析,為啥如此驚艷?-AI.x社區

字節跳動2步突破,復雜文檔布局解析,為啥如此驚艷?-AI.x社區

  • 公式識別

字節跳動2步突破,復雜文檔布局解析,為啥如此驚艷?-AI.x社區

  • 給定box區域提取區域的內容

字節跳動2步突破,復雜文檔布局解析,為啥如此驚艷?-AI.x社區

  • 復雜的表格可以輕松轉出markdown

字節跳動2步突破,復雜文檔布局解析,為啥如此驚艷?-AI.x社區

  • 無線表格輕松拿捏

字節跳動2步突破,復雜文檔布局解析,為啥如此驚艷?-AI.x社區

二、Dolphin解決方案

Dolphin (Document Image Parsing via Heterogeneous Anchor Prompting)采用了一種分析-解析范式(analyze-then-parse),將文檔解析過程分解為兩個階段:

  • 第一階段進行頁面級布局分析,生成自然閱讀順序的布局元素序列;
  • 第二階段則利用這些元素作為錨點,結合任務特定的提示,進行并行的內容解析。

字節跳動2步突破,復雜文檔布局解析,為啥如此驚艷?-AI.x社區

這種兩階段的設計既避免了傳統集成方法中多模型協調的復雜性,又克服了端到端方法在復雜布局和長文檔解析中的效率瓶頸,還能通過輕量級架構和并行解析機制實現優越的運行效率。

  • Dolphin支持的布局元素

字節跳動2步突破,復雜文檔布局解析,為啥如此驚艷?-AI.x社區

2.1. 頁面級布局分析階段

  • 頁面圖像編碼

Dolphin 使用 Swin Transformer 作為視覺編碼器,將輸入的頁面圖像編碼為視覺嵌入序列。

Swin Transformer 的層次化設計能夠同時捕捉全局布局模式和局部文本細節。

輸入圖像在編碼前會被調整并填充到固定大小,以保持其寬高比,避免文本失真。

  • 布局序列生成
  • 在布局序列生成過程中,解碼器以布局分析提示(Playout)為引導,通過交叉注意力機制關注編碼后的視覺特征。
  • 解碼器采用 mBart 架構,能夠識別并按順序排列文檔元素,同時保留結構關系(例如圖表與標題的配對、表格與標題的關聯以及章節標題與段落的層次結構)。
  • 最終生成的布局元素序列  包含每個元素的類型(如圖表、標題、表格、段落)和邊界框信息,這些元素將作為第二階段的錨點。L = {l1, l2, ..., ln}

2.2 元素級內容解析階段

  • 元素圖像編碼

對于第一階段識別出的每個布局元素 li

Dolphin 從原始圖像中裁剪出對應的區域,形成局部視圖 Ii。

這些局部視圖通過相同的 Swin Transformer 并行編碼,生成元素特定的視覺特征。

  • 并行內容解析
  • 在并行內容解析階段,Dolphin 利用類型特定的提示來指導不同元素的解析。
  • 例如,表格使用專用的表格提示(Ptable)來解析其 HTML 格式
  • 而公式則與文本段落共享相同的提示(Pparagraph),因為它們通常在段落上下文中以行內和顯示模式出現,盡管它們的標記格式為 LaTeX。
  • 給定局部視圖 Ii 的視覺特征及其對應的提示 pi,解碼器能夠并行生成解析后的內容。這種并行處理策略結合元素特定的提示,確保了計算效率,同時保持了準確的內容識別。

訓練方案

  • 構建數據集

包含超過 3000 萬個樣本的大規模數據集,涵蓋了頁面級文檔和元素級組件。

數據集的來源包括混合文檔、HTML 文檔、LaTeX 文檔、Markdown 文檔、表格和公式等。

這些數據通過不同的方式進行了處理和標注,以滿足模型訓練的不同需求。

字節跳動2步突破,復雜文檔布局解析,為啥如此驚艷?-AI.x社區

  • 訓練過程中

Dolphin 采用了動態任務選擇策略,根據訓練樣本的可用標注隨機選擇適用的任務,從而構建問題-答案對。

這種策略能夠提高模型的泛化能力,使其能夠處理多種類型的文檔解析任務。

還采用了預訓練權重初始化的方法,通過在 Donut 模型的基礎上進行指令調優,擴展了模型對多樣化提示的理解和執行能力。

Dolphin實戰

通過這個鏈接可以免費試用??http://115.190.42.15:8888/dolphin/??

Dolphin 提供了兩個推理框架,支持兩個解析粒度:

  • 頁面級解析:將整個文檔圖像解析為結構化的 JSON 和 Markdown 格式
  • 元素級解析:解析單個文檔元素(文本、表格、公式)

字節跳動2步突破,復雜文檔布局解析,為啥如此驚艷?-AI.x社區

  • 頁面解析

import argparse
import glob
import os

import cv2
import torch
from PIL import Image
from transformers import AutoProcessor, VisionEncoderDecoderModel

from utils.utils import *


class DOLPHIN:
    def __init__(self, model_id_or_path):
        """Initialize the Hugging Face model
        
        Args:
            model_id_or_path: Path to local model or Hugging Face model ID
        """
        # Load model from local path or Hugging Face hub
        self.processor = AutoProcessor.from_pretrained(model_id_or_path)
        self.model = VisionEncoderDecoderModel.from_pretrained(model_id_or_path)
        self.model.eval()
        
        # Set device and precision
        self.device = "cuda"if torch.cuda.is_available() else"cpu"
        self.model.to(self.device)
        self.model = self.model.half()  # Always use half precision by default
        
        # set tokenizer
        self.tokenizer = self.processor.tokenizer
        
    def chat(self, prompt, image):
        """Process an image or batch of images with the given prompt(s)
        
        Args:
            prompt: Text prompt or list of prompts to guide the model
            image: PIL Image or list of PIL Images to process
            
        Returns:
            Generated text or list of texts from the model
        """
        # Check if we're dealing with a batch
        is_batch = isinstance(image, list)
        
        if not is_batch:
            # Single image, wrap it in a list for consistent processing
            images = [image]
            prompts = [prompt]
        else:
            # Batch of images
            images = image
            prompts = prompt if isinstance(prompt, list) else [prompt] * len(images)
        
        # Prepare image
        batch_inputs = self.processor(images, return_tensors="pt", padding=True)
        batch_pixel_values = batch_inputs.pixel_values.half().to(self.device)
        
        # Prepare prompt
        prompts = [f"<s>{p} <Answer/>"for p in prompts]
        batch_prompt_inputs = self.tokenizer(
            prompts,
            add_special_tokens=False,
            return_tensors="pt"
        )

        batch_prompt_ids = batch_prompt_inputs.input_ids.to(self.device)
        batch_attention_mask = batch_prompt_inputs.attention_mask.to(self.device)
        
        # Generate text
        outputs = self.model.generate(
            pixel_values=batch_pixel_values,
            decoder_input_ids=batch_prompt_ids,
            decoder_attention_mask=batch_attention_mask,
            min_length=1,
            max_length=4096,
            pad_token_id=self.tokenizer.pad_token_id,
            eos_token_id=self.tokenizer.eos_token_id,
            use_cache=True,
            bad_words_ids=[[self.tokenizer.unk_token_id]],
            return_dict_in_generate=True,
            do_sample=False,
            num_beams=1,
            repetition_penalty=1.1
        )
        
        # Process output
        sequences = self.tokenizer.batch_decode(outputs.sequences, skip_special_tokens=False)
        
        # Clean prompt text from output
        results = []
        for i, sequence in enumerate(sequences):
            cleaned = sequence.replace(prompts[i], "").replace("<pad>", "").replace("</s>", "").strip()
            results.append(cleaned)
            
        # Return a single result for single image input
        if not is_batch:
            return results[0]
        return results


def process_page(image_path, model, save_dir, max_batch_size=None):
    """Parse document images with two stages"""
    # Stage 1: Page-level layout and reading order parsing
    pil_image = Image.open(image_path).convert("RGB")
    layout_output = model.chat("Parse the reading order of this document.", pil_image)

    # Stage 2: Element-level content parsing
    padded_image, dims = prepare_image(pil_image)
    recognition_results = process_elements(layout_output, padded_image, dims, model, max_batch_size)

    # Save outputs
    json_path = save_outputs(recognition_results, image_path, save_dir)

    return json_path, recognition_results


def process_elements(layout_results, padded_image, dims, model, max_batch_size=None):
    """Parse all document elements with parallel decoding"""
    layout_results = parse_layout_string(layout_results)

    # Store text and table elements separately
    text_elements = []  # Text elements
    table_elements = []  # Table elements
    figure_results = []  # Image elements (no processing needed)
    previous_box = None
    reading_order = 0

    # Collect elements to process and group by type
    for bbox, label in layout_results:
        try:
            # Adjust coordinates
            x1, y1, x2, y2, orig_x1, orig_y1, orig_x2, orig_y2, previous_box = process_coordinates(
                bbox, padded_image, dims, previous_box
            )

            # Crop and parse element
            cropped = padded_image[y1:y2, x1:x2]
            if cropped.size > 0:
                if label == "fig":
                    # For figure regions, add empty text result immediately
                    figure_results.append(
                        {
                            "label": label,
                            "bbox": [orig_x1, orig_y1, orig_x2, orig_y2],
                            "text": "",
                            "reading_order": reading_order,
                        }
                    )
                else:
                    # Prepare element for parsing
                    pil_crop = Image.fromarray(cv2.cvtColor(cropped, cv2.COLOR_BGR2RGB))
                    element_info = {
                        "crop": pil_crop,
                        "label": label,
                        "bbox": [orig_x1, orig_y1, orig_x2, orig_y2],
                        "reading_order": reading_order,
                    }
                    
                    # Group by type
                    if label == "tab":
                        table_elements.append(element_info)
                    else:  # Text elements
                        text_elements.append(element_info)

            reading_order += 1

        except Exception as e:
            print(f"Error processing bbox with label {label}: {str(e)}")
            continue

    # Initialize results list
    recognition_results = figure_results.copy()
    
    # Process text elements (in batches)
    if text_elements:
        text_results = process_element_batch(text_elements, model, "Read text in the image.", max_batch_size)
        recognition_results.extend(text_results)
    
    # Process table elements (in batches)
    if table_elements:
        table_results = process_element_batch(table_elements, model, "Parse the table in the image.", max_batch_size)
        recognition_results.extend(table_results)

    # Sort elements by reading order
    recognition_results.sort(key=lambda x: x.get("reading_order", 0))

    return recognition_results


def process_element_batch(elements, model, prompt, max_batch_size=None):
    """Process elements of the same type in batches"""
    results = []
    
    # Determine batch size
    batch_size = len(elements)
    if max_batch_size is not None and max_batch_size > 0:
        batch_size = min(batch_size, max_batch_size)
    
    # Process in batches
    for i in range(0, len(elements), batch_size):
        batch_elements = elements[i:i+batch_size]
        crops_list = [elem["crop"] for elem in batch_elements]
        
        # Use the same prompt for all elements in the batch
        prompts_list = [prompt] * len(crops_list)
        
        # Batch inference
        batch_results = model.chat(prompts_list, crops_list)
        
        # Add results
        for j, result in enumerate(batch_results):
            elem = batch_elements[j]
            results.append({
                "label": elem["label"],
                "bbox": elem["bbox"],
                "text": result.strip(),
                "reading_order": elem["reading_order"],
            })
    
    return results


def main():
    parser = argparse.ArgumentParser(descriptinotallow="Document processing tool using DOLPHIN model")
    parser.add_argument("--model_path", default="./hf_model", help="Path to Hugging Face model")
    parser.add_argument("--input_path", type=str, default="./demo", help="Path to input image or directory of images")
    parser.add_argument(
        "--save_dir",
        type=str,
        default=None,
        help="Directory to save parsing results (default: same as input directory)",
    )
    parser.add_argument(
        "--max_batch_size",
        type=int,
        default=16,
        help="Maximum number of document elements to parse in a single batch (default: 16)",
    )
    args = parser.parse_args()

    # Load Model
    model = DOLPHIN(args.model_path)

    # Collect Document Images
    if os.path.isdir(args.input_path):
        image_files = []
        for ext in [".jpg", ".jpeg", ".png", ".JPG", ".JPEG", ".PNG"]:
            image_files.extend(glob.glob(os.path.join(args.input_path, f"*{ext}")))
        image_files = sorted(image_files)
    else:
        if not os.path.exists(args.input_path):
            raise FileNotFoundError(f"Input path {args.input_path} does not exist")
        image_files = [args.input_path]

    save_dir = args.save_dir or (
        args.input_path if os.path.isdir(args.input_path) else os.path.dirname(args.input_path)
    )
    setup_output_dirs(save_dir)

    total_samples = len(image_files)
    print(f"\nTotal samples to process: {total_samples}")

    # Process All Document Images
    for image_path in image_files:
        print(f"\nProcessing {image_path}")
        try:
            json_path, recognition_results = process_page(
                image_path=image_path,
                model=model,
                save_dir=save_dir,
                max_batch_size=args.max_batch_size,
            )

            print(f"Processing completed. Results saved to {save_dir}")

        except Exception as e:
            print(f"Error processing {image_path}: {str(e)}")
            continue


if __name__ == "__main__":
    main()
  • 元素級解析

import argparse
import glob
import os

import torch
from PIL import Image
from transformers import AutoProcessor, VisionEncoderDecoderModel

from utils.utils import *


class DOLPHIN:
    def __init__(self, model_id_or_path):
        """Initialize the Hugging Face model
        
        Args:
            model_id_or_path: Path to local model or Hugging Face model ID
        """
        # Load model from local path or Hugging Face hub
        self.processor = AutoProcessor.from_pretrained(model_id_or_path)
        self.model = VisionEncoderDecoderModel.from_pretrained(model_id_or_path)
        self.model.eval()
        
        # Set device and precision
        self.device = "cuda"if torch.cuda.is_available() else"cpu"
        self.model.to(self.device)
        self.model = self.model.half()  # Always use half precision by default
        
        # set tokenizer
        self.tokenizer = self.processor.tokenizer
        
    def chat(self, prompt, image):
        """Process an image with the given prompt
        
        Args:
            prompt: Text prompt to guide the model
            image: PIL Image to process
            
        Returns:
            Generated text from the model
        """
        # Prepare image
        pixel_values = self.processor(image, return_tensors="pt").pixel_values
        pixel_values = pixel_values.half()
            
        # Prepare prompt
        prompt = f"<s>{prompt} <Answer/>"
        prompt_ids = self.tokenizer(
            prompt, 
            add_special_tokens=False, 
            return_tensors="pt"
        ).input_ids.to(self.device)
        
        decoder_attention_mask = torch.ones_like(prompt_ids)
        
        # Generate text
        outputs = self.model.generate(
            pixel_values=pixel_values.to(self.device),
            decoder_input_ids=prompt_ids,
            decoder_attention_mask=decoder_attention_mask,
            min_length=1,
            max_length=4096,
            pad_token_id=self.tokenizer.pad_token_id,
            eos_token_id=self.tokenizer.eos_token_id,
            use_cache=True,
            bad_words_ids=[[self.tokenizer.unk_token_id]],
            return_dict_in_generate=True,
            do_sample=False,
            num_beams=1,
        )
        
        # Process the output
        sequence = self.tokenizer.batch_decode(outputs.sequences, skip_special_tokens=False)[0]
        sequence = sequence.replace(prompt, "").replace("<pad>", "").replace("</s>", "").strip()
        
        return sequence

def process_element(image_path, model, element_type, save_dir=None):
    """Process a single element image (text, table, formula)
    
    Args:
        image_path: Path to the element image
        model: HFModel model instance
        element_type: Type of element ('text', 'table', 'formula')
        save_dir: Directory to save results (default: same as input directory)
        
    Returns:
        Parsed content of the element and recognition results
    """
    # Load and prepare image
    pil_image = Image.open(image_path).convert("RGB")
    pil_image = crop_margin(pil_image)
    
    # Select appropriate prompt based on element type
    if element_type == "table":
        prompt = "Parse the table in the image."
        label = "tab"
    elif element_type == "formula":
        prompt = "Read text in the image."
        label = "formula"
    else:  # Default to text
        prompt = "Read text in the image."
        label = "text"
    
    # Process the element
    result = model.chat(prompt, pil_image)
    
    # Create recognition result in the same format as the document parser
    recognition_result = [
        {
            "label": label,
            "text": result.strip(),
        }
    ]
    
    # Save results if save_dir is provided
    if save_dir:
        save_outputs(recognition_result, image_path, save_dir)
        print(f"Results saved to {save_dir}")
    
    return result, recognition_result


def main():
    parser = argparse.ArgumentParser(descriptinotallow="Element-level processing using DOLPHIN model")
    parser.add_argument("--model_path", default="./hf_model", help="Path to Hugging Face model")
    parser.add_argument("--input_path", type=str, required=True, help="Path to input image or directory of images")
    parser.add_argument(
        "--element_type",
        type=str,
        choices=["text", "table", "formula"],
        default="text",
        help="Type of element to process (text, table, formula)",
    )
    parser.add_argument(
        "--save_dir",
        type=str,
        default=None,
        help="Directory to save parsing results (default: same as input directory)",
    )
    parser.add_argument("--print_results", actinotallow="store_true", help="Print recognition results to console")
    args = parser.parse_args()
    
    # Load Model
    model = DOLPHIN(args.model_path)
    
    # Set save directory
    save_dir = args.save_dir or (
        args.input_path if os.path.isdir(args.input_path) else os.path.dirname(args.input_path)
    )
    setup_output_dirs(save_dir)
    
    # Collect Images
    if os.path.isdir(args.input_path):
        image_files = []
        for ext in [".jpg", ".jpeg", ".png", ".JPG", ".JPEG", ".PNG"]:
            image_files.extend(glob.glob(os.path.join(args.input_path, f"*{ext}")))
        image_files = sorted(image_files)
    else:
        if not os.path.exists(args.input_path):
            raise FileNotFoundError(f"Input path {args.input_path} does not exist")
        image_files = [args.input_path]
    
    total_samples = len(image_files)
    print(f"\nTotal samples to process: {total_samples}")
    
    # Process images one by one
    for image_path in image_files:
        print(f"\nProcessing {image_path}")
        try:
            result, recognition_result = process_element(
                image_path=image_path,
                model=model,
                element_type=args.element_type,
                save_dir=save_dir,
            )

            if args.print_results:
                print("\nRecognition result:")
                print(result)
                print("-" * 40)
        except Exception as e:
            print(f"Error processing {image_path}: {str(e)}")
            continue


if __name__ == "__main__":
    main()

??https://github.com/bytedance/Dolphin??

??https://arxiv.org/pdf/2505.14059??

??https://huggingface.co/ByteDance/Dolphin??

本文轉載自????CourseAI????,作者:CourseAI

標簽
收藏
回復
舉報
回復
相關推薦
欧美精品黑人性xxxx| 久久婷婷国产综合精品青草| 精品国偷自产在线视频99| 日韩精品视频网址| av中文字幕在线看| 久久综合九色综合97_久久久| 国产精品久久中文| 久久黄色免费网站| 国产aⅴ精品一区二区三区久久| 欧美午夜精品久久久久久孕妇 | 中文字幕av在线一区二区三区| 国产日本欧美在线观看| 精品在线视频观看| 黄色不卡一区| 亚洲成人久久网| 手机版av在线| 亚洲欧洲美洲av| 亚洲免费观看高清完整版在线观看| 国产日韩欧美一区二区| 这里只有精品免费视频| 伊人久久亚洲美女图片| 中文国产成人精品| 亚洲国产综合视频| 宅男噜噜噜66国产精品免费| 色久优优欧美色久优优| 2022中文字幕| 大乳在线免费观看| 99久久99久久久精品齐齐| 成人中文字幕+乱码+中文字幕| 91国产丝袜播放在线| 亚洲欧美色图| 一区二区在线免费视频| 菠萝菠萝蜜网站| 亚洲一区二区三区四区电影| 欧美精品乱人伦久久久久久| 漂亮人妻被中出中文字幕| 中文字幕免费高清电视剧网站在线观看 | 亚洲一区二区在线观看视频 | 91香蕉国产在线观看| 91丝袜一区二区三区| 亚洲国产网站| 久久久中文字幕| 国产精品成人免费观看| 久久免费大视频| 中国人与牲禽动交精品| 夜夜春很很躁夜夜躁| 午夜精品福利影院| 日韩av资源在线播放| 黄色激情在线观看| julia中文字幕一区二区99在线| 91麻豆精品国产91久久久久久 | 久久精品国产欧美亚洲人人爽 | 玉足女爽爽91| 国产手机视频在线观看| 欧美精品videos另类| 亚洲国产精品精华液2区45| 日韩av电影在线观看| 国产三级视频在线播放线观看| 91小视频在线观看| 久久一区二区精品| 日本人妖在线| 国产日韩精品视频一区| 亚洲国产高清国产精品| 日韩毛片久久久| 亚洲欧美偷拍三级| 中文字幕在线中文| free性欧美| 欧美视频在线观看免费网址| 欧美 日本 亚洲| 午夜久久中文| 欧美午夜宅男影院| 8x8x成人免费视频| 一本色道69色精品综合久久| 亚洲精品一区二区在线观看| 亚洲の无码国产の无码步美| 日韩高清成人在线| 国产亚洲成av人片在线观看桃| 手机看片福利视频| 婷婷综合社区| 久久久在线观看| 亚洲 欧美 日韩 在线| 久久精品免费看| 亚洲综合在线小说| 日韩一级免费毛片| 国产欧美日韩精品一区| 四虎精品欧美一区二区免费| 九色porny丨首页入口在线| 色婷婷狠狠综合| 亚洲激情在线看| 超碰成人福利| 一区二区三区精品99久久| 婷婷激情四射网| 日韩视频在线一区二区三区| 国产精品十八以下禁看| 精品人妻aV中文字幕乱码色欲| av动漫一区二区| 亚洲激情啪啪| 9999精品成人免费毛片在线看| 91久久香蕉国产日韩欧美9色| av噜噜在线观看| 日韩精品丝袜美腿| 久久久精品一区| 久久精品视频1| 国产一区二区三区四区五区入口| 久久99精品久久久久久久久久| 一区二区三区视频在线观看视频| 亚洲高清免费视频| 在线观看日本一区二区| 奇米影视777在线欧美电影观看| 中文字幕在线看视频国产欧美| 久久久久香蕉视频| 麻豆成人91精品二区三区| 国产精品视频500部| 午夜免费福利在线观看| 亚洲国产精品一区二区久久恐怖片 | 成人18视频| 91这里只有精品| 黑人极品videos精品欧美裸| xxxx国产视频| 久久综合国产| 国产成人福利网站| 欧美一级做性受免费大片免费| 国产精品久久久久久久裸模| 日本a级片免费观看| www国产精品| 久久综合网hezyo| 最新中文字幕第一页| 99久久伊人久久99| 国产情侣第一页| 国内不卡的一区二区三区中文字幕| 亚洲人精品午夜在线观看| 久久精品视频6| 国产福利91精品| 久久免费视频2| 成人黄色免费网站| 国产一区二区三区高清在线观看| 国产精品第9页| 国产91富婆露脸刺激对白| 色呦呦网站入口| 亚洲精品成人一区| 神马久久桃色视频| 伊人网站在线观看| 国产精品色眯眯| 中文字幕在线导航| 精品久久91| 国产精品久久久久久久午夜| 国产免费av高清在线| 一本色道久久综合亚洲91| 成人无码www在线看免费| 亚洲精品欧美| 蜜桃传媒一区二区| 欧美日韩精品免费观看视完整| 亚洲免费小视频| 天码人妻一区二区三区在线看| 337p粉嫩大胆噜噜噜噜噜91av| 水蜜桃色314在线观看| 第一区第二区在线| 97av在线播放| 暖暖视频在线免费观看| 在线欧美日韩精品| 啪啪一区二区三区| 经典三级在线一区| 国产手机视频在线观看| 成人午夜网址| 欧美一区深夜视频| 国产女主播在线写真| 欧美日韩黄色影视| 精国产品一区二区三区a片| 国产ts人妖一区二区| 男女啪啪免费视频网站| 亚洲品质自拍| 成人黄色免费在线观看| 国模雨婷捆绑高清在线| 亚洲男人天堂2024| 亚洲在线观看av| 亚洲小说欧美激情另类| 丰满少妇一区二区| 久热成人在线视频| 真人抽搐一进一出视频| 国产区精品区| 91精品在线观| ****av在线网毛片| 亚洲视频自拍偷拍| 97人妻精品一区二区三区视频| 亚洲自拍偷拍图区| 久久久视频6r| 国产精品亚洲成人| 国产欧美高清在线| 亚洲天堂免费| 欧美lavv| 日韩在线观看一区二区三区| 日本韩国在线不卡| 国产激情在线| 亚洲男人的天堂在线| 国产视频一二三四区| 欧美色另类天堂2015| 99自拍视频在线| av电影在线观看一区| 中文字幕22页| 国产日韩欧美在线播放不卡| 一区二区三区四区视频在线| 欧美久久香蕉| 亚洲自拍偷拍一区| 在线观看精品| 97在线视频一区| 毛片网站在线免费观看| 亚洲欧洲在线看| 蜜臀久久99精品久久久| 欧美日韩激情一区二区三区| 天天操天天爽天天干| 亚洲欧美日韩电影| 蜜桃传媒一区二区亚洲| 成人av在线播放网站| 一区二区在线免费看| 亚洲欧美日韩在线观看a三区| 看一级黄色录像| 欧美日韩性在线观看| 精品视频第一区| 日本精品视频| 国产日韩av高清| 91精品影视| 青青久久aⅴ北条麻妃| 久色国产在线| 欧美精品午夜视频| 超碰在线无需免费| 色婷婷久久一区二区| 黄色片在线播放| 亚洲精品电影网| 欧美 日韩 综合| 精品国产一区二区三区忘忧草| 国产精品视频a| 欧美日韩色综合| 丰满熟女人妻一区二区三| 色综合中文综合网| www.国产色| 婷婷开心久久网| 日韩男人的天堂| 亚洲国产一区二区三区| 久久久久久久极品内射| 亚洲六月丁香色婷婷综合久久| 久久av红桃一区二区禁漫| 国产精品色哟哟网站| 91无套直看片红桃在线观看| 国产欧美一区二区三区鸳鸯浴| 亚洲v国产v欧美v久久久久久| 久久久三级国产网站| 波多野吉衣中文字幕| 久久久一区二区三区| 欧洲美熟女乱又伦| 中文字幕欧美区| 欧美色图17p| 一区在线观看视频| 四虎精品免费视频| 尤物在线观看一区| 国产亚洲精品成人| 偷拍亚洲欧洲综合| 欧美不卡视频在线观看| 欧美性xxxxxx| 中文字幕丰满人伦在线| 欧美丰满高潮xxxx喷水动漫| 国产男男gay体育生网站| 欧美一级专区免费大片| 亚洲国产日韩在线观看| 亚洲国产精品va在线观看黑人| 少妇高潮久久久| 精品亚洲国产视频| 国产经典自拍视频在线观看| www.欧美三级电影.com| 人人超在线公开视频| 亚洲**2019国产| 亚洲不卡系列| 97超碰在线播放| 奇米777国产一区国产二区| 日本一区二区精品视频| 欧美第一精品| www.在线观看av| 亚洲欧美日韩一区在线观看| 亚洲一级免费在线观看| 国产999精品久久| 97人妻精品一区二区免费| 国产精品久久久久久一区二区三区| 欧美日韩三级在线观看| 色综合天天做天天爱| 一区二区美女视频| 精品国产一区二区在线观看| 国产福利第一视频在线播放| 另类图片亚洲另类| 中文在线8资源库| 成人av电影天堂| 嫩草国产精品入口| 在线观看免费91| 一区二区黄色| 性欧美在线视频| 久久综合网色—综合色88| 紧身裙女教师波多野结衣| 福利微拍一区二区| 国产肥老妇视频| 国产亚洲精品久久久久动| 视频在线这里都是精品| 国产精品av电影| jizz性欧美2| 椎名由奈jux491在线播放| 一本不卡影院| 免费欧美一级片| 久久精品一区二区三区不卡牛牛| 国产精品成人免费观看| 欧美在线你懂得| 亚洲色欧美另类| 欧美成人精品一区| 欧美爱爱视频| 久久综合九色综合久99| 一区二区影院| 亚洲精品午夜在线观看| 91在线精品秘密一区二区| 玖玖爱这里只有精品| 欧美在线制服丝袜| 日本成人一区二区三区| 欧美黄色免费网站| 91精品麻豆| 视频三区二区一区| 亚洲欧美春色| 97人妻精品一区二区三区免费| 亚洲欧美综合另类在线卡通| 午夜精品免费观看| 日韩av网站导航| sis001亚洲原创区| 成人xxxxx色| 久久久久久久久丰满| 看欧美ab黄色大片视频免费| 97超碰欧美中文字幕| 国产无精乱码一区二区三区| 欧美一区二区播放| 黄色网址在线免费播放| 国产日产亚洲精品| 色狮一区二区三区四区视频| 美女喷白浆视频| 久久精品人人做人人爽97| 亚洲天堂av片| 亚洲国产三级网| 538在线视频| 国产一区二区三区四区五区在线 | 91精品人妻一区二区三区果冻| 亚洲性69xxxbbb| 日韩国产网站| 日韩精品第一页| 日韩在线一区二区| 亚洲av熟女国产一区二区性色| 色噜噜狠狠一区二区三区果冻| 牛牛影视精品影视| 国产精品国产三级国产专播精品人 | 日韩成人在线资源| 秋霞av亚洲一区二区三| 欧美日韩国产一二三区| 欧美日韩高清一区二区不卡| 幼a在线观看| 亚洲自拍小视频| 国产一区清纯| 欧美大片免费播放器| 色综合久久久久综合体桃花网| 可以在线观看的黄色| 国产精品久久久久久久久久久久| 日韩欧美视频在线播放| 亚洲精品中文字幕乱码无线| 亚洲男同性恋视频| 人人妻人人澡人人爽精品日本| 欧美一区二区三区……| 国产亚洲一区| 欧美丝袜在线观看| 亚洲成人免费在线| 国产毛片在线| 亚洲一区二区三区乱码aⅴ蜜桃女 亚洲一区二区三区乱码aⅴ | 亚洲欧美小视频| 亚洲大胆人体av| 性感美女一区二区在线观看| 国产精品av免费| 成人免费黄色在线| 亚洲第一网站在线观看| 久久精品国产2020观看福利| 51社区在线成人免费视频| 成人av一级片| 国产精品久久久久久户外露出 | 亚洲奶大毛多的老太婆| 全球中文成人在线| 国产精品无码人妻一区二区在线 | 欧洲一区二区日韩在线视频观看免费| 日本 国产 欧美色综合| 久久久久久久久久久久国产| 亚洲天堂成人在线| 精品三级国产| 免费无码国产v片在线观看| 国产精品久久久久久福利一牛影视| 亚洲国产中文字幕在线| 国产精品欧美激情在线播放| 韩日精品在线| www.日本高清视频| 亚洲第一国产精品| 看片一区二区| 黄色网页免费在线观看| 中文字幕一区二区三区四区| 天天在线女人的天堂视频|