Spaces:
Running
Running
Upload 15 files
Browse files- .gitattributes +7 -0
- ai-powered-object-detection/.gitattributes +345 -0
- ai-powered-object-detection/README.md +96 -0
- ai-powered-object-detection/app.js +310 -0
- ai-powered-object-detection/detector.js +50 -0
- ai-powered-object-detection/examples/000000037777.jpg +0 -0
- ai-powered-object-detection/examples/000000039769.jpg +3 -0
- ai-powered-object-detection/examples/000000087038.jpg +3 -0
- ai-powered-object-detection/examples/000000174482.jpg +3 -0
- ai-powered-object-detection/examples/000000181666.jpg +3 -0
- ai-powered-object-detection/examples/000000252219.jpg +3 -0
- ai-powered-object-detection/examples/000000376310.jpg +3 -0
- ai-powered-object-detection/examples/000000397133.jpg +3 -0
- ai-powered-object-detection/examples/coco_val2017_subset.csv +9 -0
- ai-powered-object-detection/index.html +130 -0
- ai-powered-object-detection/style.css +477 -0
.gitattributes
CHANGED
|
@@ -33,3 +33,10 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
|
| 33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
| 36 |
+
ai-powered-object-detection/examples/000000039769.jpg filter=lfs diff=lfs merge=lfs -text
|
| 37 |
+
ai-powered-object-detection/examples/000000087038.jpg filter=lfs diff=lfs merge=lfs -text
|
| 38 |
+
ai-powered-object-detection/examples/000000174482.jpg filter=lfs diff=lfs merge=lfs -text
|
| 39 |
+
ai-powered-object-detection/examples/000000181666.jpg filter=lfs diff=lfs merge=lfs -text
|
| 40 |
+
ai-powered-object-detection/examples/000000252219.jpg filter=lfs diff=lfs merge=lfs -text
|
| 41 |
+
ai-powered-object-detection/examples/000000376310.jpg filter=lfs diff=lfs merge=lfs -text
|
| 42 |
+
ai-powered-object-detection/examples/000000397133.jpg filter=lfs diff=lfs merge=lfs -text
|
ai-powered-object-detection/.gitattributes
ADDED
|
@@ -0,0 +1,345 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
+
*.tar filter=lfs diff=lfs merge=lfs -text
|
| 29 |
+
*.tflite filter=lfs diff=lfs merge=lfs -text
|
| 30 |
+
*.tgz filter=lfs diff=lfs merge=lfs -text
|
| 31 |
+
*.wasm filter=lfs diff=lfs merge=lfs -text
|
| 32 |
+
*.xz filter=lfs diff=lfs merge=lfs -text
|
| 33 |
+
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
+
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
+
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
| 36 |
+
examples/000000039769.jpg filter=lfs diff=lfs merge=lfs -text
|
| 37 |
+
examples/000000087038.jpg filter=lfs diff=lfs merge=lfs -text
|
| 38 |
+
examples/000000174482.jpg filter=lfs diff=lfs merge=lfs -text
|
| 39 |
+
examples/000000181666.jpg filter=lfs diff=lfs merge=lfs -text
|
| 40 |
+
examples/000000252219.jpg filter=lfs diff=lfs merge=lfs -text
|
| 41 |
+
examples/000000376310.jpg filter=lfs diff=lfs merge=lfs -text
|
| 42 |
+
examples/000000397133.jpg filter=lfs diff=lfs merge=lfs -text
|
| 43 |
+
.venv-course-check/lib/python3.12/site-packages/PIL/.dylibs/libavif.16.4.2.dylib filter=lfs diff=lfs merge=lfs -text
|
| 44 |
+
.venv-course-check/lib/python3.12/site-packages/PIL/.dylibs/libbrotlicommon.1.2.0.dylib filter=lfs diff=lfs merge=lfs -text
|
| 45 |
+
.venv-course-check/lib/python3.12/site-packages/PIL/.dylibs/libbrotlidec.1.2.0.dylib filter=lfs diff=lfs merge=lfs -text
|
| 46 |
+
.venv-course-check/lib/python3.12/site-packages/PIL/.dylibs/libfreetype.6.dylib filter=lfs diff=lfs merge=lfs -text
|
| 47 |
+
.venv-course-check/lib/python3.12/site-packages/PIL/.dylibs/libharfbuzz.0.dylib filter=lfs diff=lfs merge=lfs -text
|
| 48 |
+
.venv-course-check/lib/python3.12/site-packages/PIL/.dylibs/libjpeg.62.4.0.dylib filter=lfs diff=lfs merge=lfs -text
|
| 49 |
+
.venv-course-check/lib/python3.12/site-packages/PIL/.dylibs/liblcms2.2.dylib filter=lfs diff=lfs merge=lfs -text
|
| 50 |
+
.venv-course-check/lib/python3.12/site-packages/PIL/.dylibs/liblzma.5.dylib filter=lfs diff=lfs merge=lfs -text
|
| 51 |
+
.venv-course-check/lib/python3.12/site-packages/PIL/.dylibs/libopenjp2.2.5.4.dylib filter=lfs diff=lfs merge=lfs -text
|
| 52 |
+
.venv-course-check/lib/python3.12/site-packages/PIL/.dylibs/libpng16.16.dylib filter=lfs diff=lfs merge=lfs -text
|
| 53 |
+
.venv-course-check/lib/python3.12/site-packages/PIL/.dylibs/libtiff.6.dylib filter=lfs diff=lfs merge=lfs -text
|
| 54 |
+
.venv-course-check/lib/python3.12/site-packages/PIL/.dylibs/libwebp.7.dylib filter=lfs diff=lfs merge=lfs -text
|
| 55 |
+
.venv-course-check/lib/python3.12/site-packages/PIL/.dylibs/libwebpmux.3.dylib filter=lfs diff=lfs merge=lfs -text
|
| 56 |
+
.venv-course-check/lib/python3.12/site-packages/PIL/.dylibs/libxcb.1.1.0.dylib filter=lfs diff=lfs merge=lfs -text
|
| 57 |
+
.venv-course-check/lib/python3.12/site-packages/PIL/.dylibs/libz.1.3.1.zlib-ng.dylib filter=lfs diff=lfs merge=lfs -text
|
| 58 |
+
.venv-course-check/lib/python3.12/site-packages/PIL/__pycache__/Image.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 59 |
+
.venv-course-check/lib/python3.12/site-packages/PIL/_imaging.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 60 |
+
.venv-course-check/lib/python3.12/site-packages/PIL/_imagingft.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 61 |
+
.venv-course-check/lib/python3.12/site-packages/__pycache__/pynvml.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 62 |
+
.venv-course-check/lib/python3.12/site-packages/__pycache__/typing_extensions.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 63 |
+
.venv-course-check/lib/python3.12/site-packages/_brotli.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 64 |
+
.venv-course-check/lib/python3.12/site-packages/_polars_runtime_32/_polars_runtime.abi3.so filter=lfs diff=lfs merge=lfs -text
|
| 65 |
+
.venv-course-check/lib/python3.12/site-packages/charset_normalizer/cd.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 66 |
+
.venv-course-check/lib/python3.12/site-packages/charset_normalizer/md.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 67 |
+
.venv-course-check/lib/python3.12/site-packages/click/__pycache__/core.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 68 |
+
.venv-course-check/lib/python3.12/site-packages/contourpy/_contourpy.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 69 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libIex-3_3.32.3.3.4.dylib filter=lfs diff=lfs merge=lfs -text
|
| 70 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libImath-3_1.29.11.0.dylib filter=lfs diff=lfs merge=lfs -text
|
| 71 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libOpenEXR-3_3.32.3.3.4.dylib filter=lfs diff=lfs merge=lfs -text
|
| 72 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libOpenEXRCore-3_3.32.3.3.4.dylib filter=lfs diff=lfs merge=lfs -text
|
| 73 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libSDL2-2.0.0.dylib filter=lfs diff=lfs merge=lfs -text
|
| 74 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libSvtAv1Enc.3.0.2.dylib filter=lfs diff=lfs merge=lfs -text
|
| 75 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libX11.6.dylib filter=lfs diff=lfs merge=lfs -text
|
| 76 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libaom.3.12.1.dylib filter=lfs diff=lfs merge=lfs -text
|
| 77 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libarchive.13.dylib filter=lfs diff=lfs merge=lfs -text
|
| 78 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libaribb24.0.dylib filter=lfs diff=lfs merge=lfs -text
|
| 79 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libass.9.dylib filter=lfs diff=lfs merge=lfs -text
|
| 80 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libavcodec.61.19.101.dylib filter=lfs diff=lfs merge=lfs -text
|
| 81 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libavdevice.61.3.100.dylib filter=lfs diff=lfs merge=lfs -text
|
| 82 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libavfilter.10.4.100.dylib filter=lfs diff=lfs merge=lfs -text
|
| 83 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libavformat.61.7.100.dylib filter=lfs diff=lfs merge=lfs -text
|
| 84 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libavif.16.3.0.dylib filter=lfs diff=lfs merge=lfs -text
|
| 85 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libavutil.59.39.100.dylib filter=lfs diff=lfs merge=lfs -text
|
| 86 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libbluray.2.dylib filter=lfs diff=lfs merge=lfs -text
|
| 87 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libbrotlicommon.1.1.0.dylib filter=lfs diff=lfs merge=lfs -text
|
| 88 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libbrotlidec.1.1.0.dylib filter=lfs diff=lfs merge=lfs -text
|
| 89 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libbrotlienc.1.1.0.dylib filter=lfs diff=lfs merge=lfs -text
|
| 90 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libcrypto.3.dylib filter=lfs diff=lfs merge=lfs -text
|
| 91 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libdav1d.7.dylib filter=lfs diff=lfs merge=lfs -text
|
| 92 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libdeflate.0.dylib filter=lfs diff=lfs merge=lfs -text
|
| 93 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libfontconfig.1.dylib filter=lfs diff=lfs merge=lfs -text
|
| 94 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libfreetype.6.dylib filter=lfs diff=lfs merge=lfs -text
|
| 95 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libfribidi.0.dylib filter=lfs diff=lfs merge=lfs -text
|
| 96 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libglib-2.0.0.dylib filter=lfs diff=lfs merge=lfs -text
|
| 97 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libgmp.10.dylib filter=lfs diff=lfs merge=lfs -text
|
| 98 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libgnutls.30.dylib filter=lfs diff=lfs merge=lfs -text
|
| 99 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libgraphite2.3.2.1.dylib filter=lfs diff=lfs merge=lfs -text
|
| 100 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libharfbuzz.0.dylib filter=lfs diff=lfs merge=lfs -text
|
| 101 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libhogweed.6.10.dylib filter=lfs diff=lfs merge=lfs -text
|
| 102 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libidn2.0.dylib filter=lfs diff=lfs merge=lfs -text
|
| 103 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libintl.8.dylib filter=lfs diff=lfs merge=lfs -text
|
| 104 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libjpeg.8.3.2.dylib filter=lfs diff=lfs merge=lfs -text
|
| 105 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libjxl.0.11.1.dylib filter=lfs diff=lfs merge=lfs -text
|
| 106 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libjxl_cms.0.11.1.dylib filter=lfs diff=lfs merge=lfs -text
|
| 107 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/liblcms2.2.dylib filter=lfs diff=lfs merge=lfs -text
|
| 108 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libleptonica.6.dylib filter=lfs diff=lfs merge=lfs -text
|
| 109 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/liblz4.1.10.0.dylib filter=lfs diff=lfs merge=lfs -text
|
| 110 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/liblzma.5.dylib filter=lfs diff=lfs merge=lfs -text
|
| 111 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libmbedcrypto.3.6.3.dylib filter=lfs diff=lfs merge=lfs -text
|
| 112 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libmp3lame.0.dylib filter=lfs diff=lfs merge=lfs -text
|
| 113 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libnettle.8.10.dylib filter=lfs diff=lfs merge=lfs -text
|
| 114 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libopencore-amrnb.0.dylib filter=lfs diff=lfs merge=lfs -text
|
| 115 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libopencore-amrwb.0.dylib filter=lfs diff=lfs merge=lfs -text
|
| 116 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libopenjp2.2.5.3.dylib filter=lfs diff=lfs merge=lfs -text
|
| 117 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libopus.0.dylib filter=lfs diff=lfs merge=lfs -text
|
| 118 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libp11-kit.0.dylib filter=lfs diff=lfs merge=lfs -text
|
| 119 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libpcre2-8.0.dylib filter=lfs diff=lfs merge=lfs -text
|
| 120 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libpng16.16.dylib filter=lfs diff=lfs merge=lfs -text
|
| 121 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/librav1e.0.8.0.dylib filter=lfs diff=lfs merge=lfs -text
|
| 122 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/librist.4.dylib filter=lfs diff=lfs merge=lfs -text
|
| 123 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/librubberband.3.dylib filter=lfs diff=lfs merge=lfs -text
|
| 124 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libsamplerate.0.2.2.dylib filter=lfs diff=lfs merge=lfs -text
|
| 125 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libsodium.26.dylib filter=lfs diff=lfs merge=lfs -text
|
| 126 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libsoxr.0.1.2.dylib filter=lfs diff=lfs merge=lfs -text
|
| 127 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libspeex.1.dylib filter=lfs diff=lfs merge=lfs -text
|
| 128 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libsrt.1.5.4.dylib filter=lfs diff=lfs merge=lfs -text
|
| 129 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libssh.4.10.1.dylib filter=lfs diff=lfs merge=lfs -text
|
| 130 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libssl.3.dylib filter=lfs diff=lfs merge=lfs -text
|
| 131 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libswresample.5.3.100.dylib filter=lfs diff=lfs merge=lfs -text
|
| 132 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libswscale.8.3.100.dylib filter=lfs diff=lfs merge=lfs -text
|
| 133 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libtasn1.6.dylib filter=lfs diff=lfs merge=lfs -text
|
| 134 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libtesseract.5.dylib filter=lfs diff=lfs merge=lfs -text
|
| 135 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libtheoradec.1.dylib filter=lfs diff=lfs merge=lfs -text
|
| 136 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libtheoraenc.1.dylib filter=lfs diff=lfs merge=lfs -text
|
| 137 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libtiff.6.dylib filter=lfs diff=lfs merge=lfs -text
|
| 138 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libunibreak.6.dylib filter=lfs diff=lfs merge=lfs -text
|
| 139 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libunistring.5.dylib filter=lfs diff=lfs merge=lfs -text
|
| 140 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libvidstab.1.2.dylib filter=lfs diff=lfs merge=lfs -text
|
| 141 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libvmaf.3.dylib filter=lfs diff=lfs merge=lfs -text
|
| 142 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libvorbis.0.dylib filter=lfs diff=lfs merge=lfs -text
|
| 143 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libvorbisenc.2.dylib filter=lfs diff=lfs merge=lfs -text
|
| 144 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libvpx.11.dylib filter=lfs diff=lfs merge=lfs -text
|
| 145 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libwebp.7.1.10.dylib filter=lfs diff=lfs merge=lfs -text
|
| 146 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libx264.164.dylib filter=lfs diff=lfs merge=lfs -text
|
| 147 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libx265.215.dylib filter=lfs diff=lfs merge=lfs -text
|
| 148 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libxcb.1.1.0.dylib filter=lfs diff=lfs merge=lfs -text
|
| 149 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libzimg.2.dylib filter=lfs diff=lfs merge=lfs -text
|
| 150 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libzmq.5.dylib filter=lfs diff=lfs merge=lfs -text
|
| 151 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/.dylibs/libzstd.1.5.7.dylib filter=lfs diff=lfs merge=lfs -text
|
| 152 |
+
.venv-course-check/lib/python3.12/site-packages/cv2/cv2.abi3.so filter=lfs diff=lfs merge=lfs -text
|
| 153 |
+
.venv-course-check/lib/python3.12/site-packages/fontTools/cu2qu/cu2qu.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 154 |
+
.venv-course-check/lib/python3.12/site-packages/fontTools/feaLib/lexer.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 155 |
+
.venv-course-check/lib/python3.12/site-packages/fontTools/misc/bezierTools.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 156 |
+
.venv-course-check/lib/python3.12/site-packages/fontTools/pens/momentsPen.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 157 |
+
.venv-course-check/lib/python3.12/site-packages/fontTools/qu2cu/qu2cu.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 158 |
+
.venv-course-check/lib/python3.12/site-packages/fontTools/varLib/iup.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 159 |
+
.venv-course-check/lib/python3.12/site-packages/gradio/media_assets/audio/cantina.wav filter=lfs diff=lfs merge=lfs -text
|
| 160 |
+
.venv-course-check/lib/python3.12/site-packages/gradio/media_assets/audio/recording1.wav filter=lfs diff=lfs merge=lfs -text
|
| 161 |
+
.venv-course-check/lib/python3.12/site-packages/gradio/media_assets/audio/sax.wav filter=lfs diff=lfs merge=lfs -text
|
| 162 |
+
.venv-course-check/lib/python3.12/site-packages/gradio/media_assets/images/groot.jpeg filter=lfs diff=lfs merge=lfs -text
|
| 163 |
+
.venv-course-check/lib/python3.12/site-packages/gradio/media_assets/images/tower.jpg filter=lfs diff=lfs merge=lfs -text
|
| 164 |
+
.venv-course-check/lib/python3.12/site-packages/gradio/media_assets/models3d/Duck.glb filter=lfs diff=lfs merge=lfs -text
|
| 165 |
+
.venv-course-check/lib/python3.12/site-packages/gradio/media_assets/models3d/sofia.stl filter=lfs diff=lfs merge=lfs -text
|
| 166 |
+
.venv-course-check/lib/python3.12/site-packages/gradio/media_assets/videos/a.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 167 |
+
.venv-course-check/lib/python3.12/site-packages/gradio/media_assets/videos/b.avi filter=lfs diff=lfs merge=lfs -text
|
| 168 |
+
.venv-course-check/lib/python3.12/site-packages/gradio/media_assets/videos/b.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 169 |
+
.venv-course-check/lib/python3.12/site-packages/gradio/media_assets/videos/world.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 170 |
+
.venv-course-check/lib/python3.12/site-packages/gradio/templates/frontend/static/fonts/SourceSansPro/SourceSansPro-Bold.woff2 filter=lfs diff=lfs merge=lfs -text
|
| 171 |
+
.venv-course-check/lib/python3.12/site-packages/gradio/templates/frontend/static/fonts/SourceSansPro/SourceSansPro-Regular.woff2 filter=lfs diff=lfs merge=lfs -text
|
| 172 |
+
.venv-course-check/lib/python3.12/site-packages/gradio/templates/node/build/client/_app/immutable/chunks/B1ITLeeC2.js.br filter=lfs diff=lfs merge=lfs -text
|
| 173 |
+
.venv-course-check/lib/python3.12/site-packages/gradio/templates/node/build/client/_app/immutable/chunks/BxcMcBSX2.js.br filter=lfs diff=lfs merge=lfs -text
|
| 174 |
+
.venv-course-check/lib/python3.12/site-packages/gradio/templates/node/build/client/_app/immutable/chunks/CYTxTm2V2.js.br filter=lfs diff=lfs merge=lfs -text
|
| 175 |
+
.venv-course-check/lib/python3.12/site-packages/gradio/templates/node/build/client/_app/immutable/chunks/Crrb2Aik.js.br filter=lfs diff=lfs merge=lfs -text
|
| 176 |
+
.venv-course-check/lib/python3.12/site-packages/gradio/templates/node/build/client/_app/immutable/chunks/CyCl8rPi2.js.br filter=lfs diff=lfs merge=lfs -text
|
| 177 |
+
.venv-course-check/lib/python3.12/site-packages/gradio/templates/node/build/client/_app/immutable/chunks/DNekb51P2.js.br filter=lfs diff=lfs merge=lfs -text
|
| 178 |
+
.venv-course-check/lib/python3.12/site-packages/gradio/templates/node/build/client/_app/immutable/chunks/DR1dImtM2.js.br filter=lfs diff=lfs merge=lfs -text
|
| 179 |
+
.venv-course-check/lib/python3.12/site-packages/hf_xet/hf_xet.abi3.so filter=lfs diff=lfs merge=lfs -text
|
| 180 |
+
.venv-course-check/lib/python3.12/site-packages/huggingface_hub/__pycache__/hf_api.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 181 |
+
.venv-course-check/lib/python3.12/site-packages/jinja2/__pycache__/compiler.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 182 |
+
.venv-course-check/lib/python3.12/site-packages/kiwisolver/_cext.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 183 |
+
.venv-course-check/lib/python3.12/site-packages/matplotlib/_c_internal_utils.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 184 |
+
.venv-course-check/lib/python3.12/site-packages/matplotlib/_image.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 185 |
+
.venv-course-check/lib/python3.12/site-packages/matplotlib/_path.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 186 |
+
.venv-course-check/lib/python3.12/site-packages/matplotlib/_qhull.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 187 |
+
.venv-course-check/lib/python3.12/site-packages/matplotlib/_tri.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 188 |
+
.venv-course-check/lib/python3.12/site-packages/matplotlib/backends/_backend_agg.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 189 |
+
.venv-course-check/lib/python3.12/site-packages/matplotlib/backends/_macosx.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 190 |
+
.venv-course-check/lib/python3.12/site-packages/matplotlib/backends/_tkagg.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 191 |
+
.venv-course-check/lib/python3.12/site-packages/matplotlib/ft2font.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 192 |
+
.venv-course-check/lib/python3.12/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSans-Bold.ttf filter=lfs diff=lfs merge=lfs -text
|
| 193 |
+
.venv-course-check/lib/python3.12/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSans-BoldOblique.ttf filter=lfs diff=lfs merge=lfs -text
|
| 194 |
+
.venv-course-check/lib/python3.12/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSans-Oblique.ttf filter=lfs diff=lfs merge=lfs -text
|
| 195 |
+
.venv-course-check/lib/python3.12/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSans.ttf filter=lfs diff=lfs merge=lfs -text
|
| 196 |
+
.venv-course-check/lib/python3.12/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSansMono-Bold.ttf filter=lfs diff=lfs merge=lfs -text
|
| 197 |
+
.venv-course-check/lib/python3.12/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSansMono-BoldOblique.ttf filter=lfs diff=lfs merge=lfs -text
|
| 198 |
+
.venv-course-check/lib/python3.12/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSansMono-Oblique.ttf filter=lfs diff=lfs merge=lfs -text
|
| 199 |
+
.venv-course-check/lib/python3.12/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSansMono.ttf filter=lfs diff=lfs merge=lfs -text
|
| 200 |
+
.venv-course-check/lib/python3.12/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSerif-Bold.ttf filter=lfs diff=lfs merge=lfs -text
|
| 201 |
+
.venv-course-check/lib/python3.12/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSerif-BoldItalic.ttf filter=lfs diff=lfs merge=lfs -text
|
| 202 |
+
.venv-course-check/lib/python3.12/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSerif-Italic.ttf filter=lfs diff=lfs merge=lfs -text
|
| 203 |
+
.venv-course-check/lib/python3.12/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSerif.ttf filter=lfs diff=lfs merge=lfs -text
|
| 204 |
+
.venv-course-check/lib/python3.12/site-packages/matplotlib/mpl-data/fonts/ttf/LastResortHE-Regular.ttf filter=lfs diff=lfs merge=lfs -text
|
| 205 |
+
.venv-course-check/lib/python3.12/site-packages/matplotlib/mpl-data/fonts/ttf/STIXGeneral.ttf filter=lfs diff=lfs merge=lfs -text
|
| 206 |
+
.venv-course-check/lib/python3.12/site-packages/matplotlib/mpl-data/fonts/ttf/STIXGeneralBol.ttf filter=lfs diff=lfs merge=lfs -text
|
| 207 |
+
.venv-course-check/lib/python3.12/site-packages/matplotlib/mpl-data/fonts/ttf/STIXGeneralBolIta.ttf filter=lfs diff=lfs merge=lfs -text
|
| 208 |
+
.venv-course-check/lib/python3.12/site-packages/matplotlib/mpl-data/fonts/ttf/STIXGeneralItalic.ttf filter=lfs diff=lfs merge=lfs -text
|
| 209 |
+
.venv-course-check/lib/python3.12/site-packages/mpmath/__pycache__/function_docs.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 210 |
+
.venv-course-check/lib/python3.12/site-packages/networkx/drawing/tests/baseline/test_display_complex.png filter=lfs diff=lfs merge=lfs -text
|
| 211 |
+
.venv-course-check/lib/python3.12/site-packages/numpy/_core/__pycache__/_add_newdocs.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 212 |
+
.venv-course-check/lib/python3.12/site-packages/numpy/_core/__pycache__/fromnumeric.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 213 |
+
.venv-course-check/lib/python3.12/site-packages/numpy/_core/_multiarray_tests.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 214 |
+
.venv-course-check/lib/python3.12/site-packages/numpy/_core/_multiarray_umath.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 215 |
+
.venv-course-check/lib/python3.12/site-packages/numpy/_core/_simd.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 216 |
+
.venv-course-check/lib/python3.12/site-packages/numpy/fft/_pocketfft_umath.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 217 |
+
.venv-course-check/lib/python3.12/site-packages/numpy/lib/__pycache__/_function_base_impl.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 218 |
+
.venv-course-check/lib/python3.12/site-packages/numpy/linalg/__pycache__/_linalg.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 219 |
+
.venv-course-check/lib/python3.12/site-packages/numpy/linalg/_umath_linalg.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 220 |
+
.venv-course-check/lib/python3.12/site-packages/numpy/random/_bounded_integers.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 221 |
+
.venv-course-check/lib/python3.12/site-packages/numpy/random/_common.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 222 |
+
.venv-course-check/lib/python3.12/site-packages/numpy/random/_generator.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 223 |
+
.venv-course-check/lib/python3.12/site-packages/numpy/random/_mt19937.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 224 |
+
.venv-course-check/lib/python3.12/site-packages/numpy/random/_pcg64.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 225 |
+
.venv-course-check/lib/python3.12/site-packages/numpy/random/_philox.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 226 |
+
.venv-course-check/lib/python3.12/site-packages/numpy/random/bit_generator.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 227 |
+
.venv-course-check/lib/python3.12/site-packages/numpy/random/mtrand.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 228 |
+
.venv-course-check/lib/python3.12/site-packages/orjson/orjson.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 229 |
+
.venv-course-check/lib/python3.12/site-packages/pandas/_libs/_cyutility.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 230 |
+
.venv-course-check/lib/python3.12/site-packages/pandas/_libs/algos.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 231 |
+
.venv-course-check/lib/python3.12/site-packages/pandas/_libs/arrays.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 232 |
+
.venv-course-check/lib/python3.12/site-packages/pandas/_libs/groupby.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 233 |
+
.venv-course-check/lib/python3.12/site-packages/pandas/_libs/hashing.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 234 |
+
.venv-course-check/lib/python3.12/site-packages/pandas/_libs/hashtable.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 235 |
+
.venv-course-check/lib/python3.12/site-packages/pandas/_libs/index.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 236 |
+
.venv-course-check/lib/python3.12/site-packages/pandas/_libs/indexing.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 237 |
+
.venv-course-check/lib/python3.12/site-packages/pandas/_libs/internals.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 238 |
+
.venv-course-check/lib/python3.12/site-packages/pandas/_libs/interval.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 239 |
+
.venv-course-check/lib/python3.12/site-packages/pandas/_libs/join.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 240 |
+
.venv-course-check/lib/python3.12/site-packages/pandas/_libs/lib.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 241 |
+
.venv-course-check/lib/python3.12/site-packages/pandas/_libs/missing.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 242 |
+
.venv-course-check/lib/python3.12/site-packages/pandas/_libs/ops.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 243 |
+
.venv-course-check/lib/python3.12/site-packages/pandas/_libs/parsers.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 244 |
+
.venv-course-check/lib/python3.12/site-packages/pandas/_libs/properties.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 245 |
+
.venv-course-check/lib/python3.12/site-packages/pandas/_libs/reshape.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 246 |
+
.venv-course-check/lib/python3.12/site-packages/pandas/_libs/sas.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 247 |
+
.venv-course-check/lib/python3.12/site-packages/pandas/_libs/sparse.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 248 |
+
.venv-course-check/lib/python3.12/site-packages/pandas/_libs/testing.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 249 |
+
.venv-course-check/lib/python3.12/site-packages/pandas/_libs/tslib.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 250 |
+
.venv-course-check/lib/python3.12/site-packages/pandas/_libs/tslibs/ccalendar.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 251 |
+
.venv-course-check/lib/python3.12/site-packages/pandas/_libs/tslibs/conversion.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 252 |
+
.venv-course-check/lib/python3.12/site-packages/pandas/_libs/tslibs/dtypes.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 253 |
+
.venv-course-check/lib/python3.12/site-packages/pandas/_libs/tslibs/fields.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 254 |
+
.venv-course-check/lib/python3.12/site-packages/pandas/_libs/tslibs/nattype.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 255 |
+
.venv-course-check/lib/python3.12/site-packages/pandas/_libs/tslibs/np_datetime.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 256 |
+
.venv-course-check/lib/python3.12/site-packages/pandas/_libs/tslibs/offsets.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 257 |
+
.venv-course-check/lib/python3.12/site-packages/pandas/_libs/tslibs/parsing.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 258 |
+
.venv-course-check/lib/python3.12/site-packages/pandas/_libs/tslibs/period.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 259 |
+
.venv-course-check/lib/python3.12/site-packages/pandas/_libs/tslibs/strptime.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 260 |
+
.venv-course-check/lib/python3.12/site-packages/pandas/_libs/tslibs/timedeltas.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 261 |
+
.venv-course-check/lib/python3.12/site-packages/pandas/_libs/tslibs/timestamps.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 262 |
+
.venv-course-check/lib/python3.12/site-packages/pandas/_libs/tslibs/timezones.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 263 |
+
.venv-course-check/lib/python3.12/site-packages/pandas/_libs/tslibs/tzconversion.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 264 |
+
.venv-course-check/lib/python3.12/site-packages/pandas/_libs/tslibs/vectorized.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 265 |
+
.venv-course-check/lib/python3.12/site-packages/pandas/_libs/window/aggregations.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 266 |
+
.venv-course-check/lib/python3.12/site-packages/pandas/_libs/window/indexers.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 267 |
+
.venv-course-check/lib/python3.12/site-packages/pandas/_libs/writers.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 268 |
+
.venv-course-check/lib/python3.12/site-packages/psutil/_psutil_osx.abi3.so filter=lfs diff=lfs merge=lfs -text
|
| 269 |
+
.venv-course-check/lib/python3.12/site-packages/pydantic_core/_pydantic_core.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 270 |
+
.venv-course-check/lib/python3.12/site-packages/regex/__pycache__/_regex_core.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 271 |
+
.venv-course-check/lib/python3.12/site-packages/regex/_regex.cpython-312-darwin.so filter=lfs diff=lfs merge=lfs -text
|
| 272 |
+
.venv-course-check/lib/python3.12/site-packages/rich/__pycache__/console.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 273 |
+
.venv-course-check/lib/python3.12/site-packages/safetensors/_safetensors_rust.abi3.so filter=lfs diff=lfs merge=lfs -text
|
| 274 |
+
.venv-course-check/lib/python3.12/site-packages/sympy/core/__pycache__/expr.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 275 |
+
.venv-course-check/lib/python3.12/site-packages/sympy/core/__pycache__/function.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 276 |
+
.venv-course-check/lib/python3.12/site-packages/sympy/core/__pycache__/numbers.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 277 |
+
.venv-course-check/lib/python3.12/site-packages/sympy/functions/combinatorial/__pycache__/numbers.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 278 |
+
.venv-course-check/lib/python3.12/site-packages/sympy/functions/elementary/__pycache__/hyperbolic.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 279 |
+
.venv-course-check/lib/python3.12/site-packages/sympy/functions/elementary/__pycache__/trigonometric.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 280 |
+
.venv-course-check/lib/python3.12/site-packages/sympy/functions/special/__pycache__/bessel.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 281 |
+
.venv-course-check/lib/python3.12/site-packages/sympy/functions/special/__pycache__/error_functions.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 282 |
+
.venv-course-check/lib/python3.12/site-packages/sympy/geometry/__pycache__/polygon.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 283 |
+
.venv-course-check/lib/python3.12/site-packages/sympy/integrals/__pycache__/laplace.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 284 |
+
.venv-course-check/lib/python3.12/site-packages/sympy/integrals/__pycache__/meijerint.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 285 |
+
.venv-course-check/lib/python3.12/site-packages/sympy/logic/__pycache__/boolalg.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 286 |
+
.venv-course-check/lib/python3.12/site-packages/sympy/matrices/__pycache__/matrixbase.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 287 |
+
.venv-course-check/lib/python3.12/site-packages/sympy/plotting/__pycache__/series.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 288 |
+
.venv-course-check/lib/python3.12/site-packages/sympy/polys/__pycache__/compatibility.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 289 |
+
.venv-course-check/lib/python3.12/site-packages/sympy/polys/__pycache__/polyclasses.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 290 |
+
.venv-course-check/lib/python3.12/site-packages/sympy/polys/__pycache__/polyquinticconst.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 291 |
+
.venv-course-check/lib/python3.12/site-packages/sympy/polys/__pycache__/polytools.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 292 |
+
.venv-course-check/lib/python3.12/site-packages/sympy/polys/__pycache__/rings.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 293 |
+
.venv-course-check/lib/python3.12/site-packages/sympy/polys/matrices/__pycache__/domainmatrix.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 294 |
+
.venv-course-check/lib/python3.12/site-packages/sympy/printing/__pycache__/latex.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 295 |
+
.venv-course-check/lib/python3.12/site-packages/sympy/printing/__pycache__/mathml.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 296 |
+
.venv-course-check/lib/python3.12/site-packages/sympy/printing/pretty/__pycache__/pretty.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 297 |
+
.venv-course-check/lib/python3.12/site-packages/sympy/sets/__pycache__/sets.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 298 |
+
.venv-course-check/lib/python3.12/site-packages/sympy/simplify/__pycache__/hyperexpand.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 299 |
+
.venv-course-check/lib/python3.12/site-packages/sympy/solvers/__pycache__/solvers.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 300 |
+
.venv-course-check/lib/python3.12/site-packages/sympy/solvers/__pycache__/solveset.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 301 |
+
.venv-course-check/lib/python3.12/site-packages/sympy/solvers/diophantine/__pycache__/diophantine.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 302 |
+
.venv-course-check/lib/python3.12/site-packages/sympy/solvers/ode/__pycache__/ode.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 303 |
+
.venv-course-check/lib/python3.12/site-packages/sympy/solvers/ode/__pycache__/single.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 304 |
+
.venv-course-check/lib/python3.12/site-packages/sympy/utilities/__pycache__/iterables.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 305 |
+
.venv-course-check/lib/python3.12/site-packages/tokenizers/tokenizers.abi3.so filter=lfs diff=lfs merge=lfs -text
|
| 306 |
+
.venv-course-check/lib/python3.12/site-packages/torch/__pycache__/__init__.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 307 |
+
.venv-course-check/lib/python3.12/site-packages/torch/__pycache__/_meta_registrations.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 308 |
+
.venv-course-check/lib/python3.12/site-packages/torch/__pycache__/_tensor_docs.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 309 |
+
.venv-course-check/lib/python3.12/site-packages/torch/__pycache__/_torch_docs.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 310 |
+
.venv-course-check/lib/python3.12/site-packages/torch/__pycache__/overrides.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 311 |
+
.venv-course-check/lib/python3.12/site-packages/torch/_decomp/__pycache__/decompositions.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 312 |
+
.venv-course-check/lib/python3.12/site-packages/torch/_dynamo/__pycache__/convert_frame.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 313 |
+
.venv-course-check/lib/python3.12/site-packages/torch/_dynamo/__pycache__/eval_frame.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 314 |
+
.venv-course-check/lib/python3.12/site-packages/torch/_dynamo/__pycache__/guards.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 315 |
+
.venv-course-check/lib/python3.12/site-packages/torch/_dynamo/__pycache__/output_graph.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 316 |
+
.venv-course-check/lib/python3.12/site-packages/torch/_dynamo/__pycache__/symbolic_convert.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 317 |
+
.venv-course-check/lib/python3.12/site-packages/torch/_dynamo/__pycache__/trace_rules.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 318 |
+
.venv-course-check/lib/python3.12/site-packages/torch/_dynamo/__pycache__/utils.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 319 |
+
.venv-course-check/lib/python3.12/site-packages/torch/_dynamo/variables/__pycache__/base.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 320 |
+
.venv-course-check/lib/python3.12/site-packages/torch/_dynamo/variables/__pycache__/builder.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 321 |
+
.venv-course-check/lib/python3.12/site-packages/torch/_dynamo/variables/__pycache__/builtin.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 322 |
+
.venv-course-check/lib/python3.12/site-packages/torch/_dynamo/variables/__pycache__/functions.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 323 |
+
.venv-course-check/lib/python3.12/site-packages/torch/_dynamo/variables/__pycache__/higher_order_ops.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 324 |
+
.venv-course-check/lib/python3.12/site-packages/torch/_dynamo/variables/__pycache__/lists.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 325 |
+
.venv-course-check/lib/python3.12/site-packages/torch/_dynamo/variables/__pycache__/misc.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 326 |
+
.venv-course-check/lib/python3.12/site-packages/torch/_dynamo/variables/__pycache__/tensor.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 327 |
+
.venv-course-check/lib/python3.12/site-packages/torch/_dynamo/variables/__pycache__/torch.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 328 |
+
.venv-course-check/lib/python3.12/site-packages/torch/_dynamo/variables/__pycache__/user_defined.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 329 |
+
.venv-course-check/lib/python3.12/site-packages/torch/_functorch/_aot_autograd/__pycache__/runtime_wrappers.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 330 |
+
.venv-course-check/lib/python3.12/site-packages/torch/_higher_order_ops/__pycache__/triton_kernel_wrap.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 331 |
+
.venv-course-check/lib/python3.12/site-packages/torch/_inductor/__pycache__/cpp_builder.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 332 |
+
.venv-course-check/lib/python3.12/site-packages/torch/_inductor/__pycache__/utils.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 333 |
+
.venv-course-check/lib/python3.12/site-packages/torch/_refs/__pycache__/__init__.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 334 |
+
.venv-course-check/lib/python3.12/site-packages/torch/_subclasses/__pycache__/fake_impls.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 335 |
+
.venv-course-check/lib/python3.12/site-packages/torch/_subclasses/__pycache__/fake_tensor.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 336 |
+
.venv-course-check/lib/python3.12/site-packages/torch/bin/protoc filter=lfs diff=lfs merge=lfs -text
|
| 337 |
+
.venv-course-check/lib/python3.12/site-packages/torch/bin/protoc-3.21.12.0 filter=lfs diff=lfs merge=lfs -text
|
| 338 |
+
.venv-course-check/lib/python3.12/site-packages/torch/distributed/__pycache__/distributed_c10d.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 339 |
+
.venv-course-check/lib/python3.12/site-packages/torch/distributed/_local_tensor/__pycache__/__init__.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 340 |
+
.venv-course-check/lib/python3.12/site-packages/torch/distributed/_symmetric_memory/__pycache__/__init__.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 341 |
+
.venv-course-check/lib/python3.12/site-packages/torch/distributed/fsdp/__pycache__/_flat_param.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 342 |
+
.venv-course-check/lib/python3.12/site-packages/torch/distributed/fsdp/__pycache__/fully_sharded_data_parallel.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 343 |
+
.venv-course-check/lib/python3.12/site-packages/torch/fx/__pycache__/graph.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 344 |
+
.venv-course-check/lib/python3.12/site-packages/torch/fx/experimental/__pycache__/proxy_tensor.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
| 345 |
+
.venv-course-check/lib/python3.12/site-packages/torch/fx/experimental/__pycache__/symbolic_shapes.cpython-312.pyc filter=lfs diff=lfs merge=lfs -text
|
ai-powered-object-detection/README.md
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
title: AI-Powered Object Detection
|
| 3 |
+
emoji: 🔎
|
| 4 |
+
colorFrom: blue
|
| 5 |
+
colorTo: indigo
|
| 6 |
+
sdk: static
|
| 7 |
+
app_file: index.html
|
| 8 |
+
pinned: false
|
| 9 |
+
---
|
| 10 |
+
|
| 11 |
+
# AI-Powered Object Detection
|
| 12 |
+
|
| 13 |
+
A small teaching mini-lab for a Creative Technology / introductory AI course.
|
| 14 |
+
|
| 15 |
+
The point of the project is not to make students rebuild an object detector from scratch. It shows how a pretrained AI model can turn a traditional computer-vision task into a capability that can be directly used inside an application.
|
| 16 |
+
|
| 17 |
+
## The learning story
|
| 18 |
+
|
| 19 |
+
1. Choose a real image from the COCO 2017 validation sample bank, or upload your own image.
|
| 20 |
+
2. Choose a browser-compatible pretrained detector: RT-DETR R18, DETR ResNet-50, or YOLOS Tiny.
|
| 21 |
+
3. Inspect bounding boxes, class labels, confidence scores, and object counts.
|
| 22 |
+
4. Keep the image fixed and switch models to compare predictions.
|
| 23 |
+
5. Change the confidence threshold and observe what changes.
|
| 24 |
+
|
| 25 |
+
## Model and data
|
| 26 |
+
|
| 27 |
+
- Recommended browser default: `onnx-community/rtdetr_r18vd` (RT-DETR R18)
|
| 28 |
+
- Additional browser comparison models: `Xenova/detr-resnet-50`, `Xenova/yolos-tiny`
|
| 29 |
+
- Task: object detection
|
| 30 |
+
- Training dataset: COCO
|
| 31 |
+
- Example bank: selected images from COCO 2017 validation
|
| 32 |
+
|
| 33 |
+
All three browser models are already trained. This demo performs inference only; no model training or GPU server is required.
|
| 34 |
+
|
| 35 |
+
The bundled COCO examples are used to give the classroom demo reliable, varied starting inputs. COCO does not own the underlying images; each image retains its original license.
|
| 36 |
+
|
| 37 |
+
## One project, one demo
|
| 38 |
+
|
| 39 |
+
The source code and the live demo are the same project:
|
| 40 |
+
|
| 41 |
+
- `index.html` — page structure and teaching flow
|
| 42 |
+
- `style.css` — presentation
|
| 43 |
+
- `app.js` — interaction, image handling, result rendering
|
| 44 |
+
- `detector.js` — the AI model call
|
| 45 |
+
- `examples/` — tested COCO validation images
|
| 46 |
+
|
| 47 |
+
## Baseline assignment (about 70%)
|
| 48 |
+
|
| 49 |
+
A baseline submission should successfully use a pretrained AI model to complete a real object-detection task and present the result clearly. At minimum, students should be able to show the input image, detected objects, bounding boxes, labels, and confidence scores, and explain what the model is doing at a high level.
|
| 50 |
+
|
| 51 |
+
Students are not required to invent or train an object detector from scratch for the baseline.
|
| 52 |
+
|
| 53 |
+
## Going beyond the baseline
|
| 54 |
+
|
| 55 |
+
Higher-scoring work should deepen **object detection** itself. Students should independently investigate a meaningful extension, for example:
|
| 56 |
+
|
| 57 |
+
- compare or replace pretrained object detectors;
|
| 58 |
+
- tune confidence, IoU/NMS, or image size and explain the trade-offs;
|
| 59 |
+
- test another dataset or domain and analyze failure cases;
|
| 60 |
+
- improve robustness, speed, evaluation, or the object-detection application.
|
| 61 |
+
|
| 62 |
+
The emphasis is on meaningful exploration, not simply adding more lines of code.
|
| 63 |
+
|
| 64 |
+
## Runtime
|
| 65 |
+
|
| 66 |
+
The Space is static and runs the selected model in the browser with Transformers.js. The first run for each model downloads its model files; later runs can reuse the browser cache. RT-DETR remains the recommended classroom default.
|
| 67 |
+
|
| 68 |
+
## Classroom check before use
|
| 69 |
+
|
| 70 |
+
Before presenting, verify:
|
| 71 |
+
|
| 72 |
+
- at least one COCO example detects correctly;
|
| 73 |
+
- Shuffle changes the visible example set;
|
| 74 |
+
- an uploaded image can be detected;
|
| 75 |
+
- the confidence slider changes filtering behavior;
|
| 76 |
+
- the first uncached run shows progress instead of appearing frozen;
|
| 77 |
+
- the page still works at a narrow/mobile width.
|
| 78 |
+
|
| 79 |
+
This repository is the baseline demo for the course. Once the v1.0 checks pass, the next deliverable is the presentation deck built around the same teaching story.
|
| 80 |
+
|
| 81 |
+
## v1.0 verification
|
| 82 |
+
|
| 83 |
+
The v1.0 release was checked on 2026-09-08 with automated browser tests:
|
| 84 |
+
|
| 85 |
+
- all 8 bundled COCO examples produced at least one detection at threshold 0.50;
|
| 86 |
+
- Shuffle, COCO sample selection, and user upload all worked;
|
| 87 |
+
- raising the threshold from 0.50 to 0.95 reduced low-confidence detections as expected;
|
| 88 |
+
- the uncached first run displayed a loading/progress state;
|
| 89 |
+
- the network/model failure path displayed a readable error state;
|
| 90 |
+
- Chromium and WebKit both completed a real detection;
|
| 91 |
+
- a 390 px mobile viewport had no horizontal page overflow.
|
| 92 |
+
|
| 93 |
+
|
| 94 |
+
## Interaction and Python
|
| 95 |
+
|
| 96 |
+
The hosted Static Space is the interactive visualization layer. The separate course package contains the Python reference scripts required by the teacher (Faster R-CNN, YOLO26n, RT-DETR, plus optional DETR). The hosted Space itself stays lightweight and browser-only.
|
ai-powered-object-detection/app.js
ADDED
|
@@ -0,0 +1,310 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import { MODEL_OPTIONS, detectObjects, getModelOption } from './detector.js';
|
| 2 |
+
|
| 3 |
+
const imageInput = document.querySelector('#image-input');
|
| 4 |
+
const modelSelect = document.querySelector('#model-select');
|
| 5 |
+
const modelNote = document.querySelector('#model-note');
|
| 6 |
+
const threshold = document.querySelector('#threshold');
|
| 7 |
+
const thresholdValue = document.querySelector('#threshold-value');
|
| 8 |
+
const runButton = document.querySelector('#run-button');
|
| 9 |
+
const statusEl = document.querySelector('#status');
|
| 10 |
+
const progressWrap = document.querySelector('#progress-wrap');
|
| 11 |
+
const progressBar = document.querySelector('#progress-bar');
|
| 12 |
+
const canvasWrap = document.querySelector('#canvas-wrap');
|
| 13 |
+
const canvas = document.querySelector('#result-canvas');
|
| 14 |
+
const ctx = canvas.getContext('2d');
|
| 15 |
+
const summary = document.querySelector('#summary');
|
| 16 |
+
const tbody = document.querySelector('#detections-body');
|
| 17 |
+
const runtimeBadge = document.querySelector('#runtime-badge');
|
| 18 |
+
const sampleGrid = document.querySelector('#sample-grid');
|
| 19 |
+
const shuffleButton = document.querySelector('#shuffle-examples');
|
| 20 |
+
|
| 21 |
+
const state = {
|
| 22 |
+
image: null,
|
| 23 |
+
dataUrl: null,
|
| 24 |
+
};
|
| 25 |
+
|
| 26 |
+
const EXAMPLES = [
|
| 27 |
+
{ src: './examples/000000039769.jpg', label: 'Cats & remotes' },
|
| 28 |
+
{ src: './examples/000000397133.jpg', label: 'Busy kitchen' },
|
| 29 |
+
{ src: './examples/000000252219.jpg', label: 'Street scene' },
|
| 30 |
+
{ src: './examples/000000037777.jpg', label: 'Kitchen objects' },
|
| 31 |
+
{ src: './examples/000000087038.jpg', label: 'Skate park' },
|
| 32 |
+
{ src: './examples/000000174482.jpg', label: 'Bike & traffic' },
|
| 33 |
+
{ src: './examples/000000181666.jpg', label: 'Herd & person' },
|
| 34 |
+
{ src: './examples/000000376310.jpg', label: 'Bathroom objects' },
|
| 35 |
+
];
|
| 36 |
+
|
| 37 |
+
function chooseRandom(items, count) {
|
| 38 |
+
return [...items]
|
| 39 |
+
.map((item) => ({ item, sort: Math.random() }))
|
| 40 |
+
.sort((a, b) => a.sort - b.sort)
|
| 41 |
+
.slice(0, count)
|
| 42 |
+
.map(({ item }) => item);
|
| 43 |
+
}
|
| 44 |
+
|
| 45 |
+
function resetResults() {
|
| 46 |
+
summary.textContent = 'No detections yet.';
|
| 47 |
+
tbody.innerHTML = '<tr class="empty-row"><td colspan="3">Run the detector to see details.</td></tr>';
|
| 48 |
+
}
|
| 49 |
+
|
| 50 |
+
function setSelectedImage(dataUrl, readyMessage) {
|
| 51 |
+
const image = new Image();
|
| 52 |
+
image.onload = () => {
|
| 53 |
+
state.dataUrl = dataUrl;
|
| 54 |
+
state.image = image;
|
| 55 |
+
drawBaseImage();
|
| 56 |
+
runButton.disabled = false;
|
| 57 |
+
statusEl.textContent = readyMessage;
|
| 58 |
+
setBadge('Image ready');
|
| 59 |
+
resetResults();
|
| 60 |
+
};
|
| 61 |
+
image.onerror = () => {
|
| 62 |
+
statusEl.textContent = 'Could not read that image.';
|
| 63 |
+
setBadge('Image error', 'error');
|
| 64 |
+
};
|
| 65 |
+
image.src = dataUrl;
|
| 66 |
+
}
|
| 67 |
+
|
| 68 |
+
function blobToDataUrl(blob) {
|
| 69 |
+
return new Promise((resolve, reject) => {
|
| 70 |
+
const reader = new FileReader();
|
| 71 |
+
reader.onload = () => resolve(reader.result);
|
| 72 |
+
reader.onerror = reject;
|
| 73 |
+
reader.readAsDataURL(blob);
|
| 74 |
+
});
|
| 75 |
+
}
|
| 76 |
+
|
| 77 |
+
async function loadExample(example, button) {
|
| 78 |
+
try {
|
| 79 |
+
statusEl.textContent = `Loading COCO example: ${example.label}…`;
|
| 80 |
+
setBadge('Loading sample', 'running');
|
| 81 |
+
const response = await fetch(example.src);
|
| 82 |
+
if (!response.ok) throw new Error(`Could not load ${example.src}`);
|
| 83 |
+
const dataUrl = await blobToDataUrl(await response.blob());
|
| 84 |
+
imageInput.value = '';
|
| 85 |
+
document.querySelectorAll('.sample-card').forEach((card) => card.classList.remove('selected'));
|
| 86 |
+
button.classList.add('selected');
|
| 87 |
+
setSelectedImage(dataUrl, `COCO example ready: ${example.label}. Click Run AI Detection.`);
|
| 88 |
+
} catch (error) {
|
| 89 |
+
console.error(error);
|
| 90 |
+
statusEl.textContent = 'Could not load that COCO example. Try another one.';
|
| 91 |
+
setBadge('Sample error', 'error');
|
| 92 |
+
}
|
| 93 |
+
}
|
| 94 |
+
|
| 95 |
+
function renderModelChoices() {
|
| 96 |
+
for (const option of MODEL_OPTIONS) {
|
| 97 |
+
const item = document.createElement('option');
|
| 98 |
+
item.value = option.key;
|
| 99 |
+
item.textContent = option.label;
|
| 100 |
+
modelSelect.appendChild(item);
|
| 101 |
+
}
|
| 102 |
+
modelSelect.value = MODEL_OPTIONS[0].key;
|
| 103 |
+
modelNote.textContent = MODEL_OPTIONS[0].note;
|
| 104 |
+
}
|
| 105 |
+
|
| 106 |
+
function renderExampleChoices() {
|
| 107 |
+
sampleGrid.innerHTML = '';
|
| 108 |
+
for (const example of chooseRandom(EXAMPLES, 4)) {
|
| 109 |
+
const button = document.createElement('button');
|
| 110 |
+
button.type = 'button';
|
| 111 |
+
button.className = 'sample-card';
|
| 112 |
+
button.title = `Use sample: ${example.label}`;
|
| 113 |
+
|
| 114 |
+
const image = document.createElement('img');
|
| 115 |
+
image.src = example.src;
|
| 116 |
+
image.alt = example.label;
|
| 117 |
+
image.loading = 'lazy';
|
| 118 |
+
|
| 119 |
+
const label = document.createElement('span');
|
| 120 |
+
label.textContent = example.label;
|
| 121 |
+
|
| 122 |
+
const source = document.createElement('small');
|
| 123 |
+
const cocoId = example.src.match(/(\d{12})\.jpg$/)?.[1] || '';
|
| 124 |
+
source.textContent = cocoId ? `COCO val2017 · ${cocoId}` : 'COCO val2017';
|
| 125 |
+
|
| 126 |
+
button.append(image, label, source);
|
| 127 |
+
button.addEventListener('click', () => loadExample(example, button));
|
| 128 |
+
sampleGrid.appendChild(button);
|
| 129 |
+
}
|
| 130 |
+
}
|
| 131 |
+
|
| 132 |
+
function setBadge(text, mode = '') {
|
| 133 |
+
runtimeBadge.textContent = text;
|
| 134 |
+
runtimeBadge.className = `badge ${mode}`.trim();
|
| 135 |
+
}
|
| 136 |
+
function setProgress(data) {
|
| 137 |
+
let pct = null;
|
| 138 |
+
|
| 139 |
+
if (typeof data?.progress === 'number') {
|
| 140 |
+
pct = data.progress;
|
| 141 |
+
} else if (data?.total && typeof data?.loaded === 'number') {
|
| 142 |
+
pct = (data.loaded / data.total) * 100;
|
| 143 |
+
}
|
| 144 |
+
|
| 145 |
+
if (pct !== null && Number.isFinite(pct)) {
|
| 146 |
+
progressWrap.hidden = false;
|
| 147 |
+
progressBar.style.width = `${Math.max(0, Math.min(100, pct))}%`;
|
| 148 |
+
}
|
| 149 |
+
|
| 150 |
+
if (data?.status === 'progress' && data?.file) {
|
| 151 |
+
statusEl.textContent = `Downloading model: ${data.file}`;
|
| 152 |
+
}
|
| 153 |
+
}
|
| 154 |
+
|
| 155 |
+
function drawBaseImage() {
|
| 156 |
+
if (!state.image) return;
|
| 157 |
+
|
| 158 |
+
canvas.width = state.image.naturalWidth;
|
| 159 |
+
canvas.height = state.image.naturalHeight;
|
| 160 |
+
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
| 161 |
+
ctx.drawImage(state.image, 0, 0, canvas.width, canvas.height);
|
| 162 |
+
canvasWrap.classList.remove('empty');
|
| 163 |
+
}
|
| 164 |
+
function drawDetections(detections) {
|
| 165 |
+
drawBaseImage();
|
| 166 |
+
if (!state.image) return;
|
| 167 |
+
|
| 168 |
+
const scale = Math.max(1, Math.round(canvas.width / 900));
|
| 169 |
+
const fontSize = Math.max(14, Math.round(canvas.width / 55));
|
| 170 |
+
ctx.font = `700 ${fontSize}px system-ui, sans-serif`;
|
| 171 |
+
ctx.textBaseline = 'top';
|
| 172 |
+
|
| 173 |
+
for (const item of detections) {
|
| 174 |
+
const box = item.box;
|
| 175 |
+
const x1 = Math.max(0, Number(box.xmin));
|
| 176 |
+
const y1 = Math.max(0, Number(box.ymin));
|
| 177 |
+
const x2 = Math.min(canvas.width, Number(box.xmax));
|
| 178 |
+
const y2 = Math.min(canvas.height, Number(box.ymax));
|
| 179 |
+
const label = `${item.label} ${(Number(item.score) * 100).toFixed(0)}%`;
|
| 180 |
+
|
| 181 |
+
ctx.lineWidth = 3 * scale;
|
| 182 |
+
ctx.strokeStyle = '#ffffff';
|
| 183 |
+
ctx.strokeRect(x1, y1, Math.max(0, x2 - x1), Math.max(0, y2 - y1));
|
| 184 |
+
|
| 185 |
+
const pad = 5 * scale;
|
| 186 |
+
const metrics = ctx.measureText(label);
|
| 187 |
+
const textHeight = fontSize + 2 * pad;
|
| 188 |
+
const labelY = Math.max(0, y1 - textHeight);
|
| 189 |
+
|
| 190 |
+
ctx.fillStyle = '#111827';
|
| 191 |
+
ctx.fillRect(x1, labelY, metrics.width + 2 * pad, textHeight);
|
| 192 |
+
ctx.fillStyle = '#ffffff';
|
| 193 |
+
ctx.fillText(label, x1 + pad, labelY + pad);
|
| 194 |
+
}
|
| 195 |
+
}
|
| 196 |
+
function renderDetections(detections) {
|
| 197 |
+
tbody.innerHTML = '';
|
| 198 |
+
const option = getModelOption(modelSelect.value);
|
| 199 |
+
|
| 200 |
+
if (!detections.length) {
|
| 201 |
+
const row = document.createElement('tr');
|
| 202 |
+
row.className = 'empty-row';
|
| 203 |
+
const cell = document.createElement('td');
|
| 204 |
+
cell.colSpan = 3;
|
| 205 |
+
cell.textContent = 'No objects passed the current confidence threshold.';
|
| 206 |
+
row.appendChild(cell);
|
| 207 |
+
tbody.appendChild(row);
|
| 208 |
+
summary.textContent = `${option.label}: no detections. Try a lower threshold or another image.`;
|
| 209 |
+
return;
|
| 210 |
+
}
|
| 211 |
+
|
| 212 |
+
const counts = new Map();
|
| 213 |
+
for (const item of detections) {
|
| 214 |
+
counts.set(item.label, (counts.get(item.label) || 0) + 1);
|
| 215 |
+
|
| 216 |
+
const row = document.createElement('tr');
|
| 217 |
+
const box = item.box;
|
| 218 |
+
const values = [
|
| 219 |
+
item.label,
|
| 220 |
+
`${(Number(item.score) * 100).toFixed(1)}%`,
|
| 221 |
+
`(${Math.round(box.xmin)}, ${Math.round(box.ymin)}) → (${Math.round(box.xmax)}, ${Math.round(box.ymax)})`,
|
| 222 |
+
];
|
| 223 |
+
|
| 224 |
+
for (const value of values) {
|
| 225 |
+
const cell = document.createElement('td');
|
| 226 |
+
cell.textContent = value;
|
| 227 |
+
row.appendChild(cell);
|
| 228 |
+
}
|
| 229 |
+
tbody.appendChild(row);
|
| 230 |
+
}
|
| 231 |
+
const pieces = [...counts.entries()]
|
| 232 |
+
.sort(([a], [b]) => a.localeCompare(b))
|
| 233 |
+
.map(([label, count]) => `${label}: ${count}`);
|
| 234 |
+
|
| 235 |
+
summary.textContent = `${option.label} found — ${pieces.join(', ')}`;
|
| 236 |
+
}
|
| 237 |
+
|
| 238 |
+
threshold.addEventListener('input', () => {
|
| 239 |
+
thresholdValue.value = Number(threshold.value).toFixed(2);
|
| 240 |
+
});
|
| 241 |
+
|
| 242 |
+
modelSelect.addEventListener('change', () => {
|
| 243 |
+
const option = getModelOption(modelSelect.value);
|
| 244 |
+
modelNote.textContent = option.note;
|
| 245 |
+
setBadge(`Model: ${option.label}`);
|
| 246 |
+
if (state.image) statusEl.textContent = `Model changed to ${option.label}. Run again to compare results.`;
|
| 247 |
+
});
|
| 248 |
+
imageInput.addEventListener('change', () => {
|
| 249 |
+
const file = imageInput.files?.[0];
|
| 250 |
+
if (!file) return;
|
| 251 |
+
|
| 252 |
+
if (!file.type.startsWith('image/')) {
|
| 253 |
+
statusEl.textContent = 'Please choose an image file.';
|
| 254 |
+
setBadge('Invalid file', 'error');
|
| 255 |
+
runButton.disabled = true;
|
| 256 |
+
return;
|
| 257 |
+
}
|
| 258 |
+
|
| 259 |
+
document.querySelectorAll('.sample-card').forEach((card) => card.classList.remove('selected'));
|
| 260 |
+
const reader = new FileReader();
|
| 261 |
+
reader.onload = () => setSelectedImage(reader.result, 'Your image is ready. Click Run AI Detection.');
|
| 262 |
+
reader.onerror = () => {
|
| 263 |
+
statusEl.textContent = 'Could not read that image.';
|
| 264 |
+
setBadge('Image error', 'error');
|
| 265 |
+
};
|
| 266 |
+
reader.readAsDataURL(file);
|
| 267 |
+
});
|
| 268 |
+
|
| 269 |
+
shuffleButton.addEventListener('click', () => {
|
| 270 |
+
renderExampleChoices();
|
| 271 |
+
statusEl.textContent = state.image
|
| 272 |
+
? 'New COCO examples shown. Your current image is still selected.'
|
| 273 |
+
: 'Choose a COCO example, or upload your own image.';
|
| 274 |
+
});
|
| 275 |
+
|
| 276 |
+
renderModelChoices();
|
| 277 |
+
renderExampleChoices();
|
| 278 |
+
runButton.addEventListener('click', async () => {
|
| 279 |
+
if (!state.dataUrl || !state.image) return;
|
| 280 |
+
|
| 281 |
+
const option = getModelOption(modelSelect.value);
|
| 282 |
+
runButton.disabled = true;
|
| 283 |
+
setBadge(`Loading ${option.label}`, 'running');
|
| 284 |
+
progressWrap.hidden = false;
|
| 285 |
+
progressBar.style.width = '4%';
|
| 286 |
+
const started = performance.now();
|
| 287 |
+
|
| 288 |
+
try {
|
| 289 |
+
statusEl.textContent = `Preparing ${option.label}. The first run may download model files.`;
|
| 290 |
+
const detections = await detectObjects(state.dataUrl, {
|
| 291 |
+
modelKey: option.key,
|
| 292 |
+
threshold: Number(threshold.value),
|
| 293 |
+
progressCallback: setProgress,
|
| 294 |
+
});
|
| 295 |
+
|
| 296 |
+
drawDetections(detections);
|
| 297 |
+
renderDetections(detections);
|
| 298 |
+
|
| 299 |
+
const seconds = ((performance.now() - started) / 1000).toFixed(1);
|
| 300 |
+
statusEl.textContent = `Done in ${seconds}s with ${option.label}. Change model or threshold to compare.`;
|
| 301 |
+
setBadge(`${detections.length} detections`, 'ready');
|
| 302 |
+
} catch (error) {
|
| 303 |
+
console.error(error);
|
| 304 |
+
statusEl.textContent = `${option.label} failed to run. Check your connection or switch back to RT-DETR.`;
|
| 305 |
+
setBadge('Error', 'error');
|
| 306 |
+
} finally {
|
| 307 |
+
progressWrap.hidden = true;
|
| 308 |
+
runButton.disabled = false;
|
| 309 |
+
}
|
| 310 |
+
});
|
ai-powered-object-detection/detector.js
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import { pipeline } from 'https://cdn.jsdelivr.net/npm/@huggingface/transformers@4.2.0';
|
| 2 |
+
|
| 3 |
+
export const MODEL_OPTIONS = [
|
| 4 |
+
{
|
| 5 |
+
key: 'rtdetr',
|
| 6 |
+
label: 'RT-DETR R18',
|
| 7 |
+
modelId: 'onnx-community/rtdetr_r18vd',
|
| 8 |
+
note: 'Recommended classroom default: modern real-time transformer-style detector.',
|
| 9 |
+
dtype: 'q8',
|
| 10 |
+
},
|
| 11 |
+
{
|
| 12 |
+
key: 'detr',
|
| 13 |
+
label: 'DETR ResNet-50',
|
| 14 |
+
modelId: 'Xenova/detr-resnet-50',
|
| 15 |
+
note: 'Representative DETR-family detector. Larger download; useful for comparison.',
|
| 16 |
+
dtype: 'q8',
|
| 17 |
+
},
|
| 18 |
+
{
|
| 19 |
+
key: 'yolos',
|
| 20 |
+
label: 'YOLOS Tiny',
|
| 21 |
+
modelId: 'Xenova/yolos-tiny',
|
| 22 |
+
note: 'Small browser-friendly detector. Useful for showing that model choice changes results.',
|
| 23 |
+
dtype: 'q8',
|
| 24 |
+
},
|
| 25 |
+
];
|
| 26 |
+
|
| 27 |
+
const detectorCache = new Map();
|
| 28 |
+
export function getModelOption(key) {
|
| 29 |
+
return MODEL_OPTIONS.find((model) => model.key === key) || MODEL_OPTIONS[0];
|
| 30 |
+
}
|
| 31 |
+
|
| 32 |
+
export async function loadDetector(modelKey, progressCallback) {
|
| 33 |
+
const option = getModelOption(modelKey);
|
| 34 |
+
if (detectorCache.has(option.key)) return detectorCache.get(option.key);
|
| 35 |
+
|
| 36 |
+
const detector = await pipeline('object-detection', option.modelId, {
|
| 37 |
+
dtype: option.dtype,
|
| 38 |
+
progress_callback: progressCallback,
|
| 39 |
+
});
|
| 40 |
+
|
| 41 |
+
detectorCache.set(option.key, detector);
|
| 42 |
+
return detector;
|
| 43 |
+
}
|
| 44 |
+
|
| 45 |
+
export async function detectObjects(imageDataUrl, options = {}) {
|
| 46 |
+
const modelKey = options.modelKey || MODEL_OPTIONS[0].key;
|
| 47 |
+
const threshold = Number.isFinite(options.threshold) ? options.threshold : 0.5;
|
| 48 |
+
const detector = await loadDetector(modelKey, options.progressCallback);
|
| 49 |
+
return detector(imageDataUrl, { threshold });
|
| 50 |
+
}
|
ai-powered-object-detection/examples/000000037777.jpg
ADDED
|
ai-powered-object-detection/examples/000000039769.jpg
ADDED
|
Git LFS Details
|
ai-powered-object-detection/examples/000000087038.jpg
ADDED
|
Git LFS Details
|
ai-powered-object-detection/examples/000000174482.jpg
ADDED
|
Git LFS Details
|
ai-powered-object-detection/examples/000000181666.jpg
ADDED
|
Git LFS Details
|
ai-powered-object-detection/examples/000000252219.jpg
ADDED
|
Git LFS Details
|
ai-powered-object-detection/examples/000000376310.jpg
ADDED
|
Git LFS Details
|
ai-powered-object-detection/examples/000000397133.jpg
ADDED
|
Git LFS Details
|
ai-powered-object-detection/examples/coco_val2017_subset.csv
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
image_id,classroom_label,source_url
|
| 2 |
+
000000039769,Cats & remotes,http://images.cocodataset.org/val2017/000000039769.jpg
|
| 3 |
+
000000397133,Busy kitchen,http://images.cocodataset.org/val2017/000000397133.jpg
|
| 4 |
+
000000252219,Street scene,http://images.cocodataset.org/val2017/000000252219.jpg
|
| 5 |
+
000000037777,Kitchen objects,http://images.cocodataset.org/val2017/000000037777.jpg
|
| 6 |
+
000000087038,Skate park,http://images.cocodataset.org/val2017/000000087038.jpg
|
| 7 |
+
000000174482,Bike & traffic,http://images.cocodataset.org/val2017/000000174482.jpg
|
| 8 |
+
000000181666,Herd & person,http://images.cocodataset.org/val2017/000000181666.jpg
|
| 9 |
+
000000376310,Bathroom objects,http://images.cocodataset.org/val2017/000000376310.jpg
|
ai-powered-object-detection/index.html
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="utf-8" />
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
| 6 |
+
<meta name="description" content="AI-Powered Object Detection mini-lab using COCO examples and a pretrained model" />
|
| 7 |
+
<title>AI-Powered Object Detection</title>
|
| 8 |
+
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>🔎</text></svg>" />
|
| 9 |
+
<link rel="stylesheet" href="./style.css" />
|
| 10 |
+
</head>
|
| 11 |
+
<body>
|
| 12 |
+
<main class="page-shell">
|
| 13 |
+
<header class="hero">
|
| 14 |
+
<p class="eyebrow">Creative Technology · Computer Vision</p>
|
| 15 |
+
<h1>AI-Powered Object Detection</h1>
|
| 16 |
+
<p class="lede">Pick a COCO example or upload your own image. Then choose a pretrained detector and let AI answer: <strong>what objects are here, and where are they?</strong></p>
|
| 17 |
+
<div class="lesson-strip" aria-label="Mini-lab overview">
|
| 18 |
+
<span><b>Task</b> Object detection</span>
|
| 19 |
+
<span><b>Data</b> COCO validation examples</span>
|
| 20 |
+
<span><b>Models</b> RT-DETR · DETR · YOLOS Tiny</span>
|
| 21 |
+
</div>
|
| 22 |
+
</header>
|
| 23 |
+
|
| 24 |
+
<section class="workspace" aria-label="Object detection mini-lab">
|
| 25 |
+
<div class="controls card">
|
| 26 |
+
<div class="step">
|
| 27 |
+
<span class="step-number">1</span>
|
| 28 |
+
<div>
|
| 29 |
+
<p class="control-label sample-title">Choose an image</p>
|
| 30 |
+
<p class="helper">Start with a tested COCO example, or try a photo of your own.</p>
|
| 31 |
+
</div>
|
| 32 |
+
</div>
|
| 33 |
+
|
| 34 |
+
<div class="sample-head coco-head">
|
| 35 |
+
<div>
|
| 36 |
+
<p class="input-kicker">Start here · COCO examples</p>
|
| 37 |
+
<p class="helper">Four images are drawn at random from our pre-tested COCO sample bank.</p>
|
| 38 |
+
</div>
|
| 39 |
+
<button id="shuffle-examples" class="shuffle-button" type="button">Shuffle</button>
|
| 40 |
+
</div>
|
| 41 |
+
<div id="sample-grid" class="sample-grid" aria-label="COCO example images"></div>
|
| 42 |
+
<div class="or-row"><span>or try your own</span></div>
|
| 43 |
+
<label class="control-label" for="image-input">Upload an image</label>
|
| 44 |
+
<p class="helper">Useful for seeing where the model generalizes well—and where it does not.</p>
|
| 45 |
+
<input id="image-input" class="file-input" type="file" accept="image/*" />
|
| 46 |
+
|
| 47 |
+
<div class="divider"></div>
|
| 48 |
+
|
| 49 |
+
<div class="step">
|
| 50 |
+
<span class="step-number">2</span>
|
| 51 |
+
<div class="grow">
|
| 52 |
+
<label class="control-label" for="model-select">Choose detector</label>
|
| 53 |
+
<select id="model-select" class="model-select"></select>
|
| 54 |
+
<p id="model-note" class="helper">RT-DETR is the recommended classroom default.</p>
|
| 55 |
+
</div>
|
| 56 |
+
</div>
|
| 57 |
+
|
| 58 |
+
<div class="divider"></div>
|
| 59 |
+
|
| 60 |
+
<div class="step">
|
| 61 |
+
<span class="step-number">3</span>
|
| 62 |
+
<div class="grow">
|
| 63 |
+
<div class="slider-row">
|
| 64 |
+
<label class="control-label" for="threshold">Confidence threshold</label>
|
| 65 |
+
<output id="threshold-value" for="threshold">0.50</output>
|
| 66 |
+
</div>
|
| 67 |
+
<input id="threshold" type="range" min="0.10" max="0.95" value="0.50" step="0.05" />
|
| 68 |
+
<p class="helper">Higher values only keep predictions the model is more confident about.</p>
|
| 69 |
+
</div>
|
| 70 |
+
</div>
|
| 71 |
+
|
| 72 |
+
<button id="run-button" class="run-button" type="button" disabled>Run AI Detection</button>
|
| 73 |
+
<p id="status" class="status" aria-live="polite">Choose a COCO example or upload your own image.</p>
|
| 74 |
+
<div id="progress-wrap" class="progress-wrap" hidden>
|
| 75 |
+
<div id="progress-bar" class="progress-bar"></div>
|
| 76 |
+
</div>
|
| 77 |
+
</div>
|
| 78 |
+
|
| 79 |
+
<div class="result card">
|
| 80 |
+
<div class="result-head">
|
| 81 |
+
<div>
|
| 82 |
+
<p class="section-kicker">AI prediction</p>
|
| 83 |
+
<h2>What did the detector find?</h2>
|
| 84 |
+
</div>
|
| 85 |
+
<span id="runtime-badge" class="badge">Waiting</span>
|
| 86 |
+
</div>
|
| 87 |
+
<div id="canvas-wrap" class="canvas-wrap empty">
|
| 88 |
+
<canvas id="result-canvas" aria-label="Detection result"></canvas>
|
| 89 |
+
<p id="canvas-placeholder">Choose an image first. The original image appears here before detection.</p>
|
| 90 |
+
</div>
|
| 91 |
+
|
| 92 |
+
<div id="summary" class="summary">No detections yet.</div>
|
| 93 |
+
|
| 94 |
+
<div class="table-wrap">
|
| 95 |
+
<table>
|
| 96 |
+
<thead>
|
| 97 |
+
<tr>
|
| 98 |
+
<th>Object</th>
|
| 99 |
+
<th>Confidence</th>
|
| 100 |
+
<th>Bounding box</th>
|
| 101 |
+
</tr>
|
| 102 |
+
</thead>
|
| 103 |
+
<tbody id="detections-body">
|
| 104 |
+
<tr class="empty-row"><td colspan="3">Run the detector to see details.</td></tr>
|
| 105 |
+
</tbody>
|
| 106 |
+
</table>
|
| 107 |
+
</div>
|
| 108 |
+
</div>
|
| 109 |
+
</section>
|
| 110 |
+
|
| 111 |
+
<section class="explain card">
|
| 112 |
+
<p class="section-kicker">What you are doing</p>
|
| 113 |
+
<h2 class="explain-title">Use a learned AI capability instead of rebuilding the traditional task from scratch.</h2>
|
| 114 |
+
<p class="explain-copy">COCO contains everyday-object images with annotations. The selected pretrained detector has already learned the object-detection task from labeled data. In this mini-lab, you can switch models and compare how their predictions differ on the same image.</p>
|
| 115 |
+
<div class="flow" aria-label="Object detection flow">
|
| 116 |
+
<span>COCO example or your image</span><span class="arrow">→</span>
|
| 117 |
+
<span>Selected pretrained detector</span><span class="arrow">→</span>
|
| 118 |
+
<span>Boxes + labels + confidence</span>
|
| 119 |
+
</div>
|
| 120 |
+
<p class="extension-note"><strong>Compare models:</strong> keep the image fixed, switch detector, and observe how predictions, confidence, and speed change.</p>
|
| 121 |
+
</section>
|
| 122 |
+
|
| 123 |
+
<footer>
|
| 124 |
+
Hosted as a Hugging Face Static Space · Powered by Transformers.js
|
| 125 |
+
</footer>
|
| 126 |
+
</main>
|
| 127 |
+
|
| 128 |
+
<script type="module" src="./app.js"></script>
|
| 129 |
+
</body>
|
| 130 |
+
</html>
|
ai-powered-object-detection/style.css
ADDED
|
@@ -0,0 +1,477 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
:root {
|
| 2 |
+
font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
|
| 3 |
+
color: #111827;
|
| 4 |
+
background: #f6f7fb;
|
| 5 |
+
font-synthesis: none;
|
| 6 |
+
}
|
| 7 |
+
|
| 8 |
+
* { box-sizing: border-box; }
|
| 9 |
+
|
| 10 |
+
body {
|
| 11 |
+
margin: 0;
|
| 12 |
+
min-height: 100vh;
|
| 13 |
+
background: radial-gradient(circle at top, #ffffff 0%, #f6f7fb 45%, #eef1f7 100%);
|
| 14 |
+
}
|
| 15 |
+
|
| 16 |
+
button, input, select { font: inherit; }
|
| 17 |
+
|
| 18 |
+
.page-shell {
|
| 19 |
+
width: min(1180px, calc(100% - 32px));
|
| 20 |
+
margin: 0 auto;
|
| 21 |
+
padding: 56px 0 40px;
|
| 22 |
+
}
|
| 23 |
+
|
| 24 |
+
.hero {
|
| 25 |
+
max-width: 820px;
|
| 26 |
+
margin-bottom: 28px;
|
| 27 |
+
}
|
| 28 |
+
|
| 29 |
+
.eyebrow, .section-kicker {
|
| 30 |
+
margin: 0 0 10px;
|
| 31 |
+
font-size: 0.78rem;
|
| 32 |
+
font-weight: 750;
|
| 33 |
+
letter-spacing: 0.08em;
|
| 34 |
+
text-transform: uppercase;
|
| 35 |
+
color: #52627a;
|
| 36 |
+
}
|
| 37 |
+
h1 {
|
| 38 |
+
margin: 0;
|
| 39 |
+
font-size: clamp(2.4rem, 6vw, 5.1rem);
|
| 40 |
+
line-height: 0.98;
|
| 41 |
+
letter-spacing: -0.055em;
|
| 42 |
+
}
|
| 43 |
+
|
| 44 |
+
.lede {
|
| 45 |
+
max-width: 720px;
|
| 46 |
+
margin: 22px 0 0;
|
| 47 |
+
font-size: clamp(1.05rem, 2vw, 1.3rem);
|
| 48 |
+
line-height: 1.6;
|
| 49 |
+
color: #4b5563;
|
| 50 |
+
}
|
| 51 |
+
|
| 52 |
+
.runtime-note {
|
| 53 |
+
display: inline-flex;
|
| 54 |
+
margin-top: 18px;
|
| 55 |
+
padding: 8px 12px;
|
| 56 |
+
border: 1px solid #dbe1ea;
|
| 57 |
+
border-radius: 999px;
|
| 58 |
+
background: rgba(255,255,255,.72);
|
| 59 |
+
color: #48566c;
|
| 60 |
+
font-size: 0.9rem;
|
| 61 |
+
}
|
| 62 |
+
|
| 63 |
+
.workspace {
|
| 64 |
+
display: grid;
|
| 65 |
+
grid-template-columns: minmax(280px, 0.72fr) minmax(0, 1.45fr);
|
| 66 |
+
gap: 20px;
|
| 67 |
+
align-items: start;
|
| 68 |
+
}
|
| 69 |
+
|
| 70 |
+
.card {
|
| 71 |
+
border: 1px solid #e0e5ed;
|
| 72 |
+
border-radius: 22px;
|
| 73 |
+
background: rgba(255,255,255,.93);
|
| 74 |
+
box-shadow: 0 18px 50px rgba(26, 39, 63, 0.08);
|
| 75 |
+
}
|
| 76 |
+
.controls { padding: 24px; }
|
| 77 |
+
.result { padding: 24px; }
|
| 78 |
+
|
| 79 |
+
.step {
|
| 80 |
+
display: flex;
|
| 81 |
+
gap: 13px;
|
| 82 |
+
align-items: flex-start;
|
| 83 |
+
}
|
| 84 |
+
|
| 85 |
+
.step-number {
|
| 86 |
+
display: grid;
|
| 87 |
+
place-items: center;
|
| 88 |
+
width: 28px;
|
| 89 |
+
height: 28px;
|
| 90 |
+
flex: 0 0 28px;
|
| 91 |
+
border-radius: 50%;
|
| 92 |
+
background: #111827;
|
| 93 |
+
color: white;
|
| 94 |
+
font-size: 0.82rem;
|
| 95 |
+
font-weight: 750;
|
| 96 |
+
}
|
| 97 |
+
|
| 98 |
+
.grow { flex: 1; }
|
| 99 |
+
.control-label { font-weight: 700; }
|
| 100 |
+
.helper {
|
| 101 |
+
margin: 6px 0 0;
|
| 102 |
+
color: #667085;
|
| 103 |
+
font-size: 0.92rem;
|
| 104 |
+
line-height: 1.5;
|
| 105 |
+
}
|
| 106 |
+
|
| 107 |
+
.file-input {
|
| 108 |
+
width: 100%;
|
| 109 |
+
margin-top: 16px;
|
| 110 |
+
padding: 11px;
|
| 111 |
+
border: 1px dashed #bac3d2;
|
| 112 |
+
border-radius: 14px;
|
| 113 |
+
background: #fafbfc;
|
| 114 |
+
}
|
| 115 |
+
|
| 116 |
+
.divider {
|
| 117 |
+
height: 1px;
|
| 118 |
+
margin: 22px 0;
|
| 119 |
+
background: #eceff4;
|
| 120 |
+
}
|
| 121 |
+
.slider-row {
|
| 122 |
+
display: flex;
|
| 123 |
+
justify-content: space-between;
|
| 124 |
+
gap: 12px;
|
| 125 |
+
}
|
| 126 |
+
|
| 127 |
+
#threshold-value {
|
| 128 |
+
min-width: 48px;
|
| 129 |
+
text-align: right;
|
| 130 |
+
color: #334155;
|
| 131 |
+
font-variant-numeric: tabular-nums;
|
| 132 |
+
}
|
| 133 |
+
|
| 134 |
+
#threshold {
|
| 135 |
+
width: 100%;
|
| 136 |
+
margin-top: 13px;
|
| 137 |
+
accent-color: #111827;
|
| 138 |
+
}
|
| 139 |
+
|
| 140 |
+
.run-button {
|
| 141 |
+
width: 100%;
|
| 142 |
+
margin-top: 24px;
|
| 143 |
+
padding: 13px 18px;
|
| 144 |
+
border: 0;
|
| 145 |
+
border-radius: 14px;
|
| 146 |
+
background: #111827;
|
| 147 |
+
color: white;
|
| 148 |
+
font-weight: 750;
|
| 149 |
+
cursor: pointer;
|
| 150 |
+
transition: transform .15s ease, opacity .15s ease;
|
| 151 |
+
}
|
| 152 |
+
|
| 153 |
+
.run-button:not(:disabled):hover { transform: translateY(-1px); }
|
| 154 |
+
.run-button:disabled { opacity: .38; cursor: not-allowed; }
|
| 155 |
+
|
| 156 |
+
.status {
|
| 157 |
+
min-height: 1.4em;
|
| 158 |
+
margin: 14px 0 0;
|
| 159 |
+
color: #52627a;
|
| 160 |
+
font-size: .9rem;
|
| 161 |
+
}
|
| 162 |
+
|
| 163 |
+
.progress-wrap {
|
| 164 |
+
height: 5px;
|
| 165 |
+
margin-top: 10px;
|
| 166 |
+
overflow: hidden;
|
| 167 |
+
border-radius: 999px;
|
| 168 |
+
background: #edf0f5;
|
| 169 |
+
}
|
| 170 |
+
.progress-bar {
|
| 171 |
+
width: 0%;
|
| 172 |
+
height: 100%;
|
| 173 |
+
border-radius: inherit;
|
| 174 |
+
background: #111827;
|
| 175 |
+
transition: width .2s ease;
|
| 176 |
+
}
|
| 177 |
+
|
| 178 |
+
.result-head {
|
| 179 |
+
display: flex;
|
| 180 |
+
justify-content: space-between;
|
| 181 |
+
gap: 16px;
|
| 182 |
+
align-items: flex-start;
|
| 183 |
+
margin-bottom: 16px;
|
| 184 |
+
}
|
| 185 |
+
|
| 186 |
+
.result h2 {
|
| 187 |
+
margin: 0;
|
| 188 |
+
font-size: 1.35rem;
|
| 189 |
+
letter-spacing: -0.02em;
|
| 190 |
+
}
|
| 191 |
+
|
| 192 |
+
.badge {
|
| 193 |
+
padding: 7px 10px;
|
| 194 |
+
border-radius: 999px;
|
| 195 |
+
background: #eef2f7;
|
| 196 |
+
color: #536176;
|
| 197 |
+
font-size: .82rem;
|
| 198 |
+
font-weight: 700;
|
| 199 |
+
white-space: nowrap;
|
| 200 |
+
}
|
| 201 |
+
|
| 202 |
+
.badge.ready { background: #e8f7ef; color: #17623c; }
|
| 203 |
+
.badge.running { background: #fff4df; color: #805600; }
|
| 204 |
+
.badge.error { background: #fdecec; color: #9b2c2c; }
|
| 205 |
+
|
| 206 |
+
.canvas-wrap {
|
| 207 |
+
position: relative;
|
| 208 |
+
display: grid;
|
| 209 |
+
place-items: center;
|
| 210 |
+
min-height: 360px;
|
| 211 |
+
overflow: hidden;
|
| 212 |
+
border-radius: 16px;
|
| 213 |
+
background: #101318;
|
| 214 |
+
}
|
| 215 |
+
#result-canvas {
|
| 216 |
+
display: block;
|
| 217 |
+
max-width: 100%;
|
| 218 |
+
height: auto;
|
| 219 |
+
}
|
| 220 |
+
|
| 221 |
+
.canvas-wrap.empty #result-canvas { display: none; }
|
| 222 |
+
|
| 223 |
+
#canvas-placeholder {
|
| 224 |
+
margin: 0;
|
| 225 |
+
padding: 32px;
|
| 226 |
+
color: #9aa4b2;
|
| 227 |
+
text-align: center;
|
| 228 |
+
}
|
| 229 |
+
|
| 230 |
+
.canvas-wrap:not(.empty) #canvas-placeholder { display: none; }
|
| 231 |
+
|
| 232 |
+
.summary {
|
| 233 |
+
margin: 16px 0;
|
| 234 |
+
padding: 13px 15px;
|
| 235 |
+
border-radius: 13px;
|
| 236 |
+
background: #f7f8fa;
|
| 237 |
+
color: #344054;
|
| 238 |
+
font-weight: 650;
|
| 239 |
+
}
|
| 240 |
+
|
| 241 |
+
.table-wrap {
|
| 242 |
+
overflow-x: auto;
|
| 243 |
+
border: 1px solid #e8ebf0;
|
| 244 |
+
border-radius: 14px;
|
| 245 |
+
}
|
| 246 |
+
|
| 247 |
+
table {
|
| 248 |
+
width: 100%;
|
| 249 |
+
border-collapse: collapse;
|
| 250 |
+
font-size: .9rem;
|
| 251 |
+
}
|
| 252 |
+
|
| 253 |
+
th, td {
|
| 254 |
+
padding: 11px 13px;
|
| 255 |
+
border-bottom: 1px solid #edf0f4;
|
| 256 |
+
text-align: left;
|
| 257 |
+
vertical-align: top;
|
| 258 |
+
}
|
| 259 |
+
|
| 260 |
+
th {
|
| 261 |
+
background: #fafbfc;
|
| 262 |
+
color: #52627a;
|
| 263 |
+
font-size: .78rem;
|
| 264 |
+
text-transform: uppercase;
|
| 265 |
+
letter-spacing: .05em;
|
| 266 |
+
}
|
| 267 |
+
tbody tr:last-child td { border-bottom: 0; }
|
| 268 |
+
.empty-row td { color: #7d899a; text-align: center; }
|
| 269 |
+
|
| 270 |
+
.explain {
|
| 271 |
+
margin-top: 20px;
|
| 272 |
+
padding: 22px 24px;
|
| 273 |
+
}
|
| 274 |
+
|
| 275 |
+
.flow {
|
| 276 |
+
display: flex;
|
| 277 |
+
flex-wrap: wrap;
|
| 278 |
+
gap: 10px;
|
| 279 |
+
align-items: center;
|
| 280 |
+
font-weight: 700;
|
| 281 |
+
}
|
| 282 |
+
|
| 283 |
+
.flow span:not(.arrow) {
|
| 284 |
+
padding: 8px 11px;
|
| 285 |
+
border-radius: 10px;
|
| 286 |
+
background: #f2f4f7;
|
| 287 |
+
}
|
| 288 |
+
|
| 289 |
+
.arrow { color: #98a2b3; }
|
| 290 |
+
|
| 291 |
+
footer {
|
| 292 |
+
padding: 22px 2px 0;
|
| 293 |
+
color: #7a8595;
|
| 294 |
+
font-size: .84rem;
|
| 295 |
+
}
|
| 296 |
+
@media (max-width: 820px) {
|
| 297 |
+
.page-shell {
|
| 298 |
+
width: min(100% - 20px, 720px);
|
| 299 |
+
padding-top: 34px;
|
| 300 |
+
}
|
| 301 |
+
|
| 302 |
+
.workspace { grid-template-columns: 1fr; }
|
| 303 |
+
.canvas-wrap { min-height: 280px; }
|
| 304 |
+
}
|
| 305 |
+
|
| 306 |
+
@media (max-width: 520px) {
|
| 307 |
+
.card { border-radius: 17px; }
|
| 308 |
+
.controls, .result, .explain { padding: 18px; }
|
| 309 |
+
.result-head { align-items: center; }
|
| 310 |
+
th, td { padding: 9px 10px; }
|
| 311 |
+
}
|
| 312 |
+
|
| 313 |
+
.or-row {
|
| 314 |
+
display: flex;
|
| 315 |
+
align-items: center;
|
| 316 |
+
gap: 10px;
|
| 317 |
+
margin: 18px 0 14px;
|
| 318 |
+
color: #98a2b3;
|
| 319 |
+
font-size: .8rem;
|
| 320 |
+
text-transform: uppercase;
|
| 321 |
+
letter-spacing: .08em;
|
| 322 |
+
}
|
| 323 |
+
.or-row::before, .or-row::after {
|
| 324 |
+
content: '';
|
| 325 |
+
height: 1px;
|
| 326 |
+
flex: 1;
|
| 327 |
+
background: #eceff4;
|
| 328 |
+
}
|
| 329 |
+
|
| 330 |
+
.sample-head {
|
| 331 |
+
display: flex;
|
| 332 |
+
justify-content: space-between;
|
| 333 |
+
gap: 12px;
|
| 334 |
+
align-items: flex-start;
|
| 335 |
+
}
|
| 336 |
+
.sample-title { margin: 0; }
|
| 337 |
+
.shuffle-button {
|
| 338 |
+
flex: 0 0 auto;
|
| 339 |
+
padding: 7px 10px;
|
| 340 |
+
border: 1px solid #d8dee8;
|
| 341 |
+
border-radius: 10px;
|
| 342 |
+
background: #fff;
|
| 343 |
+
color: #344054;
|
| 344 |
+
cursor: pointer;
|
| 345 |
+
font-size: .82rem;
|
| 346 |
+
font-weight: 700;
|
| 347 |
+
}
|
| 348 |
+
|
| 349 |
+
.shuffle-button:hover { background: #f7f8fa; }
|
| 350 |
+
.sample-grid {
|
| 351 |
+
display: grid;
|
| 352 |
+
grid-template-columns: repeat(2, minmax(0, 1fr));
|
| 353 |
+
gap: 10px;
|
| 354 |
+
margin-top: 12px;
|
| 355 |
+
}
|
| 356 |
+
.sample-card {
|
| 357 |
+
min-width: 0;
|
| 358 |
+
padding: 0;
|
| 359 |
+
overflow: hidden;
|
| 360 |
+
border: 1px solid #e0e5ed;
|
| 361 |
+
border-radius: 12px;
|
| 362 |
+
background: #fff;
|
| 363 |
+
cursor: pointer;
|
| 364 |
+
text-align: left;
|
| 365 |
+
transition: border-color .15s ease, transform .15s ease, box-shadow .15s ease;
|
| 366 |
+
}
|
| 367 |
+
.sample-card:hover {
|
| 368 |
+
transform: translateY(-1px);
|
| 369 |
+
border-color: #aeb8c6;
|
| 370 |
+
box-shadow: 0 8px 18px rgba(26,39,63,.08);
|
| 371 |
+
}
|
| 372 |
+
.sample-card.selected {
|
| 373 |
+
border-color: #111827;
|
| 374 |
+
box-shadow: 0 0 0 2px #111827;
|
| 375 |
+
}
|
| 376 |
+
.sample-card img {
|
| 377 |
+
display: block;
|
| 378 |
+
width: 100%;
|
| 379 |
+
aspect-ratio: 4 / 3;
|
| 380 |
+
object-fit: cover;
|
| 381 |
+
background: #eef1f5;
|
| 382 |
+
}
|
| 383 |
+
|
| 384 |
+
.sample-card span {
|
| 385 |
+
display: block;
|
| 386 |
+
padding: 8px 9px 9px;
|
| 387 |
+
overflow: hidden;
|
| 388 |
+
color: #475467;
|
| 389 |
+
font-size: .78rem;
|
| 390 |
+
font-weight: 700;
|
| 391 |
+
text-overflow: ellipsis;
|
| 392 |
+
white-space: nowrap;
|
| 393 |
+
}
|
| 394 |
+
|
| 395 |
+
@media (max-width: 420px) {
|
| 396 |
+
.sample-head { align-items: center; }
|
| 397 |
+
.sample-grid { grid-template-columns: 1fr 1fr; gap: 8px; }
|
| 398 |
+
}
|
| 399 |
+
|
| 400 |
+
/* v1.0 teaching-flow refinements */
|
| 401 |
+
.lesson-strip {
|
| 402 |
+
display: flex;
|
| 403 |
+
flex-wrap: wrap;
|
| 404 |
+
gap: 10px;
|
| 405 |
+
margin-top: 18px;
|
| 406 |
+
}
|
| 407 |
+
.lesson-strip span {
|
| 408 |
+
padding: 8px 11px;
|
| 409 |
+
border: 1px solid #dfe4ec;
|
| 410 |
+
border-radius: 999px;
|
| 411 |
+
background: rgba(255, 255, 255, .76);
|
| 412 |
+
color: #52627a;
|
| 413 |
+
font-size: .86rem;
|
| 414 |
+
}
|
| 415 |
+
.lesson-strip b {
|
| 416 |
+
color: #111827;
|
| 417 |
+
margin-right: 4px;
|
| 418 |
+
}
|
| 419 |
+
|
| 420 |
+
.coco-head {
|
| 421 |
+
margin-top: 18px;
|
| 422 |
+
}
|
| 423 |
+
.input-kicker {
|
| 424 |
+
margin: 0 0 4px;
|
| 425 |
+
color: #344054;
|
| 426 |
+
font-size: .78rem;
|
| 427 |
+
font-weight: 800;
|
| 428 |
+
letter-spacing: .04em;
|
| 429 |
+
text-transform: uppercase;
|
| 430 |
+
}
|
| 431 |
+
|
| 432 |
+
.explain-title {
|
| 433 |
+
max-width: 820px;
|
| 434 |
+
margin: 0;
|
| 435 |
+
font-size: clamp(1.25rem, 2vw, 1.7rem);
|
| 436 |
+
line-height: 1.25;
|
| 437 |
+
letter-spacing: -.025em;
|
| 438 |
+
}
|
| 439 |
+
.explain-copy {
|
| 440 |
+
max-width: 900px;
|
| 441 |
+
margin: 12px 0 18px;
|
| 442 |
+
color: #536176;
|
| 443 |
+
line-height: 1.65;
|
| 444 |
+
}
|
| 445 |
+
.extension-note {
|
| 446 |
+
margin: 16px 0 0;
|
| 447 |
+
padding-top: 14px;
|
| 448 |
+
border-top: 1px solid #eceff4;
|
| 449 |
+
color: #5d6879;
|
| 450 |
+
font-size: .92rem;
|
| 451 |
+
line-height: 1.55;
|
| 452 |
+
}
|
| 453 |
+
|
| 454 |
+
.sample-card small {
|
| 455 |
+
display: block;
|
| 456 |
+
padding: 0 9px 9px;
|
| 457 |
+
color: #8a94a4;
|
| 458 |
+
font-size: .67rem;
|
| 459 |
+
line-height: 1.2;
|
| 460 |
+
letter-spacing: .01em;
|
| 461 |
+
}
|
| 462 |
+
|
| 463 |
+
|
| 464 |
+
/* v8 browser model selector */
|
| 465 |
+
.model-select {
|
| 466 |
+
width: 100%;
|
| 467 |
+
margin-top: 10px;
|
| 468 |
+
padding: 11px 12px;
|
| 469 |
+
border: 1px solid #cfd7e3;
|
| 470 |
+
border-radius: 12px;
|
| 471 |
+
background: #fff;
|
| 472 |
+
color: #111827;
|
| 473 |
+
}
|
| 474 |
+
.model-select:focus {
|
| 475 |
+
outline: 2px solid #111827;
|
| 476 |
+
outline-offset: 2px;
|
| 477 |
+
}
|