Rekham1110 commited on
Commit
8f1042a
·
verified ·
1 Parent(s): a4af6f4

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +31 -48
app.py CHANGED
@@ -16,72 +16,61 @@ load_dotenv()
16
  def validate_photo_size(image_file):
17
  max_size_mb = 20
18
  if isinstance(image_file, Image.Image):
19
- # Convert PIL Image to bytes for size check
20
  img_byte_arr = io.BytesIO()
21
  image_file.save(img_byte_arr, format='JPEG')
22
- file_size_mb = img_byte_arr.tell() / (1024 * 1024) # Convert bytes to MB
23
  return file_size_mb <= max_size_mb, None
24
  return False, "Invalid image format"
25
 
26
  # Function to process image with AI and predict milestone
27
  def predict_milestone(image):
28
  try:
29
- # Simulate AI processing time (ensure < 5 seconds)
30
  start_time = time.time()
31
-
32
- # Process image with Hugging Face model
33
  model = pipeline("image-classification", model="microsoft/resnet-50")
34
  predictions = model(image)
35
-
36
- # Placeholder logic: Map model output to construction milestones
37
- milestone = predictions[0]["label"] # Example: "positive" -> "Walls Erected"
38
  confidence = predictions[0]["score"]
39
-
40
- # Map model output to construction milestones (customize this)
41
  milestone_map = {
42
  "positive": "Walls Erected",
43
  "negative": "Foundation Completed",
44
- # Add more mappings based on your model
45
  }
46
  completion_map = {
47
- "positive": 60.00, # Example: Walls = 60% complete
48
- "negative": 20.00, # Example: Foundation = 20% complete
49
  }
50
-
51
  predicted_milestone = milestone_map.get(milestone, "Unknown Milestone")
52
  completion_percentage = completion_map.get(milestone, 0.00)
53
-
54
  processing_time = time.time() - start_time
55
  if processing_time > 5:
56
  return None, None, "AI took too long to process (> 5 seconds)."
57
-
58
  return predicted_milestone, completion_percentage, None
59
  except Exception as e:
60
  return None, None, f"AI failed to process the image: {str(e)}"
61
 
62
- # Function to upload image to Salesforce and get a URL
63
  def upload_image_to_salesforce(image, project_name):
64
  try:
65
- # Placeholder: Simulate uploading image to Salesforce ContentVersion
66
- image_url = f"https://your-salesforce-instance.com/file/{project_name}.jpg" # Simulated URL
67
  return image_url, None
68
  except Exception as e:
69
  return None, f"Failed to upload image to Salesforce: {str(e)}"
70
 
71
- # Function to update Salesforce Construction_Project__c object and fetch fields
72
  def update_salesforce_record(sf, project_name, milestone, percentage, image_url, status, comments):
73
  try:
74
- # Query to check if the project exists
75
- query = f"SELECT Id FROM Construction_Project__c WHERE Name = '{project_name}'"
76
  result = sf.query(query)
77
-
78
  if result['totalSize'] == 0:
79
  return None, f"No project found with Name: {project_name}"
80
-
81
  record_id = result['records'][0]['Id']
82
-
83
- # Update the record
84
- sf.Construction_Project__c.update(record_id, {
85
  'Current_Milestone__c': milestone,
86
  'Completion_Percentage__c': percentage,
87
  'Last_Updated_Image__c': image_url,
@@ -89,14 +78,16 @@ def update_salesforce_record(sf, project_name, milestone, percentage, image_url,
89
  'Upload_Status__c': status,
90
  'Comments__c': comments
91
  })
92
-
93
- # Fetch the updated record to get the specified fields
94
- updated_query = f"SELECT Current_Milestone__c, Last_Updated_Image__c, Last_Updated_On__c, Upload_Status__c FROM Construction_Project__c WHERE Id = '{record_id}'"
 
 
95
  updated_result = sf.query(updated_query)
96
-
97
  if updated_result['totalSize'] == 0:
98
  return None, "Failed to retrieve updated record."
99
-
100
  record = updated_result['records'][0]
101
  fields_output = {
102
  'Current_Milestone__c': record.get('Current_Milestone__c', 'N/A'),
@@ -112,8 +103,7 @@ def update_salesforce_record(sf, project_name, milestone, percentage, image_url,
112
  def process_construction_photo(project_name, image):
113
  if not project_name or not image:
114
  return None, "Please provide a project name and upload a photo."
115
-
116
- # Connect to Salesforce
117
  try:
118
  sf = Salesforce(
119
  username=os.getenv('SALESFORCE_USERNAME'),
@@ -124,14 +114,12 @@ def process_construction_photo(project_name, image):
124
  except Exception as e:
125
  return None, f"Failed to connect to Salesforce: {str(e)}"
126
 
127
- # Validate photo size
128
  is_valid, error = validate_photo_size(image)
129
  if not is_valid:
130
  return None, error or "Photo is too large! Please upload a photo smaller than 20MB."
131
 
132
- # Process the image with AI
133
  milestone, percentage, error = predict_milestone(image)
134
-
135
  if error:
136
  fields, error_message = update_salesforce_record(
137
  sf=sf,
@@ -150,10 +138,9 @@ def process_construction_photo(project_name, image):
150
  for field, value in fields.items():
151
  error_text += f"{field}: {value}\n"
152
  return None, error_text
153
-
154
- # Upload image to Salesforce
155
  image_url, upload_error = upload_image_to_salesforce(image, project_name)
156
-
157
  if upload_error:
158
  fields, error_message = update_salesforce_record(
159
  sf=sf,
@@ -172,8 +159,7 @@ def process_construction_photo(project_name, image):
172
  for field, value in fields.items():
173
  error_text += f"{field}: {value}\n"
174
  return None, error_text
175
-
176
- # Update Salesforce with success
177
  fields, error_message = update_salesforce_record(
178
  sf=sf,
179
  project_name=project_name,
@@ -183,15 +169,14 @@ def process_construction_photo(project_name, image):
183
  status="Success",
184
  comments="Photo processed successfully"
185
  )
186
-
187
  if error_message:
188
  return None, f"Salesforce Error: {error_message}"
189
-
190
- # Prepare output with AI results and Salesforce fields
191
  result_text = f"Success! Milestone: {milestone}, Completion: {percentage}%\nProgress saved to Salesforce!\n\nSalesforce Fields:\n"
192
  for field, value in fields.items():
193
  result_text += f"{field}: {value}\n"
194
-
195
  return image, result_text
196
 
197
  # Gradio interface
@@ -209,7 +194,5 @@ iface = gr.Interface(
209
  description="Upload a photo of your construction site, and the AI will tell you the progress!"
210
  )
211
 
212
- # Launch the Gradio app
213
  if __name__ == "__main__":
214
  iface.launch()
215
-
 
16
  def validate_photo_size(image_file):
17
  max_size_mb = 20
18
  if isinstance(image_file, Image.Image):
 
19
  img_byte_arr = io.BytesIO()
20
  image_file.save(img_byte_arr, format='JPEG')
21
+ file_size_mb = img_byte_arr.tell() / (1024 * 1024)
22
  return file_size_mb <= max_size_mb, None
23
  return False, "Invalid image format"
24
 
25
  # Function to process image with AI and predict milestone
26
  def predict_milestone(image):
27
  try:
 
28
  start_time = time.time()
 
 
29
  model = pipeline("image-classification", model="microsoft/resnet-50")
30
  predictions = model(image)
31
+ milestone = predictions[0]["label"]
 
 
32
  confidence = predictions[0]["score"]
33
+
 
34
  milestone_map = {
35
  "positive": "Walls Erected",
36
  "negative": "Foundation Completed",
 
37
  }
38
  completion_map = {
39
+ "positive": 60.00,
40
+ "negative": 20.00,
41
  }
42
+
43
  predicted_milestone = milestone_map.get(milestone, "Unknown Milestone")
44
  completion_percentage = completion_map.get(milestone, 0.00)
45
+
46
  processing_time = time.time() - start_time
47
  if processing_time > 5:
48
  return None, None, "AI took too long to process (> 5 seconds)."
49
+
50
  return predicted_milestone, completion_percentage, None
51
  except Exception as e:
52
  return None, None, f"AI failed to process the image: {str(e)}"
53
 
54
+ # Placeholder for image upload to Salesforce (you can replace with actual logic)
55
  def upload_image_to_salesforce(image, project_name):
56
  try:
57
+ image_url = f"https://your-salesforce-instance.com/file/{project_name}.jpg"
 
58
  return image_url, None
59
  except Exception as e:
60
  return None, f"Failed to upload image to Salesforce: {str(e)}"
61
 
62
+ # Function to update Salesforce Construction_Progress__c record
63
  def update_salesforce_record(sf, project_name, milestone, percentage, image_url, status, comments):
64
  try:
65
+ query = f"SELECT Id FROM Construction_Progress__c WHERE Name = '{project_name}'"
 
66
  result = sf.query(query)
67
+
68
  if result['totalSize'] == 0:
69
  return None, f"No project found with Name: {project_name}"
70
+
71
  record_id = result['records'][0]['Id']
72
+
73
+ sf.Construction_Progress__c.update(record_id, {
 
74
  'Current_Milestone__c': milestone,
75
  'Completion_Percentage__c': percentage,
76
  'Last_Updated_Image__c': image_url,
 
78
  'Upload_Status__c': status,
79
  'Comments__c': comments
80
  })
81
+
82
+ updated_query = f"""
83
+ SELECT Current_Milestone__c, Last_Updated_Image__c, Last_Updated_On__c, Upload_Status__c
84
+ FROM Construction_Progress__c WHERE Id = '{record_id}'
85
+ """
86
  updated_result = sf.query(updated_query)
87
+
88
  if updated_result['totalSize'] == 0:
89
  return None, "Failed to retrieve updated record."
90
+
91
  record = updated_result['records'][0]
92
  fields_output = {
93
  'Current_Milestone__c': record.get('Current_Milestone__c', 'N/A'),
 
103
  def process_construction_photo(project_name, image):
104
  if not project_name or not image:
105
  return None, "Please provide a project name and upload a photo."
106
+
 
107
  try:
108
  sf = Salesforce(
109
  username=os.getenv('SALESFORCE_USERNAME'),
 
114
  except Exception as e:
115
  return None, f"Failed to connect to Salesforce: {str(e)}"
116
 
 
117
  is_valid, error = validate_photo_size(image)
118
  if not is_valid:
119
  return None, error or "Photo is too large! Please upload a photo smaller than 20MB."
120
 
 
121
  milestone, percentage, error = predict_milestone(image)
122
+
123
  if error:
124
  fields, error_message = update_salesforce_record(
125
  sf=sf,
 
138
  for field, value in fields.items():
139
  error_text += f"{field}: {value}\n"
140
  return None, error_text
141
+
 
142
  image_url, upload_error = upload_image_to_salesforce(image, project_name)
143
+
144
  if upload_error:
145
  fields, error_message = update_salesforce_record(
146
  sf=sf,
 
159
  for field, value in fields.items():
160
  error_text += f"{field}: {value}\n"
161
  return None, error_text
162
+
 
163
  fields, error_message = update_salesforce_record(
164
  sf=sf,
165
  project_name=project_name,
 
169
  status="Success",
170
  comments="Photo processed successfully"
171
  )
172
+
173
  if error_message:
174
  return None, f"Salesforce Error: {error_message}"
175
+
 
176
  result_text = f"Success! Milestone: {milestone}, Completion: {percentage}%\nProgress saved to Salesforce!\n\nSalesforce Fields:\n"
177
  for field, value in fields.items():
178
  result_text += f"{field}: {value}\n"
179
+
180
  return image, result_text
181
 
182
  # Gradio interface
 
194
  description="Upload a photo of your construction site, and the AI will tell you the progress!"
195
  )
196
 
 
197
  if __name__ == "__main__":
198
  iface.launch()