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

利用神經網絡算法的C#手寫數字識別

人工智能 深度學習 算法
我決定用C#重新寫一下我的一些程序。我的程序已經取得了良好的效果,但還并不優秀(在收斂速度,錯誤率等方面)。

下載Demo -  2.77 MB (原始地址)

handwritten_character_recognition.zip

下載源碼 -  70.64 KB (原始地址)

nnhandwrittencharreccssource.zip

介紹

這是一篇基于Mike O'Neill 寫的一篇很棒的文章:神經網絡的手寫字符識別(Neural Network for Recognition of Handwritten Digits)而給出的一個人工神經網絡實現手寫字符識別的例子。盡管在過去幾年已經有許多系統和分類算法被提出,但是手寫識別任然是模式識別中的一項挑戰。Mike O'Neill的程序對想學習通過神經網絡算法實現一般手寫識別的程序員來說是一個極好的例子,尤其是在神經網絡的卷積部分。那個程序是用MFC/ C++編寫的,對于不熟悉的人來說有些困難。所以,我決定用C#重新寫一下我的一些程序。我的程序已經取得了良好的效果,但還并不優秀(在收斂速度,錯誤率等方面)。但這次僅僅是程序的基礎,目的是幫助理解神經網絡,所以它比較混亂,有重構的必要。我一直在試把它作為一個庫的方式重建,那將會很靈活,很簡單地通過一個INI文件來改變參數。希望有一天我能取得預期的效果。

字符檢測

模式檢測和字符候選檢測是我在程序中必須面對的最重要的問題之一。事實上,我不僅僅想利用另一種編程語言重新完成Mike的程序,而且我還想識別文檔圖片中的字符。有一些研究提出了我在互聯網上發現的非常好的目標檢測算法,但是對于像我這樣的業余項目來說,它們太復雜了。在教我女兒繪畫時發現的一個方法解決了這個問題。當然,它仍然有局限性,但在***次測試中就超出了我的預期。在正常情況下,字符候選檢測分為行檢測,字檢測和字符檢測幾種,分別采用不同的算法。我的做法和這有一點點不同。檢測使用相同的算法:

  1. public static Rectangle GetPatternRectangeBoundary 
  2.     (Bitmap original,int colorIndex, int hStep, int vStep, bool bTopStart)  

以及:

  1. public static List<Rectangle> PatternRectangeBoundaryList 
  2.     (Bitmap original, int colorIndex, int hStep, int vStep,  
  3.     bool bTopStart,int widthMin,int heightMin) 

通過改變參數hStep (水平步進)和vStep (垂直步進)可以簡單地檢測行,字或字符。矩形邊界也可以通過更改bTopStart 為true 或false實現從上到下和從左到右不同方式進行檢測。矩形被widthMin 和d限制。我的算法的***優點是:它可以檢測不在同一行的字或字符串。

字符候選識別可以通過以下方法實現:

  1. public void PatternRecognitionThread(Bitmap bitmap) 
  2.      { 
  3.          _originalBitmap = bitmap; 
  4.          if (_rowList == null
  5.          { 
  6.              _rowList = AForge.Imaging.Image.PatternRectangeBoundaryList 
  7.      (_originalBitmap,255, 30, 1, true, 5, 5); 
  8.              _irowIndex = 0; 
  9.  
  10.          } 
  11.          foreach(Rectangle rowRect in _rowList) 
  12.          { 
  13.              _currentRow = AForge.Imaging.ImageResize.ImageCrop 
  14.      (_originalBitmap, rowRect); 
  15.              if (_iwordIndex == 0) 
  16.              { 
  17.                  _currentWordsList = AForge.Imaging.Image.PatternRectangeBoundaryList 
  18.          (_currentRow, 255, 20, 10, false, 5, 5); 
  19.              } 
  20.  
  21.              foreach (Rectangle wordRect in _currentWordsList) 
  22.              { 
  23.                  _currentWord = AForge.Imaging.ImageResize.ImageCrop 
  24.          (_currentRow, wordRect); 
  25.                 _iwordIndex++; 
  26.                  if (_icharIndex == 0) 
  27.                  { 
  28.                      _currentCharsList = 
  29.          AForge.Imaging.Image.PatternRectangeBoundaryList 
  30.          (_currentWord, 255, 1, 1, false, 5, 5); 
  31.                  } 
  32.  
  33.                  foreach (Rectangle charRect in _currentCharsList) 
  34.                  { 
  35.                      _currentChar = AForge.Imaging.ImageResize.ImageCrop 
  36.          (_currentWord, charRect); 
  37.                     _icharIndex++; 
  38.                      Bitmap bmptemp = AForge.Imaging.ImageResize.FixedSize 
  39.          (_currentChar, 21, 21); 
  40.                      bmptemp = AForge.Imaging.Image.CreateColorPad 
  41.          (bmptemp,Color.White, 4, 4); 
  42.                      bmptemp = AForge.Imaging.Image.CreateIndexedGrayScaleBitmap 
  43.              (bmptemp); 
  44.                      byte[] graybytes = AForge.Imaging.Image.GrayscaletoBytes(bmptemp); 
  45.                      PatternRecognitionThread(graybytes); 
  46.                      m_bitmaps.Add(bmptemp); 
  47.                  } 
  48.                  string s = " \n"
  49.                  _form.Invoke(_form._DelegateAddObject, new Object[] { 1, s }); 
  50.                        If(_icharIndex ==_currentCharsList.Count
  51.                        { 
  52.                        _icharIndex =0; 
  53.                        } 
  54.               } 
  55.               If(_iwordIndex==__currentWordsList.Count
  56.               { 
  57.                        _iwordIndex=0; 
  58.               } 
  59.          } 

字符識別

原程序中的卷積神經網絡(CNN)包括輸入層在內本質上是有五層。卷積體系結構的細節已經在Mike和Simard博士在他們的文章《應用于視覺文件分析的卷積神經網絡的***實踐》中描述過了。這種卷積網絡的總體方案是用較高的分辨率去提取簡單的特征,然后以較低的分辨率將它們轉換成復雜的特征。生成較低分辨的最簡單方法是對子層進行二倍二次采樣。這反過來又為卷積核的大小提供了參考。核的寬度以一個單位(奇數大小)為中心被選定,需要足夠的重疊從而不丟失信息(對于一個單位3重疊顯得過小),同時不至于冗余(7重疊將會過大,5重疊能實現超過70%的重疊)。因此,在這個網絡中我選擇大小為5的卷積核。填充輸入(調整到更大以實現特征單元居中在邊界上)并不能顯著提高性能。所以不填充,內核大小設定為5進行二次采樣,每個卷積層將特征尺寸從n減小到(n-3)/2。由于在MNIST的初始輸入的圖像大小為28x28,所以在二次卷積后產生整數大小的近似值是29x29。經過兩層卷積之后,5x5的特征尺寸對于第三層卷積而言太小。Simard博士還強調,如果***層的特征少于五個,則會降低性能,然而使用超過5個并不能改善(Mike使用了6個)。類似地,在第二層上,少于50個特征會降低性能,而更多(100個特征)沒有改善。關于神經網絡的總結如下:

#0層:是MNIST數據庫中手寫字符的灰度圖像,填充到29x29像素。輸入層有29x29 = 841個神經元。

#1層:是一個具有6個特征映射的卷積層。從層#1到前一層有13×13×6 = 1014個神經元,(5×5 + 1)×6 = 156個權重,以及1014×26 = 26364個連接。

#2層:是一個具有五十(50)個特征映射的卷積層。從#2層到前一層有5x5x50 = 1250個神經元,(5x5 + 1)x6x50 = 7800個權重,以及1250x(5x5x6 + 1)= 188750個連接。

(在Mike的文章中不是有32500個連接)。 

#3層:是一個100個單元的完全連接層。有100個神經元,100x(1250 + 1)= 125100權重,和100x1251 = 125100連接。

#4層:是***的,有10個神經元,10×(100 + 1)= 1010個權重,以及10×10 1 = 1010個連接。

反向傳播

反向傳播是更新每個層權重變化的過程,從***一層開始,向前移動直到達到***個層。

在標準的反向傳播中,每個權重根據以下公式更新: 

(1)

其中eta是“學習率”,通常是類似0.0005這樣的小數字,在訓練過程中會逐漸減少。但是,由于收斂速度慢,標準的反向傳播在程序中不需要使用。相反,LeCun博士在他的文章《Efficient BackProp》中提出的稱為“隨機對角列文伯格-馬夸爾特法(Levenberg-Marquardt)”的二階技術已得到應用,盡管Mike說它與標準的反向傳播并不相同,理論應該幫助像我這樣的新人更容易理解代碼。

在Levenberg-Marquardt方法中,rw 計算如下:

假設平方代價函數是:

那么梯度是:

而Hessian遵循如下規則:

Hessian矩陣的簡化近似為Jacobian矩陣,它是一個維數為N×O的半矩陣。

用于計算神經網絡中的Hessian矩陣對角線的反向傳播過程是眾所周知的。假設網絡中的每一層都有:

(7)

使用Gaus-Neuton近似(刪除包含|'(y))的項,我們得到:

(8)

(9)

以及:

隨機對角列文伯格-馬夸爾特(Levenberg-Marquardt)法

事實上,使用完整Hessian矩陣信息(Levenberg-Marquardt,Gaus-Newton等)的技術只能應用于以批處理模式訓練的非常小的網絡,而不能用于隨機模式。為了獲得Levenberg- Marquardt算法的隨機模式,LeCun博士提出了通過關于每個參數的二階導數的運算估計來計算Hessian對角線的思想。瞬時二階導數可以通過反向傳播獲得,如公式(7,8,9)所示。只要我們利用這些運算估計,可以用它們來計算每個參數各自的學習率:

其中e是全局學習速率,并且

是關于h ki的對角線二階導數的運算估計。m是防止h ki在二階導數較小的情況下(即優化在誤差函數的平坦部分移動時)的參數。可以在訓練集的一個子集(500隨機化模式/ 60000訓練集的模式)中計算二階導數。由于它們變化非常緩慢,所以只需要每隔幾個周期重新估計一次。在原來的程序中,對角線Hessian是每個周期都重新估算的。

這里是C#中的二階導數計算函數:

  1. public void BackpropagateSecondDerivatives(DErrorsList d2Err_wrt_dXn /* in */, 
  2.                                                     DErrorsList d2Err_wrt_dXnm1 /* out */) 
  3.     // 命名(從NeuralNetwork類繼承) 
  4.     // 注意:盡管我們正在處理二階導數(而不是一階), 
  5.     // 但是我們使用幾乎相同的符號,就好像有一階導數 
  6.     // 一樣,否則ASCII的顯示會令人誤解。 我們添加一 
  7.     // 個“2”而不是兩個“2”,比如“d2Err_wrt_dXn”,以簡 
  8.     // 單地強調我們使用二階導數 
  9.     // 
  10.     // Err是整個神經網絡的輸出誤差 
  11.     // Xn是第n層上的輸出向量 
  12.     // Xnm1是前一層的輸出向量 
  13.     // Wn是第n層權重的向量 
  14.     // Yn是第n層的激活值, 
  15.     // 即,應用擠壓功能之前的輸入的加權和 
  16.     // F是擠壓函數:Xn = F(Yn) 
  17.     // F'是擠壓函數的導數 
  18.     // 簡單說,對于F = tanh,則F'(Yn)= 1-Xn ^ 2,即, 
  19.     // 可以從輸出中計算出導數,而不需要知道輸入 
  20.   
  21.     int ii, jj; 
  22.     uint kk; 
  23.     int nIndex; 
  24.     double output
  25.     double dTemp; 
  26.   
  27.     var d2Err_wrt_dYn = new DErrorsList(m_Neurons.Count); 
  28.     // 
  29.     // std::vector< double > d2Err_wrt_dWn( m_Weights.size(), 0.0 ); 
  30.     // important to initialize to zero 
  31.     ////////////////////////////////////////////////// 
  32.     // 
  33.     ///// 設計 TRADEOFF: REVIEW !! 
  34.     // 
  35.     // 請注意,此命名的方案與NNLayer :: Backpropagate() 
  36.     // 函數中的推理相同,即從該函數派生的 
  37.     // BackpropagateSecondDerivatives()函數 
  38.     // 
  39.     // 我們希望對數組“d2Err_wrt_dWn”使用STL向量(為了便于編碼) 
  40.     // ,這是圖層中當前模式的錯誤權重的二階微分。 但是,對于 
  41.     // 具有許多權重的層(例如完全連接的層),也有許多權重。 分 
  42.     // 配大內存塊時,STL向量類的分配器非常愚蠢,并導致大量的頁 
  43.     // 面錯誤,從而導致應用程序總體執行時間減慢。 
  44.   
  45.     // 為了解決這個問題,我嘗試使用一個普通的C數組, 
  46.     // 并從堆中取出所需的空間,并在函數結尾處刪除[]。 
  47.     // 但是,這會導致相同數量的頁面錯誤錯誤,并 
  48.     // 且不會提高性能。 
  49.   
  50.     // 所以我試著在棧上分配一個普通的C數組(即不是堆)。 
  51.     // 當然,我不能寫double d2Err_wrt_dWn [m_Weights.size()]; 
  52.     // 因為編譯器堅持一個編譯時間為數組大小的已知恒定值。 
  53.     // 為了避免這個需求,我使用_alloca函數來分配堆棧上的內存。 
  54.     // 這樣做的缺點是堆棧使用過多,可能會出現堆棧溢出問題。 
  55.     // 這就是為什么將它命名為“Review” 
  56.  
  57.   
  58.     double[] d2Err_wrt_dWn = new double[m_Weights.Count]; 
  59.     for (ii = 0; ii < m_Weights.Count; ++ii) 
  60.     { 
  61.         d2Err_wrt_dWn[ii] = 0.0; 
  62.     } 
  63.     // 計算 d2Err_wrt_dYn = ( F'(Yn) )^2 * 
  64.     //    dErr_wrt_Xn (其中dErr_wrt_Xn實際上是二階導數) 
  65.   
  66.     for (ii = 0; ii < m_Neurons.Count; ++ii) 
  67.     { 
  68.         output = m_Neurons[ii].output
  69.         dTemp = m_sigmoid.DSIGMOID(output); 
  70.         d2Err_wrt_dYn.Add(d2Err_wrt_dXn[ii] * dTemp * dTemp); 
  71.     } 
  72.     // 計算d2Err_wrt_Wn =(Xnm1)^ 2 * d2Err_wrt_Yn 
  73.     // (其中dE2rr_wrt_Yn實際上是二階導數) 
  74.     // 對于這個層中的每個神經元,通過先前層的連接 
  75.     // 列表,并更新相應權重的差分 
  76.   
  77.     ii = 0; 
  78.     foreach (NNNeuron nit in m_Neurons) 
  79.     { 
  80.         foreach (NNConnection cit in nit.m_Connections) 
  81.         { 
  82.             try 
  83.             { 
  84.                  kk = (uint)cit.NeuronIndex; 
  85.                 if (kk == 0xffffffff) 
  86.                 { 
  87.                     output = 1.0; 
  88.                     // 這是隱含的聯系; 隱含的神經元輸出“1” 
  89.                 } 
  90.                 else 
  91.                 { 
  92.                     output = m_pPrevLayer.m_Neurons[(int)kk].output
  93.                 } 
  94.   
  95.                 //  ASSERT( (*cit).WeightIndex < d2Err_wrt_dWn.size() ); 
  96.                 //  因為在將d2Err_wrt_dWn更改為C風格的 
  97.                 //  數組之后,size()函數將不起作用 
  98.  
  99.                 d2Err_wrt_dWn[cit.WeightIndex] = d2Err_wrt_dYn[ii] * output * output
  100.             } 
  101.             catch (Exception ex) 
  102.             { 
  103.   
  104.            } 
  105.         } 
  106.   
  107.         ii++; 
  108.     } 
  109.     // 計算d2Err_wrt_Xnm1 =(Wn)^ 2 * d2Err_wrt_dYn 
  110.     // (其中d2Err_wrt_dYn是不是***個二階導數)。 
  111.     // 需要d2Err_wrt_Xnm1作為d2Err_wrt_Xn的 
  112.     // 二階導數反向傳播的輸入值 
  113.     // 對于下一個(即先前的空間)層 
  114.     // 對于這個層中的每個神經元 
  115.   
  116.     ii = 0; 
  117.     foreach (NNNeuron nit in m_Neurons) 
  118.     { 
  119.         foreach (NNConnection cit in nit.m_Connections) 
  120.         { 
  121.             try 
  122.             { 
  123.                 kk = cit.NeuronIndex; 
  124.                 if (kk != 0xffffffff) 
  125.                 { 
  126.         // 我們排除了ULONG_MAX,它表示具有恒定輸出“1”的 
  127.         // 虛偏置神經元,因為我們不能正真訓練偏置神經元 
  128.   
  129.                     nIndex = (int)kk; 
  130.                     dTemp = m_Weights[(int)cit.WeightIndex].value; 
  131.                     d2Err_wrt_dXnm1[nIndex] += d2Err_wrt_dYn[ii] * dTemp * dTemp; 
  132.                 } 
  133.             } 
  134.             catch (Exception ex) 
  135.             { 
  136.                 return
  137.             } 
  138.         } 
  139.   
  140.         ii++;  // ii 跟蹤神經元迭代器 
  141.     } 
  142.     double oldValue, newValue; 
  143.   
  144.     // ***,使用dErr_wrt_dW更新對角線的層 
  145.     // 神經元的權重。通過設計,這個函數 
  146.     // 以及它對許多(約500個模式)的迭代被 
  147.     // 調用,而單個線程已經鎖定了神經網絡, 
  148.     // 所以另一個線程不可能改變Hessian的值。 
  149.     // 不過,由于這很容易做到,所以我們使用一 
  150.     // 個原子比較交換操作,這意味著另一個線程 
  151.     // 可能在二階導數的反向傳播過程中,而且Hessians 
  152.     // 可能會稍微移動 
  153.   
  154.     for (jj = 0; jj < m_Weights.Count; ++jj) 
  155.     { 
  156.         oldValue = m_Weights[jj].diagHessian; 
  157.         newValue = oldValue + d2Err_wrt_dWn[jj]; 
  158.         m_Weights[jj].diagHessian = newValue; 
  159.     } 
  160. ////////////////////////////////////////////////////////////////// 

訓練和實驗

盡管MFC / C ++和C#之間存不兼容,但是我的程序與原程序相似。使用MNIST數據庫,網絡在60,000個訓練集模式中執行后有291次錯誤識別。這意味著錯誤率只有0.485%。然而,在10000個模式中,有136個錯誤識別,錯誤率為1.36%。結果并不像基礎測試那么好,但對我來說,用我自己的手寫字符集做實驗已經足夠了。首先將輸入的圖像從上到下分為字符組,然后在每組中把字符從左到右進行檢測,調整到29x29像素,然后由神經網絡系統識別。該方案滿足我的基本要求,我自己的手寫數字是可以被正確識別的。在AForge.Net的圖像處理庫中添加了檢測功能,以便使用。但是,因為它只是在我的業余時間編程,我相信它有很多的缺陷需要修復。反向傳播時間就是一個例子。每個周期使用大約3800秒的訓練時間,但是只需要2400秒。(我的電腦使用了英特爾奔騰雙核E6500處理器)。與Mike的程序相比,速度相當慢。我也希望能有一個更好的手寫字符數據庫,或者與其他人合作,繼續我的實驗,使用我的算法開發一個真正的應用程序。

原文鏈接:https://www.codeproject.com/Articles/143059/Neural-Network-for-Recognition-of-Handwritten-Di

作者:Vietdungiitb

【本文是51CTO專欄作者“云加社區”的原創稿件,轉載請通過51CTO聯系原作者獲取授權】

戳這里,看該作者更多好文

 

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2017-12-28 14:44:42

Python人工智能神經網絡

2018-04-03 11:20:00

深度學習

2022-10-11 23:35:28

神經網絡VGGNetAlexNet

2017-11-30 18:05:18

2021-11-12 15:41:42

LSTM神經網絡人工智能

2020-09-09 10:20:48

GraphSAGE神經網絡人工智能

2022-10-19 07:42:41

圖像識別神經網絡

2018-04-08 11:20:43

深度學習

2022-06-16 10:29:33

神經網絡圖像分類算法

2017-04-26 09:30:53

卷積神經網絡實戰

2024-10-17 13:05:35

神經網絡算法機器學習深度學習

2020-08-20 07:00:00

深度學習人工智能技術

2024-09-12 08:28:32

2018-04-03 14:42:46

Python神經網絡深度學習

2018-07-03 16:10:04

神經網絡生物神經網絡人工神經網絡

2018-07-29 15:27:04

AI訓練光速運算人工智能

2025-03-03 08:10:00

神經網絡深度學習人工智能

2009-08-21 17:02:31

C#編寫數字轉換中文算

2018-02-05 08:58:36

Python神經網絡識別圖像

2017-09-08 13:30:32

深度學習圖像識別卷積神經網絡
點贊
收藏

51CTO技術棧公眾號

国产伦精品一区二区三区精品视频| 欧美在线啊v一区| 国内精品一区二区| 黄色在线观看国产| 国产一区日韩| 色哟哟欧美精品| 亚洲一一在线| 狠狠综合久久av一区二区| 亚洲高清av| 国产一区二区三区欧美| 中文字幕剧情在线观看| 电影k8一区二区三区久久 | 97在线精品国自产拍中文| 国产精品无码一区二区三区免费 | 欧美日韩国产精品| 日日夜夜精品网站| 国产又粗又猛又爽| 国产亚洲欧洲| 超碰97人人做人人爱少妇| 无遮挡aaaaa大片免费看| 精品亚洲a∨| 亚洲18色成人| 一区二区三区四区五区视频| 日韩在线视频免费| 国产一区二区福利| 国产精品福利片| 国产无码精品在线播放| 欧美疯狂party性派对| 精品亚洲va在线va天堂资源站| 日韩av自拍偷拍| 在线日本欧美| 天天色图综合网| 国产成人生活片| 在线a人片免费观看视频| xf在线a精品一区二区视频网站| 91视频国产高清| 午夜精品久久久久久久蜜桃| 亚洲第一毛片| 欧美—级高清免费播放| 秋霞欧美一区二区三区视频免费| 亚洲国产网址| 日韩成人av在线播放| 日韩精品xxx| 欧美videos粗暴| 日韩欧美亚洲范冰冰与中字| 特级黄色录像片| 免费高清在线观看| 国产亚洲午夜高清国产拍精品| 99re在线观看| 国产日韩精品suv| 日本亚洲一区二区| 欧美在线播放视频| 国产在线免费视频| 夜间精品视频| 俺去了亚洲欧美日韩| 国产手机在线观看| 亚洲人挤奶视频| 欧美日韩国产综合久久| 久久亚洲中文字幕无码| 日本小视频在线免费观看| 亚洲欧美自拍偷拍色图| 九9re精品视频在线观看re6| 亚洲第一第二区| 国产乱码精品1区2区3区| 国产中文字幕91| 欧美激情一区二区三区免费观看 | 成人爽a毛片| 欧美一区二区久久久| 亚洲精品第三页| 欧美一级做a| 欧美偷拍一区二区| 香蕉视频网站入口| 成人免费在线观看视频| 91国产成人在线| 精品久久久久久久无码 | 亚洲国产精品一区二区尤物区| 国内外成人激情免费视频| 天堂中文8资源在线8| 95精品视频在线| 91在线高清视频| 成人久久精品人妻一区二区三区| 国产激情一区二区三区四区| av噜噜色噜噜久久| 黑人乱码一区二区三区av| 成人三级伦理片| 久99久在线| 免费在线看v| 91免费国产在线观看| 免费在线观看一区二区| 蝌蚪视频在线播放| 国产精品网友自拍| 免费久久久久久| 午夜成年人在线免费视频| 亚洲综合在线视频| 黄色影院一级片| 高清不卡av| 欧美在线999| 午夜影院免费版| 视频欧美一区| 一区二区三区视频免费| 美女三级黄色片| 国产一区清纯| 韩剧1988在线观看免费完整版| 久久久久久91亚洲精品中文字幕| 日韩精品亚洲一区二区三区免费| 国产精品一二三在线| 国产一区二区麻豆| 成人精品高清在线| 热re99久久精品国产99热| 91精品国产综合久久久久久豆腐| 中文字幕中文在线不卡住| 国产精品久久久久7777| 手机av在线| 91精品国产综合久久久久久久 | 亚洲欧美激情视频| 欧美丰满熟妇bbbbbb| 亚洲三级影院| 国产情人节一区| 亚洲国产999| 欧美极品aⅴ影院| japanese在线播放| 中文字幕这里只有精品| 51精品久久久久久久蜜臀| 无码精品一区二区三区在线播放| 日韩理论电影院| 免费91在线视频| 国产性xxxx高清| 狠狠色丁香久久婷婷综合丁香| 精品欧美一区二区三区久久久| aiai在线| 激情成人中文字幕| 午夜免费福利网站| 国产精品亚洲人成在99www| 免费av一区二区| 国产伦精品一区二区三区视频网站| 国内精品久久久久影院色| 蜜桃av久久久亚洲精品| 深夜国产在线播放| 欧美精品免费视频| www.狠狠爱| 伊人久久亚洲热| 国产日韩欧美成人| 美女做暖暖视频免费在线观看全部网址91| 亚洲另类在线一区| 怡红院亚洲色图| 国产精品美女久久久久久不卡| 欧美极品少妇xxxxⅹ裸体艺术 | 欧美日韩精品欧美日韩精品一 | 亚洲欧美清纯在线制服| 7777精品伊久久久大香线蕉语言| 成人欧美亚洲| 色婷婷精品大视频在线蜜桃视频| 日韩少妇一区二区| 欧美久色视频| 999精品在线观看| 久久日韩视频| 欧美日韩黄色一区二区| 在线视频第一页| 日日夜夜免费精品视频| 精品高清视频| 538视频在线| 精品黑人一区二区三区久久| 国产suv一区二区三区| 久久69国产一区二区蜜臀| 亚洲成人蜜桃| 欧美日韩va| 日韩综合视频在线观看| 在线观看亚洲欧美| 久久久影视传媒| 国产在线青青草| 亚洲国产合集| 国产精品国产福利国产秒拍| 美女欧美视频在线观看免费| 色999日韩国产欧美一区二区| 毛茸茸多毛bbb毛多视频| 亚洲一级在线| 欧美一卡2卡3卡4卡无卡免费观看水多多| 成人bbav| 亚洲欧洲激情在线| 无码人妻丰满熟妇区bbbbxxxx| 99久久精品免费看| 日韩不卡视频一区二区| 国产日韩欧美中文在线| 欧美成人精品影院| 欧美视频在线观看一区二区三区| 亚洲国产精品久久人人爱 | 精品一区二区三区亚洲| 九九久久精品一区| 亚洲国产精品久久人人爱潘金莲| 综合自拍亚洲综合图不卡区| 国产调教打屁股xxxx网站| 激情五月***国产精品| 精品国产一区二区三| 黑人巨大精品| www.日韩av.com| 亚洲第一精品网站| 色综合天天性综合| 久久久免费看片| 国产精品亚洲第一| 奇米精品一区二区三区| 成人精品亚洲| 91欧美视频网站| 伊人久久精品一区二区三区| 色一区av在线| 丰满熟妇人妻中文字幕| 欧美最猛性xxxxx直播| 国产黄色小视频网站| 北条麻妃国产九九精品视频| 国产激情在线观看视频| 亚洲视频在线免费| 久热这里只精品99re8久| 国精品产品一区| 少妇高潮久久久久久潘金莲| 神宫寺奈绪一区二区三区| 日韩欧美国产网站| 欧美成人三级在线观看| 91亚洲国产成人精品一区二三| 亚洲欧美在线精品| 激情婷婷欧美| 香蕉精品视频在线| 精品一区免费| 国产精品12| 国产精品毛片久久久久久久久久99999999 | 国产激情在线观看视频| 在线中文字幕亚洲| 日韩精品第一页| av综合网页| 日韩av片永久免费网站| 午夜dj在线观看高清视频完整版 | 国产精品福利av| 亚洲国产精品成人综合久久久| 精品一区二区三区久久| 青青青免费在线| 欧美激情综合| 欧美一区1区三区3区公司| 欧美成人精品午夜一区二区| 国产成人精品视频在线观看| 超清av在线| 久久久极品av| av电影在线观看| 亚洲欧美制服第一页| 六月婷婷中文字幕| 日韩一卡二卡三卡国产欧美| 亚洲精品91天天久久人人| 欧美日韩激情网| 国产对白videos麻豆高潮| 亚洲色大成网站www久久九九| 国产呦小j女精品视频| 久久精品99国产精品| 熟妇人妻无乱码中文字幕真矢织江| 亚洲精品四区| 日韩精品久久一区二区| 91精品综合| 日韩欧美视频一区二区三区四区| 国内精品偷拍| 国产精品99久久久久久久| 国产麻豆一区二区三区| 91精品国产自产在线观看永久| 日韩电影免费观| 欧美专区在线播放| 超级碰碰久久| 日本三级久久久| 春色校园综合激情亚洲| 久久av中文字幕| 免费av毛片在线看| 久久久999国产精品| 欧洲美女少妇精品| 精品国偷自产在线视频99| 嫩草在线视频| 成人444kkkk在线观看| 成人福利网站| 欧美裸体xxxx极品少妇| 91精品专区| www高清在线视频日韩欧美| 香港伦理在线| 久久久国产在线视频| 18视频在线观看| 久久99国产精品自在自在app| 中文字幕免费高清电视剧网站在线观看 | 欧美视频在线免费播放| 亚洲一区二区毛片| 欧美激情国产精品日韩| 日韩主播视频在线| 99re精彩视频| 国产激情视频一区二区在线观看| 日本中文字幕在线不卡| 91啪亚洲精品| 国产破处视频在线观看| 亚洲美女淫视频| 国产无遮挡又黄又爽在线观看| 精品福利在线视频| 国产成人无码专区| 欧美精品vⅰdeose4hd| 国内精品久久久久久久久久久| 亚洲黄色免费三级| 在线激情小视频| 欧美激情欧美激情| 国产免费不卡| 91精品视频专区| 九九热hot精品视频在线播放| 久久久久天天天天| 99久久综合| 久久久久久久久久网| 毛片av中文字幕一区二区| 潘金莲一级淫片aaaaa| 91免费视频大全| av成人免费网站| 黑人与娇小精品av专区| 亚洲一级视频在线观看| 精品少妇一区二区三区免费观看 | www.久久久| 视频国产一区| 天堂а√在线中文在线| 亚洲欧美激情诱惑| www激情五月| 久久久不卡影院| 天天干中文字幕| 日韩欧美中文字幕在线观看| 国产夫妻在线观看| 亚洲欧美日韩久久久久久| 精品麻豆一区二区三区| 欧美综合在线观看| 1769国产精品视频| 亚洲精品一品区二品区三品区| 黄色av日韩| 欧美日韩中文不卡| 不卡一区二区中文字幕| 国产高清视频免费在线观看| 欧美天堂在线观看| 亚洲伦理在线观看| 色妞一区二区三区| 中文在线最新版地址| 97中文在线观看| 99久久久久| 国内自拍视频一区| 97se亚洲国产综合自在线不卡| 激情五月婷婷在线| 8x8x8国产精品| av在线播放av| 国产精品69av| 先锋影音国产精品| 国产日韩欧美精品在线观看| 日本女优在线视频一区二区| av网页在线观看| 一区二区成人在线视频| 91在线你懂的| 中文字幕日韩欧美在线视频| 亚洲淫成人影院| 成人永久免费| 欧美亚韩一区| 一区二区三区四区影院| 亚洲女厕所小便bbb| 91av久久久| 中文字幕在线精品| 欧美日韩五码| 日韩av电影免费在线观看| 亚洲精品黄色| 国精产品一区二区三区| 欧美特级www| 你懂的在线免费观看| 91精品国产精品| 欧美精品国产白浆久久久久| 久久综合久久网| 国产白丝精品91爽爽久久| 国产精品 欧美 日韩| 亚洲第一综合天堂另类专| 日本三级韩国三级欧美三级| 91国产在线播放| 欧美日韩一区自拍 | 成人av电影免费在线播放| 久久久综合久久| 精品国产91乱码一区二区三区 | 成人av在线天堂| 欧美在线网站| youjizz.com日本| 欧美日韩国产黄| 精品视频二区| 国产美女搞久久| 这里只有精品在线| 午夜天堂在线视频| 亚洲视频综合在线| 亚洲精品视频网| 91av免费观看91av精品在线| 香蕉精品久久| 亚洲第一狼人区| 亚洲欧美一区二区三区久本道91| av中文在线观看| 久久久国产视频| 成人线上播放| 国产一级片黄色| 亚洲欧美日韩久久| 天堂中文在线看| 国产精品美女免费看| 亚洲高清资源在线观看| 国产免费无码一区二区| 欧美日韩中文字幕日韩欧美| 亚洲成人影院麻豆| 波多野结衣久草一区| 一本色道久久综合亚洲精品不| 午夜时刻免费入口|