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

基于Pytorch對YOLOV5 進(jìn)行簡易實(shí)現(xiàn)

共 39692字,需瀏覽 80分鐘

 ·

2021-05-13 07:56

這篇文章主要針對于YOLOV5-Pytorch版本的網(wǎng)絡(luò)結(jié)構(gòu)代碼進(jìn)行實(shí)現(xiàn),簡化代碼的理解并簡化配置文件,進(jìn)一步梳理一些YOLOV5四種網(wǎng)絡(luò)結(jié)構(gòu),在這個過程中對于V5的網(wǎng)絡(luò)有著更加深入的理解。最后希望看完這篇文章的讀者可以有所收獲,對于代碼中的一些寫法上的優(yōu)化希望可以和大家一起交流進(jìn)步。

一、網(wǎng)絡(luò)完整代碼

  1. 實(shí)現(xiàn)思路,v5中的common代碼結(jié)構(gòu)進(jìn)行了保留,因?yàn)檫@一部分代碼是比較好理解的,整體代碼看起來是比較簡單的,主要是整體網(wǎng)絡(luò)結(jié)構(gòu)的搭建,通過解析yaml文件對于一些開發(fā)人員來說是不是很友好的。

  2. 網(wǎng)絡(luò)中的一些變量

    c1:輸入通道 c2:輸出通道  k:卷積核大小  s:步長 p:padding g:分組  act;激活函數(shù) e:擴(kuò)展倍數(shù)
    gw:網(wǎng)絡(luò)寬度因子  gd:網(wǎng)絡(luò)深度因子  n:模塊重復(fù)次數(shù)  nc:類別數(shù)
  3. 主干網(wǎng)絡(luò)代碼CSPDarknet53

  4. 1

    import torch
    import torch.nn as nn


    def autopad(k, p=None):  # kernel, padding
        # Pad to 'same'
        if p is None:
            p = k // 2 if isinstance(k, int) else [x // 2 for x in k]  # auto-pad
        return p


    class CBL(nn.Module):

        def __init__(self, c1, c2, k=1, s=1, p=None, g=1, act=True, e=1.0):
            super(CBL, self).__init__()
            c1 = round(c1 * e)
            c2 = round(c2 * e)
            self.conv = nn.Conv2d(c1, c2, k, s, autopad(k, p), groups=g, bias=False)
            self.bn = nn.BatchNorm2d(c2)
            self.act = nn.SiLU() if act is True else (act if isinstance(act, nn.Module) else nn.Identity())

        def forward(self, x):
            return self.act(self.bn(self.conv(x)))


    class Focus(nn.Module):

        def __init__(self, c1, c2, k=3, s=1, p=1, g=1, act=True, e=1.0):
            super(Focus, self).__init__()
            c2 = round(c2 * e)
            self.conv = CBL(c1 * 4, c2, k, s, p, g, act)

        def forward(self, x):  # x(b,c,w,h) -> y(b,4c,w/2,h/2)
            flatten_channel = torch.cat([x[..., 0::20::2],
                                         x[..., 1::20::2],
                                         x[..., 0::21::2],
                                         x[..., 1::21::2]], dim=1)
            return self.conv(flatten_channel)


    class SPP(nn.Module):

        def __init__(self, c1, c2, k=(5913), e=1.0):
            super(SPP, self).__init__()
            c1 = round(c1 * e)
            c2 = round(c2 * e)
            c_ = c1 // 2
            self.cbl_before = CBL(c1, c_, 11)
            self.max_pool = nn.ModuleList([nn.MaxPool2d(kernel_size=x, stride=1, padding=x // 2for x in k])
            self.cbl_after = CBL(c_ * 4, c2, 11)

        def forward(self, x):  
            x = self.cbl_before(x)
            x_cat = torch.cat([x] + [m(x) for m in self.max_pool], 1)
            return self.cbl_after(x_cat)


    class ResUnit_n(nn.Module):

        def __init__(self, c1, c2, n):
            super(ResUnit_n, self).__init__()
            self.shortcut = c1 == c2
            res_unit = nn.Sequential(
                CBL(c1, c1, k=1, s=1, p=0),
                CBL(c1, c2, k=3, s=1, p=1)
            )
            self.res_unit_n = nn.Sequential(*[res_unit for _ in range(n)])

        def forward(self, x):
            return x + self.res_unit_n(x) if self.shortcut else self.res_unit_n(x)


    class CSP1_n(nn.Module):

        def __init__(self, c1, c2, k=1, s=1, p=None, g=1, act=True, n=1, e=None):
            super(CSP1_n, self).__init__()

            c1 = round(c1 * e[1])
            c2 = round(c2 * e[1])
            n = round(n * e[0])
            c_ = c2 // 2
            self.up = nn.Sequential(
                CBL(c1, c_, k, s, autopad(k, p), g, act),
                ResUnit_n(c_, c_, n),
                # nn.Conv2d(c_, c_, 1, 1, 0, bias=False) 這里最新yolov5結(jié)構(gòu)中去掉了,與網(wǎng)上的結(jié)構(gòu)圖稍微有些區(qū)別
            )
            self.bottom = nn.Conv2d(c1, c_, 110)
            self.tie = nn.Sequential(
                nn.BatchNorm2d(c_ * 2),
                nn.LeakyReLU(),
                nn.Conv2d(c_ * 2, c2, 110, bias=False)
            )
        def forward(self, x):
            total = torch.cat([self.up(x), self.bottom(x)], dim=1)
            out = self.tie(total)
            return out


    class CSPDarkNet(nn.Module):

        def __init__(self, gd=0.33, gw=0.5):
            super(CSPDarkNet, self).__init__()
            self.truck_big = nn.Sequential(
                Focus(364, e=gw),
                CBL(64128, k=3, s=2, p=1, e=gw),
                CSP1_n(128128, n=3, e=[gd, gw]),
                CBL(128256, k=3, s=2, p=1, e=gw),
                CSP1_n(256256, n=9, e=[gd, gw]),

            )
            self.truck_middle = nn.Sequential(
                CBL(256512, k=3, s=2, p=1, e=gw),
                CSP1_n(512512, n=9, e=[gd, gw]),
            )
            self.truck_small = nn.Sequential(
                CBL(5121024, k=3, s=2, p=1, e=gw),
                SPP(10241024, e=gw)
            )

        def forward(self, x):
            h_big = self.truck_big(x)  # torch.Size([2, 128, 76, 76])
            h_middle = self.truck_middle(h_big)
            h_small = self.truck_small(h_middle)
            return h_big, h_middle, h_small


    def darknet53(gd, gw, pretrained, **kwargs):
        model = CSPDarkNet(gd, gw)
        if pretrained:
            if isinstance(pretrained, str):
                model.load_state_dict(torch.load(pretrained))
            else:
                raise Exception(f"darknet request a pretrained path. got[{pretrained}]")
        return model
  5. 整體網(wǎng)絡(luò)的構(gòu)建

    import torch
    import torch.nn as nn
    from cspdarknet53v5 import darknet53


    def autopad(k, p=None):  # kernel, padding
        # Pad to 'same'
        if p is None:
            p = k // 2 if isinstance(k, int) else [x // 2 for x in k]  # auto-pad
        return p


    class UpSample(nn.Module):

        def __init__(self):
            super(UpSample, self).__init__()
            self.up_sample = nn.Upsample(scale_factor=2, mode='nearest')

        def forward(self, x):
            return self.up_sample(x)


    class CBL(nn.Module):

        def __init__(self, c1, c2, k=1, s=1, p=None, g=1, act=True, e=1.0):
            super(CBL, self).__init__()
            c1 = round(c1 * e)
            c2 = round(c2 * e)
            self.conv = nn.Conv2d(c1, c2, k, s, autopad(k, p), groups=g, bias=False)
            self.bn = nn.BatchNorm2d(c2)
            self.act = nn.SiLU() if act is True else (act if isinstance(act, nn.Module) else nn.Identity())

        def forward(self, x):
            return self.act(self.bn(self.conv(x)))


    class ResUnit_n(nn.Module):

        def __init__(self, c1, c2, n):
            super(ResUnit_n, self).__init__()
            self.shortcut = c1 == c2
            res_unit = nn.Sequential(
                CBL(c1, c1, k=1, s=1, p=0),
                CBL(c1, c2, k=3, s=1, p=1)
            )
            self.res_unit_n = nn.Sequential(*[res_unit for _ in range(n)])

        def forward(self, x):
            return x + self.res_unit_n(x) if self.shortcut else self.res_unit_n(x)


    class CSP1_n(nn.Module):

        def __init__(self, c1, c2, k=1, s=1, p=None, g=1, act=True, n=1, e=None):
            super(CSP1_n, self).__init__()

            c1 = round(c1 * e[1])
            c2 = round(c2 * e[1])
            n = round(n * e[0])
            c_ = c2 // 2
            self.up = nn.Sequential(
                CBL(c1, c_, k, s, autopad(k, p), g, act),
                ResUnit_n(c_, c_, n),
                # nn.Conv2d(c_, c_, 1, 1, 0, bias=False) 這里最新yolov5結(jié)構(gòu)中去掉了,與網(wǎng)上的結(jié)構(gòu)圖稍微有些區(qū)別
            )
            self.bottom = nn.Conv2d(c1, c_, 110)
            self.tie = nn.Sequential(
                nn.BatchNorm2d(c_ * 2),
                nn.LeakyReLU(),
                nn.Conv2d(c_ * 2, c2, 110, bias=False)
            )

        def forward(self, x):
            total = torch.cat([self.up(x), self.bottom(x)], dim=1)
            out = self.tie(total)
            return out


    class CSP2_n(nn.Module):

        def __init__(self, c1, c2, e=0.5, n=1):
            super(CSP2_n, self).__init__()
            c_ = int(c1 * e)
            cbl_2 = nn.Sequential(
                CBL(c1, c_, 110),
                CBL(c_, c_, 110),
            )
            self.cbl_2n = nn.Sequential(*[cbl_2 for _ in range(n)])
            self.conv_up = nn.Conv2d(c_, c_, 110)
            self.conv_bottom = nn.Conv2d(c1, c_, 110)
            self.tie = nn.Sequential(
                nn.BatchNorm2d(c_ * 2),
                nn.LeakyReLU(),
                nn.Conv2d(c_ * 2, c2, 110)
            )

        def forward(self, x):
            up = self.conv_up(self.cbl_2n(x))
            total = torch.cat([up, self.conv_bottom(x)], dim=1)
            out = self.tie(total)
            return out


    class yolov5(nn.Module):

        def __init__(self, nc=80, gd=0.33, gw=0.5):
            super(yolov5, self).__init__()
            # ------------------------------Backbone--------------------------------
            self.backbone = darknet53(gd, gw, None)

            # ------------------------------Neck------------------------------------
            self.neck_small = nn.Sequential(
                CSP1_n(10241024, n=3, e=[gd, gw]),
                CBL(1024512110, e=gw)
            )
            self.up_middle = nn.Sequential(
                UpSample()
            )
            self.out_set_middle = nn.Sequential(
                CSP1_n(1024512, n=3, e=[gd, gw]),
                CBL(512256110, e=gw),
            )
            self.up_big = nn.Sequential(
                UpSample()
            )
            self.out_set_tie_big = nn.Sequential(
                CSP1_n(512256, n=3, e=[gd, gw])
            )

            self.pan_middle = nn.Sequential(
                CBL(256256321, e=gw)
            )
            self.out_set_tie_middle = nn.Sequential(
                CSP1_n(512512, n=3, e=[gd, gw])
            )
            self.pan_small = nn.Sequential(
                CBL(512512321, e=gw)
            )
            self.out_set_tie_small = nn.Sequential(
                CSP1_n(10241024, n=3, e=[gd, gw])
            )
            # ------------------------------Prediction--------------------------------
            # prediction
            big_ = round(256 * gw)
            middle = round(512 * gw)
            small_ = round(1024 * gw)
            self.out_big = nn.Sequential(
                nn.Conv2d(big_, 3 * (5 + nc), 110)
            )
            self.out_middle = nn.Sequential(
                nn.Conv2d(middle, 3 * (5 + nc), 110)
            )
            self.out_small = nn.Sequential(
                nn.Conv2d(small_, 3 * (5 + nc), 110)
            )

        def forward(self, x):
            h_big, h_middle, h_small = self.backbone(x)
            neck_small = self.neck_small(h_small)  
            # ----------------------------up sample 38*38-------------------------------
            up_middle = self.up_middle(neck_small)
            middle_cat = torch.cat([up_middle, h_middle], dim=1)
            out_set_middle = self.out_set_middle(middle_cat)

            # ----------------------------up sample 76*76-------------------------------
            up_big = self.up_big(out_set_middle)  # torch.Size([2, 128, 76, 76])
            big_cat = torch.cat([up_big, h_big], dim=1)
            out_set_tie_big = self.out_set_tie_big(big_cat)

            # ----------------------------PAN 36*36-------------------------------------
            neck_tie_middle = torch.cat([self.pan_middle(out_set_tie_big), out_set_middle], dim=1)
            up_middle = self.out_set_tie_middle(neck_tie_middle)

            # ----------------------------PAN 18*18-------------------------------------
            neck_tie_small = torch.cat([self.pan_small(up_middle), neck_small], dim=1)
            out_set_small = self.out_set_tie_small(neck_tie_small)

            # ----------------------------prediction-------------------------------------
            out_small = self.out_small(out_set_small)
            out_middle = self.out_middle(up_middle)
            out_big = self.out_big(out_set_tie_big)

            return out_small, out_middle, out_big


    if __name__ == '__main__':
        # 配置文件的寫法
        config = {
            #            gd    gw
            'yolov5s': [0.330.50],
            'yolov5m': [0.670.75],
            'yolov5l': [1.001.00],
            'yolov5x': [1.331.25]
        }
        # 修改一次文件名字
        net_size = config['yolov5x']
        net = yolov5(nc=80, gd=net_size[0], gw=net_size[1])
        print(net)
        a = torch.randn(23416416)
        y = net(a)
        print(y[0].shape, y[1].shape, y[2].shape)

二、網(wǎng)絡(luò)結(jié)構(gòu)的解析

  1. 殘差塊ResUnit_n

    class ResUnit_n(nn.Module):

        def __init__(self, c1, c2, n):
            super(ResUnit_n, self).__init__()
            self.shortcut = c1 == c2
            res_unit = nn.Sequential(
                CBL(c1, c1, k=1, s=1, p=0),
                CBL(c1, c2, k=3, s=1, p=1)
            )
            self.res_unit_n = nn.Sequential(*[res_unit for _ in range(n)])

        def forward(self, x):
            return x + self.res_unit_n(x) if self.shortcut else self.res_unit_n(x)
  2. CSP1_x結(jié)構(gòu)

    構(gòu)建思路:CSP1_n 代碼進(jìn)行優(yōu)化,把CSP看做一個趴著的動物,頭在左面,尾巴在右邊;up是靠近天空的地方,bottom是靠近地的,tie就是動物的尾巴

    class CSP1_n(nn.Module):

        def __init__(self, c1, c2, k=1, s=1, p=None, g=1, act=True, n=1, e=None):
            super(CSP1_n, self).__init__()

            c1 = round(c1 * e[1])
            c2 = round(c2 * e[1])
            n = round(n * e[0])
            c_ = c2 // 2
            self.up = nn.Sequential(
                CBL(c1, c_, k, s, autopad(k, p), g, act),
                ResUnit_n(c_, c_, n),
                # nn.Conv2d(c_, c_, 1, 1, 0, bias=False) 這里最新yolov5結(jié)構(gòu)中去掉了,與網(wǎng)上的結(jié)構(gòu)圖稍微有些區(qū)別
            )
            self.bottom = nn.Conv2d(c1, c_, 110)
            self.tie = nn.Sequential(
                nn.BatchNorm2d(c_ * 2),
                nn.LeakyReLU(),
                nn.Conv2d(c_ * 2, c2, 110, bias=False)
            )

        def forward(self, x):
            total = torch.cat([self.up(x), self.bottom(x)], dim=1)
            out = self.tie(total)
            return out
  3. CSPDarknet主干網(wǎng)絡(luò)構(gòu)建

    class CSPDarkNet(nn.Module):

        def __init__(self, gd=0.33, gw=0.5):
            super(CSPDarkNet, self).__init__()
            self.truck_big = nn.Sequential(
                Focus(364, e=gw),
                CBL(64128, k=3, s=2, p=1, e=gw),
                CSP1_n(128128, n=3, e=[gd, gw]),
                CBL(128256, k=3, s=2, p=1, e=gw),
                CSP1_n(256256, n=9, e=[gd, gw]),

            )
            self.truck_middle = nn.Sequential(
                CBL(256512, k=3, s=2, p=1, e=gw),
                CSP1_n(512512, n=9, e=[gd, gw]),
            )
            self.truck_small = nn.Sequential(
                CBL(5121024, k=3, s=2, p=1, e=gw),
                SPP(10241024, e=gw)
            )

        def forward(self, x):
            h_big = self.truck_big(x)  
            h_middle = self.truck_middle(h_big)
            h_small = self.truck_small(h_middle)
            return h_big, h_middle, h_small
  4. 整體網(wǎng)絡(luò)構(gòu)建

    class yolov5(nn.Module):

        def __init__(self, nc=80, gd=0.33, gw=0.5):
            super(yolov5, self).__init__()
            # ------------------------------Backbone------------------------------------
            self.backbone = darknet53(gd, gw, None)

            # ------------------------------Neck------------------------------------
            self.neck_small = nn.Sequential(
                CSP1_n(10241024, n=3, e=[gd, gw]),
                CBL(1024512110, e=gw)
            )
            # FPN:2次上采樣 自頂而下 完成語義信息增強(qiáng)
            self.up_middle = nn.Sequential(
                UpSample()
            )
            self.out_set_middle = nn.Sequential(
                CSP1_n(1024512, n=3, e=[gd, gw]),
                CBL(512256110, e=gw),
            )
            self.up_big = nn.Sequential(
                UpSample()
            )
            self.out_set_tie_big = nn.Sequential(
                CSP1_n(512256, n=3, e=[gd, gw])
            )

            # PAN:2次下采樣 自底而上 完成位置信息增強(qiáng)
            self.pan_middle = nn.Sequential(
                CBL(256256321, e=gw)
            )
            self.out_set_tie_middle = nn.Sequential(
                CSP1_n(512512, n=3, e=[gd, gw])
            )
            self.pan_small = nn.Sequential(
                CBL(512512321, e=gw)
            )
            self.out_set_tie_small = nn.Sequential(
                # CSP2_n(512, 512)
                CSP1_n(10241024, n=3, e=[gd, gw])
            )
            # ------------------------------Prediction------------------------------------
            # prediction
            big_ = round(256 * gw)
            middle = round(512 * gw)
            small_ = round(1024 * gw)
            self.out_big = nn.Sequential(
                nn.Conv2d(big_, 3 * (5 + nc), 110)
            )
            self.out_middle = nn.Sequential(
                nn.Conv2d(middle, 3 * (5 + nc), 110)
            )
            self.out_small = nn.Sequential(
                nn.Conv2d(small_, 3 * (5 + nc), 110)
            )

        def forward(self, x):
            h_big, h_middle, h_small = self.backbone(x)
            neck_small = self.neck_small(h_small)  
            # ----------------------------up sample 38*38--------------------------------
            up_middle = self.up_middle(neck_small)
            middle_cat = torch.cat([up_middle, h_middle], dim=1)
            out_set_middle = self.out_set_middle(middle_cat)

            # ----------------------------up sample 76*76--------------------------------
            up_big = self.up_big(out_set_middle)  # torch.Size([2, 128, 76, 76])
            big_cat = torch.cat([up_big, h_big], dim=1)
            out_set_tie_big = self.out_set_tie_big(big_cat)

            # ----------------------------PAN 36*36-------------------------------------
            neck_tie_middle = torch.cat([self.pan_middle(out_set_tie_big), out_set_middle], dim=1)
            up_middle = self.out_set_tie_middle(neck_tie_middle)

            # ----------------------------PAN 18*18-------------------------------------
            neck_tie_small = torch.cat([self.pan_small(up_middle), neck_small], dim=1)
            out_set_small = self.out_set_tie_small(neck_tie_small)

            # ----------------------------prediction-------------------------------------
            out_small = self.out_small(out_set_small)
            out_middle = self.out_middle(up_middle)
            out_big = self.out_big(out_set_tie_big)

            return out_small, out_middle, out_big
  5. 四種尺寸的配置文件的寫法,放在了config字典中,這是網(wǎng)絡(luò)模型的配置參數(shù),沒有將其他的參數(shù)放到配置文件中,可以將類別也放到配置文件中。在上面的網(wǎng)絡(luò)代碼中寬度參數(shù)就是變量e然后傳入到每個網(wǎng)絡(luò)中去。

    config = {
            #            gd    gw
            'yolov5s': [0.330.50],
            'yolov5m': [0.670.75],
            'yolov5l': [1.001.00],
            'yolov5x': [1.331.25]
        }
        # 修改一次文件名字
        net_size = config['yolov5x']
        net = yolov5(nc=80, gd=net_size[0], gw=net_size[1])

v5原始代碼將v3中的Head部分單獨(dú)寫成了一個 Detect類,主要的原因是因?yàn)関5中使用了一些訓(xùn)練的技巧,在Detect中有訓(xùn)練和兩個部分,v5原始代碼對于初學(xué)者來說是比較困難的,首先網(wǎng)絡(luò)的寫法,對于編碼的能力要求是相對比較高的。不過這種yaml配置文件來對網(wǎng)絡(luò)進(jìn)行配置的方法在很多公司已經(jīng)開始使用,這可能是未來工程話代碼的一個寫法,還是需要掌握這種寫法的。

三、總結(jié)

  1. 我個人的感覺是對于這種網(wǎng)絡(luò)的設(shè)計(jì)還有代碼的寫法要有天馬行空的想象力,代碼寫起來也像武俠小說中那種飄逸感。(網(wǎng)絡(luò)結(jié)構(gòu)圖,網(wǎng)上有很多,我是仿照這江大白的結(jié)構(gòu)圖,在其結(jié)構(gòu)圖的基礎(chǔ)上并與最新的v5代碼的基礎(chǔ)上進(jìn)行了調(diào)整)。

  2. 最新的v5網(wǎng)絡(luò)結(jié)構(gòu)中出現(xiàn)了Transformer結(jié)構(gòu),有種CV領(lǐng)域工程化上要變天的節(jié)奏,大家可以去了解一些。

推薦閱讀

RNN 圖解版

為什么AI無法解決一般智能問題?

GAN生成的超級馬里奧關(guān)卡,可以永不通關(guān)的那種

計(jì)算機(jī)視覺頂尖期刊和會議的段子

基于深度學(xué)習(xí)的目標(biāo)檢測算法面試必備(RCNN~YOLOv5)

超越Y(jié)OLOv5,1.3M超輕量,高效易用,目標(biāo)檢測領(lǐng)域這一個就夠了!

瀏覽 72
點(diǎn)贊
評論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)
評論
圖片
表情
推薦
點(diǎn)贊
評論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)

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

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 一级黄片免费视频| 欧美在线成人视频| 久久九九视频| 久久精品| 一级免费黄色片| 操逼com| 亚洲永久在线| 五月久久婷婷| 不卡中文字幕| 国产九九九九| 日本一区二区三区免费观看| 逼特逼在线视频| 午夜试看120秒体验区的特点| 俺来也最新网址| 日韩免费视频| 永久免费一区二区三区| 9i看片成人免费视频| 免费看黄色一级片| 福利视频一区二区三区| 永久AV免费网站| 91精品午夜少妇| AA精品| 国产A片录制现场妹子都很多| 麻豆精品| 日本黄色免费| 婷婷五月情| 丰满人妻一区二区三区精品高 | JLZZJLZZ亚洲女人| 色婷婷中文| 日本暖暖视频| 亚洲成人在线免费| 97免费视频在线观看| 欧美激情伊人| 国产精品毛片A√一区| 无码内射视频| www黄色视频| 黄片免费观看网站| 永久免费看片视频| 97三级| 色情一级AA片免费观看| 免费视频A| 欧美在线亚洲| 手机看片1024你懂的| 久久你懂的| 怡春院综合| 新亚洲天堂男子Av-| 亚洲国产成人精品女人| 精品成人电影| 91香蕉在线观看| 91人人妻人人澡人人爽人人| 国产靠逼视频| 天天骑夜夜操| 中文字幕在线观看网址最新地址| 国产一二区| 国产亚洲欧洲| 久久婷五月天| 仓井空一区二区| 99精品国自产在线| 五月黄色电影| 久久久久久久网| 少妇做爱特级AAA| 久操国产视频| 国产思思99re99在线观看| 人人操人人干人人妻| 亚洲国产av电影| 少妇搡BBBB搡BBB搡打电话| 夜夜骚| xxx国产精品| 免费一区二区三区四区| 国产成人视频在线观看| 欧美日韩精品在线观看| 丰满欧美熟妇免费视频| 波多野成人无码精品69| 操BBBB| V天堂在线| 亚洲国产精品久久久| 日本少妇无码| 嫩BBB搡BBB槡BBB小号| 亚洲超碰在线| 毛多水多丰满女人A片| 天天干天天日天天色| 污视频在线看| 欧美黄色免费观看| 色婷婷亚洲婷婷| 一级Aa视频免费看| 亚洲成人一级片| 精品无码久久久| 欧美黑人大吊| 色色一区二区| 欧美性BBB槡BBB槡BBB| 亚州中文字幕| 911精品人妻一区二区三区A片| 亚洲日韩成人在线| 亚洲国产精品午夜福利| 97精品在线观看| 国产亚洲欧美精品综合在线| 亚洲一区三区| 久久黄色免费视频| 国产操美女| 色悠久久久| av在线观看中文字幕| 久久婷婷网| 欧美人妻精品| 日本在线小视频| 国产精品视频免费看| 97色色五月天| 夜夜爽天天爽| 不卡中文字幕| 欧美黄片在线| 青青操在线视频| 无码免费视频| 中文字字幕中文字幕乱码| 日本少妇黄色视频| 肏逼视频免费看| 一级成人视频| 免费的黄色视频网站| 日皮视频| 26uuu国产| 国产成人精品777777| 亚洲中文字幕2019| 久草在线播放| 人人色视频| 国产乱妇乱子伦视频免费观看让女人 | 久久9热| 日本免费黄色| 北条麻妃一区二区三区在线| jizz免费视频| 亚洲无码理论片| 91无码精品国产AⅤ| a√天堂资源中文8| 日韩夜夜操| 欧美日韩中文在线| 69er小视频| 欧美日韩精品在线视频| 美日韩免费视频| 亚洲日本高清| 国产视频你懂的| 97超碰大香蕉| 黄色激情网站| 一区二区Av| 日韩AV免费网站| 久久99视频免费观看| 国产精品国产三级国产| 狠狠躁日日躁夜夜躁A片男男视频| 99er在线观看视频| 中文字字幕在线中文| 日本高清无码在线观看| 美女自慰网站在线观看| 久色伊人| 永井玛丽亚av无码中出流出 | 日韩第一区| 在线免费观看国产| 成人毛片在线大全免费| 江苏妇搡BBBB搡BBBB-百度| 国产精品秘ThePorn| www.婷婷色| 久草中文网| 婷婷久| 日韩在线视频免费观看| 精品乱码一区| 91一区二区在线播放精品| 国产欧美综合三级伦| 一级少女免费播放电视剧韩剧TV | 精品77777| 免费91视频| 免费看黃色AAAAAA片| 成人A片视频| 国产女人操逼视频| 99久久人妻无码中文字幕系列| 另类Av| 伊人久久香| 国产成人大片| 欧美三级网| 秒播福利| 久久久WWW成人免费无遮挡大片| 无码免费在线观看视频| 国产精品午夜福利视频| 亚洲免费黄色| 国产三级网站| 69av天堂| 熟女内射| 99精品色| 2021无码| 欧美日韩中文| 丰满人妻一区二区三区精品高清 | 日本黄色视频在线观看| 两根茎一起进去好爽A片在线观看| 草逼网视频| 天堂aaa| 国产黄色性爱视频| 日本女人操逼视频| 新超碰在线观看| 亚洲人人| 国产精品无码在线播放| 欧美一级A片免费看| 特级黄色毛片| 亚洲无码高清在线观看视频| 久久久精品淫秽色情| 成人免费精品视频| 91视频18| 亚洲无码播放| 在线免费AV片| 麻豆AV片| 亚洲福利在线观看视频| 国产av激情| 婷婷色色五月天图片| 久婷婷| 九九九无码| www.天天操| 欧美性爱在线| 91在线欧美| 中文字幕在线中文| 久久综合久久鬼| 色男人的天堂| 大香蕉在线99| 蜜桃系列一区二区精品| 国产一级操逼视频| 欧美黄片在线| 欧美视频手机在线| 国产免费性爱| 免费超碰在线| 久久久久久亚洲Av无码精品专口 | 内射视频在线免费观看| 欧美日韩一级视频| 国产精品1区2区3区| 欧美国产第一页| 青草草在线| 九色91视频| 日韩精品一区二区三免费视频| 成人小说亚洲一区二区三区| 欧美日韩毛片| 黄色在线免费观看| 在线aⅴ| 国产一区二区三区免费观看| 精品国产成人a在线观看| 熟妇一区| 国产一视频| 青青色综合| 免费一级A毛片夜夜看| 足浴小少妇-88AX| 亚洲无吗在线播放| 青青草资源站| 国内精品人妻无码久久久影院蜜桃| 婷婷婷色| 青青无码| 另类老妇性BBwBBw| av天堂电影网| 精品无码人妻一区二区三区| 最好看的MV中文字幕国语| adn日韩av| 996热re视频精品视频这里| 熟妇熟女一区二区三区| 农村乱子伦毛片国产乱| 女人卖婬视频播放| jizz18日本| 西西特级WWW444无码| 亚洲AV激情无码专区在线播放 | 国产成人免费观看| 97精品人妻| 中文字幕无码综合| 日本一本草久p| www.熟女| 人人草人人草| 黄色免费在线观看网站| 国产成人无码一区二区在线观看 | 亚洲激情综合视频| 亚洲综合中文字幕在线| 日日摸日日碰| 亚洲在线高清视频| 日本在线一级片| 亚洲精品操逼| 五月丁香婷婷基地| 91av免费| 中文字幕你懂的| 成人免费版欧美州| 午夜福利高清在线观看| 日韩精品免费一区二区在线观看 | 成人禁区| 亚洲AⅤ无码一区二区波多野按摩 69国产成人综合久久精品欧美 | 大香蕉久久伊人| 五月天婷婷av| 巨乳国产一区| 丰满熟妇高潮呻吟无码| 婷婷五月天网址| 欧美日韩免费在线播放电影在线播放电影在线播放电影免费 | 亚洲天堂美女| 国产精品欧美综合| 国产91无码精品秘入口新欢| 黄色电影一级| 久久久久久久久久成人永久免费视频 | 亚洲成人影音先锋| 99热er| 日韩人妻丰满无码区A片| 三级AV在线观看| 日韩精品人妻无码| 欧美黄色小说| 亚洲天堂AV在线观看| 婷婷色色婷婷| 91大长腿美女花外围在线观看 | 中文字幕特黄A片| 人人射人人爱| 无码123| 无码精品黄色片| 久久精品五月天| 青青草无码在线| 翔田千里无码XXXXXX| 在线观看免费视频无码| 一本一本久久a久久精品牛牛影视 91无码人妻精品一区二区蜜桃 | 爆菊花综合网| 激情综合久久| 日比视频| 97干网| 欧美亚洲性爱| 日韩免费A| 国产欧美综合一区| 91人妻人人爽人人澡人人爽| 国产91视频| 无码五区| 国产精品无码怀孕软件| 91官网在线观看| 国产精品18禁| 欧美老女人操逼群| 综合久久中文字幕| 日韩三级毛片| 免费日韩黄色电影| sesese999| 十八禁福利网站| 一级全黄120分钟免费| 亚洲丁香五月激情| 一区二区三区四区精品视频| 毛片一区| 欧美成人中文字幕在线| 色婷婷无码| 日韩无码高清免费| 亚洲av中文| 国产真人无码| 影音先锋日韩资源| 久艹在线视频| 成人在线小视频| 日韩视频免费在线| 黄片免费视频在线观看| 黄色a片在线观看| 无码免费一区| 无码婬片A片AAA毛片艳谭| 国产中文视频| 夜夜嗨av无码一区二区三区| 强伦轩人妻一区二区三区四区| 爱精品视频| 国产超碰| 俺来也俺去啦欧美www| 精品一区二区三区视频| 92午夜福利天堂视频2019| 色乱视频| 无码av无码AV| 大香蕉在线视频观看| 人人香蕉| 亚洲无码在线观看视频| 亚洲精品秘一区二区三区在线观看 | 豆花视频在线| 日韩无码黄| 婷婷天堂站| 天堂色播| 蝌蚪窝在线观看| 波多野吉衣中文字幕| 99热香蕉| av天堂电影网| 日本爱爱视频免费| 无码A级| 操骚屄视频| 亚洲乱论| 午夜性爱网站| 老骚老B老太太A片| 91性爱视频在线观看| 露脸丨91丨九色露脸| 特级444www| 日本精品视频在线观看| 成人综合娱乐网| 99热网站| 欧美成人网站免费在线观看| 国产乱伦免费| 蜜桃视频无码区在线观看| 黄色片视频网站| 欧美性天天| 熟女中文字幕| 亚洲国产成人在线视频| 黄色视频免费在线观看| 国产精品国产三级国产专区53| 另类AV| 国产又猛又黄又爽| 亚洲精品视频在线观看网站 | 日韩经典视频在线播放| 色婷婷中文| 美妇肥臀一区二区三区-久久99精品国| 中文在线观看免费视频| 成人小说视频在线社区| 国产做受91一片二片老头| 国产乱码在线| 久操成人| 国产尤物在线| 大香蕉伊| 男人天堂网av| 97人妻精品一区二区三区| 婷婷开心五月天| 欧美激情爱爱| 3D精品啪啪一区二区三区| 国产精品国产精品国产专区不片 | 韩国av在线| 亚洲一区二区三区在线视频| 五月丁香六月情| 色综合天天综合网国产成人网| 亚洲中文免费| 臭小子啊轻点灬太粗太长了的视频 | 激情毛片| 国产一区二区三区在线观看免费视频免费视频免费视频 | 青草伊人av| 色婷婷在线无码精品秘人口传媒| 亚洲天堂2016| 成人免费无遮挡无码黄漫视频| 国产亲子乱XXXXimim/| 强波多野结衣黑人| 无码一区二| 国产中文字幕在线免费观看| 丁香五月网| 精品无码一区二区三区的天堂| 欧美性爱免费在线视频| 国内自拍视频在线观看| 二区三区免费| 91av天堂| 国产乱国产乱300精品| 中文观看| 伊人婷婷色香综合| 欧美一级A片免费看| 国产SM视频| 麻豆精品视频| 久久久久亚洲AV无码麻豆| 四虎影院最新地址| 亚洲天堂久久| 亚洲AV性爱| 亚洲精品另类| 国产无码激情| 久久成人福利| 日韩精品一区二区三区四区| 妻子互换被高潮了三次| 撸一撸av| 国产婷婷久久Av免费高清| 黄页网址在线观看| 一起操在线视频| 亚洲AV无码国产精品| 丁香五月六月婷婷| 99r6热只有精品免费观看| 欧美狠狠| 中文字幕15页| 好看的中文字幕av| 大香蕉福利视频| 91无码人妻一区二区| 亚洲插逼视频| 久久久噜噜噜久久中文字幕色伊伊 | 无码毛片在线观看| 麻豆福利在线| 手机AV网站| 大香蕉尹在线| 五月丁香六月激情综合| 久久中文字幕免费| 成人乱无码AV在线观看| 777三级| 亚洲vs无码蜜桃少妇| 大香蕉久久草| 91AV无码| 97超碰人人摸| 青草碰| 国产欧美日本| 三级黄色视频在线观看| 99久久国产视频| 日韩三级片网站| 婷婷丁香五月社区亚洲| 中国美女一级黄片| 永久免费看片视频5355| 最新无码视频| 无码伦理| 五月黄片| 人人干人人摸| 国产欧美一区二区三区四区| 又黄又湿的视频| 精品交换一区二区三区无码| 青草福利| 色婷婷综合激情| 亚洲少妇人妻| 三级黄片免费看| 成人网站在线免费| 国产情侣在线视频| 黄色小说视频| 黄色免费高清视频| 国产激情视频在线观看| 特级西西444WWW视频| 久久看片| 欧美一级电影| 大香蕉国产精品| 亚洲无码AV在线播放| 天堂aaa| 欧美成人福利视频| 天天日天天干天天射| 日韩高清一级| 欧美性爱导航| 国产熟女自拍| 国产一级a毛一级a做免费的视频l| 在线观看者亚洲| 91超碰久久在线| 精品国产AV无码一区二区三区 | 婷婷综合在线| 成人看片黄a免费看视频| 欧美生活片18| 色五月天导航| 久久精品| 成人在线精品| 玖玖资源网站| 在线观看无码高清视频| 日韩精品成人AV| 中文字幕在线视频观看| 大伊人久久| 亚州在线中文字幕经典a| 三级成人AV| 撸撸操在线视频观看只有精品| 亚洲A视频| 国产精品久久久久久久久久久久久 | 欧美性爱自拍| 国产综合av| 影音先锋乱伦| 视频一二三区| 亚洲黄色无码视频| 天天爽日日澡AAAA片| 四虎精品成人无码A片| 丰满人妻一区二区三区四区54| 人妻黄色| 亚洲有码人妻| 久久久亚洲无码| 欧美一级网| 国产精品二| 国产aaaaaaaaaa| 在线免费观看国产视频| 日本处女性高潮喷水视频| www.插插插| 一区二区三区电影| 精品视频网| 超碰97人妻| 天堂网免费视频| 亚洲中文视频| 九九国产视频| 狠狠操狠狠撸| AV网站免费在线观看| 欧美日韩国产免费观看成人片| 欧美日韩亚洲一区二区三区| 撸撸视频| 日韩超碰| 欧美性猛交XXXX乱大交3| 骚熟妇| 中文字幕超清在线观看| 欧美色图色就是色| 免费V片在线观看| 超碰人人在线| 激情网站在线观看| 黄色视频网站在线免费观看| 成人网站欧美| 国产老女人农村HD| 色色在线观看| 日韩人妻午夜| 国产中文| 男人天堂网在线| 成人三级片免费| 在线18禁| 安徽妇搡BBBB搡BBBB按摩| 高清无码在线免费视频| 91在线无码精品秘软件| 人人看人人搞人人摸| 天堂资源| 成人免费版欧美州| 色综合一区| 五月婷婷六月色| 国产午夜成人免费看片无遮挡| 综合伊人大香蕉| 久热网站| 欧美成人精品A片免费一区99| AAAA毛片视频| 亚洲无码偷拍| 97超碰在线免费观看| 九色PORNY9l原创自拍| 国产秘精品一区二区三区免费| 欧美色逼逼| 韩国无码视频在线观看| 成人黄网站在线观看| 亚洲AV无码一区毛片AV| 招土一级黄色片| av中文在线观看| 人人干人人干人人| 在线观看成年人视频| 中文子幕免费毛片| 欧美极品另类| 超碰在线人妻| 久草高清视频| 高清免费在线中文Av| 能看的黄色视频| 久久伊人中文字幕| 一本道不卡色色| 婷婷五月天激情网| 超碰免费在线观看| 亚洲午夜视频在线观看| 91亚洲国产成人精品一区| 成人毛片在线播放| 水蜜桃视频免费| 国产综合一区二区| 欧美熟女在线| 国产AⅤ无码一区二区| 69福利社| aaa精品| 亚洲五月激情| 开心五月婷| 国产精品久久久久久久久A| 欧美色成人免费在线视频| 国产免费无码| 日本www色| 久久国产av| www.18禁| 日韩欧美A片| 牛牛影视av| 日本性爱无码| 欧美综合精品| 青娱乐伊人| 成人国产在线无码AV免费| 亚洲视频在线免费看| 久久精品秘一区二区三免费| 九九热这里有精品| 亚洲91成人| 丁香五月在线播放| 豆花视频无码| 成人国产三级| 青青草Av| 中文字幕日韩欧美在线| 樱桃码一区二区三区| 亚洲一级免费在线观看| 天天玩夜夜玩天天玩国产99| xxx国产精品| 欧洲天堂在线视频网站| av大香蕉| avav无码| 久久久精品黄色网址| 天天干夜夜操| 天天干天天日天天操| av无码在线观看| 熟妇一区| 操碰视频| 五月天丁香| 亚洲无码福利视频| 欧美丰满少妇人妻精品| 午夜成人在线| 在线天堂视频| 大香蕉久操| 特级西西WWW888| 久久天堂网| 国产电影一区二区三区| 广东BBW搡BBBB搡| 亚洲黄片免费观看| 婷婷五月天电影| 国产视频久久久| 91蜜桃视频| 无码精品视频| 国产伦精品一区二区三区妓女| 日韩欧美网站| 成人网在线视频| 国产美女裸体网站| 五月天综合网| 操逼91小视频| 最新97色黄色精品高清网站| 欧美日本成人网站入口| 婷婷丁香五月激情一区综合网| 欧美五月在线网址| 午夜福利2025| 草久精品| 大香蕉大香蕉大香蕉| 少妇456| 亚洲欧洲免费看| 亚洲成人情趣大香蕉| 亚洲中文字幕免费观看视频| 国产欧美综合在线观看| 久久久久99精品成人片直播| 91精品人妻一区二区三区四区| 国产一级a免一级a免费| 国产性色AV| 亚洲日韩三级| 欧洲第一无人区观看| 久草手机视频在线观看| 男人亚洲天堂| 可以免费看的av| 亚洲天堂免费观看| 婷婷日韩中文字幕| 东方成人AV| 精品黄片| 综合天堂网| A级视频网| 97精产国品久久蜜桃臀| 无码不卡在线播放| 亚洲成年网| 天天爽天天爽夜夜爽毛片| 国产亚洲91| 日韩性爱小视频| 99久久国| www.狠狠| 黑人一级片| 亚洲中字幕新| 成人免看一级a一片| 444444在线观看免费高清电视剧木瓜一| 天堂网影音先锋| 免费在线观看内射| 国语操逼| www.插插| 色秘乱码一区二区三区唱戏| 尤物免费视频| 日韩电影无码| 国产精品资源| 亚洲精品mv| 天堂无吗| 2020无码| 国产亚洲精品久久久久久桃色| 日韩在线成人视频| 亚洲av无码乱码| 人人看人人草| 日韩人妻无码中文字幕| 九九热精品视频在线播放| 欧美一区二区无码视频| 内射午夜福利在线免费观看视频| 免费成人在线网站| 翔田千里av在线| WWW.99热| 精东影业AV无码精品| 国产色五月| 欧美综合国产| 大香蕉AV在线| 五月激情黄色| 草比网站| 伊人婷婷大香蕉| 亚洲无码1区| 免费黄色视频观看| 日韩视频一区二区三区| 黑人AV| 白丝自慰网站| 欧美一级高清片免费一级a| 亚洲免费视频一区| 色综合中文字幕| 四川BBB搡BBB搡多人乱| 国精品91无码一区二区三区在线 | 91视频福利| 中文字幕人妻在线中文乱码怎么解决| 欧美日韩精品在线视频| 激情丁香五月天| 欧美黄色A片| 午夜黄色操逼视频| 特级黄色A片| 宅男噜噜噜66一区二区| 国产精品国三级国产a11| HEZ-502搭讪绝品人妻系列 | 五月婷婷深深爱| 国产操| 欧美亚洲综合在线观看| 2026AV天堂网| 亚洲三级片无码| 少妇熟女一区| 国产第四页| 中文字幕淫乱视频欧美| 国产一区二区三区四区五区六区七区| 国产91久久婷婷一区二区| 欧美内射网站| 国产V片| 国产中文| 日本午夜影院| 人妻精品免费| 青青国产在线| 精品国产91| 东京热综合影院| 日韩AV无码高清| 影音先锋亚洲AV| 无码a片| 91色欲| 香蕉视频免费| 自慰一区二区| 自拍偷拍网址| 青青无码| 四川少妇BBw搡BBBB槡BBBB| va色婷婷亚洲在线| 国产探花一区二区三区| 日本精品黄色视频| 精品国产AⅤ麻豆| 亚洲人妻av| 欧美一级黄片免费看| 亚洲一级a| 日韩毛片在线播放| 成人精品免费视频| 中文字幕高清在线中文字幕中文字幕 | 懂色AV一区二区三区国产中文在线| 日韩性爱视频在线观看| 亚洲无码三级| 91香蕉国产在线观看| 国产淫荡视频| 欧美日韩国产精品成人| 久久思思热| 在线观看毛片网站| 骚逼www| 五月天婷婷丁香综合视频| www.青青草| 一级做a爰片毛片A片| 男女一区二区三区| 成人片免费| 日皮视频免费观看| 91精品婷婷国产| 国产系列精品AV| 欧美口爆视频| 一区二区三区在线观看免费| 午夜福利剧场| 日韩国产在线观看| 亚洲高清视屏| 水蜜桃成人网| 国产一级婬片A片免费无成人黑豆| 91新视频| 无码专区在线观看| 欧美大片视频| 国产成人电影一区二区| 97国产精品久久| 2019天天干| 久久精品欧美| 狠狠色噜噜狠狠狠7777米奇网| 国产一级a毛一级a毛观看视频网站www.jn| 影音先锋av资源网站| 欧美老女人操逼| 欧美日韩在线看| 中文字幕一二三四| 天天爽天天爽夜夜爽毛片| 亚洲精品无码久久久| 成人毛片网| 日韩一区二区三区四区久久久精品有吗| 免费无码一级A片大黄在线观看| 五月丁香婷婷色| 欧美一级黄色片| 免费一级A| 国产豆花视频| 国产成人99久久亚洲综合精品| 91丨九色丨熟女老版| www.91熊猫成人网| 久久噜噜噜精品国产亚洲综合| 国产三级电影| 久久视频这里有精品| 免费的av网站| 国产三级片网址| 手机在线看片av| 亚洲AV无码成人专区| 91精品丝袜久久久久久久久久粉嫩| 日本一区二区三| 超碰在线人妻| 亚洲精品第一页| 91人妻无码精品一区二区| 91亚洲精品久久久久蜜桃| 在线无.码| 91香蕉网| 黄片视频网站| 麻豆91久久久| 亚洲AV成人无码精品区| 欧美一级婬片免费视频华泰老添妇| 黄色在线欣赏| 91妻人人澡人人爽人人精品| 最新av| 伊人黄片| 丁香一区二区| 欧美日逼网站| 蜜挑视频一区二区三区| 91av一区二区三区| 国产成人va| 久久性爱视频| 国产A毛片| 狠狠色色| 看操逼视频| 青青久久91| 久久精品夜色噜噜亚洲A∨| 69视频在线观看| 躁BBB躁BBB躁BBBBBB日视频 | av一区二区三区四区| 天天干天天干| 中文字幕日韩AV| 91人人妻人人澡人人爽人人| 亚洲女与黑人正在播放| 韩日av| 国产又爽又黄免费视频免费 | 91社区成人影院| 久久黑人| 99热综合| 成人毛片一区二区三区| 亚洲成人免费观看| 欧美日皮视频| 亚洲综合片| 日韩操B视频| avav无码| 91精品久久久久久久久久久久| 超碰啪啪| 亚洲精品色色| 香蕉视频毛片|