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

247 lines
6.5 KiB

#ifndef EASYPR_ACCURACY_HPP
#define EASYPR_ACCURACY_HPP
10 years ago
#include <easypr.h>
#include <ctime>
#include <fstream>
#include <list>
#include <memory>
using namespace std;
namespace easypr {
10 years ago
9 years ago
namespace demo {
9 years ago
9 years ago
int accuracyTest(const char* test_path) {
std::shared_ptr<easypr::Kv> kv(new easypr::Kv);
kv->load("etc/chinese_mapping");
9 years ago
9 years ago
auto files = Utils::getFiles(test_path);
9 years ago
9 years ago
CPlateRecognize pr;
9 years ago
9 years ago
// <20><><EFBFBD><EFBFBD>Debugģʽ
9 years ago
9 years ago
pr.setDebug(false);
9 years ago
9 years ago
pr.setLifemode(true);
9 years ago
9 years ago
// <20><><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6>ٳ<EFBFBD><D9B3><EFBFBD>
9 years ago
9 years ago
pr.setMaxPlates(4);
9 years ago
int size = files.size();
9 years ago
if (0 == size) {
cout << "No File Found in general_test/native_test!" << endl;
return 0;
}
9 years ago
cout << "Begin to test the easypr accuracy!" << endl;
9 years ago
// <20>ܵIJ<DCB5><C4B2><EFBFBD>ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD>
9 years ago
int count_all = 0;
9 years ago
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD>
9 years ago
int count_err = 0;
9 years ago
// δʶ<CEB4><CAB6><EFBFBD><EFBFBD>ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD>
9 years ago
int count_norecogin = 0;
9 years ago
std::list<std::string> not_recognized_files;
9 years ago
// <20>ܵ<EFBFBD><DCB5>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>
9 years ago
float diff_all = 0;
9 years ago
// ƽ<><C6BD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>
9 years ago
float diff_avg = 0;
9 years ago
// <20><>ȫƥ<C8AB><C6A5><EFBFBD><EFBFBD>ʶ<EFBFBD><CAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
9 years ago
float match_count = 0;
9 years ago
// <20><>ȫƥ<C8AB><C6A5><EFBFBD><EFBFBD>ʶ<EFBFBD><CAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռʶ<D5BC><CAB6>ͼƬ<CDBC>еı<D0B5><C4B1><EFBFBD>
9 years ago
float match_rate = 0;
9 years ago
// <20><>ʼ<EFBFBD>ͽ<EFBFBD><CDBD><EFBFBD>ʱ<EFBFBD><CAB1>
9 years ago
time_t begin, end;
time(&begin);
9 years ago
for (int i = 0; i < size; i++) {
string filepath = files[i].c_str();
9 years ago
// EasyPR<50><52>ʼ<EFBFBD>жϳ<D0B6><CFB3><EFBFBD>
9 years ago
Mat src = imread(filepath);
9 years ago
// <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>ֱ<EFBFBD>ӹ<EFBFBD>ȥ
9 years ago
if (!src.data) continue;
9 years ago
cout << "------------------" << endl;
9 years ago
// <20><>ȡ<EFBFBD><C8A1>ʵ<EFBFBD>ij<EFBFBD><C4B3><EFBFBD>
9 years ago
string plateLicense = Utils::getFileName(filepath);
cout << kv->get("original_plate") << ":" << plateLicense << endl;
9 years ago
vector<string> plateVec;
int result = pr.plateRecognize(src, plateVec);
if (result == 0) {
int num = plateVec.size();
9 years ago
if (num == 0) {
cout << kv->get("empty_plate") << endl;
if (plateLicense != kv->get("empty_plate")) {
not_recognized_files.push_back(plateLicense);
count_norecogin++;
}
}
else if (num > 1) {
9 years ago
// <20><EFBFBD><E0B3B5>ʹ<EFBFBD><CAB9>diff<66><66>С<EFBFBD><D0A1><EFBFBD>Ǹ<EFBFBD><C7B8><EFBFBD>¼
9 years ago
int mindiff = 10000;
for (int j = 0; j < num; j++) {
cout << plateVec[j] << " (" << j + 1 << ")" << endl;
string colorplate = plateVec[j];
9 years ago
// <20><><EFBFBD><EFBFBD>"<22><><EFBFBD><EFBFBD>:<3A><>E7KU22"<22><>ð<EFBFBD>ź<EFBFBD><C5BA><EFBFBD><EFBFBD>ij<EFBFBD><C4B3>ƴ<EFBFBD>С"
9 years ago
vector<string> spilt_plate = Utils::splitString(colorplate, ':');
9 years ago
int size = spilt_plate.size();
if (size == 2 && spilt_plate[1] != "") {
int diff = utils::levenshtein_distance(plateLicense,
spilt_plate[size - 1]);
if (diff < mindiff) mindiff = diff;
}
}
9 years ago
9 years ago
cout << kv->get("diff") << ":" << mindiff << kv->get("char") << endl;
if (mindiff == 0) {
9 years ago
9 years ago
// <20><>ȫƥ<C8AB><C6A5>
9 years ago
match_count++;
}
diff_all = diff_all + mindiff;
}
else {
9 years ago
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>diff
9 years ago
for (int j = 0; j < num; j++) {
cout << plateVec[j] << endl;
string colorplate = plateVec[j];
9 years ago
9 years ago
// <20><><EFBFBD><EFBFBD>"<22><><EFBFBD><EFBFBD>:<3A><>E7KU22"<22><>ð<EFBFBD>ź<EFBFBD><C5BA><EFBFBD><EFBFBD>ij<EFBFBD><C4B3>ƴ<EFBFBD>С"
9 years ago
9 years ago
vector<string> spilt_plate = Utils::splitString(colorplate, ':');
9 years ago
9 years ago
int size = spilt_plate.size();
if (size == 2 && spilt_plate[1] != "") {
int diff = utils::levenshtein_distance(plateLicense,
spilt_plate[size - 1]);
cout << kv->get("diff") << ":" << diff << kv->get("char") << endl;
9 years ago
if (diff == 0) {
9 years ago
// <20><>ȫƥ<C8AB><C6A5>
9 years ago
match_count++;
}
diff_all = diff_all + diff;
}
}
}
}
9 years ago
else {
cout << kv->get("error_code") << ":" << result << endl;
count_err++;
}
9 years ago
count_all++;
}
time(&end);
cout << "------------------" << endl;
cout << "Easypr accuracy test end!" << endl;
cout << "------------------" << endl;
cout << endl;
cout << kv->get("summaries") << ":" << endl;
cout << kv->get("sum_pictures") << ":" << count_all << ", ";
cout << kv->get("unrecognized") << ":" << count_norecogin << ", ";
float count_recogin = float(count_all - (count_err + count_norecogin));
float count_rate = count_recogin / count_all;
cout << kv->get("locate_rate") << ":" << count_rate * 100 << "% " << endl;
if (count_recogin > 0) {
diff_avg = diff_all / count_recogin;
}
9 years ago
9 years ago
if (count_recogin > 0) {
match_rate = match_count / count_recogin * 100;
}
9 years ago
cout << kv->get("diff_average") << ":" << diff_avg << ", ";
cout << kv->get("full_match") << ":" << match_count << ", ";
cout << kv->get("full_rate") << ":" << match_rate << "% " << endl;
9 years ago
double seconds = difftime(end, begin);
double avgsec = seconds / double(count_all);
9 years ago
cout << kv->get("seconds") << ":" << seconds << kv->get("sec") << ", ";
cout << kv->get("seconds_average") << ":" << avgsec << kv->get("sec") << endl;
9 years ago
cout << kv->get("unrecognized") << ":" << endl;
9 years ago
for (auto it = not_recognized_files.begin(); it != not_recognized_files.end();
++it) {
cout << *it << endl;
}
9 years ago
cout << endl;
cout << "------------------" << endl;
ofstream myfile("accuracy.txt", ios::app);
if (myfile.is_open()) {
time_t t = time(0); // get time now
struct tm* now = localtime(&t);
char buf[80];
strftime(buf, sizeof(buf), "%Y-%m-%d %X", now);
myfile << string(buf) << endl;
myfile << kv->get("sum_pictures") << ":" << count_all << ", ";
myfile << kv->get("unrecognized") << ":" << count_norecogin << ", ";
myfile << kv->get("locate_rate") << ":" << count_rate * 100 << "% "
<< endl;
myfile << kv->get("diff_average") << ":" << diff_avg << ", ";
myfile << kv->get("full_match") << ":" << match_count << ", ";
myfile << kv->get("full_rate") << ":" << match_rate << "% " << endl;
myfile << kv->get("seconds") << ":" << seconds << kv->get("sec") << ", ";
myfile << kv->get("seconds_average") << ":" << avgsec << kv->get("sec")
<< endl;
myfile.close();
}
else {
cout << "Unable to open file";
}
9 years ago
return 0;
}
}
}
#endif // EASYPR_ACCURACY_HPP