Closing Issue #63 . Also relates to contour misplacement. Problems arise when canceling autoreg. Now fixed.

Also closing issue #91 - Not the most elegant solution. For amoeba we do not visualise Iteration but value of optimizer.
This commit is contained in:
Proton local user
2023-06-01 14:43:55 +02:00
parent ef51c4173a
commit 3c3f1a378b
2 changed files with 87 additions and 25 deletions

View File

@ -28,9 +28,23 @@ public slots:
void onAbortProcessCommand(){ void onAbortProcessCommand(){
bAbortProcessCommand = true; bAbortProcessCommand = true;
}; };
void onIteration(double dI,double dX,double dY,double dZ){ void onIteration(itk::tOptimizerTypeEnum eType,double dI,double dX,double dY,double dZ){
emit
sendRegistrationProgress(dI,dX,dY,dZ); switch (eType) {
case itk::eOptimizerType::POWELL:
emit
sendRegistrationProgress(0,dI,dX,dY,dZ);
break;
case itk::eOptimizerType::AMOEBA:
emit
sendRegistrationProgress(1,dI,dX,dY,dZ);
break;
}
} }
private: private:
@ -42,7 +56,7 @@ private:
signals: signals:
void sendRegistrationProgress(double,double,double,double); void sendRegistrationProgress(int,double,double,double,double);
}; };
@ -57,6 +71,11 @@ class CommandIterationUpdate : public itk::Command {
public: public:
QObjectIterationUpdate *objIterUpdate; QObjectIterationUpdate *objIterUpdate;
tOptimizerTypeEnum
eOptimType;
int
iAmoebaIterations;
using Self = CommandIterationUpdate; using Self = CommandIterationUpdate;
using Superclass = itk::Command; using Superclass = itk::Command;
@ -85,7 +104,12 @@ public:
using OptimizerPointer = const OptimizerType*; using OptimizerPointer = const OptimizerType*;
using AmoebaOptimizerType = itk::AmoebaOptimizer; using AmoebaOptimizerType = itk::AmoebaOptimizer;
using AmoebaOptimizerPointer = const OptimizerType*; using AmoebaOptimizerPointer = const AmoebaOptimizerType*;
void setOptimizerTypeOfIterationUpdate(tOptimizerTypeEnum eOptType){
eOptimType = eOptType;
iAmoebaIterations = 0;
}
void void
Execute(itk::Object* caller, const itk::EventObject& event) override Execute(itk::Object* caller, const itk::EventObject& event) override
@ -103,34 +127,70 @@ public:
} }
// std::cout << "Progress: " << this->m_Process->GetAbortGenerateData() << std::endl; // std::cout << "Progress: " << this->m_Process->GetAbortGenerateData() << std::endl;
auto optimizer = dynamic_cast<OptimizerPointer>(object); OptimizerPointer optPow;
AmoebaOptimizerPointer optAm;
if (typeid(event) == typeid(itk::IterationEvent)) { switch (eOptimType) {
case eOptimizerType::POWELL:
optPow = dynamic_cast<OptimizerPointer>(object);
if (typeid(event) == typeid(itk::IterationEvent)) {
//Feedback from the optimizer executed at the end of every itteration objIterUpdate->onIteration(
// currently just print the result into the cout. We might add eOptimType,
// functionality to register and emit signals to update the UI. optPow->GetCurrentIteration()+1,
optPow->GetCurrentPosition()[0],
optPow->GetCurrentPosition()[1],
optPow->GetCurrentPosition()[2]
);
}
std::cout << "Iteration: " << optimizer->GetCurrentIteration() << std::endl; break;
auto oldprecision = std::cout.precision(); case eOptimizerType::AMOEBA:
std::cout.precision(std::numeric_limits<double>::digits10 + 2); optAm = dynamic_cast<AmoebaOptimizerPointer>(object);
std::cout << "Similarity: " << optimizer->GetValue() << std::endl; iAmoebaIterations ++;
std::cout.precision(oldprecision); if(iAmoebaIterations == 100){
std::cout << "Position: " << optimizer->GetCurrentPosition() << std::endl; iAmoebaIterations = 100;
}
objIterUpdate->onIteration(
eOptimType,
optAm->GetCachedValue(),
optAm->GetCachedCurrentPosition()[0],
optAm->GetCachedCurrentPosition()[1],
optAm->GetCachedCurrentPosition()[2]
);
break;
}
// auto optimizer = dynamic_cast<OptimizerPointer>(object);
// if (typeid(event) == typeid(itk::IterationEvent)) {
// //Feedback from the optimizer executed at the end of every itteration
// // currently just print the result into the cout. We might add
// // functionality to register and emit signals to update the UI.
//// std::cout << "Iteration: " << optimizer->GetCurrentIteration() << std::endl;
//// auto oldprecision = std::cout.precision();
//// std::cout.precision(std::numeric_limits<double>::digits10 + 2);
//// std::cout << "Similarity: " << optimizer->GetValue() << std::endl;
//// std::cout.precision(oldprecision);
//// std::cout << "Position: " << optimizer->GetCurrentPosition() << std::endl;
//// objIterUpdate->onIteration(
//// optimizer->GetCurrentIteration()+1,
//// optimizer->GetCurrentPosition()[0],
//// optimizer->GetCurrentPosition()[2],
//// -optimizer->GetCurrentPosition()[1]
//// );
// objIterUpdate->onIteration( // objIterUpdate->onIteration(
// optimizer->GetCurrentIteration()+1, // optimizer->GetCurrentIteration()+1,
// optimizer->GetCurrentPosition()[0], // optimizer->GetCurrentPosition()[0],
// optimizer->GetCurrentPosition()[2], // optimizer->GetCurrentPosition()[1],
// -optimizer->GetCurrentPosition()[1] // optimizer->GetCurrentPosition()[2]
// ); // );
objIterUpdate->onIteration( // }
optimizer->GetCurrentIteration()+1,
optimizer->GetCurrentPosition()[0],
optimizer->GetCurrentPosition()[1],
optimizer->GetCurrentPosition()[2]
);
}
return; return;
} }
}; };

View File

@ -153,6 +153,7 @@ void itkReg23::InitializeRegistration()
PowellOptimizer->SetValueTolerance(m_PowellMeta->GetValueTolerance()); PowellOptimizer->SetValueTolerance(m_PowellMeta->GetValueTolerance());
PowellOptimizer->RemoveAllObservers(); PowellOptimizer->RemoveAllObservers();
PowellOptimizer->AddObserver(itk::IterationEvent(), m_OptimizerObserver); PowellOptimizer->AddObserver(itk::IterationEvent(), m_OptimizerObserver);
m_OptimizerObserver->setOptimizerTypeOfIterationUpdate(tOptimizerTypeEnum::POWELL);
registration->SetOptimizer(PowellOptimizer); registration->SetOptimizer(PowellOptimizer);
@ -177,6 +178,7 @@ void itkReg23::InitializeRegistration()
AmoebaOptimizer->SetInitialSimplexDelta(simplexDelta); AmoebaOptimizer->SetInitialSimplexDelta(simplexDelta);
AmoebaOptimizer->RemoveAllObservers(); AmoebaOptimizer->RemoveAllObservers();
AmoebaOptimizer->AddObserver(itk::IterationEvent(), m_OptimizerObserver); AmoebaOptimizer->AddObserver(itk::IterationEvent(), m_OptimizerObserver);
m_OptimizerObserver->setOptimizerTypeOfIterationUpdate(tOptimizerTypeEnum::AMOEBA);
registration->SetOptimizer(AmoebaOptimizer); registration->SetOptimizer(AmoebaOptimizer);