Rekham1110 commited on
Commit
0c6d54e
·
verified ·
1 Parent(s): 2d5ddf2

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +104 -96
app.py CHANGED
@@ -1,99 +1,107 @@
1
- import gradio as gr
2
- from PIL import Image
3
- import time
4
- from datetime import datetime
5
- import pytz
6
-
7
- print("Starting application at", datetime.now(pytz.timezone("Asia/Kolkata")).strftime("%Y-%m-%d %H:%M:%S IST"))
8
-
9
- # Simplified mock AI model
10
- def mock_ai_model(image):
11
- print("Processing image in mock_ai_model at", datetime.now(pytz.timezone("Asia/Kolkata")).strftime("%Y-%m-%d %H:%M:%S IST"))
12
- img = image.convert("RGB")
13
- # Basic heuristic: assume interior work for now (adjustable)
14
- milestone = "Interior Work"
15
- percent_complete = 95
16
- confidence_score = 0.92
17
- print(f"Image processed: {milestone}, {percent_complete}%, Confidence: {confidence_score}")
18
- return milestone, percent_complete, confidence_score
19
-
20
- # Image processing function with debugging
21
  def process_image(images, project_name, project_type):
22
- print("Starting process_image at", datetime.now(pytz.timezone("Asia/Kolkata")).strftime("%Y-%m-%d %H:%M:%S IST"))
23
- if not images:
24
- print("No images uploaded")
25
- return "<p style='color: red;'>No images uploaded.</p>", "Pending", "", "", "0%"
26
- if not project_name:
27
- print("No project name provided")
28
- return "<p style='color: red;'>Project Name is required.</p>", "Pending", "", "", "0%"
29
-
30
- results = []
31
- all_percentages = []
32
- all_milestones = set()
33
- max_percent_complete = 0
34
- dominant_milestone = None
35
-
36
- for idx, image_path in enumerate(images):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
37
  try:
38
- print(f"Processing image {idx+1} at", datetime.now(pytz.timezone("Asia/Kolkata")).strftime("%Y-%m-%d %H:%M:%S IST"))
39
- img = Image.open(image_path)
40
- milestone, percent_complete, confidence_score = mock_ai_model(img)
41
- results.append(f"Image {idx+1}: {milestone} - {percent_complete}% completion (Confidence: {confidence_score})")
42
- all_percentages.append(percent_complete)
43
- all_milestones.add(milestone)
44
- if percent_complete > max_percent_complete:
45
- max_percent_complete = percent_complete
46
- dominant_milestone = milestone
47
  except Exception as e:
48
- print(f"Error processing image {idx+1}: {str(e)}")
49
- results.append(f"Image {idx+1}: Error - {str(e)}")
50
-
51
- average_percent_complete = round(sum(all_percentages) / len(all_percentages), 2) if all_percentages else 0
52
- all_milestones_str = ", ".join(all_milestones)
53
-
54
- output_html = "<div style='text-align: left;'>"
55
- output_html += "<h3>Processing Results:</h3><ul>"
56
- for result in results:
57
- output_html += f"<li>{result}</li>"
58
- output_html += "</ul>"
59
- output_html += f"<p><strong>Project Record Created:</strong> {project_name} - {dominant_milestone or 'No milestone'} (Highest: {max_percent_complete}%, Average: {average_percent_complete}%, Milestones: {all_milestones_str})</p>"
60
- output_html += "</div>"
61
-
62
- # Fixed confidence score logic
63
- confidence_scores = [0.90] if not all_percentages else [0.90 for _ in all_milestones] # Default to 0.90
64
- max_confidence = str(max(confidence_scores))
65
-
66
- print("Finished process_image at", datetime.now(pytz.timezone("Asia/Kolkata")).strftime("%Y-%m-%d %H:%M:%S IST"))
67
- return output_html, "Success", dominant_milestone or "", max_confidence, f"{max_percent_complete}%"
68
-
69
- # Gradio UI
70
- with gr.Blocks(css="""
71
- .gradio-container { background-color: #f0f4f8; font-family: Arial; }
72
- .title { color: #2c3e50; font-size: 24px; text-align: center; font-weight: bold; }
73
- """) as demo:
74
- print("Setting up Gradio interface at", datetime.now(pytz.timezone("Asia/Kolkata")).strftime("%Y-%m-%d %H:%M:%S IST"))
75
- gr.Markdown("<h1 class='title'>Construction Progress Analyzer</h1>")
76
-
77
- with gr.Row():
78
- project_type_input = gr.Dropdown(label="Project Type", choices=["House", "Apartment"], value="House")
79
- project_name_input = gr.Textbox(label="Project Name", placeholder="e.g. Project_12345")
80
-
81
- image_input = gr.File(file_count="multiple", file_types=["image"], label="Upload Images")
82
- submit_button = gr.Button("Process Images")
83
- output_html = gr.HTML(label="Result")
84
-
85
- submit_button.click(
86
- fn=process_image,
87
- inputs=[image_input, project_name_input, project_type_input],
88
- outputs=[output_html]
89
- )
90
-
91
- print("Launching Gradio interface at", datetime.now(pytz.timezone("Asia/Kolkata")).strftime("%Y-%m-%d %H:%M:%S IST"))
92
- try:
93
- demo.launch(share=True, debug=True)
94
- print("Gradio interface launched successfully at", datetime.now(pytz.timezone("Asia/Kolkata")).strftime("%Y-%m-%d %H:%M:%S IST"))
95
- while True:
96
- time.sleep(10)
97
- except Exception as e:
98
- print(f"Failed to launch Gradio interface: {str(e)}")
99
- raise
 
1
+ # ... (Previous code remains the same until the process_image function) ...
2
+
3
+ # Image processing and Salesforce upload for multiple images
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
  def process_image(images, project_name, project_type):
5
+ try:
6
+ if not images:
7
+ return "<p style='color: red;'>Error: Please upload at least one image to proceed.</p>", "Pending", "", "", 0
8
+
9
+ if not project_name:
10
+ return "<p style='color: red;'>Error: Project Name is required.</p>", "Pending", "", "", 0
11
+
12
+ results = []
13
+ image_urls = []
14
+ milestone_confidences = []
15
+ all_percentages = []
16
+ all_milestones = set() # To store all unique milestones
17
+ max_percent_complete = 0
18
+ dominant_milestone = None
19
+ dominant_image_url = None
20
+
21
+ # Process each image
22
+ for idx, image_path in enumerate(images):
23
+ try:
24
+ img = Image.open(image_path)
25
+ milestone, percent_complete, confidence_score = mock_ai_model(img)
26
+
27
+ upload_dir = "public_uploads"
28
+ os.makedirs(upload_dir, exist_ok=True)
29
+ unique_id = datetime.now().strftime("%Y%m%d%H%M%S")
30
+ image_filename = f"{unique_id}_{idx}_{os.path.basename(image_path)}"
31
+ saved_image_path = os.path.join(upload_dir, image_filename)
32
+ shutil.copy(image_path, saved_image_path)
33
+
34
+ with open(saved_image_path, 'rb') as image_file:
35
+ image_data = base64.b64encode(image_file.read()).decode('utf-8')
36
+
37
+ content_version = {
38
+ 'Title': image_filename,
39
+ 'PathOnClient': saved_image_path,
40
+ 'VersionData': image_data
41
+ }
42
+
43
+ try:
44
+ content_version_result = sf.ContentVersion.create(content_version)
45
+ content_version_id = content_version_result['id']
46
+ file_url = f"https://sathkruthatechsolutionspri8-dev-ed.develop.lightning.force.com/{content_version_id}"
47
+ image_urls.append(file_url)
48
+ except Exception as e:
49
+ results.append(f"Image {idx+1}: Failed to upload to Salesforce - {str(e)}")
50
+ continue
51
+
52
+ if percent_complete > max_percent_complete:
53
+ max_percent_complete = percent_complete
54
+ dominant_milestone = milestone
55
+ dominant_image_url = file_url
56
+
57
+ all_percentages.append(percent_complete)
58
+ all_milestones.add(milestone) # Add milestone to set to avoid duplicates
59
+ milestone_confidences.append((milestone, confidence_score))
60
+ results.append(f"Image {idx+1}: {milestone} - {percent_complete}% completion (Confidence: {confidence_score})")
61
+
62
+ except Exception as e:
63
+ results.append(f"Image {idx+1}: Error processing image - {str(e)}")
64
+ continue
65
+
66
+ if not results:
67
+ return "<p style='color: red;'>Error: No images were successfully processed.</p>", "Failure", "", "", 0
68
+
69
+ average_percent_complete = round(sum(all_percentages) / len(all_percentages), 2) if all_percentages else 0
70
+ all_milestones_str = ", ".join(all_milestones) # Convert set to comma-separated string
71
+
72
+ now = datetime.now(local_timezone)
73
+ local_time = now.strftime("%Y-%m-%dT%H:%M:%S") + now.strftime("%z")[:-2] + ":" + now.strftime("%z")[-2:]
74
+
75
+ record = {
76
+ "Name__c": project_name,
77
+ "Project_Type__c": project_type,
78
+ "Completion_Percentage__c": max_percent_complete,
79
+ "Current_Milestone__c": all_milestones_str, # Store all milestones
80
+ "Last_Updated_On__c": local_time,
81
+ "Upload_Status__c": "Success",
82
+ "Comments__c": f"Project {project_name} at {dominant_milestone or 'no milestone detected'} with {max_percent_complete}% completion",
83
+ "Last_Updated_Image__c": dominant_image_url or ""
84
+ }
85
+
86
  try:
87
+ sf.Construction__c.create(record)
 
 
 
 
 
 
 
 
88
  except Exception as e:
89
+ return f"<p style='color: red;'>Error: Failed to update Salesforce - {str(e)}</p>", "Failure", "", "", 0
90
+
91
+ output_html = "<div style='text-align: left;'>"
92
+ output_html += "<h3>Processing Results:</h3><ul>"
93
+ for result in results:
94
+ output_html += f"<li>{result}</li>"
95
+ output_html += "</ul>"
96
+ output_html += f"<p><strong>Project Record Created:</strong> {project_name} - {dominant_milestone or 'No milestone detected'} (Highest: {max_percent_complete}%, Average: {average_percent_complete}%, Milestones: {all_milestones_str})</p>"
97
+ output_html += f"<p><strong>Note:</strong> Only the image with the highest completion percentage is stored in Salesforce due to field length constraints.</p>"
98
+ if not dominant_milestone:
99
+ output_html += "<p><strong>Warning:</strong> No valid milestone was set as dominant due to restricted picklist constraints (prior to conversion).</p>"
100
+ output_html += "</div>"
101
+
102
+ return output_html, "Success", dominant_milestone or "", f"Max Confidence: {max([conf for _, conf in milestone_confidences], default=0)}", f"{max_percent_complete}%"
103
+
104
+ except Exception as e:
105
+ return f"<p style='color: red;'>Error: {str(e)}</p>", "Failure", "", "", "0%"
106
+
107
+ # ... (Rest of the code, including Gradio UI, remains the same) ...