import gradio as gr import matplotlib.pyplot as plt import numpy as np from PIL import Image # Custom CSS custom_css = """ .container { max-width: 900px; margin: auto; padding: 20px; } .gr-header { text-align: center; margin-bottom: 40px; } .gr-header h1 { color: #2a2a2a; font-size: 2.5em; margin-bottom: 10px; } .gr-header p { color: #666; font-size: 1.2em; } .gr-tab-text { font-size: 1.1em; line-height: 1.6; } .gr-button { background-color: #2e7af5 !important; color: white !important; border: none !important; border-radius: 8px !important; padding: 10px 20px !important; transition: all 0.3s ease !important; } .gr-button:hover { background-color: #1c5ed9 !important; transform: translateY(-2px); } .gr-input { border-radius: 8px !important; border: 2px solid #e0e0e0 !important; padding: 12px !important; } .gr-input:focus { border-color: #2e7af5 !important; box-shadow: 0 0 0 2px rgba(46,122,245,0.2) !important; } .gr-box { border-radius: 12px !important; box-shadow: 0 4px 6px rgba(0,0,0,0.1) !important; padding: 20px !important; background: white !important; } """ # Application 1: Image Classification def image_classification(image): if image is None: return "Please upload an image.", None # Get basic image information info = f""" Image Analysis Results: - Size: {image.shape} - Color Space: RGB - Resolution: {image.shape[0]}x{image.shape[1]} pixels """ # Generate thumbnail thumbnail = Image.fromarray(image).copy() thumbnail.thumbnail((200, 200)) return info, thumbnail # Application 2: Text Summary def text_summary(text): if not text: return "Please enter text to summarize." # Analyze basic text information char_count = len(text) word_count = len(text.split()) line_count = len(text.splitlines()) summary = f""" Text Analysis Results: - Character Count: {char_count} - Word Count: {word_count} - Line Count: {line_count} Summary: {text[:200] + '...' if len(text) > 200 else text} """ return summary # Application 3: Data Visualization def visualize_data(x_input, y_input): try: x = [float(i.strip()) for i in x_input.split(',')] y = [float(i.strip()) for i in y_input.split(',')] if len(x) != len(y): return None, "Error: Number of X and Y coordinates must match." fig = plt.figure(figsize=(10, 6)) plt.style.use('seaborn') plt.plot(x, y, 'o-', linewidth=2, markersize=8, color='#2e7af5') plt.title('Data Visualization', fontsize=16, pad=20) plt.xlabel('X Axis', fontsize=12) plt.ylabel('Y Axis', fontsize=12) plt.grid(True, linestyle='--', alpha=0.7) # Improve graph appearance plt.tick_params(axis='both', which='major', labelsize=10) plt.gca().spines['top'].set_visible(False) plt.gca().spines['right'].set_visible(False) return fig, "Graph generated successfully." except ValueError: return None, "Error: Invalid input. Please enter numbers separated by commas." # Build Gradio interface with gr.Blocks(css=custom_css, theme=gr.themes.Soft()) as portfolio: # Header with gr.Column(elem_classes="container"): gr.Markdown( """ # Portfolio Site Welcome to my portfolio site where you can experience various applications I've developed. Try out different applications in each tab. """, elem_classes="gr-header" ) # Tab container with gr.Tabs(): # Image Classification Tab with gr.TabItem("📷 Image Classification", elem_classes="gr-tab"): with gr.Column(elem_classes="gr-box"): gr.Markdown( """ ### Image Classification App Upload an image to analyze its features. Higher quality images will yield more accurate analysis results. """, elem_classes="gr-tab-text" ) with gr.Row(): with gr.Column(): image_input = gr.Image( label="Upload Image", type="numpy", elem_classes="gr-input" ) image_button = gr.Button( "Analyze", elem_classes="gr-button" ) with gr.Column(): image_output = gr.Textbox( label="Analysis Results", elem_classes="gr-input" ) image_thumbnail = gr.Image( label="Thumbnail", elem_classes="gr-input" ) image_button.click( image_classification, inputs=image_input, outputs=[image_output, image_thumbnail] ) # Text Summary Tab with gr.TabItem("📝 Text Summary", elem_classes="gr-tab"): with gr.Column(elem_classes="gr-box"): gr.Markdown( """ ### Text Summary App Enter text to generate a summary and basic statistics. Works with both English and other languages. """, elem_classes="gr-tab-text" ) text_input = gr.Textbox( label="Enter Text", placeholder="Enter the text you want to summarize...", lines=5, elem_classes="gr-input" ) text_button = gr.Button( "Summarize", elem_classes="gr-button" ) text_output = gr.Textbox( label="Summary Results", elem_classes="gr-input" ) text_button.click( text_summary, inputs=text_input, outputs=text_output ) # Data Visualization Tab with gr.TabItem("📊 Data Visualization", elem_classes="gr-tab"): with gr.Column(elem_classes="gr-box"): gr.Markdown( """ ### Data Visualization Tool Enter X and Y coordinates to generate a beautiful graph. Separate numbers with commas. Example: - X coordinates: 1, 2, 3, 4, 5 - Y coordinates: 10, 20, 15, 25, 30 """, elem_classes="gr-tab-text" ) with gr.Row(): x_input = gr.Textbox( label="X Coordinates", placeholder="Example: 1, 2, 3, 4, 5", value="1, 2, 3, 4, 5", elem_classes="gr-input" ) y_input = gr.Textbox( label="Y Coordinates", placeholder="Example: 10, 20, 30, 40, 50", value="10, 20, 30, 40, 50", elem_classes="gr-input" ) plot_button = gr.Button( "Generate Graph", elem_classes="gr-button" ) with gr.Row(): plot_output = gr.Plot(label="Graph") plot_message = gr.Textbox( label="Message", elem_classes="gr-input" ) plot_button.click( visualize_data, inputs=[x_input, y_input], outputs=[plot_output, plot_message] ) # Project Information Tab with gr.TabItem("â„šī¸ Project Information", elem_classes="gr-tab"): with gr.Column(elem_classes="gr-box"): gr.Markdown( """ ### About the Project This portfolio site integrates multiple applications built using Python's powerful Gradio library. #### Features 1. **Image Classification App** đŸ–ŧī¸ - Upload and analyze images - Display basic image information - Thumbnail generation 2. **Text Summary App** 📚 - Basic text statistics - Text summarization - Multi-language support 3. **Data Visualization Tool** 📈 - Interactive graph generation - Beautiful data visualization - Customizable plots #### Tech Stack - Python 3.8+ - Gradio 4.0+ - Matplotlib 3.7+ - NumPy 1.24+ - Pillow 10.0+ #### Source Code The source code for this project is available on [GitHub](https://github.com/yourusername/portfolio) #### Contact For questions or feedback, please reach out: - Email: your.email@example.com - Twitter: @yourusername - LinkedIn: [Your Name](https://linkedin.com/in/yourprofile) """, elem_classes="gr-tab-text" ) # Launch application if __name__ == "__main__": portfolio.launch(share=True)