mingyang91 commited on
Commit
2fdba78
Β·
verified Β·
1 Parent(s): ec500f1

IoU evaluator

Browse files
Files changed (3) hide show
  1. .idea/workspace.xml +33 -30
  2. demo.py +63 -19
  3. yolo_dataset.py +10 -4
.idea/workspace.xml CHANGED
@@ -4,16 +4,10 @@
4
  <option name="autoReloadType" value="SELECTIVE" />
5
  </component>
6
  <component name="ChangeListManager">
7
- <list default="true" id="d7806539-b6d6-42e7-bb45-1565f5d54891" name="Changes" comment="fix confidence">
8
- <change afterPath="$PROJECT_DIR$/evaluator.py" afterDir="false" />
9
- <change afterPath="$PROJECT_DIR$/tests/coco8.zip" afterDir="false" />
10
- <change afterPath="$PROJECT_DIR$/tests/project-2-at-2024-01-20-11-43-00ad4911.zip" afterDir="false" />
11
- <change afterPath="$PROJECT_DIR$/yolo_dataset.py" afterDir="false" />
12
- <change beforePath="$PROJECT_DIR$/.idea/detector.iml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/detector.iml" afterDir="false" />
13
- <change beforePath="$PROJECT_DIR$/.idea/misc.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/misc.xml" afterDir="false" />
14
  <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
15
  <change beforePath="$PROJECT_DIR$/demo.py" beforeDir="false" afterPath="$PROJECT_DIR$/demo.py" afterDir="false" />
16
- <change beforePath="$PROJECT_DIR$/model.py" beforeDir="false" />
17
  </list>
18
  <option name="SHOW_DIALOG" value="false" />
19
  <option name="HIGHLIGHT_CONFLICTS" value="true" />
@@ -47,25 +41,25 @@
47
  <option name="hideEmptyMiddlePackages" value="true" />
48
  <option name="showLibraryContents" value="true" />
49
  </component>
50
- <component name="PropertiesComponent"><![CDATA[{
51
- "keyToString": {
52
- "Python.demo.executor": "Run",
53
- "Python.evaluator.executor": "Debug",
54
- "Python.extract.executor": "Run",
55
- "Python.yolo_dataset.executor": "Run",
56
- "RunOnceActivity.OpenProjectViewOnStart": "true",
57
- "RunOnceActivity.ShowReadmeOnStart": "true",
58
- "git-widget-placeholder": "main",
59
- "last_opened_file_path": "/Users/famer.me/PycharmProjects/detector/tests",
60
- "node.js.detected.package.eslint": "true",
61
- "node.js.detected.package.tslint": "true",
62
- "node.js.selected.package.eslint": "(autodetect)",
63
- "node.js.selected.package.tslint": "(autodetect)",
64
- "nodejs_package_manager_path": "npm",
65
- "settings.editor.selected.configurable": "settings.qodana",
66
- "vue.rearranger.settings.migration": "true"
67
  }
68
- }]]></component>
69
  <component name="RecentsManager">
70
  <key name="CopyFile.RECENT_KEYS">
71
  <recent name="$PROJECT_DIR$/tests" />
@@ -187,7 +181,7 @@
187
  <workItem from="1702301554378" duration="4025000" />
188
  <workItem from="1702450051021" duration="10065000" />
189
  <workItem from="1702476484538" duration="9613000" />
190
- <workItem from="1705757850315" duration="10355000" />
191
  </task>
192
  <task id="LOCAL-00001" summary="init commit">
193
  <option name="closed" value="true" />
@@ -325,7 +319,15 @@
325
  <option name="project" value="LOCAL" />
326
  <updated>1702485964999</updated>
327
  </task>
328
- <option name="localTasksCounter" value="18" />
 
 
 
 
 
 
 
 
329
  <servers />
330
  </component>
331
  <component name="TypeScriptGeneratedFilesManager">
@@ -367,11 +369,12 @@
367
  <MESSAGE value="use env" />
368
  <MESSAGE value="use /run/secrets" />
369
  <MESSAGE value="fix confidence" />
370
- <option name="LAST_COMMIT_MESSAGE" value="fix confidence" />
 
371
  </component>
372
  <component name="com.intellij.coverage.CoverageDataManagerImpl">
373
  <SUITE FILE_PATH="coverage/detector$demo.coverage" NAME="demo Coverage Results" MODIFIED="1702302380580" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
374
- <SUITE FILE_PATH="coverage/detector$evaluator.coverage" NAME="evaluator Coverage Results" MODIFIED="1705768159641" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
375
  <SUITE FILE_PATH="coverage/detector$extract.coverage" NAME="yolo_dataset Coverage Results" MODIFIED="1705764465837" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
376
  </component>
377
  </project>
 
4
  <option name="autoReloadType" value="SELECTIVE" />
5
  </component>
6
  <component name="ChangeListManager">
7
+ <list default="true" id="d7806539-b6d6-42e7-bb45-1565f5d54891" name="Changes" comment="IoU evaluator">
 
 
 
 
 
 
8
  <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
9
  <change beforePath="$PROJECT_DIR$/demo.py" beforeDir="false" afterPath="$PROJECT_DIR$/demo.py" afterDir="false" />
10
+ <change beforePath="$PROJECT_DIR$/yolo_dataset.py" beforeDir="false" afterPath="$PROJECT_DIR$/yolo_dataset.py" afterDir="false" />
11
  </list>
12
  <option name="SHOW_DIALOG" value="false" />
13
  <option name="HIGHLIGHT_CONFLICTS" value="true" />
 
41
  <option name="hideEmptyMiddlePackages" value="true" />
42
  <option name="showLibraryContents" value="true" />
43
  </component>
44
+ <component name="PropertiesComponent">{
45
+ &quot;keyToString&quot;: {
46
+ &quot;Python.demo.executor&quot;: &quot;Run&quot;,
47
+ &quot;Python.evaluator.executor&quot;: &quot;Debug&quot;,
48
+ &quot;Python.extract.executor&quot;: &quot;Run&quot;,
49
+ &quot;Python.yolo_dataset.executor&quot;: &quot;Run&quot;,
50
+ &quot;RunOnceActivity.OpenProjectViewOnStart&quot;: &quot;true&quot;,
51
+ &quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
52
+ &quot;git-widget-placeholder&quot;: &quot;main&quot;,
53
+ &quot;last_opened_file_path&quot;: &quot;/Users/famer.me/PycharmProjects/detector/tests&quot;,
54
+ &quot;node.js.detected.package.eslint&quot;: &quot;true&quot;,
55
+ &quot;node.js.detected.package.tslint&quot;: &quot;true&quot;,
56
+ &quot;node.js.selected.package.eslint&quot;: &quot;(autodetect)&quot;,
57
+ &quot;node.js.selected.package.tslint&quot;: &quot;(autodetect)&quot;,
58
+ &quot;nodejs_package_manager_path&quot;: &quot;npm&quot;,
59
+ &quot;settings.editor.selected.configurable&quot;: &quot;settings.qodana&quot;,
60
+ &quot;vue.rearranger.settings.migration&quot;: &quot;true&quot;
61
  }
62
+ }</component>
63
  <component name="RecentsManager">
64
  <key name="CopyFile.RECENT_KEYS">
65
  <recent name="$PROJECT_DIR$/tests" />
 
181
  <workItem from="1702301554378" duration="4025000" />
182
  <workItem from="1702450051021" duration="10065000" />
183
  <workItem from="1702476484538" duration="9613000" />
184
+ <workItem from="1705757850315" duration="12403000" />
185
  </task>
186
  <task id="LOCAL-00001" summary="init commit">
187
  <option name="closed" value="true" />
 
319
  <option name="project" value="LOCAL" />
320
  <updated>1702485964999</updated>
321
  </task>
322
+ <task id="LOCAL-00018" summary="IoU evaluator">
323
+ <option name="closed" value="true" />
324
+ <created>1705768358117</created>
325
+ <option name="number" value="00018" />
326
+ <option name="presentableId" value="LOCAL-00018" />
327
+ <option name="project" value="LOCAL" />
328
+ <updated>1705768358117</updated>
329
+ </task>
330
+ <option name="localTasksCounter" value="19" />
331
  <servers />
332
  </component>
333
  <component name="TypeScriptGeneratedFilesManager">
 
369
  <MESSAGE value="use env" />
370
  <MESSAGE value="use /run/secrets" />
371
  <MESSAGE value="fix confidence" />
372
+ <MESSAGE value="IoU evaluator" />
373
+ <option name="LAST_COMMIT_MESSAGE" value="IoU evaluator" />
374
  </component>
375
  <component name="com.intellij.coverage.CoverageDataManagerImpl">
376
  <SUITE FILE_PATH="coverage/detector$demo.coverage" NAME="demo Coverage Results" MODIFIED="1702302380580" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
377
+ <SUITE FILE_PATH="coverage/detector$evaluator.coverage" NAME="evaluator Coverage Results" MODIFIED="1705768332357" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
378
  <SUITE FILE_PATH="coverage/detector$extract.coverage" NAME="yolo_dataset Coverage Results" MODIFIED="1705764465837" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
379
  </component>
380
  </project>
demo.py CHANGED
@@ -1,7 +1,14 @@
 
1
  import time
2
- from PIL import Image
 
 
 
3
  import streamlit as st
 
4
 
 
 
5
  from yolo_fire import detect
6
 
7
 
@@ -12,28 +19,65 @@ def main():
12
  layout="centered")
13
  st.title("Fire&Smoke Detection:")
14
 
15
- # This will let you upload PNG, JPG & JPEG File
16
- buffer = st.file_uploader("Upload your Image here", type=["jpg", "png", "jpeg"])
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17
 
18
- if buffer:
19
- # Object Detecting
20
- with st.spinner('Wait for it...'):
21
- # Slider for changing confidence
22
- confidence = st.slider('Confidence Threshold', 0, 100, 30)
23
 
24
- # Calculating time for detection
25
- t1 = time.time()
26
- im = Image.open(buffer)
27
- # im.save("saved_images/image.jpg")
28
- res_img = detect(im, confidence / 100.0)
29
- t2 = time.time()
30
 
31
- # Displaying the image
32
- st.image(res_img, use_column_width=True)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
33
 
34
- # Printing Time
35
- st.write("\n")
36
- st.write("Time taken: ", t2 - t1, "sec.")
37
 
38
 
39
  if __name__ == '__main__':
 
1
+ import contextlib
2
  import time
3
+ from functools import wraps
4
+ from io import StringIO
5
+ from zipfile import ZipFile
6
+
7
  import streamlit as st
8
+ from PIL import Image
9
 
10
+ import evaluator
11
+ from yolo_dataset import YoloDataset
12
  from yolo_fire import detect
13
 
14
 
 
19
  layout="centered")
20
  st.title("Fire&Smoke Detection:")
21
 
22
+ detect_tab, evaluate_tab = st.tabs(["Detect", "Evaluate"])
23
+
24
+ with evaluate_tab:
25
+ buffer = st.file_uploader("Upload your Yolo Dataset here", type=["zip"])
26
+
27
+ if buffer:
28
+ with st.spinner('Wait for it...'):
29
+ # Slider for changing confidence
30
+ confidence = st.slider('Confidence Threshold', 0, 100, 30)
31
+ yolo_dataset = YoloDataset.from_zip_file(ZipFile(buffer))
32
+ capture_output(evaluator.evaluate)(coco_gt=yolo_dataset.to_coco(), loader=yolo_dataset.load_image,
33
+ confidence_threshold=confidence / 100.0)
34
+
35
+ with detect_tab:
36
+ # This will let you upload PNG, JPG & JPEG File
37
+ buffer = st.file_uploader("Upload your Image here", type=["jpg", "png", "jpeg"])
38
+
39
+ if buffer:
40
+ # Object Detecting
41
+ with st.spinner('Wait for it...'):
42
+ # Slider for changing confidence
43
+ confidence = st.slider('Confidence Threshold', 0, 100, 30)
44
+
45
+ # Calculating time for detection
46
+ t1 = time.time()
47
+ im = Image.open(buffer)
48
+ # im.save("saved_images/image.jpg")
49
+ res_img = detect(im, confidence / 100.0)
50
+ t2 = time.time()
51
+
52
+ # Displaying the image
53
+ st.image(res_img, use_column_width=True)
54
+
55
+ # Printing Time
56
+ st.write("\n")
57
+ st.write("Time taken: ", t2 - t1, "sec.")
58
 
 
 
 
 
 
59
 
60
+ def capture_output(func):
61
+ """Capture output from running a function and write using streamlit."""
 
 
 
 
62
 
63
+ @wraps(func)
64
+ def wrapper(*args, **kwargs):
65
+ # Redirect output to string buffers
66
+ stdout, stderr = StringIO(), StringIO()
67
+ try:
68
+ with contextlib.redirect_stdout(stdout), contextlib.redirect_stderr(stderr):
69
+ return func(*args, **kwargs)
70
+ except Exception as err:
71
+ st.write(f"Failure while executing: {err}")
72
+ finally:
73
+ if _stdout := stdout.getvalue():
74
+ st.write("Execution stdout:")
75
+ st.code(_stdout)
76
+ if _stderr := stderr.getvalue():
77
+ st.write("Execution stderr:")
78
+ st.code(_stderr)
79
 
80
+ return wrapper
 
 
81
 
82
 
83
  if __name__ == '__main__':
yolo_dataset.py CHANGED
@@ -12,11 +12,10 @@
12
  # β”œβ”€β”€ 1.txt
13
  # β”œβ”€β”€ 2.txt
14
  # └── ...
15
- import io
16
- import json
17
  from datetime import datetime
18
  from typing import Optional
19
  from zipfile import ZipFile
 
20
  from PIL import Image
21
  from pycocotools import coco
22
  from pycocotools.coco import COCO
@@ -120,8 +119,7 @@ class YoloDataset:
120
  self._labels = labels
121
 
122
  @staticmethod
123
- def from_zip_file(zip_file: str) -> 'YoloDataset':
124
- zip_file = ZipFile(zip_file, 'r')
125
  namelist = zip_file.namelist()
126
  root_name = namelist[0]
127
  namelist = list(filter(lambda x: not zip_file.getinfo(x).is_dir(), namelist))
@@ -140,6 +138,11 @@ class YoloDataset:
140
  assert image_name.split('.')[0] == label_name.split('.')[0]
141
  return YoloDataset(zip_file, classes, images, labels)
142
 
 
 
 
 
 
143
  def __len__(self):
144
  return len(self._images)
145
 
@@ -163,6 +166,9 @@ class YoloDataset:
163
  for i in range(len(self)):
164
  yield self[i]
165
 
 
 
 
166
  def load_image(self, image_name: str) -> Image:
167
  return Image.open(self._zip_file.open(image_name))
168
 
 
12
  # β”œβ”€β”€ 1.txt
13
  # β”œβ”€β”€ 2.txt
14
  # └── ...
 
 
15
  from datetime import datetime
16
  from typing import Optional
17
  from zipfile import ZipFile
18
+
19
  from PIL import Image
20
  from pycocotools import coco
21
  from pycocotools.coco import COCO
 
119
  self._labels = labels
120
 
121
  @staticmethod
122
+ def from_zip_file(zip_file: ZipFile) -> 'YoloDataset':
 
123
  namelist = zip_file.namelist()
124
  root_name = namelist[0]
125
  namelist = list(filter(lambda x: not zip_file.getinfo(x).is_dir(), namelist))
 
138
  assert image_name.split('.')[0] == label_name.split('.')[0]
139
  return YoloDataset(zip_file, classes, images, labels)
140
 
141
+ @staticmethod
142
+ def from_path(path: str) -> 'YoloDataset':
143
+ zip_file = ZipFile(path, 'r')
144
+ return YoloDataset.from_zip_file(zip_file)
145
+
146
  def __len__(self):
147
  return len(self._images)
148
 
 
166
  for i in range(len(self)):
167
  yield self[i]
168
 
169
+ def __deepcopy__(self, memodict=None):
170
+ return YoloDataset(self._zip_file, self._classes, self._images, self._labels)
171
+
172
  def load_image(self, image_name: str) -> Image:
173
  return Image.open(self._zip_file.open(image_name))
174