Spaces:
Runtime error
Runtime error
Update UI
Browse files- .idea/workspace.xml +90 -15
- Dockerfile +2 -1
- demo.py +13 -5
- evaluator.py +29 -10
- tests/coco8.zip +0 -0
- yolo_dataset.py +54 -33
.idea/workspace.xml
CHANGED
|
@@ -4,14 +4,13 @@
|
|
| 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="
|
| 8 |
-
<change afterPath="$PROJECT_DIR$/yolo_model.py" afterDir="false" />
|
| 9 |
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
| 10 |
<change beforePath="$PROJECT_DIR$/Dockerfile" beforeDir="false" afterPath="$PROJECT_DIR$/Dockerfile" afterDir="false" />
|
| 11 |
<change beforePath="$PROJECT_DIR$/demo.py" beforeDir="false" afterPath="$PROJECT_DIR$/demo.py" afterDir="false" />
|
| 12 |
<change beforePath="$PROJECT_DIR$/evaluator.py" beforeDir="false" afterPath="$PROJECT_DIR$/evaluator.py" afterDir="false" />
|
|
|
|
| 13 |
<change beforePath="$PROJECT_DIR$/yolo_dataset.py" beforeDir="false" afterPath="$PROJECT_DIR$/yolo_dataset.py" afterDir="false" />
|
| 14 |
-
<change beforePath="$PROJECT_DIR$/yolo_fire.py" beforeDir="false" />
|
| 15 |
</list>
|
| 16 |
<option name="SHOW_DIALOG" value="false" />
|
| 17 |
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
|
@@ -30,6 +29,21 @@
|
|
| 30 |
<component name="Git.Settings">
|
| 31 |
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
|
| 32 |
</component>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 33 |
<component name="MarkdownSettingsMigration">
|
| 34 |
<option name="stateVersion" value="1" />
|
| 35 |
</component>
|
|
@@ -47,9 +61,10 @@
|
|
| 47 |
</component>
|
| 48 |
<component name="PropertiesComponent"><![CDATA[{
|
| 49 |
"keyToString": {
|
| 50 |
-
"Python.demo.executor": "
|
| 51 |
-
"Python.evaluator.executor": "
|
| 52 |
"Python.extract.executor": "Run",
|
|
|
|
| 53 |
"Python.yolo_dataset.executor": "Run",
|
| 54 |
"RunOnceActivity.OpenProjectViewOnStart": "true",
|
| 55 |
"RunOnceActivity.ShowReadmeOnStart": "true",
|
|
@@ -74,7 +89,7 @@
|
|
| 74 |
<recent name="$PROJECT_DIR$" />
|
| 75 |
</key>
|
| 76 |
</component>
|
| 77 |
-
<component name="RunManager" selected="Python.
|
| 78 |
<configuration name="demo" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
|
| 79 |
<module name="detector" />
|
| 80 |
<option name="ENV_FILES" value="" />
|
|
@@ -121,6 +136,30 @@
|
|
| 121 |
<option name="INPUT_FILE" value="" />
|
| 122 |
<method v="2" />
|
| 123 |
</configuration>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 124 |
<configuration name="yolo_dataset" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
|
| 125 |
<module name="detector" />
|
| 126 |
<option name="ENV_FILES" value="" />
|
|
@@ -150,7 +189,8 @@
|
|
| 150 |
<option name="ENV_FILES" value="" />
|
| 151 |
<option name="INTERPRETER_OPTIONS" value="" />
|
| 152 |
<option name="PARENT_ENVS" value="true" />
|
| 153 |
-
<option name="SDK_HOME" value="" />
|
|
|
|
| 154 |
<option name="WORKING_DIRECTORY" value="" />
|
| 155 |
<option name="IS_MODULE_SDK" value="false" />
|
| 156 |
<option name="ADD_CONTENT_ROOTS" value="true" />
|
|
@@ -159,11 +199,18 @@
|
|
| 159 |
<option name="launchJavascriptDebuger" value="false" />
|
| 160 |
<method v="2" />
|
| 161 |
</configuration>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 162 |
<recent_temporary>
|
| 163 |
<list>
|
| 164 |
-
<item itemvalue="Python.yolo_dataset" />
|
| 165 |
-
<item itemvalue="Python.evaluator" />
|
| 166 |
<item itemvalue="Python.demo" />
|
|
|
|
|
|
|
| 167 |
</list>
|
| 168 |
</recent_temporary>
|
| 169 |
</component>
|
|
@@ -187,7 +234,9 @@
|
|
| 187 |
<workItem from="1702476484538" duration="9613000" />
|
| 188 |
<workItem from="1705757850315" duration="14186000" />
|
| 189 |
<workItem from="1705812482464" duration="711000" />
|
| 190 |
-
<workItem from="1705845330999" duration="
|
|
|
|
|
|
|
| 191 |
</task>
|
| 192 |
<task id="LOCAL-00001" summary="init commit">
|
| 193 |
<option name="closed" value="true" />
|
|
@@ -365,7 +414,15 @@
|
|
| 365 |
<option name="project" value="LOCAL" />
|
| 366 |
<updated>1705771207294</updated>
|
| 367 |
</task>
|
| 368 |
-
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 369 |
<servers />
|
| 370 |
</component>
|
| 371 |
<component name="TypeScriptGeneratedFilesManager">
|
|
@@ -408,12 +465,30 @@
|
|
| 408 |
<MESSAGE value="use /run/secrets" />
|
| 409 |
<MESSAGE value="fix confidence" />
|
| 410 |
<MESSAGE value="IoU evaluator" />
|
| 411 |
-
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 412 |
</component>
|
| 413 |
<component name="com.intellij.coverage.CoverageDataManagerImpl">
|
| 414 |
-
<SUITE FILE_PATH="coverage/detector$yolo_dataset.coverage" NAME="yolo_dataset Coverage Results" MODIFIED="
|
| 415 |
-
<SUITE FILE_PATH="coverage/detector$
|
| 416 |
-
<SUITE FILE_PATH="coverage/detector$
|
|
|
|
| 417 |
<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$" />
|
| 418 |
</component>
|
| 419 |
</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="Update UI">
|
|
|
|
| 8 |
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
| 9 |
<change beforePath="$PROJECT_DIR$/Dockerfile" beforeDir="false" afterPath="$PROJECT_DIR$/Dockerfile" afterDir="false" />
|
| 10 |
<change beforePath="$PROJECT_DIR$/demo.py" beforeDir="false" afterPath="$PROJECT_DIR$/demo.py" afterDir="false" />
|
| 11 |
<change beforePath="$PROJECT_DIR$/evaluator.py" beforeDir="false" afterPath="$PROJECT_DIR$/evaluator.py" afterDir="false" />
|
| 12 |
+
<change beforePath="$PROJECT_DIR$/tests/coco8.zip" beforeDir="false" afterPath="$PROJECT_DIR$/tests/coco8.zip" afterDir="false" />
|
| 13 |
<change beforePath="$PROJECT_DIR$/yolo_dataset.py" beforeDir="false" afterPath="$PROJECT_DIR$/yolo_dataset.py" afterDir="false" />
|
|
|
|
| 14 |
</list>
|
| 15 |
<option name="SHOW_DIALOG" value="false" />
|
| 16 |
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
|
|
|
| 29 |
<component name="Git.Settings">
|
| 30 |
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
|
| 31 |
</component>
|
| 32 |
+
<component name="HighlightingSettingsPerFile">
|
| 33 |
+
<setting file="file://$USER_HOME$/Library/Caches/JetBrains/PyCharm2023.3/python_stubs/580317742/posix.py" root0="SKIP_INSPECTION" />
|
| 34 |
+
<setting file="file:///opt/homebrew/anaconda3/envs/detector/lib/python3.10/site-packages/torch/utils/_contextlib.py" root0="SKIP_INSPECTION" />
|
| 35 |
+
<setting file="file:///opt/homebrew/anaconda3/envs/detector/lib/python3.10/site-packages/ultralytics/data/base.py" root0="SKIP_INSPECTION" />
|
| 36 |
+
<setting file="file:///opt/homebrew/anaconda3/envs/detector/lib/python3.10/site-packages/ultralytics/data/build.py" root0="SKIP_INSPECTION" />
|
| 37 |
+
<setting file="file:///opt/homebrew/anaconda3/envs/detector/lib/python3.10/site-packages/ultralytics/data/dataset.py" root0="SKIP_INSPECTION" />
|
| 38 |
+
<setting file="file:///opt/homebrew/anaconda3/envs/detector/lib/python3.10/site-packages/ultralytics/data/utils.py" root0="SKIP_INSPECTION" />
|
| 39 |
+
<setting file="file:///opt/homebrew/anaconda3/envs/detector/lib/python3.10/site-packages/ultralytics/engine/model.py" root0="SKIP_INSPECTION" />
|
| 40 |
+
<setting file="file:///opt/homebrew/anaconda3/envs/detector/lib/python3.10/site-packages/ultralytics/engine/validator.py" root0="SKIP_INSPECTION" />
|
| 41 |
+
<setting file="file:///opt/homebrew/anaconda3/envs/detector/lib/python3.10/site-packages/ultralytics/models/yolo/detect/val.py" root0="SKIP_INSPECTION" />
|
| 42 |
+
<setting file="file:///opt/homebrew/anaconda3/envs/detector/lib/python3.10/site-packages/ultralytics/utils/checks.py" root0="SKIP_INSPECTION" />
|
| 43 |
+
<setting file="file:///opt/homebrew/anaconda3/envs/detector/lib/python3.10/site-packages/ultralytics/utils/metrics.py" root0="SKIP_INSPECTION" />
|
| 44 |
+
<setting file="file:///opt/homebrew/anaconda3/envs/detector/lib/python3.10/site-packages/yaml/scanner.py" root0="SKIP_INSPECTION" />
|
| 45 |
+
<setting file="file:///opt/homebrew/anaconda3/envs/detector/lib/python3.10/zipfile.py" root0="SKIP_INSPECTION" />
|
| 46 |
+
</component>
|
| 47 |
<component name="MarkdownSettingsMigration">
|
| 48 |
<option name="stateVersion" value="1" />
|
| 49 |
</component>
|
|
|
|
| 61 |
</component>
|
| 62 |
<component name="PropertiesComponent"><![CDATA[{
|
| 63 |
"keyToString": {
|
| 64 |
+
"Python.demo.executor": "Debug",
|
| 65 |
+
"Python.evaluator.executor": "Debug",
|
| 66 |
"Python.extract.executor": "Run",
|
| 67 |
+
"Python.streamlit.executor": "Debug",
|
| 68 |
"Python.yolo_dataset.executor": "Run",
|
| 69 |
"RunOnceActivity.OpenProjectViewOnStart": "true",
|
| 70 |
"RunOnceActivity.ShowReadmeOnStart": "true",
|
|
|
|
| 89 |
<recent name="$PROJECT_DIR$" />
|
| 90 |
</key>
|
| 91 |
</component>
|
| 92 |
+
<component name="RunManager" selected="Python.streamlit">
|
| 93 |
<configuration name="demo" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
|
| 94 |
<module name="detector" />
|
| 95 |
<option name="ENV_FILES" value="" />
|
|
|
|
| 136 |
<option name="INPUT_FILE" value="" />
|
| 137 |
<method v="2" />
|
| 138 |
</configuration>
|
| 139 |
+
<configuration name="streamlit" type="PythonConfigurationType" factoryName="Python" nameIsGenerated="true">
|
| 140 |
+
<module name="detector" />
|
| 141 |
+
<option name="ENV_FILES" value="" />
|
| 142 |
+
<option name="INTERPRETER_OPTIONS" value="" />
|
| 143 |
+
<option name="PARENT_ENVS" value="true" />
|
| 144 |
+
<envs>
|
| 145 |
+
<env name="PYTHONUNBUFFERED" value="1" />
|
| 146 |
+
</envs>
|
| 147 |
+
<option name="SDK_HOME" value="" />
|
| 148 |
+
<option name="SDK_NAME" value="detector" />
|
| 149 |
+
<option name="WORKING_DIRECTORY" value="" />
|
| 150 |
+
<option name="IS_MODULE_SDK" value="false" />
|
| 151 |
+
<option name="ADD_CONTENT_ROOTS" value="true" />
|
| 152 |
+
<option name="ADD_SOURCE_ROOTS" value="true" />
|
| 153 |
+
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
|
| 154 |
+
<option name="SCRIPT_NAME" value="streamlit" />
|
| 155 |
+
<option name="PARAMETERS" value="run demo.py" />
|
| 156 |
+
<option name="SHOW_COMMAND_LINE" value="false" />
|
| 157 |
+
<option name="EMULATE_TERMINAL" value="false" />
|
| 158 |
+
<option name="MODULE_MODE" value="true" />
|
| 159 |
+
<option name="REDIRECT_INPUT" value="false" />
|
| 160 |
+
<option name="INPUT_FILE" value="" />
|
| 161 |
+
<method v="2" />
|
| 162 |
+
</configuration>
|
| 163 |
<configuration name="yolo_dataset" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
|
| 164 |
<module name="detector" />
|
| 165 |
<option name="ENV_FILES" value="" />
|
|
|
|
| 189 |
<option name="ENV_FILES" value="" />
|
| 190 |
<option name="INTERPRETER_OPTIONS" value="" />
|
| 191 |
<option name="PARENT_ENVS" value="true" />
|
| 192 |
+
<option name="SDK_HOME" value="/opt/homebrew/anaconda3/envs/detector/bin/python" />
|
| 193 |
+
<option name="SDK_NAME" value="detector" />
|
| 194 |
<option name="WORKING_DIRECTORY" value="" />
|
| 195 |
<option name="IS_MODULE_SDK" value="false" />
|
| 196 |
<option name="ADD_CONTENT_ROOTS" value="true" />
|
|
|
|
| 199 |
<option name="launchJavascriptDebuger" value="false" />
|
| 200 |
<method v="2" />
|
| 201 |
</configuration>
|
| 202 |
+
<list>
|
| 203 |
+
<item itemvalue="FastAPI.detector" />
|
| 204 |
+
<item itemvalue="Python.streamlit" />
|
| 205 |
+
<item itemvalue="Python.demo" />
|
| 206 |
+
<item itemvalue="Python.evaluator" />
|
| 207 |
+
<item itemvalue="Python.yolo_dataset" />
|
| 208 |
+
</list>
|
| 209 |
<recent_temporary>
|
| 210 |
<list>
|
|
|
|
|
|
|
| 211 |
<item itemvalue="Python.demo" />
|
| 212 |
+
<item itemvalue="Python.evaluator" />
|
| 213 |
+
<item itemvalue="Python.yolo_dataset" />
|
| 214 |
</list>
|
| 215 |
</recent_temporary>
|
| 216 |
</component>
|
|
|
|
| 234 |
<workItem from="1702476484538" duration="9613000" />
|
| 235 |
<workItem from="1705757850315" duration="14186000" />
|
| 236 |
<workItem from="1705812482464" duration="711000" />
|
| 237 |
+
<workItem from="1705845330999" duration="11089000" />
|
| 238 |
+
<workItem from="1706104589422" duration="517000" />
|
| 239 |
+
<workItem from="1706105118954" duration="3764000" />
|
| 240 |
</task>
|
| 241 |
<task id="LOCAL-00001" summary="init commit">
|
| 242 |
<option name="closed" value="true" />
|
|
|
|
| 414 |
<option name="project" value="LOCAL" />
|
| 415 |
<updated>1705771207294</updated>
|
| 416 |
</task>
|
| 417 |
+
<task id="LOCAL-00023" summary="Update UI">
|
| 418 |
+
<option name="closed" value="true" />
|
| 419 |
+
<created>1705850745341</created>
|
| 420 |
+
<option name="number" value="00023" />
|
| 421 |
+
<option name="presentableId" value="LOCAL-00023" />
|
| 422 |
+
<option name="project" value="LOCAL" />
|
| 423 |
+
<updated>1705850745341</updated>
|
| 424 |
+
</task>
|
| 425 |
+
<option name="localTasksCounter" value="24" />
|
| 426 |
<servers />
|
| 427 |
</component>
|
| 428 |
<component name="TypeScriptGeneratedFilesManager">
|
|
|
|
| 465 |
<MESSAGE value="use /run/secrets" />
|
| 466 |
<MESSAGE value="fix confidence" />
|
| 467 |
<MESSAGE value="IoU evaluator" />
|
| 468 |
+
<MESSAGE value="Update UI" />
|
| 469 |
+
<option name="LAST_COMMIT_MESSAGE" value="Update UI" />
|
| 470 |
+
</component>
|
| 471 |
+
<component name="XDebuggerManager">
|
| 472 |
+
<breakpoint-manager>
|
| 473 |
+
<breakpoints>
|
| 474 |
+
<line-breakpoint enabled="true" suspend="THREAD" type="python-line">
|
| 475 |
+
<url>file:///opt/homebrew/anaconda3/envs/detector/lib/python3.10/site-packages/ultralytics/data/utils.py</url>
|
| 476 |
+
<line>311</line>
|
| 477 |
+
<option name="timeStamp" value="9" />
|
| 478 |
+
</line-breakpoint>
|
| 479 |
+
<line-breakpoint enabled="true" suspend="THREAD" type="python-line">
|
| 480 |
+
<url>file://$PROJECT_DIR$/evaluator.py</url>
|
| 481 |
+
<line>77</line>
|
| 482 |
+
<option name="timeStamp" value="17" />
|
| 483 |
+
</line-breakpoint>
|
| 484 |
+
</breakpoints>
|
| 485 |
+
</breakpoint-manager>
|
| 486 |
</component>
|
| 487 |
<component name="com.intellij.coverage.CoverageDataManagerImpl">
|
| 488 |
+
<SUITE FILE_PATH="coverage/detector$yolo_dataset.coverage" NAME="yolo_dataset Coverage Results" MODIFIED="1705852113469" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
|
| 489 |
+
<SUITE FILE_PATH="coverage/detector$evaluator.coverage" NAME="evaluator Coverage Results" MODIFIED="1706107083258" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
|
| 490 |
+
<SUITE FILE_PATH="coverage/detector$demo.coverage" NAME="demo Coverage Results" MODIFIED="1706108414052" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
|
| 491 |
+
<SUITE FILE_PATH="coverage/detector$streamlit.coverage" NAME="streamlit Coverage Results" MODIFIED="1706108547026" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="" />
|
| 492 |
<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$" />
|
| 493 |
</component>
|
| 494 |
</project>
|
Dockerfile
CHANGED
|
@@ -14,5 +14,6 @@ RUN pip install -r requirements.txt
|
|
| 14 |
RUN --mount=type=secret,id=HF_TOKEN,mode=0444,required=true \
|
| 15 |
HF_TOKEN=$(cat /run/secrets/HF_TOKEN) python yolo_model.py \
|
| 16 |
--weight_files=SHOU-ISD/fire-and-smoke:yolov8n.pt \
|
| 17 |
-
--weight_files=SHOU-ISD/yolo-cracks:best.pt
|
|
|
|
| 18 |
ENTRYPOINT ["streamlit", "run", "demo.py"]
|
|
|
|
| 14 |
RUN --mount=type=secret,id=HF_TOKEN,mode=0444,required=true \
|
| 15 |
HF_TOKEN=$(cat /run/secrets/HF_TOKEN) python yolo_model.py \
|
| 16 |
--weight_files=SHOU-ISD/fire-and-smoke:yolov8n.pt \
|
| 17 |
+
--weight_files=SHOU-ISD/yolo-cracks:best.pt \
|
| 18 |
+
--weight_files=ultralyticsplus/yolov8s:yolov8s.pt
|
| 19 |
ENTRYPOINT ["streamlit", "run", "demo.py"]
|
demo.py
CHANGED
|
@@ -1,4 +1,5 @@
|
|
| 1 |
import contextlib
|
|
|
|
| 2 |
import time
|
| 3 |
from functools import wraps
|
| 4 |
from io import StringIO
|
|
@@ -13,6 +14,7 @@ from yolo_model import YoloModel
|
|
| 13 |
|
| 14 |
fire_and_smoke = YoloModel("SHOU-ISD/fire-and-smoke", "yolov8n.pt")
|
| 15 |
crack = YoloModel("SHOU-ISD/yolo-cracks", "best.pt")
|
|
|
|
| 16 |
|
| 17 |
|
| 18 |
def main():
|
|
@@ -22,13 +24,14 @@ def main():
|
|
| 22 |
layout="centered")
|
| 23 |
|
| 24 |
model = None
|
| 25 |
-
model_choice = None
|
| 26 |
with st.sidebar:
|
| 27 |
-
model_choice = st.radio("Select Model", ["Fire&Smoke", "Crack"])
|
| 28 |
if model_choice == "Fire&Smoke":
|
| 29 |
model = fire_and_smoke
|
| 30 |
elif model_choice == "Crack":
|
| 31 |
model = crack
|
|
|
|
|
|
|
| 32 |
|
| 33 |
st.title(f"{model_choice} Detection:")
|
| 34 |
|
|
@@ -48,9 +51,14 @@ def evaluate(model: YoloModel):
|
|
| 48 |
# Slider for changing confidence
|
| 49 |
confidence = st.slider('Confidence Threshold', 0, 100, 30)
|
| 50 |
yolo_dataset = YoloDataset.from_zip_file(ZipFile(buffer))
|
| 51 |
-
capture_output(evaluator.evaluate)(model=model.model,
|
| 52 |
-
|
| 53 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 54 |
|
| 55 |
|
| 56 |
def detect(model: YoloModel):
|
|
|
|
| 1 |
import contextlib
|
| 2 |
+
import os
|
| 3 |
import time
|
| 4 |
from functools import wraps
|
| 5 |
from io import StringIO
|
|
|
|
| 14 |
|
| 15 |
fire_and_smoke = YoloModel("SHOU-ISD/fire-and-smoke", "yolov8n.pt")
|
| 16 |
crack = YoloModel("SHOU-ISD/yolo-cracks", "best.pt")
|
| 17 |
+
coco = YoloModel("ultralyticsplus/yolov8s", "yolov8s.pt")
|
| 18 |
|
| 19 |
|
| 20 |
def main():
|
|
|
|
| 24 |
layout="centered")
|
| 25 |
|
| 26 |
model = None
|
|
|
|
| 27 |
with st.sidebar:
|
| 28 |
+
model_choice = st.radio("Select Model", ["Fire&Smoke", "Crack", "Coco"])
|
| 29 |
if model_choice == "Fire&Smoke":
|
| 30 |
model = fire_and_smoke
|
| 31 |
elif model_choice == "Crack":
|
| 32 |
model = crack
|
| 33 |
+
elif model_choice == "Coco":
|
| 34 |
+
model = coco
|
| 35 |
|
| 36 |
st.title(f"{model_choice} Detection:")
|
| 37 |
|
|
|
|
| 51 |
# Slider for changing confidence
|
| 52 |
confidence = st.slider('Confidence Threshold', 0, 100, 30)
|
| 53 |
yolo_dataset = YoloDataset.from_zip_file(ZipFile(buffer))
|
| 54 |
+
metrics_res = capture_output(evaluator.evaluate)(model=model.model,
|
| 55 |
+
dataset=yolo_dataset,
|
| 56 |
+
confidence_threshold=confidence / 100.0)
|
| 57 |
+
with metrics_res as metrics:
|
| 58 |
+
st.json(metrics.speed)
|
| 59 |
+
st.json(metrics.result_dict)
|
| 60 |
+
for pic in os.listdir(metrics.val.save_dir):
|
| 61 |
+
st.image(os.path.join(metrics.val.save_dir, pic), use_column_width=True)
|
| 62 |
|
| 63 |
|
| 64 |
def detect(model: YoloModel):
|
evaluator.py
CHANGED
|
@@ -1,17 +1,18 @@
|
|
|
|
|
| 1 |
from typing import Callable
|
| 2 |
|
| 3 |
from PIL.Image import Image
|
| 4 |
from coco_eval import CocoEvaluator
|
| 5 |
-
from pycocotools.coco import COCO
|
| 6 |
from tqdm import tqdm
|
| 7 |
|
| 8 |
-
from yolo_dataset import YoloDataset
|
| 9 |
from yolo_model import YoloModel
|
| 10 |
|
| 11 |
image_loader = Callable[[str], Image]
|
| 12 |
|
| 13 |
|
| 14 |
-
def evaluate(model: YoloModel,
|
|
|
|
| 15 |
# initialize evaluator with ground truth (gt)
|
| 16 |
evaluator = CocoEvaluator(coco_gt=coco_gt, iou_types=["bbox"])
|
| 17 |
|
|
@@ -19,7 +20,7 @@ def evaluate(model: YoloModel, coco_gt: COCO, loader: image_loader, confidence_t
|
|
| 19 |
for image_id, annotations in tqdm(coco_gt.imgToAnns.items()):
|
| 20 |
# get the inputs
|
| 21 |
image = coco_gt.imgs[image_id]
|
| 22 |
-
results = model.model(source=
|
| 23 |
for result in results:
|
| 24 |
coco_anns = yolo_boxes_to_coco_annotations(image_id, result.boxes,
|
| 25 |
confidence_threshold=confidence_threshold)
|
|
@@ -33,6 +34,23 @@ def evaluate(model: YoloModel, coco_gt: COCO, loader: image_loader, confidence_t
|
|
| 33 |
evaluator.synchronize_between_processes()
|
| 34 |
evaluator.accumulate()
|
| 35 |
evaluator.summarize()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 36 |
|
| 37 |
|
| 38 |
def yolo_boxes_to_coco_annotations(image_id: int, yolo_boxes, confidence_threshold=0.6):
|
|
@@ -53,13 +71,14 @@ def main():
|
|
| 53 |
coco_gt = yolo_dataset.to_coco()
|
| 54 |
model = YoloModel("ultralyticsplus/yolov8s", "yolov8s.pt")
|
| 55 |
# model = YoloModel("SHOU-ISD/fire-and-smoke", "yolov8n.pt")
|
| 56 |
-
evaluate(model=model, coco_gt=coco_gt, loader=yolo_dataset.load_image, confidence_threshold=0.1)
|
| 57 |
# Validate the model
|
| 58 |
-
|
| 59 |
-
|
| 60 |
-
|
| 61 |
-
|
| 62 |
-
|
|
|
|
| 63 |
|
| 64 |
|
| 65 |
if __name__ == '__main__':
|
|
|
|
| 1 |
+
import shutil
|
| 2 |
from typing import Callable
|
| 3 |
|
| 4 |
from PIL.Image import Image
|
| 5 |
from coco_eval import CocoEvaluator
|
|
|
|
| 6 |
from tqdm import tqdm
|
| 7 |
|
| 8 |
+
from yolo_dataset import YoloDataset, MaterialYoloDataset
|
| 9 |
from yolo_model import YoloModel
|
| 10 |
|
| 11 |
image_loader = Callable[[str], Image]
|
| 12 |
|
| 13 |
|
| 14 |
+
def evaluate(model: YoloModel, dataset: YoloDataset, confidence_threshold=0.6):
|
| 15 |
+
coco_gt = dataset.to_coco()
|
| 16 |
# initialize evaluator with ground truth (gt)
|
| 17 |
evaluator = CocoEvaluator(coco_gt=coco_gt, iou_types=["bbox"])
|
| 18 |
|
|
|
|
| 20 |
for image_id, annotations in tqdm(coco_gt.imgToAnns.items()):
|
| 21 |
# get the inputs
|
| 22 |
image = coco_gt.imgs[image_id]
|
| 23 |
+
results = model.model(source=dataset.load_image(image["file_name"]))
|
| 24 |
for result in results:
|
| 25 |
coco_anns = yolo_boxes_to_coco_annotations(image_id, result.boxes,
|
| 26 |
confidence_threshold=confidence_threshold)
|
|
|
|
| 34 |
evaluator.synchronize_between_processes()
|
| 35 |
evaluator.accumulate()
|
| 36 |
evaluator.summarize()
|
| 37 |
+
return Metrics(model=model, material=dataset.to_material())
|
| 38 |
+
|
| 39 |
+
|
| 40 |
+
class Metrics:
|
| 41 |
+
def __init__(self, model: YoloModel, material: MaterialYoloDataset):
|
| 42 |
+
self.model = model
|
| 43 |
+
self.material = material
|
| 44 |
+
self.val = None
|
| 45 |
+
|
| 46 |
+
def __enter__(self):
|
| 47 |
+
if self.val is None:
|
| 48 |
+
self.val = self.model.model.val(data=self.material.yaml)
|
| 49 |
+
return self.val
|
| 50 |
+
|
| 51 |
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
| 52 |
+
self.material.__exit__(exc_type, exc_val, exc_tb)
|
| 53 |
+
shutil.rmtree(self.val.save_dir)
|
| 54 |
|
| 55 |
|
| 56 |
def yolo_boxes_to_coco_annotations(image_id: int, yolo_boxes, confidence_threshold=0.6):
|
|
|
|
| 71 |
coco_gt = yolo_dataset.to_coco()
|
| 72 |
model = YoloModel("ultralyticsplus/yolov8s", "yolov8s.pt")
|
| 73 |
# model = YoloModel("SHOU-ISD/fire-and-smoke", "yolov8n.pt")
|
| 74 |
+
# evaluate(model=model, coco_gt=coco_gt, loader=yolo_dataset.load_image, confidence_threshold=0.1)
|
| 75 |
# Validate the model
|
| 76 |
+
with yolo_dataset.to_material() as material:
|
| 77 |
+
metrics = model.model.val(data=material.yaml)
|
| 78 |
+
print(metrics.box.map) # map50-95
|
| 79 |
+
print(metrics.box.map50) # map50
|
| 80 |
+
print(metrics.box.map75) # map75
|
| 81 |
+
print(metrics.box.maps) # a list contains map50-95 of each category
|
| 82 |
|
| 83 |
|
| 84 |
if __name__ == '__main__':
|
tests/coco8.zip
CHANGED
|
Binary files a/tests/coco8.zip and b/tests/coco8.zip differ
|
|
|
yolo_dataset.py
CHANGED
|
@@ -12,7 +12,6 @@
|
|
| 12 |
# βββ 1.txt
|
| 13 |
# βββ 2.txt
|
| 14 |
# βββ ...
|
| 15 |
-
import os
|
| 16 |
import pathlib
|
| 17 |
import shutil
|
| 18 |
from datetime import datetime
|
|
@@ -20,7 +19,6 @@ from typing import Optional
|
|
| 20 |
from zipfile import ZipFile
|
| 21 |
|
| 22 |
from PIL import Image
|
| 23 |
-
from pycocotools import coco
|
| 24 |
from pycocotools.coco import COCO
|
| 25 |
|
| 26 |
yolo_label = {
|
|
@@ -126,8 +124,9 @@ class YoloDataset:
|
|
| 126 |
namelist = zip_file.namelist()
|
| 127 |
root_name = namelist[0]
|
| 128 |
namelist = list(filter(lambda x: not zip_file.getinfo(x).is_dir(), namelist))
|
| 129 |
-
|
| 130 |
-
|
|
|
|
| 131 |
else:
|
| 132 |
classes = []
|
| 133 |
images = list(filter(lambda x: x.startswith(root_name + 'images'), namelist))
|
|
@@ -192,7 +191,7 @@ class YoloDataset:
|
|
| 192 |
"supercategory": None,
|
| 193 |
})
|
| 194 |
|
| 195 |
-
coco_ds =
|
| 196 |
coco_ds.dataset = {
|
| 197 |
"images": images,
|
| 198 |
"annotations": annotations,
|
|
@@ -201,36 +200,58 @@ class YoloDataset:
|
|
| 201 |
coco_ds.createIndex()
|
| 202 |
return coco_ds
|
| 203 |
|
| 204 |
-
def
|
| 205 |
-
|
| 206 |
-
:return: Yaml format in
|
| 207 |
-
<code>
|
| 208 |
-
path: ../datasets/coco128 # dataset root dir
|
| 209 |
-
val: images/train2017 # val images (relative to 'path') 128 images
|
| 210 |
-
|
| 211 |
-
# Classes
|
| 212 |
-
names:
|
| 213 |
-
0: person
|
| 214 |
-
</code>
|
| 215 |
-
"""
|
| 216 |
-
try:
|
| 217 |
-
# recursively create dir
|
| 218 |
-
pathlib.Path(f'datasets/{self._zip_file.filename}').mkdir(parents=True, exist_ok=True)
|
| 219 |
-
self._zip_file.extractall(f'datasets/{self._zip_file.filename}')
|
| 220 |
-
with open(f'datasets/{self._zip_file.filename}/data.yaml', 'w') as f:
|
| 221 |
-
f.write(f'path: ../datasets/{self._zip_file.filename}\n')
|
| 222 |
-
f.write(f'val: images/train2017\n')
|
| 223 |
-
f.write(f'\n')
|
| 224 |
-
f.write(f'# Classes\n')
|
| 225 |
-
f.write(f'names:\n')
|
| 226 |
-
for i in range(len(self._classes)):
|
| 227 |
-
f.write(f' {i}: {self._classes[i]}\n')
|
| 228 |
-
finally:
|
| 229 |
-
shutil.rmtree(f'datasets/{self._zip_file.filename}')
|
| 230 |
|
|
|
|
|
|
|
|
|
|
| 231 |
|
| 232 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 233 |
dataset = YoloDataset.from_path('tests/coco8.zip')
|
| 234 |
coco = dataset.to_coco()
|
| 235 |
print(coco)
|
| 236 |
-
dataset.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 12 |
# βββ 1.txt
|
| 13 |
# βββ 2.txt
|
| 14 |
# βββ ...
|
|
|
|
| 15 |
import pathlib
|
| 16 |
import shutil
|
| 17 |
from datetime import datetime
|
|
|
|
| 19 |
from zipfile import ZipFile
|
| 20 |
|
| 21 |
from PIL import Image
|
|
|
|
| 22 |
from pycocotools.coco import COCO
|
| 23 |
|
| 24 |
yolo_label = {
|
|
|
|
| 124 |
namelist = zip_file.namelist()
|
| 125 |
root_name = namelist[0]
|
| 126 |
namelist = list(filter(lambda x: not zip_file.getinfo(x).is_dir(), namelist))
|
| 127 |
+
cls_filename = root_name + 'classes.txt'
|
| 128 |
+
if cls_filename in namelist:
|
| 129 |
+
classes = zip_file.read(cls_filename).decode('utf-8').split('\n')
|
| 130 |
else:
|
| 131 |
classes = []
|
| 132 |
images = list(filter(lambda x: x.startswith(root_name + 'images'), namelist))
|
|
|
|
| 191 |
"supercategory": None,
|
| 192 |
})
|
| 193 |
|
| 194 |
+
coco_ds = COCO()
|
| 195 |
coco_ds.dataset = {
|
| 196 |
"images": images,
|
| 197 |
"annotations": annotations,
|
|
|
|
| 200 |
coco_ds.createIndex()
|
| 201 |
return coco_ds
|
| 202 |
|
| 203 |
+
def to_material(self):
|
| 204 |
+
return MaterialYoloDataset(self)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 205 |
|
| 206 |
+
@property
|
| 207 |
+
def zip_file(self):
|
| 208 |
+
return self._zip_file
|
| 209 |
|
| 210 |
+
@property
|
| 211 |
+
def classes(self):
|
| 212 |
+
return self._classes
|
| 213 |
+
|
| 214 |
+
|
| 215 |
+
class MaterialYoloDataset:
|
| 216 |
+
def __init__(self, dataset: YoloDataset):
|
| 217 |
+
print(dataset.to_coco().cats)
|
| 218 |
+
self._classes = dataset.classes
|
| 219 |
+
self._zip_file = dataset.zip_file
|
| 220 |
+
self._root = self._zip_file.namelist()[0][:-1]
|
| 221 |
+
|
| 222 |
+
def __enter__(self):
|
| 223 |
+
# recursively create dir
|
| 224 |
+
dataset_path = pathlib.Path(f'./datasets/')
|
| 225 |
+
dataset_path.mkdir(parents=True, exist_ok=True)
|
| 226 |
+
self._zip_file.extractall(f'./datasets/')
|
| 227 |
+
with open(f'./datasets/{self._root}/data.yaml', 'w+') as f:
|
| 228 |
+
f.write(f'path: {dataset_path.absolute()}/{self._root}/\n')
|
| 229 |
+
f.write(f'train: images/train\n')
|
| 230 |
+
f.write(f'val: images/val\n')
|
| 231 |
+
f.write(f'\n')
|
| 232 |
+
f.write(f'# Classes\n')
|
| 233 |
+
f.write(f'names:\n')
|
| 234 |
+
for i in range(len(self._classes)):
|
| 235 |
+
f.write(f' {i}: {self._classes[i]}\n')
|
| 236 |
+
else:
|
| 237 |
+
for i in range(0, 2):
|
| 238 |
+
f.write(f' {i}: unknown\n')
|
| 239 |
+
return self
|
| 240 |
+
|
| 241 |
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
| 242 |
+
shutil.rmtree(f'./datasets/{self._root}')
|
| 243 |
+
|
| 244 |
+
@property
|
| 245 |
+
def yaml(self):
|
| 246 |
+
return pathlib.Path(f'./datasets/{self._root}/data.yaml').absolute()
|
| 247 |
+
|
| 248 |
+
|
| 249 |
+
def main():
|
| 250 |
dataset = YoloDataset.from_path('tests/coco8.zip')
|
| 251 |
coco = dataset.to_coco()
|
| 252 |
print(coco)
|
| 253 |
+
print(dataset.to_material().yaml)
|
| 254 |
+
|
| 255 |
+
|
| 256 |
+
if __name__ == '__main__':
|
| 257 |
+
main()
|