Tensorflow Pnet网络 科研代码代写 科研代替实现 全能代写
需求:{1、pnet网络替换成深度可分离卷积
2、加新的输出
3、换一下softnms}
1、替换网络
Pnet替换成深度可分离卷积
Mtcnn_model.py文件
2、新的输出具体是:
训练MTCNN模型所采用的的WIDER_FACE 数据集标签包含人脸的标定框的坐标之外五个对人脸特性的评价指标如图,包括模糊度(清晰的为 0,正常为 1、模糊为 2)、遮挡程度(没有遮挡为 0,部分遮挡为 1、大面积遮挡为 2)、姿势(根据人脸姿势”典型脸”为 0,“非典型脸”为1)、亮度(正常亮度为1,过亮为0)、表现力(正常情绪为0,夸张为1)
图 3.6 WIDER_FACE 数据集提供的五种标签示意图
Fig. 3.6 Five label value provided by the WIDER_FACE
人脸检测所检测到的信息作为人脸识别的输入,检测输出的信息如果含有人脸质量的评价指标,包含的信息越充分,人脸对识别率的提高越有帮助,所以在原有MTCNN基础上增加一项新的face_quality的输出,可以在后续多人脸识别过程中,针对人脸质量的评价,进行更加有效的识别。
- 图 3.5 MTCNN 模型的输出改进
- Fig. 3.5 Diagram of the output module improvement of the MTCNN model
五种人脸特性的数值之和的变化范围是从 0 到 7,根据在视频监控场景下出现多人脸检测识别情况的常见程度,对五种指标赋予0.2、0.3、0.3、0.1、0.1的权重,用均方误差函数(MSE)去训练人脸评价指标任务,其式如下:
其中 是训练样本真实值, 是网络输出的值,最终其损失函数为:
L=
原先的损失函数和论文中的权重相同,新加的𝛼face_quality(匹配分数损失函
数的权重)在P-Net、R-Net、O-Net 中为[0.5,0.5,0.5]。
改进代码:
Gen 12 net data
标签文件是:wider_face_train_bbx_gt.txt
把后面五项读进去输出
p_idx = 0 # positive
n_idx = 0 # negative
d_idx = 0 # don't care
idx = 0
box_idx = 0
boxes=[]
quality = []
labelfile = open(anno_file, 'r')
while True:
#image path
im_path = labelfile.readline().strip('\n')
if not im_path:
break
im_path = im_dir + im_path
print(im_path)
nums = labelfile.readline().strip('\n')
#print(nums)
# load image
img = cv2.imread(im_path)
img = img.astype(np.float32)
img[0, :, :] = (img[0, :, :] - 104.146) / 127.5
img[1, :, :] = (img[1, :, :] - 110.807) / 127.5
img[2, :, :] = (img[2, :, :] - 119.856) / 127.5
# print(img)
height, width, channel = img.shape
idx += 1
one_image_bbox = []
one_image_quality = []
for i in range(int(nums)):
bb_info = labelfile.readline().strip('\n').split(' ')
#boxed change to float type
bbox = [float(bb_info[i]) for i in range(4)]
xmin = bbox[0]
ymin = bbox[1]
xmax = xmin + bbox[2]
ymax = ymin + bbox[3]
bbox=[xmin, ymin, xmax, ymax]
#print(bbox)
# gt
one_image_bbox.append([bbox])
#quality
blur = float(bb_info[4]) ####
express = float(bb_info[5]) #####
illumination = float(bb_info[6]) #####
occlusion = float(bb_info[7]) #####
invalid = float(bb_info[8]) ######
pose = float(bb_info[9]) ###########
quality = float(0.2 * blur + 0.1 * express + 0.1 * illumination + 0.3 * occlusion + 0.1 * invalid + 0.1 * pose)
quality = [round(quality, 2)]
one_image_quality.append(([quality]))
#print('bbox',one_image_bbox)
#print(type(one_image_bbox))
boxes = np.array(one_image_bbox, dtype=np.float32).reshape(-1, 4)
# print(boxes)
#print(type(boxes))
quality=np.array(one_image_quality, dtype=np.float32).reshape(-1, 1)
## print('idx', idx)
#print('height', height)
# print('quality', quality)
#print(type(quality))
#print(height, width, channel)
相应的都改了
3、我的目前效果
检测不到正确人脸
图1是原始的pnet
图2是我改完的
检测不到正确人脸