|
import os |
|
import pandas as pd |
|
import numpy as np |
|
import easyocr |
|
import streamlit as st |
|
from annotated_text import annotated_text |
|
from streamlit_option_menu import option_menu |
|
from sentiment_analysis import SentimentAnalysis |
|
from keyword_extraction import KeywordExtractor |
|
from part_of_speech_tagging import POSTagging |
|
from emotion_detection import EmotionDetection |
|
from named_entity_recognition import NamedEntityRecognition |
|
from Object_Detector import ObjectDetector |
|
from OCR_Detector import OCRDetector |
|
import PIL |
|
from PIL import Image |
|
from PIL import ImageColor |
|
from PIL import ImageDraw |
|
from PIL import ImageFont |
|
import time |
|
|
|
# Imports de Object Detection |
|
import tensorflow as tf |
|
import tensorflow_hub as hub |
|
# Load compressed models from tensorflow_hub |
|
os.environ['TFHUB_MODEL_LOAD_FORMAT'] = 'COMPRESSED' |
|
import matplotlib.pyplot as plt |
|
import matplotlib as mpl |
|
# For drawing onto the image. |
|
import numpy as np |
|
from tensorflow.python.ops.numpy_ops import np_config |
|
np_config.enable_numpy_behavior() |
|
|
|
import torch |
|
import librosa |
|
from models import infere_speech_emotion, infere_text_emotion, infere_voice2text |
|
|
|
st.set_page_config(layout="wide") |
|
|
|
hide_streamlit_style = """ |
|
<style> |
|
#MainMenu {visibility: hidden;} |
|
footer {visibility: hidden;} |
|
</style> |
|
""" |
|
st.markdown(hide_streamlit_style, unsafe_allow_html=True) |
|
|
|
@st.cache_resource |
|
def load_sentiment_model(): |
|
return SentimentAnalysis() |
|
|
|
@st.cache_resource |
|
def load_keyword_model(): |
|
return KeywordExtractor() |
|
|
|
@st.cache_resource |
|
def load_pos_model(): |
|
return POSTagging() |
|
|
|
@st.cache_resource |
|
def load_emotion_model(): |
|
return EmotionDetection() |
|
|
|
@st.cache_resource |
|
def load_ner_model(): |
|
return NamedEntityRecognition() |
|
|
|
@st.cache_resource |
|
def load_objectdetector_model(): |
|
return ObjectDetector() |
|
|
|
@st.cache_resource |
|
def load_ocrdetector_model(): |
|
return OCRDetector() |
|
|
|
sentiment_analyzer = load_sentiment_model() |
|
keyword_extractor = load_keyword_model() |
|
pos_tagger = load_pos_model() |
|
emotion_detector = load_emotion_model() |
|
ner = load_ner_model() |
|
objectdetector1 = load_objectdetector_model() |
|
ocrdetector1 = load_ocrdetector_model() |
|
|
|
def rectangle(image, result): |
|
draw = ImageDraw.Draw(image) |
|
for res in result: |
|
top_left = tuple(res[0][0]) # top left coordinates as tuple |
|
bottom_right = tuple(res[0][2]) # bottom right coordinates as tuple |
|
draw.rectangle((top_left, bottom_right), outline="blue", width=2) |
|
st.image(image) |
|
|
|
example_text = "My name is Daniel: The attention to detail, swift resolution, and accuracy demonstrated by ITACA Insurance Company in Spain in handling my claim were truly impressive. This undoubtedly reflects their commitment to being a customer-centric insurance provider." |
|
|
|
with st.sidebar: |
|
image = Image.open('./itaca_logo.png') |
|
st.image(image,width=150) #use_column_width=True) |
|
page = option_menu(menu_title='Menu', |
|
menu_icon="robot", |
|
options=["Sentiment Analysis", |
|
"Keyword Extraction", |
|
"Part of Speech Tagging", |
|
"Emotion Detection", |
|
"Named Entity Recognition", |
|
"Speech & Text Emotion", |
|
"Object Detector", |
|
"OCR Detector"], |
|
icons=["chat-dots", |
|
"key", |
|
"tag", |
|
"emoji-heart-eyes", |
|
"building", |
|
"book", |
|
"camera", |
|
"list-task"], |
|
default_index=0 |
|
) |
|
|
|
st.title('ITACA Insurance Core AI Module') |
|
|
|
# Replace '20px' with your desired font size |
|
font_size = '20px' |
|
|
|
if page == "Sentiment Analysis": |
|
st.header('Sentiment Analysis') |
|
# st.markdown("![Alt Text](https://media.giphy.com/media/XIqCQx02E1U9W/giphy.gif)") |
|
st.write( |
|
""" |
|
""" |
|
) |
|
|
|
text = st.text_area("Paste text here", value=example_text) |
|
|
|
if st.button('π₯ Run!'): |
|
with st.spinner("Loading..."): |
|
preds, html = sentiment_analyzer.run(text) |
|
st.success('All done!') |
|
st.write("") |
|
st.subheader("Sentiment Predictions") |
|
st.bar_chart(data=preds, width=0, height=0, use_container_width=True) |
|
st.write("") |
|
st.subheader("Sentiment Justification") |
|
raw_html = html._repr_html_() |
|
st.components.v1.html(raw_html, height=500) |
|
|
|
elif page == "Keyword Extraction": |
|
st.header('Keyword Extraction') |
|
# st.markdown("![Alt Text](https://media.giphy.com/media/xT9C25UNTwfZuk85WP/giphy-downsized-large.gif)") |
|
st.write( |
|
""" |
|
""" |
|
) |
|
|
|
text = st.text_area("Paste text here", value=example_text) |
|
|
|
max_keywords = st.slider('# of Keywords Max Limit', min_value=1, max_value=10, value=5, step=1) |
|
|
|
if st.button('π₯ Run!'): |
|
with st.spinner("Loading..."): |
|
annotation, keywords = keyword_extractor.generate(text, max_keywords) |
|
st.success('All done!') |
|
|
|
if annotation: |
|
st.subheader("Keyword Annotation") |
|
st.write("") |
|
annotated_text(*annotation) |
|
st.text("") |
|
|
|
st.subheader("Extracted Keywords") |
|
st.write("") |
|
df = pd.DataFrame(keywords, columns=['Extracted Keywords']) |
|
csv = df.to_csv(index=False).encode('utf-8') |
|
st.download_button('Download Keywords to CSV', csv, file_name='news_intelligence_keywords.csv') |
|
|
|
data_table = st.table(df) |
|
|
|
elif page == "Part of Speech Tagging": |
|
st.header('Part of Speech Tagging') |
|
# st.markdown("![Alt Text](https://media.giphy.com/media/WoWm8YzFQJg5i/giphy.gif)") |
|
st.write( |
|
""" |
|
""" |
|
) |
|
|
|
text = st.text_area("Paste text here", value=example_text) |
|
|
|
if st.button('π₯ Run!'): |
|
with st.spinner("Loading..."): |
|
preds = pos_tagger.classify(text) |
|
st.success('All done!') |
|
st.write("") |
|
st.subheader("Part of Speech tags") |
|
annotated_text(*preds) |
|
st.write("") |
|
st.components.v1.iframe('https://www.ling.upenn.edu/courses/Fall_2003/ling001/penn_treebank_pos.html', height=1000) |
|
|
|
elif page == "Emotion Detection": |
|
st.header('Emotion Detection') |
|
# st.markdown("![Alt Text](https://media.giphy.com/media/fU8X6ozSszyEw/giphy.gif)") |
|
st.write( |
|
""" |
|
""" |
|
) |
|
|
|
text = st.text_area("Paste text here", value=example_text) |
|
|
|
if st.button('π₯ Run!'): |
|
with st.spinner("Loading..."): |
|
preds, html = emotion_detector.run(text) |
|
st.success('All done!') |
|
st.write("") |
|
st.subheader("Emotion Predictions") |
|
st.bar_chart(data=preds, width=0, height=0, use_container_width=True) |
|
raw_html = html._repr_html_() |
|
st.write("") |
|
st.subheader("Emotion Justification") |
|
st.components.v1.html(raw_html, height=500) |
|
|
|
elif page == "Named Entity Recognition": |
|
st.header('Named Entity Recognition') |
|
# st.markdown("![Alt Text](https://media.giphy.com/media/lxO8wdWdu4tig/giphy.gif)") |
|
st.write( |
|
""" |
|
""" |
|
) |
|
|
|
text = st.text_area("Paste text here", value=example_text) |
|
|
|
if st.button('π₯ Run!'): |
|
with st.spinner("Loading..."): |
|
preds, ner_annotation = ner.classify(text) |
|
st.success('All done!') |
|
st.write("") |
|
st.subheader("NER Predictions") |
|
annotated_text(*ner_annotation) |
|
st.write("") |
|
st.subheader("NER Prediction Metadata") |
|
st.write(preds) |
|
|
|
elif page == "Object Detector": |
|
st.header('Object Detector') |
|
st.write( |
|
""" |
|
""" |
|
) |
|
|
|
img_file_buffer = st.file_uploader("Load an image", type=["png", "jpg", "jpeg"]) |
|
if img_file_buffer is not None: |
|
image = np.array(Image.open(img_file_buffer)) |
|
|
|
if st.button('π₯ Run!'): |
|
with st.spinner("Loading..."): |
|
img, primero = objectdetector1.run_detector(image) |
|
st.success('The first image detected is: ' + primero) |
|
st.image(img, caption="Imagen", use_column_width=True) |
|
|
|
elif page == "OCR Detector": |
|
st.header('OCR Detector') |
|
st.write( |
|
""" |
|
""" |
|
) |
|
|
|
file = st.file_uploader("Load an image", type=["png", "jpg", "jpeg"]) |
|
|
|
#read the csv file and display the dataframe |
|
if file is not None: |
|
image = Image.open(file) # read image with PIL library |
|
|
|
if st.button('π₯ Run!'): |
|
with st.spinner("Loading..."): |
|
result = ocrdetector1.reader.readtext(np.array(image)) # turn image to numpy array |
|
|
|
# collect the results in dictionary: |
|
textdic_easyocr = {} |
|
for idx in range(len(result)): |
|
pred_coor = result[idx][0] |
|
pred_text = result[idx][1] |
|
pred_confidence = result[idx][2] |
|
textdic_easyocr[pred_text] = {} |
|
textdic_easyocr[pred_text]['pred_confidence'] = pred_confidence |
|
|
|
# get boxes on the image |
|
rectangle(image, result) |
|
|
|
# create a dataframe which shows the predicted text and prediction confidence |
|
df = pd.DataFrame.from_dict(textdic_easyocr).T |
|
st.table(df) |
|
elif page == "Speech & Text Emotion": |
|
st.header('Speech & Text Emotion') |
|
st.write( |
|
""" |
|
""" |
|
) |
|
uploaded_file = st.file_uploader("Choose an audio file", type=["mp3", "wav", "ogg"]) |
|
|
|
if uploaded_file is not None: |
|
st.audio(uploaded_file, format='audio/' + uploaded_file.type.split('/')[1]) |
|
st.write("Audio file uploaded and playing.") |
|
|
|
else: |
|
st.write("Please upload an audio file.") |
|
|
|
if st.button("Analysis"): |
|
with st.spinner("Loading..."): |
|
st.header('Results of the Audio & Text analysis:') |
|
samples, sample_rate = librosa.load(uploaded_file, sr=16000) |
|
p_voice2text = infere_voice2text (samples) |
|
p_speechemotion = infere_speech_emotion(samples) |
|
p_textemotion = infere_text_emotion(p_voice2text) |
|
st.subheader("Text from the Audio:") |
|
st.write(p_voice2text) |
|
st.write("---") |
|
st.subheader("Speech emotion:") |
|
st.write(p_speechemotion) |
|
st.write("---") |
|
st.subheader("Text emotion:") |
|
st.write(p_textemotion) |
|
st.write("---") |
|
|
|
|
|
|