2 분 소요


강아지 품종 분류 AI 웹페이지

% pip install opencv-python
# Loading the libraries
from distutils.command.install_egg_info import to_filename
import numpy as np
import streamlit as st
import cv2 # *opencv
import tensorflow as tf
from tensorflow import keras

상기 라이브러리 중에 눈에 띄는 것이 있다; cv2

cv2 라이브러리는 opencv 패키지를 설치해서 불러올 수 있다.

*OpenCV(Open Source Computer Vision)는 다양한 영상/동영상 처리에 사용할 수 있는 실시간 처리에 능한 오픈소스 라이브러리이다.

실시간 웹서버와 같은 환경에서 활용성이 좋다!

자, 이제 여러 장의 서로 다른 강아지 품종 이미지를 학습한 사전 학습 모델 ‘dog_breed.h5’를 전이학습을 위해 불러오자.

해당 사전모델 요청 시 제공.

model = keras.models.load_model("dog_breed.h5")

불러온 사전학습 모델은 다음과 같이 세 가지 강아지 품종의 클래스로 최종 출력을 도출한다.

만약, 더 완성도 높은 분류 모델을 형성하고 싶다면 fine-tuning 작업을 통해 모델 개선 혹은 ImageNet을 사전모델로 채택하는 선택지를 취할 수 있을 것이다.

CLASS_NAMES = ['Scottish Deerhound','Maltese Dog','Bernese Mountain Dog']

상기 세 가지 강아지 품종 중에서 그나마 가장 유사한 종으로 인풋 이미지를 분류한다.

자, 이제 이전 시간에 배웠던 웹 페이지를 디자인할 시간이다.

st.title("업로드한 개의 품종를 알아보자!") # title
st.markdown("개 이미지를 업로드 해주세요!")
st.markdown("---") # division

# file uploader
dog_image = st.file_uploader(
    label = "이미지를 선택해주세요...", 
    type = ["jpg", "png"]
)
submit = st.button("예측해주세요!") # button object
# button event handler
if submit:
    if dog_image is not None:
        # opencv의 imdecode 인자로 사용하기 위해 byte로 변환한다
        file_bytes = np.asarray(
            bytearray(dog_image.read()), 
            dtype=np.uint8
    )
    opencv_image = cv2.imdecode(file_bytes, 1) # save the input image

    st.image(opencv_image, channels = "BGR") # opencv는 RGB가 아닌 BGR로 포맷을 저장한다

    # adjusting the size
    opencv_image = cv2.resize(opencv_image, (224, 224))
    opencv_image.shape = (1, 224, 224, 3)

    Y_pred = model.predict(opencv_image) # fine-tuned model 예측 수행

    # st.write(np.argmax(Y_pred))
    st.title(str("판단한 개의 품종은 " + CLASS_NAMES[np.argmax(Y_pred)]))

image


Dataframe 분석하기

import streamlit as st
import pandas as pd
import numpy as np

import matplotlib.pyplot as plt
import seaborn as sns

어떠한 dataset을 df 객체에 저장했다고 가정하자.

data_types = df.dtypes
cat_cols = tuple(data_types[data_types == "object"].index) # 범주형 컬럼 저장
# container
with st.container():
    st.write("컨테이너")
    value_counts = df["Sex"].value_counts()
    st.write(value_counts.index)
    col1, col2 = st.columns(2)

    with col1:
        # 남녀 성비 분포 (Pie)
        st.subheader("서브 컬럼 1")
        fig, ax = plt.subplots()
        ax.pie(value_counts, autopct="%0.2f%%", labels = ["Male", "Female"]) # 원형으로 성비 표현
        st.pyplot(fig)

    with col2:
        # 남녀 성비 분포 (Bar)
        st.subheader("서브 컬럼 2")
        fig, ax = plt.subplots()
        ax.bar(value_counts.index, value_counts) # bar로 성비 표현
        st.pyplot(fig)

    with st.expander("Results of Sex Ratio"):
        st.dataframe(value_counts)

image

당신은 웹페이지 내에서 다른 plot 유형을 선택해서 데이터 분포를 확인하고 싶을지도 모른다.

상기 목표 역시 아래처럼 손쉽게 구현 가능하다.

# 다른 plot 유형 선택
with st.container():
    st.write("asdfasdfasdf")

    chart = ("box", "violin", "kdeplot", "histogram")
    chart_selection = st.selectbox("asefaefa", chart)
    fig, ax = plt.subplots()

    if chart_selection == "box":
        sns.boxplot(x = "Sex", y="Fare", data=df, ax = ax)
    elif chart_selection == "violin":
        sns.violinplot(x = "Sex", y="Fare", data=df, ax = ax)
    elif chart_selection == "kdeplot":
        sns.kdeplot(x = df["Fare"], hue=df["Sex"], ax = ax, shade=True)
    else :
        sns.histplot(x = "Fare", hue="Sex", data=df, ax = ax)

    st.pyplot(fig)

image

댓글남기기