Commit 56762529 authored by lijian6's avatar lijian6
Browse files

Initial commit


Signed-off-by: lijian6's avatarlijian <lijian6@sugon.com>
parents
"""
WiderFace evaluation code
author: wondervictor
mail: tianhengcheng@gmail.com
copyright@wondervictor
"""
from distutils.core import setup, Extension
from Cython.Build import cythonize
import numpy
package = Extension('bbox', ['box_overlaps.pyx'], include_dirs=[numpy.get_include()])
setup(ext_modules=cythonize([package]))
name: "YuFaceDetectNet"
input: "data"
input_shape {
dim: 1
dim: 3
dim: 240
dim: 320
}
#CONV1###########################################################
layer {
name: "conv1_1"
type: "Convolution"
bottom: "data"
top: "conv1_1"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 32
pad: 1
stride: 2
kernel_size: 3
weight_filler {
type: "xavier"
}
bias_term: false
}
}
layer {
name: "relu1_1"
type: "ReLU"
bottom: "conv1_1"
top: "conv1_1"
}
layer {
name: "conv1_2"
type: "Convolution"
bottom: "conv1_1"
top: "conv1_2"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 16
pad: 0
kernel_size: 1
weight_filler {
type: "xavier"
}
bias_term: false
}
}
layer {
name: "relu1_2"
type: "ReLU"
bottom: "conv1_2"
top: "conv1_2"
}
#CONV2##########################################################
layer {
name: "pool1"
type: "Pooling"
bottom: "conv1_2"
top: "pool1"
pooling_param {
pool: MAX
kernel_size: 2
stride: 2
}
}
layer {
name: "conv2_1"
type: "Convolution"
bottom: "pool1"
top: "conv2_1"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 32
pad: 1
kernel_size: 3
weight_filler {
type: "xavier"
}
bias_term: false
}
}
layer {
name: "relu2_1"
type: "ReLU"
bottom: "conv2_1"
top: "conv2_1"
}
layer {
name: "conv2_2"
type: "Convolution"
bottom: "conv2_1"
top: "conv2_2"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 16
pad: 0
kernel_size: 1
weight_filler {
type: "xavier"
}
bias_term: false
}
}
layer {
name: "relu2_2"
type: "ReLU"
bottom: "conv2_2"
top: "conv2_2"
}
#CONV3##########################################################
layer {
name: "pool2"
type: "Pooling"
bottom: "conv2_2"
top: "pool2"
pooling_param {
pool: MAX
kernel_size: 2
stride: 2
}
}
layer {
name: "conv3_1"
type: "Convolution"
bottom: "pool2"
top: "conv3_1"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 64
pad: 1
kernel_size: 3
weight_filler {
type: "xavier"
}
bias_term: false
}
}
layer {
name: "relu3_1"
type: "ReLU"
bottom: "conv3_1"
top: "conv3_1"
}
layer {
name: "conv3_2"
type: "Convolution"
bottom: "conv3_1"
top: "conv3_2"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 32
pad: 0
kernel_size: 1
weight_filler {
type: "xavier"
}
bias_term: false
}
}
layer {
name: "relu3_2"
type: "ReLU"
bottom: "conv3_2"
top: "conv3_2"
}
layer {
name: "conv3_3"
type: "Convolution"
bottom: "conv3_2"
top: "conv3_3"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 64
pad: 1
kernel_size: 3
weight_filler {
type: "xavier"
}
bias_term: false
}
}
layer {
name: "relu3_3"
type: "ReLU"
bottom: "conv3_3"
top: "conv3_3"
}
#CONV4##########################################################
layer {
name: "pool3"
type: "Pooling"
bottom: "conv3_3"
top: "pool3"
pooling_param {
pool: MAX
kernel_size: 2
stride: 2
}
}
layer {
name: "conv4_1"
type: "Convolution"
bottom: "pool3"
top: "conv4_1"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 128
pad: 1
kernel_size: 3
weight_filler {
type: "xavier"
}
bias_term: false
}
}
layer {
name: "relu4_1"
type: "ReLU"
bottom: "conv4_1"
top: "conv4_1"
}
layer {
name: "conv4_2"
type: "Convolution"
bottom: "conv4_1"
top: "conv4_2"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 64
pad: 0
kernel_size: 1
weight_filler {
type: "xavier"
}
bias_term: false
}
}
layer {
name: "relu4_2"
type: "ReLU"
bottom: "conv4_2"
top: "conv4_2"
}
layer {
name: "conv4_3"
type: "Convolution"
bottom: "conv4_2"
top: "conv4_3"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 128
pad: 1
kernel_size: 3
weight_filler {
type: "xavier"
}
bias_term: false
}
}
layer {
name: "relu4_3"
type: "ReLU"
bottom: "conv4_3"
top: "conv4_3"
}
#CONV5##########################################################
layer {
name: "pool4"
type: "Pooling"
bottom: "conv4_3"
top: "pool4"
pooling_param {
pool: MAX
kernel_size: 2
stride: 2
}
}
layer {
name: "conv5_1"
type: "Convolution"
bottom: "pool4"
top: "conv5_1"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 128
pad: 1
kernel_size: 3
weight_filler {
type: "xavier"
}
bias_term: false
dilation: 1
}
}
layer {
name: "relu5_1"
type: "ReLU"
bottom: "conv5_1"
top: "conv5_1"
}
layer {
name: "conv5_2"
type: "Convolution"
bottom: "conv5_1"
top: "conv5_2"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 128
pad: 0
kernel_size: 1
weight_filler {
type: "xavier"
}
bias_term: false
dilation: 1
}
}
layer {
name: "relu5_2"
type: "ReLU"
bottom: "conv5_2"
top: "conv5_2"
}
layer {
name: "conv5_3"
type: "Convolution"
bottom: "conv5_2"
top: "conv5_3"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 128
pad: 1
kernel_size: 3
weight_filler {
type: "xavier"
}
bias_term: false
dilation: 1
}
}
layer {
name: "relu5_3"
type: "ReLU"
bottom: "conv5_3"
top: "conv5_3"
}
#CONV6##########################################################
layer {
name: "pool5"
type: "Pooling"
bottom: "conv5_3"
top: "pool5"
pooling_param {
pool: MAX
kernel_size: 2
stride: 2
}
}
layer {
name: "conv6_1"
type: "Convolution"
bottom: "pool5"
top: "conv6_1"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 128
pad: 1
kernel_size: 3
weight_filler {
type: "xavier"
}
bias_term: false
dilation: 1
}
}
layer {
name: "relu6_1"
type: "ReLU"
bottom: "conv6_1"
top: "conv6_1"
}
layer {
name: "conv6_2"
type: "Convolution"
bottom: "conv6_1"
top: "conv6_2"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 128
pad: 0
kernel_size: 1
weight_filler {
type: "xavier"
}
bias_term: false
dilation: 1
}
}
layer {
name: "relu6_2"
type: "ReLU"
bottom: "conv6_2"
top: "conv6_2"
}
layer {
name: "conv6_3"
type: "Convolution"
bottom: "conv6_2"
top: "conv6_3"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 128
pad: 1
kernel_size: 3
weight_filler {
type: "xavier"
}
bias_term: false
dilation: 1
}
}
layer {
name: "relu6_3"
type: "ReLU"
bottom: "conv6_3"
top: "conv6_3"
}
#PRIORBOX3##########################################
layer {
name: "conv3_3_norm"
type: "Normalize"
bottom: "conv3_3"
top: "conv3_3_norm"
norm_param {
across_spatial: false
scale_filler {
type: "constant"
value: 10.0
}
channel_shared: false
}
}
layer {
name: "conv3_3_norm_mbox_loc"
type: "Convolution"
bottom: "conv3_3_norm"
top: "conv3_3_norm_mbox_loc"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 12
pad: 1
kernel_size: 3
stride: 1
weight_filler {
type: "xavier"
}
bias_term: false
}
}
layer {
name: "conv3_3_norm_mbox_loc_perm"
type: "Permute"
bottom: "conv3_3_norm_mbox_loc"
top: "conv3_3_norm_mbox_loc_perm"
permute_param {
order: 0
order: 2
order: 3
order: 1
}
}
layer {
name: "conv3_3_norm_mbox_loc_flat"
type: "Flatten"
bottom: "conv3_3_norm_mbox_loc_perm"
top: "conv3_3_norm_mbox_loc_flat"
flatten_param {
axis: 1
}
}
layer {
name: "conv3_3_norm_mbox_conf"
type: "Convolution"
bottom: "conv3_3_norm"
top: "conv3_3_norm_mbox_conf"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 6
pad: 1
kernel_size: 3
stride: 1
weight_filler {
type: "xavier"
}
bias_term: false
}
}
layer {
name: "conv3_3_norm_mbox_conf_perm"
type: "Permute"
bottom: "conv3_3_norm_mbox_conf"
top: "conv3_3_norm_mbox_conf_perm"
permute_param {
order: 0
order: 2
order: 3
order: 1
}
}
layer {
name: "conv3_3_norm_mbox_conf_flat"
type: "Flatten"
bottom: "conv3_3_norm_mbox_conf_perm"
top: "conv3_3_norm_mbox_conf_flat"
flatten_param {
axis: 1
}
}
layer {
name: "conv3_3_norm_mbox_priorbox"
type: "PriorBox"
bottom: "conv3_3_norm"
bottom: "data"
top: "conv3_3_norm_mbox_priorbox"
prior_box_param {
min_size: 10.0
min_size: 16.0
min_size: 24.0
clip: false
variance: 0.10000000149
variance: 0.10000000149
variance: 0.20000000298
variance: 0.20000000298
step: 8.0
offset: 0.5
}
}
#PRIORBOX4##########################################
layer {
name: "conv4_3_norm"
type: "Normalize"
bottom: "conv4_3"
top: "conv4_3_norm"
norm_param {
across_spatial: false
scale_filler {
type: "constant"
value: 8.0
}
channel_shared: false
}
}
layer {
name: "conv4_3_norm_mbox_loc"
type: "Convolution"
bottom: "conv4_3_norm"
top: "conv4_3_norm_mbox_loc"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 8
pad: 1
kernel_size: 3
stride: 1
weight_filler {
type: "xavier"
}
bias_term: false
}
}
layer {
name: "conv4_3_norm_mbox_loc_perm"
type: "Permute"
bottom: "conv4_3_norm_mbox_loc"
top: "conv4_3_norm_mbox_loc_perm"
permute_param {
order: 0
order: 2
order: 3
order: 1
}
}
layer {
name: "conv4_3_norm_mbox_loc_flat"
type: "Flatten"
bottom: "conv4_3_norm_mbox_loc_perm"
top: "conv4_3_norm_mbox_loc_flat"
flatten_param {
axis: 1
}
}
layer {
name: "conv4_3_norm_mbox_conf"
type: "Convolution"
bottom: "conv4_3_norm"
top: "conv4_3_norm_mbox_conf"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 4
pad: 1
kernel_size: 3
stride: 1
weight_filler {
type: "xavier"
}
bias_term: false
}
}
layer {
name: "conv4_3_norm_mbox_conf_perm"
type: "Permute"
bottom: "conv4_3_norm_mbox_conf"
top: "conv4_3_norm_mbox_conf_perm"
permute_param {
order: 0
order: 2
order: 3
order: 1
}
}
layer {
name: "conv4_3_norm_mbox_conf_flat"
type: "Flatten"
bottom: "conv4_3_norm_mbox_conf_perm"
top: "conv4_3_norm_mbox_conf_flat"
flatten_param {
axis: 1
}
}
layer {
name: "conv4_3_norm_mbox_priorbox"
type: "PriorBox"
bottom: "conv4_3_norm"
bottom: "data"
top: "conv4_3_norm_mbox_priorbox"
prior_box_param {
min_size: 32.0
min_size: 48.0
clip: false
variance: 0.10000000149
variance: 0.10000000149
variance: 0.20000000298
variance: 0.20000000298
step: 16.0
offset: 0.5
}
}
#PRIORBOX5##########################################
layer {
name: "conv5_3_norm"
type: "Normalize"
bottom: "conv5_3"
top: "conv5_3_norm"
norm_param {
across_spatial: false
scale_filler {
type: "constant"
value: 5.0
}
channel_shared: false
}
}
layer {
name: "conv5_3_norm_mbox_loc"
type: "Convolution"
bottom: "conv5_3_norm"
top: "conv5_3_norm_mbox_loc"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 8
pad: 1
kernel_size: 3
stride: 1
weight_filler {
type: "xavier"
}
bias_term: false
}
}
layer {
name: "conv5_3_norm_mbox_loc_perm"
type: "Permute"
bottom: "conv5_3_norm_mbox_loc"
top: "conv5_3_norm_mbox_loc_perm"
permute_param {
order: 0
order: 2
order: 3
order: 1
}
}
layer {
name: "conv5_3_norm_mbox_loc_flat"
type: "Flatten"
bottom: "conv5_3_norm_mbox_loc_perm"
top: "conv5_3_norm_mbox_loc_flat"
flatten_param {
axis: 1
}
}
layer {
name: "conv5_3_norm_mbox_conf"
type: "Convolution"
bottom: "conv5_3_norm"
top: "conv5_3_norm_mbox_conf"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 4
pad: 1
kernel_size: 3
stride: 1
weight_filler {
type: "xavier"
}
bias_term: false
}
}
layer {
name: "conv5_3_norm_mbox_conf_perm"
type: "Permute"
bottom: "conv5_3_norm_mbox_conf"
top: "conv5_3_norm_mbox_conf_perm"
permute_param {
order: 0
order: 2
order: 3
order: 1
}
}
layer {
name: "conv5_3_norm_mbox_conf_flat"
type: "Flatten"
bottom: "conv5_3_norm_mbox_conf_perm"
top: "conv5_3_norm_mbox_conf_flat"
flatten_param {
axis: 1
}
}
layer {
name: "conv5_3_norm_mbox_priorbox"
type: "PriorBox"
bottom: "conv5_3_norm"
bottom: "data"
top: "conv5_3_norm_mbox_priorbox"
prior_box_param {
min_size: 64.0
min_size: 96.0
clip: false
variance: 0.10000000149
variance: 0.10000000149
variance: 0.20000000298
variance: 0.20000000298
step: 32.0
offset: 0.5
}
}
#PRIORBOX6##########################################
layer {
name: "conv6_3_norm"
type: "Normalize"
bottom: "conv6_3"
top: "conv6_3_norm"
norm_param {
across_spatial: false
scale_filler {
type: "constant"
value: 5.0
}
channel_shared: false
}
}
layer {
name: "conv6_3_norm_mbox_loc"
type: "Convolution"
bottom: "conv6_3_norm"
top: "conv6_3_norm_mbox_loc"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 12
pad: 1
kernel_size: 3
stride: 1
weight_filler {
type: "xavier"
}
bias_term: false
}
}
layer {
name: "conv6_3_norm_mbox_loc_perm"
type: "Permute"
bottom: "conv6_3_norm_mbox_loc"
top: "conv6_3_norm_mbox_loc_perm"
permute_param {
order: 0
order: 2
order: 3
order: 1
}
}
layer {
name: "conv6_3_norm_mbox_loc_flat"
type: "Flatten"
bottom: "conv6_3_norm_mbox_loc_perm"
top: "conv6_3_norm_mbox_loc_flat"
flatten_param {
axis: 1
}
}
layer {
name: "conv6_3_norm_mbox_conf"
type: "Convolution"
bottom: "conv6_3_norm"
top: "conv6_3_norm_mbox_conf"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 6
pad: 1
kernel_size: 3
stride: 1
weight_filler {
type: "xavier"
}
bias_term: false
}
}
layer {
name: "conv6_3_norm_mbox_conf_perm"
type: "Permute"
bottom: "conv6_3_norm_mbox_conf"
top: "conv6_3_norm_mbox_conf_perm"
permute_param {
order: 0
order: 2
order: 3
order: 1
}
}
layer {
name: "conv6_3_norm_mbox_conf_flat"
type: "Flatten"
bottom: "conv6_3_norm_mbox_conf_perm"
top: "conv6_3_norm_mbox_conf_flat"
flatten_param {
axis: 1
}
}
layer {
name: "conv6_3_norm_mbox_priorbox"
type: "PriorBox"
bottom: "conv6_3_norm"
bottom: "data"
top: "conv6_3_norm_mbox_priorbox"
prior_box_param {
min_size: 128.0
min_size: 192.0
min_size: 256.0
clip: false
variance: 0.10000000149
variance: 0.10000000149
variance: 0.20000000298
variance: 0.20000000298
step: 64.0
offset: 0.5
}
}
########################################################
layer {
name: "mbox_loc"
type: "Concat"
bottom: "conv3_3_norm_mbox_loc_flat"
bottom: "conv4_3_norm_mbox_loc_flat"
bottom: "conv5_3_norm_mbox_loc_flat"
bottom: "conv6_3_norm_mbox_loc_flat"
top: "mbox_loc"
concat_param {
axis: 1
}
}
layer {
name: "mbox_conf"
type: "Concat"
bottom: "conv3_3_norm_mbox_conf_flat"
bottom: "conv4_3_norm_mbox_conf_flat"
bottom: "conv5_3_norm_mbox_conf_flat"
bottom: "conv6_3_norm_mbox_conf_flat"
top: "mbox_conf"
concat_param {
axis: 1
}
}
layer {
name: "mbox_priorbox"
type: "Concat"
bottom: "conv3_3_norm_mbox_priorbox"
bottom: "conv4_3_norm_mbox_priorbox"
bottom: "conv5_3_norm_mbox_priorbox"
bottom: "conv6_3_norm_mbox_priorbox"
top: "mbox_priorbox"
concat_param {
axis: 2
}
}
#####################################################
layer {
name: "mbox_conf_reshape"
type: "Reshape"
bottom: "mbox_conf"
top: "mbox_conf_reshape"
reshape_param {
shape {
dim: 0
dim: -1
dim: 2
}
}
}
layer {
name: "mbox_conf_softmax"
type: "Softmax"
bottom: "mbox_conf_reshape"
top: "mbox_conf_softmax"
softmax_param {
axis: 2
}
}
layer {
name: "mbox_conf_flatten"
type: "Flatten"
bottom: "mbox_conf_softmax"
top: "mbox_conf_flatten"
flatten_param {
axis: 1
}
}
layer {
name: "detection_out"
type: "DetectionOutput"
bottom: "mbox_loc"
bottom: "mbox_conf_flatten"
bottom: "mbox_priorbox"
# bottom: "data"
top: "detection_out"
include {
phase: TEST
}
transform_param {
mean_value: 103.94
mean_value: 116.78
mean_value: 123.68
}
detection_output_param {
num_classes: 2
share_location: true
background_label_id: 0
nms_param {
nms_threshold: 0.15
top_k: 100
}
code_type: CENTER_SIZE
keep_top_k: 50
confidence_threshold: 0.01
visualize: false
visualize_threshold: 0.3
}
}
train_net: "./yufacedetectnet.train.prototxt"
base_lr: 0.001
lr_policy: "poly"
power: 2
display: 10
max_iter: 200000
momentum: 0.9
weight_decay: 0.0005
snapshot: 5000
snapshot_prefix: "./models/yufacedetectnet-open-v2"
solver_mode: GPU
debug_info: false
snapshot_after_train: true
average_loss: 790
type: "SGD"
store_blobs_in_old_format: true
name: "YuFaceDetectNet"
layer {
name: "data"
type: "AnnotatedData"
top: "data"
top: "label"
include {
phase: TRAIN
}
transform_param {
mirror: true
# mean_value: 104.0
# mean_value: 117.0
# mean_value: 123.0
resize_param {
prob: 1.0
resize_mode: WARP
height: 240
width: 320
interp_mode: LINEAR
interp_mode: AREA
interp_mode: NEAREST
interp_mode: CUBIC
interp_mode: LANCZOS4
}
emit_constraint {
emit_type: CENTER
}
distort_param {
brightness_prob: 0.5
brightness_delta: 32.0
contrast_prob: 0.5
contrast_lower: 0.5
contrast_upper: 1.5
hue_prob: 0.5
hue_delta: 18.0
saturation_prob: 0.5
saturation_lower: 0.5
saturation_upper: 1.5
random_order_prob: 0.0
}
}
data_param {
source: "../FACE/lmdb/FACE_trainval_lmdb/"
batch_size: 16
backend: LMDB
}
annotated_data_param {
batch_sampler {
sampler {
min_scale: 1.0
max_scale: 1.0
min_aspect_ratio: 1.0
max_aspect_ratio: 1.0
}
sample_constraint {
min_object_coverage: 1.0
}
max_sample: 1
max_trials: 50
}
batch_sampler {
sampler {
min_scale: 0.300000011921
max_scale: 1.0
min_aspect_ratio: 1.0
max_aspect_ratio: 1.0
}
sample_constraint {
min_object_coverage: 1.0
}
max_sample: 1
max_trials: 50
}
batch_sampler {
sampler {
min_scale: 0.300000011921
max_scale: 1.0
min_aspect_ratio: 1.0
max_aspect_ratio: 1.0
}
sample_constraint {
min_object_coverage: 1.0
}
max_sample: 1
max_trials: 50
}
batch_sampler {
sampler {
min_scale: 0.300000011921
max_scale: 1.0
min_aspect_ratio: 1.0
max_aspect_ratio: 1.0
}
sample_constraint {
min_object_coverage: 1.0
}
max_sample: 1
max_trials: 50
}
batch_sampler {
sampler {
min_scale: 0.300000011921
max_scale: 1.0
min_aspect_ratio: 1.0
max_aspect_ratio: 1.0
}
sample_constraint {
min_object_coverage: 1.0
}
max_sample: 1
max_trials: 50
}
label_map_file: "../labelmap_face.prototxt"
}
}
#CONV1###########################################################
layer {
name: "conv1_1"
type: "Convolution"
bottom: "data"
top: "conv1_1"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 32
pad: 1
stride: 2
kernel_size: 3
weight_filler {
type: "xavier"
}
bias_term: false
}
}
layer {
name: "relu1_1"
type: "ReLU"
bottom: "conv1_1"
top: "conv1_1"
}
layer {
name: "conv1_2"
type: "Convolution"
bottom: "conv1_1"
top: "conv1_2"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 16
pad: 0
kernel_size: 1
weight_filler {
type: "xavier"
}
bias_term: false
}
}
layer {
name: "relu1_2"
type: "ReLU"
bottom: "conv1_2"
top: "conv1_2"
}
#CONV2##########################################################
layer {
name: "pool1"
type: "Pooling"
bottom: "conv1_2"
top: "pool1"
pooling_param {
pool: MAX
kernel_size: 2
stride: 2
}
}
layer {
name: "conv2_1"
type: "Convolution"
bottom: "pool1"
top: "conv2_1"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 32
pad: 1
kernel_size: 3
weight_filler {
type: "xavier"
}
bias_term: false
}
}
layer {
name: "relu2_1"
type: "ReLU"
bottom: "conv2_1"
top: "conv2_1"
}
layer {
name: "conv2_2"
type: "Convolution"
bottom: "conv2_1"
top: "conv2_2"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 16
pad: 0
kernel_size: 1
weight_filler {
type: "xavier"
}
bias_term: false
}
}
layer {
name: "relu2_2"
type: "ReLU"
bottom: "conv2_2"
top: "conv2_2"
}
#CONV3##########################################################
layer {
name: "pool2"
type: "Pooling"
bottom: "conv2_2"
top: "pool2"
pooling_param {
pool: MAX
kernel_size: 2
stride: 2
}
}
layer {
name: "conv3_1"
type: "Convolution"
bottom: "pool2"
top: "conv3_1"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 64
pad: 1
kernel_size: 3
weight_filler {
type: "xavier"
}
bias_term: false
}
}
layer {
name: "relu3_1"
type: "ReLU"
bottom: "conv3_1"
top: "conv3_1"
}
layer {
name: "conv3_2"
type: "Convolution"
bottom: "conv3_1"
top: "conv3_2"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 32
pad: 0
kernel_size: 1
weight_filler {
type: "xavier"
}
bias_term: false
}
}
layer {
name: "relu3_2"
type: "ReLU"
bottom: "conv3_2"
top: "conv3_2"
}
layer {
name: "conv3_3"
type: "Convolution"
bottom: "conv3_2"
top: "conv3_3"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 64
pad: 1
kernel_size: 3
weight_filler {
type: "xavier"
}
bias_term: false
}
}
layer {
name: "relu3_3"
type: "ReLU"
bottom: "conv3_3"
top: "conv3_3"
}
#CONV4##########################################################
layer {
name: "pool3"
type: "Pooling"
bottom: "conv3_3"
top: "pool3"
pooling_param {
pool: MAX
kernel_size: 2
stride: 2
}
}
layer {
name: "conv4_1"
type: "Convolution"
bottom: "pool3"
top: "conv4_1"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 128
pad: 1
kernel_size: 3
weight_filler {
type: "xavier"
}
bias_term: false
}
}
layer {
name: "relu4_1"
type: "ReLU"
bottom: "conv4_1"
top: "conv4_1"
}
layer {
name: "conv4_2"
type: "Convolution"
bottom: "conv4_1"
top: "conv4_2"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 64
pad: 0
kernel_size: 1
weight_filler {
type: "xavier"
}
bias_term: false
}
}
layer {
name: "relu4_2"
type: "ReLU"
bottom: "conv4_2"
top: "conv4_2"
}
layer {
name: "conv4_3"
type: "Convolution"
bottom: "conv4_2"
top: "conv4_3"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 128
pad: 1
kernel_size: 3
weight_filler {
type: "xavier"
}
bias_term: false
}
}
layer {
name: "relu4_3"
type: "ReLU"
bottom: "conv4_3"
top: "conv4_3"
}
#CONV5##########################################################
layer {
name: "pool4"
type: "Pooling"
bottom: "conv4_3"
top: "pool4"
pooling_param {
pool: MAX
kernel_size: 2
stride: 2
}
}
layer {
name: "conv5_1"
type: "Convolution"
bottom: "pool4"
top: "conv5_1"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 128
pad: 1
kernel_size: 3
weight_filler {
type: "xavier"
}
bias_term: false
dilation: 1
}
}
layer {
name: "relu5_1"
type: "ReLU"
bottom: "conv5_1"
top: "conv5_1"
}
layer {
name: "conv5_2"
type: "Convolution"
bottom: "conv5_1"
top: "conv5_2"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 128
pad: 0
kernel_size: 1
weight_filler {
type: "xavier"
}
bias_term: false
dilation: 1
}
}
layer {
name: "relu5_2"
type: "ReLU"
bottom: "conv5_2"
top: "conv5_2"
}
layer {
name: "conv5_3"
type: "Convolution"
bottom: "conv5_2"
top: "conv5_3"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 128
pad: 1
kernel_size: 3
weight_filler {
type: "xavier"
}
bias_term: false
dilation: 1
}
}
layer {
name: "relu5_3"
type: "ReLU"
bottom: "conv5_3"
top: "conv5_3"
}
#CONV6##########################################################
layer {
name: "pool5"
type: "Pooling"
bottom: "conv5_3"
top: "pool5"
pooling_param {
pool: MAX
kernel_size: 2
stride: 2
}
}
layer {
name: "conv6_1"
type: "Convolution"
bottom: "pool5"
top: "conv6_1"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 128
pad: 1
kernel_size: 3
weight_filler {
type: "xavier"
}
bias_term: false
dilation: 1
}
}
layer {
name: "relu6_1"
type: "ReLU"
bottom: "conv6_1"
top: "conv6_1"
}
layer {
name: "conv6_2"
type: "Convolution"
bottom: "conv6_1"
top: "conv6_2"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 128
pad: 0
kernel_size: 1
weight_filler {
type: "xavier"
}
bias_term: false
dilation: 1
}
}
layer {
name: "relu6_2"
type: "ReLU"
bottom: "conv6_2"
top: "conv6_2"
}
layer {
name: "conv6_3"
type: "Convolution"
bottom: "conv6_2"
top: "conv6_3"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 128
pad: 1
kernel_size: 3
weight_filler {
type: "xavier"
}
bias_term: false
dilation: 1
}
}
layer {
name: "relu6_3"
type: "ReLU"
bottom: "conv6_3"
top: "conv6_3"
}
#PRIORBOX3##########################################
layer {
name: "conv3_3_norm"
type: "Normalize"
bottom: "conv3_3"
top: "conv3_3_norm"
norm_param {
across_spatial: false
scale_filler {
type: "constant"
value: 10.0
}
channel_shared: false
}
}
layer {
name: "conv3_3_norm_mbox_loc"
type: "Convolution"
bottom: "conv3_3_norm"
top: "conv3_3_norm_mbox_loc"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 12
pad: 1
kernel_size: 3
stride: 1
weight_filler {
type: "xavier"
}
bias_term: false
}
}
layer {
name: "conv3_3_norm_mbox_loc_perm"
type: "Permute"
bottom: "conv3_3_norm_mbox_loc"
top: "conv3_3_norm_mbox_loc_perm"
permute_param {
order: 0
order: 2
order: 3
order: 1
}
}
layer {
name: "conv3_3_norm_mbox_loc_flat"
type: "Flatten"
bottom: "conv3_3_norm_mbox_loc_perm"
top: "conv3_3_norm_mbox_loc_flat"
flatten_param {
axis: 1
}
}
layer {
name: "conv3_3_norm_mbox_conf"
type: "Convolution"
bottom: "conv3_3_norm"
top: "conv3_3_norm_mbox_conf"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 6
pad: 1
kernel_size: 3
stride: 1
weight_filler {
type: "xavier"
}
bias_term: false
}
}
layer {
name: "conv3_3_norm_mbox_conf_perm"
type: "Permute"
bottom: "conv3_3_norm_mbox_conf"
top: "conv3_3_norm_mbox_conf_perm"
permute_param {
order: 0
order: 2
order: 3
order: 1
}
}
layer {
name: "conv3_3_norm_mbox_conf_flat"
type: "Flatten"
bottom: "conv3_3_norm_mbox_conf_perm"
top: "conv3_3_norm_mbox_conf_flat"
flatten_param {
axis: 1
}
}
layer {
name: "conv3_3_norm_mbox_priorbox"
type: "PriorBox"
bottom: "conv3_3_norm"
bottom: "data"
top: "conv3_3_norm_mbox_priorbox"
prior_box_param {
min_size: 10.0
min_size: 16.0
min_size: 24.0
clip: false
variance: 0.10000000149
variance: 0.10000000149
variance: 0.20000000298
variance: 0.20000000298
step: 8.0
offset: 0.5
}
}
#PRIORBOX4##########################################
layer {
name: "conv4_3_norm"
type: "Normalize"
bottom: "conv4_3"
top: "conv4_3_norm"
norm_param {
across_spatial: false
scale_filler {
type: "constant"
value: 8.0
}
channel_shared: false
}
}
layer {
name: "conv4_3_norm_mbox_loc"
type: "Convolution"
bottom: "conv4_3_norm"
top: "conv4_3_norm_mbox_loc"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 8
pad: 1
kernel_size: 3
stride: 1
weight_filler {
type: "xavier"
}
bias_term: false
}
}
layer {
name: "conv4_3_norm_mbox_loc_perm"
type: "Permute"
bottom: "conv4_3_norm_mbox_loc"
top: "conv4_3_norm_mbox_loc_perm"
permute_param {
order: 0
order: 2
order: 3
order: 1
}
}
layer {
name: "conv4_3_norm_mbox_loc_flat"
type: "Flatten"
bottom: "conv4_3_norm_mbox_loc_perm"
top: "conv4_3_norm_mbox_loc_flat"
flatten_param {
axis: 1
}
}
layer {
name: "conv4_3_norm_mbox_conf"
type: "Convolution"
bottom: "conv4_3_norm"
top: "conv4_3_norm_mbox_conf"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 4
pad: 1
kernel_size: 3
stride: 1
weight_filler {
type: "xavier"
}
bias_term: false
}
}
layer {
name: "conv4_3_norm_mbox_conf_perm"
type: "Permute"
bottom: "conv4_3_norm_mbox_conf"
top: "conv4_3_norm_mbox_conf_perm"
permute_param {
order: 0
order: 2
order: 3
order: 1
}
}
layer {
name: "conv4_3_norm_mbox_conf_flat"
type: "Flatten"
bottom: "conv4_3_norm_mbox_conf_perm"
top: "conv4_3_norm_mbox_conf_flat"
flatten_param {
axis: 1
}
}
layer {
name: "conv4_3_norm_mbox_priorbox"
type: "PriorBox"
bottom: "conv4_3_norm"
bottom: "data"
top: "conv4_3_norm_mbox_priorbox"
prior_box_param {
min_size: 32.0
min_size: 48.0
clip: false
variance: 0.10000000149
variance: 0.10000000149
variance: 0.20000000298
variance: 0.20000000298
step: 16.0
offset: 0.5
}
}
#PRIORBOX5##########################################
layer {
name: "conv5_3_norm"
type: "Normalize"
bottom: "conv5_3"
top: "conv5_3_norm"
norm_param {
across_spatial: false
scale_filler {
type: "constant"
value: 5.0
}
channel_shared: false
}
}
layer {
name: "conv5_3_norm_mbox_loc"
type: "Convolution"
bottom: "conv5_3_norm"
top: "conv5_3_norm_mbox_loc"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 8
pad: 1
kernel_size: 3
stride: 1
weight_filler {
type: "xavier"
}
bias_term: false
}
}
layer {
name: "conv5_3_norm_mbox_loc_perm"
type: "Permute"
bottom: "conv5_3_norm_mbox_loc"
top: "conv5_3_norm_mbox_loc_perm"
permute_param {
order: 0
order: 2
order: 3
order: 1
}
}
layer {
name: "conv5_3_norm_mbox_loc_flat"
type: "Flatten"
bottom: "conv5_3_norm_mbox_loc_perm"
top: "conv5_3_norm_mbox_loc_flat"
flatten_param {
axis: 1
}
}
layer {
name: "conv5_3_norm_mbox_conf"
type: "Convolution"
bottom: "conv5_3_norm"
top: "conv5_3_norm_mbox_conf"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 4
pad: 1
kernel_size: 3
stride: 1
weight_filler {
type: "xavier"
}
bias_term: false
}
}
layer {
name: "conv5_3_norm_mbox_conf_perm"
type: "Permute"
bottom: "conv5_3_norm_mbox_conf"
top: "conv5_3_norm_mbox_conf_perm"
permute_param {
order: 0
order: 2
order: 3
order: 1
}
}
layer {
name: "conv5_3_norm_mbox_conf_flat"
type: "Flatten"
bottom: "conv5_3_norm_mbox_conf_perm"
top: "conv5_3_norm_mbox_conf_flat"
flatten_param {
axis: 1
}
}
layer {
name: "conv5_3_norm_mbox_priorbox"
type: "PriorBox"
bottom: "conv5_3_norm"
bottom: "data"
top: "conv5_3_norm_mbox_priorbox"
prior_box_param {
min_size: 64.0
min_size: 96.0
clip: false
variance: 0.10000000149
variance: 0.10000000149
variance: 0.20000000298
variance: 0.20000000298
step: 32.0
offset: 0.5
}
}
#PRIORBOX6##########################################
layer {
name: "conv6_3_norm"
type: "Normalize"
bottom: "conv6_3"
top: "conv6_3_norm"
norm_param {
across_spatial: false
scale_filler {
type: "constant"
value: 5.0
}
channel_shared: false
}
}
layer {
name: "conv6_3_norm_mbox_loc"
type: "Convolution"
bottom: "conv6_3_norm"
top: "conv6_3_norm_mbox_loc"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 12
pad: 1
kernel_size: 3
stride: 1
weight_filler {
type: "xavier"
}
bias_term: false
}
}
layer {
name: "conv6_3_norm_mbox_loc_perm"
type: "Permute"
bottom: "conv6_3_norm_mbox_loc"
top: "conv6_3_norm_mbox_loc_perm"
permute_param {
order: 0
order: 2
order: 3
order: 1
}
}
layer {
name: "conv6_3_norm_mbox_loc_flat"
type: "Flatten"
bottom: "conv6_3_norm_mbox_loc_perm"
top: "conv6_3_norm_mbox_loc_flat"
flatten_param {
axis: 1
}
}
layer {
name: "conv6_3_norm_mbox_conf"
type: "Convolution"
bottom: "conv6_3_norm"
top: "conv6_3_norm_mbox_conf"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 6
pad: 1
kernel_size: 3
stride: 1
weight_filler {
type: "xavier"
}
bias_term: false
}
}
layer {
name: "conv6_3_norm_mbox_conf_perm"
type: "Permute"
bottom: "conv6_3_norm_mbox_conf"
top: "conv6_3_norm_mbox_conf_perm"
permute_param {
order: 0
order: 2
order: 3
order: 1
}
}
layer {
name: "conv6_3_norm_mbox_conf_flat"
type: "Flatten"
bottom: "conv6_3_norm_mbox_conf_perm"
top: "conv6_3_norm_mbox_conf_flat"
flatten_param {
axis: 1
}
}
layer {
name: "conv6_3_norm_mbox_priorbox"
type: "PriorBox"
bottom: "conv6_3_norm"
bottom: "data"
top: "conv6_3_norm_mbox_priorbox"
prior_box_param {
min_size: 128.0
min_size: 192.0
min_size: 256.0
clip: false
variance: 0.10000000149
variance: 0.10000000149
variance: 0.20000000298
variance: 0.20000000298
step: 64.0
offset: 0.5
}
}
########################################################
layer {
name: "mbox_loc"
type: "Concat"
bottom: "conv3_3_norm_mbox_loc_flat"
bottom: "conv4_3_norm_mbox_loc_flat"
bottom: "conv5_3_norm_mbox_loc_flat"
bottom: "conv6_3_norm_mbox_loc_flat"
top: "mbox_loc"
concat_param {
axis: 1
}
}
layer {
name: "mbox_conf"
type: "Concat"
bottom: "conv3_3_norm_mbox_conf_flat"
bottom: "conv4_3_norm_mbox_conf_flat"
bottom: "conv5_3_norm_mbox_conf_flat"
bottom: "conv6_3_norm_mbox_conf_flat"
top: "mbox_conf"
concat_param {
axis: 1
}
}
layer {
name: "mbox_priorbox"
type: "Concat"
bottom: "conv3_3_norm_mbox_priorbox"
bottom: "conv4_3_norm_mbox_priorbox"
bottom: "conv5_3_norm_mbox_priorbox"
bottom: "conv6_3_norm_mbox_priorbox"
top: "mbox_priorbox"
concat_param {
axis: 2
}
}
#####################################################
layer {
name: "mbox_loss"
type: "MultiBoxLoss"
bottom: "mbox_loc"
bottom: "mbox_conf"
bottom: "mbox_priorbox"
bottom: "label"
top: "mbox_loss"
include {
phase: TRAIN
}
propagate_down: true
propagate_down: true
propagate_down: false
propagate_down: false
loss_param {
normalization: VALID
}
multibox_loss_param {
loc_loss_type: L2
conf_loss_type: SOFTMAX
loc_weight: 1.0
num_classes: 2
share_location: true
match_type: PER_PREDICTION
overlap_threshold: 0.34999999404
use_prior_for_matching: true
background_label_id: 0
use_difficult_gt: true
neg_pos_ratio: 3.0
neg_overlap: 0.34999999404
code_type: CENTER_SIZE
ignore_cross_boundary_bbox: false
mining_type: MAX_NEGATIVE
}
}
name: "YuFaceDetectNet"
input: "data"
input_shape {
dim: 1
dim: 3
dim: 480
dim: 640
}
#CONV1###########################################################
layer {
name: "conv1_1"
type: "Convolution"
bottom: "data"
top: "conv1_1"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 32
pad: 1
stride: 2
kernel_size: 3
weight_filler {
type: "xavier"
}
bias_term: false
}
}
layer {
name: "relu1_1"
type: "ReLU"
bottom: "conv1_1"
top: "conv1_1"
}
layer {
name: "conv1_2"
type: "Convolution"
bottom: "conv1_1"
top: "conv1_2"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 16
pad: 0
kernel_size: 1
weight_filler {
type: "xavier"
}
bias_term: false
}
}
layer {
name: "relu1_2"
type: "ReLU"
bottom: "conv1_2"
top: "conv1_2"
}
#CONV2##########################################################
layer {
name: "pool1"
type: "Pooling"
bottom: "conv1_2"
top: "pool1"
pooling_param {
pool: MAX
kernel_size: 2
stride: 2
}
}
layer {
name: "conv2_1"
type: "Convolution"
bottom: "pool1"
top: "conv2_1"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 32
pad: 1
kernel_size: 3
weight_filler {
type: "xavier"
}
bias_term: false
}
}
layer {
name: "relu2_1"
type: "ReLU"
bottom: "conv2_1"
top: "conv2_1"
}
layer {
name: "conv2_2"
type: "Convolution"
bottom: "conv2_1"
top: "conv2_2"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 16
pad: 0
kernel_size: 1
weight_filler {
type: "xavier"
}
bias_term: false
}
}
layer {
name: "relu2_2"
type: "ReLU"
bottom: "conv2_2"
top: "conv2_2"
}
#CONV3##########################################################
layer {
name: "pool2"
type: "Pooling"
bottom: "conv2_2"
top: "pool2"
pooling_param {
pool: MAX
kernel_size: 2
stride: 2
}
}
layer {
name: "conv3_1"
type: "Convolution"
bottom: "pool2"
top: "conv3_1"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 64
pad: 1
kernel_size: 3
weight_filler {
type: "xavier"
}
bias_term: false
}
}
layer {
name: "relu3_1"
type: "ReLU"
bottom: "conv3_1"
top: "conv3_1"
}
layer {
name: "conv3_2"
type: "Convolution"
bottom: "conv3_1"
top: "conv3_2"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 32
pad: 0
kernel_size: 1
weight_filler {
type: "xavier"
}
bias_term: false
}
}
layer {
name: "relu3_2"
type: "ReLU"
bottom: "conv3_2"
top: "conv3_2"
}
layer {
name: "conv3_3"
type: "Convolution"
bottom: "conv3_2"
top: "conv3_3"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 64
pad: 1
kernel_size: 3
weight_filler {
type: "xavier"
}
bias_term: false
}
}
layer {
name: "relu3_3"
type: "ReLU"
bottom: "conv3_3"
top: "conv3_3"
}
#CONV4##########################################################
layer {
name: "pool3"
type: "Pooling"
bottom: "conv3_3"
top: "pool3"
pooling_param {
pool: MAX
kernel_size: 2
stride: 2
}
}
layer {
name: "conv4_1"
type: "Convolution"
bottom: "pool3"
top: "conv4_1"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 128
pad: 1
kernel_size: 3
weight_filler {
type: "xavier"
}
bias_term: false
}
}
layer {
name: "relu4_1"
type: "ReLU"
bottom: "conv4_1"
top: "conv4_1"
}
layer {
name: "conv4_2"
type: "Convolution"
bottom: "conv4_1"
top: "conv4_2"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 64
pad: 0
kernel_size: 1
weight_filler {
type: "xavier"
}
bias_term: false
}
}
layer {
name: "relu4_2"
type: "ReLU"
bottom: "conv4_2"
top: "conv4_2"
}
layer {
name: "conv4_3"
type: "Convolution"
bottom: "conv4_2"
top: "conv4_3"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 128
pad: 1
kernel_size: 3
weight_filler {
type: "xavier"
}
bias_term: false
}
}
layer {
name: "relu4_3"
type: "ReLU"
bottom: "conv4_3"
top: "conv4_3"
}
#CONV5##########################################################
layer {
name: "pool4"
type: "Pooling"
bottom: "conv4_3"
top: "pool4"
pooling_param {
pool: MAX
kernel_size: 2
stride: 2
}
}
layer {
name: "conv5_1"
type: "Convolution"
bottom: "pool4"
top: "conv5_1"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 128
pad: 1
kernel_size: 3
weight_filler {
type: "xavier"
}
bias_term: false
dilation: 1
}
}
layer {
name: "relu5_1"
type: "ReLU"
bottom: "conv5_1"
top: "conv5_1"
}
layer {
name: "conv5_2"
type: "Convolution"
bottom: "conv5_1"
top: "conv5_2"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 128
pad: 0
kernel_size: 1
weight_filler {
type: "xavier"
}
bias_term: false
dilation: 1
}
}
layer {
name: "relu5_2"
type: "ReLU"
bottom: "conv5_2"
top: "conv5_2"
}
layer {
name: "conv5_3"
type: "Convolution"
bottom: "conv5_2"
top: "conv5_3"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 128
pad: 1
kernel_size: 3
weight_filler {
type: "xavier"
}
bias_term: false
dilation: 1
}
}
layer {
name: "relu5_3"
type: "ReLU"
bottom: "conv5_3"
top: "conv5_3"
}
#CONV6##########################################################
layer {
name: "pool5"
type: "Pooling"
bottom: "conv5_3"
top: "pool5"
pooling_param {
pool: MAX
kernel_size: 2
stride: 2
}
}
layer {
name: "conv6_1"
type: "Convolution"
bottom: "pool5"
top: "conv6_1"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 128
pad: 1
kernel_size: 3
weight_filler {
type: "xavier"
}
bias_term: false
dilation: 1
}
}
layer {
name: "relu6_1"
type: "ReLU"
bottom: "conv6_1"
top: "conv6_1"
}
layer {
name: "conv6_2"
type: "Convolution"
bottom: "conv6_1"
top: "conv6_2"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 128
pad: 0
kernel_size: 1
weight_filler {
type: "xavier"
}
bias_term: false
dilation: 1
}
}
layer {
name: "relu6_2"
type: "ReLU"
bottom: "conv6_2"
top: "conv6_2"
}
layer {
name: "conv6_3"
type: "Convolution"
bottom: "conv6_2"
top: "conv6_3"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 128
pad: 1
kernel_size: 3
weight_filler {
type: "xavier"
}
bias_term: false
dilation: 1
}
}
layer {
name: "relu6_3"
type: "ReLU"
bottom: "conv6_3"
top: "conv6_3"
}
#PRIORBOX3##########################################
layer {
name: "conv3_3_norm_mbox_loc"
type: "Convolution"
bottom: "conv3_3"
top: "conv3_3_norm_mbox_loc"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 12
pad: 1
kernel_size: 3
stride: 1
weight_filler {
type: "xavier"
}
bias_term: false
}
}
layer {
name: "conv3_3_norm_mbox_conf"
type: "Convolution"
bottom: "conv3_3"
top: "conv3_3_norm_mbox_conf"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 6
pad: 1
kernel_size: 3
stride: 1
weight_filler {
type: "xavier"
}
bias_term: false
}
}
#PRIORBOX4##########################################
layer {
name: "conv4_3_norm_mbox_loc"
type: "Convolution"
bottom: "conv4_3"
top: "conv4_3_norm_mbox_loc"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 8
pad: 1
kernel_size: 3
stride: 1
weight_filler {
type: "xavier"
}
bias_term: false
}
}
layer {
name: "conv4_3_norm_mbox_conf"
type: "Convolution"
bottom: "conv4_3"
top: "conv4_3_norm_mbox_conf"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 4
pad: 1
kernel_size: 3
stride: 1
weight_filler {
type: "xavier"
}
bias_term: false
}
}
#PRIORBOX5##########################################
layer {
name: "conv5_3_norm_mbox_loc"
type: "Convolution"
bottom: "conv5_3"
top: "conv5_3_norm_mbox_loc"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 8
pad: 1
kernel_size: 3
stride: 1
weight_filler {
type: "xavier"
}
bias_term: false
}
}
layer {
name: "conv5_3_norm_mbox_conf"
type: "Convolution"
bottom: "conv5_3"
top: "conv5_3_norm_mbox_conf"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 4
pad: 1
kernel_size: 3
stride: 1
weight_filler {
type: "xavier"
}
bias_term: false
}
}
#PRIORBOX6##########################################
layer {
name: "conv6_3_norm_mbox_loc"
type: "Convolution"
bottom: "conv6_3"
top: "conv6_3_norm_mbox_loc"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 12
pad: 1
kernel_size: 3
stride: 1
weight_filler {
type: "xavier"
}
bias_term: false
}
}
layer {
name: "conv6_3_norm_mbox_conf"
type: "Convolution"
bottom: "conv6_3"
top: "conv6_3_norm_mbox_conf"
param {
lr_mult: 1.0
decay_mult: 1.0
}
convolution_param {
num_output: 6
pad: 1
kernel_size: 3
stride: 1
weight_filler {
type: "xavier"
}
bias_term: false
}
}
person
bicycle
car
motorbike
aeroplane
bus
train
truck
boat
traffic light
fire hydrant
stop sign
parking meter
bench
bird
cat
dog
horse
sheep
cow
elephant
bear
zebra
giraffe
backpack
umbrella
handbag
tie
suitcase
frisbee
skis
snowboard
sports ball
kite
baseball bat
baseball glove
skateboard
surfboard
tennis racket
bottle
wine glass
cup
fork
knife
spoon
bowl
banana
apple
sandwich
orange
broccoli
carrot
hot dog
pizza
donut
cake
chair
sofa
pottedplant
bed
diningtable
toilet
tvmonitor
laptop
mouse
remote
keyboard
cell phone
microwave
oven
toaster
sink
refrigerator
book
clock
vase
scissors
teddy bear
hair drier
toothbrush
person
bicycle
car
motorbike
aeroplane
bus
train
truck
boat
traffic light
fire hydrant
stop sign
parking meter
bench
bird
cat
dog
horse
sheep
cow
elephant
bear
zebra
giraffe
backpack
umbrella
handbag
tie
suitcase
frisbee
skis
snowboard
sports ball
kite
baseball bat
baseball glove
skateboard
surfboard
tennis racket
bottle
wine glass
cup
fork
knife
spoon
bowl
banana
apple
sandwich
orange
broccoli
carrot
hot dog
pizza
donut
cake
chair
sofa
pottedplant
bed
diningtable
toilet
tvmonitor
laptop
mouse
remote
keyboard
cell phone
microwave
oven
toaster
sink
refrigerator
book
clock
vase
scissors
teddy bear
hair drier
toothbrush
person
bicycle
car
motorbike
aeroplane
bus
train
truck
boat
traffic light
fire hydrant
stop sign
parking meter
bench
bird
cat
dog
horse
sheep
cow
elephant
bear
zebra
giraffe
backpack
umbrella
handbag
tie
suitcase
frisbee
skis
snowboard
sports ball
kite
baseball bat
baseball glove
skateboard
surfboard
tennis racket
bottle
wine glass
cup
fork
knife
spoon
bowl
banana
apple
sandwich
orange
broccoli
carrot
hot dog
pizza
donut
cake
chair
sofa
pottedplant
bed
diningtable
toilet
tvmonitor
laptop
mouse
remote
keyboard
cell phone
microwave
oven
toaster
sink
refrigerator
book
clock
vase
scissors
teddy bear
hair drier
toothbrush
// 常用数据类型和宏定义
#ifndef __COMMON_DEFINITION_H__
#define __COMMON_DEFINITION_H__
#include <string>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
namespace migraphxSamples
{
// memory deallocation
#define SAFE_DELETE(p) { if ((p)) { delete (p); (p) = NULL; } }
#define SAFE_DELETE_ARRAY(p) { if ((p)) { delete[] (p); (p) = NULL; } }
// 路径分隔符(Linux:‘/’,Windows:’\\’)
#ifdef _WIN32
#define PATH_SEPARATOR '\\'
#else
#define PATH_SEPARATOR '/'
#endif
#define CONFIG_FILE "../Resource/Configuration.xml"
// time
typedef struct __Time
{
string year;
string month;
string day;
string hour;
string minute;
string second;
string millisecond; // ms
string microsecond; // us
string weekDay;
}_Time;
// 错误码
typedef enum _ErrorCode
{
SUCCESS=0, // 0
MODEL_NOT_EXIST, // 模型不存在
CONFIG_FILE_NOT_EXIST, // 配置文件不存在
FAIL_TO_LOAD_MODEL, // 加载模型失败
FAIL_TO_OPEN_CONFIG_FILE, // 加载配置文件失败
IMAGE_ERROR, // 图像错误
}ErrorCode;
// 预测值:score label
typedef struct _ResultOfPrediction
{
float confidence; // score
int label;
}ResultOfPrediction;
typedef struct _InitializationParameterOfDetector
{
std::string parentPath;
std::string configFilePath;
cv::Size inputSize;
std::string logName;
}InitializationParameterOfDetector;
typedef struct _InitializationParameterOfDecoder
{
char str_devid[4] = {0};// = {0};
const char *xcoder_params = NULL;// = "out=hw";
const char *dec_name = NULL;// = "h264_ni_quadra_dec";
//const char *filters_descr;// = "ni_quadra_scale=1280:720:format=yuv420p,hwdownload,format=yuv420p";
//const char *filters_descr;// = "ni_quadra_scale=1280:720:format=rgba,hwdownload,format=rgba";
const char *filters_descr = NULL;// = "ni_quadra_scale=1280:720:format=bgrp,hwdownload,format=bgrp";
const char *src_filename = NULL;// = "../Resource/Images/Mean4.mp4";
}InitializationParameterOfDecoder;
typedef struct _InitializationParameterOfDetector InitializationParameterOfClassifier;
typedef struct _InitializationParameterOfDetector InitializationParameterOfOCR;
typedef struct _ResultOfDetection
{
Rect boundingBox;
float confidence;
int classID;
string className;
bool exist;
_ResultOfDetection():confidence(0.0f),classID(0),exist(true){}
}ResultOfDetection;
struct OCRPredictResult {
std::vector<std::vector<int>> box;
std::string text;
float score = -1.0;
float cls_score;
int cls_label = -1;
};
}
#endif // COMMONDEFINITION
// 常用工具
#ifndef __COMMON_UTILITY_H__
#define __COMMON_UTILITY_H__
#include <mutex>
#include <string>
#include <vector>
#include <CommonDefinition.h>
#include <migraphx/onnx.hpp>
#include <migraphx/gpu/target.hpp>
#include <migraphx/gpu/hip.hpp>
#include <migraphx/generate.hpp>
#include <migraphx/quantization.hpp>
using namespace std;
namespace migraphxSamples
{
string GetCurrentTimeString();
std::vector<string> SplitString(string str,std::string separator);
// 排序规则: 按照置信度或者按照面积排序
bool CompareConfidence(const ResultOfDetection &L,const ResultOfDetection &R);
bool CompareArea(const ResultOfDetection &L,const ResultOfDetection &R);
void NMS(std::vector<ResultOfDetection> &detections, float IOUThreshold);
migraphx::parameter_map CreateParameterMap(migraphx::program & p);
}
#endif //
/*
* Decoder
* 2022.09.23 sugon
* */
#ifndef __DECODER_H__
#define __DECODER_H__
extern "C"
{
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <sys/poll.h>
#include <sys/time.h>
#include <libavcodec/avcodec.h>
#include <libavcodec/packet.h>
#include <libavcodec/codec.h>
#include <libavutil/imgutils.h>
#include <libavutil/samplefmt.h>
#include <libavutil/timestamp.h>
#include <libavformat/avformat.h>
#include <libavfilter/buffersink.h>
#include <libavfilter/buffersrc.h>
#include <libswscale/swscale.h>
#include <libavutil/time.h>
#include <libavutil/opt.h>
#ifdef DMA
#include <libavutil/hwcontext_ni_quad.h>
#include <ni_p2p_ioctl.h>
typedef struct HWContextType {
enum AVHWDeviceType type;
const char *name;
const enum AVPixelFormat *pix_fmts;
size_t device_hwctx_size;
size_t device_priv_size;
size_t device_hwconfig_size;
size_t frames_hwctx_size;
size_t frames_priv_size;
int (*device_create)(AVHWDeviceContext *ctx, const char *device, AVDictionary *opts, int flags);
int (*device_derive)(AVHWDeviceContext *dst_ctx, AVHWDeviceContext *src_ctx, AVDictionary *opts, int flags);
int (*device_init)(AVHWDeviceContext *ctx);
void (*device_uninit)(AVHWDeviceContext *ctx);
int (*frames_get_constraints)(AVHWDeviceContext *ctx, const void *hwconfig, AVHWFramesConstraints *constraints);
int (*frames_init)(AVHWFramesContext *ctx);
void (*frames_uninit)(AVHWFramesContext *ctx);
int (*frames_get_buffer)(AVHWFramesContext *ctx, AVFrame *frame);
int (*transfer_get_formats)(AVHWFramesContext *ctx, enum AVHWFrameTransferDirection dir, enum AVPixelFormat **formats);
int (*transfer_data_to)(AVHWFramesContext *ctx, AVFrame *dst, const AVFrame *src);
int (*transfer_data_from)(AVHWFramesContext *ctx, AVFrame *dst, const AVFrame *src);
int (*map_to)(AVHWFramesContext *ctx, AVFrame *dst, const AVFrame *src, int flags);
int (*map_from)(AVHWFramesContext *ctx, AVFrame *dst, const AVFrame *src, int flags);
int (*frames_derive_to)(AVHWFramesContext *dst_ctx, AVHWFramesContext *src_ctx, int flags);
int (*frames_derive_from)(AVHWFramesContext *dst_ctx, AVHWFramesContext *src_ctx, int flags);
} HWContextType;
struct AVHWFramesInternal {
const HWContextType *hw_type;
void *priv;
AVBufferPool *pool_internal;
AVBufferRef *source_frames;
int source_allocation_map_flags;
};
#endif
}
#include <CommonDefinition.h>
#include "hip/hip_runtime.h"
#include <hip/hip_runtime.h>
namespace migraphxSamples
{
struct DCU_Frame
{
unsigned char* dcu_data;
int data_len;
int format = 0;
int width;
int height;
cv::Mat srcImage;
};
class Decoder
{
public:
Decoder(int dev);
~Decoder();
int DecoderInit(InitializationParameterOfDecoder initDecoder);
#ifdef DMA
int retrieve_filter_frame(DCU_Frame dcu_frame, AVFrame *src);
#endif
void setup_loglevel(char *loglevel);
AVFormatContext *fmt_ctx = NULL;
AVCodecContext *video_dec_ctx = NULL;
AVFilterContext *buffersink_ctx;
AVFilterContext *buffersrc_ctx;
AVFilterGraph *filter_graph;
AVStream *video_stream = NULL;
AVFrame *frame = NULL;
AVFrame *filt_frame = NULL;
AVPacket *pkt = NULL;
const AVCodec *dec = NULL;
int video_stream_idx = -1;
private:
int device = -1;
int init_filters(const char *filters_descr);
};
}
#endif
// SSD检测器
#ifndef __DETECTOR_RETINAFACE_H__
#define __DETECTOR_RETINAFACE_H__
#include <string>
#include <migraphx/program.hpp>
#include <opencv2/opencv.hpp>
#include <CommonDefinition.h>
#include <SSDDefinition.h>
#include "Decoder.h"
using namespace std;
using namespace cv;
using namespace migraphx;
namespace migraphxSamples
{
class DetectorRetinaFace
{
public:
DetectorRetinaFace();
~DetectorRetinaFace();
ErrorCode Initialize(InitializationParameterOfDetector initializationParameterOfDetector);
ErrorCode Detect(const cv::Mat &srcImage,std::vector<ResultOfDetection> &resultsOfDetection);
ErrorCode Detect(DCU_Frame &srcImage, std::vector<ResultOfDetection> &resultsOfDetection);
float* preprocess_Image = NULL;
private:
ErrorCode DoCommonInitialization(InitializationParameterOfDetector initializationParameterOfDetector);
void GetSSDParameter();
void GetResult(const std::vector<std::vector<float>> &classification,const std::vector<std::vector<float>> &regression,std::vector<ResultOfDetection> &resultsOfDetection);
// 添加4个新层:PermuteLayer,PriorBoxLayer,SoftmaxLayer,DetectionOutputLayer
std::vector<float> PermuteLayer(const std::vector<float> &data,int width,int height,int channels);
void PriorBoxLayer(int indexOfLayer,int* priorboxOutputData);
void SoftmaxLayer(int softMaxWidth[],int* softMaxInputData[], int* softMaxOutputData);
void DetectionOutputLayer(int* allLocPreds[], int* allPriorBoxes[],int* confScores, int* assistMemPool);
void ComputeSoftMax(int* src, int size, int* dst);
void QuickSort(int* src,int low, int high, QuickSortStack *stack,int maxNum);
void NonMaxSuppression( int* proposals, int anchorsNum,int NMSThresh,int maxRoiNum);
void Swap(int* src1, int* src2);
void ComputeOverlap(int xMin1, int yMin1, int xMax1, int yMax1, int xMin2,int yMin2, int xMax2, int yMax2, int* areaSum, int* areaInter);
void CreateDetectionResults(std::vector<ResultOfDetection> &resultsOfDetection);
private:
cv::FileStorage configurationFile;
InitializationParameterOfDetector initializationParameter;
FILE *logFile;
// net
migraphx::program net;
cv::Size inputSize;
string inputName;
migraphx::shape inputShape;
float scale;
cv::Scalar meanValue;
bool swapRB;
bool crop;
bool useInt8;
bool useFP16;
SSDParameter ssdParameter;
migraphx::parameter_map ParameterMap;
};
}
#endif
// SSD检测器
#ifndef __DETECTOR_SSD_H__
#define __DETECTOR_SSD_H__
#include <string>
#include <migraphx/program.hpp>
#include <opencv2/opencv.hpp>
#include <CommonDefinition.h>
#include <SSDDefinition.h>
#include "Decoder.h"
using namespace std;
using namespace cv;
using namespace migraphx;
namespace migraphxSamples
{
class DetectorSSD
{
public:
DetectorSSD();
~DetectorSSD();
ErrorCode Initialize(InitializationParameterOfDetector initializationParameterOfDetector);
ErrorCode Detect(const cv::Mat &srcImage,std::vector<ResultOfDetection> &resultsOfDetection);
ErrorCode Detect(DCU_Frame &srcImage, std::vector<ResultOfDetection> &resultsOfDetection);
float* preprocess_Image = NULL;
private:
ErrorCode DoCommonInitialization(InitializationParameterOfDetector initializationParameterOfDetector);
void GetSSDParameter();
void GetResult(const std::vector<std::vector<float>> &classification,const std::vector<std::vector<float>> &regression,std::vector<ResultOfDetection> &resultsOfDetection);
// 添加4个新层:PermuteLayer,PriorBoxLayer,SoftmaxLayer,DetectionOutputLayer
std::vector<float> PermuteLayer(const std::vector<float> &data,int width,int height,int channels);
void PriorBoxLayer(int indexOfLayer,int* priorboxOutputData);
void SoftmaxLayer(int softMaxWidth[],int* softMaxInputData[], int* softMaxOutputData);
void DetectionOutputLayer(int* allLocPreds[], int* allPriorBoxes[],int* confScores, int* assistMemPool);
void ComputeSoftMax(int* src, int size, int* dst);
void QuickSort(int* src,int low, int high, QuickSortStack *stack,int maxNum);
void NonMaxSuppression( int* proposals, int anchorsNum,int NMSThresh,int maxRoiNum);
void Swap(int* src1, int* src2);
void ComputeOverlap(int xMin1, int yMin1, int xMax1, int yMax1, int xMin2,int yMin2, int xMax2, int yMax2, int* areaSum, int* areaInter);
void CreateDetectionResults(std::vector<ResultOfDetection> &resultsOfDetection);
private:
cv::FileStorage configurationFile;
InitializationParameterOfDetector initializationParameter;
FILE *logFile;
// net
migraphx::program net;
cv::Size inputSize;
string inputName;
migraphx::shape inputShape;
float scale;
cv::Scalar meanValue;
bool swapRB;
bool crop;
bool useInt8;
bool useFP16;
SSDParameter ssdParameter;
migraphx::parameter_map ParameterMap;
};
}
#endif
// YOLOV3检测器
#ifndef __DETECTOR_YOLOV3_H__
#define __DETECTOR_YOLOV3_H__
#include <string>
#include <migraphx/program.hpp>
#include <opencv2/opencv.hpp>
#include <CommonDefinition.h>
#include "Decoder.h"
using namespace std;
using namespace cv;
using namespace migraphx;
namespace migraphxSamples
{
// YOLOV3参数
typedef struct _YOLOV3Parameter
{
int numberOfClasses;// 类别数
float confidenceThreshold;// 置信度阈值
float nmsThreshold;// NMS阈值
float objectThreshold;// 目标置信度值
}YOLOV3Parameter;
class DetectorYOLOV3
{
public:
DetectorYOLOV3();
~DetectorYOLOV3();
ErrorCode Initialize(InitializationParameterOfDetector initializationParameterOfDetector);
ErrorCode Detect(const cv::Mat &srcImage, std::vector<ResultOfDetection> &resultsOfDetection, double* dprep_time, double* deval_time, double* dpostp_time);
ErrorCode Detect(DCU_Frame &srcImage, std::vector<ResultOfDetection> &resultsOfDetection);
float* preprocess_Image = NULL;
private:
ErrorCode DoCommonInitialization(InitializationParameterOfDetector initializationParameterOfDetector);
private:
cv::FileStorage configurationFile;
InitializationParameterOfDetector initializationParameter;
FILE *logFile;
// net
migraphx::program net;
cv::Size inputSize;
string inputName;
migraphx::shape inputShape;
bool useFP16;
vector<string> classNames;
YOLOV3Parameter yolov3Parameter;
migraphx::parameter_map ParameterMap;
};
}
#endif
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment