// Usage identical to RandomTreeImage class void RandomForestImage::train(const std::vector<LabeledRGBDImage>& trainLabelImages, size_t numLabels, bool trainTreesSequentially) { if (trainLabelImages.empty()) { throw std::runtime_error("no training images"); } const size_t treeCount = ensemble.size(); const int numThreads = configuration.getNumThreads(); tbb::task_scheduler_init init(numThreads); CURFIL_INFO("learning image tree ensemble. " << treeCount << " trees with " << numThreads << " threads"); for (size_t treeNr = 0; treeNr < treeCount; ++treeNr) { ensemble[treeNr] = boost::make_shared<RandomTreeImage>(treeNr, configuration); } RandomSource randomSource(configuration.getRandomSeed()); const int SEED = randomSource.uniformSampler(0xFFFF).getNext(); auto train = [&](boost::shared_ptr<RandomTreeImage>& tree) { utils::Timer timer; auto seed = SEED + tree->getId(); RandomSource randomSource(seed); std::vector<LabeledRGBDImage> sampledTrainLabelImages = trainLabelImages; if (configuration.getMaxImages() > 0 && static_cast<int>(trainLabelImages.size()) > configuration.getMaxImages()) { ReservoirSampler<LabeledRGBDImage> reservoirSampler(configuration.getMaxImages()); Sampler sampler = randomSource.uniformSampler(0, 10 * trainLabelImages.size()); for (auto& image : trainLabelImages) { reservoirSampler.sample(sampler, image); } CURFIL_INFO("tree " << tree->getId() << ": sampled " << reservoirSampler.getReservoir().size() << " out of " << trainLabelImages.size() << " images"); sampledTrainLabelImages = reservoirSampler.getReservoir(); } tree->train(sampledTrainLabelImages, randomSource, configuration.getSamplesPerImage() / treeCount, numLabels); CURFIL_INFO("finished tree " << tree->getId() << " with random seed " << seed << " in " << timer.format(3)); }; if (!trainTreesSequentially && numThreads > 1) { tbb::parallel_for_each(ensemble.begin(), ensemble.end(), train); } else { std::for_each(ensemble.begin(), ensemble.end(), train); } }
void HairyBrush::fromDabWithDensity(KisFixedPaintDeviceSP dab, qreal density) { int width = dab->bounds().width(); int height = dab->bounds().height(); int centerX = width * 0.5; int centerY = height * 0.5; // make mask Bristle * bristle = 0; qreal alpha; quint8 * dabPointer = dab->data(); quint8 pixelSize = dab->pixelSize(); const KoColorSpace * cs = dab->colorSpace(); KoColor bristleColor(cs); KisRandomSource randomSource(0); for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { alpha = cs->opacityF(dabPointer); if (alpha != 0.0) { if (density == 1.0 || randomSource.generateNormalized() <= density) { memcpy(bristleColor.data(), dabPointer, pixelSize); bristle = new Bristle(x - centerX, y - centerY, alpha); // using value from image as length of bristle bristle->setColor(bristleColor); m_bristles.append(bristle); } } dabPointer += pixelSize; } } }