Vahe's picture
versionJan2024
5482479
raw
history blame
4.34 kB
import streamlit as st
import cv2
import numpy as np
from PIL import Image
import imutils
import easyocr
import os
import pathlib
import platform
from xyxy_converter import yolov5_to_image_coordinates
import shutil
system_platform = platform.system()
if system_platform == 'Windows': pathlib.PosixPath = pathlib.WindowsPath
CUR_DIR = os.getcwd()
YOLO_PATH = f"{CUR_DIR}/yolov5"
MODEL_PATH = "runs/train/exp/weights/best.pt"
def main():
st.title("Odometer value extractor with Streamlit")
# Use st.camera to capture images from the user's camera
img_file_buffer = st.camera_input(label='Please, take a photo of odometer', key="odometer")
# Check if an image is captured
if img_file_buffer is not None:
# Convert the image to a NumPy array
image = Image.open(img_file_buffer)
image_np = np.array(image)
resized_image = cv2.resize(image_np, (640, 640))
resized_image = resized_image.astype(np.uint8)
cv2.imwrite('odometer_image.jpg', resized_image)
# detect(
# weights='yolov5\runs\train\exp\weights\best.pt',
# source='odometer_image.jpg',
# img=640,
# conf=0.4,
# name='temp_exp',
# hide_labels=True,
# hide_conf=True,
# save_txt=True,
# exist_ok=True
# )
# os.system('wandb disabled')
os.chdir(YOLO_PATH)
# try:
# shutil.rmtree('runs/detect/temp_exp')
# except:
# pass
image_path = "../odometer_image.jpg"
# command = f"python detect.py --weights {MODEL_PATH} --source {image_path} --img 640 --conf 0.4 --name 'temp_exp' --hide-labels --hide-conf --save-txt --exist-ok"
command = f'''
python detect.py \
--weights {MODEL_PATH} \
--source {image_path} \
--img 640 \
--conf 0.4 \
--name temp_exp \
--hide-labels \
--hide-conf \
--save-txt \
--exist-ok \
--save-conf
'''
# Run the command
os.system(command)
# st.write('The detection is completed!!!')
os.chdir(CUR_DIR)
# st.write(os.path.exists('yolov5/runs/detect/temp_exp'))
if os.path.exists('yolov5/runs/detect/temp_exp'):
processed_image = cv2.imread('yolov5/runs/detect/temp_exp/odometer_image.jpg')
# st.write('Image boxed and loaded')
text_files = os.listdir('yolov5/runs/detect/temp_exp/labels')
original_img = cv2.imread('odometer_image.jpg')
gray = cv2.cvtColor(original_img, cv2.COLOR_BGR2GRAY)
if len(text_files) == 0:
display_text = "An odometer is not detected in the image!!!"
else:
text_file_path = f'yolov5/runs/detect/temp_exp/labels/{text_files[0]}'
x1, y1, x2, y2 = yolov5_to_image_coordinates(text_file_path)
# st.write(x1, y1, x2, y2)
cropped_image = gray[x1:x2, y1:y2]
reader = easyocr.Reader(['en'])
result = reader.readtext(cropped_image)
if len(result) != 0:
odometer_value = sorted(result, key=lambda x: x[2], reverse=True)[0][1]
display_text = f"Odometer value: {odometer_value}"
else:
odometer_value = 'not detected'
display_text = f"The odometer value is {odometer_value}!!!"
else:
display_text = "An odometer is not detected in the image!!!"
processed_image = cv2.imread('odometer_image.jpg')
try:
shutil.rmtree('odometer_image.jpg')
shutil.rmtree('runs/detect/temp_exp')
except:
pass
# Resize or preprocess the image as needed for your model
# For example, resizing to a specific input size
# processed_image = cv2.resize(image_np, (224, 224))
# Process the image using your deep learning model
# processed_image = process_image(image_np)
# Display the processed image
st.image(processed_image, caption=f"{display_text}", use_column_width=True)
st.session_state.pop("odometer")
if __name__ == "__main__":
main()