Realcat commited on
Commit
6486bfd
·
1 Parent(s): 7ac633e

update: ui

Browse files
Files changed (1) hide show
  1. common/app_class.py +209 -22
common/app_class.py CHANGED
@@ -377,31 +377,15 @@ class ImageMatchingApp:
377
  ],
378
  outputs=[output_wrapped, geometry_result],
379
  )
380
- with gr.Tab("Under construction"):
381
  self.init_tab_sfm()
382
 
383
  def init_tab_sfm(self):
384
- with gr.Row():
385
- with gr.Column():
386
- with gr.Row():
387
- gr.Textbox("Under construction", label="A", visible=True)
388
- gr.Textbox("Under construction", label="B", visible=True)
389
- gr.Textbox("Under construction", label="C", visible=True)
390
- with gr.Row():
391
- with gr.Accordion("Open for More", open=False):
392
- gr.Textbox(
393
- "Under construction", label="A1", visible=True
394
- )
395
- gr.Textbox(
396
- "Under construction", label="B1", visible=True
397
- )
398
- gr.Textbox(
399
- "Under construction", label="C1", visible=True
400
- )
401
- with gr.Column():
402
- gr.Textbox("Under construction", label="D", visible=True)
403
- gr.Textbox("Under construction", label="E", visible=True)
404
- gr.Textbox("Under construction", label="F", visible=True)
405
 
406
  def run(self):
407
  self.app.queue().launch(
@@ -559,3 +543,206 @@ class ImageMatchingApp:
559
  # height=1000,
560
  )
561
  return tab
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
377
  ],
378
  outputs=[output_wrapped, geometry_result],
379
  )
380
+ with gr.Tab("Structure from Motion(under-dev)"):
381
  self.init_tab_sfm()
382
 
383
  def init_tab_sfm(self):
384
+ sfm_ui = AppSfmUI()
385
+ sfm_ui.set_local_features(["disk", "superpoint"])
386
+ sfm_ui.set_matchers(["disk+lightglue", "superpoint+lightglue"])
387
+ sfm_ui.set_global_features(["netvlad", "mixvpr"])
388
+ sfm_ui.call()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
389
 
390
  def run(self):
391
  self.app.queue().launch(
 
543
  # height=1000,
544
  )
545
  return tab
546
+
547
+
548
+ class AppBaseUI:
549
+ def __init__(self, cfg: Dict[str, Any] = None):
550
+ self.cfg = cfg
551
+
552
+ def _init_ui(self):
553
+ NotImplemented
554
+
555
+ def call(self, **kwargs):
556
+ self._init_ui()
557
+
558
+
559
+ class AppSfmUI(AppBaseUI):
560
+ def __init__(self, cfg: Dict[str, Any] = None):
561
+ super().__init__(cfg)
562
+ self.matchers = None
563
+ self.features = None
564
+ self.global_features = None
565
+
566
+ def _update_options(self, option):
567
+ if option == "sparse":
568
+ return gr.Textbox("sparse", visible=True)
569
+ elif option == "dense":
570
+ return gr.Textbox("dense", visible=True)
571
+ else:
572
+ return gr.Textbox("not set", visible=True)
573
+
574
+ def set_local_features(self, features):
575
+ self.features = features
576
+
577
+ def set_global_features(self, features):
578
+ self.global_features = features
579
+
580
+ def set_matchers(self, matchers):
581
+ self.matchers = matchers
582
+
583
+ def _on_select_custom_params(self, value: bool = False):
584
+ return gr.Textbox(
585
+ label="Camera Params",
586
+ value="0,0,0,0",
587
+ interactive=value,
588
+ visible=value,
589
+ )
590
+
591
+ def _init_ui(self):
592
+ with gr.Row():
593
+ # data settting and camera settings
594
+ with gr.Column():
595
+ input_images = gr.File(
596
+ label="SfM", interactive=True, file_count="multiple"
597
+ )
598
+ # camera setting
599
+ with gr.Accordion("Camera Settings", open=True):
600
+ with gr.Column():
601
+ with gr.Row():
602
+ with gr.Column():
603
+ camera_model = gr.Dropdown(
604
+ choices=[
605
+ "PINHOLE",
606
+ "SIMPLE_RADIAL",
607
+ "OPENCV",
608
+ ],
609
+ value="PINHOLE",
610
+ label="Camera Model",
611
+ interactive=True,
612
+ )
613
+ with gr.Column():
614
+ gr.Checkbox(
615
+ label="Shared Params",
616
+ value=True,
617
+ interactive=True,
618
+ )
619
+ camera_custom_params_cb = gr.Checkbox(
620
+ label="Custom Params",
621
+ value=False,
622
+ interactive=True,
623
+ )
624
+ with gr.Row():
625
+ camera_params = gr.Textbox(
626
+ label="Camera Params",
627
+ value="0,0,0,0",
628
+ interactive=False,
629
+ visible=False,
630
+ )
631
+ camera_custom_params_cb.select(
632
+ fn=self._on_select_custom_params,
633
+ inputs=camera_custom_params_cb,
634
+ outputs=camera_params,
635
+ )
636
+
637
+ with gr.Accordion("Matching Settings", open=True):
638
+ # feature extraction and matching setting
639
+ with gr.Row():
640
+ feature_type = gr.Radio(
641
+ ["sparse", "dense"],
642
+ label="Feature Type",
643
+ value="sparse",
644
+ interactive=True,
645
+ )
646
+ feature_details = gr.Textbox(
647
+ label="Feature Details",
648
+ visible=False,
649
+ )
650
+ # feature_type.change(
651
+ # fn=self._update_options,
652
+ # inputs=feature_type,
653
+ # outputs=feature_details,
654
+ # )
655
+ # matcher setting
656
+ matcher_name = gr.Dropdown(
657
+ choices=self.matchers,
658
+ value="disk+lightglue",
659
+ label="Matching Model",
660
+ interactive=True,
661
+ )
662
+ with gr.Row():
663
+ with gr.Accordion("Advanced Settings", open=False):
664
+ with gr.Column():
665
+
666
+ with gr.Row():
667
+ # matching setting
668
+ max_features = gr.Slider(
669
+ label="Max Features",
670
+ minimum=100,
671
+ maximum=10000,
672
+ value=1000,
673
+ interactive=True,
674
+ )
675
+ ransac_threshold = gr.Slider(
676
+ label="Ransac Threshold",
677
+ minimum=0.01,
678
+ maximum=12.0,
679
+ value=4.0,
680
+ step=0.01,
681
+ interactive=True,
682
+ )
683
+
684
+ with gr.Row():
685
+ ransac_confidence = gr.Slider(
686
+ label="Ransac Confidence",
687
+ minimum=0.01,
688
+ maximum=1.0,
689
+ value=0.9999,
690
+ step=0.0001,
691
+ interactive=True,
692
+ )
693
+ ransac_max_iter = gr.Slider(
694
+ label="Ransac Max Iter",
695
+ minimum=1,
696
+ maximum=100,
697
+ value=100,
698
+ step=1,
699
+ interactive=True,
700
+ )
701
+ with gr.Accordion("Scene Graph Settings", open=True):
702
+ # mapping setting
703
+ scene_graph = gr.Dropdown(
704
+ choices=["all", "swin", "oneref"],
705
+ value="all",
706
+ label="Scene Graph",
707
+ interactive=True,
708
+ )
709
+
710
+ # global feature setting
711
+ global_feature = gr.Dropdown(
712
+ choices=self.global_features,
713
+ value="netvlad",
714
+ label="Global features",
715
+ interactive=True,
716
+ )
717
+
718
+ button_match = gr.Button("Run Matching", variant="primary")
719
+
720
+ # mapping setting
721
+ with gr.Column():
722
+ with gr.Accordion("Mapping Settings", open=True):
723
+ with gr.Row():
724
+ with gr.Accordion("Buddle Settings", open=True):
725
+ with gr.Row():
726
+ mapper_refine_focal_length = gr.Checkbox(
727
+ label="Refine Focal Length",
728
+ value=False,
729
+ interactive=True,
730
+ )
731
+ mapper_refine_principle_points = gr.Checkbox(
732
+ label="Refine Principle Points",
733
+ value=False,
734
+ interactive=True,
735
+ )
736
+ mapper_refine_extra_params = gr.Checkbox(
737
+ label="Refine Extra Params",
738
+ value=False,
739
+ interactive=True,
740
+ )
741
+ with gr.Accordion(
742
+ "Retriangluation Settings", open=True
743
+ ):
744
+ gr.Textbox(
745
+ label="Retriangluation Details",
746
+ )
747
+ gr.Button("Run SFM", variant="primary")
748
+ model_3d = gr.Model3D()