File size: 3,513 Bytes
5823599
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
import streamlit as st
from crowd_counter import CrowdCounter
from PIL import Image
import cv2
import numpy as np

# Initialize the crowd counter engine
crowd_counter_engine = CrowdCounter()

# Function to predict crowd count and generate prediction image
def predict(input_image):
    input_image = Image.fromarray(input_image.astype('uint8'), 'RGB')
    response = crowd_counter_engine.inference(input_image)
    crowd_count, pred_img = response
    pred_img_rgb = cv2.cvtColor(pred_img, cv2.COLOR_BGR2RGB)
    return pred_img_rgb, crowd_count

# Streamlit UI layout
st.markdown("<h1 style='text-align: center; margin-bottom: 0.5rem;'>Crowd Counter Demo</h1>", unsafe_allow_html=True)
st.markdown("<h3 style='text-align: center; margin-bottom: 1rem;'>A Demo of Proposal Point Prediction for Crowd Counting</h3>", unsafe_allow_html=True)

# Radio button to choose between example images and uploading an image
option = st.radio('Choose an image source:', ('Use Example Image', 'Upload Your Own Image'))

# Example images
example_images = {
    "Example 1": "images/img-1.jpg",
    "Example 2": "images/img-2.jpg",
    "Example 3": "images/img-3.jpg",
}

# Handling the selection
if option == 'Use Example Image':
    # Select box for example images
    example_selection = st.selectbox('Choose an example image:', list(example_images.keys()))

    if example_selection:
        example_image_path = example_images[example_selection]
        example_image = Image.open(example_image_path)
        st.image(example_image, caption='Selected Example Image', use_column_width=True)

        # Convert the PIL Image to an array for processing
        example_image_array = np.array(example_image)

        with st.spinner("Thinking..."):
            # Predict the crowd count and proposal points for the example image
            pred_img, crowd_count = predict(example_image_array)

        # Display the prediction results
        st.success(f"Predicted Count: {crowd_count}")
        st.image(pred_img, caption='Proposal Points Prediction', use_column_width=True)
        

else:  # 'Upload Your Own Image' is selected
    uploaded_file = st.file_uploader("Or upload an image:", type=['jpg', 'jpeg', 'png'])

    if uploaded_file is not None:
        file_bytes = np.asarray(bytearray(uploaded_file.read()), dtype=np.uint8)
        user_img = cv2.imdecode(file_bytes, 1)

        st.image(user_img, caption='Uploaded Image', use_column_width=True)

        with st.spinner("Thinking..."):
            # Predict the crowd count and proposal points for the uploaded image
            pred_img, crowd_count = predict(user_img)

        # Display the prediction results
        st.success(f"Predicted Count: {crowd_count}")
        st.image(pred_img, caption='Proposal Points Prediction', use_column_width=True)
        
st.markdown('---')
footer = """

        <style>

        .footer {

            font-family: Arial, sans-serif;

            font-size: small;

            text-align: center;

            padding: 10px;

            margin-top: 20px;

        }

        </style>

        <div class="footer">

            &copy; 2023 <a href="https://www.ristek.cs.ui.ac.id/" target="_blank">RISTEK Fasilkom UI</a> <br>All rights reserved<br>

            Powered by <a href="https://github.com/TencentYoutuResearch/CrowdCounting-P2PNet/" target="_blank">P2PNet</a>

        </div>

        """

st.markdown(footer, unsafe_allow_html=True)