【机器学习实践】Kaggle 之 Face Verification Challenge练手
来源:互联网 发布:汤灿下落知乎 编辑:程序博客网 时间:2024/06/10 01:33
导言
这个一个Inclass 的比赛,主要任务就是给定1000多张图片所组成的901153对所有的组合图像,要求进行判断是否是同一个人。
作为第一次做Kaggle的比赛,来练练手还是不错的。
由于在这所有的二元组中,数据是极其步平衡的,所以会导致即使我们把这些所有的组合都判断为1(不同的人),它的精度也会达到99%以上,所以在这里单单评测识别率是没有意义的。
官方这边给出的评价方法是AUC,也就是说在ROC曲线之下的面积来作为衡量的标准。
步骤
数据下载
官方给定的数据训练数据和测试数据,由于我这边是采用无监督的方法,所以训练数据也不重要,可以步采用。
处理
训练数据和测试数据都有给人脸框位置和关键点位置,然而,它具体的方法没有给定,所以还是无法采用,最终的方法是,我采用自己的那一套人脸检测和对齐方法,对于自己的方法没有检测和对齐到的图像,采用官方提供的版本代替。
代码如下:
# -*- coding: utf-8 -*-'''@brief: 进行一对一的人脸比对,前提是人脸已经统一对齐过了。@author: Riwei Chen <riwei.chen@outlook.com>'''import matplotlib.pyplot as pltimport numpy as npimport skimage import sysimport osimport globimport numpy.linalg as LAcaffe_root = '/home/crw/caffe-master/'caffe_root = '/media/crw/MyBook/Caffe/caffe-triplet/'sys.path.insert(0, caffe_root + 'python')import caffeimport sklearnimport sklearn.metrics.pairwise as pwfrom sklearn.metrics import classification_reportfrom sklearn.metrics import accuracy_score,roc_auc_scorefrom skimage import transform as tfcaffe.set_mode_cpu()# 训练数据中,每个通道的平均值averageImg = [129.1863,104.7624,93.5940]# 全局使用到的一些数据,保留在全局变量#=====================================metric='cosine'model_define='model_maxout/deploy.prototxt'model_weight='model_maxout/small_maxout2__iter_1360000.caffemodel'#model_weight='/media/crw/MyBook/Model/FaceRecognition/Softmax/try6_7/small_maxout100x100__iter_1400000.caffemodel'feature_layer='eltwise10'#feature_layer='l2_norm'image_formats =['jpg','png','bmp']feature_len = 256data_w = 128data_h = 128#feature_len = 128#data_w = 256#data_h = 256data_as_gray = Truesub_mean = Falsescale = 1#scale =255net = caffe.Classifier(model_define, model_weight)#====================================def read_image(filename,w=128,h=128,as_grey=False): ''' @brief: 读取一个图片,返回矩阵 @param:w,h:保留的图像大小 ''' if as_grey == True: X=np.empty((1,1,w,h)) else: X=np.empty((1,3,w,h)) image=skimage.io.imread(filename,as_grey=as_grey) image=tf.resize(image,(w,h))*scale if as_grey == True: X[0,0,:,:]=image[:,:] else: # 注意通道的一致性 if sub_mean == True: X[0,2,:,:]=image[:,:,0]-averageImg[0] X[0,1,:,:]=image[:,:,1]-averageImg[1] X[0,0,:,:]=image[:,:,2]-averageImg[2] else: X[0,2,:,:]=image[:,:,0] X[0,1,:,:]=image[:,:,1] X[0,0,:,:]=image[:,:,2] return Xdef get_image_feature(filename): ''' @brief:获取特征 @param: 图像的文件 @return:feature,提取到的人脸特征 ''' X=read_image(filename,w=data_w,h=data_h,as_grey=data_as_gray) out = net.forward_all(data=X) feature = np.float64(out[feature_layer]) feature=np.reshape(feature,(1,feature_len)) return featuredef consia_distance(feature1, feature2): ''' @brief: 计算两个向量的余炫距离。 ''' cx = lambda a, b : round(np.inner(a, b)/(LA.norm(a)*LA.norm(b)), 2) consia=cx(feature1,feature2) result = 0.5+0.5*consia return resultdef evaluate_by_distance(feature1,feature2): ''' @brief:计算提到的特征之间的距离 @param:feature1 特征1 @param:feature2 特征2 ''' if metric == 'cosine': consia_dist = consia_distance(feature1,feature2) return consia_dist else: mt=pw.pairwise_distances(feature1, feature2, metric) distance=mt[0][0] return distanceimage_formats = ['jpg','png']feature_dict = dict()def evaluate_kaggle_test(filepath,filename,resultfile='submit.csv'): ''' @brief: 测试evaluate kaggle 数据集合 ''' fid = open(filename) fid.readline() lines = fid.readlines() fid.close() fid =open(resultfile,'w') fid.write("Id,Prediction"+'\n') result = np.zeros((len(lines),)) i = 0 for line in lines: word = line.split(',') filename1 = os.path.join(filepath,word[1].strip()) filename2 = os.path.join(filepath,word[2].strip()) if feature_dict.has_key(filename1): feature1 = feature_dict[filename1] else: feature1 =get_image_feature(filename1) feature_dict[filename1] = feature1 if feature_dict.has_key(filename2): feature2 = feature_dict[filename2] else: feature2 =get_image_feature(filename2) feature_dict[filename2] = feature2 distance = evaluate_by_distance(feature1,feature2) result[i] = distance i=i+1 d_max = np.max(result) d_min =np.min(result) print d_max,d_min i=0 for line in lines: word = line.split(',') fid.write(word[0]+','+str((result[i]-d_min)/(d_max-d_min))+'\n') i=i+1 fid.close()if __name__ == '__main__': filepath = '/media/crw/MyBook/TestData/kaggle_Face_verification_challenge/train_dlib' #evaluate_kaggle_train(filepath) filepath = '/media/crw/MyBook/TestData/kaggle_Face_verification_challenge/test_dlib_crop' filename = '/media/crw/MyBook/TestData/kaggle_Face_verification_challenge/pairs.csv' resultfile='submission.csv' evaluate_kaggle_test(filepath,filename,resultfile)
结果
第一次上传的时候,排名第一:
最终的结果:
0 0
- 【机器学习实践】Kaggle 之 Face Verification Challenge练手
- 【机器学习实践】Kaggle 之 Face Verification Challenge练手
- Python机器学习实践与Kaggle实战
- Kaggle Titanic 机器学习实践笔记
- 《Python 机器学习及实践--从零开始通往kaggle竞赛之路》笔记
- Kaggle Titanic 机器学习实践笔记(二)
- 《python机器学习及实践-从零开始通往kaggle竞赛之路(代码Python 3.6 版)》chapter1.1
- 《python机器学习及实践-从零开始通往kaggle竞赛之路(代码Python 3.6 版)》chapter2.1.1.1
- 《python机器学习及实践-从零开始通往kaggle竞赛之路(代码Python 3.6 版)》chapter2.1.1.2
- 《python机器学习及实践-从零开始通往kaggle竞赛之路(代码Python 3.6 版)》chapter2.1.1.3
- 《python机器学习及实践-从零开始通往kaggle竞赛之路(代码Python 3.6 版)》chapter2.1.1.4
- Kaggle机器学习之模型融合(stacking)心得
- 机器学习-Kaggle竞赛-Titanic
- 机器学习系列(3)_逻辑回归应用之Kaggle泰坦尼克之灾
- 机器学习系列(3)_逻辑回归应用之Kaggle泰坦尼克之灾
- 机器学习系列(3)_逻辑回归应用之Kaggle泰坦尼克之灾
- 机器学习系列(3)_逻辑回归应用之Kaggle泰坦尼克之灾
- 机器学习系列(3)_逻辑回归应用之Kaggle泰坦尼克之灾
- Vmvare 安装mac系统遇到几个小问题
- 一个简单的嗅探器
- 好雨云使用OKRs做绩效管理
- 十四周项目2 二叉树排序树中的查找路径
- Math类与Random类使用(Java)
- 【机器学习实践】Kaggle 之 Face Verification Challenge练手
- android系统颜色color资源问题分析
- HTML总结II
- 正确使用adb读取data目录下的文件方式
- 【C++ STL应用与实现】1: STL概览和分类
- HDU 2089 & HDU 3555 数位dp
- 单位和值
- 连接器
- 正则表达式