精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产美女久久精品| 亚洲精品综合精品自拍| 青青草视频在线视频| 蜜桃av噜噜一区二区三区麻豆| 国产精品亚洲二区| 亚洲成av人片一区二区梦乃| 欧美国产视频在线观看| 国产又黄又猛又爽| av成人毛片| 久久久国产视频91| 女尊高h男高潮呻吟| 国产一区二区99| 欧美日韩国产一区二区三区不卡 | 国产v亚洲v天堂无码| 国产一区二区99| 亚洲精品a级片| 欧美一区二区三区免费在线看| 亚洲综合欧美日韩| 天天色综合久久| 在线午夜精品| 另类少妇人与禽zozz0性伦| 91黄色免费视频| av在线亚洲一区| 色综合久久综合| 国产精品国产亚洲精品看不卡15 | 色135综合网| 亚洲精品一区二区三区影院| 538任你躁在线精品免费| 韩国成人二区| 亚洲精品成人少妇| 亚洲国产高清国产精品| 天堂中文在线8| 国产成人av电影在线播放| 欧美激情网友自拍| 国产精品三级在线观看无码| 视频一区日韩精品| 欧美日韩夫妻久久| 天堂在线资源视频| 亚洲三级欧美| 一区二区三区在线观看视频| 中文字幕日韩一区二区三区| 亚洲欧美国产高清va在线播放| 日韩一级免费| 久久久久久久97| 青娱乐国产在线视频| 任我爽精品视频在线播放| 日韩欧美在线综合网| 91精品视频国产| 9999在线精品视频| 911国产精品| 国内精品国产三级国产aⅴ久| а√在线天堂官网| 中文字幕精品一区二区精品绿巨人| 国产中文欧美精品| 国产精品视频第一页| 国产一区二区三区的电影 | 神马午夜在线视频| 亚洲国产乱码最新视频| 国产一区二区三区小说| 国产极品人妖在线观看| 亚洲高清一区二区三区| 老子影院午夜伦不卡大全| 天堂va在线| 亚洲第一综合色| 国产一区二区三区精彩视频| 91av亚洲| 亚洲精品一二三四区| 精品视频导航| 99久久久久久久久| 久久午夜影视| 国产免费一区视频观看免费 | 亚洲一级二级在线| a级黄色小视频| 亚洲成人看片| 亚洲日本在线看| 男女裸体影院高潮| www.综合| 欧美日韩国产精品成人| 成人免费观看毛片| 欧洲成人一区| 色婷婷狠狠综合| 亚欧激情乱码久久久久久久久| 天堂√中文最新版在线| 在线国产电影不卡| 久久手机在线视频| 性欧美xxx69hd高清| 欧美午夜寂寞影院| ass极品水嫩小美女ass| 清纯唯美亚洲经典中文字幕| 在线亚洲国产精品网| 中文字幕电影av| 欧美亚洲三级| 午夜精品久久17c| 豆国产97在线 | 亚洲| 免费亚洲一区| 亚洲自拍欧美另类| 暖暖视频在线免费观看| 亚洲蜜桃精久久久久久久| 一区二区传媒有限公司| 高h视频在线观看| 亚洲福利一区二区| 在线免费观看av的网站| 91久久精品无嫩草影院 | www黄色日本| 欧美aaaaaa| 色乱码一区二区三区88| 国产欧美激情视频| 亚洲丝袜啪啪| 色综合久久悠悠| 亚洲 国产 日韩 欧美| 成人性色生活片免费看爆迷你毛片| 亚洲在线视频观看| 久草福利在线| 亚洲高清免费观看高清完整版在线观看| 精品国产av无码一区二区三区| av资源网在线播放| 樱花影视一区二区| 在线观看的毛片| 福利一区三区| 亚洲少妇中文在线| 尤物视频在线观看国产| 国产精品中文有码| 亚洲欧洲国产日韩精品| 韩国美女久久| 日韩电影第一页| 国产一级片免费| 国产精品自拍三区| 中文字幕中文字幕在线中一区高清 | 欧美另类变人与禽xxxxx| 日本老熟妇毛茸茸| 国产精品视频3p| 久久99青青精品免费观看| 一区二区视频免费| 国产精品天干天干在线综合| www.亚洲天堂网| 日韩大片在线免费观看| 久久久久久久色| 亚洲国产综合一区| 亚洲午夜影视影院在线观看| 超碰中文字幕在线观看| 美国成人xxx| 久久久久久久久爱| 中文字幕免费高清网站| 国产精品一区二区三区四区 | 精品中文字幕一区二区三区av| www.欧美三级电影.com| 欧美a级片免费看| 中文无码久久精品| 国产91对白在线播放| 一区二区视频播放| 国产精品乱人伦| av亚洲天堂网| 欧美a级成人淫片免费看| 国产精品欧美日韩一区二区| 北岛玲一区二区三区| 中文字幕亚洲在| 免费看黄在线看| 嫩草国产精品入口| 欧美制服第一页| www.成人.com| 欧美福利视频导航| 成人在线观看小视频| 国产在线不卡一区| 久久99久久99精品| 国产精品**亚洲精品| 九九热99久久久国产盗摄| 欧美视频xxxx| 国产精品第13页| 潘金莲一级淫片aaaaa| 亚洲国产免费| 日本成人三级| 亚洲人成777| 久久久影视精品| 免费在线性爱视频| 欧美日韩国产不卡| 一级aaa毛片| 国产日韩欧美一区二区三区乱码| 精品无码国产一区二区三区av| 国产精选久久| 97色伦亚洲国产| jizzjizz在线观看| 精品奇米国产一区二区三区| 一级黄色免费网站| 国产精品乱人伦中文| 成人在线观看一区二区| 可以看av的网站久久看| 国产在线资源一区| 国产综合色在线观看| 九九久久久久久久久激情| 国产日韩在线观看一区| 91片在线免费观看| 污污动漫在线观看| 亚洲高清久久| 亚洲人成77777| 黑色丝袜福利片av久久| 国产精品一区电影| 第一福利在线视频| 久久精品男人天堂| 青青草视频在线观看| 欧美一卡2卡3卡4卡| 五月天婷婷导航| 不卡的av在线| 日本在线播放不卡| 精品日韩视频| 亚洲欧美日韩网| 日韩欧美成人一区二区三区| 国产精品色一区二区三区| 91高清国产视频| 久久一级电影| 久久福利电影| 日韩在线成人| 国产欧美日韩中文字幕| 在线天堂资源| 中文字幕欧美专区| 视频二区在线| 精品久久久久久久人人人人传媒| 亚洲一区欧美在线| 国产亚洲一区二区在线观看| 91色国产在线| 国产亚洲福利| 性高湖久久久久久久久aaaaa| 欧美调教视频| 99理论电影网| 欧美办公室脚交xxxx| 九九热最新视频//这里只有精品| 黄色片网站免费在线观看| 欧美日韩高清影院| 国产精品xxxxxx| 亚洲精品免费一二三区| 影音先锋男人在线| 久久久久国产精品免费免费搜索| 天堂а√在线中文在线| caoporn成人| 国产福利精品在线| 天堂av在线网| 98视频在线噜噜噜国产| 国产suv一区二区| 激情成人中文字幕| 天天舔天天操天天干| 丁香啪啪综合成人亚洲小说| 欧美日韩精品区别| 极品尤物av久久免费看| 欧美一级特黄aaa| 精品一区二区三区在线视频| 9l视频白拍9色9l视频| 激情自拍一区| 精品无码一区二区三区爱欲| 悠悠资源网久久精品| 九九热只有这里有精品| 亚洲黄色精品| 国产在线精品91| 欧美91福利在线观看| 国产乱子伦精品视频| 狠狠入ady亚洲精品| 视频在线99| 第一会所sis001亚洲| 国产欧美日韩综合精品二区| 精品综合久久88少妇激情| 国产精品免费一区二区三区观看| 日韩成人一区| 91在线视频成人| 91在线一区| 欧美成熟毛茸茸复古| 红桃成人av在线播放| 日韩欧美亚洲在线| 天美av一区二区三区久久| 免费观看成人在线| 成人影院天天5g天天爽无毒影院| 久久精品国产精品青草色艺| 欧美一区一区| 精品欧美日韩在线| 亚洲精品一区在线| 久久99精品久久久久久三级 | 中文字幕在线国产| 极品销魂美女一区二区三区| 精品1卡二卡三卡四卡老狼| www国产成人| 国产大屁股喷水视频在线观看| 国产亚洲精品aa午夜观看| 中文字幕求饶的少妇| 亚洲午夜激情av| 奴色虐av一区二区三区| 日韩一区二区三区在线视频| 日本精品999| 自拍视频国产精品| 国产丝袜在线播放| 国产精品大片wwwwww| 色呦呦网站在线观看| 26uuu亚洲伊人春色| 欧美伊人亚洲伊人色综合动图| 国产精品吹潮在线观看| 亚洲成人人体| 成人av蜜桃| 欧美亚洲在线日韩| 亚洲视频电影| 亚洲国产婷婷| 日本在线播放一区二区| 99精品久久99久久久久| 欧美日韩午夜视频| 亚洲国产一二三| 国产精品sm调教免费专区| 亚洲国产成人精品久久| 黄色网页在线播放| 国产xxx69麻豆国语对白| 天堂va欧美ⅴa亚洲va一国产| 国产 高清 精品 在线 a| 青青草91久久久久久久久| 杨幂一区欧美专区| 香蕉亚洲视频| 欧美一级特黄a| 99re热视频这里只精品 | 99久久国产综合色|国产精品| 黄色录像a级片| 欧美国产视频在线| 777777国产7777777| 一区av在线播放| 综合五月激情网| 亚洲人成电影网站色mp4| 香蕉影院在线观看| 欧美日韩一级二级| 国产精品无码在线播放| 国产亚洲精品久久久久久| av电影在线地址| 99r国产精品视频| 欧美日韩看看2015永久免费| 日本在线视频www色| 乱一区二区av| 国产又黄又粗视频| 色哟哟精品一区| aaa国产视频| 日韩亚洲成人av在线| 成人黄色图片网站| 日韩av高清| 日韩高清国产一区在线| 成年人在线观看av| 欧美日韩国产综合视频在线观看中文 | 高清在线一区| 欧美一区二区三区四区在线观看地址| 全球成人免费直播| 已婚少妇美妙人妻系列| 26uuu国产一区二区三区| 国产成人愉拍精品久久| 日韩激情av在线播放| 欧美大胆a人体大胆做受| 久久久久欧美| 国产精品乱看| 中日韩精品一区二区三区| 一本大道av伊人久久综合| 男人天堂综合| 国产精品久久久久久久久久ktv| av成人综合| www.日本在线播放| www国产精品av| 国产精品51麻豆cm传媒| 日韩有码视频在线| 久久在线观看| 久久亚洲中文字幕无码| 国产一区二区视频在线| 久久精品黄色片| 日韩精品中文字幕一区| 国产丝袜在线播放| 92裸体在线视频网站| 欧美淫片网站| 年下总裁被打光屁股sp| 黑人巨大精品欧美一区二区三区 | 亚洲欧洲成视频免费观看| 日韩免费va| 六月婷婷久久| 日韩不卡在线观看日韩不卡视频| 日本少妇毛茸茸| 一本大道久久a久久综合| 日本激情在线观看| 国产精品日韩专区| 欧美成人高清| 亚洲国产精品成人综合久久久| 丰满放荡岳乱妇91ww| 二区三区四区视频| 亚洲精品在线电影| 国产一区二区精品调教| 神马午夜伦理影院| 国产综合色在线视频区| 国产网址在线观看| 亚洲欧美综合图区| 欧美经典影片视频网站| 日韩在线一级片| 1024国产精品| 四虎影院在线播放| 欧美专区在线视频| 久久久久久久久久久久久久久久久久| www.天天射.com| 一区二区三区欧美亚洲| www.日韩高清| 国产精品扒开腿做爽爽爽男男| 色综合中文网| 国产精品19p| 在线观看国产日韩| 国产福利在线免费观看| 国产精品露出视频| 麻豆专区一区二区三区四区五区| 我要看一级黄色录像|