色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

實戰:CNN+BLSTM+CTC的驗證碼識別從訓練到部署

電子工程師 ? 來源:lq ? 2019-05-01 10:28 ? 次閱讀

1.前言

本項目適用于Python3.6,GPU>=NVIDIA GTX1050Ti,原master分支已經正式切換為CNN+LSTM+CTC的版本了,是時候寫一篇新的文章了。

長話短說,開門見山,網絡上現有的代碼以教學研究為主,本項目是為實用主義者定制的,只要基本的環境安裝常識,便可很好的訓練出期望的模型,重定義幾個簡單的參數任何人都能使用機器學習技術訓練一個商業化成品。

如果對于DLL調用感興趣或是其他語言的TensorFlow API感興趣的移步以下兩個項目:

https://github.com/kerlomz/captcha_library_c

https://github.com/kerlomz/captcha_demo_csharp

筆者選用的時下最為流行的CNN+BLSTM+CTC進行端到端的不定長驗證碼識別,代碼中預留了DenseNet+BLSTM+CTC的選項,可以在配置中直接選用。首先,介紹個大概吧。

H16/H64指的是Bi-LSTM的隱藏神經元個數num_units,這里注意,你沒有看錯,也沒有寫反,LSTM有時序依賴,tf.contrib.rnn.LSTMCell的實現沒能很充分的利用GPU的計算資源,底層kernel函數之間的間隙非常大,不利于充分的利用 GPU 的并行性來進行計算。所以本項目使用GPU訓練,使用CPU進行預測。預測服務部署項目源碼請移步此處:

https://github.com/kerlomz/captcha_platform

2.環境依賴

關于CUDA和cuDNN版本的問題,不少人很糾結,這里就列出官方通過pip安裝的TensorFlow的版本對應表:

Linux

Windows

如果希望使用上面對應之外的搭配的CUDA和cuDNN,可以自行編譯TensorFlow,或者去Github上搜索TensorFlow Wheel找到第三方編譯的對應版本的whl安裝包。提前預警,若是自己編譯將會苦難重重,坑很多,這里就不展開了。

2.1 本項目環境依賴

目前在以下主流操作系統平臺均測試通過:

本訓練項目主要的環境依賴清單如下

2.1.1 Ubuntu 16.04 下的 Python 3.6

1)先安裝Python環境

sudo apt-get install opensslsudo apt-get install libssl-devsudo apt-get install libc6-dev gccsudo apt-get install -y make build-essential zlib1g-dev libbz2-dev libreadline-dev $ libsqlite3-dev wget curl llvm tk-devwget https://www.python.org/ftp/python/3.6.6/Python-3.6.6.tgztar -vxf Python-3.6.6.tar.xzcd Python-3.6.6./configure --prefix=/usr/local --enable-sharedmake -j8sudo make install -j8

經過上面指令就安裝好Python3.6環境了,如果提示找不到libpython3.6m.so.1.0就到/usr/local/lib路徑下將該文件復制一份到/usr/lib和/usr/lib64路徑下。

2)安裝相關依賴(這一步Windows和Linux通用)

可以直接在項目路徑下執行pip3 install -r requirements.txt安裝所有依賴,注意這一步是安裝在全局Python環境下的,強烈建議使用虛擬環境進行項目間的環境隔離,如Virtualenv或Anaconda等等。

我一般使用的是Virtualenv,有修改代碼需要的,建議安裝PyCharm作為Python IDE

virtualenv -p /usr/bin/python3 venv # venv is the name of the virtual environment.cd venv/ # venv is the name of the virtual environment.source bin/activate # to activate the current virtual environment.cd captcha_trainer # captcha_trainer is the project path.pip3 install -r requirements.txt

2.1.2 Ubuntu 16.04 下的 CUDA/cuDNN

網上看到過很多教程,我自己也部署過很多次,Ubuntu 16.04遇到的坑還是比較少的。14.04支持就沒那么好,如果主板不支持關閉SecureBoot的話千萬不要安裝Desktop版,因為安裝好之后一定會無限循環在登陸界面無法進入桌面。

網上教程說要加驅動黑名單什么的我直接跳過了,親測沒那個必要。就簡單的幾步:

1. 下載好安裝包

注意下載runfile類型的安裝包,deb安裝會自動安裝默認驅動,極有可能導致登陸循環。

NVIDIA 驅動下載:

https://www.geforce.cn/drivers

CUDA 下載地址:

https://developer.nvidia.com/cuda-downloads

cuDNN 下載地址:

https://developer.nvidia.com/cudnn

(需要注冊NVIDIA賬號且登陸,下載deb安裝包)

2. 關閉圖形界面

Ctrl+alt+F1進入字符界面,關閉圖形界面

sudo service lightdm stop

3. 安裝Nvidia Driver

命令中的版本自己對應下載的版本改,在上面的下載地址根據自己的顯卡型號下載最新版,切記是runfile格式的安裝包。

sudo chmod a+x NVIDIA-Linux-x86_64-384.90.run //獲取執行權限sudo ./NVIDIA-Linux-x86_64-384.90.run –no-x-check –no-nouveau-check –no-opengl-files //安裝驅動

安裝成功以后使用以下命令驗證,如果顯示顯卡信息則表示安裝成功

nvidia-smi

4. 安裝CUDA

先安裝一些系統依賴庫

sudo apt-get install freeglut3-dev build-essential libx11-dev libxmu-dev libxi-dev libgl1-mesa-glx libglu1-mesa libglu1-mesa-dev

執行安裝程序,按指示無腦繼續就好了,如果提示是否安裝驅動選不安裝。

sudo sh cuda_9.0.176_384.81_linux.run

安裝完如果環境變量沒配上去,就寫到 ~/.bashrc 文件的尾部

export PATH=/usr/local/cuda-9.0/bin${PATH:+:${PATH}}export LD_LIBRARY_PATH=/usr/local/cuda-9.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

然后在終端執行 sudo ldconfig更新,安裝完畢就可以重啟機器重啟圖形界面了。

sudo service lightdm start

2.1.3 Windows 系統

在Windows其實簡單很多,只要到官網下載安裝包無腦安裝就可以了,下載連接同Ubuntu,先安裝Python,顯卡驅動,CUDA,然后下載對應的cuDNN替換到對應路徑即可。

花了超長篇幅介紹了訓練環境的基本搭建,主要是給尚未入門的讀者看的,老鳥們隨便跳過。

3.使用

入手的第一步環境搭建好了,那就是準備跑代碼了,還是有幾個必要的條件,巧婦難為無米之炊,首先,既然是訓練,要先有訓練集,有一個新手嘗鮮的訓練集,是mnist手寫識別的例子,可以在騰訊云下載:https://share.weiyun.com/5pzGF4V,現在萬事俱備,只欠東風。

3.1 定義一個模型

本項目采用的是參數化配置,不需要改動任何代碼,可以訓練幾乎任何字符型圖片驗證碼,下面從兩個配置文件說起:

# - requirement.txt - GPU: tensorflow-gpu, CPU: tensorflow# - If you use the GPU version, you need to install some additional applications.# TrainRegex and TestRegex: Default matching apple_20181010121212.jpg file.# - The Default is .*?(?=_.*.)# TrainsPath and TestPath: The local absolute path of your training and testing set.# TestSetNum: This is an optional parameter that is used when you want to extract some of the test set# - from the training set when you are not preparing the test set separately.System: DeviceUsage: 0.7 TrainsPath: 'E:TaskTrainsYourModelName' TrainRegex: '.*?(?=_)' TestPath: 'E:TaskTestGroupYourModelName' TestRegex: '.*?(?=_)' TestSetNum: 1000# CNNNetwork: [CNN5, DenseNet]# RecurrentNetwork: [BLSTM, LSTM]# - The recommended configuration is CNN5+BLSTM / DenseNet+BLSTM# HiddenNum: [64, 128, 256]# - This parameter indicates the number of nodes used to remember and store past states.NeuralNet: CNNNetwork: CNN5 RecurrentNetwork: BLSTM HiddenNum: 64 KeepProb: 0.98# SavedSteps: A Session.run() execution is called a Steps,# - Used to save training progress, Default value is 100.# ValidationSteps: Used to calculate accuracy, Default value is 100.# TestNum: The number of samples for each test batch.# - A test for every saved steps.# EndAcc: Finish the training when the accuracy reaches [EndAcc*100]%.# EndEpochs: Finish the training when the epoch is greater than the defined epoch.Trains: SavedSteps: 100 ValidationSteps: 500 EndAcc: 0.975 EndEpochs: 1 BatchSize: 64 TestBatchSize: 400 LearningRate: 0.01 DecayRate: 0.98 DecaySteps: 10000

上面看起來好多好多參數,其實大部分可以不用改動,你需要修改的僅僅是訓練集路徑就可以了,注意:如果訓練集的命名格式和我提供的新手訓練集不一樣,請根據實際情況修改TrainRegex和TestRegex的正則表達式。

TrainsPath和TestPath路徑支持list參數,允許多個路徑,這種操作適用于需要將多種樣本訓練為一個模型,或者希望訓練一套通用模型的人。為了加快訓練速度,提高訓練集讀取效率,特別提供了make_dataset.py來支持將訓練集打包為tfrecords格式輸入,經過make_dataset.py打包之后的訓練集將輸出到本項目的dataset路徑下,只需修改TrainsPath鍵的配置如下即可。

TrainsPath: './dataset/xxx.tfrecords'

TestPath是允許為空的,如果TestPath為空將會使用TestSetNum參數自動劃分出對應個數的測試集。如果使用自動劃分機制,那么TestSetNum測試集總數參數必須大于等于TestBatchSize測試集每次讀取的批次大小。

神經網絡這塊可以講一講,默認提供的組合是CNN5(CNN5層模型)+BLSTM(Bidirectional LSTM)+CTC,親測收斂最快,但是訓練集過小,實際圖片變化很大特征很多的情況下容易發生過擬合。DenseNet可以碰運氣在樣本量很小的情況下很好的訓練出高精度的模型,為什么是碰運氣呢,因為收斂快不快隨機的初始權重很重要,運氣好前500步可能對測試集就有40-60%準確率,運氣不好2000步之后還是0,收斂快慢是有一定的運氣成分的。

NeuralNet: CNNNetwork: CNN5 RecurrentNetwork: BLSTM HiddenNum: 64 KeepProb: 0.99

隱藏層HiddenNum筆者嘗試過8~64,都能控制在很小的模型大小之內,如果想使用DenseNet代替CNN5直接修改如上配置中的CNNNetwork參數替換為:

NeuralNet: CNNNetwork: DenseNet ......

model.yaml # 模型配置

# ModelName: Corresponding to the model file in the model directory,# - such as YourModelName.pb, fill in YourModelName here.# CharSet: Provides a default optional built-in solution:# - [ALPHANUMERIC, ALPHANUMERIC_LOWER, ALPHANUMERIC_UPPER,# -- NUMERIC, ALPHABET_LOWER, ALPHABET_UPPER, ALPHABET]# - Or you can use your own customized character set like: ['a', '1', '2'].# CharExclude: CharExclude should be a list, like: ['a', '1', '2']# - which is convenient for users to freely combine character sets.# - If you don't want to manually define the character set manually,# - you can choose a built-in character set# - and set the characters to be excluded by CharExclude parameter.Model: Sites: [] ModelName: YourModelName-CNN5-H64-150x50 ModelType: 150x50 CharSet: ALPHANUMERIC_LOWER CharExclude: [] CharReplace: {} ImageWidth: 150 ImageHeight: 50# Binaryzation: [-1: Off, >0 and < 255: On].# Smoothing: [-1: Off, >0: On].# Blur: [-1: Off, >0: On].# Resize: [WIDTH, HEIGHT]# - If the image size is too small, the training effect will be poor and you need to zoom in.# - ctc_loss error "No valid path found." happenedPretreatment: Binaryzation: -1 Smoothing: -1 Blur: -1

上述的配置只要關注ModelName、CharSet、ImageWidth、ImageHeight。

首先給模型取一個好名字是成功的第一步,字符集CharSet其實大多數情況下不需要修改,一般的圖形驗證碼離不開數字和英文,而且一般來說是大小寫不敏感的,不區分大小寫,因為打碼平臺收集的訓練集質量參差不齊,有些大寫有些小寫,不如全部統一為小寫,默認ALPHANUMERIC_LOWER則會自動將大寫的轉為小寫,字符集可定制化很靈活,除了配置備注上提供的幾種類型,還可以訓練中文,自定義字符集用list表示,示例如下:

CharSet: ['常', '世', '寧', '慢', '南', '制', '根', '難']

可以自己根據收集訓練集的實際字符集使用率來定義,也可以無腦網上找3500常用字來訓練,注意:中文字符集一般比數字英文大很多,剛開始收斂比較慢,需要更久的訓練時間,也需要更多的樣本量,請量力而行。

形如上圖的圖片能輕松訓練到95%以上的識別率。

ImageWidth、ImageHeight只要和當前圖片尺寸匹配即可,其實這里的配置主要是為了方便后面的部署智能策略。

其他的如Pretreatment之下的參數是用來做圖片預處理的,因為筆者致力于做一套通用模型,模型只使用了灰度做預處理。其中可選的二值化、均值濾波、高斯模糊均未開啟,即使不進行那些預處理該框架已經能夠達到很理想的識別效果了,筆者自用的大多數模型都是98%以上的識別率。

3.2 開始訓練

按照上面的介紹,配置只要修改極少數的參數對應的值,就可以開啟正式的訓練之旅了,具體操作如下:

可以直接使用PyCharm的Run,執行trains.py,也可以在激活Virtualenv下使用終端亦或在安裝依賴的全局環境下執行。

python3 trains.py

剩下的就是等了,看過程,等結果。正常開始訓練的模樣應該是這樣的:

訓練結束會在項目的out路徑下生成一個pb和yaml文件,下面該到部署環節了。

3.3 部署

真的很有必要認真的介紹一下部署項目,比起訓練,這個部署項目傾注了筆者更多的心血,為什么呢?

項目地址:

https://github.com/kerlomz/captcha_platform

真的值得了解的幾點:

同時管理多個模型,支持模型熱拔插

靈活的版本控制

支持批量識別

服務智能路由策略

首先筆者重寫了Tensor Flow的Graph會話管理,設計會話池,允許同時管理多模型,實現多模型動態部署方案。

1)訓練好的pb模型只要放在部署項目的graph路徑下,yaml模型配置文件放在model,即可被服務發現并加載;2)如果需要卸載一個正在服務的模型,只需要在model中刪除該模型的yaml配置文件,在graph中刪除對應的pb模型即可;3)如果需要更新一個已經服務中的模型,只需修改新版的模型yaml配置文件的版本號高于原模型的版本號,按先放pb后放yaml的順序,服務便會自動發現新版的模型并加載使用,舊的模型將因版本低于新版模型不會被調用,可以按照上述的卸載方法卸載已被棄用的模型釋放內存。

上面的操作中無需重啟服務,完全的無縫切換。

Linux:

Tornado:

# 端口 19952python3 tornado_server.py

Flask

# 方案1,裸啟動, 端口 19951python flask_server.py# 方案2,使用gunicorn,端口 5000pip install gunicorngunicorn -c deploy.conf.py flask_server:app

Sanic:

# 端口 19953python3 sanic_server.py

gRPC:

# 端口 50054python3 grpc_server.py

Windows:

Windows平臺下都是通過python3 xxx_server.py啟動對應的服務,注意,Tornado、Flask、Sanic的性能在Windows平臺都大打折扣,gRPC是Google開源的RPC服務,有較為優越的性能。

3.4 調用/測試

1. Flask服務:

具體參數:

請求為JSON格式,形如:{"image": "base64編碼后的圖像二進制流"}

返回結果:

該返回為JSON格式,形如:{"message": "xxxx", "code": 0, "success": true}

2. Tornado服務:

請求參數和返回格式同上

3. Sanic服務:

請求參數和返回格式同上

4. gRPC服務:

需要安裝依賴,grpcio、grpcio_tools和對應的grpc.proto文件,可以直接從項目中的示例代碼demo.py中提取。

class GoogleRPC(object): def __init__(self, host: str): self._url = '{}:50054'.format(host) self.true_count = 0 self.total_count = 0 def request(self, image, model_type=None, model_site=None): import grpc import grpc_pb2 import grpc_pb2_grpc channel = grpc.insecure_channel(self._url) stub = grpc_pb2_grpc.PredictStub(channel) response = stub.predict(grpc_pb2.PredictRequest( image=image, split_char=',', model_type=model_type, model_site=model_site )) return {"message": response.result, "code": response.code, "success": response.success}if __name__ == '__main__': result = GoogleRPC().request("base64編碼后的圖片二進制流") print(result)

3.5 奇技淫巧

該項目還可以直接用于識別帶顏色的圖片,本質是不同的顏色分別訓練,調用的時候通過傳參區分,如果希望獲得圖片中紅色的文字,就直接通過參數定位到訓練紅色的模型,希望獲取圖片中藍色的圖片就通過參數定位到藍色模型,如:

不過這種操作對樣本量要求較高,且效率不高,當顏色參數越來越多時就不適用,可以采用顏色提取的方式,這樣所需要的樣本量將大大減少,但對于顏色提取算法效果要求高了。

還有一種方案是同時預測驗證碼和每個字符對應的顏色,不過這需要修改現有的神經網絡進行支持,在最后一層修改為雙輸出,一個輸出顏色,一個輸出對應字符,這對于樣本標注的要求較高,也提高的成本,所以如果能用無限生成樣本,那問題就迎刃而解了,比如上圖,筆者就寫了樣本生成代碼,感興趣的可以移步:

https://www.jianshu.com/p/da1b972e24f2

其實還有很多很多技巧,例如,用生成的樣本代替訓練集,其實網上的圖片驗證碼大多是采用開源的,稍作修改而已,大多數情況都能被近似生成出來,上述展示的驗證碼圖片不代表任何實際的網站,如有雷同,純屬巧合,該項目只能用于學習和交流用途,不得用于非法用途。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 代碼
    +關注

    關注

    30

    文章

    4815

    瀏覽量

    68855
  • 機器學習
    +關注

    關注

    66

    文章

    8434

    瀏覽量

    132873
  • cnn
    cnn
    +關注

    關注

    3

    文章

    353

    瀏覽量

    22277

原文標題:實戰:CNN+BLSTM+CTC的驗證碼識別從訓練到部署 | 技術頭條

文章出處:【微信號:rgznai100,微信公眾號:rgznai100】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    12306圖片驗證碼難倒了誰?

    驗證碼的清晰度也不高,識別起來比較困難。有些關鍵詞還從一個變成了兩個。0  記者登錄12306時,就碰到了系統需要識別“排風機和掛鐘”的圖片,由于系統所給的8張圖片有些模糊,記者分辨了半天才進行選擇
    發表于 12-08 10:29

    無法驗證郵箱,總是提示驗證碼錯誤,驗證碼明明是正確的。

    `無法驗證郵箱,總是提示驗證碼錯誤,驗證碼明明是正確的。是不是系統的bug?`
    發表于 05-12 10:41

    平臺是如何高效的破解市面上各家驗證碼平臺的各種形式驗證碼的?

    通過了這個驗證碼識別才返回數據。對于一般的黑灰產而言,其是沒有應對驗證碼手段的,于是就獲取不到數據。打平臺的出現則解決了這一問題。黑灰產把獲取到的
    發表于 11-01 15:21

    搜狗開放12306驗證碼識別技術助力搶票軟件

    12306的驗證碼,已經擊敗了全國99%的購票者,我已經找不到回家的路了隨著春運搶票高峰期來臨,12306驗證碼識別成為用戶討論的熱點。日前,搜狗瀏覽器、QQ瀏覽器等應用相繼推出搶票功能,幫助用戶秒
    發表于 10-13 16:21 ?1次下載

    多樣變換的手寫驗證碼自動識別算法

    提出了一種多樣變換的手寫驗證碼自動識別算法,對彩色驗證碼進行識別主要包括彩色驗證碼的二值化、手寫字符的區域分割、同一字符的區域連接、使用卷積
    發表于 12-20 14:14 ?0次下載

    SQLyog_12.4.1_帶驗證碼

    SQLyog_12.4.1_帶驗證碼.rar
    發表于 04-12 21:03 ?22次下載

    一套基于GAN的驗證碼AI識別系統,能在0.5秒之內識別驗證碼

    近日,英國蘭卡斯特大學、中國西北大學、北京大學的計算機科學家們共同開發了一種AI系統,能夠在短短0.5秒內識別出多種驗證碼。該系統已在不同的33個驗證碼系統中進行了成功測試,其中11個來自世界上最受歡迎的一些網站,包括eBay和
    的頭像 發表于 12-16 10:02 ?5071次閱讀

    以一個真實網站的驗證碼為例,實現了基于一下KNN的驗證碼識別

    很多網站登錄都需要輸入驗證碼,如果要實現自動登錄就不可避免的要識別驗證碼。本文以一個真實網站的驗證碼為例,實現了基于一下KNN的驗證碼
    的頭像 發表于 12-24 17:27 ?7806次閱讀

    驗證碼層出不窮?試試這個自動跳過驗證碼的工具

    目前網絡上越來越多使用驗證碼了,驗證碼的本意是阻止機器刷流量擠占服務器資源,這本來無可厚非;但是驗證碼已經變得越來越過分,別說機器人了,連人也經常沒法辨認!這就相當煩了,特別是被廣泛使用更多
    的頭像 發表于 11-15 10:42 ?6026次閱讀

    驗證碼太麻煩,自動跳過驗證碼神器試一試

    目前網絡上越來越多使用驗證碼了,驗證碼的本意是阻止機器刷流量擠占服務器資源,這本來無可厚非;但是驗證碼已經變得越來越過分,別說機器人了,連人也經常沒法辨認! 這就相當煩了,特別是被廣泛使用更多
    的頭像 發表于 11-15 11:15 ?1w次閱讀

    帶帶弟弟OCR通用驗證碼識別SDK免費開源版

    在使用爬蟲登錄網站的時候,經常輸入用戶名和密碼后會遇到驗證碼,簡單一點的有字母驗證碼,復雜一點的有滑塊驗證碼,點選文章和點選圖片驗證碼。這些都是爬蟲中的老大難問題,今天介紹一款通用
    的頭像 發表于 03-30 17:26 ?4729次閱讀

    一個短信驗證碼爆破重置

    以前倒是遇到過不少四位數驗證碼爆破的,但是這種可以結合短信遍歷,一個短信驗證碼只能驗證三次的,最后能成功利用的還是第一次遇到,關鍵還是這里不存在圖片驗證碼或者行為
    的頭像 發表于 09-07 09:14 ?5141次閱讀

    驗證碼到底在驗證啥?聊一聊驗證碼是怎么為難我們人類的

    在文章開頭,老狐先給大家玩一個驗證碼的游戲,猜出圖中驗證碼字母。
    的頭像 發表于 08-12 10:25 ?2144次閱讀
    <b class='flag-5'>驗證碼</b>到底在<b class='flag-5'>驗證</b>啥?聊一聊<b class='flag-5'>驗證碼</b>是怎么為難我們人類的

    Java 中驗證碼的使用

    今天我們講一下在 Java 中驗證碼的使用。 驗證碼生成 本效果是利用easy-captcha工具包實現,首先需要添加相關依賴到pom.xml中,代碼如下: com .github.whvcse
    的頭像 發表于 09-25 11:11 ?1094次閱讀
    Java 中<b class='flag-5'>驗證碼</b>的使用

    SpringBoot分布式驗證碼登錄方案

    傳統的項目大都是基于session交互的,前后端都在一個項目里面,比如傳統的SSH項目或者一些JSP系統,當前端頁面觸發到獲取驗證碼請求,可以將驗證碼里面的信息存在上下文中,所以登錄的時候只需要 用戶名、密碼、驗證碼即可。
    的頭像 發表于 10-12 17:34 ?743次閱讀
    SpringBoot分布式<b class='flag-5'>驗證碼</b>登錄方案
    主站蜘蛛池模板: 欧美激情视频二区| 四虎永久在线精品国产免费| 熟女啪啪白浆嗷嗷叫| qovd电影| 青柠在线观看视频在线高清| 久久成人国产精品一区二区| 亚洲国产精麻豆| 黄色软件视频app| 一个人的视频在线观看免费观看| 黄色直接观看| 宅男午夜大片又黄又爽大片| 99在线精品国自产拍不卡| 免费99精品国产自在现线| 97午夜理论片影院在线播放| 欧美不卡一区二区三区| 成人无码国产AV免费看直播| 少妇被阴内射XXXB少妇BB| 国产精品嫩草影院在线观看免费| 亚洲成A人片在线观看中文不卡| 精品AV亚洲乱码一区二区| 一二三区乱码不卡手机版| 伦理片在线3348| 成人国产亚洲精品A区天堂蜜臀| 无码国产欧美日韩精品| 花蝴蝶在线观看免费中文版高清| 一品道门免费视频韩国| 嫩草欧美曰韩国产大片| 成人在线视频在线观看| 午夜国产大片免费观看| 久久re视频这里精品09免费| 99re在这里只有精品| 色多多涩涩屋下载软件| 韩国hd高清xxx| 69成人免费视频| 视频一区二区三区蜜桃麻豆| 精品国产在线观看福利| 小小水蜜桃免费影院| 久久99re6热在线播放| 97国产视频| 午夜国产视频| 恋夜秀场支持安卓版全部视频国产|