import streamlit as st import utils import cv2 import numpy as np import io import tempfile from PIL import Image import moviepy.editor as mpy from camera_input_live import camera_input_live st.set_page_config( page_title="글자 인식 AI 시스템", page_icon=":sun_with_face:", layout="centered", initial_sidebar_state="expanded",) st.title("글자 인식 AI 시스템 :sun_with_face:") st.sidebar.header("메뉴") source_radio = st.sidebar.radio("선택하세요", ["IMAGE", "VIDEO", "WEBCAM"]) st.sidebar.header("신뢰도") conf_threshold = float(st.sidebar.slider("신뢰도 임계값을 선택하세요", 10, 100, 20))/100 input = None if source_radio == "IMAGE": st.sidebar.header("이미지 파일 업로드") input = st.sidebar.file_uploader("이미지 파일을 선택하세요.", type=("jpg", "png")) if input is not None: uploaded_image = Image.open(input) uploaded_image_cv = cv2.cvtColor(np.array(uploaded_image), cv2.COLOR_RGB2BGR) boxes, resized_image = utils.predict_image(uploaded_image_cv, conf_threshold = conf_threshold) result_image = utils.convert_result_to_image(uploaded_image_cv, resized_image, boxes, conf_labels=False) st.image(result_image, channels = "RGB") st.markdown(f"

이미지에서 AI 추론을 실행한 결과 입니다.

", unsafe_allow_html=True) else: st.write("왼쪽 메뉴 'Browse files' 버튼을 클릭하여 이미지 파일을 선택하면 AI 추론이 시작됩니다." ) st.image("data/intel_rnb.jpg") def play_video(video_source): camera = cv2.VideoCapture(video_source) fps = camera.get(cv2.CAP_PROP_FPS) temp_file_2 = tempfile.NamedTemporaryFile(delete=False,suffix='.mp4') video_row=[] # frame total_frames = int(camera.get(cv2.CAP_PROP_FRAME_COUNT)) progress_bar = st.progress(0) frame_count = 0 st_frame = st.empty() while(camera.isOpened()): ret, frame = camera.read() if ret: try: boxes, resized_image = utils.predict_image(frame, conf_threshold) visualized_image = utils.convert_result_to_image(frame, resized_image, boxes, conf_labels=False) except: visualized_image = frame st_frame.image(visualized_image, channels = "BGR") video_row.append(cv2.cvtColor(visualized_image,cv2.COLOR_BGR2RGB)) frame_count +=1 progress_bar.progress(frame_count/total_frames, text=None) else: progress_bar.empty() camera.release() st_frame.empty() break clip = mpy.ImageSequenceClip(video_row, fps = fps) clip.write_videofile(temp_file_2.name) st.video(temp_file_2.name) # 파일 업로드 처리 temporary_location = None if source_radio == "VIDEO": st.sidebar.header("비디오 파일 업로드") input_file = st.sidebar.file_uploader("비디오 파일을 선택하세요.", type=("mp4")) if input_file is not None: # 파일을 임시 경로에 저장 g = io.BytesIO(input_file.read()) temporary_location = "upload.mp4" with open(temporary_location, "wb") as out: out.write(g.read()) out.close() # 업로드된 비디오 파일이 있는 경우 비디오 재생 if temporary_location is not None: play_video(temporary_location) else: st.write("왼쪽 메뉴 'Browse files' 버튼을 클릭하여 영상 파일을 선택하면 AI 추론이 시작됩니다.") st.video("data/sample_video.mp4") if source_radio == "WEBCAM": input = camera_input_live() uploaded_image = Image.open(input) uploaded_image_cv = cv2.cvtColor(np.array(uploaded_image), cv2.COLOR_RGB2BGR) boxes, resized_image = utils.predict_image(uploaded_image_cv, conf_threshold) visualized_image = utils.convert_result_to_image(uploaded_image_cv, resized_image, boxes, conf_labels=False) st.image(visualized_image, channels = "RGB")