MTCNN人脸检测论文+代码实现(python)(全)

【MTCNN人脸检测论文+代码实现(python)(全)】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 = https://www.it610.com/article/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 = https://www.it610.com/article/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)

    推荐阅读