danielperales dperales commited on
Commit
151e55e
·
0 Parent(s):

Duplicate from dperales/ITACA_Car_Parts_Damage_Detection_v2

Browse files

Co-authored-by: DANIEL <dperales@users.noreply.huggingface.co>

Files changed (19) hide show
  1. .gitattributes +34 -0
  2. 1.jpg +0 -0
  3. 30.jpg +0 -0
  4. 33.jpg +0 -0
  5. 40.jpg +0 -0
  6. 43.jpg +0 -0
  7. 50.jpg +0 -0
  8. 53.jpg +0 -0
  9. 54.jpg +0 -0
  10. 56.jpg +0 -0
  11. 58.jpg +0 -0
  12. README.md +13 -0
  13. app.py +275 -0
  14. app_v1.txt +255 -0
  15. itaca_logo.png +0 -0
  16. model_final_damage.pth +3 -0
  17. model_final_parts.pth +3 -0
  18. model_final_scratch.pth +3 -0
  19. requirements.txt +12 -0
.gitattributes ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ *.ckpt filter=lfs diff=lfs merge=lfs -text
6
+ *.ftz filter=lfs diff=lfs merge=lfs -text
7
+ *.gz filter=lfs diff=lfs merge=lfs -text
8
+ *.h5 filter=lfs diff=lfs merge=lfs -text
9
+ *.joblib filter=lfs diff=lfs merge=lfs -text
10
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
+ *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
+ *.model filter=lfs diff=lfs merge=lfs -text
13
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
14
+ *.npy filter=lfs diff=lfs merge=lfs -text
15
+ *.npz filter=lfs diff=lfs merge=lfs -text
16
+ *.onnx filter=lfs diff=lfs merge=lfs -text
17
+ *.ot filter=lfs diff=lfs merge=lfs -text
18
+ *.parquet filter=lfs diff=lfs merge=lfs -text
19
+ *.pb filter=lfs diff=lfs merge=lfs -text
20
+ *.pickle filter=lfs diff=lfs merge=lfs -text
21
+ *.pkl filter=lfs diff=lfs merge=lfs -text
22
+ *.pt filter=lfs diff=lfs merge=lfs -text
23
+ *.pth filter=lfs diff=lfs merge=lfs -text
24
+ *.rar filter=lfs diff=lfs merge=lfs -text
25
+ *.safetensors filter=lfs diff=lfs merge=lfs -text
26
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
28
+ *.tflite filter=lfs diff=lfs merge=lfs -text
29
+ *.tgz filter=lfs diff=lfs merge=lfs -text
30
+ *.wasm filter=lfs diff=lfs merge=lfs -text
31
+ *.xz filter=lfs diff=lfs merge=lfs -text
32
+ *.zip filter=lfs diff=lfs merge=lfs -text
33
+ *.zst filter=lfs diff=lfs merge=lfs -text
34
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
1.jpg ADDED
30.jpg ADDED
33.jpg ADDED
40.jpg ADDED
43.jpg ADDED
50.jpg ADDED
53.jpg ADDED
54.jpg ADDED
56.jpg ADDED
58.jpg ADDED
README.md ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: ITACA Car Parts Damage v2
3
+ emoji: ⚡
4
+ colorFrom: green
5
+ colorTo: purple
6
+ sdk: streamlit
7
+ sdk_version: 1.17.0
8
+ app_file: app.py
9
+ pinned: true
10
+ duplicated_from: dperales/ITACA_Car_Parts_Damage_Detection_v2
11
+ ---
12
+
13
+ Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
app.py ADDED
@@ -0,0 +1,275 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ try:
2
+ import detectron2
3
+ except:
4
+ import os
5
+ os.system('pip install git+https://github.com/facebookresearch/detectron2.git')
6
+
7
+ import os
8
+ import streamlit as st
9
+ from PIL import Image
10
+ from matplotlib.pyplot import axis
11
+ import requests
12
+ import numpy as np
13
+ from torch import nn
14
+ import requests
15
+ from annotated_text import annotated_text
16
+ from streamlit_option_menu import option_menu
17
+ import torch
18
+ import detectron2
19
+ from detectron2 import model_zoo
20
+ from detectron2.engine import DefaultPredictor
21
+ from detectron2.config import get_cfg
22
+ from detectron2.utils.visualizer import Visualizer
23
+ from detectron2.data import MetadataCatalog
24
+ from detectron2.utils.visualizer import ColorMode
25
+
26
+ damage_model_path = 'model_final_damage.pth'
27
+ scratch_model_path = 'model_final_scratch.pth'
28
+ parts_model_path = 'model_final_parts.pth'
29
+
30
+ if torch.cuda.is_available():
31
+ device = 'cuda'
32
+ else:
33
+ device = 'cpu'
34
+
35
+ cfg_scratches = get_cfg()
36
+ cfg_scratches.merge_from_file(model_zoo.get_config_file("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml"))
37
+ cfg_scratches.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.8
38
+ cfg_scratches.MODEL.ROI_HEADS.NUM_CLASSES = 1
39
+ cfg_scratches.MODEL.WEIGHTS = scratch_model_path
40
+ cfg_scratches.MODEL.DEVICE = device
41
+
42
+ predictor_scratches = DefaultPredictor(cfg_scratches)
43
+
44
+ metadata_scratch = MetadataCatalog.get("car_dataset_val")
45
+ metadata_scratch.thing_classes = ["scratch"]
46
+
47
+ cfg_damage = get_cfg()
48
+ cfg_damage.merge_from_file(model_zoo.get_config_file("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml"))
49
+ cfg_damage.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.7
50
+ cfg_damage.MODEL.ROI_HEADS.NUM_CLASSES = 1
51
+ cfg_damage.MODEL.WEIGHTS = damage_model_path
52
+ cfg_damage.MODEL.DEVICE = device
53
+
54
+ predictor_damage = DefaultPredictor(cfg_damage)
55
+
56
+ metadata_damage = MetadataCatalog.get("car_damage_dataset_val")
57
+ metadata_damage.thing_classes = ["damage"]
58
+
59
+ cfg_parts = get_cfg()
60
+ cfg_parts.merge_from_file(model_zoo.get_config_file("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml"))
61
+ cfg_parts.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.75
62
+ cfg_parts.MODEL.ROI_HEADS.NUM_CLASSES = 19
63
+ cfg_parts.MODEL.WEIGHTS = parts_model_path
64
+ cfg_parts.MODEL.DEVICE = device
65
+
66
+ predictor_parts = DefaultPredictor(cfg_parts)
67
+
68
+ metadata_parts = MetadataCatalog.get("car_parts_dataset_val")
69
+ metadata_parts.thing_classes = ['_background_',
70
+ 'back_bumper',
71
+ 'back_glass',
72
+ 'back_left_door',
73
+ 'back_left_light',
74
+ 'back_right_door',
75
+ 'back_right_light',
76
+ 'front_bumper',
77
+ 'front_glass',
78
+ 'front_left_door',
79
+ 'front_left_light',
80
+ 'front_right_door',
81
+ 'front_right_light',
82
+ 'hood',
83
+ 'left_mirror',
84
+ 'right_mirror',
85
+ 'tailgate',
86
+ 'trunk',
87
+ 'wheel']
88
+
89
+ def merge_segment(pred_segm):
90
+ merge_dict = {}
91
+ for i in range(len(pred_segm)):
92
+ merge_dict[i] = []
93
+ for j in range(i+1,len(pred_segm)):
94
+ if torch.sum(pred_segm[i]*pred_segm[j])>0:
95
+ merge_dict[i].append(j)
96
+
97
+ to_delete = []
98
+ for key in merge_dict:
99
+ for element in merge_dict[key]:
100
+ to_delete.append(element)
101
+
102
+ for element in to_delete:
103
+ merge_dict.pop(element,None)
104
+
105
+ empty_delete = []
106
+ for key in merge_dict:
107
+ if merge_dict[key] == []:
108
+ empty_delete.append(key)
109
+
110
+ for element in empty_delete:
111
+ merge_dict.pop(element,None)
112
+
113
+ for key in merge_dict:
114
+ for element in merge_dict[key]:
115
+ pred_segm[key]+=pred_segm[element]
116
+
117
+ except_elem = list(set(to_delete))
118
+
119
+ new_indexes = list(range(len(pred_segm)))
120
+ for elem in except_elem:
121
+ new_indexes.remove(elem)
122
+
123
+ return pred_segm[new_indexes]
124
+
125
+ def inference(image):
126
+ img = np.array(image)
127
+ outputs_damage = predictor_damage(img)
128
+ outputs_parts = predictor_parts(img)
129
+ outputs_scratch = predictor_scratches(img)
130
+ out_dict = outputs_damage["instances"].to("cpu").get_fields()
131
+ merged_damage_masks = merge_segment(out_dict['pred_masks'])
132
+ scratch_data = outputs_scratch["instances"].get_fields()
133
+ scratch_masks = scratch_data['pred_masks']
134
+ damage_data = outputs_damage["instances"].get_fields()
135
+ damage_masks = damage_data['pred_masks']
136
+ parts_data = outputs_parts["instances"].get_fields()
137
+ parts_masks = parts_data['pred_masks']
138
+ parts_classes = parts_data['pred_classes']
139
+ new_inst = detectron2.structures.Instances((1024,1024))
140
+ new_inst.set('pred_masks',merge_segment(out_dict['pred_masks']))
141
+
142
+ parts_damage_dict = {}
143
+ parts_list_damages = []
144
+ for part in parts_classes:
145
+ parts_damage_dict[metadata_parts.thing_classes[part]] = []
146
+ for mask in scratch_masks:
147
+ for i in range(len(parts_masks)):
148
+ if torch.sum(parts_masks[i]*mask)>0:
149
+ parts_damage_dict[metadata_parts.thing_classes[parts_classes[i]]].append('scratch')
150
+ parts_list_damages.append(f'{metadata_parts.thing_classes[parts_classes[i]]} has scratch')
151
+ print(f'{metadata_parts.thing_classes[parts_classes[i]]} has scratch')
152
+ for mask in merged_damage_masks:
153
+ for i in range(len(parts_masks)):
154
+ if torch.sum(parts_masks[i]*mask)>0:
155
+ parts_damage_dict[metadata_parts.thing_classes[parts_classes[i]]].append('damage')
156
+ parts_list_damages.append(f'{metadata_parts.thing_classes[parts_classes[i]]} has damage')
157
+ print(f'{metadata_parts.thing_classes[parts_classes[i]]} has damage')
158
+
159
+ v_d = Visualizer(img[:, :, ::-1],
160
+ metadata=metadata_damage,
161
+ scale=0.5,
162
+ instance_mode=ColorMode.SEGMENTATION # remove the colors of unsegmented pixels. This option is only available for segmentation models
163
+ )
164
+ #v_d = Visualizer(img,scale=1.2)
165
+ #print(outputs["instances"].to('cpu'))
166
+ out_d = v_d.draw_instance_predictions(new_inst)
167
+ img1 = out_d.get_image()[:, :, ::-1]
168
+
169
+ v_s = Visualizer(img[:, :, ::-1],
170
+ metadata=metadata_scratch,
171
+ scale=0.5,
172
+ instance_mode=ColorMode.SEGMENTATION # remove the colors of unsegmented pixels. This option is only available for segmentation models
173
+ )
174
+ #v_s = Visualizer(img,scale=1.2)
175
+ out_s = v_s.draw_instance_predictions(outputs_scratch["instances"])
176
+ img2 = out_s.get_image()[:, :, ::-1]
177
+
178
+ v_p = Visualizer(img[:, :, ::-1],
179
+ metadata=metadata_parts,
180
+ scale=0.5,
181
+ instance_mode=ColorMode.SEGMENTATION # remove the colors of unsegmented pixels. This option is only available for segmentation models
182
+ )
183
+ #v_p = Visualizer(img,scale=1.2)
184
+ out_p = v_p.draw_instance_predictions(outputs_parts["instances"])
185
+ img3 = out_p.get_image()[:, :, ::-1]
186
+
187
+ return img1, img2, img3, parts_list_damages
188
+
189
+ def main():
190
+ st.set_page_config(layout="wide")
191
+ c1, c2 = st.columns((1, 1))
192
+ c2.markdown("<br><br><br><br><br><br><br><br><br><br><br><br>", unsafe_allow_html=True)
193
+
194
+ tab1, tab2, tab3, tab4 = c2.tabs(["Image of damages", "Image of scratches", "Image of parts", "Information about damages parts"])
195
+
196
+ # Replace '20px' with your desired font size
197
+ font_size = '20px'
198
+
199
+ hide_streamlit_style = """
200
+ <style>
201
+ #MainMenu {visibility: hidden;}
202
+ footer {visibility: hidden;}
203
+ </style>
204
+ """
205
+
206
+ st.markdown(hide_streamlit_style, unsafe_allow_html=True)
207
+ c1.title('ITACA Insurance Core AI Module')
208
+
209
+ with st.sidebar:
210
+ image = Image.open('itaca_logo.png')
211
+ st.image(image, width=150) #,use_column_width=True)
212
+ page = option_menu(menu_title='Menu',
213
+ menu_icon="robot",
214
+ options=["Damage Detection",
215
+ "Under Construction"],
216
+ icons=["camera",
217
+ "key"],
218
+ default_index=0
219
+ )
220
+
221
+ if page == "Damage Detection":
222
+ c1.header('Car Parts Damage Detection')
223
+
224
+ c1.write(
225
+ """
226
+ """
227
+ )
228
+
229
+ # Display the list of CSV files
230
+ directory = "./"
231
+ all_files = os.listdir(directory)
232
+ # Filter files to only include JPG files
233
+ jpg_files = [file for file in all_files if file.endswith((".jpg"))]
234
+
235
+ # Select an image file from the list
236
+ selected_jpg = c1.selectbox("Select a JPG file from the list", ["None"] + jpg_files)
237
+
238
+ uploaded_file = c1.file_uploader("Upload an image:")
239
+
240
+ # Check if a file has been uploaded
241
+ if uploaded_file is not None:
242
+ # Load and display the image
243
+ image = Image.open(uploaded_file)
244
+ c1.image(image, width=450, caption="Uploaded image")
245
+
246
+ elif selected_jpg != 'None':
247
+ image = Image.open(selected_jpg)
248
+ c1.image(image, width=450, caption="Uploaded image")
249
+
250
+ else:
251
+ c1.write("Please upload an image.")
252
+
253
+ if c1.button("Prediction"):
254
+ with st.spinner("Loading..."):
255
+ imagen1, imagen2, imagen3, partes = inference(image)
256
+
257
+ c2.markdown("<br><br><br><br><br><br><br><br><br><br><br><br><br><br>", unsafe_allow_html=True)
258
+
259
+ tab1.image(imagen1, width=450)
260
+ tab2.image(imagen2, width=450)
261
+ tab3.image(imagen3, width=450)
262
+ tab4.table(partes)
263
+
264
+ elif page == "Under Construction":
265
+ st.header('Under Construction')
266
+
267
+ st.write(
268
+ """
269
+ """
270
+ )
271
+
272
+ try:
273
+ main()
274
+ except Exception as e:
275
+ st.sidebar.error(f"An error occurred: {e}")
app_v1.txt ADDED
@@ -0,0 +1,255 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ try:
2
+ import detectron2
3
+ except:
4
+ import os
5
+ os.system('pip install git+https://github.com/facebookresearch/detectron2.git')
6
+
7
+ import streamlit as st
8
+ from PIL import Image
9
+ from matplotlib.pyplot import axis
10
+ import requests
11
+ import numpy as np
12
+ from torch import nn
13
+ import requests
14
+ from annotated_text import annotated_text
15
+ from streamlit_option_menu import option_menu
16
+ import torch
17
+ import detectron2
18
+ from detectron2 import model_zoo
19
+ from detectron2.engine import DefaultPredictor
20
+ from detectron2.config import get_cfg
21
+ from detectron2.utils.visualizer import Visualizer
22
+ from detectron2.data import MetadataCatalog
23
+ from detectron2.utils.visualizer import ColorMode
24
+
25
+ damage_model_path = 'model_final_damage.pth'
26
+ scratch_model_path = 'model_final_scratch.pth'
27
+ parts_model_path = 'model_final_parts.pth'
28
+
29
+ if torch.cuda.is_available():
30
+ device = 'cuda'
31
+ else:
32
+ device = 'cpu'
33
+
34
+ cfg_scratches = get_cfg()
35
+ cfg_scratches.merge_from_file(model_zoo.get_config_file("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml"))
36
+ cfg_scratches.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.8
37
+ cfg_scratches.MODEL.ROI_HEADS.NUM_CLASSES = 1
38
+ cfg_scratches.MODEL.WEIGHTS = scratch_model_path
39
+ cfg_scratches.MODEL.DEVICE = device
40
+
41
+ predictor_scratches = DefaultPredictor(cfg_scratches)
42
+
43
+ metadata_scratch = MetadataCatalog.get("car_dataset_val")
44
+ metadata_scratch.thing_classes = ["scratch"]
45
+
46
+ cfg_damage = get_cfg()
47
+ cfg_damage.merge_from_file(model_zoo.get_config_file("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml"))
48
+ cfg_damage.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.7
49
+ cfg_damage.MODEL.ROI_HEADS.NUM_CLASSES = 1
50
+ cfg_damage.MODEL.WEIGHTS = damage_model_path
51
+ cfg_damage.MODEL.DEVICE = device
52
+
53
+ predictor_damage = DefaultPredictor(cfg_damage)
54
+
55
+ metadata_damage = MetadataCatalog.get("car_damage_dataset_val")
56
+ metadata_damage.thing_classes = ["damage"]
57
+
58
+ cfg_parts = get_cfg()
59
+ cfg_parts.merge_from_file(model_zoo.get_config_file("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml"))
60
+ cfg_parts.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.75
61
+ cfg_parts.MODEL.ROI_HEADS.NUM_CLASSES = 19
62
+ cfg_parts.MODEL.WEIGHTS = parts_model_path
63
+ cfg_parts.MODEL.DEVICE = device
64
+
65
+ predictor_parts = DefaultPredictor(cfg_parts)
66
+
67
+ metadata_parts = MetadataCatalog.get("car_parts_dataset_val")
68
+ metadata_parts.thing_classes = ['_background_',
69
+ 'back_bumper',
70
+ 'back_glass',
71
+ 'back_left_door',
72
+ 'back_left_light',
73
+ 'back_right_door',
74
+ 'back_right_light',
75
+ 'front_bumper',
76
+ 'front_glass',
77
+ 'front_left_door',
78
+ 'front_left_light',
79
+ 'front_right_door',
80
+ 'front_right_light',
81
+ 'hood',
82
+ 'left_mirror',
83
+ 'right_mirror',
84
+ 'tailgate',
85
+ 'trunk',
86
+ 'wheel']
87
+
88
+ def merge_segment(pred_segm):
89
+ merge_dict = {}
90
+ for i in range(len(pred_segm)):
91
+ merge_dict[i] = []
92
+ for j in range(i+1,len(pred_segm)):
93
+ if torch.sum(pred_segm[i]*pred_segm[j])>0:
94
+ merge_dict[i].append(j)
95
+
96
+ to_delete = []
97
+ for key in merge_dict:
98
+ for element in merge_dict[key]:
99
+ to_delete.append(element)
100
+
101
+ for element in to_delete:
102
+ merge_dict.pop(element,None)
103
+
104
+ empty_delete = []
105
+ for key in merge_dict:
106
+ if merge_dict[key] == []:
107
+ empty_delete.append(key)
108
+
109
+ for element in empty_delete:
110
+ merge_dict.pop(element,None)
111
+
112
+ for key in merge_dict:
113
+ for element in merge_dict[key]:
114
+ pred_segm[key]+=pred_segm[element]
115
+
116
+ except_elem = list(set(to_delete))
117
+
118
+ new_indexes = list(range(len(pred_segm)))
119
+ for elem in except_elem:
120
+ new_indexes.remove(elem)
121
+
122
+ return pred_segm[new_indexes]
123
+
124
+ def inference(image):
125
+ img = np.array(image)
126
+ outputs_damage = predictor_damage(img)
127
+ outputs_parts = predictor_parts(img)
128
+ outputs_scratch = predictor_scratches(img)
129
+ out_dict = outputs_damage["instances"].to("cpu").get_fields()
130
+ merged_damage_masks = merge_segment(out_dict['pred_masks'])
131
+ scratch_data = outputs_scratch["instances"].get_fields()
132
+ scratch_masks = scratch_data['pred_masks']
133
+ damage_data = outputs_damage["instances"].get_fields()
134
+ damage_masks = damage_data['pred_masks']
135
+ parts_data = outputs_parts["instances"].get_fields()
136
+ parts_masks = parts_data['pred_masks']
137
+ parts_classes = parts_data['pred_classes']
138
+ new_inst = detectron2.structures.Instances((1024,1024))
139
+ new_inst.set('pred_masks',merge_segment(out_dict['pred_masks']))
140
+
141
+ parts_damage_dict = {}
142
+ parts_list_damages = []
143
+ for part in parts_classes:
144
+ parts_damage_dict[metadata_parts.thing_classes[part]] = []
145
+ for mask in scratch_masks:
146
+ for i in range(len(parts_masks)):
147
+ if torch.sum(parts_masks[i]*mask)>0:
148
+ parts_damage_dict[metadata_parts.thing_classes[parts_classes[i]]].append('scratch')
149
+ parts_list_damages.append(f'{metadata_parts.thing_classes[parts_classes[i]]} has scratch')
150
+ print(f'{metadata_parts.thing_classes[parts_classes[i]]} has scratch')
151
+ for mask in merged_damage_masks:
152
+ for i in range(len(parts_masks)):
153
+ if torch.sum(parts_masks[i]*mask)>0:
154
+ parts_damage_dict[metadata_parts.thing_classes[parts_classes[i]]].append('damage')
155
+ parts_list_damages.append(f'{metadata_parts.thing_classes[parts_classes[i]]} has damage')
156
+ print(f'{metadata_parts.thing_classes[parts_classes[i]]} has damage')
157
+
158
+ v_d = Visualizer(img[:, :, ::-1],
159
+ metadata=metadata_damage,
160
+ scale=0.5,
161
+ instance_mode=ColorMode.SEGMENTATION # remove the colors of unsegmented pixels. This option is only available for segmentation models
162
+ )
163
+ #v_d = Visualizer(img,scale=1.2)
164
+ #print(outputs["instances"].to('cpu'))
165
+ out_d = v_d.draw_instance_predictions(new_inst)
166
+ img1 = out_d.get_image()[:, :, ::-1]
167
+
168
+ v_s = Visualizer(img[:, :, ::-1],
169
+ metadata=metadata_scratch,
170
+ scale=0.5,
171
+ instance_mode=ColorMode.SEGMENTATION # remove the colors of unsegmented pixels. This option is only available for segmentation models
172
+ )
173
+ #v_s = Visualizer(img,scale=1.2)
174
+ out_s = v_s.draw_instance_predictions(outputs_scratch["instances"])
175
+ img2 = out_s.get_image()[:, :, ::-1]
176
+
177
+ v_p = Visualizer(img[:, :, ::-1],
178
+ metadata=metadata_parts,
179
+ scale=0.5,
180
+ instance_mode=ColorMode.SEGMENTATION # remove the colors of unsegmented pixels. This option is only available for segmentation models
181
+ )
182
+ #v_p = Visualizer(img,scale=1.2)
183
+ out_p = v_p.draw_instance_predictions(outputs_parts["instances"])
184
+ img3 = out_p.get_image()[:, :, ::-1]
185
+
186
+ return img1, img2, img3, parts_list_damages
187
+
188
+ def main():
189
+ hide_streamlit_style = """
190
+ <style>
191
+ #MainMenu {visibility: hidden;}
192
+ footer {visibility: hidden;}
193
+ </style>
194
+ """
195
+ st.markdown(hide_streamlit_style, unsafe_allow_html=True)
196
+
197
+ with st.sidebar:
198
+ image = Image.open('itaca_logo.png')
199
+ st.image(image, width=150) #,use_column_width=True)
200
+ page = option_menu(menu_title='Menu',
201
+ menu_icon="robot",
202
+ options=["Damage Detection",
203
+ "Under Construction"],
204
+ icons=["camera",
205
+ "key"],
206
+ default_index=0
207
+ )
208
+
209
+ # Additional section below the option menu
210
+ # st.markdown("---") # Add a separator line
211
+ # st.header("Settings")
212
+
213
+ st.title('ITACA Insurance Core AI Module')
214
+
215
+ if page == "Damage Detection":
216
+ st.header('Car Parts Damage Detection')
217
+
218
+ st.write(
219
+ """
220
+ """
221
+ )
222
+
223
+ uploaded_file = st.file_uploader("Upload an image:")
224
+
225
+ # Check if a file has been uploaded
226
+ if uploaded_file is not None:
227
+ # Load and display the image
228
+ image = Image.open(uploaded_file)
229
+ st.image(image, caption="Uploaded image")
230
+
231
+ else:
232
+ st.write("Please upload an image.")
233
+
234
+ if st.button("Prediction"):
235
+ with st.spinner("Loading..."):
236
+ # Call the inference function with the uploaded image
237
+ imagen1, imagen2, imagen3, partes = inference(image)
238
+
239
+ st.image(imagen1, caption="crash image1")
240
+ st.image(imagen2, caption="crash image2")
241
+ st.image(imagen3, caption="crash image3")
242
+ st.table(partes)
243
+
244
+ elif page == "Under Construction":
245
+ st.header('Under Construction')
246
+
247
+ st.write(
248
+ """
249
+ """
250
+ )
251
+
252
+ try:
253
+ main()
254
+ except Exception as e:
255
+ st.sidebar.error(f"An error occurred: {e}")
itaca_logo.png ADDED
model_final_damage.pth ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:472733264687731b1deb6658d9f6e9fc1338bb457562d5d08f863b9e70e49974
3
+ size 351011827
model_final_parts.pth ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:f6e4cbbed694033cd36dfd03bb6f78c16e854ecf23834245099b7c468ecee643
3
+ size 351792243
model_final_scratch.pth ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:b2e63f96d8886754b9cda31302c702efb897484620e71b69cfeafffe6061907c
3
+ size 351011827
requirements.txt ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Pillow
2
+ streamlit
3
+ streamlit-option-menu
4
+ st-annotated-text
5
+ pandas
6
+ numpy
7
+ matplotlib
8
+ opencv-python-headless
9
+ pyyaml==5.1
10
+ torch
11
+ torchvision
12
+ # git+https://github.com/facebookresearch/detectron2.git