最近转到人脸组,接手的第一件事,就是使用shufflenet进行人脸多属性分类,多属性包括:眼镜(墨镜,透明眼镜,没戴眼镜),口罩(戴口罩,没戴口罩),刘海(遮住眉毛的刘海,没有刘海),帽子(戴了帽子,没戴帽子);
1)进行数据的收集和处理;
进入网络的数据我使用了hdf5格式保存。这种格式的数据保存,我使用过程:
第一步,我使用了python将数据保存为图片名字+标签的的txt文件;
第二步,使用了python文件生成了多标签的“.h5”文件。
2)进行网络结构的修改;
shufflenet的末尾使用的dropout,参数设置的是0.5;同时加入了4个fc层,分别对应了四个任务(眼镜,刘海,帽子,口罩),其中眼镜属于细粒度分类,将眼镜层的fc层的输出设置的是3个,其他fc层设置的是2个输出;同时为了节省时间的开销,我将常规的224*224的输入data修改成为了112*112的大小,并将shufflenet 的pooling层给删除了;
3)注意
a,dropout在训练的时候使用,测试时可以删除dropout层;
b,我在对多属性进行测试时,忘了加入softmax层,导致结果分数不在0~1之间。
测试代码:
def proprocess(img):
tempimg = np.zeros((1, 112, 112, 3))
scale_img = cv2.resize(img, (112, 112))
scale_img = (scale_img - 127.5) / 125.0
tempimg[0, :, :, :] = scale_img
tempimg = tempimg.transpose(0, 3, 1, 2)
return tempimg
for img in imgPaths:#遍历测试图片
num += 1
print(num)
clip_img = cv2.imread(img)
# cv2.imwrite(save_img_dir, clip_img)
t0 = time.time()
proprocess_img = proprocess(clip_img)
net.blobs['data'].data[...] = proprocess_img
output = net.forward()
# predictions1 = output[self.outputs[0]]
# predictions2 = out[self.outputs[1]]
# predictions3 = out[self.outputs[2]]
# predictions4 = out[self.outputs[3]]
mask = copy.deepcopy(net.blobs['fc6_mask'].data[0])
prob_mask = mask.reshape(-1).argmax()#口罩类别
hat = copy.deepcopy(net.blobs['fc6_hat'].data[0])
prob_hat = hat.reshape(-1).argmax()#帽子类别
liuhai = copy.deepcopy(net.blobs['fc6_bangs'].data[0])
prob_liuhai = liuhai.reshape(-1).argmax()#刘海类别
eyeglasses = copy.deepcopy(net.blobs['fc6_eyeglasses'].data[0])
prob_eyeglasses = eyeglasses.reshape(-1).argmax()#眼镜类别
t1 = time.time()
result_time = (t1-t0)*1000#运行一张图片需要的时间
print("time : "+str(result_time))
(注:代码只有部分,并不能直接运行)