国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

Pytorch轉(zhuǎn)Msnhnet模型思路分享

共 14111字,需瀏覽 29分鐘

 ·

2020-10-01 22:02

↑ 點擊藍字?關(guān)注極市平臺

作者丨?msnh2012、BBuf
來源丨?GiantPandaCV
編輯丨極市平臺

極市導(dǎo)讀

?

前向推理框架MsnhNet如何將原始Pytorch模型轉(zhuǎn)換過來?本文介紹了網(wǎng)絡(luò)結(jié)構(gòu)的轉(zhuǎn)換思路,并給出了詳細的代碼實現(xiàn)過程,希望對有模型轉(zhuǎn)換需求的同學(xué)有所幫助。>>加入極市CV技術(shù)交流群,走在計算機視覺的最前沿

1?網(wǎng)絡(luò)結(jié)構(gòu)的轉(zhuǎn)換

網(wǎng)絡(luò)結(jié)構(gòu)轉(zhuǎn)換比較復(fù)雜,其原因在于涉及到不同的op以及相關(guān)的基礎(chǔ)操作.

  • 「思路一」: 利用print的結(jié)果進行構(gòu)建
    • 「優(yōu)點」: 簡單易用
    • 「缺點」: 大部分網(wǎng)絡(luò),print并不能完全展現(xiàn)出其結(jié)構(gòu).簡單網(wǎng)絡(luò)可用.
  • 代碼實現(xiàn):

import?torch
import?torch.nn?as?nn

class?Model(nn.Module):
????def?__init__(self):
????????super(Model,?self).__init__()
????????self.conv1?=?nn.Conv2d(1,?6,?5)
????????self.bn1???=?nn.BatchNorm2d(6,eps=1e-5,momentum=0.1)
????????self.relu1?=?nn.ReLU()
????????self.pool1?=?nn.MaxPool2d(2)
????????self.conv2?=?nn.Conv2d(6,?16,?5)
????????self.bn2???=?nn.BatchNorm2d(16,eps=1e-5,momentum=0.1)
????????self.relu2?=?nn.ReLU()
????????self.pool2?=?nn.MaxPool2d(2)

????def?forward(self,?x):
????????y?=?self.conv1(x)
????????y?=?self.bn1(y)
????????y?=?self.relu1(y)?
????????y?=?self.pool1(y)?
????????y?=?self.conv2(y)
????????y?=?self.bn2(y)?
????????y?=?self.relu2(y)?
????????y?=?self.pool2(y)
????????return?y

nn?=?Model()
print(nn)

  • 結(jié)果: 很顯然對于用純nn.Module搭建的網(wǎng)絡(luò)是可行的

Model
(
??(conv1):?Conv2d(1,?6,?kernel_size=(5,?5),?stride=(1,?1))
??(bn1):?BatchNorm2d(6,?eps=1e-05,?momentum=0.1,?affine=True,?track_running_stats=True)
??(relu1):?ReLU()
??(pool1):?MaxPool2d(kernel_size=2,?stride=2,?padding=0,?dilation=1,?ceil_mode=False)
??(conv2):?Conv2d(6,?16,?kernel_size=(5,?5),?stride=(1,?1))
??(bn2):?BatchNorm2d(16,?eps=1e-05,?momentum=0.1,?affine=True,?track_running_stats=True)
??(relu2):?ReLU()
??(pool2):?MaxPool2d(kernel_size=2,?stride=2,?padding=0,?dilation=1,?ceil_mode=False)
)

  • 如果在forward內(nèi)添加相關(guān)操作,則此方案將無效.
  • 代碼實現(xiàn):

import?torch
import?torch.nn?as?nn

class?Model(nn.Module):
????def?__init__(self):
????????super(Model,?self).__init__()
????????self.conv1?=?nn.Conv2d(1,?6,?5)
????????self.bn1???=?nn.BatchNorm2d(6,eps=1e-5,momentum=0.1)
????????self.relu1?=?nn.ReLU()
????????self.pool1?=?nn.MaxPool2d(2)
????????self.conv2?=?nn.Conv2d(6,?16,?5)
????????self.bn2???=?nn.BatchNorm2d(16,eps=1e-5,momentum=0.1)
????????self.relu2?=?nn.ReLU()
????????self.pool2?=?nn.MaxPool2d(2)

????def?forward(self,?x):
????????y?=?self.conv1(x)
????????y?=?self.bn1(y)
????????y?=?self.relu1(y)?
????????y?=?self.pool1(y)?
????????y?=?self.conv2(y)
????????y?=?self.bn2(y)?
????????y?=?self.relu2(y)?
????????y?=?self.pool2(y)
????????y?=?torch.flatten(y)
????????return?y

nn?=?Model()
print(nn)

  • 結(jié)果: 很顯然forward內(nèi)的flatten操作并沒有被導(dǎo)出。

Model(
??(conv1):?Conv2d(1,?6,?kernel_size=(5,?5),?stride=(1,?1))
??(bn1):?BatchNorm2d(6,?eps=1e-05,?momentum=0.1,?affine=True,?track_running_stats=True)
??(relu1):?ReLU()
??(pool1):?MaxPool2d(kernel_size=2,?stride=2,?padding=0,?dilation=1,?ceil_mode=False)
??(conv2):?Conv2d(6,?16,?kernel_size=(5,?5),?stride=(1,?1))
??(bn2):?BatchNorm2d(16,?eps=1e-05,?momentum=0.1,?affine=True,?track_running_stats=True)
??(relu2):?ReLU()
??(pool2):?MaxPool2d(kernel_size=2,?stride=2,?padding=0,?dilation=1,?ceil_mode=False)
)

  • 「思路二」: 通過類似Windows Hook技術(shù).(思路來源pytorch_to_caffe) 在pytorch的Op在執(zhí)行之前,對此Op進行截取,以獲取相關(guān)信息,從而實現(xiàn)網(wǎng)絡(luò)構(gòu)建.
    • 優(yōu)點: 幾乎可以完成所有pytorch的op導(dǎo)出.
    • 缺點: 實現(xiàn)復(fù)雜,容易誤操作,可能影響pytorch本身結(jié)果錯誤.
  • 代碼實現(xiàn): 通過構(gòu)建Hook類, 重寫op, 并替換原op操作,獲取op的參數(shù). 層的上下關(guān)系,通過tensor的_cdata作為唯一識別的ID.

import?torch
import?torch.nn?as?nn
from?torchsummary?import?summary
import?torch.nn.functional?as?F

logMsg?=?True
ccc?=?[]
#?Hook截取類
class?Hook(object):
????hookInited?=?False
????def?__init__(self,raw,replace,**kwargs):
????????self.obj=replace?#?被截取之后的op
????????self.raw=raw?#?原op

????def?__call__(self,*args,**kwargs):
????????if?not?Hook.hookInited:?#在Hook類未初始化之前,該信號原路返回
????????????return?self.raw(*args,**kwargs)
????????else:???????????????????#否則,則按截取之后,實現(xiàn)的函數(shù)執(zhí)行
????????????out=self.obj(self.raw,*args,**kwargs)
????????????return?out

def?log(*args):
????if?logMsg:
????????print(*args)

#?替換原cov2d函數(shù)的實現(xiàn)
def?_conv2d(raw,inData,?weight,?bias=None,?stride=1,?padding=0,?dilation=1,?groups=1):
????#?對于上下層網(wǎng)絡(luò)關(guān)系,可以使用tensor的_cdata,該參數(shù)類似唯一ID
????#?輸入tensor的唯一ID
????log(?"conv2d-i"?,?inData._cdata)?
????x=raw(inData,weight,bias,stride,padding,dilation,groups)
????ccc.append(x)????????????????????#?此處將輸出保存,防止被inplace操作,導(dǎo)致所有tensor的_cdata喪失唯一性
????#?此處就可以根據(jù)conv2d參數(shù)就行網(wǎng)絡(luò)構(gòu)建
????#?msnhnet.buildConv2d(...)?
????#?輸出tensor的唯一ID
????log(?"conv2d-o"?,?x._cdata)
????return?x

#?被替換OP??????????????????原OP?????自定義OP
F.conv2d????????=???Hook(F.conv2d,_conv2d)

  • 完整Demo:

import?torch
import?torch.nn?as?nn
from?torchsummary?import?summary
import?torch.nn.functional?as?F

logMsg?=?True
ccc?=?[]
#?Hook截取類
class?Hook(object):
????hookInited?=?False
????def?__init__(self,raw,replace,**kwargs):
????????self.obj=replace?#?被截取之后的op
????????self.raw=raw?#?原op

????def?__call__(self,*args,**kwargs):
????????if?not?Hook.hookInited:?#在Hook類未初始化之前,該信號原路返回
????????????return?self.raw(*args,**kwargs)
????????else:???????????????????#否則,則按截取之后,實現(xiàn)的函數(shù)執(zhí)行
????????????out=self.obj(self.raw,*args,**kwargs)
????????????return?out

def?log(*args):
????if?logMsg:
????????print(*args)

#?替換原cov2d函數(shù)的實現(xiàn)
def?_conv2d(raw,inData,?weight,?bias=None,?stride=1,?padding=0,?dilation=1,?groups=1):
????#?對于上下層網(wǎng)絡(luò)關(guān)系,可以使用tensor的_cdata,該參數(shù)類似唯一ID
????#?輸入tensor的唯一ID
????log(?"conv2d-i"?,?inData._cdata)?
????x=raw(inData,weight,bias,stride,padding,dilation,groups)
????ccc.append(x)????????????????????#?此處將輸出保存,防止被inplace操作,導(dǎo)致所有tensor的_cdata喪失唯一性
????#?此處就可以根據(jù)conv2d參數(shù)就行網(wǎng)絡(luò)構(gòu)建
????#?msnhnet.buildConv2d(...)?
????#?輸出tensor的唯一ID
????log(?"conv2d-o"?,?x._cdata)
????return?x

def?_relu(raw,?inData,?inplace=False):
????log(?"relu-i"?,?inData._cdata)
????x?=?raw(inData,False)
????ccc.append(x)
????log(?"relu-o"?,?x._cdata)
????return?x

def?_batch_norm(raw,inData,?running_mean,?running_var,?weight=None,?bias=None,training=False,?momentum=0.1,?eps=1e-5):
????log(?"bn-i"?,?inData._cdata)
????x?=?raw(inData,?running_mean,?running_var,?weight,?bias,?training,?momentum,?eps)
????ccc.append(x)
????log(?"bn-o"?,?x._cdata)
????return?x

def?_flatten(raw,*args):
????log(?"flatten-i"?,?args[0]._cdata)
????x=raw(*args)
????ccc.append(x)
????log(?"flatten-o"?,?x._cdata)
????return?x

#?被替換OP???????????????????原OP???????自定義OP
F.conv2d????????=???Hook(F.conv2d,_conv2d)

F.batch_norm????=???Hook(F.batch_norm,_batch_norm)
F.relu??????????=???Hook(F.relu,_relu)
torch.flatten???=???Hook(torch.flatten,_flatten)

class?Model(nn.Module):
????def?__init__(self):
????????super(Model,?self).__init__()
????????self.conv1?=?nn.Conv2d(1,?6,?5)
????????self.bn1???=?nn.BatchNorm2d(6,eps=1e-5,momentum=0.1)
????????self.relu1?=?nn.ReLU()

????def?forward(self,?x):
????????y?=?self.conv1(x)
????????y?=?self.bn1(y)
????????y?=?self.relu1(y)?
????????y?=?torch.flatten(y)
????????return?y

input_var?=?torch.autograd.Variable(torch.rand(1,?1,?28,?28))
nn?=?Model()
nn.eval()
Hook.hookInited?=?True
res?=?nn(input_var)

  • 結(jié)果: flatten操作也完成了導(dǎo)出, 且每個op的input的ID都能在前面找到對應(yīng)op的output的ID.即可知曉上下層之間的關(guān)系,由此,即可構(gòu)建msnhnet.

conv2d-i?2748363239504
conv2d-o?2748363238224
bn-i?2748363238224
bn-o?2748363242832
relu-i?2748363242832
relu-o?2748363235152
flatten-i?2748363235152
flatten-o?2748363242064


2 參數(shù)的轉(zhuǎn)換

  • 「思路一」: 利用pytorch的state_dict字典,可直接進行導(dǎo)出. 由于msnhnet和pytorch的內(nèi)存排布是一致的,都為NCHW模式,且對于BN層的參數(shù)順序也相同,都為scale, bias, mean和var.只需將參數(shù)進行逐個提取,然后按二進制存儲即可。
    • 優(yōu)點: 可以在不知道網(wǎng)絡(luò)運行結(jié)構(gòu)的時候?qū)?shù)進行導(dǎo)出, 簡單易用.
    • 缺點: 當(dāng)網(wǎng)絡(luò)使用參數(shù)的順序和保存的順序不一致時,會出現(xiàn)錯誤.

import?torchvision.models?as?models
import?torch
from?struct?import?pack

md?=?models.resnet18(pretrained?=?True)
md.to("cpu")
md.eval()
val?=?[]
dd?=?0

for?name?in?md.state_dict():
????????if?"num_batches_tracked"?not?in?name:
????????????????c?=?md.state_dict()[name].data.flatten().numpy().tolist()
????????????????dd?=?dd?+?len(c)
????????????????print(name,?":",?len(c))
????????????????val.extend(c)

with?open("alexnet.msnhbin","wb")?as?f:
????for?i?in?val?:
????????f.write(pack('f',i))

注意上面出現(xiàn)了一行if "num_batches_tracked" not in name:,這一行是Pytorch的一個坑點,在pytorch 0.4.1及后面的版本里,BatchNorm層新增了num_batches_tracked參數(shù),用來統(tǒng)計訓(xùn)練時的forward過的batch數(shù)目,源碼如下(pytorch0.4.1):

??if?self.training?and?self.track_running_stats:
????????self.num_batches_tracked?+=?1
????????if?self.momentum?is?None:??#?use?cumulative?moving?average
????????????exponential_average_factor?=?1.0?/?self.num_batches_tracked.item()
????????else:??#?use?exponential?moving?average
????????????exponential_average_factor?=?self.momentum

在調(diào)用預(yù)訓(xùn)練參數(shù)模型時,官方給定的預(yù)訓(xùn)練模型是在pytorch0.4之前。因此,調(diào)用預(yù)訓(xùn)練參數(shù)時,需要過濾掉“num_batches_tracked”。

  • 「思路二」: 利用之前的Hook,在算子運行時,對參數(shù)進行提取,暫存,最后統(tǒng)一保存.
    • 優(yōu)點: 網(wǎng)絡(luò)參數(shù)和網(wǎng)絡(luò)結(jié)構(gòu)同時導(dǎo)出,保證參數(shù)與網(wǎng)絡(luò)運行結(jié)構(gòu)一致性.
    • 缺點: 需要獲取網(wǎng)絡(luò)的運行順序才能完成轉(zhuǎn)換.
  • 代碼實現(xiàn):

...

m_weights?=?[]

def?_conv2d(raw,inData,?weight,?bias=None,?stride=1,?padding=0,?dilation=1,?groups=1):
????
????x=raw(inData,weight,bias,stride,padding,dilation,groups)

????if?Hook.hookInited?:
????????log(?"conv2d-i"?,?inData._cdata)
????????ccc.append(x)
????????log(?"conv2d-o"?,?x._cdata)

????????useBias?=?True
????????if?bias?is?None:
????????????useBias?=?False
????????
????????m_weights.extend(weight.numpy().flatten().tolist())?#暫存

????????if?useBias?:
????????????m_weights.extend(bias.numpy().flatten().tolist())?#暫存

????????msnhnet.checkInput(inData,sys._getframe().f_code.co_name)
????????msnhnet.buildConv2d(str(x._cdata),?x.size()[1],?weight.size()[2],?weight.size()[3],?
????????????????????????????padding[0],?padding[1],?stride[0],?stride[1],?dilation[0],?dilation[1],?groups,?useBias)
????return?x

...

def?trans(net,?inputVar,?msnhnet_path,?msnhbin_path):
????Hook.hookInited?=?True
????msnhnet.buildConfig(str(id(inputVar)),?inputVar.size())
????net.forward(inputVar)

????with?open(msnhnet_path,"w")?as?f1:
????????f1.write(msnhnet.net)

????with?open(msnhbin_path,"wb")?as?f:?#?參數(shù)保存
????????for?i?in?m_weights?:
????????????f.write(pack('f',i))?
????Hook.hookInited?=?False



3 詳細轉(zhuǎn)換過程代碼編寫

這里先截取一下構(gòu)建MsnhNet的部分代碼,完整代碼見https://github.com/msnh2012/Msnhnet/blob/master/tools/pytorch2Msnhnet/PytorchToMsnhnet.py,如下:

from?collections?import?OrderedDict
import?sys

class?Msnhnet:
????def?__init__(self):
????????self.inAddr?=?""
????????self.net?=?""
????????self.index?=?0
????????self.names?=?[]
????????self.indexes?=?[]

????def?setNameAndIdx(self,?name,?ids):
????????self.names.append(name)
????????self.indexes.append(ids)

????def?getIndexFromName(self,name):
????????ids?=?self.indexes[self.names.index(name)]
????????return?ids

????def?getLastVal(self):
????????return?self.indexes[-1]

????def?getLastKey(self):
????????return?self.names[-1]

????def?checkInput(self,?inAddr,fun):

????????if?self.index?==?0:
????????????return

????????if?str(inAddr._cdata)?!=?self.getLastKey():
????????????try:
????????????????ID?=?self.getIndexFromName(str(inAddr._cdata))
????????????????self.buildRoute(str(inAddr._cdata),str(ID),False)
????????????except:
?????????????????raise?NotImplementedError("last?op?is?not?supported?"?+?fun?+?str(inAddr._cdata))
????????????

????def?buildConfig(self,?inAddr,?shape):
????????self.inAddr?=?inAddr
????????self.net?=?self.net?+?"config:\n"
????????self.net?=?self.net?+?"??batch:?"?+?str(int(shape[0]))?+?"\n"
????????self.net?=?self.net?+?"??channels:?"?+?str(int(shape[1]))?+?"\n"
????????self.net?=?self.net?+?"??height:?"?+?str(int(shape[2]))?+?"\n"
????????self.net?=?self.net?+?"??width:?"?+?str(int(shape[3]))?+?"\n"

?
????def?buildConv2d(self,?name,?filters,?kSizeX,?kSizeY,?paddingX,?paddingY,?strideX,?strideY,?dilationX,?dilationY,?groups,?useBias):
????????self.setNameAndIdx(name,self.index)
????????self.net?=?self.net?+?"#"?+?str(self.index)?+??"\n"
????????self.index?=?self.index?+?1
????????self.net?=?self.net?+?"conv:\n"
????????self.net?=?self.net?+?"??filters:?"?+?str(int(filters))?+?"\n"
????????self.net?=?self.net?+?"??kSizeX:?"?+?str(int(kSizeX))?+?"\n"
????????self.net?=?self.net?+?"??kSizeY:?"?+?str(int(kSizeY))?+?"\n"
????????self.net?=?self.net?+?"??paddingX:?"?+?str(int(paddingX))?+?"\n"
????????self.net?=?self.net?+?"??paddingY:?"?+?str(int(paddingY))?+?"\n"
????????self.net?=?self.net?+?"??strideX:?"?+?str(int(strideX))?+?"\n"
????????self.net?=?self.net?+?"??strideY:?"?+?str(int(strideY))?+?"\n"
????????self.net?=?self.net?+?"??dilationX:?"?+?str(int(dilationX))?+?"\n"
????????self.net?=?self.net?+?"??dilationY:?"?+?str(int(dilationY))?+?"\n"
????????self.net?=?self.net?+?"??groups:?"?+?str(int(groups))?+?"\n"
????????self.net?=?self.net?+?"??useBias:?"?+?str(int(useBias))?+?"\n"

然后Pytorch2MsnhNet就在前向傳播的過程中按照我們介紹的Hook技術(shù)完成構(gòu)建Pytorch模型對應(yīng)的MsnhNet模型結(jié)構(gòu)。

至此,我們就獲得了MsnhNet的模型參數(shù)文件和權(quán)重文件,可以利用MsnhNet加載模型進行推理了。


4?已經(jīng)支持的OP以及轉(zhuǎn)換實例

Pytorch2MsnhNet已經(jīng)支持轉(zhuǎn)換的OP如下:

-??conv2d
-??max_pool2d
-??avg_pool2d
-??adaptive_avg_pool2d
-??linear
-??flatten
-??dropout
-??batch_norm
-??interpolate(nearest,?bilinear)
-??cat???
-??elu
-??selu
-??relu
-??relu6
-??leaky_relu
-??tanh
-??softmax
-??sigmoid
-??softplus
-??abs????
-??acos???
-??asin???
-??atan???
-??cos????
-??cosh???
-??sin????
-??sinh???
-??tan????
-??exp????
-??log????
-??log10??
-??mean
-??permute
-??view
-??contiguous
-??sqrt
-??pow
-??sum
-??pad
-??+|-|x|/|+=|-=|x=|/=|

  • ResNet18的轉(zhuǎn)換示例:

import?torch
import?torch.nn?as?nn
from?torchvision.models?import?resnet18
from?PytorchToMsnhnet?import?*

resnet18=resnet18(pretrained=True)
resnet18.eval()
input=torch.ones([1,3,224,224])
trans(resnet18,?input,"resnet18.msnhnet","resnet18.msnhbin")

  • DeepLabV3的轉(zhuǎn)換示例:

import?torch
import?torch.nn?as?nn
from?torchvision.models.segmentation?import?deeplabv3_resnet101
from?PytorchToMsnhnet?import?*

deeplabv3=deeplabv3_resnet101(pretrained=False)
ccc?=?torch.load("C:/Users/msnh/.cache/torch/checkpoints/deeplabv3_resnet101_coco-586e9e4e.pth")
del?ccc["aux_classifier.0.weight"]
del?ccc["aux_classifier.1.weight"]
del?ccc["aux_classifier.1.bias"]
del?ccc["aux_classifier.1.running_mean"]
del?ccc["aux_classifier.1.running_var"]
del?ccc["aux_classifier.1.num_batches_tracked"]
del?ccc["aux_classifier.4.weight"]
del?ccc["aux_classifier.4.bias"]
deeplabv3.load_state_dict(ccc)
deeplabv3.requires_grad_(False)
deeplabv3.eval()


input=torch.ones([1,3,224,224])

#?trans?msnhnet?and?msnhbin?file
trans(deeplabv3,?input,"deeplabv3.msnhnet","deeplabv3.msnhbin")



5?MsnhNet介紹

MsnhNet是一款基于純c++的輕量級推理框架,此框架受到darknet啟發(fā),由穆士凝魂主導(dǎo),并由本公眾號作者團隊業(yè)余協(xié)助開發(fā)。

項目地址:

https://github.com/msnh2012/Msnhnet

歡迎一鍵三連!

本框架目前已經(jīng)支持了X86、Cuda、Arm端的推理(支持的OP有限,正努力開發(fā)中),并且可以直接將Pytorch模型(后面也會嘗試接入更多框架)轉(zhuǎn)為本框架的模型進行部署,歡迎對前向推理框架感興趣的同學(xué)試用或者加入我們一起維護這個輪子。


推薦閱讀



添加極市小助手微信(ID : cvmart2),備注:姓名-學(xué)校/公司-研究方向-城市(如:小極-北大-目標(biāo)檢測-深圳),即可申請加入極市目標(biāo)檢測/圖像分割/工業(yè)檢測/人臉/醫(yī)學(xué)影像/3D/SLAM/自動駕駛/超分辨率/姿態(tài)估計/ReID/GAN/圖像增強/OCR/視頻理解等技術(shù)交流群:每月大咖直播分享、真實項目需求對接、求職內(nèi)推、算法競賽、干貨資訊匯總、與?10000+來自港科大、北大、清華、中科院、CMU、騰訊、百度等名校名企視覺開發(fā)者互動交流~

△長按添加極市小助手

△長按關(guān)注極市平臺,獲取最新CV干貨

覺得有用麻煩給個在看啦~??


瀏覽 41
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報
評論
圖片
表情
推薦
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 亚洲成人777| 天天综合色| 91精品视频网站| 北条麻妃在线视频聊天| 国产Av影视| 黄色电影视频在线| 可以看的黄色视频| 亚洲男女内射| 久久视频网站| 伊人日韩| 欧美日韩不卡在线| 亚洲草片| 五月天婷婷乱伦| 2025精品偷拍视频| 亚洲婷婷在线| 91久久国产| 日韩AV高清| 人人色在线| 超碰在线69| 国产Av高清| 翔田千里AV| 日韩无码中文字幕视频| 伊人99re| 久久国产乱子伦精品免费午夜...| 香蕉在线观看| 国产黄色在线看| 91久久偷拍视频| v天堂在线观看| 国产美女18毛片水真多| 色综合五月| 欧美色伊人| 免费射精一二三区| 国产精品久久| 2025精品精品视频| 91就要爱爱视频| 黑人av| 一区二区三区AV| 大香蕉尹人网| 51乱伦| 日韩福利视频| 久久高清免费视频| 久久青草视频| 国产无码一区二区| 日韩日逼| 2018天天操| 思思热在线| 亚洲综合婷婷| 午夜小电影| 麻豆传媒在线观看| 丁香六月婷婷| 福利一区二区视频网| 亚洲天堂在线观看视频| 操一操| 懂色中文字幕| 日韩欧美在线中文| 黄色3A片在线观看| 国产av一二三区| 久久久97精品久久| 久久午夜福利视频| 国产综合亚洲精品一区二| 国产精品爽爽久久久| 天天综合字幕一区二区| 综合激情视频| 97精品人妻一区| 久久久久久无码精品亚洲日韩麻豆| 水果派解说AV无码一区| 996热re视频精品视频这里 | 久久动图| 欧美A片免费观看| 国产精品扒开腿| 欧美三级在线观看视频| 丁香五月激情啪啪| 中文字幕AV在线免费观看| 影音先锋91久久网| 91免费网站在线观看| 波多野59部无码喷潮| 久久国产免费视频| 亚洲v在线观看| 国产一区二区三区在线观看免费视频免费视频免费视频 | 亚洲夜夜撸| 日韩欧美色图| 国精产品一区二区三区| 亚洲激情视频| 丰满人妻一区二区免费看| 99色播| 欧美成人精品A片免费一区99| 女女女女女女BBBBBB手| 伊人免费视频在线观看| 日韩人成| 国产精品色情| 涩五月婷婷| 青青草91视频| 人妻少妇无码精品| 人人妻人人爽人人操| 草逼网站| 国产你懂的| 最近中文字幕高清2019中文字幕| 婷婷激情五月综合| 国产91麻豆视频| 中文字幕性爱电影| 国产又粗又黄| 国产一级a毛一级a毛视频在线网站)| 婷婷五月天色色| 狠狠操狠狠操狠狠操| 天天操一操| 青青草在线视频免费观看| 一区二区不卡视频| 亚洲AV无码成人精品区天堂小说 | 特黄特色大片BBBB| 99成人免费视频| 91人人妻人人澡| 亚洲免费性爱视频| 亚洲视频在线观看免费| 懂色成人视频在线观看| 免费无码婬片A片AA片| 国产精品伦子伦免费视频| 日韩日韩日韩日韩日韩| 欧美日韩亚洲成人| 亚洲A在线观看| 日韩欧美成人视频| 久草综合在线| 99在线精品视频| S牛牛AV| 亚洲无码成人AV| 年轻女教师高潮2| a无码视频在线观看| 无码AV免费观看| 丁香婷婷视频| 久久精品视频免费| 加勒比DVD手机在线播放观看视频 日韩精品一区二区三区四区蜜桃视频 | 亚洲一区高清| 国产成人精品av在线观看 | 国产又粗又大| 天天玩夜夜玩天天玩国产99| 久爱视频| 欧美性生交18XXXXX无码| 国产老熟女久久久| 精品乱子伦一区二区三区免费播放| 国产婷婷久久| 欧美三级在线播放| 日本女人高潮视频| 秋霞午夜久久| 成年人免费视频在线观看| 久青草资源福利视频| 精品亚洲一区二区三区四区五区| 特黄特色一级特黄大片| 国产成人亚洲精品| 日韩天天| 亚洲色图在线视频| 无码激情| 亚洲Av在线观看| 亚洲中文字幕有码| 国产一级麻豆| 日韩啪啪视频| 精品网站999www| 午夜亚洲AV永久无码精品麻豆| 成人无码影院日韩,成人年…| 99色在线视频| 青青伊人久久| 国产亚洲色婷婷久久99精品91| 久九视频| 无码69| 国产亲子乱XXXXimim/| 久久婷婷亚洲| 国产裸体美女网站| 中文字幕视频在线免费观看| 欧美二区视频| 亚洲成人视频免费在线观看| 国模私拍视频| 五月天网址| 欧美日韩亚洲一区二区三区 | 精品国精品自拍自在线| 影音av资源| 91夫妻视频| 9I看片成人免费视频| 成人福利免费视频| 成人av免费观看| 国产在线无码观看| 亚洲精品一区二区三区| 4080yy午夜理论片成人| 青青综合网| 亚洲A网| 少妇福利| 欧美日本色| 少妇搡BBBB搡BBB搡小说| 久久久蜜桃| 日韩黄色一级视频| 天堂精品在线| 北条麻妃久久久| 国产三级三级三级| 麻豆偷拍| 国产色五月视频| 蜜桃免费网站| 欧美精品系列| 日韩高清不卡| 人人操夜夜| 国产精品成人在线视频| 深爱五月激情网| 色婷婷久久综合久色| 丁香色婷婷五月天| 日韩欧美国产综合| 91禁樱桃在线| 亚洲中文字幕在线播放| 大香蕉青青| 午夜福利视频网| 亚洲午夜视频在线观看| 欧美69| 人人爽爽| 免费看的黄色视频| 色色加勒比综合| 操逼黄视频| 日本熟妇高潮BBwBBwBBw| 欧美77777| 色婷婷官网| 亚洲天堂在线看| 欧美成人三区性价比| 免费看欧美日黄片| 久久青草免费视频| 国产日韩在线观看视频| 日韩精品三区| 亚洲国产综合AV在线| 五月天亚洲色图| 日韩欧美高清视频| 国产又黄又大又粗的视频| 大香蕉尹人在线观看| 91绿帽人妻-ThePorn| 99视频色| 中文字幕超清在线观看| 亚洲福利视频网| 欧美日韩逼| 色逼逼网| 亚洲视频国产| 搞搞网日本9| 国产无码性爱| 国产www在线观看| 天堂v在线观看| 久久婷婷婬片A片AAA| 欧美综合在线观看| 操操操操一本到| 日本在线一区二区| 欧美在线黄色| 国产三级偷拍| 日韩天堂网| 国产第1页| 国产精品男女| 欧美在线一级| 2019中文字幕在线免费观看| 青草青在线| 97超碰人妻| 亚洲乱码一区| 亚洲视频91| 大肉大捧一进一出两腿| 色婷婷欧美在线播放内射| www.日本色| 日韩精品三区| 丁香六月色| A视频在线| 国产成人片色情AAAA片| 国产精品视频在线免费观看| 日韩AV毛片| 97爱爱视频| 欧美一级精品| 亚洲二区后入极品| 91人妻人人澡人人添人人爽| 丝瓜视频| 久久久aaa| 激情亚洲婷婷| 视频一视频二在线视频| 日本韩国高清无码| 欧美黄视频| 欧美老女人逼| WWWA片| 精品无码免费看专区| 日本久久综合网| 无码人妻一区二区三区| 91香蕉在线看| 黄色视频一级| 成人黄色性视频| 亚洲成色A片77777在线小说| 99性爱视频| 在线无码中文字幕| 无码一区二区三区在线| 亚洲jiZZjiZZ日本少妇| a4yy午夜福利| 无毛无码| 色婷婷五月天在线观看| 黄网站在线观看| 亚洲精品女人| 97久久精品国产熟妇高清网| 欧美一区二区三区在线播放| 美女网站在线观看| 99在线精品视频在线观看| 亚洲av毛片| 中文字幕av在线| 国产三级视频在线| 免费a在线| 免费人成在线观看视频播放| 蜜桃Av噜噜一区二区| 欧美午夜精品久久久久免费视 | 野花AV| 在线无码视频观看| 国产Av一区二区三区| 激情五月丁香花| 一二三区视频| 亚洲欧洲在线播放| 午夜天堂网| 日韩黄色电影在线免费观看| 熟女中文| 欧美日韩国产尤物主播精品| 无码动漫av| 日韩免费在线| 国内不卡一卡二视频| 四川少妇搡bbbbb搡多人| 人人操人人人| 最近最好的2019中文| 91亚瑟视频| 久久人人爱| 熟女人妻人妻の视频| 黄色A片在线观看| 伊人三级网| 婷婷久久亚洲| 91在线无码精品秘软件| 在线成人免费视频| 成人五月天黄色电影| 婷婷综合五月天| 天天操天天操天天操天天| 成人h视频| 999国产精品视频| 亚洲美女一区| 亚洲偷拍中文| 91亚洲欧美| 综合av| 亚洲超碰在线| 五月丁香色色网| 嫩草AV| 四川少妇bbb| 亚洲精品免费观看| 国产又爽又黄视频| 国产一区免费| 亚洲欧洲无码视频| 国产啊啊啊| 91麻豆精品国产91久久久久久 | 91青青草| 福利网址| 久久久久久久毛片| 成人大香蕉网站精品免费| 午夜av在线播放| 18禁网站禁片免费观看| 青青草国产在线视频| 操逼在线免费观看| 东京热av一区二区| 热久久久| 天天日天天色天天干| 天天干天天爽| 国产人妖TS重口系列网站观看| 人人妻人人澡人人爽久久con| 粉嫩av懂色av蜜臀av熟妇| 国产欧美毛片| 日本成人一区| 最近中文字幕av| a视频在线免费观看| 91视频高清无码| 九九热九九| 狠狠色五月亚洲91| 无毛无码| 一本色道久久综合亚洲精品小说| 亚洲免费视频在线看| 大香蕉久久爱| 色欧美视频| 99re在线视频| 国产精品美女视频| 国产一毛a一毛a在线观看| 西西4444www大胆无| 欧美色图在线观看视频| 国产综合第一页| 国产在线一| www.青青草视频| 日本A片在线播放| 久久黄色成人视频| 国产高清无码自拍| h片免费网站| 91精品综合久久久久久五月丁香| 午夜福利1000| 91AV免费看| 91在线超碰| 91丝袜在线| 免费av在线| 日皮视频在线| 久热在线资源福利站| 人人妻人人爽人人操| 国产字幕| 特黄AAAAAAAA片视频| 国产精品成人影视| 黄色福利网| 欧美日韩卡一卡二在线播放视频| 久久久久性| 无码人妻丰满熟妇精品区| 肏屄视频免费观看| 狠狠色五月| 翔田千里无码| 色色色热热热| 伊人五月丁香| 中文字幕视频| 日本国产在线| 亚洲成人动漫在线| 清清草视频| 日韩成人无码免费视频| 麻豆疯狂做受XXXX高潮视频| 一本色道久久综合亚洲二区三区 | 久久R5| 欧美一级性爱视频| 欧美日韩黄色极品| 日韩激情无码| 日韩欧美国产成人| 激情五月天av| 69av视频| 丁香五月六月| 韩国无码中文| 另类性姿势BBwBBW| 自拍偷拍AV| 日韩无码乱码| 成人在线视频免费观看| 日本九九视频| 色哟哟一区| 天天射天天| 日本一区二区三区免费观看| 五月丁香中文| 成人伊人网| A片免费播放| 色哟哟――国产精品| 91超碰在线观看| 色五月中文字幕| 超碰综合| 91亚洲精品久久久久蜜桃| 婷婷伊人大香蕉| 日韩乱码| 午夜理论片| 躁BBB躁BBB躁BBBBBB日视频| 中文字幕+乱码+中文乱码91| 99视频这里有精品| 国产aⅴ激情无码久久久无码| www五月天com| 国产精品96久久久| 九九亚洲精品| 久久福利| 大香蕉久久久久久| 黄色一区二区三区| 九九热re99re6在线精品| 性欧美丰满熟妇XXXX性久久久| 无码人妻一区二区三区| 91视频在| 亚洲欧美激情小说另类| 久久精品福利视频| 亚洲a√| 不卡无码av| 免费在线观看黄色视频网站| 日本黄色录像| 无码人妻一区二区三区三| 欧美成人网站在线观看| 美女黄色网| 99热官方网站| 亚洲日韩中文字幕| 黄色视频网站在线观看免费| jt33免费观看高清| 国产精品伦理| 成人无码网站| 日本一区不卡| 西西午夜视频| 69AV在线| 国产又大又粗| 成人在线H| 亚洲国产精品成人va在线观看| 亚洲黄色免费在线观看| 日本中文字幕中文翻译歌词| 亚洲精品国产成人| 婷婷五月天电影| 国产精品一区二区不卡| 男人天堂资源网| 亚洲免费MV| 国产无套视频| 亚洲伊人综合| h在线网站| 大香蕉久久久| 国产成人AV在线播放| 97在线观看视频| 男人天堂视频在线观看| 日韩精品中文字幕在线观看 | 男人的天堂社区| 一本之道DVD不卡视频| 国产97热人人| 人人插人人干| 欧美性爱手机在线| 综综综综合网| 无码一区精品久久久成人| 亚洲无码自拍偷拍| 67194国产| 黄色大片免费网站| 中国老太卖婬HD播放| 91亚洲国产成人精品一区| 亚洲成人性爱视频| 国产精品毛片VA一区二区三区| 99热9| 粉粉嫩嫩的18虎白女| 无码精品成人观看A片| www.91九色| 国产又粗又长又硬黄色一级片 | 国产三级片网站| av自拍| 色欲欲www成人网站| 午夜精品久久久久久久99热精东 | 成人毛片100免费观看| 免费在线亚洲| 日产久久久久久| 日韩一区二区三区四区| 久久AV影院| 天天爽天天爽夜夜爽毛片| 午夜一本道| 人妻电影亚洲av| 亚洲一区二区在线免费观看 | 北条麻妃精品青青久久价格| 综合网亚洲| 日韩精品一二三| 做爰视频毛片下载蜜桃视频| 久久久久久久久久久久国产精品| 成人夜间视频| 草逼网站| 欧美性爱小说网| 五月激情六月| 成人在线日韩| 性欧美成人播放77777| 操逼在线视频| 大鸡巴操骚逼视频| 精品蜜桃秘一区二区三区在线播放| 亚洲Av秘无码一区二区| 中文大香蕉视频| 中文字幕在线视频观看| 麻豆视频一区二区| 粉嫩护士小泬18p| 综合伊人大香蕉| 秋霞网一区二区| 精品无码一区二区| 日本一区二区在线| 亚洲精品成人av无码| 久久大奶| 韩国gogogo高清在线完整版 | 全国最大成人网| 中国老女人日逼| 日韩福利| 亚洲无码网| 国产AV| 麻豆传媒免费观看| 亚洲成人电影天堂| 国产精品久久AV电影| 日韩一级网站| 成人大香蕉网| 久久影院三级片| 欧美色色网| 国产suv精品一区二区| AV色色| 狠狠干婷婷| 大色AV| 日本精品视频在线| 综合成人在线| 亚洲综合无码| 外国一级片| 99在线观看精品视频| 欧美搡BBBB搡BBB| 一色综合| 99精品99| 国产精品久久久久久最猛| 婷婷情色五月| 99大香蕉| 加勒比综合| 中文无码日韩欧美久久| 牛牛精品一区二区| 日本69视频| 蜜桃久久精品成人无码AV| 91久久久久久久91| 最新人妻| 成人A毛片| 亚洲色图综合| 国产色在线| 国产三级午夜理伦三级| 2025AV在线| 成人免费A片在线观看直播96 | 逼特逼在线观看| 91av免费观看| 国产精品久久久久久久久夜色| 久久久久久无码| 五月天婷婷影院影院| 精品热99| 天天日bb| 精品人妻系列| 女BBBBBB女BBB| 三级久久| yw在线观看| 欧美黄视频| 久久午夜无码鲁丝片| 操逼在线播放| 日逼中文字幕| 婷婷亚洲国产| 东北奇淫老老妇| 手机看片久草| 色tv在线| 97无码| 日韩视频在线观看免费| 国产一二三视频| 黄片在线免费观看视频| 伊人大香蕉电影| 伦理被部长侵犯HD中字| 久操免费观看| 成人日韩在线| 俺来也听听婷婷| 丁香婷婷五月基地| 无码激情18激情视频| 欧美操逼大全| 人人插人人澡| 先锋影音资源站av每日资源在线| 在线不卡免费Av| 91亚洲视频| 怡红院成人网| 91无码精品| 黄色A片网站| 国产av中文字幕| 91亚洲精品在线| 丁香五月色情| 性无码一区二区| 久久久穴| 成人网站毛片| jizz国产精品| 老妇槡BBBB槡BBBB槡| 围产精品久久久久久久| 日本一级视频| 久99久视频| 嫩草91| 久久偷看各类wc女厕嘘嘘偷窃| 五月乱伦| 免费无码在线视频| 91丨国产丨白浆| 资源av| 手机在线操B视频| 日韩一区二区无码视频| 国产91无码精品秘入口| 丰满人妻一区二区三区46| 波多野结衣av一区| 无码在线播放视频| 久久av网站| 亚洲成人无码高清| 久久国产精彩视频| 免费观看一级黄片| 日本久久久久| 日本黄色片在线播放| 另类老妇奶性生BBwBBw偷拍| 日本少妇BBw| 亚洲天堂电影网| 免费人成视频观看| 内射一区二区三区| 亚洲精品无码更新| 全国男人的天堂网站| 9I成人免费版视频| 高清无码一级片| 国产精品久久久久久99| 成年人黄色在线观看| 九色91PORNY国产| 亚洲大胆视频| 亚洲无码视频在线免费观看 | 水蜜桃视频在线播放| 日韩无码系列| 美女被操网站免费| 亚洲五月丁香婷婷| 激情操逼视频| 夜夜av| 欧美三级推荐| 韩国无码观看| 狠狠综合网| 四虎永久在线精品| 国产精品一区二| 无码人妻精品一区二区三| 人妻FrXXeeXXee护士| 国产黄页| 最新中文字幕在线| 大香蕉伊人视频| 91性爱| 丝袜制服中文字幕无码专区| 日韩精品一区二区三| 国产一区二区久久| 大地资源第三页在线观看免费播放最新 | 中文字幕乱码中文字乱码影响大吗 | 超碰碰碰碰碰| 国产成人精品免高潮在线人与禽一| 欧美成人黄色| 人人爽人人澡| 日韩高清无码中文字幕| 欧美a在线| 黄色一区二区三区| 一级黄色电影A片| 日韩老熟妇| 先锋资源男人站| 一区无码精品| 国产91在线一区| 午夜av在线免费观看| 久久久久麻豆V国产精华液好用吗| 天天操天天操天天操天天操| 黄片大全免费看| 草久视频| 欧美一级婬片免费视频黄| 91日韩| 日韩强操逼网| 色色一级| 久久久久久久久成人| 成人H动漫精品一区二区无码| 99免费小视频| 爱逼综合| 懂色av蜜臀av粉嫩av分享| 大鸡吧网| 日韩黄片视频| 亚洲av免费在线观看| 国产欧美一区在线看| 国产在线一二三| 国产精品一卡二卡三卡| 蜜桃91在线| 黄片日逼视频| 亚洲中文欧美| 日本精品在线视频| 瑟瑟视频在线观看| 三级成人网站| 青草久在线| 在线看毛片网站| 久久午夜无码人妻精品蜜桃冫| 成人免费三级| 日韩性爱区| 亚洲色欲色欲www在线成人网| 精品国产91乱码一区二区三区| 成人黄色在线视频| 午夜av在线播放| 无码AV天堂| 男人操女人免费网站| 男人天堂婷婷| 国内精品卡一卡二卡三| 午夜激情AV| 中文在线视频| 毛片在线看片| 霸道总裁雷总各种姿势白浆爱情岛论坛| 婷婷丁香色| ThePorn-成人网站入口| 大香蕉久热| 久久草在线观看| 黑人内射人妖| 亚洲综合网在线| 丁香五月天激情视频| 波多野结衣无码在线视频| 欧美又粗又大| 男人的天堂2019| 欧美777| 国产亚洲色情| 亚洲无码人妻在线| 日中文字幕| 老太色HD色老太HD| 欧美三P囗交做爰XXXⅩ| 亚洲国产三级| 色欲成人AV| 日日骚影院| 国产一级a毛一级a毛视频在线网站) | 国产精品婷婷午夜在线观看 | 欧美99| 人妖黃色一級A片| 伊人大香在线| 草B网| 婷婷午夜精品久久久久久性色AV | 日韩动态图| AⅤ中文字幕在线免费观看| 国产老女人操逼视频| 天天天日天天天天天天天日歌词| 曰逼视频| 91成人福利| 777AV| 久久久久久一区| 亚洲三级av| 西西人体大胆裸体A片| 国产欧美日韩在线观看| 欧美人操逼一二区| 国产欧美精品一区二区三区| 黄页视频网站| 91人妻人人澡人人爽人人精品乱| 日韩在线视频播放| 91大神免费在线观看| 超碰碰碰| 熟女老阿V8888AV| 亚洲最大无码| 人妻无码中文字幕免费视频蜜桃 | 四季AV之日韩人妻无码| 天天添| 水果派av解说| 精品无码一区二区三区四区久久久软件 | 热热热热色| 国产成人av在线观看| 午夜电影无码| 99热超碰| 亚洲韩国国产| 日韩欧美一区二区在线观看| 日韩无码精品电影| 成人黄色免费网站| 久久黄色视| 黄色在线观看国产| 亚洲无码色| 久久av一区二区三区| 久操免费在线| 青青草网站在线观看| 好男人WWW一区二区三区| 水蜜桃一曲二区| 日韩另类| 艹逼片| 中文无码播放| 中文字幕在线免费视频| 永久免费不卡在线观看黄网站| 亚洲香蕉影院| 亚洲日韩欧美一区二区| 深爱婷婷| 中国最大成人网站| 亚洲一卡二卡三卡四卡免| 五月丁香免费视频| 日本在线免费| 日韩乱码| 亚洲精品秘一区二区三区在线观看| 91在线日韩| 欧美成人精品无码网站| 日韩在线综合网| 内射免费网站| 亚洲AV中文| 狠狠AV| 日韩a√| 黄色A片在线观看| 俺来也操逼| www日韩欧美| 久久久成人片| 欧美熟女18| 欧美一级电影| 一级特黄妇女高潮AA片免费播放 | 嫩BBB槡BBBB槡BBBB免费视频 | 久久无码区| 九九九九九九精品视频| 日本熟妇高潮BBwBBwBBw| 婷婷国产亚洲精品网站| 日韩精彩视频| 毛片资源| 在线观看者亚洲| 免费国产h| 女人18片毛片90分钟免费明星| 欧美一二| 青青草东路热vv| 亚洲三级在线免费观看| 日韩无码www| 伊人黄片| 日韩av无码电影| 国产毛片一区二区| 久热久热| 亚洲人人18XXX—20HD| 午夜精品久久久| 精品无码一区二区三区四区| 国产AV综合网| 四虎在线视频| 俺来也俺去也| 欧美日韩国产成人在线观看| 一级操逼毛片| 日本欧美国产| 欧美精品三区| 久热福利| 蜜桃视频一区二区三区| 国产精品久久在线| 免费操逼视频在线观看| 亚洲欧美综合| 2021天天夜日| 91资源在线观看| www.青青草视频| 亚州v| 一本色道久久综合亚洲精品久久 | 日B免费视频| 免费看的黄色视频| 午夜成人小视频| 色婷婷激情综合网| 操人人| 按摩性高湖婬AAA片A片中国| 久久熟女嫩草成人片免费| 久久精品熟妇丰满人妻99| 中文字幕第一页亚洲| 日韩在线观看视频网站| 亚洲在线免费| 国产精品美女久久久久久久久 | 欧美一级性爱在线观看| 久久毛片视频| 天堂在线视频| 午夜ww| 国产欧美精品一区二区| 98无码人妻精品一区二区三区 | 五月婷在线观看| 亚洲AV第二区国产精品| 996精品在线| 一级一A片一a免费看| 亚洲视频在线观看| gogogo日本免费观看高清电视剧的注意 |