| 62 | } |
| 63 | |
| 64 | void train(const File &input, const QString &model) |
| 65 | { |
| 66 | qDebug("Training on %s%s", qPrintable(input.flat()), |
| 67 | model.isEmpty() ? "" : qPrintable(" to " + model)); |
| 68 | |
| 69 | QScopedPointer<Transform> trainingWrapper(br::wrapTransform(transform.data(), "Stream(readMode=DistributeFrames)")); |
| 70 | TemplateList data(TemplateList::fromGallery(input,false)); |
| 71 | |
| 72 | if (abs(Globals->crossValidate) > 1) |
| 73 | for (int i=data.size()-1; i>=0; i--) |
| 74 | if (data[i].file.get<bool>("allPartitions",false)) |
| 75 | data.removeAt(i); |
| 76 | |
| 77 | if (transform.isNull()) qFatal("Null transform."); |
| 78 | qDebug("%d Training Files", data.size()); |
| 79 | |
| 80 | Globals->startTime.start(); |
| 81 | |
| 82 | qDebug("Training Enrollment"); |
| 83 | trainingWrapper->train(data); |
| 84 | |
| 85 | if (!distance.isNull() && distance->trainable()) { |
| 86 | qDebug("Projecting Enrollment"); |
| 87 | trainingWrapper->projectUpdate(data,data); |
| 88 | |
| 89 | TemplateList distanceData; |
| 90 | for (int i=0; i<data.size(); i++) |
| 91 | if (!data[i].file.fte && !data[i].file.getBool("FTE")) |
| 92 | distanceData.append(data[i]); |
| 93 | |
| 94 | data.clear(); |
| 95 | |
| 96 | qDebug("Training Comparison"); |
| 97 | distance->train(distanceData); |
| 98 | } |
| 99 | |
| 100 | if (!model.isEmpty()) { |
| 101 | qDebug("Storing %s", qPrintable(QFileInfo(model).fileName())); |
| 102 | store(model); |
| 103 | } |
| 104 | |
| 105 | qDebug("Training Time: %s", qPrintable(QtUtils::toTime(Globals->startTime.elapsed()/1000.0f))); |
| 106 | |
| 107 | simplifyTransform(); |
| 108 | } |
| 109 | |
| 110 | void simplifyTransform() |
| 111 | { |