Shapeworks: Оптимизация на сетках с секущими плоскостями

Созданный на 15 февр. 2021  ·  8Комментарии  ·  Источник: SCIInstitute/ShapeWorks

Когда вы оптимизируете сетки с секущими плоскостями, оптимизация кажется зависает после инициализации. Ошибка не возникает, но она застревает.

Тестировать:

  • разархивировать test.zip
  • cd в тест
  • запустить: shapeworks optimize --name correspondence_1024.xml

Обратите внимание, что если секущая плоскость удаляется из xml, оптимизация выполняется должным образом.

Все 8 Комментарий

Отличный отчет об ошибке @ jadie1 , небольшой набор данных и инструкции по воспроизведению.

@HeavenlyBerserker , для справки, он застрял здесь:

Call graph:
    5 Thread_5215217   DispatchQueue_1: com.apple.main-thread  (serial)
    + 5 start  (in libdyld.dylib) + 1  [0x7fff69ef2cc9]
    +   5 main  (in shapeworks) + 2606  [0x102bfb9fe]  shapeworks.cpp:88
    +     5 shapeworks::Executable::run(int, char const* const*)  (in shapeworks) + 188  [0x102c0ad7c]  Executable.cpp:128
    +       5 shapeworks::Executable::run(std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >, shapeworks::SharedCommandData&)  (in shapeworks) + 308  [0x102c0a6f4]  Executable.cpp:94
    +         5 shapeworks::Command::run(shapeworks::SharedCommandData&)  (in shapeworks) + 20  [0x102c14e64]  Command.cpp:27
    +           5 shapeworks::OptimizeCommand::execute(optparse::Values const&, shapeworks::SharedCommandData&)  (in shapeworks) + 921  [0x102c16889]  Commands.cpp:92
    +             5 shapeworks::Optimize::Run()  (in shapeworks) + 1938  [0x102ea5d52]  Optimize.cpp:120
    +               5 shapeworks::Optimize::Initialize()  (in shapeworks) + 1770  [0x102ea7d3a]  Optimize.cpp:733
    +                 1 itk::ParticleSystem<3u>::AdvancedAllParticleSplitting(double)  (in shapeworks) + 2133  [0x102eb46f5]  itkParticleSystem.txx:330
    +                 1 itk::ParticleSystem<3u>::AdvancedAllParticleSplitting(double)  (in shapeworks) + 2542  [0x102eb488e]  itkParticleSystem.txx:344
    +                 ! 1 itk::Constraints::IsAnyViolated(itk::Point<double, 3u> const&)  (in shapeworks) + 71  [0x102ecce67]  Constraints.h:61
    +                 1 itk::ParticleSystem<3u>::AdvancedAllParticleSplitting(double)  (in shapeworks) + 2530  [0x102eb4882]  itkParticleSystem.txx:344
    +                 1 itk::ParticleSystem<3u>::AdvancedAllParticleSplitting(double)  (in shapeworks) + 3010  [0x102eb4a62]  itkParticleSystem.txx:349
    +                 1 itk::ParticleSystem<3u>::AdvancedAllParticleSplitting(double)  (in shapeworks) + 1655  [0x102eb4517]  vector:0

Я поддерживаю качество этого отчета об ошибке. Я посмотрел на проблему. Спасибо, что проверил это, Алан.

Функция AdvancedAllParticleSplitting зависнет, если ни одна из частиц, движущихся в любом направлении на определенный радиус (расстояние от разделенной частицы до исходной частицы), не удовлетворяет ограничениям. Я думал об ограничении количества попыток направления, но отказался от этого, потому что в зависимости от режущих плоскостей попадание может быть очень редким, поэтому любое постоянное число может быть неподходящим. Я открыт для предложений, как справиться с этим, хотя, если текущая работа, которую я выполняю, сработает, AdvancedAllParticleSplitting не будет строго необходим, поэтому мы можем обсудить совершенно разные стратегии разделения частиц.

Что касается самого теста, это происходит из-за расположения сеток. Плоскости среза срезаются при z = от -40,5 до -42,5, но сетки располагаются на z = от -737,593 до -609,55, от -1217,76 до -1114,47 и от 1079,93 до 1206,3 (показано ниже). Это вызывает две проблемы. Во-первых, независимо от того, в какую сторону направлена ​​нормаль (вверх / вниз), будет хотя бы одна бедренная кость, которая полностью нарушает ограничения. Во-вторых, радиус разделения частиц определяется величиной эпсилон, зависящей от расстояния между входными данными; в этом случае интервал составляет 1000 с, поэтому любое разделение может нарушить ограничения.
Screenshot from 2021-02-17 13-48-13

Обратите внимание: бедренные кости, которые вы используете, уже были обрезаны методом клипсирования. Я не думаю, что это было бы сделано в реальном сценарии. Вспомните, как я удалил ClipBinaryVolumes и применилCropping для femur_cut.py.
Screenshot from 2021-02-17 14-01-22

Пожалуйста, поручите мне решать любые будущие вопросы, касающиеся резки плоскостей (в C ++). Я не тестировал код режущей плоскости с сетками. Нет никаких причин, по которым он не должен работать, но было бы хорошо проверить его на наличие ошибок. Спасибо всем!

@HeavenlyBerserker, ладно, теоретически, если бы сетки и плоскости резки имели смысл, тогда бы ошибки не существовало? Джо нужно оптимизировать с помощью режущих плоскостей на несжатых сетках бедренной кости, я пытался предоставить ему пример xml. Итак, я просто сделал плоскости для резки и использовал сетку бедренной кости, но если я буду более осторожен, тогда это должно сработать?

Да, я пробовал вырезать плоскости, которые не нарушаются, но столкнулся с проблемой интервала, но это работает. Если вы можете поместить все бедра в одну и ту же общую область и отрегулировать плоскости сечения, чтобы они были разумными, я не вижу причин, по которым это не должно работать, особенно учитывая, что вы используете только одну плоскость среза.

Хорошо, да, подтвердил отсутствие ошибок, когда я использовал эти данные: test.zip

Спасибо, что помогли мне понять @HeavenlyBerserker
Закрытие сейчас

Я не тестировал код режущей плоскости с сетками. Нет никаких причин, по которым он не должен работать, но было бы хорошо проверить его на наличие ошибок.

Мы успешно нарезали несколько сеток, и для этого есть модульные тесты (MeshTests, PythonTests и shapeworksTests).

Пожалуйста, поручайте мне решать любые будущие проблемы в C ++.

Абсолютно! Спасибо!!

@HeavenlyBerserker , есть ли способ обнаружить это состояние и вызвать исключение или сообщение об ошибке? Я бы предпочел это зависанию или сбою. Кроме того, есть ли способ проверить перед запуском? См. №910.

Хм, должна быть возможность проверить, удовлетворяет ли хотя бы одна из точек сетки / изображения любого входа ограничению. Не надежно, но должно работать 99,9% времени.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги