Shapeworks: Optimasi pada mata jaring dengan bidang pemotongan

Dibuat pada 15 Feb 2021  ·  8Komentar  ·  Sumber: SCIInstitute/ShapeWorks

Saat Anda mengoptimalkan pada mesh dengan bidang pemotongan, pengoptimalan tampaknya terhenti setelah inisialisasi. Tidak ada kesalahan yang terjadi tetapi macet.

Untuk menguji:

  • buka zip
  • cd ke tes
  • lari: shapeworks optimize --name correspondence_1024.xml

Perhatikan bahwa jika bidang pemotongan dihapus dari xml, pengoptimalan akan berjalan seperti yang diharapkan.

bug

Semua 8 komentar

Laporan bug yang sangat baik @ jadie1 ,

@HeavenlyBerserker , untuk referensi, itu macet di sini:

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

Saya mendukung kualitas laporan bug ini. Saya telah melihat masalahnya. Terima kasih telah memeriksanya, Alan.

Fungsi AdvancedAllParticleSplitting akan hang jika tidak ada partikel yang bergerak ke segala arah dengan radius tertentu (jarak dari partikel yang dipisahkan ke partikel asli) memenuhi batasan. Saya berpikir untuk membatasi jumlah arah yang dicoba, tetapi memutuskan untuk tidak melakukannya karena tergantung pada bidang pemotongan, bisa jadi pukulan sangat jarang, jadi angka konstan apa pun mungkin tidak cocok. Saya terbuka untuk saran untuk menangani ini, meskipun jika pekerjaan saat ini saya lakukan berhasil, AdvancedAllParticleSplitting tidak terlalu diperlukan sehingga kita dapat mendiskusikan strategi pemisahan partikel yang sama sekali berbeda.

Sedangkan untuk pengujiannya sendiri, hal ini terjadi karena penempatan mata jaring. Bidang pemotongan dipotong pada z = -40,5 hingga -42,5, tetapi mata jaring ditempatkan pada z = -737,593 hingga -609,55, -1217,76 hingga -1114,47, dan 1079,93 hingga 1206,3 (ditampilkan di bawah). Ini menyebabkan dua masalah. Pertama, terlepas dari arah mana yang normal menunjuk (atas / bawah), akan ada setidaknya satu femur yang benar-benar melanggar batasan. Kedua, jari-jari pemisahan partikel ditentukan oleh kuantitas epsilon, bergantung pada jarak input; dalam hal ini, jaraknya dalam 1000-an, membuat pemisahan apa pun cenderung melanggar batasan.
Screenshot from 2021-02-17 13-48-13

Sebagai catatan, femora yang Anda gunakan sudah dipotong dengan metode clipping. Saya tidak berpikir ini akan dilakukan dalam skenario nyata. Ingat bagaimana saya menghapus ClipBinaryVolumes dan menerapkanCropping untuk femur_cut.py.
Screenshot from 2021-02-17 14-01-22

Tolong tugaskan saya untuk masalah apa pun di masa mendatang terkait pemotongan pesawat (dalam C ++). Saya belum menguji kode bidang pemotongan dengan jerat. Tidak ada alasan mengapa tidak berfungsi, tetapi akan lebih baik untuk mengujinya untuk bug. Terima kasih, kalian semua!

@HeavenlyBerserker oh oke, jadi secara teori jika jerat dan bidang pemotongan masuk akal maka bug tidak akan ada? Joe perlu mengoptimalkan dengan memotong bidang pada jerat femur yang tidak terpotong, saya mencoba memberinya contoh xml. Jadi saya hanya membuat cutting planes dan menggunakan femur mesh, tapi jika saya lebih berhati-hati maka itu akan berhasil?

Ya, saya mencoba memotong pesawat yang tidak dilanggar tetapi mengalami masalah jarak, tetapi berhasil. Jika Anda dapat meletakkan semua femora di area umum yang sama dan menyesuaikan bidang pemotongan agar masuk akal, saya tidak melihat alasan ini tidak akan berhasil, terutama mengingat Anda hanya menggunakan satu bidang pemotongan.

Oke ya dipastikan tidak ada bug saat saya menggunakan data ini: test.zip

Terima kasih telah membantu saya memahami @HeavenlyBerserker
Menutup ini sekarang

Saya belum menguji kode bidang pemotongan dengan jerat. Tidak ada alasan mengapa tidak berfungsi, tetapi akan lebih baik untuk mengujinya untuk bug.

Kami telah berhasil memotong beberapa mesh dan ada pengujian unit untuk ini (MeshTests, PythonTests, dan shapeworksTests).

Tolong tugaskan saya untuk masalah apa pun di masa mendatang dalam C ++.

Benar! Terima kasih!!

@HeavenlyBerserker , adakah cara untuk mendeteksi kondisi ini dan muncul pengecualian atau pesan kesalahan? Saya lebih suka itu daripada menggantung atau menabrak. Juga, adakah cara kami dapat memverifikasi sebelum menjalankan? Lihat # 910.

Hmm, seharusnya mungkin untuk memeriksa apakah setidaknya satu dari titik mesh / gambar dari masukan apa pun memenuhi batasan. Bukan bukti yang bodoh, tetapi harus bekerja 99,9% dari waktu.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat