void ConfigurationParser::readMap() { Q_ASSERT(isStartElement() && name() == "map"); while(!atEnd()) { readNext(); if(isEndElement()) break; if(isStartElement()) { if(name() == "geometry") { readGeometry(); } else if (name() == "layer") { DataLayer *layer = readLayer(); if(layer) { m_layers.insert(layer->name(), layer); } } else if (name() == "colorMap") { ColorMap colorMap = ColorMap::readColorMap(this); m_colorMaps.insert(colorMap.name(), colorMap); } else { readUnknownElement(); } } } }
void* DataLayerPrefetch(void* layer_pointer) { CHECK(layer_pointer); DataLayer<Dtype>* layer = static_cast<DataLayer<Dtype>*>(layer_pointer); CHECK(layer); Datum datum; CHECK(layer->prefetch_data_); Dtype* top_data = layer->prefetch_data_->mutable_cpu_data(); Dtype* top_label; if (layer->output_labels_) { top_label = layer->prefetch_label_->mutable_cpu_data(); } const Dtype scale = layer->layer_param_.data_param().scale(); const int batch_size = layer->layer_param_.data_param().batch_size(); const int crop_size = layer->layer_param_.data_param().crop_size(); const bool mirror = layer->layer_param_.data_param().mirror(); if (mirror && crop_size == 0) { LOG(FATAL) << "Current implementation requires mirror and crop_size to be " << "set at the same time."; } // datum scales const int channels = layer->datum_channels_; const int height = layer->datum_height_; const int width = layer->datum_width_; const int size = layer->datum_size_; const Dtype* mean = layer->data_mean_.cpu_data(); for (int item_id = 0; item_id < batch_size; ++item_id) { // get a blob CHECK(layer->iter_); CHECK(layer->iter_->Valid()); datum.ParseFromString(layer->iter_->value().ToString()); const string& data = datum.data(); if (crop_size) { CHECK(data.size()) << "Image cropping only support uint8 data"; int h_off, w_off; // We only do random crop when we do training. if (layer->phase_ == Caffe::TRAIN) { h_off = layer->PrefetchRand() % (height - crop_size); w_off = layer->PrefetchRand() % (width - crop_size); } else { h_off = (height - crop_size) / 2; w_off = (width - crop_size) / 2; } if (mirror && layer->PrefetchRand() % 2) { // Copy mirrored version for (int c = 0; c < channels; ++c) { for (int h = 0; h < crop_size; ++h) { for (int w = 0; w < crop_size; ++w) { int top_index = ((item_id * channels + c) * crop_size + h) * crop_size + (crop_size - 1 - w); int data_index = (c * height + h + h_off) * width + w + w_off; Dtype datum_element = static_cast<Dtype>(static_cast<uint8_t>(data[data_index])); top_data[top_index] = (datum_element - mean[data_index]) * scale; } } } } else { // Normal copy for (int c = 0; c < channels; ++c) { for (int h = 0; h < crop_size; ++h) { for (int w = 0; w < crop_size; ++w) { int top_index = ((item_id * channels + c) * crop_size + h) * crop_size + w; int data_index = (c * height + h + h_off) * width + w + w_off; Dtype datum_element = static_cast<Dtype>(static_cast<uint8_t>(data[data_index])); top_data[top_index] = (datum_element - mean[data_index]) * scale; } } } } } else { // we will prefer to use data() first, and then try float_data() if (data.size()) { for (int j = 0; j < size; ++j) { Dtype datum_element = static_cast<Dtype>(static_cast<uint8_t>(data[j])); top_data[item_id * size + j] = (datum_element - mean[j]) * scale; } } else { for (int j = 0; j < size; ++j) { top_data[item_id * size + j] = (datum.float_data(j) - mean[j]) * scale; } } } if (layer->output_labels_) { top_label[item_id] = datum.label(); } // go to the next iter layer->iter_->Next(); if (!layer->iter_->Valid()) { // We have reached the end. Restart from the first. DLOG(INFO) << "Restarting data prefetching from start."; layer->iter_->SeekToFirst(); } } return static_cast<void*>(NULL); }
DataLayer *ConfigurationParser::readLayer() { Q_ASSERT(isStartElement() && name() == "layer"); DataLayer *layer = new DataLayer(); ColorMap colorMap; QColor c; c.setHsv(240, 255, 189, 255); colorMap.addColor(c); c.setHsv(240, 255, 255, 255); colorMap.addColor(c); c.setHsv(224, 255, 255, 255); colorMap.addColor(c); c.setHsv(208, 255, 255, 255); colorMap.addColor(c); c.setHsv(195, 255, 255, 255); colorMap.addColor(c); c.setHsv(180, 255, 255, 255); colorMap.addColor(c); c.setHsv(159, 189, 255, 255); colorMap.addColor(c); c.setHsv(120, 123, 255, 255); colorMap.addColor(c); c.setHsv(80, 189, 255, 255); colorMap.addColor(c); c.setHsv(60, 255, 255, 255); colorMap.addColor(c); c.setHsv(44, 255, 255, 255); colorMap.addColor(c); c.setHsv(15, 255, 255, 255); colorMap.addColor(c); c.setHsv(0, 255, 255, 255); colorMap.addColor(c); c.setHsv(0, 255, 189, 255); colorMap.addColor(c); c.setHsv(0, 255, 132, 255); colorMap.addColor(c); colorMap.setInterpolationSpec(QColor::Hsv); while(!atEnd()) { readNext(); if(isEndElement()) break; if(isStartElement()) { if(name() == "file") { QXmlStreamAttributes att = attributes(); QDateTime dateTime; dateTime.setTime(QTime::fromString(att.value("time").toString(), Qt::ISODate)); dateTime.setDate(QDate::fromString(att.value("date").toString(), Qt::ISODate)); layer->setFileName(dateTime, readCharacters()); qDebug() << "Added file for time:" << dateTime; } else if(name() == "files") { readFiles(layer); } else if(name() == "name") { layer->setName(readCharacters()); qDebug() << "Name:" << layer->name(); } else if(name() == "geometry") { QString geometryName = readCharacters(); QHash<QString,MapGeometry>::iterator it = m_geometries.find(geometryName); if(it != m_geometries.end()) { layer->setGeometry(it.value()); } else { delete layer; qDebug() << "Geometry not found."; return 0; } } else if(name() == "scaleMin") { layer->setScaleMin(readCharacters().toDouble()); } else if(name() == "scaleMax") { layer->setScaleMax(readCharacters().toDouble()); } else if(name() == "defaultColorMap") { QString colorMapString = readCharacters(); if(m_colorMaps.contains(colorMapString)) { colorMap = m_colorMaps.value(colorMapString); } } else { readUnknownElement(); } } } layer->setDefaultColorMap(colorMap); return layer; }
void* DataLayerPrefetch(void* layer_pointer) { CHECK(layer_pointer); DataLayer<Dtype>* layer = static_cast<DataLayer<Dtype>*>(layer_pointer); CHECK(layer); Datum datum; CHECK(layer->prefetch_data_); Dtype* top_data = layer->prefetch_data_->mutable_cpu_data(); //数据 Dtype* top_label; //标签 if (layer->output_labels_) { top_label = layer->prefetch_label_->mutable_cpu_data(); } const Dtype scale = layer->layer_param_.data_param().scale(); const int batch_size = layer->layer_param_.data_param().batch_size(); const int crop_size = layer->layer_param_.data_param().crop_size(); const bool mirror = layer->layer_param_.data_param().mirror(); if (mirror && crop_size == 0) {//当前实现需要同时设置mirror和cropsize LOG(FATAL) << "Current implementation requires mirror and crop_size to be " << "set at the same time."; } // datum scales const int channels = layer->datum_channels_; const int height = layer->datum_height_; const int width = layer->datum_width_; const int size = layer->datum_size_; const Dtype* mean = layer->data_mean_.cpu_data(); for (int item_id = 0; item_id < batch_size; ++item_id) { //每一批数据的数量是batchsize,一个循环拉取一张 // get a blob CHECK(layer->iter_); CHECK(layer->iter_->Valid()); datum.ParseFromString(layer->iter_->value().ToString());//利用迭代器拉取下一批数据 const string& data = datum.data(); int label_blob_channels = layer->prefetch_label_->channels(); int label_data_dim = datum.label_size(); CHECK_EQ(layer->prefetch_label_->channels(), datum.label_size()) << "label size is NOT the same."; if (crop_size) {//如果需要裁剪 CHECK(data.size()) << "Image cropping only support uint8 data"; int h_off, w_off; // We only do random crop when we do training. //只是在训练阶段做随机裁剪 if (layer->phase_ == Caffe::TRAIN) { h_off = layer->PrefetchRand() % (height - crop_size); w_off = layer->PrefetchRand() % (width - crop_size); } else {//测试阶段固定裁剪 h_off = (height - crop_size) / 2; w_off = (width - crop_size) / 2; } //怎么感觉下面两种情况的代码是一样的? if (mirror && layer->PrefetchRand() % 2) { // Copy mirrored version for (int c = 0; c < channels; ++c) { for (int h = 0; h < crop_size; ++h) { for (int w = 0; w < crop_size; ++w) { int top_index = ((item_id * channels + c) * crop_size + h) * crop_size + (crop_size - 1 - w); int data_index = (c * height + h + h_off) * width + w + w_off; Dtype datum_element = static_cast<Dtype>(static_cast<uint8_t>(data[data_index])); top_data[top_index] = (datum_element - mean[data_index]) * scale; } } } } else {//如果不需要裁剪 // Normal copy //我们优先考虑data(),然后float_data() for (int c = 0; c < channels; ++c) { for (int h = 0; h < crop_size; ++h) { for (int w = 0; w < crop_size; ++w) { int top_index = ((item_id * channels + c) * crop_size + h) * crop_size + w; int data_index = (c * height + h + h_off) * width + w + w_off; Dtype datum_element = static_cast<Dtype>(static_cast<uint8_t>(data[data_index])); top_data[top_index] = (datum_element - mean[data_index]) * scale; } } } } } else { // we will prefer to use data() first, and then try float_data() if (data.size()) { for (int j = 0; j < size; ++j) { Dtype datum_element = static_cast<Dtype>(static_cast<uint8_t>(data[j])); top_data[item_id * size + j] = (datum_element - mean[j]) * scale; } } else { for (int j = 0; j < size; ++j) { top_data[item_id * size + j] = (datum.float_data(j) - mean[j]) * scale; } } } if (g_item_id++ < 5) { int label_size = datum.label_size(); int image_label = 0; for (int j = 0; j < label_size; ++j) { if (datum.label(j) == 1) { image_label = j; break; } } char strImgRawDataFile[255] = ""; sprintf(strImgRawDataFile, "caffe_%s_%05d_%d%s", "train", item_id, image_label, ".txt"); ofstream fout_image_raw_data(strImgRawDataFile); for (int h = 0; h < height; ++h) { for (int w = 0; w < width; ++w) { int pixel_index = h * height + w; Dtype datum_element = static_cast<Dtype>(static_cast<uint8_t>(data[pixel_index])); char strHexByte[3] = ""; sprintf(strHexByte, "%02X", (unsigned char)datum_element); fout_image_raw_data<<" "<<strHexByte; } fout_image_raw_data<<endl; } fout_image_raw_data<<endl; for (int j = 0; j < label_size; ++j) { fout_image_raw_data<<datum.label(j); } fout_image_raw_data.close(); } if (layer->output_labels_) { int label_size = datum.label_size(); for (int j = 0; j < label_size; ++j) { top_label[item_id * label_size + j] = datum.label(j); } //top_label[item_id] = datum.label(); } // go to the next iter layer->iter_->Next(); if (!layer->iter_->Valid()) { // We have reached the end. Restart from the first. DLOG(INFO) << "Restarting data prefetching from start."; layer->iter_->SeekToFirst(); } } return static_cast<void*>(NULL); }