xuepengqiang
2020-05-26 bb5cb224c9abe4216aaa49a8287b06d9f05dab60
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
3
X¹]¢7ã@südZddlmZddlZddlZddlmZ    ddl
m Z m Z m Z mZmZddlmZddlmZddlmZdd    lmZdd
lmZee ƒd d „ƒZd d„Zdd„Zdd„Zdd„Zdd„Zdd„Z dd„Z!dd„Z"d(d d!„Z#d"d#„Z$d$d%„Z%d)d&d'„Z&dS)*zYOLO_v3 Model Defined in Keras.é)ÚwrapsN)Úbackend)ÚConv2DÚAddÚ ZeroPadding2DÚ UpSampling2DÚ Concatenate)Ú    LeakyReLU)ÚBatchNormalization)ÚModel)Úl2)ÚcomposecOs:dtdƒi}|jdƒdkrdnd|d<|j|ƒt||ŽS)    z4Wrapper to set Darknet parameters for Convolution2D.Úkernel_regularizergü©ñÒMb@?ÚstrideséÚvalidÚsameÚpadding)rr)r ÚgetÚupdater)ÚargsÚkwargsZdarknet_conv_kwargs©rúBD:\project\07_tracking_Re-id\04_s_yolo_tracking\lib\yolo3\model.pyÚ DarknetConv2Ds 
rcOs,ddi}|j|ƒtt||ŽtƒtddƒS)zCDarknet Convolution2D followed by BatchNormalization and LeakyReLU.Úuse_biasFgš™™™™™¹?)Úalpha)rr rr
r    )rrZno_bias_kwargsrrrÚDarknetConv2D_BN_Leakys 
rcCs`tdƒ|ƒ}t|d    d
d|ƒ}x<t|ƒD]0}tt|dd ƒt|d ƒƒ|ƒ}tƒ||gƒ}q(W|S) z@A series of resblocks starting with a downsampling Convolution2Dérér)r©rr©rr)r r!)rr)rr)rr)rr)rrÚranger r)ÚxÚ num_filtersÚ
num_blocksÚiÚyrrrÚ resblock_body"s  r(cCsNtdd ƒ|ƒ}t|ddƒ}t|ddƒ}t|ddƒ}t|d    dƒ}t|d
d ƒ}|S) z,Darknent body having 52 Convolution2D layersé ré@ré€rééiié)rr)rr()r#rrrÚ darknet_body.s     r/c    Cs`tt|dƒt|ddƒt|dƒt|ddƒt|dƒƒ|ƒ}tt|dd    ƒt|d
ƒƒ|ƒ}||fS) z:6 Conv2D_BN_Leaky layers followed by a Conv2D_linear layerrrr)rr)rr)rr)rr)rr)rr)rr)r rr)r#r$Ú out_filtersr'rrrÚmake_last_layers8s   r1cCsÄt|t|ƒƒ}t|jd||dƒ\}}ttdd    ƒtdƒƒ|ƒ}tƒ||jdjgƒ}t|d||dƒ\}}ttdd
ƒtdƒƒ|ƒ}tƒ||jdjgƒ}t|d||dƒ\}}t||||gƒS) z'Create YOLO_V3 model CNN body in Keras.iér,rré˜r+é\)rr)rr)    r r/r1Úoutputr rrrÚlayers)ÚinputsÚ num_anchorsÚ num_classesZdarknetr#Úy1Úy2Zy3rrrÚ    yolo_bodyFsr<cCst|ƒ}tjtj|ƒddd|dgƒ}tj|ƒdd…}tjtjtjd|ddd
dddgƒd|dddgƒ}tjtjtjd|dddd ddgƒ|ddddgƒ}tj||gƒ}    tj|    tj    |ƒƒ}    tj|d |d|d||dgƒ}tj
|ddd…fƒ}
tj |ddd    …fƒ} tj
|dd    d…fƒ} tj
|ddd…fƒ} |
|    tj|ddd …tj    |ƒƒ}
| |tj|ddd…tj    |ƒƒ} |
| | | fS)z8Convert final layer features to bounding box parameters.rrrr)Ústopr2.Nr.éÿÿÿÿr>r>r>r>) ÚlenÚKÚreshapeÚconstantÚshapeÚtileÚarangeÚ concatenateÚcastÚdtypeÚsigmoidÚexp)ÚfeatsÚanchorsr9Ú input_shaper8Zanchors_tensorZ
grid_shapeZgrid_yZgrid_xÚgridÚbox_xyÚbox_whÚbox_confidenceÚbox_class_probsrrrÚ    yolo_headZs$$$$$rSc Csü|dddd…f}|dddd…f}tj|tj|ƒƒ}tj|tj|ƒƒ}tj|tj||ƒƒ}||d|}||}|||}||9}||d}    ||d}
tj|    ddd…f|    ddd…f|
ddd…f|
ddd…fgƒ} | tj||gƒ9} | S)    zGet corrected boxes.Nrg@rrr>r>)r@rGrHÚroundÚminrF) rOrPrMÚ image_shapeZbox_yxZbox_hwÚ    new_shapeÚoffsetÚscaleÚbox_minsÚ    box_maxesÚboxesrrrÚyolo_correct_boxesws$   r]c CsTt||||ƒ\}}}}t||||ƒ}    tj|    ddgƒ}    ||}
tj|
d|gƒ}
|    |
fS)zProcess Conv layer outputrr.r>r>)rSr]r@rA) rKrLr9rMrVrOrPrQrRr\Ú
box_scoresrrrÚyolo_boxes_and_scores‘sr_éç333333ã?çà?cCsždddgdddgddd    gg}tj|dƒdd…d
}g}    g}
xDtdƒD]8} t|| ||| |||ƒ\} } |    j| ƒ|
j| ƒqHWtj|    dd }    tj|
dd }
|
|k}tj|d d }g}g}g}x¦t|ƒD]š}tj|    |dd…|fƒ}tj|
dd…|f|dd…|fƒ}tj    j
||||d}tj ||ƒ}tj ||ƒ}tj |d ƒ|}|j|ƒ|j|ƒ|j|ƒqÌWtj|dd }tj|dd }tj|dd }|||fS)z=Evaluate YOLO model on given input and return filtered boxes.éér-rr.r2rrrr))ÚaxisÚint32)rHN)Ú iou_threshold) r@rCr"r_ÚappendrFrBÚtfÚ boolean_maskÚimageÚnon_max_suppressionÚgatherÚ    ones_like)Ú yolo_outputsrLr9rVZ    max_boxesÚscore_thresholdrgÚ anchor_maskrMr\r^ÚlZ_boxesZ _box_scoresÚmaskZmax_boxes_tensorZboxes_Zscores_Úclasses_ÚcZ class_boxesZclass_box_scoresZ    nms_indexÚclassesrrrÚ    yolo_evalœs>
$  
 
rwc sÚdddgdddgddd    gg‰tj|d
d }tjˆd d ‰|d dd    …f|d d    d…fd    }|d d    d…f|d dd    …f}|ˆddd…|d dd    …f<|ˆddd…|d d    d…f<|jd‰‡fdd„tdƒDƒ‰‡‡‡‡fdd„tdƒDƒ}tj|dƒ}|d}| }|ddk}    x¸tˆƒD]ª}
||
|    |
f} tj| dƒ} | d} | } tj| |ƒ}tj| |ƒ}tj||dƒ}|d|d}| d| d}|d|d}||||}tj|dd}xt|ƒD]ô\}}xètdƒD]Ü}|ˆ|krêtj    ||
|dfˆ|dƒj
d ƒ}tj    ||
|dfˆ|dƒj
d ƒ}ˆ|j |ƒ}||
|dfj
d ƒ}||
|dd…f|||
|||dd…f<d|||
|||df<d|||
|||d|f<PqêWqØWq&W|S) aŸPreprocess true boxes to training input format
 
    Parameters
    ----------
    true_boxes: array, shape=(m, T, 5)
        Absolute x_min, y_min, x_max, y_max, class_code reletive to input_shape.
    input_shape: array-like, hw, multiples of 32
    anchors: array, shape=(N, 2), wh
    num_classes: integer
 
    Returns
    -------
    y_true: list of array, shape like yolo_outputs, xywh are reletive value
 
    rcrdr-rr.r2rrrÚfloat32)rHrf.Ncs g|]}ˆddddœ|‘qS)r)ér-)rrrr)Ú.0rr)rMrrú
<listcomp>âsz)preprocess_true_boxes.<locals>.<listcomp>c    s@g|]8}tjˆˆ|dˆ|dtˆ|ƒdˆfdd‘qS)rrr2rx)rH)ÚnpÚzerosr?)rzrr)rqÚ grid_shapesÚmr9rrr{ãsg@g)rer>r>).réþÿÿÿ).r).r).r).r).r).rr>) r|ÚarrayrCr"Ú expand_dimsÚmaximumÚminimumÚargmaxÚ    enumerateÚfloorÚastypeÚindex)Z
true_boxesrMrLr9Zboxes_xyZboxes_whÚy_trueZ anchor_maxesZ anchor_minsZ
valid_maskÚbÚwhr[rZÚintersect_minsÚintersect_maxesÚ intersect_whÚintersect_areaZbox_areaZ anchor_areaÚiouZ best_anchorÚtÚnrrr&Újrur)rqr~rMrr9rÚpreprocess_true_boxesÈsP$ 
      &&(r•cCsôtj|d    ƒ}|ddd…f}|ddd…f}|d}||}||}tj|dƒ}|ddd…f}|ddd…f}|d}    ||    }
||    } tj||
ƒ} tj|| ƒ} tj| | dƒ}|d
|d }|d |d }|d|d}||||}|S)zÃReturn iou tensor
 
    Parameters
    ----------
    b1: tensor, shape=(i1,...,iN, 4), xywh
    b2: tensor, shape=(j, 4), xywh
 
    Returns
    -------
    iou: tensor, shape=(i1,...,iN, j)
 
    r.Nr.g@rgrr€).r).r).r).r).r).r)r@r‚rƒr„)Úb1Úb2Zb1_xyZb1_whZ
b1_wh_halfZb1_minsZb1_maxesZb2_xyZb2_whZ
b2_wh_halfZb2_minsZb2_maxesrrŽrrZb1_areaZb2_arear‘rrrÚbox_iou s(    r˜cs’|dd…‰|dd…‰dddgdddgdd    d
gg}tjtjˆdƒd    d…d tjˆdƒƒ}‡‡fd d „tdƒDƒ}d}tjˆdƒd‰xêtdƒD]܉ˆˆddd…f}ˆˆddd…f}    tˆˆ||ˆ||ƒ\}
} } } tj|
| gƒ‰ˆˆddd
…f|
|ˆddd…}tjˆˆdd
d…fƒtj| ƒ}tj||tj    |ƒƒ}tj||gdd}d
ˆˆdd
d…fˆˆddd…f}t
j tjˆdƒd    dd}tj|dƒ‰‡‡‡‡‡fdd„}tj j ‡fdd„|d|gƒ\}}|jƒ}tj|dƒ}|tj||ƒ}|tjd    | ƒd    |tjd| ƒ|}|tj|    | ƒ}|tj|ƒtj|ƒtj|ƒ7}qšW|tjˆtj|ƒƒS)a~Return yolo_loss tensor
 
    Parameters
    ----------
    yolo_outputs: list of tensor, the output of yolo_body
    y_true: list of array, the output of preprocess_true_boxes
    anchors: array, shape=(T, 2), wh
    num_classes: integer
    ignore_thresh: float, the iou threshold whether to ignore object confidence loss
 
    Returns
    -------
    loss: tensor, shape=(1,)
 
    Nrrcrdr-r.r2rrrr)cs4g|],}tjtjˆ|ƒdd…tjˆdƒƒ‘qS)rrr)r@rGrCrH)rzrr)rŠrorrr{Kszyolo_loss.<locals>.<listcomp>.)reT)ÚsizeÚ dynamic_sizeÚboolcsntjˆˆ|ddd…fˆ|ddfƒ}tˆ||ƒ}tj|dd}|j|tj|ˆktj|ƒƒƒ}|d|fS)N.rr.r)rer>)rirjr˜r@ÚmaxÚwriterGrH)r‹Ú ignore_maskZtrue_boxr‘Zbest_iou)Ú ignore_threshrrÚobject_mask_boolÚpred_boxrŠrrÚ    loop_bodybs
(zyolo_loss.<locals>.loop_bodycs|ˆkS)Nr)r‹r)rrrÚ<lambda>hszyolo_loss.<locals>.<lambda>r>r>r>)r@rGrCrHr"rSrFÚlogÚswitchÚ
zeros_likeriÚ TensorArrayÚcontrol_flow_opsÚ
while_loopÚstackr‚ÚsquareÚsum)rrLr9rŸrqrMr~ÚlossZ object_maskZtrue_class_probsZpred_xyZpred_whZpred_confidenceZpred_class_probsZxy_deltaZwh_deltaZ    box_deltaZbox_delta_scaleržr¢Ú_Zbox_lossZconfidence_lossZ
class_lossr)rŸrrrr r¡rŠrorÚ    yolo_loss7s<  ,*$,   &r¯)r`rarb)rb)'Ú__doc__Ú    functoolsrÚnumpyr|Ú
tensorflowriÚkerasrr@Z keras.layersrrrrrZ!keras.layers.advanced_activationsr    Zkeras.layers.normalizationr
Ú keras.modelsr Zkeras.regularizersr Úlib.yolo3.utilsr rrr(r/r1r<rSr]r_rwr•r˜r¯rrrrÚ<module>s2            
 
&E*