π [New] Huggingface examples!
Browse files- README.md +3 -1
- demo/hf_demo.py +76 -0
- yolo/__init__.py +2 -1
README.md
CHANGED
@@ -1,6 +1,8 @@
|
|
1 |
# YOLO: Official Implementation of YOLOv9, YOLOv7
|
2 |
|
|
|
3 |

|
|
|
4 |
> [!IMPORTANT]
|
5 |
> This project is currently a Work In Progress and may undergo significant changes. It is not recommended for use in production environments until further notice. Please check back regularly for updates.
|
6 |
>
|
@@ -35,7 +37,7 @@ pip install -r requirements.txt
|
|
35 |
|
36 |
| Tools | pip π | HuggingFace π€ | Docker π³ |
|
37 |
| -------------------- | :----: | :--------------: | :-------: |
|
38 |
-
| Compatibility | β
|
|
39 |
|
40 |
| Phase | Training | Validation | Inference |
|
41 |
| ------------------- | :------: | :---------: | :-------: |
|
|
|
1 |
# YOLO: Official Implementation of YOLOv9, YOLOv7
|
2 |
|
3 |
+

|
4 |

|
5 |
+
[](https://huggingface.co/spaces/henry000/YOLO)
|
6 |
> [!IMPORTANT]
|
7 |
> This project is currently a Work In Progress and may undergo significant changes. It is not recommended for use in production environments until further notice. Please check back regularly for updates.
|
8 |
>
|
|
|
37 |
|
38 |
| Tools | pip π | HuggingFace π€ | Docker π³ |
|
39 |
| -------------------- | :----: | :--------------: | :-------: |
|
40 |
+
| Compatibility | β
| β
| π§ͺ |
|
41 |
|
42 |
| Phase | Training | Validation | Inference |
|
43 |
| ------------------- | :------: | :---------: | :-------: |
|
demo/hf_demo.py
ADDED
@@ -0,0 +1,76 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import sys
|
2 |
+
from pathlib import Path
|
3 |
+
|
4 |
+
import gradio
|
5 |
+
import torch
|
6 |
+
from omegaconf import OmegaConf
|
7 |
+
|
8 |
+
sys.path.append(str(Path(__file__).resolve().parent.parent))
|
9 |
+
|
10 |
+
from yolo import (
|
11 |
+
AugmentationComposer,
|
12 |
+
NMSConfig,
|
13 |
+
Vec2Box,
|
14 |
+
bbox_nms,
|
15 |
+
create_model,
|
16 |
+
draw_bboxes,
|
17 |
+
)
|
18 |
+
|
19 |
+
DEFAULT_MODEL = "v9-c"
|
20 |
+
IMAGE_SIZE = (640, 640)
|
21 |
+
|
22 |
+
|
23 |
+
def load_model(model_name, device):
|
24 |
+
model_cfg = OmegaConf.load(f"yolo/config/model/{model_name}.yaml")
|
25 |
+
model_cfg.model.auxiliary = {}
|
26 |
+
model = create_model(model_cfg, True)
|
27 |
+
model.to(device).eval()
|
28 |
+
return model
|
29 |
+
|
30 |
+
|
31 |
+
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
|
32 |
+
model = load_model(DEFAULT_MODEL, device)
|
33 |
+
v2b = Vec2Box(model, IMAGE_SIZE, device)
|
34 |
+
class_list = OmegaConf.load("yolo/config/general.yaml").class_list
|
35 |
+
|
36 |
+
transform = AugmentationComposer([])
|
37 |
+
|
38 |
+
|
39 |
+
def predict(model_name, image, nms_confidence, nms_iou):
|
40 |
+
global DEFAULT_MODEL, model, device, v2b, class_list
|
41 |
+
if model_name != DEFAULT_MODEL:
|
42 |
+
model = load_model(model_name, device)
|
43 |
+
v2b = Vec2Box(model, IMAGE_SIZE, device)
|
44 |
+
DEFAULT_MODEL = model_name
|
45 |
+
|
46 |
+
image_tensor, _, rev_tensor = transform(image)
|
47 |
+
|
48 |
+
image_tensor = image_tensor.to(device)[None]
|
49 |
+
rev_tensor = rev_tensor.to(device)
|
50 |
+
|
51 |
+
with torch.no_grad():
|
52 |
+
predict = model(image_tensor)
|
53 |
+
pred_class, _, pred_bbox = v2b(predict["Main"])
|
54 |
+
|
55 |
+
nms_config = NMSConfig(nms_confidence, nms_iou)
|
56 |
+
|
57 |
+
pred_bbox = pred_bbox / rev_tensor[0] - rev_tensor[None, None, 1:]
|
58 |
+
pred_bbox = bbox_nms(pred_class, pred_bbox, nms_config)
|
59 |
+
result_image = draw_bboxes(image, pred_bbox, idx2label=class_list)
|
60 |
+
|
61 |
+
return result_image
|
62 |
+
|
63 |
+
|
64 |
+
interface = gradio.Interface(
|
65 |
+
fn=predict,
|
66 |
+
inputs=[
|
67 |
+
gradio.components.Dropdown(choices=["v9-c", "v9-m", "v9-s"], value="v9-c", label="Model Name"),
|
68 |
+
gradio.components.Image(type="pil", label="Input Image"),
|
69 |
+
gradio.components.Slider(0, 1, step=0.01, value=0.5, label="NMS Confidence Threshold"),
|
70 |
+
gradio.components.Slider(0, 1, step=0.01, value=0.5, label="NMS IoU Threshold"),
|
71 |
+
],
|
72 |
+
outputs=gradio.components.Image(type="pil", label="Output Image"),
|
73 |
+
)
|
74 |
+
|
75 |
+
if __name__ == "__main__":
|
76 |
+
interface.launch()
|
yolo/__init__.py
CHANGED
@@ -1,4 +1,4 @@
|
|
1 |
-
from yolo.config.config import Config
|
2 |
from yolo.model.yolo import create_model
|
3 |
from yolo.tools.data_loader import AugmentationComposer, create_dataloader
|
4 |
from yolo.tools.drawer import draw_bboxes
|
@@ -10,6 +10,7 @@ from yolo.utils.logging_utils import custom_logger
|
|
10 |
all = [
|
11 |
"create_model",
|
12 |
"Config",
|
|
|
13 |
"custom_logger",
|
14 |
"validate_log_directory",
|
15 |
"draw_bboxes",
|
|
|
1 |
+
from yolo.config.config import Config, NMSConfig
|
2 |
from yolo.model.yolo import create_model
|
3 |
from yolo.tools.data_loader import AugmentationComposer, create_dataloader
|
4 |
from yolo.tools.drawer import draw_bboxes
|
|
|
10 |
all = [
|
11 |
"create_model",
|
12 |
"Config",
|
13 |
+
"NMSConfig",
|
14 |
"custom_logger",
|
15 |
"validate_log_directory",
|
16 |
"draw_bboxes",
|