DEV Community

Akan
Akan

Posted on

Deploying an Image Segmentation web application with YOLOv8 and Streamlit - pt1

Segmented Pieces

We are going to create an object detecting web app, our goal is to to segment any image, note the distribution of the unique items in it, implement a slider view and ultimately deploy this on a web-application anyone can use.

First, let us have a basic understanding of the two building components, YOLOv8 is the newest state-of-the-art model developed by Ultralytics, that can be used for object detection, image classification, and instance segmentation tasks. YOLOv8 is designed to be fast, accurate, and easy to use,
Streamlit is a free and open-source framework to rapidly build and share beautiful machine learning and data science web apps.

Let's start by creating a virtual environment from your IDE terminal.
# pip install virtualenv
python -m venv [VIRTUALENVIRONMENTNAME]

pip install opencv streamlit-image-comparison pandas ultralytics streamlit

Or do this with conda
conda create -n [VIRTUALENVIRONMENTNAME] python=3.x opencv streamlit-image-comparison pandas ultralytics streamlit
source activate [VIRTUALENVIRONMENTNAME] ##Activate
and installing the requisite packages: opencv, streamlit-image-comparison, pandas, ultralytics, streamlit

Next, import the already tuned yolov8.pt model and introduce the streamlit with this code in your python script:

from ultralytics import YOLO
import streamlit as st

# Downloads the model
model = YOLO('yolov8n.pt')
## Placed image in the same directory
img_file = 'bus.jpg' 
Enter fullscreen mode Exit fullscreen mode

Then write a for-loop that goes through the image results and display each segment and predicted name.

## Run Model on image
results = model(img_file)  
img = cv2.imread(img_file) 

## Initiate Name bucket
names_list = [] 

## Handling the individual components in the results
for result in results:
    boxes = result.boxes.cpu().numpy()
    numCols = len(boxes)
    cols = st.columns(numCols) ## Dynamic Column Names
    ## Annotating the individual boxes
    for box in boxes:
        r = box.xyxy[0].astype(int)
        rect = cv2.rectangle(img, r[:2], r[2:], (255, 55, 255), 2)

    ## Use a slider to compare the various components
    st.markdown('')
    st.markdown('##### Slider of Uploaded Image and Segments')
    image_comparison(
        img1=img_file,
        img2=img,
        label1="Actual Image",
        label2="Segmented Image",
        width=700,
        starting_position=50,
        show_labels=True,
        make_responsive=True,
        in_memory=True
    )

    ## Add Slider to compare result and placed image
    st.markdown('##### Slider of Uploaded Image and Segments')
        image_comparison(
           img1=img_file,
           img2=img,
           label1="Actual Image",
           label2="Segmented Image",
           width=700,
           starting_position=50,
           show_labels=True,
           make_responsive=True,
           in_memory=True
       )

    ## Enumerate the individual result
    for i, box in enumerate(boxes):
        r = box.xyxy[0].astype(int)
        crop = img[r[1]:r[3], r[0]:r[2]] ## crop image 
        ## retrieve the predicted name
        predicted_name = result.names[int(box.cls[0])] 
        names_list.append(predicted_name)
        with cols[i]:
            ## Display the predicted name
            st.write(str(predicted_name) + ".jpg")
            st.image(crop)
Enter fullscreen mode Exit fullscreen mode

Image Slider

Now, let's get the distribution of the items in a dataframe.

st.sidebar.markdown('#### Distribution of identified items')

df_x = pd.DataFrame(names_list)
summary_table = df_x[0].value_counts().rename_axis('unique_values').reset_index(name='counts')
st.sidebar.dataframe(summary_table)
Enter fullscreen mode Exit fullscreen mode

Image item counter

With that done, it's time to launch this in your local browser with streamlit run [NAMEOFAPP].py in the terminal, then we move to actually deploying/sharing this site.

Create a requirements.txt with all the libraries you imported, it will look like this:

opencv-python-headless==4.7.0.72
streamlit-image-comparison==0.0.4
pandas==2.0.2
ultralytics==8.0.119
streamlit==1.23.1
Enter fullscreen mode Exit fullscreen mode

and packages.txt file with this single line:

ffmpeg
Enter fullscreen mode Exit fullscreen mode

Initiate Git Bash in the folder directory by running the following commands:

  • git init
  • git add .
  • git commit -m "my first image segmentation app"

Go to your GitHub and create a repository where the project files would be hosted, push your local files there.

Once this has been done, simply toggle the bar on the top Right side of your local streamlit app and "Deploy App", it then takes us to the form section of deployment - enter the correct details, give the app a nice name and sweet - Deploy!

Toggle Bar for Deployment

Which brings you to this page:

Web Deployment Form

If everything goes well, you should land on something like this, however, if you experience any issues, do not hesitate to share your comments or check out this repository to compare codes.

Top comments (1)

Collapse
 
chih3b profile image
chiheb nouri

Can we do realtime detection and deploy to the web?