Skip to content

Latest commit

ย 

History

38 Commits

Folders and files

NameName
Last commit message
Last commit date
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Comento Computer Vision

์ปดํ“จํ„ฐ ๋น„์ „ ํ”„๋กœ์ ํŠธ - ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ, ์ „์ฒ˜๋ฆฌ, 2Dโ†’3D ๋ณ€ํ™˜ ๋ฐ ๊ฐ์ฒด ํƒ์ง€


๐Ÿ“ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

comento_computer_vision/
โ”œโ”€โ”€ README.md
โ”œโ”€โ”€ week1_preprocessing/          # Week1: ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ ๋ฐ ์ „์ฒ˜๋ฆฌ
โ”‚   โ”œโ”€โ”€ computer_vision_week1_base.py
โ”‚   โ”œโ”€โ”€ computer_vision_week1_add.py
โ”‚   โ”œโ”€โ”€ sample.jpg
โ”‚   โ””โ”€โ”€ preprocessed_samples/
โ”œโ”€โ”€ week2_2d_to_3d/               # Week2: Unit Test ๋ฐ 2Dโ†’3D ๋ณ€ํ™˜
โ”‚   โ”œโ”€โ”€ src/
โ”‚   โ”œโ”€โ”€ tests/
โ”‚   โ”œโ”€โ”€ scripts/
โ”‚   โ””โ”€โ”€ results/
โ””โ”€โ”€ week3_yolo/                   # Week3: YOLOv8 ๊ฐ์ฒด ํƒ์ง€
    โ”œโ”€โ”€ src/
    โ””โ”€โ”€ results/

๐Ÿ“Œ Week 1: ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ ๋ฐ ์ „์ฒ˜๋ฆฌ

ํ”„๋กœ์ ํŠธ ๊ฐœ์š”

OpenCV์™€ Hugging Face ๋ฐ์ดํ„ฐ์…‹์„ ํ™œ์šฉํ•œ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ ๋ฐ ์ „์ฒ˜๋ฆฌ ์‹ค์Šต ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค.

๊ธฐ๋Šฅ

1. ๋นจ๊ฐ„์ƒ‰ ๊ฒ€์ถœ (computer_vision_week1_base.py)

  • OpenCV๋ฅผ ์‚ฌ์šฉํ•œ HSV ์ƒ‰์ƒ ๊ณต๊ฐ„ ๊ธฐ๋ฐ˜ ๋นจ๊ฐ„์ƒ‰ ์˜์—ญ ๊ฒ€์ถœ
  • ๋‘ ๊ฐœ์˜ ๋นจ๊ฐ„์ƒ‰ ๋ฒ”์œ„๋ฅผ ์„ค์ •ํ•˜์—ฌ ์ •ํ™•ํ•œ ๊ฒ€์ถœ
  • ๋งˆ์Šคํฌ ์ƒ์„ฑ ๋ฐ ์›๋ณธ ์ด๋ฏธ์ง€์— ์ ์šฉ

2. ์ด๋ฏธ์ง€ ์ „์ฒ˜๋ฆฌ (computer_vision_week1_add.py)

๋ฐ์ดํ„ฐ์…‹

์ด์ƒ์น˜ ํƒ์ง€

  • ๋„ˆ๋ฌด ์–ด๋‘์šด ์ด๋ฏธ์ง€ ํ•„ํ„ฐ๋ง: ํ‰๊ท  ๋ฐ๊ธฐ๊ฐ€ 50 ๋ฏธ๋งŒ์ธ ์ด๋ฏธ์ง€ ์ œ๊ฑฐ
  • ๊ฐ์ฒด ํฌ๊ธฐ ๊ฒ€์ฆ: ํ”ฝ์…€ ๋ถ„์‚ฐ์ด 100 ๋ฏธ๋งŒ์ธ ์ด๋ฏธ์ง€ ์ œ๊ฑฐ

์ „์ฒ˜๋ฆฌ ๊ณผ์ •

  1. ํฌ๊ธฐ ์กฐ์ •: ๋ชจ๋“  ์ด๋ฏธ์ง€๋ฅผ 224x224 ํฌ๊ธฐ๋กœ ํ†ต์ผ
  2. ์ƒ‰์ƒ ๋ณ€ํ™˜: Grayscale ๋ณ€ํ™˜ ๋ฐ 0-1 ์‚ฌ์ด๋กœ ์ •๊ทœํ™”
  3. ๋…ธ์ด์ฆˆ ์ œ๊ฑฐ: Gaussian Blur ํ•„ํ„ฐ ์ ์šฉ (radius=2)
  4. ๋ฐ์ดํ„ฐ ์ฆ๊ฐ•:
    • ์ขŒ์šฐ ๋ฐ˜์ „ (Horizontal Flip)
    • 15๋„ ํšŒ์ „ (Rotation)
    • ๋ฐ๊ธฐ ์กฐ์ • (30% ์ฆ๊ฐ€)

์‹คํ–‰ ๋ฐฉ๋ฒ•

cd week1_preprocessing
pip install opencv-python numpy pillow datasets huggingface-hub
python computer_vision_week1_base.py
python computer_vision_week1_add.py

์ถœ๋ ฅ ๊ฒฐ๊ณผ

์ „์ฒ˜๋ฆฌ๋œ ์ด๋ฏธ์ง€๋Š” preprocessed_samples/ ํด๋”์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค:

  • food101_image_0_resized.jpg - ํฌ๊ธฐ ์กฐ์ •
  • food101_image_0_gray_normalized.jpg - Grayscale & ์ •๊ทœํ™”
  • food101_image_0_blurred.jpg - ๋…ธ์ด์ฆˆ ์ œ๊ฑฐ
  • food101_image_0_flipped.jpg - ์ขŒ์šฐ ๋ฐ˜์ „
  • food101_image_0_rotated.jpg - ํšŒ์ „
  • food101_image_0_brightened.jpg - ๋ฐ๊ธฐ ์กฐ์ •

(์ด 5๊ฐœ ์ด๋ฏธ์ง€ ร— 6๊ฐœ ๋ณ€ํ˜• = 30๊ฐœ ํŒŒ์ผ ์ƒ์„ฑ)


๐Ÿ“Œ Week 2: Unit Test ๊ตฌ์„ฑ ๋ฐ 2D โ†’ 3D ๋ณ€ํ™˜

ํ”„๋กœ์ ํŠธ ๊ฐœ์š”

AI ๊ธฐ๋ฐ˜ ์ œํ’ˆ ๊ฐœ๋ฐœ์„ ์œ„ํ•œ Unit Test ๊ตฌ์„ฑ ๋ฐ 2D โ†’ 3D ๋ณ€ํ™˜ ์‹ค์Šต ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค.

๋ณธ ํ”„๋กœ์ ํŠธ๋Š” ๋‹ค์Œ ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•ฉ๋‹ˆ๋‹ค:

  1. Python์˜ pytest๋ฅผ ํ™œ์šฉํ•œ Unit Test ๊ตฌ์„ฑ
  2. OpenCV์™€ NumPy๋ฅผ ์‚ฌ์šฉํ•œ 2D โ†’ 3D ๋ณ€ํ™˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„
  3. ๊นŠ์ด ๋งต(Depth Map) ์ƒ์„ฑ ๋ฐ 3D ํฌ์ธํŠธ ํด๋ผ์šฐ๋“œ ๋ณ€ํ™˜

ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

week2_2d_to_3d/
โ”œโ”€โ”€ src/                           # ์†Œ์Šค ์ฝ”๋“œ
โ”‚   โ””โ”€โ”€ depth_3d_converter.py
โ”œโ”€โ”€ tests/                         # Unit Test
โ”‚   โ””โ”€โ”€ test_depth_3d_converter.py
โ”œโ”€โ”€ scripts/                       # ์‹คํ–‰ ์Šคํฌ๋ฆฝํŠธ
โ”‚   โ””โ”€โ”€ visualization_demo.py
โ””โ”€โ”€ results/                       # ๊ฒฐ๊ณผ ์ด๋ฏธ์ง€
    โ”œโ”€โ”€ comparison.png
    โ”œโ”€โ”€ shapes_pipeline.png
    โ””โ”€โ”€ ...

์ฃผ์š” ํ•จ์ˆ˜ ์„ค๋ช…

generate_depth_map(image, method)

2D ์ด๋ฏธ์ง€์—์„œ ๊นŠ์ด ๋งต์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

Parameters:

  • image: ์ž…๋ ฅ ์ด๋ฏธ์ง€ (BGR ํ˜•์‹ ๋˜๋Š” ๊ทธ๋ ˆ์ด์Šค์ผ€์ผ)
  • method: ๊นŠ์ด ์ถ”์ • ๋ฐฉ๋ฒ•
    • "gradient": Sobel ๊ธฐ๋ฐ˜ ๊ธฐ์šธ๊ธฐ ์ถ”์ •
    • "intensity": ๋ฐ๊ธฐ ๊ธฐ๋ฐ˜ ์ถ”์ •
    • "edge": Canny ์—ฃ์ง€ ๊ธฐ๋ฐ˜ ์ถ”์ •

Returns:

  • depth_map: ๊นŠ์ด ๋งต (uint8, grayscale)

apply_colormap(depth_map, colormap)

๊นŠ์ด ๋งต์— ์ปฌ๋Ÿฌ๋งต์„ ์ ์šฉํ•˜์—ฌ ์‹œ๊ฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

convert_to_3d_points(depth_map, scale_z, downsample)

๊นŠ์ด ๋งต์„ 3D ํฌ์ธํŠธ ํด๋ผ์šฐ๋“œ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

save_point_cloud_ply(points_3d, colors, filename)

3D ํฌ์ธํŠธ ํด๋ผ์šฐ๋“œ๋ฅผ PLY ํŒŒ์ผ๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

process_2d_to_3d(image_path, output_dir, depth_method)

์ „์ฒด 2D โ†’ 3D ๋ณ€ํ™˜ ํŒŒ์ดํ”„๋ผ์ธ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Unit Test ๊ตฌ์„ฑ

ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค ๊ตฌ์กฐ

ํด๋ž˜์Šค ํ…Œ์ŠคํŠธ ํ•ญ๋ชฉ
TestGenerateDepthMap ๊นŠ์ด ๋งต ์ƒ์„ฑ ๊ธฐ๋Šฅ, ์ž…๋ ฅ ๊ฒ€์ฆ, ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ• ํ…Œ์ŠคํŠธ
TestApplyColormap ์ปฌ๋Ÿฌ๋งต ์ ์šฉ, ์ถœ๋ ฅ ํ˜•์‹ ๊ฒ€์ฆ
TestConvertTo3DPoints 3D ํฌ์ธํŠธ ๋ณ€ํ™˜, ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฒ€์ฆ
TestSavePointCloudPLY PLY ํŒŒ์ผ ์ €์žฅ, ํ˜•์‹ ๊ฒ€์ฆ
TestProcess2DTo3D ํ†ตํ•ฉ ํŒŒ์ดํ”„๋ผ์ธ ํ…Œ์ŠคํŠธ
TestEdgeCases ๊ฒฝ๊ณ„ ์กฐ๊ฑด ๋ฐ ์—ฃ์ง€ ์ผ€์ด์Šค

ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ ์˜ˆ์‹œ

========================= test session starts ==========================
collected 43 items

test_depth_3d_converter.py::TestGenerateDepthMap::test_basic_functionality PASSED
test_depth_3d_converter.py::TestGenerateDepthMap::test_output_shape PASSED
...
========================= 43 passed in 0.92s ===========================

์‹คํ–‰ ๋ฐฉ๋ฒ•

cd week2_2d_to_3d
pip install numpy opencv-python pytest matplotlib

# Unit Test ์‹คํ–‰
pytest tests/test_depth_3d_converter.py -v

# ์ƒ์„ธ ์ถœ๋ ฅ
pytest tests/test_depth_3d_converter.py -v --tb=short

# ์‹œ๊ฐํ™” ๋ฐ๋ชจ ์‹คํ–‰
python scripts/visualization_demo.py

๊ฐœ๋ณ„ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ

from src.depth_3d_converter import process_2d_to_3d

result = process_2d_to_3d("your_image.jpg", "./output")
print(f"3D ํฌ์ธํŠธ ์ˆ˜: {result['num_3d_points']}")

๊ฒฐ๊ณผ๋ฌผ

์ƒ์„ฑ๋˜๋Š” ํŒŒ์ผ

  1. ๊นŠ์ด ๋งต ์ด๋ฏธ์ง€ (*_depth.png) - ๊ทธ๋ ˆ์ด์Šค์ผ€์ผ ๊นŠ์ด ์ •๋ณด
  2. ์ปฌ๋Ÿฌ ๊นŠ์ด ๋งต (*_depth_colored.png) - JET ์ปฌ๋Ÿฌ๋งต ์ ์šฉ ์‹œ๊ฐํ™”
  3. 3D ํฌ์ธํŠธ ํด๋ผ์šฐ๋“œ (*_points.ply) - MeshLab, CloudCompare ๋“ฑ์—์„œ ํ™•์ธ ๊ฐ€๋Šฅ
  4. ํŒŒ์ดํ”„๋ผ์ธ ๋น„๊ต ์ด๋ฏธ์ง€ (*_pipeline.png) - ์›๋ณธ โ†’ ๊นŠ์ด ๋งต โ†’ 3D ๋ณ€ํ™˜ ๊ณผ์ •

๐Ÿ“Œ Week 3: AI ๊ธฐ๋ฐ˜ ๊ฐ์ฒด ํƒ์ง€ ๋ฐ OpenCV ์‹œ๊ฐํ™”

ํ”„๋กœ์ ํŠธ ๊ฐœ์š”

YOLOv8์„ ํ™œ์šฉํ•œ ๊ฐ์ฒด ํƒ์ง€ ๋ชจ๋ธ ํ•™์Šต ๋ฐ OpenCV๋ฅผ ํ†ตํ•œ ๊ฒฐ๊ณผ ์‹œ๊ฐํ™” ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค.

๋ณธ ํ”„๋กœ์ ํŠธ๋Š” ๋‹ค์Œ ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•ฉ๋‹ˆ๋‹ค:

  1. YOLOv8 ๋ชจ๋ธ์„ ํ™œ์šฉํ•œ ์ปค์Šคํ…€ ๋ฐ์ดํ„ฐ์…‹ ํ•™์Šต
  2. OpenCV๋ฅผ ์‚ฌ์šฉํ•œ ๊ฐ์ฒด ํƒ์ง€ ๊ฒฐ๊ณผ ์‹œ๊ฐํ™”
  3. Matplotlib์„ ํ™œ์šฉํ•œ ๋ชจ๋ธ ์„ฑ๋Šฅ ํ‰๊ฐ€ ์‹œ๊ฐํ™”

ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

week3_yolo/
โ”œโ”€โ”€ src/
โ”‚   โ”œโ”€โ”€ data.yaml          # ๋ฐ์ดํ„ฐ์…‹ ์„ค์ • ํŒŒ์ผ
โ”‚   โ”œโ”€โ”€ train.py           # ๋ชจ๋ธ ํ•™์Šต ์Šคํฌ๋ฆฝํŠธ
โ”‚   โ”œโ”€โ”€ detect.py          # ๊ฐ์ฒด ํƒ์ง€ + OpenCV ์‹œ๊ฐํ™”
โ”‚   โ””โ”€โ”€ visualize.py       # ์„ฑ๋Šฅ ๊ทธ๋ž˜ํ”„ ์‹œ๊ฐํ™”
โ”œโ”€โ”€ results/
โ”‚   โ”œโ”€โ”€ detection_result.jpg      # ํƒ์ง€ ๊ฒฐ๊ณผ ์ด๋ฏธ์ง€
โ”‚   โ””โ”€โ”€ model_performance.png     # Precision/Recall ๊ทธ๋ž˜ํ”„
โ””โ”€โ”€ datasets/
    โ”œโ”€โ”€ train/{images, labels}
    โ”œโ”€โ”€ valid/{images, labels}
    โ””โ”€โ”€ test/{images, labels}

๋ฐ์ดํ„ฐ์…‹ ์„ค์ • (data.yaml)

train: ./datasets/train/images
val: ./datasets/valid/images
nc: 3
names: ['person', 'car', 'dog']

YOLO ๋ผ๋ฒจ ํ˜•์‹ (txt ํŒŒ์ผ):

# class_id x_center y_center width height (0~1 ์ •๊ทœํ™”)
0 0.5 0.5 0.3 0.4
1 0.2 0.3 0.1 0.2

์ฃผ์š” ์ฝ”๋“œ ์„ค๋ช…

train.py - ๋ชจ๋ธ ํ•™์Šต

from ultralytics import YOLO

model = YOLO("yolov8n.pt")  # YOLOv8 ๊ธฐ๋ณธ ๋ชจ๋ธ
model.train(data="data.yaml", epochs=10, imgsz=640)

ํ•™์Šต ํŒŒ๋ผ๋ฏธํ„ฐ:

  • Epochs: 10 (๊ธฐ๋ณธ) / 20 (์ฆ๊ฐ• ์ ์šฉ ์‹œ)
  • Image Size: 640x640
  • Model: YOLOv8n (nano)

detect.py - ๊ฐ์ฒด ํƒ์ง€ ๋ฐ ์‹œ๊ฐํ™”

import cv2
from ultralytics import YOLO

model = YOLO("runs/train/exp/weights/best.pt")
results = model(image)

for result in results:
    for box in result.boxes:
        x1, y1, x2, y2 = map(int, box.xyxy[0])
        label = result.names[int(box.cls[0])]
        confidence = box.conf[0]
        cv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 0), 2)
        cv2.putText(image, f"{label} {confidence:.2f}", (x1, y1-10),
                    cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)

visualize.py - ์„ฑ๋Šฅ ์‹œ๊ฐํ™”

import matplotlib.pyplot as plt

metrics = model.val()
plt.plot(metrics['precision'], label="Precision")
plt.plot(metrics['recall'], label="Recall")
plt.xlabel("Epochs")
plt.ylabel("Score")
plt.legend()
plt.title("Model Performance")
plt.savefig("../results/model_performance.png")

์‹คํ–‰ ๋ฐฉ๋ฒ•

cd week3_yolo/src
pip install torch torchvision opencv-python matplotlib ultralytics

# ๋ชจ๋ธ ํ•™์Šต
python train.py

# ๊ฐ์ฒด ํƒ์ง€
python detect.py

# ๊ฒฐ๊ณผ ์‹œ๊ฐํ™”
python visualize.py

์„ฑ๋Šฅ ์ง€ํ‘œ

๋ฉ”ํŠธ๋ฆญ ์„ค๋ช…
mAP@0.5 IoU 0.5 ๊ธฐ์ค€ ํ‰๊ท  ์ •๋ฐ€๋„
mAP@0.5:0.95 IoU 0.5~0.95 ๊ธฐ์ค€ ํ‰๊ท  ์ •๋ฐ€๋„
Precision ํƒ์ง€ํ•œ ๊ฐ์ฒด ์ค‘ ์ •๋‹ต ๋น„์œจ
Recall ์‹ค์ œ ๊ฐ์ฒด ์ค‘ ํƒ์ง€ํ•œ ๋น„์œจ

๊ฒฐ๊ณผ ์ด๋ฏธ์ง€

  1. detection_result.jpg - ๋ฐ”์šด๋”ฉ ๋ฐ•์Šค๊ฐ€ ํ‘œ์‹œ๋œ ํƒ์ง€ ๊ฒฐ๊ณผ
  2. model_performance.png - Precision/Recall ํ•™์Šต ๊ณก์„ 

์„ฑ๋Šฅ ํ–ฅ์ƒ ๋ฐฉ๋ฒ•

  1. ๋ฐ์ดํ„ฐ ์ฆ๊ฐ• (Augmentation)

    • ์ด๋ฏธ์ง€ ํšŒ์ „, ๋ฐ๊ธฐ ์กฐ์ ˆ, ๋…ธ์ด์ฆˆ ์ถ”๊ฐ€
    • model.train(data="data.yaml", epochs=20, imgsz=640, augment=True)
  2. ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ ํŠœ๋‹

    • ํ•™์Šต๋ฅ  ์กฐ์ •
    • Batch Size ์กฐ์ •
  3. ๋” ํฐ ๋ชจ๋ธ ์‚ฌ์šฉ

    • yolov8s.pt (small)
    • yolov8m.pt (medium)
    • yolov8l.pt (large)

๐Ÿ“š ์ฐธ๊ณ  ์ž๋ฃŒ

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages