日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > 目标检测 >内容正文

目标检测

Keras搭建YoloV4目标检测平台

發布時間:2025/3/21 目标检测 188 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Keras搭建YoloV4目标检测平台 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


學習前言
什么是YOLOV4
代碼下載
YOLOV4改進的部分(不完全)
YOLOV4結構解析
1、主干特征提取網絡Backbone
2、特征金字塔
3、YoloHead利用獲得到的特征進行預測
4、預測結果的解碼
5、在原圖上進行繪制
YOLOV4的訓練
1、YOLOV4的改進訓練技巧
a)、Mosaic數據增強
b)、Label Smoothing平滑
c)、CIOU
d)、學習率余弦退火衰減
2、loss組成
a)、計算loss所需參數
b)、y_pre是什么
c)、y_true是什么。
d)、loss的計算過程
訓練自己的YOLOV4模型
學習前言
哈哈哈我最喜歡的YOLO更新了!


什么是YOLOV4

YOLOV4是YOLOV3的改進版,在YOLOV3的基礎上結合了非常多的小Tricks。
盡管沒有目標檢測上革命性的改變,但是YOLOV4依然很好的結合了速度與精度。
根據上圖也可以看出來,YOLOV4在YOLOV3的基礎上,在FPS不下降的情況下,mAP達到了44,提高非常明顯。

YOLOV4整體上的檢測思路和YOLOV3相比相差并不大,都是使用三個特征層進行分類與回歸預測。

請注意!

強烈建議在學習YOLOV4之前學習YOLOV3,因為YOLOV4確實可以看作是YOLOV3結合一系列改進的版本!

強烈建議在學習YOLOV4之前學習YOLOV3,因為YOLOV4確實可以看作是YOLOV3結合一系列改進的版本!

強烈建議在學習YOLOV4之前學習YOLOV3,因為YOLOV4確實可以看作是YOLOV3結合一系列改進的版本!

(重要的事情說三遍!)

YOLOV3可參考該博客:
https://blog.csdn.net/weixin_44791964/article/details/103276106

代碼下載
https://github.com/bubbliiiing/yolov4-keras
喜歡的可以給個star噢!

YOLOV4改進的部分(不完全)
1、主干特征提取網絡:DarkNet53 => CSPDarkNet53

2、特征金字塔:SPP,PAN

3、分類回歸層:YOLOv3(未改變)

4、訓練用到的小技巧:Mosaic數據增強、Label Smoothing平滑、CIOU、學習率余弦退火衰減

5、激活函數:使用Mish激活函數

以上并非全部的改進部分,還存在一些其它的改進,由于YOLOV4使用的改進實在太多了,很難完全實現與列出來,這里只列出來了一些我比較感興趣,而且非常有效的改進。

整篇BLOG會結合YOLOV3與YOLOV4的差別進行解析

YOLOV4結構解析
1、主干特征提取網絡Backbone
當輸入是416x416時,特征結構如下:

當輸入是608x608時,特征結構如下:

主干特征提取網絡Backbone的改進點有兩個:
a).主干特征提取網絡:DarkNet53 => CSPDarkNet53
b).激活函數:使用Mish激活函數

如果大家對YOLOV3比較熟悉的話,應該知道Darknet53的結構,其由一系列殘差網絡結構構成。在Darknet53中,其存在如下resblock_body模塊,其由一次下采樣和多次殘差結構的堆疊構成,Darknet53便是由resblock_body模塊組合而成。

def resblock_body(x, num_filters, num_blocks):
? ? x = ZeroPadding2D(((1,0),(1,0)))(x)
? ? x = DarknetConv2D_BN_Leaky(num_filters, (3,3), strides=(2,2))(x)
? ? for i in range(num_blocks):
? ? ? ? y = DarknetConv2D_BN_Leaky(num_filters//2, (1,1))(x)
? ? ? ? y = DarknetConv2D_BN_Leaky(num_filters, (3,3))(y)
? ? ? ? x = Add()([x,y])
? ? return x
1
2
3
4
5
6
7
8
而在YOLOV4中,其對該部分進行了一定的修改。
1、其一是將DarknetConv2D的激活函數由LeakyReLU修改成了Mish,卷積塊由DarknetConv2D_BN_Leaky變成了DarknetConv2D_BN_Mish。
Mish函數的公式與圖像如下:
Mish=x×tanh(ln(1+ex))Mish=x \times tanh(ln(1+e^x))
Mish=x×tanh(ln(1+e?
x
?))


2、其二是將resblock_body的結構進行修改,使用了CSPnet結構。此時YOLOV4當中的Darknet53被修改成了CSPDarknet53。

CSPnet結構并不算復雜,就是將原來的殘差塊的堆疊進行了一個拆分,拆成左右兩部分:
主干部分繼續進行原來的殘差塊的堆疊;
另一部分則像一個殘差邊一樣,經過少量處理直接連接到最后。
因此可以認為CSP中存在一個大的殘差邊。

#---------------------------------------------------#
# ? CSPdarknet的結構塊
# ? 存在一個大殘差邊
# ? 這個大殘差邊繞過了很多的殘差結構
#---------------------------------------------------#
def resblock_body(x, num_filters, num_blocks, all_narrow=True):
? ? # 進行長和寬的壓縮
? ? preconv1 = ZeroPadding2D(((1,0),(1,0)))(x)
? ? preconv1 = DarknetConv2D_BN_Mish(num_filters, (3,3), strides=(2,2))(preconv1)

? ? # 生成一個大的殘差邊?
? ? shortconv = DarknetConv2D_BN_Mish(num_filters//2 if all_narrow else num_filters, (1,1))(preconv1)

? ? # 主干部分的卷積
? ? mainconv = DarknetConv2D_BN_Mish(num_filters//2 if all_narrow else num_filters, (1,1))(preconv1)
? ? # 1x1卷積對通道數進行整合->3x3卷積提取特征,使用殘差結構
? ? for i in range(num_blocks):
? ? ? ? y = compose(
? ? ? ? ? ? ? ? DarknetConv2D_BN_Mish(num_filters//2, (1,1)),
? ? ? ? ? ? ? ? DarknetConv2D_BN_Mish(num_filters//2 if all_narrow else num_filters, (3,3)))(mainconv)
? ? ? ? mainconv = Add()([mainconv,y])
? ? # 1x1卷積后和殘差邊堆疊
? ? postconv = DarknetConv2D_BN_Mish(num_filters//2 if all_narrow else num_filters, (1,1))(mainconv)
? ? route = Concatenate()([postconv, shortconv])

? ? # 最后對通道數進行整合
? ? return DarknetConv2D_BN_Mish(num_filters, (1,1))(route)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
全部實現代碼為:

from functools import wraps
from keras import backend as K
from keras.layers import Conv2D, Add, ZeroPadding2D, UpSampling2D, Concatenate, MaxPooling2D, Layer
from keras.layers.advanced_activations import LeakyReLU
from keras.layers.normalization import BatchNormalization
from keras.regularizers import l2
from utils.utils import compose


class Mish(Layer):
? ? def __init__(self, **kwargs):
? ? ? ? super(Mish, self).__init__(**kwargs)
? ? ? ? self.supports_masking = True

? ? def call(self, inputs):
? ? ? ? return inputs * K.tanh(K.softplus(inputs))

? ? def get_config(self):
? ? ? ? config = super(Mish, self).get_config()
? ? ? ? return config

? ? def compute_output_shape(self, input_shape):
? ? ? ? return input_shape
#--------------------------------------------------#
# ? 單次卷積
#--------------------------------------------------#
@wraps(Conv2D)
def DarknetConv2D(*args, **kwargs):
? ? darknet_conv_kwargs = {'kernel_regularizer': l2(5e-4)}
? ? darknet_conv_kwargs['padding'] = 'valid' if kwargs.get('strides')==(2,2) else 'same'
? ? darknet_conv_kwargs.update(kwargs)
? ? return Conv2D(*args, **darknet_conv_kwargs)

#---------------------------------------------------#
# ? 卷積塊
# ? DarknetConv2D + BatchNormalization + Mish
#---------------------------------------------------#
def DarknetConv2D_BN_Mish(*args, **kwargs):
? ? no_bias_kwargs = {'use_bias': False}
? ? no_bias_kwargs.update(kwargs)
? ? return compose(
? ? ? ? DarknetConv2D(*args, **no_bias_kwargs),
? ? ? ? BatchNormalization(),
? ? ? ? Mish())

#---------------------------------------------------#
# ? CSPdarknet的結構塊
# ? 存在一個大殘差邊
# ? 這個大殘差邊繞過了很多的殘差結構
#---------------------------------------------------#
def resblock_body(x, num_filters, num_blocks, all_narrow=True):
? ? # 進行長和寬的壓縮
? ? preconv1 = ZeroPadding2D(((1,0),(1,0)))(x)
? ? preconv1 = DarknetConv2D_BN_Mish(num_filters, (3,3), strides=(2,2))(preconv1)

? ? # 生成一個大的殘差邊?
? ? shortconv = DarknetConv2D_BN_Mish(num_filters//2 if all_narrow else num_filters, (1,1))(preconv1)

? ? # 主干部分的卷積
? ? mainconv = DarknetConv2D_BN_Mish(num_filters//2 if all_narrow else num_filters, (1,1))(preconv1)
? ? # 1x1卷積對通道數進行整合->3x3卷積提取特征,使用殘差結構
? ? for i in range(num_blocks):
? ? ? ? y = compose(
? ? ? ? ? ? ? ? DarknetConv2D_BN_Mish(num_filters//2, (1,1)),
? ? ? ? ? ? ? ? DarknetConv2D_BN_Mish(num_filters//2 if all_narrow else num_filters, (3,3)))(mainconv)
? ? ? ? mainconv = Add()([mainconv,y])
? ? # 1x1卷積后和殘差邊堆疊
? ? postconv = DarknetConv2D_BN_Mish(num_filters//2 if all_narrow else num_filters, (1,1))(mainconv)
? ? route = Concatenate()([postconv, shortconv])

? ? # 最后對通道數進行整合
? ? return DarknetConv2D_BN_Mish(num_filters, (1,1))(route)

#---------------------------------------------------#
# ? CSPdarknet53 的主體部分
#---------------------------------------------------#
def darknet_body(x):
? ? x = DarknetConv2D_BN_Mish(32, (3,3))(x)
? ? x = resblock_body(x, 64, 1, False)
? ? x = resblock_body(x, 128, 2)
? ? x = resblock_body(x, 256, 8)
? ? feat1 = x
? ? x = resblock_body(x, 512, 8)
? ? feat2 = x
? ? x = resblock_body(x, 1024, 4)
? ? feat3 = x
? ? return feat1,feat2,feat3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
2、特征金字塔
當輸入是416x416時,特征結構如下:

當輸入是608x608時,特征結構如下:

在特征金字塔部分,YOLOV4結合了兩種改進:
a).使用了SPP結構。
b).使用了PANet結構。
如上圖所示,除去CSPDarknet53和Yolo Head的結構外,都是特征金字塔的結構。
1、SPP結構參雜在對CSPdarknet53的最后一個特征層的卷積里,在對CSPdarknet53的最后一個特征層進行三次DarknetConv2D_BN_Leaky卷積后,分別利用四個不同尺度的最大池化進行處理,最大池化的池化核大小分別為13x13、9x9、5x5、1x1(1x1即無處理)

# 使用了SPP結構,即不同尺度的最大池化后堆疊。
maxpool1 = MaxPooling2D(pool_size=(13,13), strides=(1,1), padding='same')(P5)
maxpool2 = MaxPooling2D(pool_size=(9,9), strides=(1,1), padding='same')(P5)
maxpool3 = MaxPooling2D(pool_size=(5,5), strides=(1,1), padding='same')(P5)
P5 = Concatenate()([maxpool1, maxpool2, maxpool3, P5])
1
2
3
4
5
其可以它能夠極大地增加感受野,分離出最顯著的上下文特征。

2、PANet是2018的一種實例分割算法,其具體結構由反復提升特征的意思。

上圖為原始的PANet的結構,可以看出來其具有一個非常重要的特點就是特征的反復提取。
在(a)里面是傳統的特征金字塔結構,在完成特征金字塔從下到上的特征提取后,還需要實現(b)中從上到下的特征提取。

而在YOLOV4當中,其主要是在三個有效特征層上使用了PANet結構。

實現代碼如下:

#---------------------------------------------------#
# ? 特征層->最后的輸出
#---------------------------------------------------#
def yolo_body(inputs, num_anchors, num_classes):
? ? # 生成darknet53的主干模型
? ? feat1,feat2,feat3 = darknet_body(inputs)

? ? P5 = DarknetConv2D_BN_Leaky(512, (1,1))(feat3)
? ? P5 = DarknetConv2D_BN_Leaky(1024, (3,3))(P5)
? ? P5 = DarknetConv2D_BN_Leaky(512, (1,1))(P5)
? ? # 使用了SPP結構,即不同尺度的最大池化后堆疊。
? ? maxpool1 = MaxPooling2D(pool_size=(13,13), strides=(1,1), padding='same')(P5)
? ? maxpool2 = MaxPooling2D(pool_size=(9,9), strides=(1,1), padding='same')(P5)
? ? maxpool3 = MaxPooling2D(pool_size=(5,5), strides=(1,1), padding='same')(P5)
? ? P5 = Concatenate()([maxpool1, maxpool2, maxpool3, P5])
? ? P5 = DarknetConv2D_BN_Leaky(512, (1,1))(P5)
? ? P5 = DarknetConv2D_BN_Leaky(1024, (3,3))(P5)
? ? P5 = DarknetConv2D_BN_Leaky(512, (1,1))(P5)

? ? P5_upsample = compose(DarknetConv2D_BN_Leaky(256, (1,1)), UpSampling2D(2))(P5)
? ??
? ? P4 = DarknetConv2D_BN_Leaky(256, (1,1))(feat2)
? ? P4 = Concatenate()([P4, P5_upsample])
? ? P4 = make_five_convs(P4,256)

? ? P4_upsample = compose(DarknetConv2D_BN_Leaky(128, (1,1)), UpSampling2D(2))(P4)
? ??
? ? P3 = DarknetConv2D_BN_Leaky(128, (1,1))(feat1)
? ? P3 = Concatenate()([P3, P4_upsample])
? ? P3 = make_five_convs(P3,128)

? ? # 76x76的out
? ? P3_output = DarknetConv2D_BN_Leaky(256, (3,3))(P3)
? ? P3_output = DarknetConv2D(num_anchors*(num_classes+5), (1,1))(P3_output)

? ? P3_downsample = ZeroPadding2D(((1,0),(1,0)))(P3)
? ? P3_downsample = DarknetConv2D_BN_Leaky(256, (3,3), strides=(2,2))(P3_downsample)
? ? P4 = Concatenate()([P3_downsample, P4])
? ? P4 = make_five_convs(P4,256)
? ??
? ? # 38x38的out
? ? P4_output = DarknetConv2D_BN_Leaky(512, (3,3))(P4)
? ? P4_output = DarknetConv2D(num_anchors*(num_classes+5), (1,1))(P4_output)
? ??

? ? P4_downsample = ZeroPadding2D(((1,0),(1,0)))(P4)
? ? P4_downsample = DarknetConv2D_BN_Leaky(512, (3,3), strides=(2,2))(P4_downsample)
? ? P5 = Concatenate()([P4_downsample, P5])
? ? P5 = make_five_convs(P5,512)
? ??
? ? # 19x19的out
? ? P5_output = DarknetConv2D_BN_Leaky(1024, (3,3))(P5)
? ? P5_output = DarknetConv2D(num_anchors*(num_classes+5), (1,1))(P5_output)

? ? return Model(inputs, [P5_output, P4_output, P3_output])
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
3、YoloHead利用獲得到的特征進行預測
當輸入是416x416時,特征結構如下:

當輸入是608x608時,特征結構如下:

1、在特征利用部分,YoloV4提取多特征層進行目標檢測,一共提取三個特征層,分別位于中間層,中下層,底層,三個特征層的shape分別為(76,76,256)、(38,38,512)、(19,19,1024)。

2、輸出層的shape分別為(19,19,75),(38,38,75),(76,76,75),最后一個維度為75是因為該圖是基于voc數據集的,它的類為20種,YoloV4只有針對每一個特征層存在3個先驗框,所以最后維度為3x25;
如果使用的是coco訓練集,類則為80種,最后的維度應該為255 = 3x85,三個特征層的shape為(19,19,255),(38,38,255),(76,76,255)

實現代碼如下:

#---------------------------------------------------#
# ? 特征層->最后的輸出
#---------------------------------------------------#
def yolo_body(inputs, num_anchors, num_classes):
# 省略了一部分,只看最后的head部分
? ? P3_output = DarknetConv2D_BN_Leaky(256, (3,3))(P3)
? ? P3_output = DarknetConv2D(num_anchors*(num_classes+5), (1,1))(P3_output)

? ? P4_output = DarknetConv2D_BN_Leaky(512, (3,3))(P4)
? ? P4_output = DarknetConv2D(num_anchors*(num_classes+5), (1,1))(P4_output)

? ? P5_output = DarknetConv2D_BN_Leaky(1024, (3,3))(P5)
? ? P5_output = DarknetConv2D(num_anchors*(num_classes+5), (1,1))(P5_output)
1
2
3
4
5
6
7
8
9
10
11
12
13
4、預測結果的解碼
由第二步我們可以獲得三個特征層的預測結果,shape分別為(N,19,19,255),(N,38,38,255),(N,76,76,255)的數據,對應每個圖分為19x19、38x38、76x76的網格上3個預測框的位置。

但是這個預測結果并不對應著最終的預測框在圖片上的位置,還需要解碼才可以完成。

此處要講一下yolo3的預測原理,yolo3的3個特征層分別將整幅圖分為19x19、38x38、76x76的網格,每個網絡點負責一個區域的檢測。

我們知道特征層的預測結果對應著三個預測框的位置,我們先將其reshape一下,其結果為(N,19,19,3,85),(N,38,38,3,85),(N,76,76,3,85)。

最后一個維度中的85包含了4+1+80,分別代表x_offset、y_offset、h和w、置信度、分類結果。

yolo3的解碼過程就是將每個網格點加上它對應的x_offset和y_offset,加完后的結果就是預測框的中心,然后再利用 先驗框和h、w結合 計算出預測框的長和寬。這樣就能得到整個預測框的位置了。


當然得到最終的預測結構后還要進行得分排序與非極大抑制篩選
這一部分基本上是所有目標檢測通用的部分。不過該項目的處理方式與其它項目不同。其對于每一個類進行判別。
1、取出每一類得分大于self.obj_threshold的框和得分。
2、利用框的位置和得分進行非極大抑制。

實現代碼如下,當調用yolo_eval時,就會對每個特征層進行解碼:

#---------------------------------------------------#
# ? 將預測值的每個特征層調成真實值
#---------------------------------------------------#
def yolo_head(feats, anchors, num_classes, input_shape, calc_loss=False):
? ? num_anchors = len(anchors)
? ? # [1, 1, 1, num_anchors, 2]
? ? anchors_tensor = K.reshape(K.constant(anchors), [1, 1, 1, num_anchors, 2])

? ? # 獲得x,y的網格
? ? # (19, 19, 1, 2)
? ? grid_shape = K.shape(feats)[1:3] # height, width
? ? grid_y = K.tile(K.reshape(K.arange(0, stop=grid_shape[0]), [-1, 1, 1, 1]),
? ? ? ? [1, grid_shape[1], 1, 1])
? ? grid_x = K.tile(K.reshape(K.arange(0, stop=grid_shape[1]), [1, -1, 1, 1]),
? ? ? ? [grid_shape[0], 1, 1, 1])
? ? grid = K.concatenate([grid_x, grid_y])
? ? grid = K.cast(grid, K.dtype(feats))

? ? # (batch_size,19,19,3,85)
? ? feats = K.reshape(feats, [-1, grid_shape[0], grid_shape[1], num_anchors, num_classes + 5])

? ? # 將預測值調成真實值
? ? # box_xy對應框的中心點
? ? # box_wh對應框的寬和高
? ? box_xy = (K.sigmoid(feats[..., :2]) + grid) / K.cast(grid_shape[::-1], K.dtype(feats))
? ? box_wh = K.exp(feats[..., 2:4]) * anchors_tensor / K.cast(input_shape[::-1], K.dtype(feats))
? ? box_confidence = K.sigmoid(feats[..., 4:5])
? ? box_class_probs = K.sigmoid(feats[..., 5:])

? ? # 在計算loss的時候返回如下參數
? ? if calc_loss == True:
? ? ? ? return grid, feats, box_xy, box_wh
? ? return box_xy, box_wh, box_confidence, box_class_probs

#---------------------------------------------------#
# ? 對box進行調整,使其符合真實圖片的樣子
#---------------------------------------------------#
def yolo_correct_boxes(box_xy, box_wh, input_shape, image_shape):
? ? box_yx = box_xy[..., ::-1]
? ? box_hw = box_wh[..., ::-1]
? ??
? ? input_shape = K.cast(input_shape, K.dtype(box_yx))
? ? image_shape = K.cast(image_shape, K.dtype(box_yx))

? ? new_shape = K.round(image_shape * K.min(input_shape/image_shape))
? ? offset = (input_shape-new_shape)/2./input_shape
? ? scale = input_shape/new_shape

? ? box_yx = (box_yx - offset) * scale
? ? box_hw *= scale

? ? box_mins = box_yx - (box_hw / 2.)
? ? box_maxes = box_yx + (box_hw / 2.)
? ? boxes = ?K.concatenate([
? ? ? ? box_mins[..., 0:1], ?# y_min
? ? ? ? box_mins[..., 1:2], ?# x_min
? ? ? ? box_maxes[..., 0:1], ?# y_max
? ? ? ? box_maxes[..., 1:2] ?# x_max
? ? ])

? ? boxes *= K.concatenate([image_shape, image_shape])
? ? return boxes

#---------------------------------------------------#
# ? 獲取每個box和它的得分
#---------------------------------------------------#
def yolo_boxes_and_scores(feats, anchors, num_classes, input_shape, image_shape):
? ? # 將預測值調成真實值
? ? # box_xy對應框的中心點
? ? # box_wh對應框的寬和高
? ? # -1,19,19,3,2; -1,19,19,3,2; -1,19,19,3,1; -1,19,19,3,80
? ? box_xy, box_wh, box_confidence, box_class_probs = yolo_head(feats, anchors, num_classes, input_shape)
? ? # 將box_xy、和box_wh調節成y_min,y_max,xmin,xmax
? ? boxes = yolo_correct_boxes(box_xy, box_wh, input_shape, image_shape)
? ? # 獲得得分和box
? ? boxes = K.reshape(boxes, [-1, 4])
? ? box_scores = box_confidence * box_class_probs
? ? box_scores = K.reshape(box_scores, [-1, num_classes])
? ? return boxes, box_scores

#---------------------------------------------------#
# ? 圖片預測
#---------------------------------------------------#
def yolo_eval(yolo_outputs,
? ? ? ? ? ? ? anchors,
? ? ? ? ? ? ? num_classes,
? ? ? ? ? ? ? image_shape,
? ? ? ? ? ? ? max_boxes=20,
? ? ? ? ? ? ? score_threshold=.6,
? ? ? ? ? ? ? iou_threshold=.5):
? ? # 獲得特征層的數量
? ? num_layers = len(yolo_outputs)
? ? # 特征層1對應的anchor是678
? ? # 特征層2對應的anchor是345
? ? # 特征層3對應的anchor是012
? ? anchor_mask = [[6,7,8], [3,4,5], [0,1,2]]
? ??
? ? input_shape = K.shape(yolo_outputs[0])[1:3] * 32
? ? boxes = []
? ? box_scores = []
? ? # 對每個特征層進行處理
? ? for l in range(num_layers):
? ? ? ? _boxes, _box_scores = yolo_boxes_and_scores(yolo_outputs[l], anchors[anchor_mask[l]], num_classes, input_shape, image_shape)
? ? ? ? boxes.append(_boxes)
? ? ? ? box_scores.append(_box_scores)
? ? # 將每個特征層的結果進行堆疊
? ? boxes = K.concatenate(boxes, axis=0)
? ? box_scores = K.concatenate(box_scores, axis=0)

? ? mask = box_scores >= score_threshold
? ? max_boxes_tensor = K.constant(max_boxes, dtype='int32')
? ? boxes_ = []
? ? scores_ = []
? ? classes_ = []
? ? for c in range(num_classes):
? ? ? ? # 取出所有box_scores >= score_threshold的框,和成績
? ? ? ? class_boxes = tf.boolean_mask(boxes, mask[:, c])
? ? ? ? class_box_scores = tf.boolean_mask(box_scores[:, c], mask[:, c])

? ? ? ? # 非極大抑制,去掉box重合程度高的那一些
? ? ? ? nms_index = tf.image.non_max_suppression(
? ? ? ? ? ? class_boxes, class_box_scores, max_boxes_tensor, iou_threshold=iou_threshold)

? ? ? ? # 獲取非極大抑制后的結果
? ? ? ? # 下列三個分別是
? ? ? ? # 框的位置,得分與種類
? ? ? ? class_boxes = K.gather(class_boxes, nms_index)
? ? ? ? class_box_scores = K.gather(class_box_scores, nms_index)
? ? ? ? classes = K.ones_like(class_box_scores, 'int32') * c
? ? ? ? boxes_.append(class_boxes)
? ? ? ? scores_.append(class_box_scores)
? ? ? ? classes_.append(classes)
? ? boxes_ = K.concatenate(boxes_, axis=0)
? ? scores_ = K.concatenate(scores_, axis=0)
? ? classes_ = K.concatenate(classes_, axis=0)

? ? return boxes_, scores_, classes_
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
5、在原圖上進行繪制
通過第四步,我們可以獲得預測框在原圖上的位置,而且這些預測框都是經過篩選的。這些篩選后的框可以直接繪制在圖片上,就可以獲得結果了。

YOLOV4的訓練
1、YOLOV4的改進訓練技巧
a)、Mosaic數據增強
Yolov4的mosaic數據增強參考了CutMix數據增強方式,理論上具有一定的相似性!
CutMix數據增強方式利用兩張圖片進行拼接。

但是mosaic利用了四張圖片,根據論文所說其擁有一個巨大的優點是豐富檢測物體的背景!且在BN計算的時候一下子會計算四張圖片的數據!
就像下圖這樣:

實現思路如下:
1、每次讀取四張圖片。

2、分別對四張圖片進行翻轉、縮放、色域變化等,并且按照四個方向位置擺好。


3、進行圖片的組合和框的組合


def rand(a=0, b=1):
? ? return np.random.rand()*(b-a) + a

def merge_bboxes(bboxes, cutx, cuty):

? ? merge_bbox = []
? ? for i in range(len(bboxes)):
? ? ? ? for box in bboxes[i]:
? ? ? ? ? ? tmp_box = []
? ? ? ? ? ? x1,y1,x2,y2 = box[0], box[1], box[2], box[3]

? ? ? ? ? ? if i == 0:
? ? ? ? ? ? ? ? if y1 > cuty or x1 > cutx:
? ? ? ? ? ? ? ? ? ? continue
? ? ? ? ? ? ? ? if y2 >= cuty and y1 <= cuty:
? ? ? ? ? ? ? ? ? ? y2 = cuty
? ? ? ? ? ? ? ? ? ? if y2-y1 < 5:
? ? ? ? ? ? ? ? ? ? ? ? continue
? ? ? ? ? ? ? ? if x2 >= cutx and x1 <= cutx:
? ? ? ? ? ? ? ? ? ? x2 = cutx
? ? ? ? ? ? ? ? ? ? if x2-x1 < 5:
? ? ? ? ? ? ? ? ? ? ? ? continue
? ? ? ? ? ? ? ??
? ? ? ? ? ? if i == 1:
? ? ? ? ? ? ? ? if y2 < cuty or x1 > cutx:
? ? ? ? ? ? ? ? ? ? continue

? ? ? ? ? ? ? ? if y2 >= cuty and y1 <= cuty:
? ? ? ? ? ? ? ? ? ? y1 = cuty
? ? ? ? ? ? ? ? ? ? if y2-y1 < 5:
? ? ? ? ? ? ? ? ? ? ? ? continue
? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? if x2 >= cutx and x1 <= cutx:
? ? ? ? ? ? ? ? ? ? x2 = cutx
? ? ? ? ? ? ? ? ? ? if x2-x1 < 5:
? ? ? ? ? ? ? ? ? ? ? ? continue

? ? ? ? ? ? if i == 2:
? ? ? ? ? ? ? ? if y2 < cuty or x2 < cutx:
? ? ? ? ? ? ? ? ? ? continue

? ? ? ? ? ? ? ? if y2 >= cuty and y1 <= cuty:
? ? ? ? ? ? ? ? ? ? y1 = cuty
? ? ? ? ? ? ? ? ? ? if y2-y1 < 5:
? ? ? ? ? ? ? ? ? ? ? ? continue

? ? ? ? ? ? ? ? if x2 >= cutx and x1 <= cutx:
? ? ? ? ? ? ? ? ? ? x1 = cutx
? ? ? ? ? ? ? ? ? ? if x2-x1 < 5:
? ? ? ? ? ? ? ? ? ? ? ? continue

? ? ? ? ? ? if i == 3:
? ? ? ? ? ? ? ? if y1 > cuty or x2 < cutx:
? ? ? ? ? ? ? ? ? ? continue

? ? ? ? ? ? ? ? if y2 >= cuty and y1 <= cuty:
? ? ? ? ? ? ? ? ? ? y2 = cuty
? ? ? ? ? ? ? ? ? ? if y2-y1 < 5:
? ? ? ? ? ? ? ? ? ? ? ? continue

? ? ? ? ? ? ? ? if x2 >= cutx and x1 <= cutx:
? ? ? ? ? ? ? ? ? ? x1 = cutx
? ? ? ? ? ? ? ? ? ? if x2-x1 < 5:
? ? ? ? ? ? ? ? ? ? ? ? continue

? ? ? ? ? ? tmp_box.append(x1)
? ? ? ? ? ? tmp_box.append(y1)
? ? ? ? ? ? tmp_box.append(x2)
? ? ? ? ? ? tmp_box.append(y2)
? ? ? ? ? ? tmp_box.append(box[-1])
? ? ? ? ? ? merge_bbox.append(tmp_box)
? ? return merge_bbox

def get_random_data(annotation_line, input_shape, random=True, hue=.1, sat=1.5, val=1.5, proc_img=True):
? ? '''random preprocessing for real-time data augmentation'''
? ? h, w = input_shape
? ? min_offset_x = 0.4
? ? min_offset_y = 0.4
? ? scale_low = 1-min(min_offset_x,min_offset_y)
? ? scale_high = scale_low+0.2

? ? image_datas = []?
? ? box_datas = []
? ? index = 0

? ? place_x = [0,0,int(w*min_offset_x),int(w*min_offset_x)]
? ? place_y = [0,int(h*min_offset_y),int(w*min_offset_y),0]
? ? for line in annotation_line:
? ? ? ? # 每一行進行分割
? ? ? ? line_content = line.split()
? ? ? ? # 打開圖片
? ? ? ? image = Image.open(line_content[0])
? ? ? ? image = image.convert("RGB")?
? ? ? ? # 圖片的大小
? ? ? ? iw, ih = image.size
? ? ? ? # 保存框的位置
? ? ? ? box = np.array([np.array(list(map(int,box.split(',')))) for box in line_content[1:]])
? ? ? ??
? ? ? ? # image.save(str(index)+".jpg")
? ? ? ? # 是否翻轉圖片
? ? ? ? flip = rand()<.5
? ? ? ? if flip and len(box)>0:
? ? ? ? ? ? image = image.transpose(Image.FLIP_LEFT_RIGHT)
? ? ? ? ? ? box[:, [0,2]] = iw - box[:, [2,0]]

? ? ? ? # 對輸入進來的圖片進行縮放
? ? ? ? new_ar = w/h
? ? ? ? scale = rand(scale_low, scale_high)
? ? ? ? if new_ar < 1:
? ? ? ? ? ? nh = int(scale*h)
? ? ? ? ? ? nw = int(nh*new_ar)
? ? ? ? else:
? ? ? ? ? ? nw = int(scale*w)
? ? ? ? ? ? nh = int(nw/new_ar)
? ? ? ? image = image.resize((nw,nh), Image.BICUBIC)

? ? ? ? # 進行色域變換
? ? ? ? hue = rand(-hue, hue)
? ? ? ? sat = rand(1, sat) if rand()<.5 else 1/rand(1, sat)
? ? ? ? val = rand(1, val) if rand()<.5 else 1/rand(1, val)
? ? ? ? x = rgb_to_hsv(np.array(image)/255.)
? ? ? ? x[..., 0] += hue
? ? ? ? x[..., 0][x[..., 0]>1] -= 1
? ? ? ? x[..., 0][x[..., 0]<0] += 1
? ? ? ? x[..., 1] *= sat
? ? ? ? x[..., 2] *= val
? ? ? ? x[x>1] = 1
? ? ? ? x[x<0] = 0
? ? ? ? image = hsv_to_rgb(x)

? ? ? ? image = Image.fromarray((image*255).astype(np.uint8))
? ? ? ? # 將圖片進行放置,分別對應四張分割圖片的位置
? ? ? ? dx = place_x[index]
? ? ? ? dy = place_y[index]
? ? ? ? new_image = Image.new('RGB', (w,h), (128,128,128))
? ? ? ? new_image.paste(image, (dx, dy))
? ? ? ? image_data = np.array(new_image)/255

? ? ? ? # Image.fromarray((image_data*255).astype(np.uint8)).save(str(index)+"distort.jpg")
? ? ? ??
? ? ? ? index = index + 1
? ? ? ? box_data = []
? ? ? ? # 對box進行重新處理
? ? ? ? if len(box)>0:
? ? ? ? ? ? np.random.shuffle(box)
? ? ? ? ? ? box[:, [0,2]] = box[:, [0,2]]*nw/iw + dx
? ? ? ? ? ? box[:, [1,3]] = box[:, [1,3]]*nh/ih + dy
? ? ? ? ? ? box[:, 0:2][box[:, 0:2]<0] = 0
? ? ? ? ? ? box[:, 2][box[:, 2]>w] = w
? ? ? ? ? ? box[:, 3][box[:, 3]>h] = h
? ? ? ? ? ? box_w = box[:, 2] - box[:, 0]
? ? ? ? ? ? box_h = box[:, 3] - box[:, 1]
? ? ? ? ? ? box = box[np.logical_and(box_w>1, box_h>1)]
? ? ? ? ? ? box_data = np.zeros((len(box),5))
? ? ? ? ? ? box_data[:len(box)] = box
? ? ? ??
? ? ? ? image_datas.append(image_data)
? ? ? ? box_datas.append(box_data)

? ? ? ? img = Image.fromarray((image_data*255).astype(np.uint8))
? ? ? ? for j in range(len(box_data)):
? ? ? ? ? ? thickness = 3
? ? ? ? ? ? left, top, right, bottom ?= box_data[j][0:4]
? ? ? ? ? ? draw = ImageDraw.Draw(img)
? ? ? ? ? ? for i in range(thickness):
? ? ? ? ? ? ? ? draw.rectangle([left + i, top + i, right - i, bottom - i],outline=(255,255,255))
? ? ? ? img.show()

? ??
? ? # 將圖片分割,放在一起
? ? cutx = np.random.randint(int(w*min_offset_x), int(w*(1 - min_offset_x)))
? ? cuty = np.random.randint(int(h*min_offset_y), int(h*(1 - min_offset_y)))

? ? new_image = np.zeros([h,w,3])
? ? new_image[:cuty, :cutx, :] = image_datas[0][:cuty, :cutx, :]
? ? new_image[cuty:, :cutx, :] = image_datas[1][cuty:, :cutx, :]
? ? new_image[cuty:, cutx:, :] = image_datas[2][cuty:, cutx:, :]
? ? new_image[:cuty, cutx:, :] = image_datas[3][:cuty, cutx:, :]

? ? # 對框進行進一步的處理
? ? new_boxes = merge_bboxes(box_datas, cutx, cuty)

? ? return new_image, new_boxes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
b)、Label Smoothing平滑
標簽平滑的思想很簡單,具體公式如下:

new_onehot_labels = onehot_labels * (1 - label_smoothing) + label_smoothing / num_classes
1
當label_smoothing的值為0.01得時候,公式變成如下所示:

new_onehot_labels = y * (1 - 0.01) + 0.01 / num_classes
1
其實Label Smoothing平滑就是將標簽進行一個平滑,原始的標簽是0、1,在平滑后變成0.005(如果是二分類)、0.995,也就是說對分類準確做了一點懲罰,讓模型不可以分類的太準確,太準確容易過擬合。

實現代碼如下:

#---------------------------------------------------#
# ? 平滑標簽
#---------------------------------------------------#
def _smooth_labels(y_true, label_smoothing):
? ? num_classes = K.shape(y_true)[-1],
? ? label_smoothing = K.constant(label_smoothing, dtype=K.floatx())
? ? return y_true * (1.0 - label_smoothing) + label_smoothing / num_classes
1
2
3
4
5
6
7
c)、CIOU
IoU是比值的概念,對目標物體的scale是不敏感的。然而常用的BBox的回歸損失優化和IoU優化不是完全等價的,尋常的IoU無法直接優化沒有重疊的部分。

于是有人提出直接使用IOU作為回歸優化loss,CIOU是其中非常優秀的一種想法。

CIOU將目標與anchor之間的距離,重疊率、尺度以及懲罰項都考慮進去,使得目標框回歸變得更加穩定,不會像IoU和GIoU一樣出現訓練過程中發散等問題。而懲罰因子把預測框長寬比擬合目標框的長寬比考慮進去。


CIOU公式如下
CIOU=IOU?ρ2(b,bgt)c2?αvCIOU = IOU - \frac{\rho^2(b,b^{gt})}{c^2} - \alpha v
CIOU=IOU??
c?
2
?
ρ?
2
?(b,b?
gt
?)
??? ?
??αv

其中,ρ2(b,bgt)\rho^2(b,b^{gt})ρ?
2
?(b,b?
gt
?)分別代表了預測框和真實框的中心點的歐式距離。 c代表的是能夠同時包含預測框和真實框的最小閉包區域的對角線距離。

而α\alphaα和vvv的公式如下
α=v1?IOU+v\alpha = \frac{v}{1-IOU+v}
α=?
1?IOU+v
v
??? ?
?

v=4π2(arctanwgthgt?arctanwh)2v = \frac{4}{\pi ^2}(arctan\frac{w^{gt}}{h^{gt}}-arctan\frac{w}{h})^2
v=?
π?
2
?
4
??? ?
?(arctan?
h?
gt
?
w?
gt
?
??? ?
??arctan?
h
w
??? ?
?)?
2
?

把1-CIOU就可以得到相應的LOSS了。
LOSSCIOU=1?IOU+ρ2(b,bgt)c2+αvLOSS_{CIOU} = 1 - IOU + \frac{\rho^2(b,b^{gt})}{c^2} + \alpha v
LOSS?
CIOU
??? ?
?=1?IOU+?
c?
2
?
ρ?
2
?(b,b?
gt
?)
??? ?
?+αv

def box_ciou(b1, b2):
? ? """
? ? 輸入為:
? ? ----------
? ? b1: tensor, shape=(batch, feat_w, feat_h, anchor_num, 4), xywh
? ? b2: tensor, shape=(batch, feat_w, feat_h, anchor_num, 4), xywh

? ? 返回為:
? ? -------
? ? ciou: tensor, shape=(batch, feat_w, feat_h, anchor_num, 1)
? ? """
? ? # 求出預測框左上角右下角
? ? b1_xy = b1[..., :2]
? ? b1_wh = b1[..., 2:4]
? ? b1_wh_half = b1_wh/2.
? ? b1_mins = b1_xy - b1_wh_half
? ? b1_maxes = b1_xy + b1_wh_half
? ? # 求出真實框左上角右下角
? ? b2_xy = b2[..., :2]
? ? b2_wh = b2[..., 2:4]
? ? b2_wh_half = b2_wh/2.
? ? b2_mins = b2_xy - b2_wh_half
? ? b2_maxes = b2_xy + b2_wh_half

? ? # 求真實框和預測框所有的iou
? ? intersect_mins = K.maximum(b1_mins, b2_mins)
? ? intersect_maxes = K.minimum(b1_maxes, b2_maxes)
? ? intersect_wh = K.maximum(intersect_maxes - intersect_mins, 0.)
? ? intersect_area = intersect_wh[..., 0] * intersect_wh[..., 1]
? ? b1_area = b1_wh[..., 0] * b1_wh[..., 1]
? ? b2_area = b2_wh[..., 0] * b2_wh[..., 1]
? ? union_area = b1_area + b2_area - intersect_area
? ? iou = intersect_area / (union_area + K.epsilon())

? ? # 計算中心的差距
? ? center_distance = K.sum(K.square(b1_xy - b2_xy), axis=-1)
? ? # 找到包裹兩個框的最小框的左上角和右下角
? ? enclose_mins = K.minimum(b1_mins, b2_mins)
? ? enclose_maxes = K.maximum(b1_maxes, b2_maxes)
? ? enclose_wh = K.maximum(enclose_maxes - enclose_mins, 0.0)
? ? # 計算對角線距離
? ? enclose_diagonal = K.sum(K.square(enclose_wh), axis=-1)
? ? # calculate ciou, add epsilon in denominator to avoid dividing by 0
? ? ciou = iou - 1.0 * (center_distance) / (enclose_diagonal + K.epsilon())

? ? # calculate param v and alpha to extend to CIoU
? ? v = 4*K.square(tf.math.atan2(b1_wh[..., 0], b1_wh[..., 1]) - tf.math.atan2(b2_wh[..., 0], b2_wh[..., 1])) / (math.pi * math.pi)
? ? alpha = v / (1.0 - iou + v)
? ? ciou = ciou - alpha * v

? ? ciou = K.expand_dims(ciou, -1)
? ? return ciou
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
d)、學習率余弦退火衰減
余弦退火衰減法,學習率會先上升再下降,這是退火優化法的思想。(關于什么是退火算法可以百度。)

上升的時候使用線性上升,下降的時候模擬cos函數下降。

效果如圖所示:

余弦退火衰減有幾個比較必要的參數:
1、learning_rate_base:學習率最高值。
2、warmup_learning_rate:最開始的學習率。
3、warmup_steps:多少步長后到達頂峰值。

實現方式如下,利用Callback實現,與普通的ReduceLROnPlateau調用方式類似:

import numpy as np
import matplotlib.pyplot as plt
import keras
from keras import backend as K
from keras.layers import Flatten,Conv2D,Dropout,Input,Dense,MaxPooling2D
from keras.models import Model

def cosine_decay_with_warmup(global_step,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?learning_rate_base,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?total_steps,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?warmup_learning_rate=0.0,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?warmup_steps=0,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?hold_base_rate_steps=0,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?min_learn_rate=0,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?):
? ? """
? ? 參數:
? ? ? ? ? ? global_step: 上面定義的Tcur,記錄當前執行的步數。
? ? ? ? ? ? learning_rate_base:預先設置的學習率,當warm_up階段學習率增加到learning_rate_base,就開始學習率下降。
? ? ? ? ? ? total_steps: 是總的訓練的步數,等于epoch*sample_count/batch_size,(sample_count是樣本總數,epoch是總的循環次數)
? ? ? ? ? ? warmup_learning_rate: 這是warm up階段線性增長的初始值
? ? ? ? ? ? warmup_steps: warm_up總的需要持續的步數
? ? ? ? ? ? hold_base_rate_steps: 這是可選的參數,即當warm up階段結束后保持學習率不變,知道hold_base_rate_steps結束后才開始學習率下降
? ? """
? ? if total_steps < warmup_steps:
? ? ? ? raise ValueError('total_steps must be larger or equal to '
? ? ? ? ? ? ? ? ? ? ? ? ? ? 'warmup_steps.')
? ? #這里實現了余弦退火的原理,設置學習率的最小值為0,所以簡化了表達式
? ? learning_rate = 0.5 * learning_rate_base * (1 + np.cos(np.pi *
? ? ? ? (global_step - warmup_steps - hold_base_rate_steps) / float(total_steps - warmup_steps - hold_base_rate_steps)))
? ? #如果hold_base_rate_steps大于0,表明在warm up結束后學習率在一定步數內保持不變
? ? if hold_base_rate_steps > 0:
? ? ? ? learning_rate = np.where(global_step > warmup_steps + hold_base_rate_steps,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? learning_rate, learning_rate_base)
? ? if warmup_steps > 0:
? ? ? ? if learning_rate_base < warmup_learning_rate:
? ? ? ? ? ? raise ValueError('learning_rate_base must be larger or equal to '
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 'warmup_learning_rate.')
? ? ? ? #線性增長的實現
? ? ? ? slope = (learning_rate_base - warmup_learning_rate) / warmup_steps
? ? ? ? warmup_rate = slope * global_step + warmup_learning_rate
? ? ? ? #只有當global_step 仍然處于warm up階段才會使用線性增長的學習率warmup_rate,否則使用余弦退火的學習率learning_rate
? ? ? ? learning_rate = np.where(global_step < warmup_steps, warmup_rate,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? learning_rate)

? ? learning_rate = max(learning_rate,min_learn_rate)
? ? return learning_rate


class WarmUpCosineDecayScheduler(keras.callbacks.Callback):
? ? """
? ? 繼承Callback,實現對學習率的調度
? ? """
? ? def __init__(self,
? ? ? ? ? ? ? ? ?learning_rate_base,
? ? ? ? ? ? ? ? ?total_steps,
? ? ? ? ? ? ? ? ?global_step_init=0,
? ? ? ? ? ? ? ? ?warmup_learning_rate=0.0,
? ? ? ? ? ? ? ? ?warmup_steps=0,
? ? ? ? ? ? ? ? ?hold_base_rate_steps=0,
? ? ? ? ? ? ? ? ?min_learn_rate=0,
? ? ? ? ? ? ? ? ?verbose=0):
? ? ? ? super(WarmUpCosineDecayScheduler, self).__init__()
? ? ? ? # 基礎的學習率
? ? ? ? self.learning_rate_base = learning_rate_base
? ? ? ? # 總共的步數,訓練完所有世代的步數epochs * sample_count / batch_size
? ? ? ? self.total_steps = total_steps
? ? ? ? # 全局初始化step
? ? ? ? self.global_step = global_step_init
? ? ? ? # 熱調整參數
? ? ? ? self.warmup_learning_rate = warmup_learning_rate
? ? ? ? # 熱調整步長,warmup_epoch * sample_count / batch_size
? ? ? ? self.warmup_steps = warmup_steps
? ? ? ? self.hold_base_rate_steps = hold_base_rate_steps
? ? ? ? # 參數顯示 ?
? ? ? ? self.verbose = verbose
? ? ? ? # learning_rates用于記錄每次更新后的學習率,方便圖形化觀察
? ? ? ? self.min_learn_rate = min_learn_rate
? ? ? ? self.learning_rates = []
?? ?#更新global_step,并記錄當前學習率
? ? def on_batch_end(self, batch, logs=None):
? ? ? ? self.global_step = self.global_step + 1
? ? ? ? lr = K.get_value(self.model.optimizer.lr)
? ? ? ? self.learning_rates.append(lr)
?? ?#更新學習率
? ? def on_batch_begin(self, batch, logs=None):
? ? ? ? lr = cosine_decay_with_warmup(global_step=self.global_step,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? learning_rate_base=self.learning_rate_base,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? total_steps=self.total_steps,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? warmup_learning_rate=self.warmup_learning_rate,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? warmup_steps=self.warmup_steps,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? hold_base_rate_steps=self.hold_base_rate_steps,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? min_learn_rate = self.min_learn_rate)
? ? ? ? K.set_value(self.model.optimizer.lr, lr)
? ? ? ? if self.verbose > 0:
? ? ? ? ? ? print('\nBatch %05d: setting learning '
? ? ? ? ? ? ? ? ? 'rate to %s.' % (self.global_step + 1, lr))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
2、loss組成
a)、計算loss所需參數
在計算loss的時候,實際上是y_pre和y_true之間的對比:
y_pre就是一幅圖像經過網絡之后的輸出,內部含有三個特征層的內容;其需要解碼才能夠在圖上作畫
y_true就是一個真實圖像中,它的每個真實框對應的(19,19)、(38,38)、(76,76)網格上的偏移位置、長寬與種類。其仍需要編碼才能與y_pred的結構一致
實際上y_pre和y_true內容的shape都是
(batch_size,19,19,3,85)
(batch_size,38,38,3,85)
(batch_size,76,76,3,85)

b)、y_pre是什么
網絡最后輸出的內容就是三個特征層每個網格點對應的預測框及其種類,即三個特征層分別對應著圖片被分為不同size的網格后,每個網格點上三個先驗框對應的位置、置信度及其種類。
對于輸出的y1、y2、y3而言,[…, : 2]指的是相對于每個網格點的偏移量,[…, 2: 4]指的是寬和高,[…, 4: 5]指的是該框的置信度,[…, 5: ]指的是每個種類的預測概率。
現在的y_pre還是沒有解碼的,解碼了之后才是真實圖像上的情況。

c)、y_true是什么。
y_true就是一個真實圖像中,它的每個真實框對應的(19,19)、(38,38)、(76,76)網格上的偏移位置、長寬與種類。其仍需要編碼才能與y_pred的結構一致
在yolo4中,其使用了一個專門的函數用于處理讀取進來的圖片的框的真實情況。

def preprocess_true_boxes(true_boxes, input_shape, anchors, num_classes):
1
其輸入為:
true_boxes:shape為(m, T, 5)代表m張圖T個框的x_min、y_min、x_max、y_max、class_id。
input_shape:輸入的形狀,此處為608、608
anchors:代表9個先驗框的大小
num_classes:種類的數量。
其實對真實框的處理是將真實框轉化成圖片中相對網格的xyhw,步驟如下:
1、取框的真實值,獲取其框的中心及其寬高,除去input_shape變成比例的模式。
2、建立全為0的y_true,y_true是一個列表,包含三個特征層,shape分別為(batch_size,19,19,3,85)、(batch_size,38,38,3,85)、(batch_size,76,76,3,85)。
3、對每一張圖片處理,將每一張圖片中的真實框的wh和先驗框的wh對比,計算IOU值,選取其中IOU最高的一個,得到其所屬特征層及其網格點的位置,在對應的y_true中將內容進行保存。

for t, n in enumerate(best_anchor):
? ? for l in range(num_layers):
? ? ? ? if n in anchor_mask[l]:

? ? ? ? ? ? # 計算該目標在第l個特征層所處網格的位置
? ? ? ? ? ? i = np.floor(true_boxes[b,t,0]*grid_shapes[l][1]).astype('int32')
? ? ? ? ? ? j = np.floor(true_boxes[b,t,1]*grid_shapes[l][0]).astype('int32')

? ? ? ? ? ? # 找到best_anchor索引的索引
? ? ? ? ? ? k = anchor_mask[l].index(n)
? ? ? ? ? ? c = true_boxes[b,t, 4].astype('int32')
? ? ? ? ? ??
? ? ? ? ? ? # 保存到y_true中
? ? ? ? ? ? y_true[l][b, j, i, k, 0:4] = true_boxes[b,t, 0:4]
? ? ? ? ? ? y_true[l][b, j, i, k, 4] = 1
? ? ? ? ? ? y_true[l][b, j, i, k, 5+c] = 1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
對于最后輸出的y_true而言,只有每個圖里每個框最對應的位置有數據,其它的地方都為0。
preprocess_true_boxes全部的代碼如下:

#---------------------------------------------------#
# ? 讀入xml文件,并輸出y_true
#---------------------------------------------------#
def preprocess_true_boxes(true_boxes, input_shape, anchors, num_classes):
? ? assert (true_boxes[..., 4]<num_classes).all(), 'class id must be less than num_classes'
? ? # 一共有三個特征層數
? ? num_layers = len(anchors)//3
? ? # 先驗框
? ? # 678為116,90, ?156,198, ?373,326
? ? # 345為30,61, ?62,45, ?59,119
? ? # 012為10,13, ?16,30, ?33,23, ?
? ? anchor_mask = [[6,7,8], [3,4,5], [0,1,2]] if num_layers==3 else [[3,4,5], [1,2,3]]

? ? true_boxes = np.array(true_boxes, dtype='float32')
? ? input_shape = np.array(input_shape, dtype='int32') # 416,416
? ? # 讀出xy軸,讀出長寬
? ? # 中心點(m,n,2)
? ? boxes_xy = (true_boxes[..., 0:2] + true_boxes[..., 2:4]) // 2
? ? boxes_wh = true_boxes[..., 2:4] - true_boxes[..., 0:2]
? ? # 計算比例
? ? true_boxes[..., 0:2] = boxes_xy/input_shape[:]
? ? true_boxes[..., 2:4] = boxes_wh/input_shape[:]

? ? # m張圖
? ? m = true_boxes.shape[0]
? ? # 得到網格的shape為19,19;38,38;76,76
? ? grid_shapes = [input_shape//{0:32, 1:16, 2:8}[l] for l in range(num_layers)]
? ? # y_true的格式為(m,19,19,3,85)(m,38,38,3,85)(m,76,76,3,85)
? ? y_true = [np.zeros((m,grid_shapes[l][0],grid_shapes[l][1],len(anchor_mask[l]),5+num_classes),
? ? ? ? dtype='float32') for l in range(num_layers)]
? ? # [1,9,2]
? ? anchors = np.expand_dims(anchors, 0)
? ? anchor_maxes = anchors / 2.
? ? anchor_mins = -anchor_maxes
? ? # 長寬要大于0才有效
? ? valid_mask = boxes_wh[..., 0]>0

? ? for b in range(m):
? ? ? ? # 對每一張圖進行處理
? ? ? ? wh = boxes_wh[b, valid_mask[b]]
? ? ? ? if len(wh)==0: continue
? ? ? ? # [n,1,2]
? ? ? ? wh = np.expand_dims(wh, -2)
? ? ? ? box_maxes = wh / 2.
? ? ? ? box_mins = -box_maxes

? ? ? ? # 計算真實框和哪個先驗框最契合
? ? ? ? intersect_mins = np.maximum(box_mins, anchor_mins)
? ? ? ? intersect_maxes = np.minimum(box_maxes, anchor_maxes)
? ? ? ? intersect_wh = np.maximum(intersect_maxes - intersect_mins, 0.)
? ? ? ? intersect_area = intersect_wh[..., 0] * intersect_wh[..., 1]
? ? ? ? box_area = wh[..., 0] * wh[..., 1]
? ? ? ? anchor_area = anchors[..., 0] * anchors[..., 1]
? ? ? ? iou = intersect_area / (box_area + anchor_area - intersect_area)
? ? ? ? # 維度是(n) 感謝 消盡不死鳥 的提醒
? ? ? ? best_anchor = np.argmax(iou, axis=-1)

? ? ? ? for t, n in enumerate(best_anchor):
? ? ? ? ? ? for l in range(num_layers):
? ? ? ? ? ? ? ? if n in anchor_mask[l]:
? ? ? ? ? ? ? ? ? ? # floor用于向下取整
? ? ? ? ? ? ? ? ? ? i = np.floor(true_boxes[b,t,0]*grid_shapes[l][1]).astype('int32')
? ? ? ? ? ? ? ? ? ? j = np.floor(true_boxes[b,t,1]*grid_shapes[l][0]).astype('int32')
? ? ? ? ? ? ? ? ? ? # 找到真實框在特征層l中第b副圖像對應的位置
? ? ? ? ? ? ? ? ? ? k = anchor_mask[l].index(n)
? ? ? ? ? ? ? ? ? ? c = true_boxes[b,t, 4].astype('int32')
? ? ? ? ? ? ? ? ? ? y_true[l][b, j, i, k, 0:4] = true_boxes[b,t, 0:4]
? ? ? ? ? ? ? ? ? ? y_true[l][b, j, i, k, 4] = 1
? ? ? ? ? ? ? ? ? ? y_true[l][b, j, i, k, 5+c] = 1

? ? return y_true
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
d)、loss的計算過程
在得到了y_pre和y_true后怎么對比呢?不是簡單的減一下!

loss值需要對三個特征層進行處理,這里以最小的特征層為例。
1、利用y_true取出該特征層中真實存在目標的點的位置(m,19,19,3,1)及其對應的種類(m,19,19,3,80)。
2、將yolo_outputs的預測值輸出進行處理,得到reshape后的預測值y_pre,shape為(m,19,19,3,85)。還有解碼后的xy,wh。
3、對于每一幅圖,計算其中所有真實框與預測框的IOU,如果某些預測框和真實框的重合程度大于0.5,則忽略。
4、計算ciou作為回歸的loss,這里只計算正樣本的回歸loss。
5、計算置信度的loss,其有兩部分構成,第一部分是實際上存在目標的,預測結果中置信度的值與1對比;第二部分是實際上不存在目標的,在第四步中得到其最大IOU的值與0對比。
6、計算預測種類的loss,其計算的是實際上存在目標的,預測類與真實類的差距。

其實際上計算的總的loss是三個loss的和,這三個loss分別是:

實際存在的框,CIOU LOSS。
實際存在的框,預測結果中置信度的值與1對比;實際不存在的框,在上述步驟中,在第四步中得到其最大IOU的值與0對比。
實際存在的框,種類預測結果與實際結果的對比。
其實際代碼如下,使用yolo_loss就可以獲得loss值:

#---------------------------------------------------#
# ? 平滑標簽
#---------------------------------------------------#
def _smooth_labels(y_true, label_smoothing):
? ? num_classes = K.shape(y_true)[-1],
? ? label_smoothing = K.constant(label_smoothing, dtype=K.floatx())
? ? return y_true * (1.0 - label_smoothing) + label_smoothing / num_classes
#---------------------------------------------------#
# ? 將預測值的每個特征層調成真實值
#---------------------------------------------------#
def yolo_head(feats, anchors, num_classes, input_shape, calc_loss=False):
? ? num_anchors = len(anchors)
? ? # [1, 1, 1, num_anchors, 2]
? ? anchors_tensor = K.reshape(K.constant(anchors), [1, 1, 1, num_anchors, 2])

? ? # 獲得x,y的網格
? ? # (19,19, 1, 2)
? ? grid_shape = K.shape(feats)[1:3] # height, width
? ? grid_y = K.tile(K.reshape(K.arange(0, stop=grid_shape[0]), [-1, 1, 1, 1]),
? ? ? ? [1, grid_shape[1], 1, 1])
? ? grid_x = K.tile(K.reshape(K.arange(0, stop=grid_shape[1]), [1, -1, 1, 1]),
? ? ? ? [grid_shape[0], 1, 1, 1])
? ? grid = K.concatenate([grid_x, grid_y])
? ? grid = K.cast(grid, K.dtype(feats))

? ? # (batch_size,19,19,3,85)
? ? feats = K.reshape(feats, [-1, grid_shape[0], grid_shape[1], num_anchors, num_classes + 5])

? ? # 將預測值調成真實值
? ? # box_xy對應框的中心點
? ? # box_wh對應框的寬和高
? ? box_xy = (K.sigmoid(feats[..., :2]) + grid) / K.cast(grid_shape[::-1], K.dtype(feats))
? ? box_wh = K.exp(feats[..., 2:4]) * anchors_tensor / K.cast(input_shape[::-1], K.dtype(feats))
? ? box_confidence = K.sigmoid(feats[..., 4:5])
? ? box_class_probs = K.sigmoid(feats[..., 5:])

? ? # 在計算loss的時候返回如下參數
? ? if calc_loss == True:
? ? ? ? return grid, feats, box_xy, box_wh
? ? return box_xy, box_wh, box_confidence, box_class_probs

#---------------------------------------------------#
# ? 用于計算每個預測框與真實框的iou
#---------------------------------------------------#
def box_iou(b1, b2):
? ? # 19,19,3,1,4
? ? # 計算左上角的坐標和右下角的坐標
? ? b1 = K.expand_dims(b1, -2)
? ? b1_xy = b1[..., :2]
? ? b1_wh = b1[..., 2:4]
? ? b1_wh_half = b1_wh/2.
? ? b1_mins = b1_xy - b1_wh_half
? ? b1_maxes = b1_xy + b1_wh_half

? ? # 1,n,4
? ? # 計算左上角和右下角的坐標
? ? b2 = K.expand_dims(b2, 0)
? ? b2_xy = b2[..., :2]
? ? b2_wh = b2[..., 2:4]
? ? b2_wh_half = b2_wh/2.
? ? b2_mins = b2_xy - b2_wh_half
? ? b2_maxes = b2_xy + b2_wh_half

? ? # 計算重合面積
? ? intersect_mins = K.maximum(b1_mins, b2_mins)
? ? intersect_maxes = K.minimum(b1_maxes, b2_maxes)
? ? intersect_wh = K.maximum(intersect_maxes - intersect_mins, 0.)
? ? intersect_area = intersect_wh[..., 0] * intersect_wh[..., 1]
? ? b1_area = b1_wh[..., 0] * b1_wh[..., 1]
? ? b2_area = b2_wh[..., 0] * b2_wh[..., 1]
? ? iou = intersect_area / (b1_area + b2_area - intersect_area)

? ? return iou

#---------------------------------------------------#
# ? loss值計算
#---------------------------------------------------#
def yolo_loss(args, anchors, num_classes, ignore_thresh=.5, label_smoothing=0.1, print_loss=False):

? ? # 一共有三層
? ? num_layers = len(anchors)//3?

? ? # 將預測結果和實際ground truth分開,args是[*model_body.output, *y_true]
? ? # y_true是一個列表,包含三個特征層,shape分別為(m,19,19,3,85),(m,38,38,3,85),(m,76,76,3,85)。
? ? # yolo_outputs是一個列表,包含三個特征層,shape分別為(m,19,19,3,85),(m,38,38,3,85),(m,76,76,3,85)。
? ? y_true = args[num_layers:]
? ? yolo_outputs = args[:num_layers]

? ? # 先驗框
? ? # 678為116,90, ?156,198, ?373,326
? ? # 345為30,61, ?62,45, ?59,119
? ? # 012為10,13, ?16,30, ?33,23, ?
? ? anchor_mask = [[6,7,8], [3,4,5], [0,1,2]] if num_layers==3 else [[3,4,5], [1,2,3]]

? ? # 得到input_shpae為608,608?
? ? input_shape = K.cast(K.shape(yolo_outputs[0])[1:3] * 32, K.dtype(y_true[0]))

? ? loss = 0

? ? # 取出每一張圖片
? ? # m的值就是batch_size
? ? m = K.shape(yolo_outputs[0])[0]
? ? mf = K.cast(m, K.dtype(yolo_outputs[0]))

? ? # y_true是一個列表,包含三個特征層,shape分別為(m,19,19,3,85),(m,38,38,3,85),(m,76,76,3,85)。
? ? # yolo_outputs是一個列表,包含三個特征層,shape分別為(m,19,19,3,85),(m,38,38,3,85),(m,76,76,3,85)。
? ? for l in range(num_layers):
? ? ? ? # 以第一個特征層(m,19,19,3,85)為例子
? ? ? ? # 取出該特征層中存在目標的點的位置。(m,19,19,3,1)
? ? ? ? object_mask = y_true[l][..., 4:5]
? ? ? ? # 取出其對應的種類(m,19,19,3,80)
? ? ? ? true_class_probs = y_true[l][..., 5:]
? ? ? ? if label_smoothing:
? ? ? ? ? ? true_class_probs = _smooth_labels(true_class_probs, label_smoothing)

? ? ? ? # 將yolo_outputs的特征層輸出進行處理
? ? ? ? # grid為網格結構(19,19,1,2),raw_pred為尚未處理的預測結果(m,19,19,3,85)
? ? ? ? # 還有解碼后的xy,wh,(m,19,19,3,2)
? ? ? ? grid, raw_pred, pred_xy, pred_wh = yolo_head(yolo_outputs[l],
? ? ? ? ? ? ?anchors[anchor_mask[l]], num_classes, input_shape, calc_loss=True)
? ? ? ??
? ? ? ? # 這個是解碼后的預測的box的位置
? ? ? ? # (m,19,19,3,4)
? ? ? ? pred_box = K.concatenate([pred_xy, pred_wh])

? ? ? ? # 找到負樣本群組,第一步是創建一個數組,[]
? ? ? ? ignore_mask = tf.TensorArray(K.dtype(y_true[0]), size=1, dynamic_size=True)
? ? ? ? object_mask_bool = K.cast(object_mask, 'bool')
? ? ? ??
? ? ? ? # 對每一張圖片計算ignore_mask
? ? ? ? def loop_body(b, ignore_mask):
? ? ? ? ? ? # 取出第b副圖內,真實存在的所有的box的參數
? ? ? ? ? ? # n,4
? ? ? ? ? ? true_box = tf.boolean_mask(y_true[l][b,...,0:4], object_mask_bool[b,...,0])
? ? ? ? ? ? # 計算預測結果與真實情況的iou
? ? ? ? ? ? # pred_box為19,19,3,4
? ? ? ? ? ? # 計算的結果是每個pred_box和其它所有真實框的iou
? ? ? ? ? ? # 19,19,3,n
? ? ? ? ? ? iou = box_iou(pred_box[b], true_box)

? ? ? ? ? ? # 19,19,3,1
? ? ? ? ? ? best_iou = K.max(iou, axis=-1)

? ? ? ? ? ? # 如果某些預測框和真實框的重合程度大于0.5,則忽略。
? ? ? ? ? ? ignore_mask = ignore_mask.write(b, K.cast(best_iou<ignore_thresh, K.dtype(true_box)))
? ? ? ? ? ? return b+1, ignore_mask

? ? ? ? # 遍歷所有的圖片
? ? ? ? _, ignore_mask = K.control_flow_ops.while_loop(lambda b,*args: b<m, loop_body, [0, ignore_mask])

? ? ? ? # 將每幅圖的內容壓縮,進行處理
? ? ? ? ignore_mask = ignore_mask.stack()
? ? ? ? #(m,19,19,3,1,1)
? ? ? ? ignore_mask = K.expand_dims(ignore_mask, -1)

? ? ? ? box_loss_scale = 2 - y_true[l][...,2:3]*y_true[l][...,3:4]

? ? ? ? # Calculate ciou loss as location loss
? ? ? ? raw_true_box = y_true[l][...,0:4]
? ? ? ? ciou = box_ciou(pred_box, raw_true_box)
? ? ? ? ciou_loss = object_mask * box_loss_scale * (1 - ciou)
? ? ? ? ciou_loss = K.sum(ciou_loss) / mf
? ? ? ? location_loss = ciou_loss
? ? ? ??
? ? ? ? # 如果該位置本來有框,那么計算1與置信度的交叉熵
? ? ? ? # 如果該位置本來沒有框,而且滿足best_iou<ignore_thresh,則被認定為負樣本
? ? ? ? # best_iou<ignore_thresh用于限制負樣本數量
? ? ? ? confidence_loss = object_mask * K.binary_crossentropy(object_mask, raw_pred[...,4:5], from_logits=True)+ \
? ? ? ? ? ? (1-object_mask) * K.binary_crossentropy(object_mask, raw_pred[...,4:5], from_logits=True) * ignore_mask
? ? ? ??
? ? ? ? class_loss = object_mask * K.binary_crossentropy(true_class_probs, raw_pred[...,5:], from_logits=True)

? ? ? ? confidence_loss = K.sum(confidence_loss) / mf
? ? ? ? class_loss = K.sum(class_loss) / mf
? ? ? ? loss += location_loss + confidence_loss + class_loss
? ? ? ? if print_loss:
? ? ? ? ? ? loss = tf.Print(loss, [loss, location_loss, confidence_loss, class_loss, K.sum(ignore_mask)], message='loss: ')
? ? return loss
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
訓練自己的YOLOV4模型
yolo4整體的文件夾構架如下:

本文使用VOC格式進行訓練。
訓練前將標簽文件放在VOCdevkit文件夾下的VOC2007文件夾下的Annotation中。

訓練前將圖片文件放在VOCdevkit文件夾下的VOC2007文件夾下的JPEGImages中。

在訓練前利用voc2yolo3.py文件生成對應的txt。

再運行根目錄下的voc_annotation.py,運行前需要將classes改成你自己的classes。

classes = ["aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat", "chair", "cow", "diningtable", "dog", "horse", "motorbike", "person", "pottedplant", "sheep", "sofa", "train", "tvmonitor"]
1

就會生成對應的2007_train.txt,每一行對應其圖片位置及其真實框的位置。

在訓練前需要修改model_data里面的voc_classes.txt文件,需要將classes改成你自己的classes。

運行train.py即可開始訓練。

?

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的Keras搭建YoloV4目标检测平台的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

中文在线字幕免费观看 | 女人一区二区 | 影音先锋久久久久av综合网成人 | 少妇高潮一区二区三区99 | 国产精品videossex久久发布 | 婷婷黄色网 | 成人高清网站 | 爱蜜臀av | 96日本xxxxxⅹxxx17 | 久久婷婷av | 国产成人久久精品流白浆 | 少妇的激情 | 中出一区二区 | 高h文在线| 免费成人在线观看 | 落日余晖 | 天天爱天天做天天爽 | 天天综合av | 乱中年女人伦 | 色综合久久久 | 青草热视频 | 亚州福利 | 黄色大全在线观看 | 国产精品111| 欧美网| 午夜偷拍福利 | 毛片麻豆 | 国产成人综合精品 | 日韩人妻一区二区三区蜜桃视频 | 337p粉嫩大胆色噜噜狠狠图片 | 欧美粉嫩videosex极品 | 97国产资源| 天堂精品| 国产一国产精品一级毛片 | 精品无码人妻一区二区三区品 | 精品在线你懂的 | 男生把女生困困的视频 | 韩日精品中文字幕 | 久久久久亚洲色欲AV无码网站 | 琪琪成人| 涩涩成人 | 五十路熟母| 亚州精品国产精品乱码不99按摩 | 欧美一区二区在线观看视频 | 中文字幕+乱码+中文乱 | 极品91尤物被啪到呻吟喷水 | 2020亚洲男人天堂 | 尤物网址在线观看 | 毛片国产精品 | 高清av网站 | 影音先锋美女 | 久久久久久香蕉 | 欧美3p在线观看 | 老鸭窝av在线 | 成年免费视频 | 黄色福利片| 肉色超薄丝袜脚交一区二区图片 | 小小姑娘电影大全免费播放 | 中文不卡在线 | 日本成人一区 | 福利一区在线观看 | 自拍欧美日韩 | 日批免费看 | 日韩国产高清在线 | 久久久久人妻一区 | 美女被男人c | 久久久久久久穴 | 免费中文av | 国产亚洲精品久久久久久 | 1024亚洲 | 久久久a级片| 日本中文在线观看 | 国产精品国产 | 美女丝袜合集 | 在线观看亚洲 | 简单av在线 | 日韩中文字幕av电影 | 欧美第一页 | 欧美第七页 | 自拍偷拍第3页 | 97在线超碰 | 无码日韩精品视频 | 一级片视频免费观看 | 天天色综合天天 | 电影《走路上学》免费 | 91久久国语露脸精品国产高跟 | 欧美三级在线观看视频 | 激情婷 | 雨宫琴音一区二区三区 | 伊人论坛 | 91久久久久久久 | 韩国三级一区 | 国产高清无密码一区二区三区 | 岛国在线视频 | 国产又粗又黄又爽 | va视频在线观看 | 国产精品爽爽久久久久久 | 天天欧美| 午夜性色福利影院 | 韩国黄色片网站 | 日本少妇作爱视频 | 国产精品久久久久久久久久久久久久久久 | 伊人网成人 | 丰满大乳露双乳呻吟 | 国产成人综合一区二区三区 | 寡妇激情做爰呻吟 | 深夜福利久久 | 精品一区二区久久久久久久网站 | 99视频在线免费观看 | 一级黄色免费 | 超碰成人在线观看 | 久久久一 | 久久精品欧美一区二区三区不卡 | 久久国产激情 | 人人爽人人 | 日韩爱爱视频 | 午夜精品视频在线观看 | 国产精品 欧美 日韩 | 欧美顶级黄色大片免费 | 日韩一区二区视频 | 精品少妇人妻一区二区黑料社区 | 欧美三级午夜理伦三级老人 | www.五月激情| 一二三区在线视频 | 91精产国品一二三 | 青青草原国产在线 | 成人亚洲精品 | 国产激情无码一区二区 | 国产日韩精品一区二区三区在线 | 国产精品久久久久久久免费看 | 午夜在线观看免费视频 | 黄色成人在线网站 | 神马午夜91 | 黄网免费观看 | 欧美婷婷六月丁香综合色 | 久久国产热 | 好av在线 | 红桃视频一区二区三区免费 | 丰满熟妇肥白一区二区在线 | 四虎免费网址 | 女人性做爰24姿势视频 | 亚洲精品白浆 | 亚洲乱视频 | 在线观看特色大片免费网站 | 无遮挡毛片 | 久久久久一区二区三区四区 | 久草视频在线资源站 | 久久久资源 | 红桃视频国产 | 亚洲2022国产成人精品无码区 | 91在线在线 | 美日韩精品 | 香蕉视频啪啪 | 人人超碰在线 | 疯狂做爰的爽文多肉小说王爷 | 成人午夜sm精品久久久久久久 | 亚洲国产成人在线视频 | 拔插拔插华人 | 欧美精品久久久久久久久老牛影院 | jzzijzzij亚洲成熟少妇在线播放 狠狠躁日日躁夜夜躁2022麻豆 | 一本到久久 | 贝利弗山的秘密在线观看 | 欧美黑人激情 | 丰满熟女人妻一区二区三区 | 天天摸日日摸狠狠添 | 特黄特黄视频 | 好看的av网址 | 欧美成人国产精品高潮 | 最近2018年手机中文字幕版 | 欧美黑人做爰爽爽爽 | 狠狠老司机| 视频网站在线观看18 | 国产+日韩+欧美 | 最近免费中文字幕大全免费版视频 | 91精品999| 无码精品人妻一区二区 | 黄色网址链接 | 啪免费视频 | 无码任你躁久久久久久老妇 | 成人tiktok黄短视频 | 亚洲九九夜夜 | 一区二区三区偷拍 | 国产传媒视频在线 | 欧美日韩一区二区三区 | 国产成人在线免费观看视频 | 海角社区id:1220.7126,10. | 手机在线观看日韩av | 国产外围在线 | 青青草视频黄 | 亚洲综合在线五月 | 亚洲精品精品 | 色婷婷av一区二区三区四区 | 蜜桃色999 | 野外一级片 | 日本黄色一区二区三区 | 日本黄页网址 | 小毛片在线观看 | 女攻总攻大胸奶汁(高h) | 精品欧美色视频网站在线观看 | 久久久久久久极品内射 | 在线亚洲精品 | 国产成人黄色 | 在线97视频 | 日本东京热一区二区三区 | 美女精品网站 | 97成人超碰 | 插插插91| 久久精品一日日躁夜夜躁 | 九九久久国产视频 | 国产精品丝袜在线观看 | 一道本久在线中文字幕 | 超碰2021| 久久久精品一区二区三区 | 亚洲av无码专区在线播放中文 | 五月激情综合 | 亚洲国产精品综合久久久 | 免费中文字幕日韩 | 国产精品天天av精麻传媒 | 国产激情网址 | 啪啪网站免费观看 | 日本性高潮视频 | 日本中文有码 | 国产午夜福利片 | av网址在线免费观看 | 国产精品成人在线观看 | 四虎国产 | 成人av中文字幕 | 亚洲视频在线播放 | 国产香蕉视频 | 欧美成人一级片 | 大又大又粗又硬又爽少妇毛片 | 久久国产亚洲 | 91欧美成人 | 久久久久久久久97 | 亚洲成人无码久久 | 亚洲狼人色 | 噜噜噜精品欧美成人 | 午夜视频免费在线 | 亚洲永久精品一区 | 色眯眯影视 | 日本精品在线观看 | 久久久久久久久久电影 | 日韩欧美国产精品综合嫩v 国产小毛片 | 黄视频免费观看 | 国产在线欧美 | 中文字幕av影片 | 午夜在线观看影院 | 亚洲国产精品无码专区 | 色天天色 | 动漫毛片 | 欧美精品成人一区二区在线观看 | 天天色天天操天天射 | 亚洲一区中文 | 亚洲性生活网站 | 亚洲精品视频在线 | 成人开心网 | www伊人网| 欧美bbbbb | 一级片在线观看视频 | 国产中文在线观看 | 国产精品美女久久久久av爽 | 无码人妻丰满熟妇区五十路百度 | 怡红院最新网址 | 国产h在线观看 | 嫩草影院中文字幕 | 久草视频精品 | 国产精品国产三级国产aⅴ原创 | 欧美激情在线一区二区 | av香蕉| 日韩一片| 男女天堂av | 欧洲精品久久久 | 亚洲黄色大全 | 亚洲av无码久久精品色欲 | 色撸撸在线视频 | 韩日精品在线观看 | 国产美女91 | 成人h动漫精品一区二区下载 | 国产婷婷精品 | 久久手机看片 | 国产美女福利在线 | 女人下边被添全过视频 | av噜噜 | 91av视频在线观看 | 手机福利在线 | 最新日韩视频 | 在线污视频 | 亚洲精品av中文字幕在线在线 | 日韩激情精品 | 亚洲一区图片 | 黄色精品一区 | 国产chinesehd天美传媒 | 自拍av在线 | 99精品视频在线免费观看 | 国产成年无码久久久久毛片 | 欧美日韩黄色片 | 亚洲男女在线 | 韩国成人在线视频 | 好av在线| 麻豆视频国产精品 | 久久99视频精品 | 美女的诞生免费观看在线高清 | 欧美aⅴ在线 | 在线午夜电影 | 樱花草涩涩www在线播放 | 精品少妇人妻av免费久久久 | 麻豆av一区二区三区在线观看 | 五月天狠狠操 | free女性xx性老大太 | 最新成人在线 | 欧美色资源 | 欧美日本在线视频 | 亚洲二区在线视频 | 精品人妻无码一区二区三区换脸 | jizz在线播放 | 国产精品日日摸夜夜爽 | 97看片吧 | 2017狠狠干| 国产超91 | 自拍偷拍国产 | 精品久久久无码中文字幕 | 又黄又爽视频 | 日韩av在线一区二区三区 | 秋霞毛片 | 国产一区二区三区免费观看 | 免费视频91蜜桃 | 在线观看av的网址 | 91啪在线观看 | 影音先锋制服 | 人妻精品一区 | 一级不卡 | 国产丰满农村老妇女乱 | 欧美黄页在线观看 | 幸福,触手可及 | 老外黄色一级片 | 午夜爱爱网站 | 久久这里只有精品23 | 爱上av| 亚洲免费黄网 | 午夜性生活视频 | 关秀媚三级 | 久久97| 新天堂av| 免费成人激情视频 | 成人午夜激情影院 | 老司机av福利 | 亚洲一区二区久久久 | 久久影视av | 亚洲久久成人 | 久久99精品久久久久久噜噜 | 韩日激情视频 | 亚洲成人福利在线 | 亚洲图片综合网 | 不卡福利视频 | 成人久久久久 | 免费av成人| 色呦呦国产精品 | 在线播放国产视频 | 91一区二区在线观看 | 日本一区二区三区在线看 | 999精品一区 | 中国极品少妇xxxx | 一区二区三区精品国产 | 狠狠干2018| 日本天堂在线 | 亚洲一二三在线 | 亚洲美女久久 | 日韩丰满少妇无码内射 | 亚洲欧美自拍偷拍 | 欧洲激情网 | 六月丁香婷婷激情 | 超碰精品在线观看 | 添女人荫蒂视频 | 吃奶摸下的激烈视频 | 色一情一交一乱一区二区三区 | 超碰在线色| 欧美成人免费大片 | 国产免费av一区二区 | 免费久久av | 丝袜操 | 理论片91| 天天想你在线观看完整版电影免费 | 亚洲欧洲视频 | 欧美专区亚洲专区 | 韩国av电影网站 | 久久嗨| 欧美精品一区二区蜜桃 | 亚洲人在线| 午夜理伦三级做爰电影 | 色屁屁网站 | 国产精品国产精品 | 蜜桃臀av在线 | 九九九九九九精品 | 男同志毛片特黄毛片 | 亚洲永久精品一区二区 | 日本久久激情 | jlzzjlzz亚洲日本少妇 | 特级新鲜大片片 | 亚洲骚| 亚洲精品国产精 | 五月天婷婷综合网 | 日本免费一二三区 | 特级黄色录像 | 天堂国产在线 | 久草一区二区 | 日韩一级久久 | 在线免费日韩av | 性做久久久久久久久久 | 一区二区三区在线视频观看 | 黑料视频在线 | 97精品国产97久久久久久春色 | av激情久久 | www爱爱| 少妇特殊按摩高潮惨叫无码 | 性奶老妇 视频 | 桃花岛影院 | 一本久久综合亚洲鲁鲁五月天 | 亚洲影视一区二区 | 欧美一区二区三区大屁股撅起来 | 在线黄色免费 | 99色热| 国产欧美精品一区二区三区app | www.777奇米| 日本美女性高潮 | 农村老女人av | 五月婷婷,六月丁香 | 黄色免费播放 | 婷婷激情综合网 | 中文字幕在线视频第一页 | 日韩av成人在线观看 | 看黄色一级视频 | 香蕉综合网 | 欧美 在线| 日韩在线精品强乱中文字幕 | 98av视频| 久久综合激的五月天 | 中文字幕一区二区三区在线观看 | 国产无遮挡又黄又爽免费视频 | 久久精品国产免费看久久精品 | 亚洲1024 | 亚洲av无码一区东京热久久 | 成人在线高清视频 | 午夜18视频在线观看 | 国产精品成人电影在线观看 | 噜噜色综合 | 亚洲综合免费观看高清完整版 | 国产小视频在线观看 | 久久久久久久国产精品 | 色妞干网| 国产精品一区二区无码对白 | 久久97人妻无码一区二区三区 | 成人做爰100| 国产亚洲欧美日韩高清 | 亚洲 国产 欧美 日韩 | 韩日少妇 | 亚洲AV无码国产精品午夜字幕 | www欧美色 | 曰批女人视频在线观看 | 美国黄色一级大片 | 久久综合色鬼 | 亚洲国产果冻传媒av在线观看 | 成人短视频在线免费观看 | 欧美猛操| 动漫av在线播放 | 国产va亚洲va在线va | 免费毛片基地 | 91免费视频大全 | 国产精品传媒在线 | 日批视频在线免费看 | 日本少妇做爰全过程毛片 | 国产白浆在线 | 大屁股白浆一区二区三区 | 无码人妻av一区二区三区波多野 | 国产成人99久久亚洲综合精品 | 亚洲综合视频在线播放 | 成人精品国产免费网站 | 成人免费片 | 在线看片黄 | 久久婷婷影视 | 丁香色婷婷 | 国产美女被遭强高潮免费网站 | 中文在线资源 | 在线视频1卡二卡三卡 | 国产一区二区免费在线观看 | 成人无码视频 | 久热精品在线视频 | 久久免费在线视频 | 日韩在线播放中文字幕 | 国产第一毛片 | 欧美精品人妻一区二区 | 亚洲熟妇国产熟妇肥婆 | 狠狠躁18三区二区一区 | 日本免费在线视频观看 | 亚洲人成电影一区二区在线 | 免费人成在线观看网站 | 欧美性猛交xxxx | 国产91专区 | 色呦呦一区 | 人人射人人射 | 国产亚洲欧美日韩精品 | 亚洲综合日韩在线 | 在线观看色网站 | 日本h片在线观看 | 偷自在线 | 激情六月天 | 黄色一级片视频 | 四虎影视在线播放 | 婷婷四房综合激情五月 | 怡红院成永久免费人全部视频 | 久草视频观看 | 97色在线视频 | 午夜看毛片| 爱情岛亚洲首页论坛小巨 | 亚洲理论电影在线观看 | jizz免费在线观看 | 懂色av成人一区二区三区 | 国产欧美视频一区二区 | 亚洲人在线观看视频 | 日韩av无码一区二区三区 | 天天干天天谢 | 91偷拍富婆spa盗摄在线 | 免费av福利 | 国产主播在线看 | 美女黄色免费网站 | 成色网 | 免费在线日韩 | 尹人久久 | 亚洲丝袜中文字幕 | 国产寡妇亲子伦一区二区三区四区 | 一区二区不卡在线观看 | 国产一区不卡在线 | 国产精品高清无码在线观看 | 99综合久久| 国产又大又粗又长 | 精品日韩在线视频 | aa视频网站| av女优天堂在线观看 | 潘金莲一级淫片aaaaaaa | 亚洲精品乱码久久久久久写真 | 欧美亚洲视频一区 | 老熟妇仑乱一区二区av | 久久国产欧美 | 久久久久久久久久电影 | 久久情趣视频 | 久久这里只有精品8 | 亚洲激情视频在线观看 | 香蕉影院在线观看 | av一卡二卡 | 国产777| 国产精品一区二区三区在线免费观看 | 婷婷激情视频 | 色老久久 | 国产欧美又粗又猛又爽 | 成人av在线网址 | 91成人在线看 | 在线麻豆| 色葡萄影院 | 黑丝国产在线 | 国产片免费 | 国产精品自拍av | 欧美性受xxxx狂喷水 | 99精品网站 | www日本高清视频 | 久久夜精 | 波多野结衣啪啪 | 精品影片一区二区入口 | 国产又粗又猛又爽又黄的网站 | 欧美人与性动交α欧美片 | 国产婷婷一区二区三区 | 中文字幕亚洲欧美日韩 | julia一区二区三区中文字幕 | 国产成人精品视频在线观看 | 熟妇人妻无乱码中文字幕真矢织江 | 福利小视频在线播放 | 韩国伦理在线视频 | 成人福利视频 | 成人动漫h在线观看 | eeuss国产一区二区三区黑人 | 国产精品嫩草影院av蜜臀 | 可以直接看av的网址 | 成人av黄色 | a级免费毛片 | 亚洲三级图片 | 久久久一二三区 | tube极品少妇videos | 欧美黑人一区 | 欧美在线视频免费播放 | 日本少妇xxxxx | 国精品无码一区二区三区 | 国产人妻一区二区三区四区五区六 | 国产一区观看 | 最污网站在线观看 | 九九视频免费看 | 18禁裸乳无遮挡啪啪无码免费 | 日本h片在线观看 | 黄色网址www | 国产综合影院 | 亚洲视频在线免费观看 | 久久久伦理片 | 日本www在线 | 男女激情大尺度做爰视频 | 重囗味sm一区二区三区 | 一本大道久久 | 在线观看不卡av | 人妻体内射精一区二区三区 | av不卡在线免费观看 | 爱爱小视频网站 | 91精产国品一二三 | 免费精品视频一区二区三区 | 日本va欧美va国产激情 | 夜夜撸影院| 亚洲精品第二页 | 99ri视频 | 4438激情网| 国产a级免费视频 | 亚洲精品97久久 | 欧美成人r级一区二区三区 中文无码一区二区三区在线观看 | 17c国产精品| 麻豆精品久久久久久久99蜜桃 | 亚洲国产精品久久久久爰性色 | 99热黄色| 特级免费毛片 | 欧美视频免费在线 | 一级片一级| 在线观看色 | 久久综合狠狠综合久久综合88 | 91精品视频免费 | 天天色综合天天 | 九九九九九精品 | 狠狠干在线视频 | 成人在线综合 | 日本黄色免费观看 | 国产农村乱对白刺激视频 | 黄色免费一级视频 | www.伊人.com| 亚洲午夜精品一区二区三区他趣 | 国产成人精品在线观看 | 成人免费看视频 | 夜夜嗨av禁果av粉嫩av懂色av | 蜜臀av一区二区三区有限公司 | 精东传媒在线 | 亚洲色图 一区二区 | 欧美xxxx18 | 成人在线a | av色图在线 | 久久久综合 | 亚洲涩涩网 | 亚洲区小说区图片区qvod | 久久久999国产| 欧美日韩一二三四区 | 可以免费看污视频的网站 | 国产综合久久久久 | 久久精品蜜桃 | 欧美日本韩国一区 | 欧美亚洲精品一区 | 亚欧在线| 色噜噜色综合 | 成人黄色大全 | 久久久久女| 免费网站www在线观看 | 午夜激情电影在线观看 | 青草青草视频 | 天天想你在线观看完整版电影高清 | 免费在线成人av | 日韩视频在线观看一区二区 | 99成人精品 | 国产美女一级视频 | 女人叫床高潮娇喘声录音mp3 | 日韩女优在线播放 | 妞干网这里只有精品 | 日本亲子乱子伦xxxx50路 | 夜夜骚av一区二区三区 | 国产福利一区二区视频 | 九九热九九 | 秋霞毛片| 欧美挤奶吃奶水xxxxx | 99热这里只有精品18 | 在线观看9.1 | 午夜电影一区 | 人妻体内射精一区二区 | 奇米精品一区二区三区在线观看 | 国产粉嫩在线观看 | 国产99对白在线播放 | 精品国产一区一区二区三亚瑟 | 国产福利合集 | 日本伦理一区二区 | 精品在线第一页 | 虫族全黄h全肉污文 | 免费av手机在线观看 | 96精品国产 | 国产美女福利视频 | 国产又粗又黄又爽 | 欧美一线高本道 | 很黄很污的视频 | 男生看的污网站 | 午夜在线不卡 | 久久久无码精品亚洲无少妇 | 少妇一级淫片免费放中国 | 色视频网址 | 亚洲影音 | 国产在线视频自拍 | 草草地址线路①屁屁影院成人 | 亚洲精品视频在线看 | 91中文字幕在线播放 | 中文字幕无线码 | 人人人妻人人澡人人爽欧美一区 | 草草在线视频 | 色哟哟日韩精品 | 欧美99久久精品乱码影视 | 日本在线不卡一区 | 欧美男同又粗又长又大 | 白浆四溢| 国产成人短视频 | 欧美国产不卡 | 伊人伊人网| 日韩欧美自拍 | 久久精品视频一区 | 午夜大片| 国产无遮挡一区二区三区毛片日本 | 亚洲精品无码久久久久 | 国产电影一区二区三区 | 成人在线一区二区三区 | 成人免费看片在线观看 | 日韩精品2区 | 5a毛片 | 国产精品对白 | 懂色av一区二区在线播放 | 老女人一毛片 | 手机看黄色| av片在线观看免费 | 国产日韩在线免费观看 | 成人精品区 | 丰满饥渴老女人hd | 国产激情一区二区三区在线观看 | 国产精品羞羞答答在线观看 | 国产精品毛片久久久久久久av | 99riAv国产精品无码鲁大师 | jizz成人| 麻豆毛片 | 婷婷在线免费 | 白白色免费视频 | 中文字幕一区二区三区四区欧美 | 国产日韩欧美在线观看视频 | 人人干天天操 | 久久久一区二区三区四区 | 奇米888一区二区三区 | 国产精品亚洲一区二区三区 | 国产专区一区 | 欧美亚洲国产一区 | 九九精品久久 | 8x8x最新网址 | 日韩一级完整毛片 | 国产福利一区二区三区 | xx99小雪| 国产精品20p | 亚洲色图一区二区 | 1024福利| 国产又爽又黄免费软件 | jizz中国女人 | 一久久久久 | 国产精品一区二区在线观看 | 波多野结衣欲乱上班族 | 亚洲逼逼 | 亚洲精品乱码久久久久久不卡 | 91精品影视 | 少妇无码一区二区三区免费 | 91在线观| 乖女从小调教h尿便器小说 欧美韩一区二区 | 欧美激情中文字幕 | 欧美成人福利视频 | av色图| 亚洲视频一区二区三区 | 免费看黄在线观看 | 欧美xxxx视频 | 国产毛片久久久久久久 | 国产欧美日韩另类 | 久热精品视频 | 成人欧美视频在线观看 | 色综合图片区 | 国产黄色大片在线观看 | 久久久久久久久久久影院 | 久久精品男人 | 蜜桃免费av | 男女激情网址 | 中文在线字幕免费观看电 | 人人超碰在线 | 国产露出视频 | 欧美性一级片 | 色欲久久久天天天综合网精品 | 中文字幕在线观看网址 | 丝袜福利视频 | 羞羞涩涩视频 | 亚洲精品精品 | 国产av无码专区亚洲av麻豆 | 国产aⅴ| 亚洲美女视频一区 | www久久99 | 天天色天天爽 | 中文字幕第十二页 | 碰超在线| 三区在线观看 | 黄色网战大全 | 亚州精品视频 | 欧美中文一区 | 黄色无毒网站 | 96免费视频 | 色五夜| 国产欧美一区二区三区鸳鸯浴 | 国产激情亚洲 | 午夜一区在线 | 青青插 | 国产精品网友自拍 | 日产电影一区二区三区 | 噜噜色综合 | 国产午夜精品一区 | 久操av在线 | 少妇又色又紧又大爽又刺激 | 久久久久久久久久久av | 成人区人妻精品一熟女 | 久草观看视频 | 青青久久av | 精品久久久久中文慕人妻 | 实拍女处破www免费看 | 极品女神无套呻吟啪啪 | 一区二区三区视频在线观看 | 在线免费观看av网 | 国产精品蜜臀 | 69久久精品无码一区二区 | 精品色哟哟 | 女人扒开屁股让我添 | 9.1成人看片 | 国产一级爽片 | 黄色永久网站 | 精品一区二区三区在线观看视频 | 麻豆视频传媒入口 | 黄色小视频在线播放 | 黑人与日本少妇高潮 | 韩国三级免费 | 欧美精品久久久久性色 | 亚洲欧美综合一区二区 | 中文字幕一区二区三三 | 国内av| 日韩手机在线视频 | 双性尿奴穿贞c带憋尿 | 综合色久 | 中文字幕观看视频 | 日韩va中文 | 91久久久久 | 西欧毛片| 国产成人精品免费在线观看 | 婷婷六月天 | 免费av影片 | 亚洲av中文无码乱人伦在线观看 | 亚洲人妖在线 | 久草视频这里只有精品 | 成人免费久久 | 久久久毛片 | 亚洲永久无码精品一区二区 | 97超碰碰 | 插插宗合网 | 四虎永久免费在线观看 | 人妻精品久久久久中文 | yjizz视频网| 久久精品国产清自在天天线 | 国产91免费观看 | 亚欧三级| 欧美性教育视频 | 国产麻豆午夜三级精品 | 久色视频在线观看 | 国产骚b | 国产乱淫精品一区二区三区毛片 | 草草在线观看视频 | 国产一级啪啪 | 精品一区二区在线免费观看 | 国产精品96久久久久久 | 乱色精品无码一区二区国产盗 | www在线 | 国内精品久久久久久久影视简单 | 成人精品国产免费网站 | 九九综合网 | 精品国产91久久久久久 | 欧美性猛交xxxx乱大交hd | 自拍啪啪 | 男人插入女人下面的视频 | 国产日产精品一区二区三区四区 | 国产69精品一区二区 | 女生和男生一起插插插 | 国产奶水涨喷在线播放 | 日韩一区二区免费播放 | 免费一级全黄少妇性色生活片 | 日本激情免费 | 女人和拘做爰正片视频 | 爱乃なみ加勒比在线播放 | 国产h片在线观看 | 色窝窝综合色窝窝久久 | 99精品国自产在线 | 中日黄色片| 中文字幕五码 | 91成人免费看片 | 北条麻妃一区二区三区免费 | 黄色午夜网站 | 国产伦精品一区二区三区高清版 | 四虎在线免费 | 福利免费观看 | 日韩午夜精品视频 | 8x8ⅹ国产精品一区二区 | 99re6热在线精品视频播放 | 男女插插视频 | 国产女人呻吟高潮抽搐声 | 在线观看av中文字幕 | 波多野结衣在线免费视频 | 精品国产人妻一区二区三区 | 欧美一区二区最爽乱淫视频免费看 | 人人妻人人澡人人爽人人dvd | 爱爱爱网| 日韩中出在线 | 进去里片欧美 | 中文文字幕文字幕高清 | 337p粉嫩日本欧洲亚洲大胆 | 九九热在线视频免费观看 | 国产精品一区二区三区久久 | 国产成人精品免高潮在线观看 | 激情婷婷六月天 | 日韩欧美一区在线观看 | 少妇荡乳情欲办公室456视频 | 日韩网站在线 | 亚洲美女性视频 | а√天堂www在线天堂小说 | 激情三区 | 小镇姑娘国语版在线观看免费 | 一级性生活大片 | 亚洲一线在线观看 | 久久久性色精品国产免费观看 | 精品久久久久久久久久久久久 | 在线观看日韩视频 | 成人国产亚洲 | 一区二区三区入口 | 暖暖av| 中文字幕日韩一区二区三区不卡 | 相亲对象是问题学生动漫免费观看 | 国模精品视频一区二区 | 国产伦精品一区二区三区四区视频 | 美女被娇喘流出白 | 欧洲精品视频在线观看 | 久久94| 久久亚洲无码视频 | 久久综合影院 | 中文字字幕码一二三区 | 国产视频综合 | 欧美一区二区三区精品 | 看片日韩 | 欧美一区二区视频免费观看 | 欧美色综合网 | 相亲对象是问题学生动漫免费观看 | 天堂中文字幕在线 | 国产一级片黄色 | 国产91精| 国产精品88 | 99久久久国产精品免费蜜臀 | 在线观看国产精品视频 | 色哟哟视频在线 | 亚洲4438 | 日韩精品视频在线观看网站 | 波多野结衣电车痴汉 | 一级一片免费看 | 国产久视频 | 男人添女人下部高潮视频 | www.中文字幕 | 天堂网2014av| 激情av网 | 亚洲高潮无码久久 | 手机在线看黄色 | 国产一区二区激情 | 欧美中日韩在线 | 欧美不卡在线观看 | 91麻豆精品久久久久蜜臀 | 美女少妇毛片 | 麻豆精品在线 | 爱插网| 人人妻人人澡人人爽人人精品 | 国产情侣91 | 漂亮少妇高潮午夜精品 | 黑巨茎大战欧美白妞 | 在线免费一级片 | 日本一区二区三区免费电影 | 欧美日韩中文字幕一区二区三区 | 久久久国产视频 | 国产精品久久久久久久9999 | 自拍 偷拍 欧美 | 成人激情片 | 蜜桃成熟时李丽珍国语 | 欧美黄色a级大片 | 国产无码精品视频 | h视频网站在线观看 | 国产精久 | 中文字幕视频在线观看 | 在线看片一区二区 | 欧美欧美欧美欧美 | 亚洲爽爽 | 大香蕉精品一区 | 久久久国产精品视频 | 99热一区二区三区 | 久久久久久久综合色一本 | 日韩精品一区二区视频 | 日韩视频免费观看高清 | 神马一区二区三区 | 欧美熟妇激情一区二区三区 | 日本人六九视频 | 国产高清免费 | 亚洲AV无码乱码国产精品色欲 | 亚洲天堂区| 尤物国产视频 | 懂色av中文字幕 | 亚洲爱爱图 | 久草中文网 | 国产乱码精品一区二区三区不卡 | 成年在线观看视频 | 欧美h视频在线观看 | 97小视频| 最色网站 | 在线观看中出 | 日本欧美一区二区三区 | 一二三四区在线 | 国产精品一级视频 | 啪啪在线视频 | 色综合色婷婷 | 最新自拍偷拍 | 日韩精品在线视频免费观看 | 秋霞av在线 | 亚洲无av在线中文字幕 | 欧洲女女同videos | 性一交一黄一片 | 欧美成在线观看 | 久久久久18 | 久久99精品久久久久久三级 | 嫩草国产在线 | 日韩成人在线观看视频 | 亚洲欧洲免费 | 蜜臀精品一区二区三区 | 伊人影院视频 | 国产色一区二区 | 日韩av午夜 | 在线视频 亚洲 | 奴性白洁会所调教 | 免费午夜激情 | 欧美性69| 黄色成人免费观看 | 国产精品伦理 | 成人午夜免费在线 | av综合色 | 国产美女精品视频 | 日本高清视频在线观看 | 超碰人人91 | 日韩视频在线观看二区 | 超碰极品| 亚洲精选av | re久久| 91久久国产综合久久91精品网站 | 久久7777| 国产在线播放一区二区三区 | 欧美一级网址 | 久久久精品一区二区三区 | 美女扒开腿让人桶爽 | 老司机深夜网站 | 波多野结衣人妻 | 黄色字幕网| 亚洲第一区在线播放 | 美国少妇在线观看免费 | 一区二区三区av夏目彩春 | 日本黄色三级 | 探花视频在线免费观看 | 国产激情视频一区二区三区 | 日本黄色片段 | 视色网站 | 天天干夜操 | 日韩视频h| 免费精品一区二区 | 碰碰久久 | 日日夜夜撸啊撸 | 成年人深夜福利 | 久久久久久久久久久久久av | 亚洲国产精品久久久久久久 | 理论片在线观看视频 | 日韩精品在线一区 | 国产一级影院 | 日本一级淫片色费放 | 日本精品久久久久中文字幕 | av网在线播放 | 精品一区二区三区视频日产 | 91网站在线观看视频 | 成人性生交大免费看 | 午夜三级福利 | 日韩aⅴ视频 | 狼人伊人干 | 骚虎av| 精品1卡二卡三卡四卡老狼 日韩三级网 | 精品小视频 | 欧美国产日韩在线 | 麻豆传媒在线免费 | 视频二区在线 | www.伊人.com | 日韩欧美亚洲国产精品字幕久久久 | 久久精品一区二区在线观看 | 亚洲一区成人在线 | a天堂亚洲 | 国产乱淫av麻豆国产 | 一级性视频 | 亚洲一区人妻 | 午夜男人网 | 欧美日韩 一区二区三区 | 国产精品久久久久久久免费看 | 国产精品www色诱视频 | av导航网站 | 亚洲色图网站 | 中文字幕永久在线播放 | 国产欧美综合在线 | 精品一区二区中文字幕 | 日韩不卡视频在线 | 日本我不卡 | 91在线播放视频 | www天堂网| 97爱视频 | 97公开视频| 亚洲综合av一区二区三区 | av网站网址 | 国产精品久久久久999 | 探花视频在线观看 | 欧美日韩中文字幕在线观看 | 欧美一级片免费看 | 浪潮av色| 国产性爱精品视频 | 日本性久久 | 人人爱人人 | 国产精品99无码一区二区视频 | 超碰在线观看99 | 91黄色国产| 91精品视频网站 | 亚洲精品1 | 欧洲精品一区二区三区 | 日韩一区二区三区免费 | 久久久久久久麻豆 | 久久国产免费观看 | 一级网站在线观看 | av黄页| 18久久久| 精品一区日韩 | 久久伊人草 | 日韩精品中文字 | 又色又爽又高潮免费视频国产 | 国内久久精品 | 91在线视频免费 | 阿拉伯性视频xxxx | 91香蕉国产在线观看软件 | 狠狠干天天 | 精品久久久无码中文字幕边打电话 | 色综合综合色 | 欧美激情三区 | 一区二区三区福利视频 | 北条麻妃av在线 | 久久综合丁香 | 91色在线视频 | 欧美又黑又粗 | 午夜在线免费视频 | 国产中文一区二区三区 | 日本高清不卡在线 | 一区二区成人av | 99久久婷婷国产综合精品青牛牛 | 国产麻豆乱码精品一区二区三区 | 一区二区不卡视频 | av中文字幕一区 | 国产成人综合久久 | 伊人免费在线观看高清版 | 亚洲免费不卡视频 | 涩涩视频在线观看 | 久久视频免费观看 | 久久在线视频精品 | 国产人妻精品一区二区三区不卡 | 综合激情网 | av在线电影院| 久久综合九色综合欧美狠狠 | 自拍三区| 毛片网站大全 | 特级毛片在线观看 | 91色影院| 天天干干干干干 | 欧美一级艳片视频免费观看 | 亚洲精品视频三区 | 夜夜嗨av色一区二区不卡 | 生活片毛片 | 久一视频在线观看 | 不卡一区二区在线视频 | a√在线观看 | 性午夜 | 免费av入口 | 日日爽日日操 | 青青久久av北条麻妃黑人 | 一级黄色片免费观看 | 高跟鞋肉丝交足91 | a级片免费视频 | 色综合免费| 亚洲精品国产成人久久av盗摄 | 有码在线 | 日本性高潮视频 | 看一级黄色片 | 日本韩国欧美一区 | 国产一区二区三区四区 | 久久午夜鲁丝片 | 国产精品二三区 | 秋霞亚洲 | 一区二区三区在线播放视频 | 人人干人人玩 | 人妻精油按摩bd高清中文字幕 | 国产一区二区三区免费看 | 少妇人妻好深好紧精品无码 | 久久av综合 | 人碰人人 | 欧日韩一区二区三区 | 看片免费黄在线观看入口 | 成人v精品蜜桃久一区 | 欧美乱大交xxxxx潮喷 | 精品日日夜夜 | 日韩精品国产一区二区 | 97免费超碰 | 99国产精品| 国产最爽的乱淫视频国语对白 | 老司机av影院 | 亚洲性图视频 | 亚洲一级伦理 | 亚洲精品在线视频免费观看 | 午夜欧美精品久久久久久久 | 久久久久综合 | 白嫩初高中害羞小美女 | 一级黄色a | 福利毛片 | 99er久久 | 色老头一区二区三区 | 老师上课夹震蛋高潮了 | 99爱免费视频 | 国产黄色精品视频 | 日本精品一区二区在线观看 | 免费国偷自产拍精品视频 | 成年人黄色一级片 | 熟妇人妻一区二区三区四区 | 青娱乐国产盛宴 | 综合 欧美 亚洲日本 | 国产乱码精品一区二三区蜜臂 | 欧美亚洲第一页 | 曰批又黄又爽免费视频 | 亚洲一区二区三区在线视频 | 久久这里只有精品6 | 夜夜操夜夜操 | 成人午夜网站 | www欧美在线 | 日韩三级中文 | 日韩一区二 | 蜜臀99久久精品久久久久小说 | 中文字字幕码一二三区 | 私密spa按摩按到高潮 | 国产aa视频| 久久九九免费 | 日韩精品久久久久久久酒店 | 香蕉视频一区二区三区 | 精品国产区 | 西西4444www大胆无视频 | 欧美一区二区三区成人精品 | 欧美老少做受xxxx高潮 | 日一日射一射 | 日本在线 | 床戏高潮呻吟声片段 | 欧美日韩综合在线 | 极品五月天 | 波多野结衣福利 | 国产69精品久久久久久 | 高h大肚孕期孕妇play | 精品+无码+在线观看 | 91精品国产自产在线观看 | 色窝窝无码一区二区三区成人网站 | 户外少妇对白啪啪野战 | 亚洲综合五区 | 男人看片网站 | 51av视频 | 不卡的日韩av | 日本在线视频观看 | 免费看黄色一级片 | 免费黄色激情视频 | 久久avav| 激情偷乱人成视频在线观看 | 人与嘼交av免费 | 午夜精品免费视频 | 国产视频福利在线 | 在线观看国产三级 | 成人ay| 超碰中文字幕在线 | 北京富婆泄欲对白 | 国产美女精品一区二区三区 | 日av中文字幕 | 熟妇一区二区三区 | 婷婷丁香综合网 | 在线日韩亚洲 | 超碰人人做| www香蕉视频 | 99久久国产免费 | www.天天干| 国产网站在线看 | 在线观看日韩国产 | 日本三级中国三级99人妇网站 | 91精品免费在线观看 | 美女扒开腿让男生桶 | 欧美高清大白屁股ass18 | 偷拍夫妻性生活 | 亚洲精品视频在线 | 无码国产69精品久久久久网站 | 久久久一二三四 | 久久91精品国产 | 色婷婷成人网 | 性一交一乱一伧国产女士spa | 免费在线观看网址入口 | 涩涩视频在线播放 | 欧美日韩国产不卡 | 不卡影院一区二区 | 亚洲一区二区三区久久久成人动漫 | 国产xxxx在线 | 爱蜜臀av | 婷婷国产成人精品视频 | av先锋资源 | 欧美在线精品一区 | 日韩特黄毛片 | 精品伦精品一区二区三区视频 | 91免费国产在线 | 中文精品久久久久人妻不卡 | h视频在线免费看 | 亚洲欧美激情另类校园 | 性色在线视频 | 国产女教师一区二区三区 | 超碰免费在线播放 | 国产精品男女视频 | 麻豆短视频在线观看 | 黄瓜视频色版 | 在线你懂得 | 成人免费观看视频网站 | 精品少妇theporn | 日本成人免费网站 | 国精产品一品二品国精品69xx | 欧美性受xxxx狂喷水 | 中文字幕黄色片 | 天天夜夜草 | 中文字幕在线播放不卡 | 婷婷激情视频 | 男人看片网站 | 九九九亚洲 | 操出白浆视频 | 香蕉视频入口 | 99热香蕉 | 日韩午夜片 | 欧美日韩一区三区 | 男女一区| 久久精品99国产国产精 | 国产乱淫av免费 | 日本中文字幕在线观看 | 亚洲一级片在线播放 | 日本中文字幕免费观看 | 欧美成a | 亚洲污污视频 | youjizz日韩| 九九碰| 人人舔人人爽 | 豆花在线观看 | 久久久久久久久久久久久久久久久 | 国产精品二三区 | 中字幕一区二区三区乱码 | 久草手机在线观看 | 欧美精品不卡 | 久久伊人免费视频 | 看av免费毛片手机播放 | 91精品国产自产精品男人的天堂 | 波多野结衣视频免费在线观看 | 久色资源 | 99av国产精品欲麻豆 | 日韩精品乱码久久久久久 | 青青青草视频在线 | 久久久久99精品成人片直播 | 天天天干干干 | 国产美女毛片 | 天天操综合网 | 狼人综合伊人 | 在线看片福利 | 开心激情播播 | 高清免费视频日本 | 青青草视频免费观看 | 亚洲国产剧情在线观看 | 丁香婷婷六月天 | 六月婷婷色 | www.超碰在线 | 国产精选久久 | 麻豆视频在线播放 | 日韩资源站 | 黄频在线看| 亚洲丁香网 | 国产a√精品区二区三区四区 | 国产综合精品久久久久成人影 | 在线免费国产 | 人妻一区二区三区视频 | wwwav在线播放| 精品视频久久久久久 | 美女无遮挡网站 | 1024福利 | 成人午夜视频在线观看 | 无码成人精品区一级毛片 | 成人网站在线进入爽爽爽 | 国产精品变态另类虐交 | 91国产丝袜在线播放 | 伊人在线 | 日韩爱爱免费视频 | 91精品久久久久久久久 | 人妻在线日韩免费视频 | 操操操操操操操操操操 | 欧美熟妇精品久久久久久 | 亚洲高清无码久久 | 欧美成人免费播放 | wwwxx国产 | 五月天婷婷网站 | 日韩在线免费看 | 国产麻豆精品视频 | 91精品国产电影 | 亚洲不卡av一区二区 | 日韩大胆视频 | 婷久久 | 国产精品一区二区久久 | 欧美一区二区大片 | 高清二区| 雷电将军和丘丘人繁衍后代视频 | 国产一区精品在线观看 | www.youjizz.com中国| 999国产| 日韩美女av在线 | 成人午夜影院在线观看 | 高清一区二区在线 | 黄色免费在线看 | 精品久久久久久亚洲 | 黄在线网站 | 国产又粗又长又黄视频 | 欧美一区二区最爽乱淫视频免费看 | 国产污污视频在线观看 | 美国成人免费视频 | 女人被狂躁c到高潮 | 欧美一区二区三区不卡视频 | 亚洲色图美腿丝袜 | 日本a视频 | 国产乱码精品一品二品 | 九九热视频免费观看 | 妺妺窝人体色www聚色窝仙踪 | 亚洲免费视 | 久久aⅴ乱码一区二区三区 亚洲成人18 | 日本精品久久久久久 | 五个女闺蜜把我玩到尿失禁 | 亚洲综合网在线观看 | 羞羞软件 | 亚洲精品一二三 | 国产精品久久久久毛片大屁完整版 | 福利二区三区 | 俺去操| 青青操视频在线观看 | 性猛交xxxx乱大交孕妇2十 | 九草视频在线观看 | 97国产高清 | av国产精品| 免费黄色国产 | 俄罗斯毛片 | 日本三级吃奶头添泬 | 天天色婷婷 | 国产乱淫av片杨贵妃 | 天天操狠狠操 | 青青草原国产视频 | 影音先锋制服丝袜 | 美女黄色影院 | www.jizzjizz| 日韩黄色一区二区 | 黄色一级在线播放 | 男女日批在线观看 | 国产视频在线观看免费 | 天天色综网| 欧美日韩激情网 | 成人动漫免费观看 | 四虎成人在线视频 | 激情综合啪啪 | 亚洲片国产一区一级在线观看 | 91福利网址 | 91九色国产视频 | 91精品在线观看视频 | 日本精品视频一区二区 | 少妇裸体淫交视频免费看高清 | 免费无码毛片一区二区app | 91精品久久久久久综合五月天 | 国产精品视频1区 | 激情在线网站 | 男女插插插网站 | 国产精品1区2区 | 69视频入口 | 蜜桃成人免费视频 | 精品亚洲国产成人av制服丝袜 | 亲子伦视频一区二区三区 | 999精品在线观看 | 日本韩国在线 | 性视频网| 久久国产亚洲 | 国产精品一区二区在线免费观看 | 1024精品一区二区三区日韩 | 亚洲在线精品视频 | 国产超碰精品 | 波多野吉衣av无码 | 精品在线播放 | 亚洲av人无码激艳猛片服务器 | 欧美精品一区二区三区在线 | 国产视频观看 | 美女丝袜av | 2020av在线 | 亚洲三级在线播放 | 免费成人结看片 | 男女国产精品 | av.www| 男女拍拍拍 | 精品伦理一区二区 | 一级黄色片欧美 | 日本我不卡 | 91视频观看 | 免费又黄又爽又猛大片午夜 | 天降女子在线观看 | 黄网在线 | 尤物国产在线 | 波多野结衣免费观看视频 | 丝袜ol美脚秘书在线播放 | 天码人妻一区二区三区在线看 | 日韩免费网 | 日本免费网址 | 五月情婷婷 | 黄色精品 | 男人操女人的免费视频 | 99热网址 | 91国自产精品中文字幕亚洲 | 性欧美13一14内谢 | 精品欧美一区二区精品久久 | 人妻熟女一区二区三区 | 成人久久电影 | 中文字幕精品视频在线观看 | 国产精品视频合集 | 青青草原综合久久大伊人精品 | 国产又粗又猛又爽又黄的网站 | 成年人免费观看网站 | 色就是色av | 制服av在线 | 日日爱视频 | 波多野结衣视频一区 | 婷婷在线综合 | 中文字幕一区二区三区人妻 | 天天综合网站 | www.99视频| 六月丁香综合 | 午夜免费精品 | 日韩激情小视频 | 欧美不卡影院 | 国产一区二区在线观看免费 | 国产女人与zoxxxx另类 | 亚洲欧美成人一区 | 欧美色图12p | a∨鲁丝一区鲁丝二区鲁丝三区 | 暖暖免费观看日本版 | 国产精品视频一区二区三区 | 色窝窝无码一区二区三区成人网站 | 中文字幕一二三四区 | 日日夜夜操操 | 青青久视频 | 91欧美国产| 成人精品在线视频 | 国产高潮又爽又无遮挡又免费 | 日韩黄页网站 | 公肉吊粗大爽色翁浪妇视频 | 成人一区二区三区在线观看 | 99re国产 | 国内毛片毛片 | 来吧亚洲综合网 | 狼色网 | 男女涩涩视频 | 色涩色 | 欧美国产成人在线 | 色一情| 国产精品网站免费 | 88av视频 | 五月天激情小说 | 人人草人人射 | 日韩wwww| 日本中文字幕视频 | 色一区二区三区四区 | 日本精品入口免费视频 | 国内视频一区二区 | 尤物网址在线观看 | av综合网站 | 91精品国产闺蜜国产在线闺蜜 | 后进极品白嫩翘臀在线视频 | 九九天堂| 桃谷绘里香在线观看 | 欧美日韩a v| 亚洲欧美综合一区二区 | 亚洲香蕉中文网 | 精品少妇3p| 香蕉视频在线观看网站 | 免费又黄又爽又猛大片午夜 | 饥渴少妇勾引水电工av | 国产在线午夜 | 欧美精品免费一区二区 | 国产剧情av在线播放 | 天天操网 | 日韩综合色| 国产精品情侣自拍 | 欧美日韩1区2区 | 中文字幕8| 最近高清中文在线字幕在线观看 | 亚洲女同女同女同女同女同69 | 亚洲三级网站 | 亚洲视频免费在线观看 | 久久久久久免费 | 国产男人搡女人免费视频 | 丝袜国产视频 | 国产精品日韩欧美大师 | 熟妇人妻无码xxx视频 | 亚洲小说区图片区 | 日本黄色免费观看 | 日韩中文字幕网站 | 中文字幕精 | 国产亚洲精久久久久久无码苍井空 | 伊人久久超碰 | 中文字幕免费在线观看 | 青草视频免费在线观看 | 朝桐光在线视频 | 窝窝午夜视频 | 欧美色一区二区三区在线观看 | www.成人免费视频 | 亚洲色图小说 | 视频免费在线 | 国产一二三| 漂亮人妻被黑人久久精品 | 凹凸福利视频 | 午夜精品一区二 | 精品国产一区一区二区三亚瑟 | 黄色电影在线视频 | 激情三级在线 | 邻家有女4完整版电影观看 欧美偷拍另类 | 精品成人中文无码专区 | 美女色网站 | 亚洲精品午夜国产va久久成人 | 久久综合福利 | 亚洲成人免费看 | 一区二区成人精品 | 国产成人无码a区在线观看视频 | 亚洲网站视频 | 俄罗斯毛片 | 黄色1级毛片 | 中文字幕精品一区二区精 | 手机在线观看毛片 | 青青青草视频在线观看 | 三上悠亚人妻中文字幕在线 | 国产精品久久久999 www日本高清视频 | 成人小视频在线播放 | 日韩av在线播放不卡 | 麻豆影视国产在线观看 | 在线精品观看 | 天天舔天天 | 免费超爽大片黄 | 精品国精品国产 | 91亚洲视频在线观看 | 亚洲在线视频观看 | 日韩小视频 | 国产综合免费视频 | 日韩精品色呦呦 | 看个毛片 | 国产另类ts人妖一区二区 | 日韩女优在线播放 | 狠狠干天天射 | 少妇脱了内裤让我添 | 国产不卡一 | 午夜插插 | 天堂色在线| 福利视频一区二区三区 | 国产一区二区三区 | 台湾佬综合网 | 欧美色射 | 99热超碰| 九九在线视频 | 健身教练巨大粗爽gay视频 | 精品久久免费视频 | 色av性av丰满av| a无一区二区三区 | 中文字幕高清在线 | 日韩午夜精品 | 91爱爱.com | 看av网址| 秋葵视频在线 | 国产一区一一区高清不卡 | 国产毛片a| 老公吃小头头视频免费观看 | 青青青草视频在线 | 青青草国产在线播放 | 五月婷婷激情视频 | 国产激情一区二区三区四区 | 欧美一级黄色片子 | 一区二区三区激情 | 性感美女一区二区三区 | 精品少妇久久 | 国产男女猛烈无遮挡a片漫画 | 操操操操操操操操操操 | 日韩精品久| 在线免费成人 | 牛牛免费视频 | 亚洲成人中文字幕在线 | 成人乱人乱一区二区三区一级视频 | 日韩在线播放中文字幕 | 在线观看中文字幕av | 一二区视频 | 青青成人网 | 免费麻豆国产一区二区三区四区 | 香蕉久久久 | 欧美成年人在线观看 | 欧美日韩在线视频一区二区 | 明星双性精跪趴灌满h | 深夜福利视频导航 | 亚洲特级黄色片 | 亚洲日本在线观看视频 | 久久最新网址 | 三级一区二区 | 五月激情六月 | 免费小视频在线观看 | 神马三级我不卡 | 3级av| 日韩中文视频 | 男女涩涩视频 | 国产综合精品 | 在线观看黄色免费网站 | 射射色| av一片| 校园春色 亚洲色图 | 爱爱亚洲 | 91毛片在线观看 | 国产精品久久亚洲 | 色男天堂| 一本大道av | 国产精品色综合 | 茄子av | 国产男女在线 | 国产真实伦对白全集 | 色资源网站| 久久精品网址 | 欧美性欧美zzzzzzzzz | 成人免费视频国产 | 狠狠狠狠狠 | 成人v片 | 国产制服丝袜 | 欧美日韩欧美日韩在线观看视频 | 天堂成人国产精品一区 | 成人动漫免费在线观看 | 玖玖视频在线 | 亚洲砖区免费 | 四川丰满少妇被弄到高潮 | 国产精品999 | 国产精品视频你懂的 | 日本少妇bbwbbw精品 | 国产一区二区三区影视 | 日本一区二区不卡视频 | 一本加勒比北条麻妃 | 男人天堂成人网 | 福利午夜视频 | 国产精品一二三 | 经典三级在线视频 | 91口爆一区二区三区在线 | 伊人精品一区二区三区 | 91精品国产91久久久久青草 | 一本色道久久综合亚洲二区三区 | 亚洲视频在线观看一区 | www夜夜 | 少妇无码一区二区三区免费 | 日韩一区二区免费在线观看 | 国产麻豆精品一区二区 | 国产一区二区网站 | 日韩成人在线免费视频 | 午夜不卡在线观看 | 91大神久久 | 女儿的朋友在线播放 | 成人性爱视频在线观看 | 精品久久影视 | 69精品丰满人妻无码视频a片 | av鲁丝一区鲁丝二区鲁丝 | 亚洲激情在线观看 | 国产第四页 | 欧美成人怡红院 | 野花av | 国产第四页| 成人hd| 日韩在线一区二区三区 | 久久精品欧美一区二区三区麻豆 | 69成人网| 欧美18一20男同69gay | 日本国产亚洲 | 中文字幕av网| 日韩福利小视频 | 综合av一区 | 老司机av导航 | 红桃成人在线 | 夜夜躁狠狠躁日日躁 | 久久久久久久久一区 | 国模私拍在线观看 | 午夜日韩在线观看 | 美女爱爱视频 | 精品午夜一区二区 | 久久久久人妻一区精品 | 超碰在线影院 | 好看的黄色网址 | 深夜免费福利视频 | 亚洲欧美日韩在线看 | 国产精品美女主播 | 免费高清毛片 | 日本高清有码视频 | 欧美一区二区三区成人片在线 | 久久调教视频 | 国产日韩欧美高清 | 影音先锋成人在线 | 日韩av在线影院 | 欧美日韩一区二区三区不卡 | 国产乱欲视频 | 中文字幕人妻一区二区三区视频 | 91美女啪啪 | 亚洲天堂一区二区三区四区 | 中文字字幕在线中文乱码 | 深夜福利影院 | 大学生三级中国dvd 日韩欧美一区二区区 | v天堂在线观看 | 一区二区三区久久 | 精品人妻无码一区二区三区 | 久久精品无码一区二区三区 | 国产精品女同 | 根深蒂固在线观看 | 久久精品一区二区免费播放 | 成人深夜视频在线观看 | 少妇被躁爽到高潮无码文 | 日韩免费视频一区 | 亚洲精品国产精 | 国内精品卡一卡二卡三 | 人人人射| 麻豆av一区| 久久久久久97 | 四虎网址大全 | 欧美91| 亚洲欧美bt | 中文在线观看免费网站 | 黄色av网页 | 国产三级一区 | 五月天激情视频 | 无人在线观看高清视频 单曲 | 色婷婷香蕉在线一区二区 | 国产四区| 黄色aaaaa | 久久国产精品一区二区三区 | 日韩成人精品一区二区 | 亚洲不卡av一区二区 | 中出在线 | 亚洲小视频在线观看 | 午夜精品导航 | 都市激情校园春色亚洲 | 天天色宗合 | a级免费网站 | 一区二区三区四区在线视频 | 中国人妖和人妖做爰 | 日本伦理一区二区 | 中文字幕网伦射乱中文 | 亚洲情区 | 精品人妻午夜一区二区三区四区 | 风流少妇 | 老熟妇高潮一区二区三区 | av怡红院| 青青草国产 | 熟妇女人妻丰满少妇中文字幕 | 欧美色频 | sao虎视频在线精品永久 | 日韩一级大片 | 中国黄色网页 | 色激情综合| 亚洲图片 欧美 | h色视频在线观看 | 久艹在线视频 | 亚洲一级av无码毛片精品 | 黄色日韩视频 | 五月天婷婷色 | 中文字幕日韩国产 | 日韩成人在线视频 | 超碰老司机| 青青草55| 啪啪免费网站 | 日韩一区二区免费看 | 国产精品一二三区 | 欧美啊v | 午夜不卡在线 | 男生女生操操操 | 黑人巨大精品欧美黑寡妇 | 色综合中文字幕 | 日韩在线一 | 午夜视频在线免费播放 | 波多野吉衣一区二区三区 | 日本强好片久久久久久aaa | 中文字幕有码在线播放 | 国产经典自拍 | 女性裸体下面张开 | 中文字幕av久久爽一区 | 免费高清视频在线观看 | 字幕网在线 | 日韩av中文字幕在线播放 | 国产我不卡 | 奇米影视777在线观看 | 亚洲一区和二区 | 久久久久久久久蜜桃 | 色视频免费看 | 女性私密整形视频 | 国产第3页 | 怡红院男人天堂 | 中文天堂| 成人免费观看视频大全 | 亚洲女优在线 | 性欧美欧美巨大69 | 修女也疯狂3免费观看完整版 | 日本黄色小视频 | 一区二区在线视频免费观看 | 黄色生活毛片 | 精品久久久久久亚洲综合网站 | 欧美乱三级 | 欧美日韩精品一区二区三区视频播放 | 久久久久久亚洲 | 在线婷婷 | 无码人妻精品一区二区三区蜜桃91 | 日韩在线播放视频 | 亚洲欧美亚洲 | 日本一区二区欧美 | av免费毛片 | 日本熟妇一区二区三区 | 最近最经典中文mv字幕 | 中文字幕8 | 色噜噜狠狠狠综合曰曰曰88av | 人人艹在线观看 | 操极品| 久久性精品 | 成人性生交大片 | 在线黄网站 | 国产麻豆精品在线 | 91在线无精精品白丝 | 丁香花电影免费播放在线观看 | 热久久中文字幕 | 亚洲国产日韩精品 | 九九在线精品视频 | 欧美久久精品一级黑人c片 1000部多毛熟女毛茸茸 | 痴汉电车在线播放 | 蜜桃一区二区三区 | 精品人妻午夜一区二区三区四区 | 涩涩视频在线 | 国产在线国偷精品免费看 | 国产99久久久欧美黑人 | 日韩少妇一区 | wwwav视频在线观看 | 亚洲黄色视屏 | a级片免费视频 | 欧美精品久久久久久久久老牛影院 | 精品久久九九 | 尤物videos另类xxxx | 日本一道在线 | 成年人视频在线看 | 日韩少妇裸体做爰视频 | 三级黄色网 | 国语对白精彩对话 | 爱爱一区二区三区 | 亚洲一区二区高清视频 | 色婷婷av一区二区三区麻豆综合 | 高潮无码精品色欲av午夜福利 | 一区二区三区四区视频 | 在线看片国产 | 国产刺激视频 | 国产麻豆一区二区三区在线观看 | 国产精品久久久久久久免费看 | 菲律宾黄色片 | 欧美一级片在线看 | 高清黄色一级片 | 操操操操操操 | 中文字幕一区二区三区四区五区 | 67194少妇| 国产成人高清视频 | 本站只有精品 | 亚洲av日韩av在线观看 | 九九视频免费 | 乳罩脱了喂男人吃奶视频 | 女教师痴汉调教hd中字 | 成人亚洲精品久久久久软件 | 手机看片国产精品 | 欧美亚洲综合网 | 亚洲精品高清视频在线观看 | 日韩成人免费视频 | 九九爱国产 | 九色网站在线观看 |