|
--- |
|
license: gpl |
|
pipeline_tag: object-detection |
|
tags: |
|
- ultralytics |
|
- yolo |
|
- yolov10 |
|
- object-detection |
|
--- |
|
# Rock Paper Scissors Object Detection Model |
|
|
|
**Created by FRC Team 578** |
|
|
|
## Description |
|
|
|
This YOLO v10 small model was trained for educational purposes only. It is used to illustrate to students how an object detection model works. It was trained for 10 epochs. |
|
|
|
## Training Data |
|
|
|
The model trained on 100 images found online. No augmentation of the images were preformed. |
|
|
|
## Metrics |
|
|
|
| Class | Images | Instances | Box | R | mAP50 | mAP50-95 | |
|
| -------- | ------- | --------- | ------ | ------| ----- | -------- | |
|
| all | 100 | 260 | 0.917 | 0.795 | 0.925 | 0.735 | |
|
| rock | 69 | 84 | 0.875 | 0.835 | 0.924 | 0.728 | |
|
| paper | 56 | 65 | 0.899 | 0.815 | 0.909 | 0.721 | |
|
| scissors | 88 | 111 | 0.976 | 0.736 | 0.943 | 0.755 | |
|
|
|
## How to Use |
|
|
|
``` |
|
pip install ultralytics |
|
pip install huggingface_hub |
|
``` |
|
|
|
``` |
|
from ultralytics import YOLO |
|
from huggingface_hub import hf_hub_download |
|
from matplotlib import pyplot as plt |
|
|
|
# Load the weights from our repository |
|
model_path = hf_hub_download( |
|
local_dir=".", |
|
repo_id="fairportrobotics/rock-paper-scissors", |
|
filename="model.pt" |
|
) |
|
model = YOLO(model_path) |
|
|
|
# Load a test image |
|
sample_path = hf_hub_download( |
|
local_dir=".", |
|
repo_id="fairportrobotics/rock-paper-scissors", |
|
filename="sample.jpg" |
|
) |
|
|
|
# Do the predictions |
|
res = model.predict( |
|
source=sample_path, |
|
project='.', |
|
name='detected', |
|
exist_ok=True, |
|
save=True, |
|
show=False, |
|
show_labels=True, |
|
show_conf=True, |
|
conf=0.5 |
|
) |
|
|
|
plt.figure(figsize=(15,10)) |
|
plt.imshow(plt.imread('detected/sample.jpg')) |
|
plt.show() |
|
``` |
|
|
|
As you can see the model isn't perfect ;) |
|
|
|
|
|
### Use the model with your webcam |
|
|
|
``` |
|
from ultralytics import YOLO |
|
import cv2 |
|
import math |
|
from huggingface_hub import hf_hub_download |
|
|
|
# start the webcam |
|
cap = cv2.VideoCapture(0) |
|
cap.set(3, 640) |
|
cap.set(4, 480) |
|
|
|
# Load the weights from our repository |
|
model_path = hf_hub_download( |
|
local_dir=".", |
|
repo_id="fairportrobotics/rock-paper-scissors", |
|
filename="model.pt" |
|
) |
|
model = YOLO(model_path) |
|
|
|
# object classes |
|
classNames = ["rock", "paper", "scissors"] |
|
|
|
|
|
while True: |
|
success, img = cap.read() |
|
results = model(img, stream=True) |
|
|
|
# coordinates |
|
for r in results: |
|
boxes = r.boxes |
|
|
|
for box in boxes: |
|
# bounding box |
|
x1, y1, x2, y2 = box.xyxy[0] |
|
x1, y1, x2, y2 = int(x1), int(y1), int(x2), int(y2) # convert to int values |
|
|
|
# put box in cam |
|
cv2.rectangle(img, (x1, y1), (x2, y2), (255, 0, 255), 3) |
|
|
|
# confidence |
|
confidence = math.ceil((box.conf[0]*100))/100 |
|
|
|
# class name |
|
cls = int(box.cls[0]) |
|
|
|
# object details |
|
org = [x1, y1] |
|
font = cv2.FONT_HERSHEY_SIMPLEX |
|
fontScale = 1 |
|
color = (255, 0, 0) |
|
thickness = 2 |
|
|
|
cv2.putText(img, classNames[cls] + " " + str(round(confidence,2)), org, font, fontScale, color, thickness) |
|
|
|
cv2.imshow('Webcam', img) |
|
if cv2.waitKey(1) == ord('q'): |
|
break |
|
|
|
cap.release() |
|
cv2.destroyAllWindows() |
|
``` |