当前位置:   article > 正文

人脸识别LBP的MATLAB实现_extractlbpfeatures

extractlbpfeatures

人脸识别一般包括人脸检测、识别2大方面,其中有些还需要对人脸进行校正,定位以便达到更准确。本文主要在检测和识别2个方面,做个简单的实时的实现。

 

 

人脸图像文件夹分布格式

简单的人脸识别示例代码如下:

  1. %% 导入原始图像(640*480).其中srcPath路径下有若干个文件夹,
  2. % 每个文件夹下为同一个人的图片(至少15张,越多越好),文件夹名字为该人的姓名
  3. srcPath = 'E:\Temp';
  4. imds = imageDatastore(srcPath,...
  5. 'LabelSource','foldernames',...
  6. 'includesubfolder',true,...
  7. 'FileExtensions','.jpg');
  8. %% 检测并保存人脸为png格式,小图人脸
  9. faceDetector = vision.CascadeObjectDetector;
  10. for i = 1:length(imds.Files)
  11. I = readimage(imds,i);
  12. bboxes = step(faceDetector, I);
  13. maxRect = [];
  14. for j = 1:size(bboxes,1)
  15. if bboxes(j,3)>=bboxes(1,3)
  16. maxRect = bboxes(j,:);
  17. end
  18. end
  19. if ~isempty(maxRect)
  20. faceImg = imcrop(I,maxRect);
  21. [dstPath,imageName,~] = fileparts(imds.Files{i});
  22. imwrite(faceImg,fullfile(dstPath,[imageName,'.png']));
  23. end
  24. end
  25. %% 导入检测到的人脸图像png
  26. imdsFace = imageDatastore(srcPath,...
  27. 'LabelSource','foldernames',...
  28. 'includesubfolder',true,...
  29. 'FileExtensions','.png',...
  30. 'ReadFcn',@IMAGERESIZE);
  31. [imdsTrain,imdsTest] = splitEachLabel(imdsFace,10);
  32. %% 画图看训练的数据集
  33. numsCategories = length(categories(imdsTrain.Labels));
  34. I = zeros(150,150,3,numsCategories*10);% 图像大小为150*150*3,有numsCategories*10张图像
  35. for i = 1:numsCategories*10
  36. I(:,:,:,i) = readimage(imdsTrain,i);
  37. end
  38. montage(uint8(I),'size',[numsCategories,10]);
  39. %% 提取LBP特征
  40. numTrain = length(imdsTrain.Labels);
  41. image1 = rgb2gray(readimage(imdsTrain,1));
  42. feature1 = extractLBPFeatures(image1, 'Upright',true,'cellsize',[18 18]);
  43. featuresMat = zeros(numTrain,length(feature1));
  44. for i = 1:numTrain
  45. image = rgb2gray(readimage(imdsTrain,i));
  46. featuresMat(i,:) = extractLBPFeatures(image, 'Upright',true,'cellsize',[18 18]);
  47. end
  48. %% test
  49. numCorrect = 0;
  50. numTest = length(imdsTest.Files);
  51. for i = 1:numTest
  52. grayTest = rgb2gray(readimage(imdsTest,i));
  53. featureTest = extractLBPFeatures(grayTest,'Upright',true,'cellsize',[18 18]);
  54. actualLabel = imdsTest.Labels(i);
  55. %% predict
  56. minDist = realmax;
  57. minIndex = 1;
  58. for j =1:numTrain
  59. currentDist = sum((featureTest-featuresMat(j,:)).^2);
  60. if currentDist<minDist
  61. minDist = currentDist;
  62. predictLabel = imdsTrain.Labels(j);% categorical类型
  63. minIndex = j;
  64. end
  65. end
  66. %% 统计正确的个数
  67. grayActual = rgb2gray(readimage(imdsTrain,minIndex));
  68. figure;imshowpair(grayActual,grayTest,'montage');
  69. if predictLabel == actualLabel
  70. numCorrect = numCorrect+1;
  71. end
  72. end
  73. disp(['正确率:',num2str(numCorrect/numTest)])
  74. %% -----------------------------------隔断-----------------
  75. %% 识别并显示
  76. cam = webcam();% 摄像头接口,没有的话从matlab central网站搜索下载
  77. detector = vision.CascadeObjectDetector('lbpcascade_frontalface.xml');
  78. detector.MinSize = [110,110];
  79. videoPlayer = vision.VideoPlayer;
  80. fig = figure;
  81. axes('parent',fig)
  82. while ishandle(fig)
  83. I = snapshot(cam);
  84. bboxes = step(detector, I);
  85. maxRect = [];
  86. for j = 1:size(bboxes,1)
  87. if bboxes(j,3)>=bboxes(1,3)
  88. maxRect = bboxes(j,:);
  89. end
  90. end
  91. if ~isempty(maxRect)&&(maxRect(1,3)>100)
  92. faceImg = imcrop(I,maxRect);
  93. grayTest = rgb2gray(faceImg);
  94. grayTest = imresize(grayTest,[150,150]);
  95. featureTest = extractLBPFeatures(grayTest,'Upright',true,'cellsize',[18 18]);
  96. %% predict
  97. minDist = realmax;
  98. minIndex = 1;
  99. for j =1:numTrain
  100. currentDist = sum((featureTest-featuresMat(j,:)).^2);
  101. if currentDist<minDist
  102. minDist = currentDist;
  103. predictLabel = imdsTrain.Labels(j);% categorical类型
  104. minIndex = j;
  105. end
  106. end
  107. strLabels = char(predictLabel);
  108. RGB = insertObjectAnnotation(I,'rectangle',maxRect,strLabels,'color','g');
  109. step(videoPlayer,RGB);
  110. end
  111. end

 

第85行代码如果webcam()报错,可以去这个网站下载usb摄像头接口函数,https://cn.mathworks.com/matlabcentral/fileexchange/49749--webcam-support--demo-files  

程序中用到的分类器为OpenCV的人脸检测分类器“lbpcascade_frontalface.xml”,这里给出下载地址:https://pan.baidu.com/s/1JLep6nVWTOXppa2M0crerw  密码: 3wuc

其中用到的人脸归一化小图形函数IMAGERESIZE为:

function output = IMAGERESIZE(input)
input = imread(input);
output = imresize(input,[150,150]);

识别效果图:

注意:imageDatastore为Matlab2016a引进的函数,适合大数据图像导入。如果您的版本过低,请改用其他检索图片的函数,如dir。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Guff_9hys/article/detail/898911
推荐阅读
相关标签
  

闽ICP备14008679号