Adonai Vera commited on
Commit
e2608da
·
1 Parent(s): fbabf41

Get feedback from the user

Browse files
Files changed (4) hide show
  1. .DS_Store +0 -0
  2. .gitignore +32 -0
  3. app.py +86 -11
  4. flagged/log.csv +2 -0
.DS_Store CHANGED
Binary files a/.DS_Store and b/.DS_Store differ
 
.gitignore ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ **/*.DS_store
3
+ .vscode
4
+ node_modules
5
+
6
+ __pycache__
7
+ *.py[cod]
8
+
9
+ *.egg-info
10
+ .project
11
+ .pydevproject
12
+ **/*.ipynb_checkpoints
13
+ .idea
14
+ *.swp
15
+
16
+ *~
17
+
18
+ build/
19
+ dist/
20
+
21
+ /eta/
22
+
23
+ /docs/build/
24
+ /docs/source/api/
25
+
26
+ /bin
27
+ /lib
28
+ coverage.xml
29
+ .coverage.*
30
+ pyvenv.cfg
31
+
32
+ flagged/
app.py CHANGED
@@ -6,6 +6,66 @@ from PIL import Image
6
  # Initialize the pipeline with your model
7
  pipe = pipeline("image-classification", model="SubterraAI/ofwat_defects_classification")
8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  defect_dict = {
10
  "CL": "Crack Longitudinal",
11
  "CLJ": "Crack Longitudinal at Joint",
@@ -56,6 +116,13 @@ defect_dict = {
56
  "DES": "Debris Silt",
57
  "RF": "Roots Fine",
58
  "RM": "Roots Mass",
 
 
 
 
 
 
 
59
  "RT": "Roots Tap",
60
  "IS(J)": "Infiltration Light Seeping Joint",
61
  "ID(J)": "Infiltration Light Dripping Joint",
@@ -70,10 +137,21 @@ defect_dict = {
70
  }
71
 
72
  def replace_label_with_full_name(res, defect_dict_key_code):
73
- # Check if the label in the result is in the dictionary
74
- # If it is, replace it with the full name
75
- return {defect_dict_key_code.get(dic["label"], dic["label"]): dic["score"] for dic in res}
 
 
 
 
 
 
76
 
 
 
 
 
 
77
 
78
  def classify_image(image):
79
  # Convert the input image to PIL format
@@ -82,11 +160,8 @@ def classify_image(image):
82
  # Classify the image using the pipeline
83
  res = pipe(PIL_image)
84
 
85
- replaced_res = replace_label_with_full_name(res, defect_dict)
86
-
87
-
88
  # Extract labels and scores
89
- return {dic["label"]: dic["score"] for dic in replaced_res}
90
 
91
  # Create the Gradio interface
92
  iface = gr.Interface(
@@ -94,15 +169,15 @@ iface = gr.Interface(
94
  "image",
95
  "label",
96
  examples=[
 
97
  ["examples/CS.jpg"],
98
  ["examples/GI.jpg"],
99
- ["examples/PP.jpg"],
100
  ["examples/RC.jpg"]
101
  ],
102
  description="Upload an image to classify its material.",
103
- title="Defects Classification with AI by Subterra"
104
- #allow_flagging="manual",
105
- #flagging_options=["obstruction", "no_obstruction"]
106
  )
107
 
108
  # Launch the interface
 
6
  # Initialize the pipeline with your model
7
  pipe = pipeline("image-classification", model="SubterraAI/ofwat_defects_classification")
8
 
9
+ defect_full_names_list = [
10
+ "Crack Longitudinal",
11
+ "Crack Longitudinal at Joint",
12
+ "Crack Circumferential",
13
+ "Crack Circumferential at Joint",
14
+ "Crack Multiple",
15
+ "Crack Multiple at Joint",
16
+ "Crack Spiral",
17
+ "Fracture Longitudinal",
18
+ "Fracture Circumferential",
19
+ "Fracture Multiple",
20
+ "Fracture Spiral",
21
+ "Broken",
22
+ "Broken Pipe at Joint",
23
+ "Hole",
24
+ "Deformation (Not Brick)",
25
+ "Collapse",
26
+ "Joint Displaced",
27
+ "Joint Displaced Medium",
28
+ "Joint Displaced Large",
29
+ "Open Joint",
30
+ "Open Joint Medium",
31
+ "Open Joint Large",
32
+ "Increased Roughness",
33
+ "Visible Aggregate",
34
+ "Aggregate Projecting",
35
+ "Visible Reinforcement",
36
+ "Reinforcement Projecting",
37
+ "Corroded Reinforcement",
38
+ "Surface Damage Spalling",
39
+ "Other Damage",
40
+ "Line Defect",
41
+ "Weld Failure Circumferential",
42
+ "Weld Failure Longitudinal",
43
+ "Weld Failure Spiral",
44
+ "Defective Repair, part of wall missing",
45
+ "Defective Repair",
46
+ "Displaced bricks",
47
+ "Missing bricks",
48
+ "Dropped Invert",
49
+ "Encrustation/Scale Light",
50
+ "Encrustation/Scale Medium",
51
+ "Encrustation/Scale Heavy",
52
+ "Debris Grease",
53
+ "Debris Silt",
54
+ "Roots Fine",
55
+ "Roots Mass",
56
+ "Roots Tap",
57
+ "Infiltration Light Seeping Joint",
58
+ "Infiltration Light Dripping Joint",
59
+ "Infiltration Moderate Running Joint",
60
+ "Infiltration Severe Gusher Joint",
61
+ "Connection Intruding",
62
+ "Connection Defective",
63
+ "Sealing Ring Intruding",
64
+ "Sealing Ring Broken",
65
+ "Other sealent intruding",
66
+ "Camera Underwater"
67
+ ]
68
+
69
  defect_dict = {
70
  "CL": "Crack Longitudinal",
71
  "CLJ": "Crack Longitudinal at Joint",
 
116
  "DES": "Debris Silt",
117
  "RF": "Roots Fine",
118
  "RM": "Roots Mass",
119
+ "RL": "Roots Lateral",
120
+ "LR": "Line Right",
121
+ "LL": "Line Left",
122
+ "LD": "Line Down",
123
+ "LU": "Line Up",
124
+ "DEF": "Deformed Elliptical (Flexible)",
125
+ "WL": "Weeper Lateral",
126
  "RT": "Roots Tap",
127
  "IS(J)": "Infiltration Light Seeping Joint",
128
  "ID(J)": "Infiltration Light Dripping Joint",
 
137
  }
138
 
139
  def replace_label_with_full_name(res, defect_dict_key_code):
140
+ new_res = {}
141
+ for dic in res:
142
+ # Splitting the label to handle possible suffix
143
+ parts = dic["label"].split('_', 1)
144
+ code = parts[0]
145
+ suffix = '_' + parts[1] if len(parts) > 1 else ''
146
+
147
+ # Replacing the code with its full name, if it exists in the dictionary
148
+ full_name = defect_dict_key_code.get(code, code)
149
 
150
+ # Constructing the new label with the suffix if it exists
151
+ new_label = full_name + suffix
152
+ new_res[new_label] = dic["score"]
153
+
154
+ return new_res
155
 
156
  def classify_image(image):
157
  # Convert the input image to PIL format
 
160
  # Classify the image using the pipeline
161
  res = pipe(PIL_image)
162
 
 
 
 
163
  # Extract labels and scores
164
+ return replace_label_with_full_name(res, defect_dict)
165
 
166
  # Create the Gradio interface
167
  iface = gr.Interface(
 
169
  "image",
170
  "label",
171
  examples=[
172
+ ["examples/PP.jpg"],
173
  ["examples/CS.jpg"],
174
  ["examples/GI.jpg"],
 
175
  ["examples/RC.jpg"]
176
  ],
177
  description="Upload an image to classify its material.",
178
+ title="Defects Classification with AI by Subterra",
179
+ allow_flagging="manual",
180
+ flagging_options=defect_full_names_list
181
  )
182
 
183
  # Launch the interface
flagged/log.csv CHANGED
@@ -5,3 +5,5 @@ image,output 0,output 1,flag,username,timestamp
5
  | GI | Galvanized Iron |
6
  | PP | Polypropylene |
7
  | RC | Reinforced Concrete |",,,2023-11-27 15:26:38.548865
 
 
 
5
  | GI | Galvanized Iron |
6
  | PP | Polypropylene |
7
  | RC | Reinforced Concrete |",,,2023-11-27 15:26:38.548865
8
+ "{""path"":""flagged/image/f8cda673ba099bdc61a5/PP.jpg"",""url"":""http://127.0.0.1:7860/file=/private/var/folders/5q/yl8pmxm116g6r3k8fd9gk74m0000gn/T/gradio/12885a897d79141c54ccb542582449159242eaa0/PP.jpg"",""size"":null,""orig_name"":""PP.jpg"",""mime_type"":null}","{""label"":""Roots Mass_1"",""confidences"":[{""label"":""Roots Mass_1"",""confidence"":0.7871310114860535},{""label"":""Roots Fine"",""confidence"":0.09039264917373657},{""label"":""Roots Tap"",""confidence"":0.00837390124797821},{""label"":""Roots Mass_2"",""confidence"":0.006819701287895441},{""label"":""Broken"",""confidence"":0.0035697731655091047}]}",,,2024-01-09 10:34:30.437383
9
+ "{""path"":""flagged/image/befb43e3dd4bacae416e/GI.jpg"",""url"":""http://127.0.0.1:7860/file=/private/var/folders/5q/yl8pmxm116g6r3k8fd9gk74m0000gn/T/gradio/ba9d81007395e0c7bff4c5a44e53e64b44fad560/GI.jpg"",""size"":null,""orig_name"":""GI.jpg"",""mime_type"":null}","{""label"":""Line Right"",""confidences"":[{""label"":""Line Right"",""confidence"":0.5224241018295288},{""label"":""Line Left"",""confidence"":0.32871416211128235},{""label"":""Line Down"",""confidence"":0.03255414962768555},{""label"":""Joint Displaced Medium_1"",""confidence"":0.009562213905155659},{""label"":""Line Up"",""confidence"":0.0074854386039078236}]}",Crack Longitudinal,,2024-01-09 10:39:15.651496