关于python:MTCNN人脸检测论文代码实现python全

61次阅读

共计 1809 个字符,预计需要花费 5 分钟才能阅读完成。

def adjust_input(in_data):# 调整输出

"""
    adjust the input from (h, w, c) to (1, c, h, w) for network input
Parameters:
----------
    in_data: numpy array of shape (h, w, c)
        input data
Returns:
-------
    out_data: numpy array of shape (1, c, h, w)
        reshaped array
"""if in_data.dtype is not np.dtype('float32'):
    out_data = in_data.astype(np.float32)
else:
    out_data = in_data
out_data = out_data.transpose((2,0,1))
out_data = np.expand_dims(out_data, 0)
out_data = (out_data - 127.5)*0.0078125
return out_data

def generate_bbox(map, reg, scale, threshold):# 金属期货生成 bbox

 """
     generate bbox from feature map
 Parameters:
 ----------
     map: numpy array , n x m x 1
         detect score for each position
     reg: numpy array , n x m x 4
         bbox
     scale: float number
         scale of this detection
     threshold: float number
         detect threshold
 Returns:
 -------
     bbox array
 """
 stride = 2
 cellsize = 12
 t_index = np.where(map>threshold)
 # find nothing
 if t_index[0].size == 0:
     return np.array([])
 dx1, dy1, dx2, dy2 = [reg[0, i, t_index[0], t_index[1]] for i in range(4)]
 reg = np.array([dx1, dy1, dx2, dy2])
 score = map[t_index[0], t_index[1]]
 boundingbox = np.vstack([np.round((stride*t_index[1]+1)/scale),
                          np.round((stride*t_index[0]+1)/scale),
                          np.round((stride*t_index[1]+1+cellsize)/scale),
                          np.round((stride*t_index[0]+1+cellsize)/scale),
                          score,
                          reg])
 return boundingbox.T

def detect_first_stage(img, net, scale, threshold):# 检测第一阶段

"""
    run PNet for first stage
Parameters:
----------
    img: numpy array, bgr order
        input image
    scale: float number
        how much should the input image scale
    net: PNet
        worker
Returns:
-------
    total_boxes : bboxes
"""
height, width, _ = img.shape
hs = int(math.ceil(height * scale))
ws = int(math.ceil(width * scale))
im_data = cv2.resize(img, (ws,hs))
# adjust for the network input
input_buf = adjust_input(im_data)
output = net.predict(input_buf)
boxes = generate_bbox(output[1][0,1,:,:], output[0], scale, threshold)
if boxes.size == 0:
    return None
# nms
pick = nms(boxes[:,0:5], 0.5, mode='Union')
boxes = boxes[pick]
return boxes

def detect_first_stage_warpper(args):

return detect_first_stage(*args)

正文完
 0