Deep Tattoo - YOLOv8 Instance Segmentation
YOLOv8s-seg ๊ธฐ๋ฐ ํํฌ ์ธ๊ทธ๋ฉํ ์ด์ ๋ชจ๋ธ๋ก, ์ด๋ฏธ์ง์์ ํํฌ ์์ญ์ ์ ๋ฐํ๊ฒ ๊ฒ์ถํ๊ณ ์ถ์ถํฉ๋๋ค.
๋ชจ๋ธ ์ ๋ณด
v3 Model (Fine-tuned with Manual Labels) - ์ต์ ์ถ์ฒ โญโญโญ
- ํ์ผ:
yolov8s_tattoo_manual_v3_best.pt - ์ฑ๋ฅ: ํ๊ท Confidence 0.862 (v2 ๋๋น +14.5%)
- ํ์ต ๋ฐฉ๋ฒ: v2 ๋ชจ๋ธ + 24๊ฐ ์๋ ๋ผ๋ฒจ๋ก Fine-tuning
- ํน์ง:
- v2 ๊ธฐ๋ฐ Transfer Learning
- ์๋ ๋ผ๋ฒจ๋ง์ผ๋ก ์ ๋ฐ๋ ๋ํญ ํฅ์
- 10๊ฐ ํ ์คํธ ์ค 8๊ฐ์์ ๋ ๋์ confidence
- ์ผ๋ถ ์ด๋ฏธ์ง์์ ๋ ์ ๋ฐํ ๋ถ๋ฆฌ ๊ฒ์ถ
- ๊ฐ์ฅ ๋์ ํ์ง์ ํํฌ ๊ฒ์ถ
v2 Model (Filtered Dataset)
- ํ์ผ:
yolov8s_tattoo_filtered_v2_best.pt - ์ฑ๋ฅ: Mask mAP50 65.14%, Confidence 0.753
- ํ์ต ๋ฐ์ดํฐ: 2,697 images (ํํฐ๋ง๋จ)
- ํน์ง:
- ์ผ๊ตด ํํฌ, ๋ณต์กํ ๋ฐฐ๊ฒฝ ์ ์ธ
- ํผ๋ถ ์ ํํฌ ์ค์ฌ ๋ฐ์ดํฐ์
- ํํฌ ํตํฉ ์ธ์ ๊ฐ์
v1 Model (Original Dataset)
- ํ์ผ:
yolov8s_tattoo_seg_v1_best.pt - ์ฑ๋ฅ: Test mAP50 57.7%, Confidence 0.658
- ํ์ต ๋ฐ์ดํฐ: 4,373 images
- ํน์ง: ๋ง์ ๋ฐ์ดํฐ์ด์ง๋ง ๋ ธ์ด์ฆ ํฌํจ
์ฑ๋ฅ ๋น๊ต
| ๋ฒ์ | ํ์ต ๋ฐ์ดํฐ | Confidence | Mask mAP50 | ํน์ง |
|---|---|---|---|---|
| v3 (Fine-tuned) โญ | v2 + 24 manual | 0.862 | - | ์ต๊ณ ํ์ง |
| v2 (Filtered) | 2,697 images | 0.753 | 65.14% | ํํฐ๋ง๋จ |
| v1 (Original) | 4,373 images | 0.658 | 54.2% | ๋ ธ์ด์ฆ ํฌํจ |
๊ฒฐ๋ก :
- v3 ๋ชจ๋ธ์ด ์ต๊ณ ์ฑ๋ฅ (Confidence 0.862)
- v2 โ v3 Fine-tuning์ผ๋ก +14.5% ๊ฐ์
- ์ค์ ์ฌ์ฉ ์ v3 ๋ชจ๋ธ ๊ฐ๋ ฅ ์ถ์ฒ
์ฃผ์ ํน์ง
- โ YOLOv8s-seg: 11.8M parameters, 39.9 GFLOPs
- โ ๋น ๋ฅธ ์ถ๋ก : ~23ms/image (43 FPS on RTX 2060)
- โ ๋์ ์ ํ๋: ํ๊ท Confidence 66.2%
- โ ํฌ๋ช ๋ฐฐ๊ฒฝ ์ถ์ถ: ํํฌ๋ง ๋ถ๋ฆฌํ์ฌ PNG ์ ์ฅ ๊ฐ๋ฅ
- โ GPU ๊ฐ์: CUDA ์ง์
์ฌ์ฉ๋ฒ
์ค์น
pip install ultralytics opencv-python numpy torch
๋ชจ๋ธ ๋ค์ด๋ก๋
from huggingface_hub import hf_hub_download
# v3 ๋ชจ๋ธ ๋ค์ด๋ก๋ (์ต์ , ์ถ์ฒ) โญ
model_path = hf_hub_download(
repo_id="jun710/deep-tattoo-yolov8",
filename="yolov8s_tattoo_manual_v3_best.pt"
)
# ๋๋ v2 ๋ชจ๋ธ (๋์)
# model_path = hf_hub_download(
# repo_id="jun710/deep-tattoo-yolov8",
# filename="yolov8s_tattoo_filtered_v2_best.pt"
# )
์ถ๋ก
from ultralytics import YOLO
# ๋ชจ๋ธ ๋ก๋
model = YOLO(model_path)
# ํํฌ ๊ฒ์ถ
results = model.predict("tattoo_image.jpg", conf=0.25, imgsz=640)
# ๊ฒฐ๊ณผ ํ์
results[0].show()
# ๋ง์คํฌ ์ถ์ถ
if results[0].masks is not None:
masks = results[0].masks.data.cpu().numpy()
print(f"{len(masks)}๊ฐ ํํฌ ๊ฒ์ถ๋จ")
ํํฌ๋ง ์ถ์ถ (ํฌ๋ช ๋ฐฐ๊ฒฝ)
import cv2
import numpy as np
# ์์ธก
results = model.predict("tattoo.jpg", conf=0.25)
# ์๋ณธ ์ด๋ฏธ์ง
img = cv2.imread("tattoo.jpg")
img_rgba = cv2.cvtColor(img, cv2.COLOR_BGR2BGRA)
# ๋ง์คํฌ ํฉ์น๊ธฐ
combined_mask = np.zeros((img.shape[0], img.shape[1]), dtype=np.uint8)
for mask in results[0].masks.data.cpu().numpy():
mask_resized = cv2.resize(mask, (img.shape[1], img.shape[0]))
combined_mask = cv2.bitwise_or(combined_mask, (mask_resized > 0.5).astype(np.uint8))
# ํฌ๋ช
๋ฐฐ๊ฒฝ ์ ์ฉ
img_rgba[:, :, 3] = combined_mask * 255
# ์ ์ฅ
cv2.imwrite("tattoo_extracted.png", img_rgba)
๋ชจ๋ธ ์ํคํ ์ฒ
- ๋ฐฑ๋ณธ: YOLOv8s (CSPDarknet53 ๋ณํ)
- ํค๋: Segmentation Head + Detection Head
- ํ๋ผ๋ฏธํฐ: 11.79M
- FLOPs: 39.9G
ํ์ต ์ ๋ณด
v2 ๋ชจ๋ธ ํ์ต ์ค์
- Epochs: 300 (Best: 223)
- Batch Size: 16
- Image Size: 640x640
- Optimizer: Adam (lr=0.001, lrf=0.0001)
- Device: CUDA (RTX 2060)
- ํ์ต ์๊ฐ: 7.9 hours
๋ฐ์ดํฐ ์ฆ๊ฐ
- HSV: h=0.03, s=0.7, v=0.4
- Rotation: ยฑ20ยฐ
- Scale: 0.5
- Flip LR: 50%
- Mosaic: 100%
- Mixup: 10%
๋ฐ์ดํฐ์ ๋ถํ
- Train: 2,157 images (80%)
- Valid: 269 images (10%)
- Test: 271 images (10%)
์ฑ๋ฅ ์์ธ
๊ฒ์ฆ ์ธํธ (Epoch 223)
- Mask mAP50: 65.14%
- Mask mAP50-95: 36.7%
- Box mAP50: 71.5%
- Box mAP50-95: 49.9%
ํ ์คํธ ์ธํธ
- Mask mAP50: 56.63%
- Mask Precision: 71.94%
- Mask Recall: 51.49%
์ถ๋ก ์๋ (RTX 2060)
- Preprocess: 2.1ms
- Inference: 18.9ms
- Postprocess: 1.9ms
- Total: ~23ms/image (43 FPS)
์ฌ์ฉ ์ฌ๋ก
- ํํฌ ๋์์ธ ๋ถ์
- ์๋ฃ/๋ฒ์ํ ํํฌ ๊ธฐ๋ก
- AR/VR ํํฌ ์๋ฎฌ๋ ์ด์
- ํํฌ ์ ๊ฑฐ ์ ํ ๋น๊ต
- ๋ชจ๋ฐ์ผ ์ฑ ํตํฉ
์ ํ ์ฌํญ
- ๋งค์ฐ ํฌ๋ฏธํ๊ฑฐ๋ ์ค๋๋ ํํฌ๋ ๊ฒ์ถ์ด ์ด๋ ค์ธ ์ ์์
- ํผ๋ถ์๊ณผ ๋งค์ฐ ์ ์ฌํ ์์์ ํํฌ ๊ฒ์ถ ์ ํ๋ ๋ฎ์
- ๋ณต์กํ ๋ฐฐ๊ฒฝ์์ ์ค๊ฒ์ถ ๊ฐ๋ฅ์ฑ (v2์์ ๊ฐ์ ๋จ)
๊ถ์ฅ ์ฌํญ
Confidence Threshold
- ๊ธฐ๋ณธ๊ฐ: 0.25 (๊ท ํ์กํ ๊ฒ์ถ)
- ์๊ฒฉํ ๊ฒ์ถ: 0.5 (์ค๊ฒ์ถ ๊ฐ์)
- ๋ฏผ๊ฐํ ๊ฒ์ถ: 0.15 (์์ ํํฌ ํฌํจ)
์ ๋ ฅ ์ด๋ฏธ์ง
- ํด์๋: 640px ์ด์ ๊ถ์ฅ
- ํ์: JPG, PNG
- ์กฐ๋ช : ๊ท ์ผํ ์กฐ๋ช ์ ํธ
- ๋ฐฐ๊ฒฝ: ๋จ์ํ ๋ฐฐ๊ฒฝ ๊ถ์ฅ
๋ผ์ด์ ์ค
MIT License - ์ฐ๊ตฌ ๋ฐ ์์ ์ ์ฌ์ฉ ๊ฐ๋ฅ
์ธ์ฉ
@misc{deep-tattoo-yolov8-2026,
title={Deep Tattoo: YOLOv8 Instance Segmentation for Tattoo Extraction},
author={jun710},
year={2026},
publisher={Hugging Face},
howpublished={\url{https://huggingface.co/jun710/deep-tattoo-yolov8}}
}
๊ด๋ จ ๋งํฌ
- GitHub Repository: https://github.com/enjius/deep-tattoo
- YOLOv8 Docs: https://docs.ultralytics.com
- Dataset: Roboflow + Custom labeled data
์ ๋ฐ์ดํธ ๋ก๊ทธ
2026-01-20 - v2 Release
- ํํฐ๋ง๋ ๋ฐ์ดํฐ์ ์ผ๋ก ์ฌํ์ต
- ์ผ๊ตด ํํฌ ๋ฐ ๋ณต์กํ ๋ฐฐ๊ฒฝ ์ ๊ฑฐ
- ๊ฒ์ฆ ์ฑ๋ฅ 10.94% ํฅ์
- ํํฌ ํตํฉ ์ธ์ ๊ฐ์
2026-01-19 - v1 Release
- ์ด๊ธฐ YOLOv8s-seg ๋ชจ๋ธ ๋ฆด๋ฆฌ์ค
- 4,373 images๋ก ํ์ต
- Test mAP50: 57.7%
- Downloads last month
- 112
Inference Providers
NEW
This model isn't deployed by any Inference Provider.
๐
Ask for provider support