YOLO(You Only Look Once)๋ ๋ฅ๋ฌ๋์ ์ด์ฉํ ์ฌ๋ฌผ ์ธ์ ํ๋ ์์ํฌ๋ค. ๋ง์ ์ธ๊ธฐ ํ์ ๋ค์ํ ๋ฒ์ ๋ค(v3, v4, v5...)์ด ์๊ฒจ๋๊ณ ์๋ค. ๋ด๊ฐ ์ฌ์ฉํ ์์ ์ ๋ฒ์ ์ YOLOv5์ด๋ค.
๊นํ๋ธ
https://github.com/ultralytics/yolov5/wiki/Train-Custom-Data
Train Custom Data
YOLOv5 ๐ in PyTorch > ONNX > CoreML > TFLite. Contribute to ultralytics/yolov5 development by creating an account on GitHub.
github.com
์ ๊นํ๋ธ ํ์ด์ง๋ฅผ ๋ฐํ์ผ๋ก ๋ฐ๋ผ ํ์๋ค.
Roboflow - ์ปค์คํ ๋ฐ์ดํฐ์ ๋ง๋ค๊ธฐ
Sign in to Roboflow
Even if you're not a machine learning expert, you can use Roboflow train a custom, state-of-the-art computer vision model on your own data.
app.roboflow.com
Roboflow์์ ์ฌ๋ฌ ์ด๋ฏธ์ง๋ฅผ ์ง์ ๋ง์ฐ์ค๋ก ๋ผ๋ฒจ๋ง์ ํ์ฌ ๋๋ง์ ๋ฐ์ดํฐ์ ์ ๋ง๋ค ์๊ฐ ์๋ค.
๋ฌผ๋ก ๋ค๋ฅธ ์ฌ๋์ด ๋ฏธ๋ฆฌ ๋ง๋ ๋ฐ์ดํฐ์ ์ ๋ค์ด๋ก๋ํ ์๋ ์์
์์ฑ์ ํ ๋ฐ์ดํฐ์ ์ Export ๋ฒํผ์ ๋๋ฌ ํฌ๋งท์ YOLO v5 PyTorch๋ก ์ง์ ํด์ผ ํ๋ค.
Colab ์์ ๋ ธํธ(YOLOv5)
YOLOv5-Custom-Training.ipynb
Run, share, and edit Python notebooks
colab.research.google.com
* ๋ ธํธ ์ค๊ฐ์ ๊ฒฝ๋ก ๋ฌธ์ ๊ฐ ์์ด์ ์ฝ๊ฐ์ ์์ ์ด ํ์ํ์๋ค.
ํธ๋ ์ด๋(train.py)
!python train.py --img 416 --batch 16 --epochs 150 --data data.yaml --weights yolov5s.pt --cache
YOLOv5 ๋ชจ๋ธ์ ํ์ต์ํค๊ธฐ ์ํ ๋ช ๋ น์ด์ด๋ค.
--img 416 : ์
๋ ฅ ์ด๋ฏธ์ง์ ํฌ๊ธฐ๋ฅผ 416x416 ํฝ์
๋ก ์ค์ ํฉ๋๋ค.
--batch 16 : ํ์ตํ ๋ ์ฌ์ฉํ๋ ๋ฐฐ์น ํฌ๊ธฐ๋ฅผ 16์ผ๋ก ์ค์ ํฉ๋๋ค.
--epochs 150 : ์ ์ฒด ๋ฐ์ดํฐ์
์ ํ์ตํ๋ ํ์๋ฅผ 150์ผ๋ก ์ค์ ํฉ๋๋ค.
--data data.yaml : ํ์ต์ ์ฌ์ฉํ ๋ฐ์ดํฐ์
์ ์ง์ ํฉ๋๋ค.
--weights yolov5s.pt : ๋ฏธ๋ฆฌ ํ์ต๋ YOLOv5 ๋ชจ๋ธ ๊ฐ์ค์น ํ์ผ์ ์ง์ ํฉ๋๋ค. ์ด์ ์ ํ์ตํ ๋ชจ๋ธ์ ๋ก๋ํ๊ฑฐ๋, YOLOv5 ๋ชจ๋ธ์ ํฌ๊ธฐ๋ฅผ ์ง์ ํฉ๋๋ค(yolov5s.pt, yolov5m.pt, yolov5l.pt, yolov5x.pt).
--cache : ํ์ต ๊ณผ์ ์์ ์ฌ์ฉ๋๋ ์บ์๋ฅผ ์ ์ฅํ๊ณ ์ฌ์ฌ์ฉํฉ๋๋ค. ์ด๋ฅผ ํตํด ํ์ต ์๋๋ฅผ ๋์ผ ์ ์์ต๋๋ค.
๊ฐ์ง(detect.py)
!python detect.py --weights /content/yolov5/runs/train/exp/weights/best.pt --img 416 --conf 0.1 --source /content/yolov5/test/images
์์ ํธ๋ ๋์์ ๋ค ๋ง์น๊ฒ ๋๋ฉด /content/yolov5/runs/train/exp/weights/best.pt๋ผ๋ ์ต์ข ๋ชจ๋ธ์ด ์์ฑ์ด ๋๋ค. (.pt๋ ํ์ดํ ์น์ ๋ชจ๋ธ ํ์ฅ์)
--source ์ธ์๋ก๋ ํ ์คํธ๋ฅผ ์์ผ์ค ์๋ณธ ์ด๋ฏธ์ง๋ค์ ํด๋ ๊ฒฝ๋ก๋ฅผ ์ ๋ ฅํ๋ค.
๊ฐ์ง ๊ฒฐ๊ณผ ํ์ธ
import glob
from IPython.display import Image, display
for imageName in glob.glob('/content/yolov5/runs/detect/exp/*.jpg'): #assuming JPG
display(Image(filename=imageName))
print("\n")
๊ฐ์ง๊ฐ ์๋ฃ ๋์๋ค๋ฉด /content/yolov5/runs/detect/exp/ ํด๋(exp2, exp3๋ก ์ฆ๊ฐํ๊ธฐ๋ ํ๋ค. ) ์์๋ ์ถ๋ ฅ๋ ์ด๋ฏธ์ง๊ฐ ์์ผ๋ ํ์ด์ฌ ์คํฌ๋ฆฝํธ๋ก ์ถ๋ ฅ๋ ์ด๋ฏธ์ง๋ค์ ํ์ธํ๋ค.
pypi - yolov5 ๋ชจ๋๋ก ์คํ
!pip install yolov5
(yolov5 ๋ชจ๋ ์ถ๊ฐ ์ค์น)
https://pypi.org/project/yolov5/
yolov5
Packaged version of the Yolov5 object detector
pypi.org
๋ ๊ฐ๋จํ yolov5 ๋ชจ๋์ ์ค์นํด .pt ๋ชจ๋ธ ํ์ผ์ ๋ถ๋ฌ์ ์ค์ ๊ฐ์ ๋ด ๋ง๋๋ก ์กฐ์ ํ๊ฑฐ๋ ์ด๋ฏธ์ง ์ถ๋ ฅ์ cv2๋ก ํธ์งํด์ ๋์ค๊ฒ๋ ์์ ํ๋ ๋ฑ ๋ค์ํ ์ปค์คํฐ๋ง์ด์ง์ด ๊ฐ๋ฅํ๋ค.
import yolov5
import cv2
from IPython.display import display, Image
model = yolov5.load('/content/yolov5/runs/train/exp2/weights/best.pt')
# set model parameters
model.conf = 0.25 # NMS confidence threshold
model.iou = 0.45 # NMS IoU threshold
model.agnostic = False # NMS class-agnostic
model.multi_label = False # NMS multiple labels per box
model.max_det = 1000 # maximum number of detections per image
# set image
img = '/content/image.jpg'
# perform inference
results = model(img)
# inference with larger input size
results = model(img, size=1280)
# inference with test time augmentation
results = model(img, augment=True)
# parse results
predictions = results.pred[0]
boxes = predictions[:, :4] # x1, y1, x2, y2
scores = predictions[:, 4]
categories = predictions[:, 5]
# ์ด๋ฏธ์ง์ ๊ฒฝ๊ณ ์์ ๊ทธ๋ฆฌ๊ธฐ
img = cv2.imread(img)
for box, score, label in zip(boxes, scores, categories):
x1, y1, x2, y2 = box.int().tolist()
cv2.rectangle(img, (x1, y1), (x2, y2), (0, 0, 255), 2)
cv2.putText(img, str(round(score.item(), 2) * 100) + "%", (x1, y1-10), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
display(Image(data=cv2.imencode('.png', img)[1]))
# show detection bounding boxes on image
# results.show()
์ฐ์ต์ฉ์ผ๋ก ๋ง๋ ์ผ๊ตด ์ธ์ ์ฝ๋ฉ ๋ ธํธ๋ถ
https://colab.research.google.com/drive/1GdaLVQF9XJuGUDdo21uTxVvXkv6oIPwe
Google Colaboratory Notebook
Run, share, and edit Python notebooks
colab.research.google.com