青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 89  文章 - 118  trackbacks - 0
<2012年12月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

留言簿(16)

隨筆分類(56)

隨筆檔案(89)

文章分類

推薦博客

搜索

  •  

最新隨筆

最新評論

閱讀排行榜

通過這篇文章我們主要回答以下幾個問題:

 

1.    LSH解決問題的背景,即以圖片相似性搜索為例,如何解決在海量數(shù)據(jù)中進行相似性查找?

2.    圖像相似性查找的連帶問題:相似性度量,特征提取;

3.    LSH的數(shù)學分析,即局部敏感HASH函數(shù)的數(shù)學原理,通過與、或構(gòu)造提升查找的查全率與查準率

4.    LSH具體實現(xiàn),對著代碼一步一步學習算法的具體實現(xiàn)

 

一、問題背景介紹

 

LSH即Locality Sensitive hash,用來解決在海量數(shù)據(jù)中進行相似性查找的問題,以圖片搜索為例,見下圖,用戶向百度圖搜提交待搜索圖片,百度圖搜將相似的圖片返回展示。

 

要實現(xiàn)這樣一個應(yīng)用,需要考慮以下幾個問題:

 

1.    提取用戶提交的圖片特征,即將提交圖片轉(zhuǎn)換成一個特征向量;

2.    預先將所有收集到的圖片進行特征提取;

3.    把步驟1中提取的特征與步驟2中的特征集合,進行比對,并記錄比對的相似性值;

4.    對相似值由大到小排序,返回相似度最高的作為檢索結(jié)果。

 

問題1,2是一個圖片特征提取的問題,與LSH無關(guān)。LSH主要解決問題3與問題4,在海量特征集中找到相似特征。以下簡述問題1,2,詳細講解問題3,4。

 

二、圖像的特征提取

 

圖像的特征提取屬于個圖像學研究領(lǐng)域,有很多經(jīng)典的圖像算法,分別從圖像顏色,角度,形態(tài)不同角度進行圖像的特征描述,包括最近流行的深度學習方法也可以做類似的事情。這里介紹一種比較容易理解的2種方法,一種是傳統(tǒng)的顏色直方圖,一種是自編碼器。

 

1.    顏色直方圖就是將RGB圖像中出現(xiàn)的顏色進行統(tǒng)計,將一張圖像描述中一個256維度的特征向量,如下圖所示:

 

2.    自編碼器的思想是通過神經(jīng)網(wǎng)絡(luò)進行特征提取,提取出針對學習樣本的通用特征降維方法,用訓練得到的統(tǒng)一方法對待測圖像進行降維處理,得到一個特征向量。

 

如圖所示,神經(jīng)網(wǎng)絡(luò)的2端通過相同的數(shù)據(jù)限制,學習到中間的隱藏層權(quán)重,通過使用降維再升維的方法,使隱藏層輸出最大限度的保存圖像的主要特征,以使還原后的圖像與原圖像誤差達到最小。

 

自編碼器完成訓練后,使用輸入層到隱藏層的權(quán)重向量進行特征提取,將圖像數(shù)據(jù)作為輸入層輸入,將隱藏層輸出作為圖像特征,以此作為圖像的特征。

 

三、特征的相似性比較

 

相似是一個形容詞,對于一對圖像使用不同的評價標準可能得到不同相似度量值。比如對于不同的業(yè)務(wù)場景,如相貌識別、形態(tài)識別、背景識別所采用相似度量方法可能完全是不同的。

 

同樣從數(shù)學的角度進行特征的相似性比較也有不同的方法,如果把特征向量看成空間的一個點,那么可以把度量2個向量的相似性看做度量多維空間中的2個點的距離,這些度量方法包括:

 

歐式距離

Jaccard距離


余弦距離


曼哈頓距離


閔可夫斯基距離


 

作為一個距離的度量函數(shù)d,必須滿足以下一些性質(zhì)

      d(x,y)>=0,距離非負性

      d(x,y)=0當切僅當x=y,只有點到自身的距離為0,其他距離都大于0

      d(x,y)=d(y,x),距離對稱性

      d(x,y)<=d(x,z)+d(z,y),滿足三角不等式

 

當完成了第1,第2步以后,即能提取圖像的特征,又找到了方法可以度量圖像特征的相似后,剩下的事情就是要預先將圖像庫的所有圖像一一提取特征,在搜索時用同樣的特征提取方法對待測圖像提取特征,然后將待搜特征循環(huán)與圖像庫中的圖像特征集合比較,找到相似度最高的。

 

四、局部敏感hash

 

由于圖像庫的特征通常數(shù)量很大,循環(huán)比較的時間復雜度過高,無法滿足應(yīng)用的響應(yīng)需要。因此,必須要使用類似的索引技術(shù)來降低搜索的復雜性,多維索引有一種叫KD樹的技術(shù)可以做類似的事情,但是對于圖像搜索的場景另外一種LSH的技術(shù)更有用。

 

回顧問題的背景,現(xiàn)在已經(jīng)預先將圖像庫中的圖像都轉(zhuǎn)換成了特征并組成特征集合(所有特征的維度都是相同的):

 

[[20,….,………….61],

…,

[[31,….,………….55]]

 

同時也用相同的特征提取算法提取了用戶提交圖像的特征,如:

[1,2,3,4,5,6,….,60]

現(xiàn)在的問題是從第一個特征集中找到與用戶圖像特征相似度最高的一些特征。

 

用一個p穩(wěn)定分布(p-stable distribution)定義如下:

      定義:對于一個實數(shù)集R上的分布D,如果存在P>=0,對任何n個實數(shù)v1,…,vn和n個滿足D分布的變量X1,…,Xn,隨機變量ΣiviXi向量點乘,一個整數(shù)和(Σi|vi|p)1/pX(p(階)范數(shù),一個整數(shù))有相同的分布,其中X是服從D分布的一個隨機變量,則稱D為 一個p-穩(wěn)定分布。比如p=1是柯西分布,p=2時是高斯分布。

 

這里面有幾個基本問題必須要進行背景了解,向量點乘、范數(shù)、正態(tài)分布、同分布。

向量點乘:2個向量相同維度相乘,再相加。

范數(shù):是具有“長度”概念的函數(shù)。向量的0范數(shù),向量中非零元素的個數(shù)。向量的1范數(shù),為絕對值之和。向量的2范數(shù),就是通常意義上的模。

正態(tài)分布:這個太長見了,不多解釋。

同分布:2個數(shù)列同分布,意味著呈線性關(guān)系的兩個數(shù)列,可以理解為同比例縮放。

 

用通俗的語言進行解析上述定義就是:

 

取滿足正態(tài)分布的一個數(shù)列,與某個特征向量做向量點乘,得到一個數(shù)值,這個數(shù)值與這個特征向量本身的2階范數(shù)(即向量每一維的元素絕對值的平方和再開方,代表向量的長度,也是一個數(shù)值),有同分布的性質(zhì)。

 

假設(shè)有兩個圖像特征X1,X2,用這兩個特征分別與同一個正態(tài)分布的數(shù)列做向量點乘,所得到的2個數(shù)值在一維上的距離與X1,X2在多維上的歐氏距離是同分布的。

 

設(shè)正態(tài)分布數(shù)值為D,待計算的兩個圖像特征為X1,X2,則有:

|X1.D-X2.D| = (X1 – X2).D 同分布于 (X1 – X2) 的2階范數(shù)(即長度)。

(X1 – X2)是向量相減,得到一個新的向量,代表兩個特征的距離向量。

 

 

用圖像庫中N個圖像的N個特征分別與同一個正態(tài)分布的數(shù)列做向量點乘,得到的N個特征在一維上的點,我們用在一維上的點之間的距離度量多維空間的距離,當然這種相近是概率意義下的相近。為了簡化計算,把一維上的線劃分成段;為了提高算法的穩(wěn)定性,向量點乘后增加一個隨機的噪音。于是得到了一個新的哈希函數(shù):


a是p穩(wěn)定生成的隨機數(shù)列

b是(0,r)里的隨機數(shù), noise/隨機噪音

r為直線上分段的段長

V待計算特征向量,即圖像提取出來的特征

像這樣一類hash函數(shù)稱之為局部敏感hash函數(shù),下面給出局部敏感hash函數(shù)的定義:

將這樣的一族hash函數(shù) H={h:S→U} 稱為是(d1,d2,p1,p2)敏感的,如果對于任意H中的函數(shù)h,滿足以下2個條件:

     如果d(O1,O2)<d1,那么Pr[h(O1)=h(O2)]≥p1

     如果d(O1,O2)>d2,那么Pr[h(O1)=h(O2)]≤p2

其中,O1,O2∈S,表示兩個具有多維屬性的數(shù)據(jù)對象,d(O1,O2)為2個對象的相異程度,也就是相似度。

通俗的講就是:

      N個值足夠相似時

     映射為同一hash值的概率足夠大;

      N個值不足夠相似時

     映射為同一hash值的概率足夠小

可以用下圖來表示:


局部敏感HASH函數(shù)必要要滿足如下條件:

[1]   進行相似性搜索時,在概率上可以保證返回值的相似性

[2]   函數(shù)族中的各函數(shù),返回值在概率上相互獨立,概率獨立可以帶來以下好處

a)     統(tǒng)計獨立,滿足疊加多個函數(shù),提高查準率

b)     通過組合能夠避免偽正例、偽反例

[3]   搜索效率

a)     hash比對比線性查詢快

 

五、概率相似度度量與調(diào)節(jié)(與構(gòu)造與或構(gòu)造)

既然是在概率意義下相似性度量,必然會存在著相近樣本被hash到不同的hash值情況,同時也必然會存在不相近的樣本被hash到相同的hash值情況,前一種稱為偽反例,向一種稱為偽正例。

偽正例通過與構(gòu)造解決,即通過多個hash函數(shù),計算同一個特征的多個hash值,只有當多個hash函數(shù)均相同時,才認為特征相似。這有效避免了不相似的特征被判定為相似特征的情況。

偽反例通過或構(gòu)造解決,即通過多個hash函數(shù),計算同一個特征的多個hash值,只有多個hash函數(shù)有一個hash值相同時,即認為特征相似。這有效避免了相似的特征被判定為不相似特征的情況。

結(jié)合與構(gòu)造與或構(gòu)造2種方案,可以生成r*b個函數(shù),每r個hash函數(shù)帶表一組與構(gòu)造,每b組hash函數(shù)族代表一組或構(gòu)造,當滿足一個或構(gòu)造后特征判定為相似。設(shè)一組特征hash的相似概率為s,則通過hash函數(shù)與/或構(gòu)造后的相似概率為:

1-(1-s^r)^b

在這個概率函數(shù)中,s與hash函數(shù)的精度相關(guān),屬于不可調(diào)節(jié)參數(shù)。當r越大時,相似概率越小,當b越大時,相似概率越大。r與b作為LSH的超參數(shù)可以根據(jù)實際情況進行相應(yīng)的調(diào)節(jié)。

六、代碼分析

下面的LIRE上找到一份LSH的代碼實現(xiàn),這份代碼實現(xiàn)清晰明了,比網(wǎng)上大多數(shù)開源出來的代碼要更容易理解。 

  1 /*
  2  * This file is part of the LIRE project: http://www.semanticmetadata.net/lire
  3  * LIRE is free software; you can redistribute it and/or modify
  4  * it under the terms of the GNU General Public License as published by
  5  * the Free Software Foundation; either version 2 of the License, or
  6  * (at your option) any later version.
  7  *
  8  * LIRE is distributed in the hope that it will be useful,
  9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 11  * GNU General Public License for more details.
 12  *
 13  * You should have received a copy of the GNU General Public License
 14  * along with LIRE; if not, write to the Free Software
 15  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 16  *
 17  * We kindly ask you to refer the any or one of the following publications in
 18  * any publication mentioning or employing Lire:
 19  *
 20  * Lux Mathias, Savvas A. Chatzichristofis. Lire: Lucene Image Retrieval 鈥?
 21  * An Extensible Java CBIR Library. In proceedings of the 16th ACM International
 22  * Conference on Multimedia, pp. 1085-1088, Vancouver, Canada, 2008
 23  * URL: http://doi.acm.org/10.1145/1459359.1459577
 24  *
 25  * Lux Mathias. Content Based Image Retrieval with LIRE. In proceedings of the
 26  * 19th ACM International Conference on Multimedia, pp. 735-738, Scottsdale,
 27  * Arizona, USA, 2011
 28  * URL: http://dl.acm.org/citation.cfm?id=2072432
 29  *
 30  * Mathias Lux, Oge Marques. Visual Information Retrieval using Java and LIRE
 31  * Morgan & Claypool, 2013
 32  * URL: http://www.morganclaypool.com/doi/abs/10.2200/S00468ED1V01Y201301ICR025
 33  *
 34  * Copyright statement:
 35  * ====================
 36  * (c) 2002-2013 by Mathias Lux (mathias@juggle.at)
 37  *  http://www.semanticmetadata.net/lirehttp://www.lire-project.net
 38  *
 39  * Updated: 02.06.13 10:27
 40  */
 41 
 42 package net.semanticmetadata.lire.indexing.hashing;
 43 
 44 import java.io.*;
 45 import java.util.zip.GZIPInputStream;
 46 import java.util.zip.GZIPOutputStream;
 47 
 48 /**
 49  * <p>Each feature vector v with dimension d gets k hashes from a hash bundle h(v) = (h^1(v), h^2(v), , h^k(v)) with
 50  * h^i(v) = (a^i*v + b^i)/w (rounded down), with a^i from R^d and b^i in [0,w) <br/>
 51  * If m of the k hashes match, then we assume that the feature vectors belong to similar images. Note that m*k has to be bigger than d!<br/>
 52  * If a^i is drawn from a normal (Gaussian) distribution LSH approximates L2. </p>
 53  * <p/>
 54  * Note that this is just to be used with bounded (normalized) descriptors.
 55  *
 56  * @author Mathias Lux, mathias@juggle.at
 57  *         Created: 04.06.12, 13:42
 58  */
 59 public class LocalitySensitiveHashing {
 60     private static String name = "lshHashFunctions.obj";
 61     // 一組正態(tài)分布數(shù)列,長250,比實際用到的長一些
 62     private static int dimensions = 250;           // max d
 63     // 50組正態(tài)分布數(shù)列(供與/或構(gòu)造共同使用)
 64     public static int numFunctionBundles = 50;     // k
 65     // 一維線段的長度,公式中的r
 66     public static double binLength = 10;           // w
 67 
 68     private static double[][] hashA = null;  
 69     
 70     
 71     
 72     // a
 73     private static double[] hashB = null;        // b
 74     private static double dilation = 1d;         // defines how "stretched out" the hash values are.
 75 
 76     /**
 77      * Writes a new file to disk to be read for hashing with LSH.
 78      *
 79      * @throws java.io.IOException
 80      */
 81     // 產(chǎn)生hash函數(shù),并存儲到磁盤上
 82     public static void generateHashFunctions() throws IOException {
 83         File hashFile = new File(name);
 84         System.out.println(hashFile.getAbsolutePath());
 85         if (!hashFile.exists()) {
 86             ObjectOutputStream oos = new ObjectOutputStream(new GZIPOutputStream(new FileOutputStream(hashFile)));
 87             oos.writeInt(dimensions);
 88             oos.writeInt(numFunctionBundles);
 89             // 產(chǎn)生點乘結(jié)果相加的隨機數(shù)噪聲
 90             for (int c = 0; c < numFunctionBundles; c++) {
 91                 oos.writeFloat((float) (Math.random() * binLength));
 92             }
 93             // 產(chǎn)生 numFunctionBundles 組正態(tài)分布數(shù)列,每組dimensions個數(shù)字
 94             for (int c = 0; c < numFunctionBundles; c++) {
 95                 for (int j = 0; j < dimensions; j++) {
 96                     oos.writeFloat((float) (drawNumber() * dilation));
 97                 }
 98             }
 99             oos.close();
100         } else {
101             System.err.println("Hashes could not be written: " + name + " already exists");
102         }
103     }
104 
105     // 指定路徑名版本
106     public static void generateHashFunctions(String name) throws IOException {
107         File hashFile = new File(name);
108         if (!hashFile.exists()) {
109             ObjectOutputStream oos = new ObjectOutputStream(new GZIPOutputStream(new FileOutputStream(hashFile)));
110             oos.writeInt(dimensions);
111             oos.writeInt(numFunctionBundles);
112             for (int c = 0; c < numFunctionBundles; c++) {
113                 oos.writeFloat((float) (Math.random() * binLength));
114             }
115             for (int c = 0; c < numFunctionBundles; c++) {
116                 for (int j = 0; j < dimensions; j++) {
117                     oos.writeFloat((float) (drawNumber() * dilation));
118                 }
119             }
120             oos.close();
121         } else {
122             System.err.println("Hashes could not be written: " + name + " already exists");
123         }
124     }
125 
126     /**
127      * Reads a file from disk and sets the hash functions.
128      *
129      * @return
130      * @throws IOException
131      * @see LocalitySensitiveHashing#generateHashFunctions()
132      */
133     public static double[][] readHashFunctions() throws IOException {
134         return readHashFunctions(new FileInputStream(name));
135     }
136 
137     // 讀取存儲在磁盤上LSH hash函數(shù)值,計算圖像特征時反復使用同一套LSH函數(shù)
138     public static double[][] readHashFunctions(InputStream in) throws IOException {
139         ObjectInputStream ois = new ObjectInputStream(new GZIPInputStream(in));
140         dimensions = ois.readInt();
141         numFunctionBundles = ois.readInt();
142         double[] tmpB = new double[numFunctionBundles];
143         for (int k = 0; k < numFunctionBundles; k++) {
144             tmpB[k] = ois.readFloat();
145         }
146         LocalitySensitiveHashing.hashB = tmpB;
147         double[][] hashFunctions = new double[numFunctionBundles][dimensions];
148         for (int i = 0; i < hashFunctions.length; i++) {
149             double[] functionBundle = hashFunctions[i];
150             for (int j = 0; j < functionBundle.length; j++) {
151                 functionBundle[j] = ois.readFloat();
152             }
153         }
154         LocalitySensitiveHashing.hashA = hashFunctions;
155         return hashFunctions;
156     }
157 
158     /**
159      * Generates the hashes from the given hash bundles.
160      *
161      * @param histogram
162      * @return
163      */
164     // 計算一個特征的numFunctionBundles組hash特征
165     public static int[] generateHashes(double[] histogram) {
166         double product;
167         int[] result = new int[numFunctionBundles];
168         for (int k = 0; k < numFunctionBundles; k++) {
169             product = 0;
170             // 1. 向量點乘
171             for (int i = 0; i < histogram.length; i++) {
172                 product += histogram[i] * hashA[k][i];
173             }
174             // 2. 加上隨機噪音,除一維線段長度
175             result[k] = (int) Math.floor((product + hashB[k]/*加上隨機噪音*/) / binLength /*除一維線段長度*/);
176         }
177         return result;
178     }
179 
180 
181     /**
182      * Returns a random number distributed with standard normal distribution based on the Box-Muller method.
183      *
184      * @return
185      */
186     // Box-Muller算法,產(chǎn)生正態(tài)分布數(shù)
187     private static double drawNumber() {
188         double u, v, s;
189         do {
190             u = Math.random() * 2 - 1;
191             v = Math.random() * 2 - 1;
192             s = u * u + v * v;
193         } while (s == 0 || s >= 1);
194         return u * Math.sqrt(-2d * Math.log(s) / s);
195 //        return Math.sqrt(-2d * Math.log(Math.random())) * Math.cos(2d * Math.PI * Math.random());
196     }
197 
198     public static void main(String[] args) {
199         try {
200             generateHashFunctions();
201         } catch (IOException e) {
202             e.printStackTrace();
203         }
204     }
205 
206 
207 }
208 


七、總結(jié)

本文描述了LSH的適用場景、算法原理與算法分析,并配合源代碼幫助讀者理解算法原理,了解算法的實現(xiàn)要點。
程序員長期養(yǎng)成了從代碼反向?qū)W習知識的習慣,但是到了人工智能時代這種學習方式受到了很大的挑戰(zhàn),在一些復雜的數(shù)學背景知識面前,先了解背景知識是深入掌握的前提。



參考文獻:

Website:

[1] http://people.csail.mit.edu/indyk/ (LSH原作者)

[2] http://www.mit.edu/~andoni/LSH/ (E2LSH)


Paper:

[1] Approximate nearest neighbor: towards removing the curse of dimensionality

[2] Similarity search in high dimensions via hashing

[3] Locality-sensitive hashing scheme based on p-stable distributions 

[4] MultiProbe LSH Efficient Indexing for HighDimensional Similarity Search

[5] Near-Optimal Hashing Algorithms for Approximate Nearest Neighbor in High Dimensions

Tutorial:

[1] Locality-Sensitive Hashing for Finding Nearest Neighbors

[2] Approximate Proximity Problems in High Dimensions via Locality-Sensitive Hashing

[3] Similarity Search in High Dimensions


Book:

[1] Mining of Massive Datasets
[2] Nearest Neighbor Methods in Learning and Vision: Theory and Practice


Cdoe:

[1] http://sourceforge.net/projects/lshkit/?source=directory

[2] http://tarsos.0110.be/releases/TarsosLSH/TarsosLSH-0.5/TarsosLSH-0.5-Readme.html 

[3] http://www.cse.ohio-state.edu/~kulis/klsh/klsh.htm 

[4] http://code.google.com/p/likelike/ 

[5] https://github.com/yahoo/Optimal-LSH

[6] OpenCV LSH(分別位于legacy module和flann module中)




posted on 2018-02-24 13:10 胡滿超 閱讀(8940) 評論(0)  編輯 收藏 引用 所屬分類: 算法搜索引擎
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲免费影视| 欧美一区二区三区四区在线观看地址| 西西人体一区二区| 国产一本一道久久香蕉| 久久综合久久久| 老司机免费视频久久| 日韩午夜在线视频| 久久福利毛片| 在线中文字幕一区| 欧美在线综合视频| 日韩视频在线一区| 欧美在线日韩精品| 亚洲性视频网址| 麻豆久久精品| 久久福利影视| 欧美视频在线不卡| 浪潮色综合久久天堂| 欧美色123| 欧美黄色日本| 国产一区清纯| 一区二区三区不卡视频在线观看 | 亚洲美女av黄| 亚洲永久精品大片| 久久久久欧美| 欧美日韩一区二区三区在线视频| 久久久精品性| 国产精品久久久免费| 亚洲国产欧洲综合997久久| 欧美精品日韩| 欧美成人精品在线| 国产亚洲一区二区在线观看| 亚洲久久一区二区| 亚洲国产1区| 性亚洲最疯狂xxxx高清| 亚洲一区二区三区在线观看视频 | 一区二区三区免费看| 久久亚洲一区二区| 久久久国产精品一区二区中文| 欧美日韩国产精品一区二区亚洲| 美玉足脚交一区二区三区图片| 国产麻豆视频精品| 中文日韩在线视频| 亚洲午夜高清视频| 欧美三级视频在线播放| 亚洲国产一区二区a毛片| 在线不卡中文字幕播放| 欧美自拍偷拍午夜视频| 欧美在线观看视频一区二区| 国产精品毛片在线| 亚洲视频视频在线| 亚洲欧美国产高清va在线播| 欧美午夜电影一区| 99国产精品99久久久久久| 99v久久综合狠狠综合久久| 免费毛片一区二区三区久久久| 麻豆91精品91久久久的内涵| 激情另类综合| 欧美1区2区| 亚洲片国产一区一级在线观看| 日韩系列欧美系列| 欧美久久婷婷综合色| 亚洲乱码国产乱码精品精天堂| aⅴ色国产欧美| 国产精品s色| 午夜精品999| 老司机凹凸av亚洲导航| 91久久精品国产91久久| 欧美全黄视频| 午夜在线电影亚洲一区| 美女日韩欧美| 亚洲免费观看高清在线观看 | 裸体丰满少妇做受久久99精品| 影视先锋久久| 欧美国产国产综合| 宅男精品视频| 久久综合九色99| 亚洲精品日韩在线| 国产精品成人一区| 欧美一区二区三区免费在线看| 欧美承认网站| 亚洲一区二区三区在线观看视频 | 亚洲天堂av在线免费| 久久精品av麻豆的观看方式| 欧美 日韩 国产 一区| 韩日视频一区| 欧美激情aⅴ一区二区三区| 一区二区精品在线| 久久久久久久久久久久久久一区 | 久久激情五月婷婷| 91久久黄色| 亚洲欧美卡通另类91av| 国产嫩草影院久久久久| 玖玖玖国产精品| 欧美激情片在线观看| 正在播放欧美视频| 精久久久久久| 久久久999精品免费| 欧美激情中文字幕乱码免费| 一区在线视频| 欧美日韩一区二区免费视频| 久久精品99| 一区二区三区你懂的| 欧美激情1区| 欧美在线91| 一区二区三区欧美亚洲| 在线欧美日韩| 国产欧美一区二区三区在线老狼 | 久久国产福利| 亚洲乱码国产乱码精品精天堂| 国产精品夜夜嗨| 欧美久久久久久久久久| 欧美一区国产在线| 在线视频一区二区| 亚洲激情第一区| 久久手机精品视频| 欧美一区二区免费视频| 一本久道综合久久精品| 激情小说另类小说亚洲欧美 | 99国产精品久久| 亚洲第一免费播放区| 久久久久久久国产| 久久精品欧美| 久久精品国产一区二区电影| 亚洲一卡久久| 亚洲图片欧美午夜| 99精品国产在热久久下载| 在线免费观看成人网| 狠狠色香婷婷久久亚洲精品| 国产亚洲va综合人人澡精品| 国产精品青草久久久久福利99| 欧美日本在线| 欧美日本国产精品| 欧美精品免费在线观看| 欧美激情精品久久久久久黑人| 老巨人导航500精品| 久久久美女艺术照精彩视频福利播放| 午夜综合激情| 久久av一区二区三区漫画| 欧美一级片在线播放| 性欧美办公室18xxxxhd| 欧美一区二区福利在线| 欧美专区18| 久久中文欧美| 牛牛影视久久网| 欧美国产1区2区| 欧美日韩国产一区二区三区| 欧美精品一区二区三区视频| 欧美片在线观看| 国产精品成人一区| 国产嫩草影院久久久久| 国产婷婷97碰碰久久人人蜜臀| 欧美一级午夜免费电影| 亚洲国内高清视频| 久久嫩草精品久久久精品| 久久综合成人精品亚洲另类欧美| 久久亚洲春色中文字幕久久久| 美女网站久久| 亚洲国产精品va在看黑人| 亚洲国产精品视频| 99ri日韩精品视频| 亚洲欧美日韩国产中文在线| 欧美在线视频免费| 噜噜噜久久亚洲精品国产品小说| 欧美成人黄色小视频| 欧美日韩在线第一页| 国产精品日韩精品欧美在线 | 亚洲黑丝一区二区| 日韩亚洲欧美高清| 久久精品视频亚洲| 免费成人av在线看| 亚洲区一区二区三区| 亚洲综合三区| 免费一区视频| 国产精品日本| 亚洲片区在线| 欧美一区二区三区四区夜夜大片 | 国产欧美日韩高清| 在线观看成人网| 亚洲天堂视频在线观看| 久久成人精品一区二区三区| 欧美成在线视频| 亚洲一区二区在线免费观看| 久久狠狠亚洲综合| 久久久久久久91| 欧美激情精品久久久| 国产精品免费在线| 亚洲国产一区二区精品专区| 亚洲午夜三级在线| 久久综合久色欧美综合狠狠| 亚洲人成网站999久久久综合 | aa亚洲婷婷| 久久精品亚洲国产奇米99| 亚洲国产成人久久综合一区| 亚洲一区在线看| 欧美精品久久久久久久免费观看 | 亚洲自拍偷拍福利| 欧美v国产在线一区二区三区| 国产精品日本| 有坂深雪在线一区| 亚洲欧美日韩国产|