intelliarts commited on
Commit
a084c6c
·
1 Parent(s): ffc3d90

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +151 -1
app.py CHANGED
@@ -1,7 +1,157 @@
 
 
 
 
 
 
 
1
  import gradio as gr
 
2
  import numpy as np
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
 
4
- def inference(image):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
  img1 = np.array(np.random.rand(240,240))
6
  img2 = np.array(np.random.rand(240,240))
7
  img3 = np.array(np.random.rand(240,240))
 
1
+ try:
2
+ import detectron2
3
+ except:
4
+ import os
5
+ os.system('pip install git+https://github.com/facebookresearch/detectron2.git')
6
+
7
+ from matplotlib.pyplot import axis
8
  import gradio as gr
9
+ import requests
10
  import numpy as np
11
+ from torch import nn
12
+ import requests
13
+
14
+ import torch
15
+ import detectron2
16
+ from detectron2 import model_zoo
17
+ from detectron2.engine import DefaultPredictor
18
+ from detectron2.config import get_cfg
19
+ from detectron2.utils.visualizer import Visualizer
20
+ from detectron2.data import MetadataCatalog
21
+ from detectron2.utils.visualizer import ColorMode
22
+
23
+ damage_model_path = 'damage/model_final.pth'
24
+ scratch_model_path = 'scratch/model_final.pth'
25
+ parts_model_path = 'parts/model_final.pth'
26
+
27
+ if torch.cuda.is_available():
28
+ device = 'cuda'
29
+ else:
30
+ device = 'cpu'
31
+
32
+ cfg_scratches = get_cfg()
33
+ cfg_scratches.merge_from_file(model_zoo.get_config_file("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml"))
34
+ cfg_scratches.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.8
35
+ cfg_scratches.MODEL.ROI_HEADS.NUM_CLASSES = 1
36
+ cfg_scratches.MODEL.WEIGHTS = scratch_model_path
37
+ cfg_scratches.MODEL.DEVICE = device
38
+
39
+ predictor_scratches = DefaultPredictor(cfg_scratches)
40
+
41
+ metadata_scratch = MetadataCatalog.get("car_dataset_val")
42
+ metadata_scratch.thing_classes = ["scratch"]
43
+
44
+ cfg_damage = get_cfg()
45
+ cfg_damage.merge_from_file(model_zoo.get_config_file("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml"))
46
+ cfg_damage.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.7
47
+ cfg_damage.MODEL.ROI_HEADS.NUM_CLASSES = 1
48
+ cfg_damage.MODEL.WEIGHTS = damage_model_path
49
+ cfg_damage.MODEL.DEVICE = device
50
+
51
+ predictor_damage = DefaultPredictor(cfg_damage)
52
+
53
+ metadata_damage = MetadataCatalog.get("car_damage_dataset_val")
54
+ metadata_damage.thing_classes = ["damage"]
55
+
56
+ cfg_parts = get_cfg()
57
+ cfg_parts.merge_from_file(model_zoo.get_config_file("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml"))
58
+ cfg_parts.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.75
59
+ cfg_parts.MODEL.ROI_HEADS.NUM_CLASSES = 19
60
+ cfg_parts.MODEL.WEIGHTS = parts_model_path
61
+ cfg_parts.MODEL.DEVICE = device
62
+
63
+ predictor_parts = DefaultPredictor(cfg_parts)
64
 
65
+ metadata_parts = MetadataCatalog.get("car_parts_dataset_val")
66
+ metadata_parts.thing_classes = ['_background_',
67
+ 'back_bumper',
68
+ 'back_glass',
69
+ 'back_left_door',
70
+ 'back_left_light',
71
+ 'back_right_door',
72
+ 'back_right_light',
73
+ 'front_bumper',
74
+ 'front_glass',
75
+ 'front_left_door',
76
+ 'front_left_light',
77
+ 'front_right_door',
78
+ 'front_right_light',
79
+ 'hood',
80
+ 'left_mirror',
81
+ 'right_mirror',
82
+ 'tailgate',
83
+ 'trunk',
84
+ 'wheel']
85
+
86
+ def merge_segment(pred_segm):
87
+ merge_dict = {}
88
+ for i in range(len(pred_segm)):
89
+ merge_dict[i] = []
90
+ for j in range(i+1,len(pred_segm)):
91
+ if torch.sum(pred_segm[i]*pred_segm[j])>0:
92
+ merge_dict[i].append(j)
93
+
94
+ to_delete = []
95
+ for key in merge_dict:
96
+ for element in merge_dict[key]:
97
+ to_delete.append(element)
98
+
99
+ for element in to_delete:
100
+ merge_dict.pop(element,None)
101
+
102
+ empty_delete = []
103
+ for key in merge_dict:
104
+ if merge_dict[key] == []:
105
+ empty_delete.append(key)
106
+
107
+ for element in empty_delete:
108
+ merge_dict.pop(element,None)
109
+
110
+ for key in merge_dict:
111
+ for element in merge_dict[key]:
112
+ pred_segm[key]+=pred_segm[element]
113
+
114
+ except_elem = list(set(to_delete))
115
+
116
+ new_indexes = list(range(len(pred_segm)))
117
+ for elem in except_elem:
118
+ new_indexes.remove(elem)
119
+
120
+ return pred_segm[new_indexes]
121
+
122
+
123
+ def inference(image
124
+ img = np.array(image)
125
+ outputs_damage = predictor_damage(img)
126
+ outputs_parts = predictor_parts(img)
127
+ outputs_scratch = predictor_scratches(img)
128
+ out_dict = outputs_damage["instances"].to("cpu").get_fields()
129
+ merged_damage_masks = merge_segment(out_dict['pred_masks'])
130
+ scratch_data = outputs_scratch["instances"].get_fields()
131
+ scratch_masks = scratch_data['pred_masks']
132
+ damage_data = outputs_damage["instances"].get_fields()
133
+ damage_masks = damage_data['pred_masks']
134
+ parts_data = outputs_parts["instances"].get_fields()
135
+ parts_masks = parts_data['pred_masks']
136
+ parts_classes = parts_data['pred_classes']
137
+
138
+ parts_damage_dict = {}
139
+ parts_list_damages = []
140
+ for part in parts_classes:
141
+ parts_damage_dict[metadata_parts.thing_classes[part]] = []
142
+ for mask in scratch_masks:
143
+ for i in range(len(parts_masks)):
144
+ if torch.sum(parts_masks[i]*mask)>0:
145
+ parts_damage_dict[metadata_parts.thing_classes[parts_classes[i]]].append('scratch')
146
+ parts_list_damages.append(f'{metadata_parts.thing_classes[parts_classes[i]]} has scratch')
147
+ print(f'{metadata_parts.thing_classes[parts_classes[i]]} has scratch')
148
+ for mask in merged_damage_masks:
149
+ for i in range(len(parts_masks)):
150
+ if torch.sum(parts_masks[i]*mask)>0:
151
+ parts_damage_dict[metadata_parts.thing_classes[parts_classes[i]]].append('damage')
152
+ parts_list_damages.append(f'{metadata_parts.thing_classes[parts_classes[i]]} has damage')
153
+ print(f'{metadata_parts.thing_classes[parts_classes[i]]} has damage')
154
+
155
  img1 = np.array(np.random.rand(240,240))
156
  img2 = np.array(np.random.rand(240,240))
157
  img3 = np.array(np.random.rand(240,240))