Spaces:
Running
on
Zero
Running
on
Zero
2025-08-01 09:34 🚀
Browse files
app.py
CHANGED
@@ -576,7 +576,11 @@ select option[value*="━━━━━━"] {
|
|
576 |
position: static !important;
|
577 |
}
|
578 |
|
579 |
-
.gr-row:nth-of-type(3) .gr-
|
|
|
|
|
|
|
|
|
580 |
position: static !important;
|
581 |
bottom: auto !important;
|
582 |
left: auto !important;
|
@@ -615,7 +619,11 @@ select option[value*="━━━━━━"] {
|
|
615 |
position: static !important;
|
616 |
}
|
617 |
|
618 |
-
.gr-row:nth-of-type(3) .gr-
|
|
|
|
|
|
|
|
|
619 |
position: static !important;
|
620 |
bottom: auto !important;
|
621 |
left: auto !important;
|
@@ -665,7 +673,11 @@ select option[value*="━━━━━━"] {
|
|
665 |
position: static !important;
|
666 |
}
|
667 |
|
668 |
-
.gr-row:nth-of-type(3) .gr-
|
|
|
|
|
|
|
|
|
669 |
position: static !important;
|
670 |
bottom: auto !important;
|
671 |
left: auto !important;
|
@@ -796,13 +808,13 @@ select option[value*="━━━━━━"] {
|
|
796 |
transform: translateY(-2px) !important;
|
797 |
}
|
798 |
|
799 |
-
/* 确保第二行组件等高 */
|
800 |
.gr-row:nth-of-type(2) .gr-group {
|
801 |
-
height:
|
802 |
-
min-height:
|
803 |
display: flex !important;
|
804 |
flex-direction: column !important;
|
805 |
-
justify-content:
|
806 |
}
|
807 |
|
808 |
.gr-row:nth-of-type(2) .gr-group > * {
|
@@ -823,10 +835,10 @@ select option[value*="━━━━━━"] {
|
|
823 |
max-height: 80px !important;
|
824 |
}
|
825 |
|
826 |
-
/* 确保第三行组件等高 */
|
827 |
.gr-row:nth-of-type(3) .gr-group {
|
828 |
-
height:
|
829 |
-
min-height:
|
830 |
display: flex !important;
|
831 |
flex-direction: column !important;
|
832 |
justify-content: flex-start !important;
|
@@ -834,18 +846,18 @@ select option[value*="━━━━━━"] {
|
|
834 |
|
835 |
/* 第三行的图像容器统一高度 */
|
836 |
.gr-row:nth-of-type(3) .gr-image {
|
837 |
-
height:
|
838 |
-
min-height:
|
839 |
-
max-height:
|
840 |
-
flex: 0 0
|
841 |
}
|
842 |
|
843 |
-
/* 第三行的按钮固定在底部 */
|
844 |
-
.gr-row:nth-of-type(3) .gr-group {
|
845 |
position: relative !important;
|
846 |
}
|
847 |
|
848 |
-
.gr-row:nth-of-type(3) .gr-button {
|
849 |
position: absolute !important;
|
850 |
bottom: 24px !important;
|
851 |
left: 24px !important;
|
@@ -860,13 +872,9 @@ select option[value*="━━━━━━"] {
|
|
860 |
margin-bottom: 16px !important;
|
861 |
}
|
862 |
|
863 |
-
/* 第二行特殊布局调整 */
|
864 |
-
.gr-row:nth-of-type(2) .gr-column
|
865 |
-
padding
|
866 |
-
}
|
867 |
-
|
868 |
-
.gr-row:nth-of-type(2) .gr-column:last-child {
|
869 |
-
padding-left: 12px !important;
|
870 |
}
|
871 |
|
872 |
/* 标签美化 */
|
@@ -924,25 +932,7 @@ select option[value*="━━━━━━"] {
|
|
924 |
height: 100% !important;
|
925 |
}
|
926 |
|
927 |
-
/* 第二行内部子行等高处理 */
|
928 |
-
.gr-row:nth-of-type(2) .gr-group .gr-row {
|
929 |
-
height: 100% !important;
|
930 |
-
align-items: stretch !important;
|
931 |
-
flex: 1 !important;
|
932 |
-
}
|
933 |
-
|
934 |
-
.gr-row:nth-of-type(2) .gr-group .gr-row .gr-column {
|
935 |
-
display: flex !important;
|
936 |
-
flex-direction: column !important;
|
937 |
-
justify-content: space-between !important;
|
938 |
-
height: 100% !important;
|
939 |
-
}
|
940 |
-
|
941 |
-
/* 第二行内部markdown标题固定高度 */
|
942 |
-
.gr-row:nth-of-type(2) .gr-group .gr-markdown {
|
943 |
-
flex: 0 0 auto !important;
|
944 |
-
margin-bottom: 16px !important;
|
945 |
-
}
|
946 |
|
947 |
/* 统计信息卡片美化 */
|
948 |
.gr-textbox[label*="Count"] {
|
@@ -1020,34 +1010,31 @@ with gr.Blocks(css=css, theme=gr.themes.Soft(), title="ZIP Crowd Counting") as d
|
|
1020 |
Choose from different model variants: **ZIP-B** (Base), **ZIP-S** (Small), **ZIP-T** (Tiny), **ZIP-N** (Nano), **ZIP-P** (Pico)
|
1021 |
""")
|
1022 |
|
1023 |
-
#
|
1024 |
with gr.Row():
|
1025 |
-
with gr.Column(scale=
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1026 |
with gr.Group():
|
1027 |
-
gr.
|
1028 |
-
|
1029 |
-
|
1030 |
-
|
1031 |
-
|
1032 |
-
|
1033 |
-
|
1034 |
-
info="Choose model variant, dataset, and evaluation metric"
|
1035 |
-
)
|
1036 |
-
|
1037 |
-
with gr.Column(scale=1):
|
1038 |
-
model_status = gr.Textbox(
|
1039 |
-
label="📊 Model Status",
|
1040 |
-
value="🔄 No model loaded",
|
1041 |
-
interactive=False,
|
1042 |
-
elem_classes=["status-display"],
|
1043 |
-
lines=3
|
1044 |
-
)
|
1045 |
|
1046 |
with gr.Column(scale=1):
|
1047 |
with gr.Group():
|
1048 |
-
gr.Markdown("### 🧙 Predicted Count")
|
1049 |
output_text = gr.Textbox(
|
1050 |
-
label="
|
1051 |
value="",
|
1052 |
interactive=False,
|
1053 |
info="Total number of people detected",
|
@@ -1058,9 +1045,8 @@ with gr.Blocks(css=css, theme=gr.themes.Soft(), title="ZIP Crowd Counting") as d
|
|
1058 |
with gr.Row():
|
1059 |
with gr.Column(scale=1):
|
1060 |
with gr.Group():
|
1061 |
-
gr.Markdown("### 📸 Image Input")
|
1062 |
input_img = gr.Image(
|
1063 |
-
label="
|
1064 |
sources=["upload", "clipboard"],
|
1065 |
type="pil",
|
1066 |
height=400
|
@@ -1073,7 +1059,6 @@ with gr.Blocks(css=css, theme=gr.themes.Soft(), title="ZIP Crowd Counting") as d
|
|
1073 |
|
1074 |
with gr.Column(scale=1):
|
1075 |
with gr.Group():
|
1076 |
-
gr.Markdown("### 📊 Main Results")
|
1077 |
output_den_map = gr.Image(
|
1078 |
label="🎯 Predicted Density Map",
|
1079 |
type="pil",
|
@@ -1082,7 +1067,6 @@ with gr.Blocks(css=css, theme=gr.themes.Soft(), title="ZIP Crowd Counting") as d
|
|
1082 |
|
1083 |
with gr.Column(scale=1):
|
1084 |
with gr.Group():
|
1085 |
-
gr.Markdown("### 🔥 Hotspots")
|
1086 |
output_lambda_map = gr.Image(
|
1087 |
label="📈 Lambda Map",
|
1088 |
type="pil",
|
|
|
576 |
position: static !important;
|
577 |
}
|
578 |
|
579 |
+
.gr-row:nth-of-type(3) .gr-column:first-child .gr-group {
|
580 |
+
position: static !important;
|
581 |
+
}
|
582 |
+
|
583 |
+
.gr-row:nth-of-type(3) .gr-column:first-child .gr-button {
|
584 |
position: static !important;
|
585 |
bottom: auto !important;
|
586 |
left: auto !important;
|
|
|
619 |
position: static !important;
|
620 |
}
|
621 |
|
622 |
+
.gr-row:nth-of-type(3) .gr-column:first-child .gr-group {
|
623 |
+
position: static !important;
|
624 |
+
}
|
625 |
+
|
626 |
+
.gr-row:nth-of-type(3) .gr-column:first-child .gr-button {
|
627 |
position: static !important;
|
628 |
bottom: auto !important;
|
629 |
left: auto !important;
|
|
|
673 |
position: static !important;
|
674 |
}
|
675 |
|
676 |
+
.gr-row:nth-of-type(3) .gr-column:first-child .gr-group {
|
677 |
+
position: static !important;
|
678 |
+
}
|
679 |
+
|
680 |
+
.gr-row:nth-of-type(3) .gr-column:first-child .gr-button {
|
681 |
position: static !important;
|
682 |
bottom: auto !important;
|
683 |
left: auto !important;
|
|
|
808 |
transform: translateY(-2px) !important;
|
809 |
}
|
810 |
|
811 |
+
/* 确保第二行组件等高 - 重新调整为三列等宽 */
|
812 |
.gr-row:nth-of-type(2) .gr-group {
|
813 |
+
height: 180px !important;
|
814 |
+
min-height: 180px !important;
|
815 |
display: flex !important;
|
816 |
flex-direction: column !important;
|
817 |
+
justify-content: center !important;
|
818 |
}
|
819 |
|
820 |
.gr-row:nth-of-type(2) .gr-group > * {
|
|
|
835 |
max-height: 80px !important;
|
836 |
}
|
837 |
|
838 |
+
/* 确保第三行组件等高 - 重新调整高度 */
|
839 |
.gr-row:nth-of-type(3) .gr-group {
|
840 |
+
height: 520px !important;
|
841 |
+
min-height: 520px !important;
|
842 |
display: flex !important;
|
843 |
flex-direction: column !important;
|
844 |
justify-content: flex-start !important;
|
|
|
846 |
|
847 |
/* 第三行的图像容器统一高度 */
|
848 |
.gr-row:nth-of-type(3) .gr-image {
|
849 |
+
height: 400px !important;
|
850 |
+
min-height: 400px !important;
|
851 |
+
max-height: 400px !important;
|
852 |
+
flex: 0 0 400px !important;
|
853 |
}
|
854 |
|
855 |
+
/* 第三行的按钮固定在底部 - 只对第一列(Image Input)应用 */
|
856 |
+
.gr-row:nth-of-type(3) .gr-column:first-child .gr-group {
|
857 |
position: relative !important;
|
858 |
}
|
859 |
|
860 |
+
.gr-row:nth-of-type(3) .gr-column:first-child .gr-button {
|
861 |
position: absolute !important;
|
862 |
bottom: 24px !important;
|
863 |
left: 24px !important;
|
|
|
872 |
margin-bottom: 16px !important;
|
873 |
}
|
874 |
|
875 |
+
/* 第二行特殊布局调整 - 移除,现在是三列等宽 */
|
876 |
+
.gr-row:nth-of-type(2) .gr-column {
|
877 |
+
padding: 0 8px !important;
|
|
|
|
|
|
|
|
|
878 |
}
|
879 |
|
880 |
/* 标签美化 */
|
|
|
932 |
height: 100% !important;
|
933 |
}
|
934 |
|
935 |
+
/* 第二行内部子行等高处理 - 移除,现在不需要内部子行 */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
936 |
|
937 |
/* 统计信息卡片美化 */
|
938 |
.gr-textbox[label*="Count"] {
|
|
|
1010 |
Choose from different model variants: **ZIP-B** (Base), **ZIP-S** (Small), **ZIP-T** (Tiny), **ZIP-N** (Nano), **ZIP-P** (Pico)
|
1011 |
""")
|
1012 |
|
1013 |
+
# 第二行:模型配置、状态和预测结果(三列等宽)
|
1014 |
with gr.Row():
|
1015 |
+
with gr.Column(scale=1):
|
1016 |
+
with gr.Group():
|
1017 |
+
model_dropdown = gr.Dropdown(
|
1018 |
+
choices=pretrained_models,
|
1019 |
+
value="ZIP-B @ NWPU-Crowd @ MAE",
|
1020 |
+
label="🎛️ Select Model & Dataset",
|
1021 |
+
info="Choose model variant, dataset, and evaluation metric"
|
1022 |
+
)
|
1023 |
+
|
1024 |
+
with gr.Column(scale=1):
|
1025 |
with gr.Group():
|
1026 |
+
model_status = gr.Textbox(
|
1027 |
+
label="📊 Model Status",
|
1028 |
+
value="🔄 No model loaded",
|
1029 |
+
interactive=False,
|
1030 |
+
elem_classes=["status-display"],
|
1031 |
+
lines=3
|
1032 |
+
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1033 |
|
1034 |
with gr.Column(scale=1):
|
1035 |
with gr.Group():
|
|
|
1036 |
output_text = gr.Textbox(
|
1037 |
+
label="🧙 Predicted Count",
|
1038 |
value="",
|
1039 |
interactive=False,
|
1040 |
info="Total number of people detected",
|
|
|
1045 |
with gr.Row():
|
1046 |
with gr.Column(scale=1):
|
1047 |
with gr.Group():
|
|
|
1048 |
input_img = gr.Image(
|
1049 |
+
label="📸 Upload Image",
|
1050 |
sources=["upload", "clipboard"],
|
1051 |
type="pil",
|
1052 |
height=400
|
|
|
1059 |
|
1060 |
with gr.Column(scale=1):
|
1061 |
with gr.Group():
|
|
|
1062 |
output_den_map = gr.Image(
|
1063 |
label="🎯 Predicted Density Map",
|
1064 |
type="pil",
|
|
|
1067 |
|
1068 |
with gr.Column(scale=1):
|
1069 |
with gr.Group():
|
|
|
1070 |
output_lambda_map = gr.Image(
|
1071 |
label="📈 Lambda Map",
|
1072 |
type="pil",
|