You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

SegmentationFreeRecognizer.cpp 3.5 kB

7 years ago
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. //
  2. // Created by Jack Yu on 28/11/2017.
  3. //
  4. #include "SegmentationFreeRecognizer.h"
  5. namespace pr {
  6. SegmentationFreeRecognizer::SegmentationFreeRecognizer(std::string prototxt, std::string caffemodel) {
  7. net = cv::dnn::readNetFromCaffe(prototxt, caffemodel);
  8. }
  9. inline int judgeCharRange(int id)
  10. {return id<31 || id>63;
  11. }
  12. std::pair<std::string,float> decodeResults(cv::Mat code_table,std::vector<std::string> mapping_table,float thres)
  13. {
  14. cv::MatSize mtsize = code_table.size;
  15. int sequencelength = mtsize[2];
  16. int labellength = mtsize[1];
  17. cv::transpose(code_table.reshape(1,1).reshape(1,labellength),code_table);
  18. std::string name = "";
  19. std::vector<int> seq(sequencelength);
  20. std::vector<std::pair<int,float>> seq_decode_res;
  21. for(int i = 0 ; i < sequencelength; i++) {
  22. float *fstart = ((float *) (code_table.data) + i * labellength );
  23. int id = std::max_element(fstart,fstart+labellength) - fstart;
  24. seq[i] =id;
  25. }
  26. float sum_confidence = 0;
  27. int plate_lenghth = 0 ;
  28. for(int i = 0 ; i< sequencelength ; i++)
  29. {
  30. if(seq[i]!=labellength-1 && (i==0 || seq[i]!=seq[i-1]))
  31. {
  32. float *fstart = ((float *) (code_table.data) + i * labellength );
  33. float confidence = *(fstart+seq[i]);
  34. std::pair<int,float> pair_(seq[i],confidence);
  35. seq_decode_res.push_back(pair_);
  36. }
  37. }
  38. int i = 0;
  39. if (seq_decode_res.size()>1 && judgeCharRange(seq_decode_res[0].first) && judgeCharRange(seq_decode_res[1].first))
  40. {
  41. i=2;
  42. int c = seq_decode_res[0].second<seq_decode_res[1].second;
  43. name+=mapping_table[seq_decode_res[c].first];
  44. sum_confidence+=seq_decode_res[c].second;
  45. plate_lenghth++;
  46. }
  47. for(; i < seq_decode_res.size();i++)
  48. {
  49. name+=mapping_table[seq_decode_res[i].first];
  50. sum_confidence +=seq_decode_res[i].second;
  51. plate_lenghth++;
  52. }
  53. std::pair<std::string,float> res;
  54. res.second = sum_confidence/plate_lenghth;
  55. res.first = name;
  56. return res;
  57. }
  58. std::string decodeResults(cv::Mat code_table,std::vector<std::string> mapping_table)
  59. {
  60. cv::MatSize mtsize = code_table.size;
  61. int sequencelength = mtsize[2];
  62. int labellength = mtsize[1];
  63. cv::transpose(code_table.reshape(1,1).reshape(1,labellength),code_table);
  64. std::string name = "";
  65. std::vector<int> seq(sequencelength);
  66. for(int i = 0 ; i < sequencelength; i++) {
  67. float *fstart = ((float *) (code_table.data) + i * labellength );
  68. int id = std::max_element(fstart,fstart+labellength) - fstart;
  69. seq[i] =id;
  70. }
  71. for(int i = 0 ; i< sequencelength ; i++)
  72. {
  73. if(seq[i]!=labellength-1 && (i==0 || seq[i]!=seq[i-1]))
  74. name+=mapping_table[seq[i]];
  75. }
  76. return name;
  77. }
  78. std::pair<std::string,float> SegmentationFreeRecognizer::SegmentationFreeForSinglePlate(cv::Mat Image,std::vector<std::string> mapping_table) {
  79. cv::transpose(Image,Image);
  80. cv::Mat inputBlob = cv::dnn::blobFromImage(Image, 1 / 255.0, cv::Size(40,160));
  81. net.setInput(inputBlob, "data");
  82. cv::Mat char_prob_mat = net.forward();
  83. return decodeResults(char_prob_mat,mapping_table,0.00);
  84. }
  85. }