소스 검색

[doc] Translated comments to German

Clemens-Alexander Brust 9 년 전
부모
커밋
ea43075a76
6개의 변경된 파일84개의 추가작업 그리고 64개의 파일을 삭제
  1. 8 5
      src/AnnotatedImageView.cpp
  2. 3 0
      src/CDUtils.cpp
  3. 2 1
      src/ImportLabeledDataDialog.cpp
  4. 16 13
      src/LabelHypothesesDialog.cpp
  5. 22 15
      src/MainWindow.cpp
  6. 33 30
      src/Project.cpp

+ 8 - 5
src/AnnotatedImageView.cpp

@@ -45,21 +45,22 @@ void AnnotatedImageView::DisplayImage(std::string filename, std::vector<Conv::Bo
     Conv::BoundingBox box = bounding_boxes[b];
 
     if(!box.flag1) {
-      // Denormalize box
+      // Koordinaten denormalisieren
       box.w *= width; box.x *= width;
       box.h *= height; box.y *= height;
     }
 
-    // Decenter box
+    // Bounding Box entzentrieren
     box.x -= box.w / 2.0;
     box.y -= box.h / 2.0;
 
+    // Umgebungsrechteck ermitteln
     if(box.x < x1) x1 = box.x;
     if(box.x + box.w > x2) x2 = box.x + box.w;
     if(box.y < y1) y1 = box.y;
     if(box.y + box.h > y2) y2 = box.y + box.h;
 
-    // Print class label
+    // Klassenbezeichnung ausgeben
     QString class_name = QString::fromStdString(class_manager->GetClassInfoById(box.c).first);
     auto* text_item = new QGraphicsSimpleTextItem(class_name);
     if(image_->width() >= 800) {
@@ -72,21 +73,23 @@ void AnnotatedImageView::DisplayImage(std::string filename, std::vector<Conv::Bo
     qreal text_height = text_item->boundingRect().height();
     if(box.y + box.h + text_height > y2) y2 = box.y + box.h + text_height;
 
-    // Draw under class label
+    // Hintergrund der Klassenbezeichnung
     scene_->addRect(box.x, box.y + box.h, text_width, text_height, QPen(), QBrush(QColor::fromRgbF(1,1,1,0.9)));
     scene_->addItem(text_item);
 
-    // Draw box
+    // Bounding Box zeichnen
     scene_->addRect(box.x, box.y, box.w, box.h,QPen(QBrush(QColor::fromRgbF(0,0,0,1)), 3.0), QBrush(QColor::fromRgbF(1,1,1,0.2)));
 
   }
 
   if(image_->width() >= 800) {
+    // Großes Bild, Umgebungsrechteck für passende Anzeige feststellen
     const qreal border = 85;
     QRectF bounding_rect(x1 - border, y1 - border, (2.0 * border) + x2 - x1, (2.0 * border) + y2 - y1);
     rect_ = bounding_rect;
     RefitDisplay();
   } else {
+    // Bild ist klein genug, nur zentrieren
     rect_ = QRectF(0, 0, 0, 0);
     RefitDisplay();
   }

+ 3 - 0
src/CDUtils.cpp

@@ -16,10 +16,13 @@ CDUtils::CDUtils()
 
 QString CDUtils::FileBaseName(QString &path) {
   if(path.contains('/')) {
+    // Bis zu letzten Schrägstrich abschneiden
     return path.split('/', QString::SkipEmptyParts).last();
   } else if(path.contains(QDir::separator())) {
+    // Unter Windows ist auch ein Backslash möglich
     return path.split(QDir::separator(), QString::SkipEmptyParts).last();
   } else {
+    // Pfad ist schon reduziert
     return path;
   }
 }

+ 2 - 1
src/ImportLabeledDataDialog.cpp

@@ -17,7 +17,7 @@ ImportLabeledDataDialog::ImportLabeledDataDialog(QWidget *parent, std::string fi
 {
   ui->setupUi(this);
 
-  // Load file
+  // Datensatzsegmente laden
   std::ifstream set_file(filename, std::ios::in);
   if(!set_file.good()) {
     this->reject();
@@ -43,6 +43,7 @@ ImportLabeledDataDialog::~ImportLabeledDataDialog()
 }
 
 void ImportLabeledDataDialog::UpdateLists() {
+  // Alle Listen aktualisieren
   ui->knownDataList->clear();
   ui->importDataList->clear();
   ui->updateDataList->clear();

+ 16 - 13
src/LabelHypothesesDialog.cpp

@@ -22,7 +22,7 @@ LabelHypothesesDialog::LabelHypothesesDialog(QWidget *parent, std::vector<std::v
 {
   ui->setupUi(this);
 
-  // Generate decision table
+  // Vektor der Benutzerentscheidungen anlegen
   for(unsigned int file_index = 0; file_index < prediction_boxes_.size(); file_index++) {
     for(unsigned int prediction_index = 0; prediction_index < prediction_boxes_[file_index].size(); prediction_index++) {
       UserDecision decision;
@@ -42,16 +42,16 @@ LabelHypothesesDialog::~LabelHypothesesDialog()
 void LabelHypothesesDialog::LoadNext(int diff) {
   decision_index_+= diff;
   if(decision_index_ < 0) { decision_index_ = 0; }
-  // Check if next decision exists
+  // Überprüfen, ob nächste Entscheidung existiert
   if(decision_index_ < decisions_.size()) {
     UserDecision& decision = decisions_[decision_index_];
-    // Load prediction
+    // Vorhersage laden
     std::vector<Conv::BoundingBox> single_prediction;
     single_prediction.push_back(prediction_boxes_[decision.file_index][decision.prediction_index]);
 
     ui->imageView->DisplayImage(prediction_files_[decision.file_index], single_prediction, class_manager_);
 
-    // Set "correct" button state
+    // Erlaubte Buttons aktivieren
     if(single_prediction[0].c == UNKNOWN_CLASS) {
       ui->correctButton->setEnabled(false);
     } else {
@@ -64,7 +64,7 @@ void LabelHypothesesDialog::LoadNext(int diff) {
       ui->backButton->setEnabled(false);
     }
   } else {
-    // Done with all predictions
+    // Alle Vorhersagen bearbeitet
     accept();
   }
 }
@@ -84,10 +84,13 @@ void LabelHypothesesDialog::on_wrongClassButton_clicked()
   }
 
   bool ok = false;
+
+  // Klassennamen mit Autovervollständigung abfragen
   std::string result = QInputDialog::getItem(this, tr("Select Class"), tr("Class:"), list, 0, true, &ok).toStdString();
   if(result.length() > 0 && ok) {
     unsigned int class_index = class_manager_->GetClassIdByName(result);
     if(class_index == UNKNOWN_CLASS) {
+      // Falls neue Klasse, registrieren
       class_manager_->RegisterClassByName(result, 0, 1);
       class_index = class_manager_->GetClassIdByName(result);
     }
@@ -106,7 +109,7 @@ void LabelHypothesesDialog::on_incorrectButton_clicked()
 }
 
 bool LabelHypothesesDialog::StoreInSegment(Conv::Segment *segment) {
-  // Process boxes
+  // Bounding Boxes generieren
   std::vector<std::vector<Conv::BoundingBox>> processed_boxes;
   unsigned int decision_index = 0;
   for(unsigned int sample = 0; sample < prediction_boxes_.size(); sample++) {
@@ -134,7 +137,7 @@ bool LabelHypothesesDialog::StoreInSegment(Conv::Segment *segment) {
     }
   }
 
-  // First, do non-maximum suppression
+  // Non-Maximum Suppression durchführen
   for(unsigned int sample = 0; sample < processed_boxes.size(); sample++) {
     if(processed_boxes[sample].size() > 1) {
       std::vector<Conv::BoundingBox>* sample_boxes = &(processed_boxes[sample]);
@@ -157,7 +160,7 @@ bool LabelHypothesesDialog::StoreInSegment(Conv::Segment *segment) {
     }
   }
 
-  // Then, check file names for sanity
+  // Dateinamen auf Gültigkeit überprüfen
   for(unsigned int sample = 0; sample < processed_boxes.size(); sample++) {
     Conv::JSON& sample_json = segment->GetSample(sample);
 
@@ -168,27 +171,27 @@ bool LabelHypothesesDialog::StoreInSegment(Conv::Segment *segment) {
     }
   }
 
-  // If everything checks out, store the boxes in the segment
+  // Falls alles in Ordnung ist, Boxes im Datensatzsegment ablegen
   for(unsigned int sample = 0; sample < processed_boxes.size(); sample++) {
     Conv::JSON& sample_json = segment->GetSample(sample);
     Conv::JSON boxes_json = Conv::JSON::array();
 
-    // Load image for width and height
+    // Bild laden, um Breite und Höhe zu ermitteln
     QImage image(QString::fromStdString(prediction_files_[sample]));
     Conv::datum width = image.width(); Conv::datum height = image.height();
 
-    // Loop through all boxes and JSONify them
+    // Alle Boxes in JSON umwandeln
     for(unsigned int box = 0; box < processed_boxes[sample].size(); box++) {
       Conv::BoundingBox& predicted_box = processed_boxes[sample][box];
       Conv::JSON box_json;
       box_json["x"] = predicted_box.x * width; box_json["y"] = predicted_box.y * height;
       box_json["w"] = predicted_box.w * width; box_json["h"] = predicted_box.h * height;
 
-      // Get class name
+      // Klassennamen als Zeichenkette ermitteln
       std::string box_class = class_manager_->GetClassInfoById(predicted_box.c).first;
       box_json["class"] = box_class;
 
-      // Because coordinates are already normalized
+      // Box ablegen
       boxes_json.push_back(box_json);
     }
     sample_json["boxes"] = boxes_json;

+ 22 - 15
src/MainWindow.cpp

@@ -60,7 +60,7 @@ void MainWindow::OnClassUpdate() {
 }
 
 void MainWindow::OnProjectStateUpdate() {
-  // Buttons
+  // Zustand der Buttons anpassen
   if(project.state == Project::LOADED) {
     ui->predictMultipleButton->setEnabled(true);
     if(project.known_samples_->GetSampleCount() > 0 && project.update_set_->GetSampleCount() > 0) {
@@ -113,13 +113,13 @@ void MainWindow::OnProjectStateUpdate() {
     ui->actionLoad_Snapshot->setEnabled(false);
   }
 
-  // Model status
+  // Modellstatus ausgeben
   if(project.state == Project::LOADED) {
     std::stringstream ss;
     ss << "Model loaded." << std::endl;
     ss << "Known classes: " << project.class_manager_->GetClassCount() << std::endl;
 
-    // Number of known images
+    // Anzahl der Beispiele in jeder Kategorie angeben
     if(project.known_samples_->GetSampleCount() > 0) {
       ss << "Known examples: " << project.known_samples_->GetSampleCount() << std::endl;
     } else {
@@ -143,7 +143,7 @@ void MainWindow::OnProjectStateUpdate() {
     ui->modelStatusText->setText("Please restart Carpe Diem.");
   }
 
-  // Window title
+  // Fensterüberschrift
   if(project.state == Project::LOADED) {
     std::stringstream ss;
     ss << "Carpe Diem - " << project.project_name_;
@@ -330,13 +330,14 @@ void MainWindow::AddSegmentImagesToList(Conv::Segment *segment) {
         sample_count = 100;
     }
 
+    // Alle Bilder des Datensatzsegmentes bearbeiten
     for(unsigned int sample = 0; sample < sample_count; sample++) {
       Conv::JSON& sample_json = segment->GetSample(sample);
       std::vector<Conv::BoundingBox> predictions;
       Conv::Segment::CopyDetectionMetadata(sample_json, 1, 1, *(project.class_manager_), &predictions);
 
       for(unsigned int b = 0; b < predictions.size(); b++) {
-        // Notify the view that these coordinates are not normalized
+        // AnnotatedImageView auf nicht normalisierte Koordinaten hinweisen
         predictions[b].flag1 = true;
       }
 
@@ -387,7 +388,7 @@ void MainWindow::on_updateModelButton_clicked()
   if(!d.exec(&future)) {
     QMessageBox::critical(this, tr("Error"), tr("Could not update model! See log for details."), QMessageBox::Ok);
   } else {
-    // Move update segments to known segments
+    // Neu beschriftetes Segment zu bekannten Daten hinzufügen
     while(project.update_set_->GetSegmentCount() > 0) {
       Conv::Segment* segment = project.update_set_->GetSegment(0);
       project.known_samples_->AddSegment(segment);
@@ -402,11 +403,13 @@ void MainWindow::on_labelDataButton_clicked()
 {
   QString description = tr("Selecting best batch from new data...");
   ProgressDialog d(this, &project, description);
+
+  // Lernstapel bewerten lassen
   QFuture<void> future = QtConcurrent::run(&project, &Project::UpdateScores, (Project::ProjectProgressHandler*)&d);
   if(!d.exec(&future)) {
     QMessageBox::critical(this, tr("Error"), tr("Could not select best batch! See log for details."), QMessageBox::Ok);
   } else {
-    // Segments are scored, select best segment
+    // Besten Lernstapel auswählen
     Conv::Segment* best_segment =project.new_set_->GetSegment(0);
     Conv::datum best_score = 0;
     int best_segment_index = 0;
@@ -418,29 +421,29 @@ void MainWindow::on_labelDataButton_clicked()
       }
     }
 
-    // Predict segment
+    // Vorhersagen zu Lernstapel vorbereiten
     QString description2 = tr("Generating predictions on new data...");
     ProgressDialog d2(this, &project, description2);
     std::vector<std::vector<Conv::BoundingBox>> boxes;
     std::vector<std::string> filenames;
 
-    // Start prediction future
+    // Vorhersagen berechnen lassen
     QFuture<void> future2 = QtConcurrent::run(&project, &Project::PredictSegment, (Project::ProjectProgressHandler*)&d2, best_segment, &filenames, &boxes);
     if(!d2.exec(&future2)) {
       QMessageBox::critical(this, tr("Error"), tr("Could not predict new samples! See log for details."), QMessageBox::Ok);
     } else {
-      // Display labeling dialog
+      // Beschriftungsdialog einblenden
       LabelHypothesesDialog d3(this, boxes, filenames, project.class_manager_);
       if(d3.exec()) {
         if(d3.StoreInSegment(best_segment)) {
           project.new_set_->RemoveSegment(best_segment_index);
           project.update_set_->AddSegment(best_segment);
         } else {
-          // JSON error
+          // Fehler beim Speichern?
           QMessageBox::critical(this, tr("Error"), tr("Could not save labels! See log for details."), QMessageBox::Ok);
         }
       } else {
-        // User interrupted labeling, stop
+        // Beschriftung wurde vom Anwender unterbrochen
         QMessageBox::critical(this, tr("Error"), tr("Labeling was interrupted."), QMessageBox::Ok);
       }
     }
@@ -473,26 +476,30 @@ void MainWindow::on_exportCSVButton_clicked()
   if(targetFile.length() > 0) {
     std::string filename = targetFile.toStdString();
     std::ofstream csv_output(filename, std::ios::out);
+
+    // Kopfzeile schreiben
     csv_output << "FileName;Class;CenterX;CenterY;Width;Height" << std::endl;
 
     ui->progressBar->setValue(0);
     for(unsigned int s = 0; s < prediction_boxes_.size(); s++) {
       std::vector<Conv::BoundingBox>& sample_boxes = prediction_boxes_[s];
+
+      // Bild laden, um Höhe und Breite für normalisierte Koordinaten zu ermitteln
       QImage image(prediction_files_[s]);
       Conv::datum width = image.width(), height = image.height();
       std::string filename = prediction_files_[s].toStdString();
 
-      // One CSV line per bounding box
+      // Eine CSV-Zeile pro Bounding Box
       for(unsigned int b = 0; b < sample_boxes.size(); b++) {
         Conv::BoundingBox& box = sample_boxes[b];
         csv_output << filename << ";";
         csv_output << project.class_manager_->GetClassInfoById(box.c).first << ";";
 
         if(box.flag1) {
-          // Coordinates are not normalized, direct output
+          // Koordinaten sind nicht normalisiert, direkte Ausgabe
           csv_output << box.x << ";" << box.y << ";" << box.w << ";" << box.h;
         } else {
-          // Coordinates are normalized, find out image proportions
+          // Koordinaten sind normalisiert, mit Höhe bzw. Breite multiplizieren
           csv_output << box.x * width << ";" << box.y * height << ";" << box.w * width << ";" << box.h * height;
         }
 

+ 33 - 30
src/Project.cpp

@@ -26,7 +26,7 @@ void Project::PredictSegment(ProjectProgressHandler *progress_handler, Conv::Seg
 
   progress_handler->OnProjectProgressUpdate(0);
 
-  // Switch to testing mode
+  // Netz in Testmodus versetzen
   graph_->SetIsTesting(true);
   input_layer_->ForceWeightsZero();
 
@@ -37,18 +37,20 @@ void Project::PredictSegment(ProjectProgressHandler *progress_handler, Conv::Seg
     Conv::JSON& sample_json = segment->GetSample(sample);
     std::vector<Conv::BoundingBox> sample_predictions;
 
-    // Load sample
+    // Beispiel laden
     input_layer_->ForceLoadDetection(sample_json, 0);
+
+    // Forward Pass durch das Netz
     graph_->FeedForward();
 
-    // Copy predictions
+    // Vorhersagen auslesen
     Conv::DetectionMetadataPointer output_boxes = predicted_metadata_[0];
     for(unsigned int b = 0; b < output_boxes->size(); b++) {
       Conv::BoundingBox bbox = output_boxes->at(b);
       sample_predictions.push_back(bbox);
     }
 
-    // Store predictions
+    // Vorhersagen in Ausgabe ablegen
     std::string sample_filename = sample_json["image_rpath"];
     prediction_filenames->push_back(sample_filename);
     prediction_boxes->push_back(sample_predictions);
@@ -57,7 +59,7 @@ void Project::PredictSegment(ProjectProgressHandler *progress_handler, Conv::Seg
     progress_handler->OnProjectProgressUpdate(running_sample_count / total_sample_count);
   }
 
-  // Done
+  // Fertig
   progress_handler->OnProjectProgressUpdate(1);
   progress_handler->OnProjectProgressDone();
 }
@@ -68,7 +70,8 @@ void Project::UpdateModel(ProjectProgressHandler *progress_handler) {
     return;
   }
   needs_rescore_ = true;
-  // Update input layer settings
+
+  // Parameter der Eingabeschicht aktualisieren
   input_layer_->training_sets_.clear();
   input_layer_->training_weights_.clear();
   input_layer_->training_sets_.push_back(known_samples_);
@@ -183,19 +186,19 @@ bool Project::AddSample(std::string filename) {
   needs_rescore_ = true;
   Conv::Segment* target_segment = nullptr;
 
-  // If no new samples have been added, create first segment
+  // Falls noch kein Lernstapel existiert, neuen Stapel anfangen
   if(new_set_->GetSegmentCount() == 0) {
     std::stringstream ss; ss << "New Data Batch " << 1;
     Conv::Segment* segment = new Conv::Segment(ss.str());
     new_set_->AddSegment(segment);
     target_segment = segment;
   } else {
-    // Otherwise, get last segment and check if it has room for new sample
+    // Ansonsten letzen Lernstapel finden und überprüfen, ob genug Platz ist
     Conv::Segment* segment = new_set_->GetSegment(new_set_->GetSegmentCount() - 1);
     if(segment->GetSampleCount() < new_batch_size_) {
       target_segment = segment;
     } else {
-      // No room, create new segment
+      // Kein Platz, neuen Stapel anlegen
       std::stringstream ss; ss << "New Data Batch " << new_set_->GetSegmentCount() + 1;
       Conv::Segment* segment = new Conv::Segment(ss.str());
       new_set_->AddSegment(segment);
@@ -255,7 +258,7 @@ bool Project::Deserialize(Conv::JSON& project_json) {
     return false;
   }
 
-  // Load JSON
+  // JSON-Datei laden
   architecture_filename_="_from_json_";
   if(!project_json["architecture"].is_object()) {
     LOGERROR << "Project JSON is missing architecture";
@@ -274,15 +277,15 @@ bool Project::Deserialize(Conv::JSON& project_json) {
 
   architecture_json = project_json["architecture"];
 
-  // Create class manager
+  // Klassenmanager initialisieren
   class_manager_ = new Conv::ClassManager();
   class_manager_->RegisterClassUpdateHandler(class_update_handler_);
 
-  // Load architecture
+  // Netzarchitektur einlesen
   Conv::JSONNetGraphFactory netgraph_factory(architecture_json, 123123);
   graph_ = new Conv::NetGraph();
 
-  // Create dataset input layer
+  // Eingabeschicht anlegen
   unsigned int batch_size_parallel = 1;
   if(netgraph_factory.GetHyperparameters().count("batch_size_parallel") == 1 && netgraph_factory.GetHyperparameters()["batch_size_parallel"].is_number()) {
     batch_size_parallel = netgraph_factory.GetHyperparameters()["batch_size_parallel"];
@@ -291,7 +294,7 @@ bool Project::Deserialize(Conv::JSON& project_json) {
   Conv::NetGraphNode* input_node = new Conv::NetGraphNode(input_layer_);
   input_node->is_input = true;
 
-  // Add other layers
+  // Übrige Schichten hinzufügen
   graph_->AddNode(input_node);
   bool result = netgraph_factory.AddLayers(*graph_, class_manager_, 23923);
   if(!result) {
@@ -302,16 +305,16 @@ bool Project::Deserialize(Conv::JSON& project_json) {
   graph_->Initialize();
   graph_->InitializeWeights(true);
 
-  // Set helper pointers
+  // Zeiger auf Metadaten schreiben
   predicted_metadata_ = (Conv::DetectionMetadataPointer*) graph_->GetOutputNodes()[0]->output_buffers[0].combined_tensor->metadata;
 
-  // Set project properties
+  // Projekteigenschaften setzen
   project_name_ = project_json["name"];
 
-  // Load trainer
+  // Trainer initialisieren
   trainer_ = new Conv::Trainer(*graph_, netgraph_factory.GetHyperparameters());
 
-  // Load samples
+  // Beispiele laden
   known_samples_ = new Conv::SegmentSet("Known Examples");
   bool deserialization_result = known_samples_->Deserialize(project_json["known_set"]);
   update_set_ = new Conv::SegmentSet("Update Set");
@@ -333,7 +336,7 @@ bool Project::New(std::string architecture_filename, std::string model_filename,
     LOGERROR << "Already have a project!";
     return false;
   } else {
-    // Validate filenames
+    // Pfad validieren
     std::ifstream architecture_file(architecture_filename, std::ios::in);
     if(!architecture_file.good()) {
       LOGERROR << "Failed to open architecture!";
@@ -345,16 +348,16 @@ bool Project::New(std::string architecture_filename, std::string model_filename,
       LOGERROR << "Failed to open model!";
     }
 
-    // Create class manager
+    // Klassenmanager initialisieren
     class_manager_ = new Conv::ClassManager();
     class_manager_->RegisterClassUpdateHandler(class_update_handler_);
 
-    // Load architecture
+    // Netzarchitektur einlesen
     architecture_json = Conv::JSON::parse(architecture_file);
     Conv::JSONNetGraphFactory netgraph_factory(architecture_json, 123123);
     graph_ = new Conv::NetGraph();
 
-    // Create dataset input layer
+    // Eingabeschicht anlegen
     unsigned int batch_size_parallel = 1;
     if(netgraph_factory.GetHyperparameters().count("batch_size_parallel") == 1 && netgraph_factory.GetHyperparameters()["batch_size_parallel"].is_number()) {
       batch_size_parallel = netgraph_factory.GetHyperparameters()["batch_size_parallel"];
@@ -363,7 +366,7 @@ bool Project::New(std::string architecture_filename, std::string model_filename,
     Conv::NetGraphNode* input_node = new Conv::NetGraphNode(input_layer_);
     input_node->is_input = true;
 
-    // Add other layers
+    // Übrigen Schichten laden
     graph_->AddNode(input_node);
     bool result = netgraph_factory.AddLayers(*graph_, class_manager_, 23923);
     if(!result) {
@@ -375,21 +378,21 @@ bool Project::New(std::string architecture_filename, std::string model_filename,
     graph_->InitializeWeights(true);
 
 
-    // Load model
+    // Modell laden
     graph_->DeserializeParameters(model_file);
 
-    // Load trainer
+    // Trainer initialisieren
     trainer_ = new Conv::Trainer(*graph_, netgraph_factory.GetHyperparameters());
 
-    // Initialize segment sets
+    // Datensätze initialisieren
     known_samples_ = new Conv::SegmentSet("Known Examples");
     update_set_ = new Conv::SegmentSet("Update Set");
     new_set_ = new Conv::SegmentSet("New Set");
 
-    // Set helper pointers
+    // Zeiger auf Metadaten schreiben
     predicted_metadata_ = (Conv::DetectionMetadataPointer*) graph_->GetOutputNodes()[0]->output_buffers[0].combined_tensor->metadata;
 
-    // Set project properties
+    // Projekteigenschaften setzen
     project_name_ = project_name;
     project_folder_ = project_folder;
 
@@ -452,14 +455,14 @@ bool Project::LoadModel() {
 }
 
 bool Project::RenameClass(const std::string &org_name, const std::string new_name) {
-  // Rename classes
+  // Klasse selbst umbenennen
   bool class_result = class_manager_->RenameClass(org_name, new_name);
   if(!class_result) {
     LOGERROR << "Could not rename class!";
     return false;
   }
 
-  // Rename samples
+  // Klassen in ALLEN Beispielen umbenennen
   bool sample_result = known_samples_->RenameClass(org_name, new_name);
   sample_result &= new_set_->RenameClass(org_name, new_name);
   sample_result &= update_set_->RenameClass(org_name, new_name);