|
import gradio as gr |
|
import base64 |
|
|
|
|
|
def file_to_data_uri(filepath, mime_type="application/pdf"): |
|
with open(filepath, "rb") as f: |
|
data = f.read() |
|
b64 = base64.b64encode(data).decode("utf-8") |
|
return f"data:{mime_type};base64,{b64}" |
|
|
|
def toggle_resume(is_visible): |
|
new_state = not is_visible |
|
new_label = "Hide Resume" if new_state else "View Resume" |
|
return new_state, gr.update(visible=new_state), gr.update(value=new_label) |
|
|
|
|
|
portfolio_css = """ |
|
/* Import Google font */ |
|
@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;600;700&display=swap'); |
|
|
|
body { |
|
font-family: 'Poppins', sans-serif; |
|
background: linear-gradient(to bottom right, #141414, #000); |
|
margin: 0; |
|
padding: 0; |
|
} |
|
.gr-container { |
|
max-width: 1200px; |
|
margin: 0 auto; |
|
padding: 20px; |
|
} |
|
|
|
/* Landing Section */ |
|
.landing-section { |
|
text-align: center; |
|
margin-bottom: 40px; |
|
} |
|
.landing-section h1, .landing-section h2 { |
|
color: #ffffff !important; |
|
margin-top: 0; |
|
} |
|
.landing-section h1 { |
|
font-size: 2.8rem; |
|
font-weight: 700; |
|
margin-bottom: 0.5rem; |
|
} |
|
.landing-section h2 { |
|
font-size: 2rem; |
|
font-weight: 600; |
|
margin-bottom: 1rem; |
|
} |
|
|
|
/* Typewriter effect */ |
|
.typing-animation { |
|
display: inline-block; |
|
overflow: hidden; |
|
white-space: nowrap; |
|
border-right: 2px solid #ffffff; |
|
font-size: 2.8rem; |
|
font-weight: 700; |
|
width: 29ch; |
|
animation: typing 4s steps(29, end) infinite alternate, blink-caret 0.75s step-end infinite; |
|
} |
|
@keyframes typing { from { width: 0ch; } to { width: 29ch; } } |
|
@keyframes blink-caret { 50% { border-color: transparent; } } |
|
|
|
/* Global text styling */ |
|
p, li, span { |
|
color: #e8e8e8; |
|
font-size: 1.2rem; |
|
} |
|
strong { |
|
background-color: #ffffff; |
|
color: #000; |
|
padding: 0.2rem 0.3rem; |
|
border-radius: 3px; |
|
font-weight: bold; |
|
} |
|
|
|
/* Card styling */ |
|
.card-container { |
|
margin-bottom: 20px; |
|
transition: transform 0.3s ease, box-shadow 0.3s ease; |
|
text-align: center; |
|
} |
|
.card-container:hover { |
|
transform: translateY(-8px); |
|
box-shadow: 0 8px 16px rgba(0,0,0,0.5); |
|
} |
|
.clickable-card { cursor: pointer; } |
|
.card-content { |
|
border-radius: 15px; |
|
padding: 30px; |
|
height: 150px; |
|
display: flex; |
|
align-items: center; |
|
justify-content: center; |
|
font-size: 24px; |
|
color: white; |
|
box-shadow: 0 4px 8px rgba(0,0,0,0.3); |
|
margin-bottom: 10px; |
|
font-weight: 600; |
|
} |
|
/* Card gradients */ |
|
.card-da { background: linear-gradient(135deg, #6a11cb, #2575fc); } |
|
.card-ml { background: linear-gradient(135deg, #00c6ff, #0072ff); } |
|
.card-cv { background: linear-gradient(135deg, #f857a6, #ff5858); } |
|
|
|
/* Section headings */ |
|
.da-section h1.section-heading { color: #6a11cb; } |
|
.ml-section h1.section-heading { color: #0072ff; } |
|
.cv-section h1.section-heading { color: #f857a6; } |
|
|
|
/* Back buttons */ |
|
.back-button { |
|
border: none; |
|
border-radius: 20px; |
|
padding: 6px 16px; |
|
font-size: 0.85rem; |
|
font-weight: 600; |
|
cursor: pointer; |
|
transition: transform 0.2s ease, box-shadow 0.2s ease; |
|
margin-bottom: 20px; |
|
} |
|
.back-button:hover { |
|
transform: translateY(-3px); |
|
box-shadow: 0 4px 6px rgba(0,0,0,0.2); |
|
} |
|
.back-button-da { background-color: #2575fc; color: #fff; } |
|
.back-button-ml { background-color: #0072ff; color: #fff; } |
|
.back-button-cv { background-color: #ff5858; color: #fff; } |
|
""" |
|
|
|
|
|
with gr.Blocks(title="Manyue's Portfolio", css=portfolio_css) as demo: |
|
|
|
with gr.Row(visible=True, elem_classes="landing-section") as landing_section: |
|
with gr.Column(): |
|
gr.HTML(""" |
|
<div class="typing-animation">Welcome to Manyue's Portfolio</div><br> |
|
<h2>About Me</h2> |
|
<p> |
|
Hi, I'm Manyue Javvadi β a software engineer turned AI/ML practitioner with a strong foundation in <strong>Commerce</strong> and extensive experience in <strong>machine learning, computer vision, and data analytics</strong>. |
|
After gaining valuable industry experience at <strong>Cognizant Technology Solutions</strong>, I pursued formal education in <strong>Applied AI</strong> and <strong>Big Data Analytics</strong> in Canada. |
|
I excel at bridging <strong>business logic</strong> with <strong>innovative technical solutions</strong> to create systems that solve real-world challenges. |
|
</p> |
|
<h2>My Specializations</h2> |
|
""") |
|
with gr.Row(): |
|
with gr.Column(): |
|
da_card = gr.HTML(""" |
|
<div class="card-container clickable-card" onclick="document.getElementById('da_hidden').click()"> |
|
<div class="card-content card-da"><span>Data Analytics</span></div> |
|
<p style="font-weight: bold;">Data storytelling, business analysis, and visualization</p> |
|
</div> |
|
""") |
|
da_hidden = gr.Button("", visible=False, elem_id="da_hidden") |
|
with gr.Column(): |
|
ml_card = gr.HTML(""" |
|
<div class="card-container clickable-card" onclick="document.getElementById('ml_hidden').click()"> |
|
<div class="card-content card-ml"><span>Machine Learning</span></div> |
|
<p style="font-weight: bold;">Applied ML for impactful decision-making and automation</p> |
|
</div> |
|
""") |
|
ml_hidden = gr.Button("", visible=False, elem_id="ml_hidden") |
|
with gr.Column(): |
|
cv_card = gr.HTML(""" |
|
<div class="card-container clickable-card" onclick="document.getElementById('cv_hidden').click()"> |
|
<div class="card-content card-cv"><span>Computer Vision</span></div> |
|
<p style="font-weight: bold;">Real-time object detection and accessibility solutions</p> |
|
</div> |
|
""") |
|
cv_hidden = gr.Button("", visible=False, elem_id="cv_hidden") |
|
|
|
|
|
with gr.Column(visible=False, elem_classes="da-section") as da_section: |
|
gr.Markdown("<h1 class='section-heading' style='margin-bottom: 20px;'>Data Analytics</h1>") |
|
with gr.Tabs(): |
|
with gr.TabItem("Resume"): |
|
gr.Markdown("### Professional Summary") |
|
gr.Markdown(""" |
|
**Professional Summary** |
|
Detail-oriented Data Analyst with a strategic business mindset and robust technical skills in data manipulation, visualization, and predictive modeling. I transform raw data into clear insights that empower decision-makers. |
|
""") |
|
gr.Markdown("### Intro Video") |
|
gr.Video(value="data/DA_Intro.mp4", label="Data Analytics Intro Video", autoplay=False) |
|
gr.Markdown("### Resume Document Preview") |
|
da_resume_state = gr.State(value=False) |
|
with gr.Group(visible=False) as da_resume_container: |
|
da_pdf = file_to_data_uri("data/DA_Resume.pdf") |
|
gr.HTML(f"""<iframe src="{da_pdf}" width="100%" height="600px" style="border:none;"></iframe>""") |
|
da_toggle_btn = gr.Button("View Resume") |
|
da_toggle_btn.click(fn=toggle_resume, inputs=[da_resume_state], outputs=[da_resume_state, da_resume_container, da_toggle_btn]) |
|
with gr.TabItem("Skills"): |
|
gr.Markdown("### Core Skills") |
|
gr.Markdown(""" |
|
- **Data Wrangling & Analysis:** Expert in SQL and Python (Pandas, NumPy) for efficient data cleaning and transformation. |
|
- **Exploratory Data Analysis:** Skilled in using Tableau, Matplotlib, and Seaborn to extract and visualize insights. |
|
- **Predictive Modeling:** Proficient in statistical modeling and forecasting to drive informed decision-making. |
|
""") |
|
with gr.TabItem("Projects"): |
|
gr.Markdown("### Selected Projects") |
|
gr.Markdown(""" |
|
**LoanTap: Loan Eligibility Prediction** |
|
Leveraged logistic regression and EDA to identify key factors influencing loan approvals. |
|
|
|
**Educational Data Insights** |
|
Conducted deep statistical analysis to reveal trends in student performance. |
|
|
|
**Upcoming β Jamboree Admission Insights** |
|
An initiative to predict graduate admissions using advanced data techniques. |
|
""") |
|
back_da = gr.Button("β Home", elem_classes=["back-button", "back-button-da"]) |
|
|
|
|
|
with gr.Column(visible=False, elem_classes="ml-section") as ml_section: |
|
gr.Markdown("<h1 class='section-heading' style='margin-bottom: 20px;'>Machine Learning</h1>") |
|
with gr.Tabs(): |
|
with gr.TabItem("Resume"): |
|
gr.Markdown("### Professional Summary") |
|
gr.Markdown(""" |
|
**Professional Summary** |
|
Passionate Machine Learning Engineer skilled in designing and deploying end-to-end ML solutions. I combine technical rigor with strategic insight to develop models that drive innovation and operational efficiency. |
|
""") |
|
gr.Markdown("### Intro Video") |
|
gr.Markdown("_Intro video is coming soon._") |
|
gr.Markdown("### Resume Document Preview") |
|
ml_resume_state = gr.State(value=False) |
|
with gr.Group(visible=False) as ml_resume_container: |
|
ml_pdf = file_to_data_uri("data/ML_CV_Resume.pdf") |
|
gr.HTML(f"""<iframe src="{ml_pdf}" width="100%" height="600px" style="border:none;"></iframe>""") |
|
ml_toggle_btn = gr.Button("View Resume") |
|
ml_toggle_btn.click(fn=toggle_resume, inputs=[ml_resume_state], outputs=[ml_resume_state, ml_resume_container, ml_toggle_btn]) |
|
with gr.TabItem("Skills"): |
|
gr.Markdown("### Core Skills") |
|
gr.Markdown(""" |
|
- **ML Algorithms:** Deep understanding of regression, classification, clustering, and neural networks. |
|
- **Frameworks & Libraries:** Proficient with scikit-learn, TensorFlow, and XGBoost. |
|
- **Model Deployment:** Experienced in deploying models with Gradio and Streamlit. |
|
- **Data Engineering:** Skilled in feature engineering and data preprocessing for optimal model performance. |
|
""") |
|
with gr.TabItem("Projects"): |
|
gr.Markdown("### Selected Projects") |
|
gr.Markdown(""" |
|
**University Admission Predictor** |
|
Applied linear regression to forecast admission chances based on academic and test performance. |
|
|
|
[AI Chat Assistant](https://huggingface.co/spaces/Manyue-DataScientist/AI-Assistant) |
|
Built as a demonstration of a practical AI application, this assistant revolutionizes how recruiters and hiring managers interact with my |
|
portfolio. Unlike traditional chatbots, itβs designed with a unique optimization approach that prioritizes efficiency and accuracy. |
|
|
|
[Speaker Diarization Application](https://huggingface.co/spaces/Manyue-DataScientist/speaker-diarization-app-v2) |
|
Developed an advanced multi-speaker audio processing system that performs speaker diarization, transcription, and summarization to |
|
extract meaningful insights from multi-speaker conversations. |
|
""") |
|
back_ml = gr.Button("β Home", elem_classes=["back-button", "back-button-ml"]) |
|
|
|
|
|
with gr.Column(visible=False, elem_classes="cv-section") as cv_section: |
|
gr.Markdown("<h1 class='section-heading' style='margin-bottom: 20px;'>Computer Vision</h1>") |
|
with gr.Tabs(): |
|
with gr.TabItem("Resume"): |
|
gr.Markdown("### Professional Summary") |
|
gr.Markdown(""" |
|
**Professional Summary** |
|
Innovative Computer Vision Engineer dedicated to crafting real-time, scalable vision solutions. I focus on building systems that improve accessibility and automate complex visual tasks. |
|
""") |
|
gr.Markdown("### Intro Video") |
|
gr.Markdown("_Intro video is coming soon._") |
|
gr.Markdown("### Resume Document Preview") |
|
cv_resume_state = gr.State(value=False) |
|
with gr.Group(visible=False) as cv_resume_container: |
|
cv_pdf = file_to_data_uri("data/ML_CV_Resume.pdf") |
|
gr.HTML(f"""<iframe src="{cv_pdf}" width="100%" height="600px" style="border:none;"></iframe>""") |
|
cv_toggle_btn = gr.Button("View Resume") |
|
cv_toggle_btn.click(fn=toggle_resume, inputs=[cv_resume_state], outputs=[cv_resume_state, cv_resume_container, cv_toggle_btn]) |
|
with gr.TabItem("Skills"): |
|
gr.Markdown("### Core Skills") |
|
gr.Markdown(""" |
|
- **Vision Algorithms:** Proficient in CNNs, YOLO, and segmentation for robust object detection. |
|
- **Technical Tools:** Expert in OpenCV, PyTorch, and TensorFlow for advanced image processing. |
|
- **Image Analysis:** Skilled in image enhancement, filtering, and OCR integration. |
|
- **Deep Learning:** Experienced with transfer learning and model fine-tuning for custom vision tasks. |
|
""") |
|
with gr.TabItem("Projects"): |
|
gr.Markdown("### Selected Projects") |
|
gr.Markdown(""" |
|
**Smart Shopping Assistant** |
|
An accessibility tool combining real-time object detection and OCR to guide visually impaired users in retail settings. |
|
|
|
**Traffic Flow Counter (Upcoming)** |
|
An edge solution using Raspberry Pi to monitor and count vehicles at intersections. |
|
|
|
**Experimental Object Datasets** |
|
Initiatives focused on training custom YOLO models to improve detection in complex environments. |
|
""") |
|
back_cv = gr.Button("β Home", elem_classes=["back-button", "back-button-cv"]) |
|
|
|
|
|
def switch_to_da(): |
|
return (gr.update(visible=False), gr.update(visible=True), gr.update(visible=False), gr.update(visible=False)) |
|
def switch_to_ml(): |
|
return (gr.update(visible=False), gr.update(visible=False), gr.update(visible=(True)), gr.update(visible=(False))) |
|
def switch_to_cv(): |
|
return (gr.update(visible=False), gr.update(visible=False), gr.update(visible=(False)), gr.update(visible=(True))) |
|
def back_to_main(): |
|
return (gr.update(visible=True), gr.update(visible=(False)), gr.update(visible=(False)), gr.update(visible=(False))) |
|
|
|
|
|
da_hidden.click(fn=switch_to_da, outputs=[landing_section, da_section, ml_section, cv_section]) |
|
ml_hidden.click(fn=switch_to_ml, outputs=[landing_section, da_section, ml_section, cv_section]) |
|
cv_hidden.click(fn=switch_to_cv, outputs=[landing_section, da_section, ml_section, cv_section]) |
|
|
|
|
|
back_da.click(fn=back_to_main, outputs=[landing_section, da_section, ml_section, cv_section]) |
|
back_ml.click(fn=back_to_main, outputs=[landing_section, da_section, ml_section, cv_section]) |
|
back_cv.click(fn=back_to_main, outputs=[landing_section, da_section, ml_section, cv_section]) |
|
|
|
demo.launch() |
|
|