日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【YOLOV5-6.x讲解】模型搭建模块 models/yolo.py

發(fā)布時間:2024/1/18 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【YOLOV5-6.x讲解】模型搭建模块 models/yolo.py 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

??主干目錄:

【YOLOV5-6.x 版本講解】整體項目代碼注釋導航現(xiàn)在YOLOV5已經(jīng)更新到6.X版本,現(xiàn)在網(wǎng)上很多還停留在5.X的源碼注釋上,因此特開一貼傳承開源精神!5.X版本的可以看其他大佬的帖子本文章主要從6.X版本出發(fā),主要解決6.X版本的項目注釋與代碼分析!......https://blog.csdn.net/qq_39237205/article/details/125729662

以下內(nèi)容為本欄目的一部分,更多關注以上鏈接目錄,查找YOLOV5的更多信息

祝福你朋友早日發(fā)表sci!


# YOLOv5 🚀 by Ultralytics, GPL-3.0 license# https://blog.csdn.net/qq_39237205/category_11911202.html""" YOLO-specific modules這個模塊是yolov5的模型搭建模塊,非常的重要,不過代碼量并不大,不是很難,只是yolov5的作者把封裝的太好了,模型擴展了很多的額外的功能,導致看起來很難,其實真正有用的代碼不多的。重點是抓住三個函數(shù)是在哪里調(diào)用的,誰調(diào)用誰的。Usage:$ python path/to/models/yolo.py --cfg yolov5s.yaml """import argparse # 解析命令行參數(shù)模塊 import sys # sys系統(tǒng)模塊 包含了與Python解釋器和它的環(huán)境有關的函數(shù) from copy import deepcopy # 數(shù)據(jù)拷貝模塊 深拷貝 from pathlib import Path # Path將str轉(zhuǎn)換為Path對象 使字符串路徑易于操作的模塊FILE = Path(__file__).resolve() ROOT = FILE.parents[1] # YOLOv5 root directory if str(ROOT) not in sys.path:sys.path.append(str(ROOT)) # add ROOT to PATH # ROOT = ROOT.relative_to(Path.cwd()) # relativefrom models.common import * from models.experimental import * from utils.autoanchor import check_anchor_order from utils.general import LOGGER, check_version, check_yaml, make_divisible, print_args from utils.plots import feature_visualization from utils.torch_utils import fuse_conv_and_bn, initialize_weights, model_info, scale_img, select_device, time_sync# 導入thop包 用于計算FLOPs try:import thop # for FLOPs computation except ImportError:thop = Noneclass Detect(nn.Module):"""Detect模塊是用來構建Detect層的,將輸入feature map 通過一個卷積操作和公式計算到我們想要的shape, 為后面的計算損失或者NMS作準備"""stride = None # strides computed during buildonnx_dynamic = False # ONNX export parameter 再export中這個參數(shù)會重新設為Truedef __init__(self, nc=80, anchors=(), ch=(), inplace=True): # detection layersuper().__init__()"""detection layer 相當于yolov3中的YOLOLayer層:params nc: number of classes:params anchors: 傳入3個feature map上的所有anchor的大小(P3、P4、P5):params ch: [128, 256, 512] 3個輸出feature map的channel"""self.nc = nc # number of classes,若是VOC,則類別為20self.no = nc + 5 # number of outputs per anchor。 若是VOC: 5+20=25 該數(shù)為:xywhc+classesself.nl = len(anchors) # number of detection layers Detect的個數(shù) 3self.na = len(anchors[0]) // 2 # number of anchors 每個feature map的anchor個數(shù) 3self.grid = [torch.zeros(1)] * self.nl # init grid {list: 3} tensor([0.]) X 3self.anchor_grid = [torch.zeros(1)] * self.nl # init anchor grid# a=[3, 3, 2] anchors以[w, h]對的形式存儲 3個feature map 每個feature map上有三個anchor(w,h)# a = torch.tensor(anchors).float().view(self.nl, -1, 2)# register_buffer# 模型中需要保存的參數(shù)一般有兩種:# 一種是反向傳播需要被optimizer更新的,即參與訓練的參數(shù)稱為parameter,optim.step只能更新nn.parameter類型的參數(shù)# 另一種不要被更新,即不參與訓練的參數(shù)稱為buffer,buffer的參數(shù)更新是在forward中。# shape(nl,na,2)# self.register_buffer('anchors', a)self.register_buffer('anchors', torch.tensor(anchors).float().view(self.nl, -1, 2)) # shape(nl,na,2)# output conv 對每個輸出的feature map都要調(diào)用一次conv1x1self.m = nn.ModuleList(nn.Conv2d(x, self.no * self.na, 1) for x in ch) # output conv# use in-place ops (e.g. slice assignment) 一般都是True 默認不使用AWS Inferentia加速self.inplace = inplace # use in-place ops (e.g. slice assignment)def forward(self, x): # x:[[],[],[]]分別對應1/8 1/16 1/32 三個維度大小的寬高輸入# forward函數(shù)在Model類的forward_once中調(diào)用""":returntrain: 一個tensor list 存放三個元素 [bs, anchor_num, grid_w, grid_h, xywh+c+20classes]分別是 [1, 3, 80, 80, 25] [1, 3, 40, 40, 25] [1, 3, 20, 20, 25]inference: 0 [1, 19200+4800+1200, 25] = [bs, anchor_num*grid_w*grid_h, xywh+c+20classes]1 一個tensor list 存放三個元素 [bs, anchor_num, grid_w, grid_h, xywh+c+20classes][1, 3, 80, 80, 25] [1, 3, 40, 40, 25] [1, 3, 20, 20, 25]"""z = [] # inference outputfor i in range(self.nl): # 對三個feature map分別進行處理,遍歷一共多少層x[i] = self.m[i](x[i]) # conv xi[bs, 128/256/512, 80, 80] to [bs, 75, 80, 80]bs, _, ny, nx = x[i].shape # x(bs,255,20,20) to x(bs,3,20,20,85)x[i] = x[i].view(bs, self.na, self.no, ny, nx).permute(0, 1, 3, 4, 2).contiguous()# inference,預測部分if not self.training: # inference# 構造網(wǎng)格# 因為推理返回的不是歸一化后的網(wǎng)格偏移量 需要再加上網(wǎng)格的位置 得到最終的推理坐標 再送入nms# 所以這里構建網(wǎng)格就是為了記錄每個grid的網(wǎng)格坐標 方面后面使用if self.onnx_dynamic or self.grid[i].shape[2:4] != x[i].shape[2:4]: # 第一次運行時候,會實例化這兩個屬性self.grid[i], self.anchor_grid[i] = self._make_grid(nx, ny, i) # 拿到左上角的坐標y = x[i].sigmoid() # 將每一層的特征歸一化到0到1之間if self.inplace:# 默認執(zhí)行 不使用AWS Inferentia# 這里的公式和yolov3、v4中使用的不一樣 是yolov5作者自己用的效果更好,邊框預測公式,ppt有# 計算中心點坐標,將0到1之間處理到原圖大小的區(qū)間y[..., 0:2] = (y[..., 0:2] * 2 - 0.5 + self.grid[i]) * self.stride[i] # xy # xy||||| × self.stride[i]是為了放大到原圖# 計算寬高,將0到1之間處理到原圖大小的區(qū)間y[..., 2:4] = (y[..., 2:4] * 2) ** 2 * self.anchor_grid[i] # whelse: # for YOLOv5 on AWS Inferentia https://github.com/ultralytics/yolov5/pull/2953xy = (y[..., 0:2] * 2 - 0.5 + self.grid[i]) * self.stride[i] # xywh = (y[..., 2:4] * 2) ** 2 * self.anchor_grid[i] # why = torch.cat((xy, wh, y[..., 4:]), -1)# z是一個tensor list 三個元素 分別是[1, 19200, 25] [1, 4800, 25] [1, 1200, 25]z.append(y.view(bs, -1, self.no))return x if self.training else (torch.cat(z, 1), x)def _make_grid(self, nx=20, ny=20, i=0):"""構造網(wǎng)格"""d = self.anchors[i].deviceif check_version(torch.__version__, '1.10.0'): # torch>=1.10.0 meshgrid workaround for torch>=0.7 compatibilityyv, xv = torch.meshgrid([torch.arange(ny, device=d), torch.arange(nx, device=d)], indexing='ij')else:yv, xv = torch.meshgrid([torch.arange(ny, device=d), torch.arange(nx, device=d)])grid = torch.stack((xv, yv), 2).expand((1, self.na, ny, nx, 2)).float()anchor_grid = (self.anchors[i].clone() * self.stride[i]) \.view((1, self.na, 1, 1, 2)).expand((1, self.na, ny, nx, 2)).float()return grid, anchor_gridclass Model(nn.Module):def __init__(self, cfg='yolov5s.yaml', ch=3, nc=None, anchors=None): # model, input channels, number of classes"""Model主要包含模型的搭建與擴展功能,yolov5的作者將這個模塊的功能寫的很全,擴展功能如:特征可視化,打印模型信息、TTA推理增強、融合Conv+Bn加速推理、模型搭載nms功能、autoshape函數(shù):模型搭建包含前處理、推理、后處理的模塊(預處理 + 推理 + nms)。感興趣的可以仔細看看,不感興趣的可以直接看__init__和__forward__兩個函數(shù)即可。:params cfg:模型配置文件:params ch: input img channels 一般是3 RGB文件:params nc: number of classes 數(shù)據(jù)集的類別個數(shù):anchors: 一般是None"""super().__init__()if isinstance(cfg, dict):self.yaml = cfg # model dictelse: # is *.yaml# is *.yaml 一般執(zhí)行這里import yaml # for torch hubself.yaml_file = Path(cfg).name # cfg file name = yolov5s.yaml# 如果配置文件中有中文,打開時要加encoding參數(shù)with open(cfg, encoding='ascii', errors='ignore') as f:# model dict 取到配置文件中每條的信息(沒有注釋內(nèi)容)self.yaml = yaml.safe_load(f) # model dict# Define modelch = self.yaml['ch'] = self.yaml.get('ch', ch) # input channels# 設置類別數(shù) 一般不執(zhí)行, 因為nc=self.yaml['nc']恒成立if nc and nc != self.yaml['nc']:LOGGER.info(f"Overriding model.yaml nc={self.yaml['nc']} with nc={nc}")self.yaml['nc'] = nc # override yaml value# 重寫anchor,一般不執(zhí)行, 因為傳進來的anchors一般都是Noneif anchors:LOGGER.info(f'Overriding model.yaml anchors with anchors={anchors}')self.yaml['anchors'] = round(anchors) # override yaml value# 創(chuàng)建網(wǎng)絡模型# self.model: 初始化的整個網(wǎng)絡模型(包括Detect層結構)# self.save: 所有層結構中from不等于-1的序號,并排好序 [4, 6, 10, 14, 17, 20, 23]self.model, self.save = parse_model(deepcopy(self.yaml), ch=[ch]) # model, savelist# default class names ['0', '1', '2',..., '19']self.names = [str(i) for i in range(self.yaml['nc'])] # default names# self.inplace=True 默認True 不使用加速推理# AWS Inferentia Inplace compatiability# https://github.com/ultralytics/yolov5/pull/2953self.inplace = self.yaml.get('inplace', True)# 獲取Detect模塊的stride(相對輸入圖像的下采樣率)和anchors在當前Detect輸出的feature map的尺度# Build strides, anchorsm = self.model[-1] # Detect()if isinstance(m, Detect):s = 256 # 2x min stridem.inplace = self.inplace# 計算三個feature map下采樣的倍率 [8, 16, 32]# 假設640X640的圖片大小,在最后三層時分別乘1/8 1/16 1/32,得到80,40,20m.stride = torch.tensor([s / x.shape[-2] for x in self.forward(torch.zeros(1, ch, s, s))]) # 前向傳播的處理,為了得到最后輸出的stride的大小 # forward# 將當前圖片的大小處理成相對當前feature map的anchor大小 如[10, 13]/8 -> [1.25, 1.625]m.anchors /= m.stride.view(-1, 1, 1)# 檢查anchor順序與stride順序是否一致check_anchor_order(m)self.stride = m.strideself._initialize_biases() # only run once # only run once 初始化偏置# logger.info('Strides: %s' % m.stride.tolist())# Init weights, biasesinitialize_weights(self) # 調(diào)用torch_utils.py下initialize_weights初始化模型權重self.info() # 打印模型信息LOGGER.info('')def forward(self, x, augment=False, profile=False, visualize=False):# augmented inference, None 上下flip/左右flip# 是否在測試時也使用數(shù)據(jù)增強 Test Time Augmentation(TTA)if augment:return self._forward_augment(x) # augmented inference, None# 默認執(zhí)行 正常前向推理# single-scale inference, trainreturn self._forward_once(x, profile, visualize) # single-scale inference, traindef _forward_augment(self, x):img_size = x.shape[-2:] # height, widths = [1, 0.83, 0.67] # scalesf = [None, 3, None] # flips (2-ud, 3-lr)y = [] # outputsfor si, fi in zip(s, f):# scale_img縮放圖片尺寸xi = scale_img(x.flip(fi) if fi else x, si, gs=int(self.stride.max()))yi = self._forward_once(xi)[0] # forward# cv2.imwrite(f'img_{si}.jpg', 255 * xi[0].cpu().numpy().transpose((1, 2, 0))[:, :, ::-1]) # save# _descale_pred將推理結果恢復到相對原圖圖片尺寸yi = self._descale_pred(yi, fi, si, img_size)y.append(yi)y = self._clip_augmented(y) # clip augmented tailsreturn torch.cat(y, 1), None # augmented inference, traindef _forward_once(self, x, profile=False, visualize=False):""":params x: 輸入圖像:params profile: True 可以做一些性能評估:params feature_vis: True 可以做一些特征可視化:return train: 一個tensor list 存放三個元素 [bs, anchor_num, grid_w, grid_h, xywh+c+20classes]分別是 [1, 3, 80, 80, 25] [1, 3, 40, 40, 25] [1, 3, 20, 20, 25]inference: 0 [1, 19200+4800+1200, 25] = [bs, anchor_num*grid_w*grid_h, xywh+c+20classes]1 一個tensor list 存放三個元素 [bs, anchor_num, grid_w, grid_h, xywh+c+20classes][1, 3, 80, 80, 25] [1, 3, 40, 40, 25] [1, 3, 20, 20, 25]"""# y: 存放著self.save=True的每一層的輸出,因為后面的層結構concat等操作要用到# dt: 在profile中做性能評估時使用y, dt = [], [] # outputsfor m in self.model:# 前向推理每一層結構 m.i=index m.f=from m.type=類名 m.np=number of params# if not from previous layer m.f=當前層的輸入來自哪一層的輸出 s的m.f都是-1if m.f != -1: # if not from previous layer# 這里需要做4個concat操作和1個Detect操作# concat操作如m.f=[-1,6] x就有兩個元素,一個是上一層的輸出,另一個是index=6的層的輸出 再送到x=m(x)做concat操作# Detect操作m.f=[17, 20, 23] x有三個元素,分別存放第17層第20層第23層的輸出 再送到x=m(x)做Detect的forwardx = y[m.f] if isinstance(m.f, int) else [x if j == -1 else y[j] for j in m.f] # from earlier layers# 打印日志信息 FLOPs time等# 打印日志信息 前向推理時間if profile:self._profile_one_layer(m, x, dt)x = m(x) # run正向推理 執(zhí)行每一層的forward函數(shù)(除Concat和Detect操作)# print('層數(shù)',i,'特征圖大小',x.shape)# 存放著self.save的每一層的輸出,因為后面需要用來作concat等操作要用到 不在self.save層的輸出就為Noney.append(x if m.i in self.save else None) # save output# 特征可視化 可以自己改動想要哪層的特征進行可視化if visualize:feature_visualization(x, m.type, m.i, save_dir=visualize)return xdef _descale_pred(self, p, flips, scale, img_size):"""用在上面的__init__函數(shù)上將推理結果恢復到原圖圖片尺寸 Test Time Augmentation(TTA)中用到de-scale predictions following augmented inference (inverse operation):params p: 推理結果:params flips::params scale::params img_size:"""# 不同的方式前向推理使用公式不同 具體可看Detect函數(shù)# de-scale predictions following augmented inference (inverse operation)if self.inplace: # 默認執(zhí)行 不使用AWS Inferentiap[..., :4] /= scale # de-scaleif flips == 2:p[..., 1] = img_size[0] - p[..., 1] # de-flip udelif flips == 3:p[..., 0] = img_size[1] - p[..., 0] # de-flip lrelse:x, y, wh = p[..., 0:1] / scale, p[..., 1:2] / scale, p[..., 2:4] / scale # de-scaleif flips == 2:y = img_size[0] - y # de-flip udelif flips == 3:x = img_size[1] - x # de-flip lrp = torch.cat((x, y, wh, p[..., 4:]), -1)return pdef _clip_augmented(self, y):# Clip YOLOv5 augmented inference tailsnl = self.model[-1].nl # number of detection layers (P3-P5)g = sum(4 ** x for x in range(nl)) # grid pointse = 1 # exclude layer counti = (y[0].shape[1] // g) * sum(4 ** x for x in range(e)) # indicesy[0] = y[0][:, :-i] # largei = (y[-1].shape[1] // g) * sum(4 ** (nl - 1 - x) for x in range(e)) # indicesy[-1] = y[-1][:, i:] # smallreturn ydef _profile_one_layer(self, m, x, dt):c = isinstance(m, Detect) # is final layer, copy input as inplace fixo = thop.profile(m, inputs=(x.copy() if c else x,), verbose=False)[0] / 1E9 * 2 if thop else 0 # FLOPst = time_sync()for _ in range(10):m(x.copy() if c else x)dt.append((time_sync() - t) * 100)if m == self.model[0]:LOGGER.info(f"{'time (ms)':>10s} {'GFLOPs':>10s} {'params':>10s} {'module'}")LOGGER.info(f'{dt[-1]:10.2f} {o:10.2f} {m.np:10.0f} {m.type}')if c:LOGGER.info(f"{sum(dt):10.2f} {'-':>10s} {'-':>10s} Total")def _initialize_biases(self, cf=None): # initialize biases into Detect(), cf is class frequency"""用在上面的__init__函數(shù)上initialize biases into Detect(), cf is class frequencyhttps://arxiv.org/abs/1708.02002 section 3.3"""# cf = torch.bincount(torch.tensor(np.concatenate(dataset.labels, 0)[:, 0]).long(), minlength=nc) + 1.m = self.model[-1] # Detect() modulefor mi, s in zip(m.m, m.stride): # fromb = mi.bias.view(m.na, -1) # conv.bias(255) to (3,85)b.data[:, 4] += math.log(8 / (640 / s) ** 2) # obj (8 objects per 640 image)b.data[:, 5:] += math.log(0.6 / (m.nc - 0.999999)) if cf is None else torch.log(cf / cf.sum()) # clsmi.bias = torch.nn.Parameter(b.view(-1), requires_grad=True)def _print_biases(self):"""打印模型中最后Detect層的偏置bias信息(也可以任選哪些層bias信息)"""m = self.model[-1] # Detect() modulefor mi in m.m: # fromb = mi.bias.detach().view(m.na, -1).T # conv.bias(255) to (3,85)LOGGER.info(('%6g Conv2d.bias:' + '%10.3g' * 6) % (mi.weight.shape[1], *b[:5].mean(1).tolist(), b[5:].mean()))# def _print_weights(self):# for m in self.model.modules():# if type(m) is Bottleneck:# LOGGER.info('%10.3g' % (m.w.detach().sigmoid() * 2)) # shortcut weightsdef fuse(self): # fuse model Conv2d() + BatchNorm2d() layers"""用在detect.py、val.pyfuse model Conv2d() + BatchNorm2d() layers調(diào)用torch_utils.py中的fuse_conv_and_bn函數(shù)和common.py中Conv模塊的fuseforward函數(shù)"""LOGGER.info('Fusing layers... ') # 日志# 遍歷每一層結構for m in self.model.modules():# 如果當前層是卷積層Conv且有bn結構, 那么就調(diào)用fuse_conv_and_bn函數(shù)講conv和bn進行融合, 加速推理if isinstance(m, (Conv, DWConv)) and hasattr(m, 'bn'):m.conv = fuse_conv_and_bn(m.conv, m.bn) # 融合 update convdelattr(m, 'bn') # 移除bn remove batchnormm.forward = m.forward_fuse # 更新前向傳播 update forward (反向傳播不用管, 因為這種推理只用在推理階段)self.info() # 打印conv+bn融合后的模型信息return selfdef info(self, verbose=False, img_size=640): # print model information"""用在上面的__init__函數(shù)上調(diào)用torch_utils.py下model_info函數(shù)打印模型信息"""model_info(self, verbose, img_size)def _apply(self, fn):# Apply to(), cpu(), cuda(), half() to model tensors that are not parameters or registered buffersself = super()._apply(fn)m = self.model[-1] # Detect()if isinstance(m, Detect):m.stride = fn(m.stride)m.grid = list(map(fn, m.grid))if isinstance(m.anchor_grid, list):m.anchor_grid = list(map(fn, m.anchor_grid))return selfdef parse_model(d, ch): # model_dict, input_channels(3)"""主要功能:parse_model模塊用來解析模型文件(從Model中傳來的字典形式),并搭建網(wǎng)絡結構。在上面Model模塊的__init__函數(shù)中調(diào)用這個函數(shù)其實主要做的就是: 更新當前層的args(參數(shù)),計算c2(當前層的輸出channel) =>使用當前層的參數(shù)搭建當前層 =>生成 layers + save:params d: model_dict 模型文件 字典形式 {dict:7} yolov5s.yaml中的6個元素 + ch:params ch: 記錄模型每一層的輸出channel 初始ch=[3] 后面會刪除:return nn.Sequential(*layers): 網(wǎng)絡的每一層的層結構:return sorted(save): 把所有層結構中from不是-1的值記下 并排序 [4, 6, 10, 14, 17, 20, 23]"""LOGGER.info(f"\n{'':>3}{'from':>18}{'n':>3}{'params':>10} {'module':<40}{'arguments':<30}")# 讀取d字典中的anchors和parameters(nc、depth_multiple、width_multiple)# nc(number of classes)數(shù)據(jù)集類別個數(shù);# depth_multiple,通過深度參數(shù)depth gain在搭建每一層的時候,實際深度 = 理論深度(每一層的參數(shù)n) * depth_multiple,起到一個動態(tài)調(diào)整模型深度的作用。# width_multiple,在模型中間層的每一層的實際輸出channel = 理論channel(每一層的參數(shù)c2) * width_multiple,起到一個動態(tài)調(diào)整模型寬度的作用。anchors, nc, gd, gw = d['anchors'], d['nc'], d['depth_multiple'], d['width_multiple']# na: number of anchors 每一個predict head上的anchor數(shù) = 3na = (len(anchors[0]) // 2) if isinstance(anchors, list) else anchors # number of anchors# no: number of outputs 每一個predict head層的輸出channel = anchors * (classes + 5) = 75(VOC)no = na * (nc + 5) #總共預測的anchors個數(shù) number of outputs = anchors * (classes + 5)# 開始搭建網(wǎng)絡# layers: 保存每一層的層結構# save: 記錄下所有層結構中from中不是-1的層結構序號# c2: 保存當前層的輸出channellayers, save, c2 = [], [], ch[-1] # layers, savelist, ch out# from(當前層輸入來自哪些層), number(當前層次數(shù) 初定), module(當前層類別), args(當前層類參數(shù) 初定)for i, (f, n, m, args) in enumerate(d['backbone'] + d['head']): # 遍歷backbone和head的每一層 # from, number, module, args# eval(string) 得到當前層的真實類名# 例如: m= Focus -> <class 'models.common.Focus'>m = eval(m) if isinstance(m, str) else m # 將字符串處理成一個類名 或者 字符串,即實現(xiàn)名字向類的轉(zhuǎn)換for j, a in enumerate(args): # 主要照顧 yolo.yaml文件中最后一列的, [nc, anchors]try:args[j] = eval(a) if isinstance(a, str) else a # eval strings,當他是一個字符串,就試圖將它處理成一個變量名except NameError:pass# ------------------- 更新當前層的args(參數(shù)),計算c2(當前層的輸出channel) -------------------# depth gain 控制深度 如v5s: n*0.33 n: 當前模塊的次數(shù)(間接控制深度)n = n_ = max(round(n * gd), 1) if n > 1 else n # depth gainif m in [Conv, GhostConv, Bottleneck, GhostBottleneck, SPP, SPPF, DWConv, MixConv2d, Focus, CrossConv,BottleneckCSP, C3, C3TR, C3SPP, C3Ghost]:# c1: 當前層的輸入的channel數(shù)# c2: 當前層的輸出的channel數(shù)(初定)# ch: 記錄著所有層的輸出channel,f代表該ch中文最后一個,即對一下一層來說,這就是-1層的輸入c1, c2 = ch[f], args[0] # args[0]為[-1, 1, Conv, [128, 3, 2]]這的128# if not output no=75 只有最后一層c2=no 最后一層不用控制寬度,輸出channel必須是noif c2 != no: # if not output# width gain 控制寬度 如v5s: c2*width_multiple(yolo.yaml)# c2: 當前層的最終輸出的channel數(shù)(間接控制寬度)c2 = make_divisible(c2 * gw, 8)# 在初始arg的基礎上更新 加入當前層的輸入channel并更新當前層# [in_channel, out_channel, *args[1:]]args = [c1, c2, *args[1:]] # [-1, 1, Conv, [128, 3, 2]] 變?yōu)?[-1, 1, Conv, [-1的值,128 × width_multiple , 3, 2]]# 如果當前層是BottleneckCSP/C3/C3TR, 則需要在args中加入bottleneck的個數(shù)# [in_channel, out_channel, Bottleneck的個數(shù)n, bool(True表示有shortcut 默認,反之無)]if m in [BottleneckCSP, C3, C3TR, C3Ghost]: # 因為這幾個類的定義中,初始化中有n=1這個參數(shù),整個過程就是在初始化卷積的參數(shù)罷了args.insert(2, n) # 在第二個位置插入bottleneck個數(shù)nn = 1 # 恢復默認值1elif m is nn.BatchNorm2d:# BN層只需要返回上一層的輸出channelargs = [ch[f]]elif m is Concat:# Concat層則將f中所有的輸出累加得到這層的輸出channelc2 = sum(ch[x] for x in f) # 因為這個[[-1, 6], 1, Concat, [1]] 的第一個是個列表,所以需要遍歷,然后將-1, 6層的輸入加起來elif m is Detect: # Detect(YOLO Layer)層# 在args中加入三個Detect層的輸出channelargs.append([ch[x] for x in f])if isinstance(args[1], int): # number of anchors 幾乎不執(zhí)行args[1] = [list(range(args[1] * 2))] * len(f)elif m is Contract:c2 = ch[f] * args[0] ** 2elif m is Expand:c2 = ch[f] // args[0] ** 2else:# Upsamplec2 = ch[f] # args不變# m_: 得到當前層module 如果n>1就創(chuàng)建多個m(當前層結構), 如果n=1就創(chuàng)建一個m# n只有在[BottleneckCSP, C3, C3TR]中才會用到m_ = nn.Sequential(*(m(*args) for _ in range(n))) if n > 1 else m(*args) # module# 打印當前層結構的一些基本信息t = str(m)[8:-2].replace('__main__.', '') # module typenp = sum(x.numel() for x in m_.parameters()) # number paramsm_.i, m_.f, m_.type, m_.np = i, f, t, np # attach index, 'from' index, type, number paramsLOGGER.info(f'{i:>3}{str(f):>18}{n_:>3}{np:10.0f} {t:<40}{str(args):<30}') # print# append to savelist 把所有層結構中from不是-1的值記下 [6, 4, 14, 10, 17, 20, 23]save.extend(x % i for x in ([f] if isinstance(f, int) else f) if x != -1) # append to savelist# 將當前層結構module加入layers中l(wèi)ayers.append(m_)if i == 0:ch = [] # 去除輸入channel [3]# 把當前層的輸出channel數(shù)加入chch.append(c2)return nn.Sequential(*layers), sorted(save) # nn.Sequential(*layers) 處理成一個模型if __name__ == '__main__':parser = argparse.ArgumentParser()parser.add_argument('--cfg', type=str, default='yolov5s.yaml', help='model.yaml')parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')parser.add_argument('--profile', action='store_true', help='profile model speed')parser.add_argument('--test', action='store_true', help='test all yolo*.yaml')opt = parser.parse_args()opt.cfg = check_yaml(opt.cfg) # check YAMLprint_args(FILE.stem, opt)device = select_device(opt.device)# Create modelmodel = Model(opt.cfg).to(device)model.train()# Profileif opt.profile:img = torch.rand(8 if torch.cuda.is_available() else 1, 3, 640, 640).to(device)y = model(img, profile=True)# Test all modelsif opt.test:for cfg in Path(ROOT / 'models').rglob('yolo*.yaml'):try:_ = Model(cfg)except Exception as e:print(f'Error in {cfg}: {e}')# Tensorboard (not working https://github.com/ultralytics/yolov5/issues/2898)# from torch.utils.tensorboard import SummaryWriter# tb_writer = SummaryWriter('.')# LOGGER.info("Run 'tensorboard --logdir=models' to view tensorboard at http://localhost:6006/")# tb_writer.add_graph(torch.jit.trace(model, img, strict=False), []) # add model graph

總結

以上是生活随笔為你收集整理的【YOLOV5-6.x讲解】模型搭建模块 models/yolo.py的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

欧美一二区视频 | 成人黄色片免费看 | 久久九精品 | 9797在线看片亚洲精品 | 国产99在线免费 | 日韩午夜精品福利 | 干干操操 | av夜夜操| 黄色日视频 | 亚洲区视频在线观看 | 国内久久精品视频 | 日本精品xxxx | 在线免费观看的av网站 | 五月婷网 | 麻豆精品在线 | 国产一区二区午夜 | 香蕉视频18 | 国产婷婷| 99久久婷婷国产一区二区三区 | 国产精品99在线观看 | 91丨九色丨国产在线观看 | 麻豆首页| 国产va在线观看免费 | 大型av综合网站 | 91一区二区在线 | 91自拍成人 | 久久视频这里有精品 | 亚洲九九九在线观看 | 成人综合婷婷国产精品久久免费 | 黄污网站在线观看 | 日韩日韩日韩日韩 | 日韩欧美国产成人 | 天堂va欧美va亚洲va老司机 | 久久久国产高清 | 欧美日本日韩aⅴ在线视频 插插插色综合 | 在线一二三四区 | 色综合婷婷久久 | 黄色毛片视频 | 免费精品视频 | 国产视频一区在线播放 | 日本激情动作片免费看 | 精品视频亚洲 | 狠狠操夜夜操 | 波多野结衣一区二区三区中文字幕 | 91在线视频 | 激情喷水 | 国内精品久久久久久久影视麻豆 | 91成人网在线观看 | 五月天狠狠操 | 国产精品毛片一区二区在线 | 亚洲天天在线 | 久久久久久久网 | 久久久久99精品成人片三人毛片 | 超碰电影在线观看 | 久久av伊人 | 久久国产精品视频观看 | 欧美日韩国产mv | 超碰免费av | 九九精品毛片 | 日韩在线观看视频网站 | 久久96国产精品久久99软件 | 9999精品视频 | 中国一级片在线 | av女优中文字幕在线观看 | 香蕉在线观看视频 | 国产999视频在线观看 | 国产精品18久久久久久不卡孕妇 | 欧美视频99| 中文字幕一区av | 久久久久成人精品免费播放动漫 | 精品国产三级a∨在线欧美 免费一级片在线观看 | 国色天香在线观看 | 免费观看视频黄 | 国产美女免费观看 | 精品福利视频在线观看 | 国产精品久久久久久久久久久免费 | 欧美日韩另类视频 | 又黄又刺激视频 | 香蕉视频久久 | 亚洲一区视频免费观看 | 天天在线免费视频 | 欧美贵妇性狂欢 | 国产成人av网 | 在线观看午夜av | av观看网站 | 麻豆传媒在线视频 | 国产黄色在线观看 | 亚洲精品影视在线观看 | 久久久久久久久久久久国产精品 | 欧美日韩国产综合一区二区 | 最新中文字幕在线资源 | 免费看黄网站在线 | 日韩在线观看高清 | 久草免费手机视频 | 五月天色网站 | 99日韩精品| 亚洲精品9 | 亚洲国产精品电影在线观看 | 久久成年视频 | 精品国产乱码久久久久久天美 | 日韩久久精品一区二区 | 国产九九九视频 | 国产免费亚洲高清 | 国产日韩视频在线播放 | 久久久久久久久久久成人 | 97超碰伊人 | 天天干天天怕 | 国产精品影音先锋 | 国产国产人免费人成免费视频 | 亚洲一区二区精品 | 久草资源免费 | 亚洲精品一区二区三区四区高清 | 日本深夜福利视频 | www91在线观看 | 国产一区二区三区免费在线观看 | 免费网站在线观看成人 | 日韩黄色一区 | 午夜精品一区二区三区在线 | 最近中文字幕免费av | 美女在线免费观看视频 | 国产一区视频在线观看免费 | 一区二区三区在线播放 | a电影在线观看 | 久99热| 99久久99 | 最新日韩电影 | 黄色h在线观看 | 亚洲精品乱码久久久久久蜜桃不爽 | 国产精品午夜免费福利视频 | 99热国产在线观看 | 九九免费在线观看 | 日日爱视频 | 99视频免费在线观看 | 亚洲成av人片在线观看香蕉 | 午夜国产在线观看 | 国产精品一区二区免费在线观看 | 成人a级大片 | 亚洲欧美精品一区 | 精品一区二区久久久久久久网站 | 午夜久久电影网 | 成人在线免费观看网站 | va视频在线观看 | 久久99精品国产91久久来源 | 久久精品欧美日韩精品 | 欧美精品免费在线 | 国产大片免费久久 | 成人av在线影视 | 91九色在线 | 色搞搞| 99热精品视| 日韩av三区| 午夜视频在线观看网站 | 中文字幕国产精品 | 日本深夜福利视频 | 中文字幕在线专区 | 午夜视频免费播放 | 一级成人网 | 免费av观看网站 | 免费在线观看av电影 | 久久亚洲综合国产精品99麻豆的功能介绍 | 国产淫片 | 精品国产免费av | 亚洲一区日韩 | 91av精品| 精品高清美女精品国产区 | 91网址在线观看 | 一区二区不卡高清 | 最新av网站在线观看 | 欧美国产日韩一区 | 国产69久久 | 日本在线观看一区二区 | 婷婷九月激情 | 成年人视频免费在线 | 一级淫片在线观看 | 国产精品手机播放 | 中文字幕在线观看完整 | 亚洲精品一区二区18漫画 | 国产精品一区一区三区 | 日韩精品你懂的 | 在线免费高清 | 久久国产精品99久久久久久老狼 | 久久电影日韩 | 中文亚洲欧美日韩 | 欧美在线视频日韩 | 久久精品之| 国产中文字幕一区二区 | 黄a网站 | 国产婷婷 | 成人免费共享视频 | 麻豆va一区二区三区久久浪 | 337p日本欧洲亚洲大胆裸体艺术 | 国产成人333kkk| 视频一区在线免费观看 | 国产最顶级的黄色片在线免费观看 | 国产一级免费av | 超碰在线官网 | 激情欧美一区二区三区免费看 | 91免费高清视频 | 97爱 | 久久福利精品 | 国产麻豆精品在线观看 | 97超碰在线视 | 6699私人影院 | 一区二区三区 中文字幕 | 在线观看免费 | 一区二区三区三区在线 | 美女视频久久久 | 人人射人人插 | 五月婷婷在线观看视频 | 色婷婷视频在线 | 操老逼免费视频 | 国产成人91 | 国产精品福利午夜在线观看 | 久草视频手机在线 | 手机看片99| 亚洲午夜精品久久久久久久久久久久 | 中文字幕免费不卡视频 | 人人插人人爱 | 色婷婷a | 天堂在线免费视频 | 在线免费成人 | 81精品国产乱码久久久久久 | 波多野结衣电影一区二区三区 | 亚洲综合小说电影qvod | 色综合天天综合网国产成人网 | 国产一级特黄毛片在线毛片 | av成年人电影 | 最新色站 | 免费在线激情视频 | 色综合久久久久 | 在线看成人片 | 免费视频色 | 9色在线视频 | 一区精品在线 | 日本韩国中文字幕 | 91精品国产欧美一区二区 | 成年人在线观看免费视频 | 欧洲亚洲激情 | 精品天堂av | 久久久久国产一区二区 | 国产 欧美 日韩 | 丁香av在线| 深爱激情五月综合 | 国产黄色美女 | 国产成人高清av | 亚洲成a人片在线观看网站口工 | 日韩精品久久久免费观看夜色 | 精品特级毛片 | 亚洲精品国产精品国自产在线 | 欧美日韩三级在线观看 | 麻豆视频免费在线观看 | 九九九九精品 | 国产人成看黄久久久久久久久 | 日韩国产精品一区 | 精品视频在线免费观看 | 91成人看片| 国产精品 999 | 欧美美女一级片 | 91成人免费电影 | 国产精品日韩欧美一区二区 | 99热999| 超碰人人91 | 婷婷丁香激情五月 | 免费看麻豆| 国产精品毛片久久久久久 | 一区二区三区观看 | 欧美 日韩 国产 中文字幕 | 国产精品九九九九九九 | 91人人澡 | 久久免费公开视频 | 久久伊人婷婷 | 亚洲美女精品视频 | 黄免费网站 | 久久九九影院 | 永久精品视频 | 毛片一级免费一级 | 在线观看精品视频 | 操操操操网| 人人添人人澡人人澡人人人爽 | 久久影院午夜论 | 又爽又黄又刺激的视频 | 久久精品艹 | 亚洲精品国产精品乱码在线观看 | 亚洲精品乱码久久久一二三 | 99精品国产福利在线观看免费 | 国产精品成人一区二区 | 日韩成人在线一区二区 | 欧美污在线观看 | 婷婷综合久久 | 国产美女视频黄a视频免费 久久综合九色欧美综合狠狠 | 久久精精品视频 | 中文在线亚洲 | 97碰碰精品嫩模在线播放 | 亚洲精品视频在线播放 | 高潮毛片无遮挡高清免费 | 成人va在线观看 | 射综合网| 永久免费的av电影 | 成+人+色综合 | 婷婷视频在线播放 | 成人午夜性影院 | 成人一区二区三区在线 | av福利网址导航大全 | 国产成人免费在线 | 一区在线电影 | 亚洲国产精品久久久久婷婷884 | 日日操日日插 | 一区二区三区 亚洲 | 国产在线超碰 | 色视频成人在线观看免 | 亚洲精品在线一区二区 | 久久这里只有精品9 | 久操综合| 免费看网站在线 | 亚洲日本精品 | 不卡电影免费在线播放一区 | 亚洲精品黄 | 久久人视频 | 91成人在线观看喷潮 | 三级午夜片 | 在线v| 人人射人人插 | 日本h视频在线观看 | 日本在线视频网址 | 青青草在久久免费久久免费 | 在线电影播放 | 一本一本久久a久久精品综合小说 | 91专区在线观看 | 一区二区精品在线观看 | 一区在线免费观看 | 国产精品免费在线 | 国精产品999国精产品岳 | 国产精品99久久久久人中文网介绍 | 久久99最新地址 | 在线亚洲人成电影网站色www | 久久精品免费观看 | 四虎成人av | 亚洲最新视频在线播放 | 黄网站色成年免费观看 | 黄色毛片网站在线观看 | 97在线精品国自产拍中文 | 久久成人高清视频 | 人人干天天射 | 亚洲综合小说电影qvod | 黄a网 | 夜夜夜精品 | 国产成人av网站 | 日韩av进入| 久久97超碰 | 午夜狠狠操| 97在线看 | 91亚洲精品久久久蜜桃网站 | 韩国精品一区二区三区六区色诱 | 久久久久女人精品毛片九一 | 日日日日日 | 中文日韩在线视频 | 国产免费一区二区三区网站免费 | 欧美黑人猛交 | 最近高清中文字幕在线国语5 | 美国三级黄色大片 | 美女国内精品自产拍在线播放 | 日韩乱色精品一区二区 | 国产精品9区 | 欧美整片sss| 国产一区欧美在线 | 亚洲国产精品500在线观看 | 色婷婷色| 伊人开心激情 | 国产一区在线视频观看 | 色噜噜在线观看 | 久草在线网址 | 人人爽久久久噜噜噜电影 | 99精品视频在线播放观看 | 日韩精品久久久久久久电影竹菊 | 国产精品欧美久久久久无广告 | 久99久在线视频 | 国产精品黄色在线观看 | 久久婷综合 | 毛片播放网站 | free,性欧美| 精品女同一区二区三区在线观看 | 97av在线视频免费播放 | 色com | 国产精品久久99综合免费观看尤物 | 色吊丝在线永久观看最新版本 | 久久视频一区 | 久久久久久久国产精品影院 | 久久久精品综合 | 99精品在线播放 | 国产高清不卡在线 | 亚洲国产欧美一区二区三区丁香婷 | 免费成人在线电影 | 91九色精品女同系列 | 国产黄a三级三级 | 国产麻豆精品一区二区 | 99精品国产福利在线观看免费 | 国产区精品视频 | 成人视屏免费看 | 精品在线观看一区二区 | 激情久久婷婷 | 成人在线免费观看网站 | 精品视频在线观看 | 国产精品一区二区三区观看 | 亚洲精品18日本一区app | 国产成人精品久久亚洲高清不卡 | www免费在线观看 | 日韩小视频网站 | 狠狠婷婷| 99看视频在线观看 | 国产91aaa| 国产美女精品久久久 | 欧美激情精品久久久久久免费印度 | 免费在线观看av电影 | 日韩精品中文字幕av | 波多野结衣在线观看视频 | 成人中文字幕+乱码+中文字幕 | 日韩欧美视频一区二区三区 | 国产成人精品一区二区三区网站观看 | 在线看一区二区 | 韩国av一区二区 | 欧美精品第一 | 成人aⅴ视频| 欧美精品乱码久久久久 | 日韩电影在线观看一区 | 99久久精品网 | 天天天天爽 | 国产精品久久久电影 | 中文字幕在线免费播放 | 久久久久久久久久伊人 | 日韩av电影中文字幕 | 91久久国产自产拍夜夜嗨 | 精品国产一区二区三区不卡 | 日韩夜夜爽 | 精品毛片久久久久久 | 麻豆视频在线看 | av高清一区二区三区 | 亚洲午夜久久久久久久久久久 | 一区二区三区动漫 | 国产 视频 久久 | 麻豆成人小视频 | 国产视频欧美视频 | 精品一区二区在线播放 | 色综合激情网 | 亚洲欧美综合 | 国产日韩精品在线观看 | 亚洲成人黄色av | 九九九九热精品免费视频点播观看 | 日韩.com | 亚洲欧美日韩一二三区 | av.com在线 | 亚洲区视频在线观看 | 精品久久久久久久久久 | 97色视频在线 | 国产一区二区三区在线免费观看 | 99色在线视频 | 激情网五月天 | 国产伦理一区 | 免费福利视频网 | 四虎影视精品永久在线观看 | 日韩精品观看 | 亚洲天堂视频在线 | 国产精华国产精品 | 亚洲国产黄色片 | 国产一级电影网 | av.com在线 | 欧美日本日韩aⅴ在线视频 插插插色综合 | 99热在线精品观看 | 亚洲精品18p | 黄色av电影在线观看 | 日日操网 | 最新精品视频在线 | 精品国内自产拍在线观看视频 | 激情综合色播五月 | 最新中文字幕在线观看视频 | 国产色在线观看 | 久久黄色影院 | 在线电影a| 精品99999 | 亚洲va欧洲va国产va不卡 | 精品国产免费一区二区三区五区 | 最近日本字幕mv免费观看在线 | 国产精品丝袜久久久久久久不卡 | 国产精品日韩在线播放 | 欧美 亚洲 另类 激情 另类 | 精品中文字幕在线 | 国产分类视频 | 97操操| 97成人精品视频在线播放 | 日韩av快播电影网 | 国产日韩欧美自拍 | 中文字幕视频播放 | 国产精品久久久区三区天天噜 | 婷婷激情小说网 | 探花视频免费在线观看 | 黄色福利视频网站 | 久久久久激情电影 | 久久兔费看a级 | 在线观看一区视频 | 亚洲免费一级电影 | 91精品视频导航 | 欧美激情在线网站 | 综合久久久久久久久 | 在线免费三级 | 天天天干天天天操 | 国产一区二区久久 | 亚洲精品视频二区 | 色午夜| 麻豆免费精品视频 | 国产午夜在线 | 国产一区二区久久久久 | 亚洲毛片在线观看. | 97视频网址| 国内视频在线 | 国产精品久久久久一区二区 | 日韩精品专区在线影院重磅 | 亚洲黄色影院 | 国产一区二区精品 | 天天激情天天干 | 国产在线综合视频 | 亚洲精品乱码久久久久久写真 | 亚洲成人av电影在线 | 免费在线看v | 成人午夜电影在线播放 | 国内99视频| 亚洲国产精品久久久久婷婷884 | 欧美精品少妇xxxxx喷水 | 亚洲精品午夜久久久久久久 | 久久精品久久精品 | 一级黄毛片 | 91精品国产综合久久久久久久 | 日韩久久精品一区二区三区下载 | 91社区国产高清 | 亚洲国产精品视频在线观看 | 亚洲自拍偷拍色图 | 成人午夜在线观看 | 日韩高清无线码2023 | 激情综合站 | 亚洲高清免费在线 | 午夜视频免费播放 | 亚洲一级电影视频 | 日韩啪啪小视频 | 91看片在线免费观看 | 国产视频九色蝌蚪 | 激情五月播播久久久精品 | 欧美在线free | 玖玖视频 | 国产精品成人自拍 | 黄色成人小视频 | 午夜三级毛片 | 精品美女在线视频 | 激情综合啪啪 | 亚洲女裸体 | 99精品偷拍视频一区二区三区 | 亚洲.www| 成人h视频在线 | 久久字幕 | 高清av在线免费观看 | 在线观看视频一区二区三区 | 在线观看中文字幕网站 | 亚洲国产精品久久久久 | 天堂av在线免费观看 | 在线亚洲人成电影网站色www | 狠狠色丁香婷婷综合 | 在线视频 你懂得 | 成人亚洲精品久久久久 | 91成人免费| 99视频免费在线观看 | 九九精品久久 | 草久视频在线 | 手机色在线 | 午夜婷婷综合 | 中文字幕免费高 | 日韩高清激情 | 中文字幕一区二区三区在线观看 | 夜夜干夜夜 | 久久精品婷婷 | 97国产情侣爱久久免费观看 | 婷婷丁香激情五月 | 久久久天天操 | 久久久久久久久久久免费 | 国产黄色a| 91探花系列在线播放 | 玖玖国产精品视频 | 国产尤物在线 | 国产又粗又硬又爽的视频 | 91社区国产高清 | 久久艹国产视频 | 久久精品日韩 | 欧美激情精品久久久久久免费印度 | 国产精品手机看片 | 不卡的av在线播放 | 久久久蜜桃 | 天堂成人在线 | 国产无限资源在线观看 | 亚洲在线精品视频 | 91新人在线观看 | 手机av永久免费 | 天天草综合| 国产伦精品一区二区三区在线 | 99久热在线精品视频 | 婷婷在线资源 | 在线观看免费福利 | 日韩一二三在线 | 日日操网站 | 日韩电影久久久 | 911精品视频| 玖操 | 亚洲激情网站免费观看 | 久久久久久久久毛片精品 | av电影av在线 | 久久久伊人网 | 香蕉在线播放 | 成人一区二区三区中文字幕 | 亚洲理论片在线观看 | 国产精品一区二区在线观看免费 | 欧美 国产 视频 | 精品亚洲va在线va天堂资源站 | 精品一区精品二区高清 | 精品国产乱码久久久久久天美 | 免费观看一区二区 | 亚洲精品在线观看av | 在线视频 国产 日韩 | 久久久午夜精品理论片中文字幕 | 最近中文字幕免费av | 久久久国产精品久久久 | 天堂av高清 | 亚州国产精品 | 国产69精品久久99不卡的观看体验 | 五月激情综合婷婷 | 欧美日韩在线免费观看 | 777久久久 | 久久综合国产伦精品免费 | 狠狠色网 | 国产午夜三级一区二区三桃花影视 | 日日操日日干 | 欧美 日韩 视频 | 久久精品7| 一区二区三区免费看 | 最新中文字幕 | 在线看91| 天堂在线成人 | 五月天婷婷丁香花 | 日韩一级片大全 | 亚洲高清网站 | 99热日本 | 精品国产一区二区三区久久久蜜臀 | 一本色道久久精品 | 久久国产经典视频 | 久久99精品久久久久久 | 久久激情视频网 | 亚洲免费av一区二区 | 国产 亚洲 欧美 在线 | 欧美大片在线观看一区 | 91久久人澡人人添人人爽欧美 | av看片在线观看 | 国产一区免费 | 一级性视频 | av亚洲产国偷v产偷v自拍小说 | 亚洲国产精品第一区二区 | 日韩视频在线不卡 | 天天插日日操 | 日本精品视频一区二区 | 91精品视频一区二区三区 | 久久午夜羞羞影院 | av黄免费看 | 国产69精品久久久久99 | av电影免费在线看 | 91传媒免费在线观看 | 国产91亚洲精品 | 99久久99热这里只有精品 | 国产精品99视频 | 一本一道久久a久久精品蜜桃 | 欧美极品裸体 | 免费网站黄 | 免费视频在线观看网站 | 国产精品一区二区三区在线看 | 国产又粗又猛又色又黄视频 | 欧美在线视频一区二区三区 | 日韩成人不卡 | 久草视频免费播放 | 国产精品国产三级在线专区 | 日韩午夜av | 免费大片av | 开心色激情网 | av中文字幕电影 | 免费日p视频| 亚洲精品视频在线 | 亚洲第一区在线播放 | 国产一区二区三区免费在线观看 | 天天色天天综合网 | 国产一区视频在线播放 | 啪啪小视频网站 | 一区 二区 精品 | 精品国产成人在线影院 | 伊甸园永久入口www 99热 精品在线 | 成人在线免费观看视视频 | 国产黄色精品在线 | 色婷婷午夜 | 免费在线观看黄网站 | 免费看一级一片 | 久久综合色影院 | 99这里只有精品视频 | 国产成人免费高清 | 91精品办公室少妇高潮对白 | 久久久久成人精品免费播放动漫 | 丁香六月网 | 久久精品久久精品久久 | 久久 地址| 国产原创在线视频 | av电影在线观看 | 99久久精品国产一区二区成人 | 国产一区二区在线免费播放 | 欧美国产日韩激情 | 久草a在线| 99久久精品国产毛片 | av中文字幕第一页 | 天天干亚洲 | 黄色一级在线观看 | 日韩系列在线 | www.色的| 久久久久久久久久影院 | 激情电影影院 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 国产麻豆电影在线观看 | va视频在线观看 | 超碰在线亚洲 | 亚洲欧美va | 久久国产一区二区 | 友田真希av| 91av在线免费 | 97色资源| 在线观影网站 | 99久久久成人国产精品 | 在线观看免费一区 | 中文字幕乱码日本亚洲一区二区 | 黄色的视频 | 日本中文一区二区 | 免费在线观看亚洲视频 | 日韩一区二区三区视频在线 | 玖草在线观看 | 天海翼一区二区三区免费 | 日韩在线国产 | 天天综合网在线观看 | 国产午夜精品一区二区三区嫩草 | 五月婷婷av在线 | 久久艹影院 | 午夜国产福利在线 | 最新成人av | 免费av网站在线看 | 97超级碰碰碰视频在线观看 | 91亚洲精品在线 | 香蕉视频在线网站 | 91在线免费播放视频 | 国产精品成人在线观看 | 色婷婷激情四射 | 狠狠色狠狠色综合日日92 | 国产福利91精品一区 | 久久亚洲人 | 精品嫩模福利一区二区蜜臀 | 中文字幕二区在线观看 | 九色视频自拍 | 91视频在线观看大全 | 在线观看精品视频 | 一区二区精品 | 国产精品观看视频 | 四虎国产精品成人免费影视 | 在线观看中文字幕视频 | 在线观看免费av片 | 91久久精 | 97精品国产97久久久久久春色 | 欧美 日韩 国产 成人 在线 | 精品视频在线免费 | 国产精品久久久久久久久久久免费看 | 色香蕉在线视频 | 人人澡人人添人人爽一区二区 | 天天激情 | 亚洲三级网 | 午夜av电影院 | 狠狠干,狠狠操 | 亚洲国产片 | 亚洲精品视频偷拍 | 欧美日韩中文在线视频 | 黄色成人毛片 | 精品久久久久久久久久国产 | 日韩国产高清在线 | 永久黄网站色视频免费观看w | 成人h电影 | 人人爽人人爽人人片av免 | 日本黄色片一区二区 | 日日草视频 | 黄色特级一级片 | 日韩一区二区三区在线观看 | 在线观看中文字幕一区二区 | 亚洲精品人人 | 欧洲在线免费视频 | a色视频| 精品免费观看视频 | 色停停五月天 | 日韩欧三级| 国内精品久久久久久久久久久 | 人人干人人做 | 久久国产女人 | 中文字幕资源网 | 久久精品96 | 欧美另类z0zx | 午夜电影久久 | 婷婷成人在线 | 久久精品首页 | 免费看的黄色小视频 | 超碰国产在线观看 | 99国产精品免费网站 | 在线视频国产区 | 五月丁婷婷 | 91亚洲精品在线 | 成人在线观看网址 | 天天射天天操天天 | 精品欧美日韩 | 亚洲视频 视频在线 | 亚洲国产欧美在线人成大黄瓜 | 人人操日日干 | 天天色欧美 | 五月婷婷激情网 | 亚洲人成综合 | 黄色毛片电影 | 天天艹天天 | 中文字幕亚洲欧美日韩 | 国产午夜精品视频 | 亚州精品一二三区 | av电影中文字幕在线观看 | 亚洲女同videos| 福利视频一区二区 | 一 级 黄 色 片免费看的 | 国产精品欧美久久久久无广告 | 久久99精品国产麻豆宅宅 | 黄色三级网站 | 久草青青在线观看 | 欧美精品午夜 | 精品一区二区免费 | 精品免费 | 国产精品国产三级在线专区 | 人人玩人人添人人澡97 | 深爱激情综合网 | 久久久综合色 | 国产人成一区二区三区影院 | 亚洲最新在线 | 日韩高清在线看 | 中文字幕二区 | 亚洲美女视频在线 | 久久久久国产精品视频 | 欧洲激情在线 | 久久久福利 | 欧美一级日韩三级 | 国产福利在线 | 韩国在线视频一区 | 国产精品久久久久久久毛片 | 亚洲男人天堂a | 亚洲精品欧美专区 | 91看成人 | 香蕉网站在线观看 | 久久精品xxx | 不卡的av电影在线观看 | 91污污| 在线免费观看黄色大片 | 婷婷av网站 | 综合色综合| 亚洲码国产日韩欧美高潮在线播放 | av 一区 二区 久久 | 国产字幕在线观看 | 特级黄色视频毛片 | 亚洲第一香蕉视频 | 国产在线 一区二区三区 | 国产黄a三级 | 久久精品免费看 | 精品国产aⅴ麻豆 | 97电影在线看视频 | 毛片网站在线 | 免费a一级 | 视频国产区 | 夜夜躁日日躁狠狠久久av | 国产日韩欧美综合在线 | 欧美a级在线 | 岛国av在线| 午夜久久福利视频 | 97夜夜澡人人爽人人免费 | 丁香午夜 | 在线观看福利网站 | 亚洲综合欧美日韩狠狠色 | 亚洲最大免费成人网 | 亚洲最新在线视频 | 成人三级视频 | 亚洲精品乱码久久久久久蜜桃欧美 | 久久综合婷婷国产二区高清 | 国产一区二区三区免费在线观看 | 成人av资源网 | 成人免费视频a | 日韩免费播放 | 天天色天天射天天操 | 日韩区视频 | 久草视频在 | 欧美黑吊大战白妞欧美 | 手机在线永久免费观看av片 | 成全免费观看视频 | 人人天天夜夜 | 免费人成网 | 日韩专区在线 | 国产精品k频道 | 久久免费大片 | 精品在线播放视频 | 久久精品99久久久久久2456 | 美女性爽视频国产免费app | 免费视频在线观看网站 | 欧美精品被 | 国产资源站 | 国产不卡高清 | 九九综合久久 | 日本精品久久久久中文字幕 | 精品在线视频一区二区三区 | av电影中文字幕在线观看 | 日韩免费观看一区二区三区 | 丁香久久久 | 国产精品视频在线看 | 欧美性精品 | 日韩欧美一区二区在线观看 | 伊人小视频 | 91视频啪 | 91香蕉国产在线观看软件 | 亚洲黄色在线观看 | 亚洲综合网 | 三级黄免费看 | 成人免费 在线播放 | 中文字幕丝袜一区二区 | 狠狠干五月天 | 九九视频网 | 亚洲一区视频在线播放 | 91理论片午午伦夜理片久久 | 97精品国产一二三产区 | 亚洲精品久久久久中文字幕二区 | 日韩电影一区二区在线 | 91高清视频在线 | 日日夜夜精品视频天天综合网 | 精品自拍sae8—视频 | 亚洲激情小视频 | 81精品国产乱码久久久久久 | 成人99免费视频 | 久艹在线免费观看 | 国产成人精品午夜在线播放 | 91精品推荐 | 永久免费看av| 国产精品区一区 | 日本护士撒尿xxxx18 | 欧洲亚洲女同hd | 国产日韩欧美在线看 | 欧美吞精 | 午夜av电影院 | 国产三级精品三级在线观看 | 天天干天天操天天拍 | 久久精品中文字幕一区二区三区 | 久久观看最新视频 | 天堂av网在线 | 午夜av电影| www.日日日.com | 天天干夜夜想 | 久久99国产精品久久99 | 青草视频在线免费 | 在线观看视频免费大全 | 成人av电影免费在线观看 | 婷婷色资源 | av丁香花 | av性网站| 中文字幕亚洲国产 | 丁香六月av | 91完整版| 在线视频第一页 | 99视频精品免费观看, | 国产精品一区二区av麻豆 | 超碰av在线| 国产精品乱码一区二三区 | 日韩电影中文,亚洲精品乱码 | 中文乱幕日产无线码1区 | 国产精品女同一区二区三区久久夜 | 国产精品男女 | 日韩网站在线 | 久久黄色片子 | 国内精品久久久久久 | 亚洲午夜精品久久久久久久久久久久 | 一级成人网 | 久久97视频 | 精品国产乱码久久久久 | 毛片无卡免费无播放器 | av高清一区 | 国产福利精品在线观看 | 这里只有精品视频在线 | 中文乱幕日产无线码1区 | 一区二区三区视频在线 | 一区二区三区高清在线观看 | 精品视频在线免费 | 国产剧情久久 | 久久不见久久见免费影院 |