A A
[CV] Object Detection ๋ฐฉ์‹ & ์„ฑ๋Šฅ ํ‰๊ฐ€
์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ํ•œ๋ฒˆ Object Detection์˜ ๋ฐฉ์‹๋“ค์ด ์–ด๋–ค๊ฒƒ์ด ์žˆ๋Š”์ง€ ํ•œ๋ฒˆ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Sliding Window ๋ฐฉ์‹

Sliding Window ๋ฐฉ์‹์€ Window๋ฅผ ์™ผ์ชฝ ์ƒ๋‹จ๋ถ€ํ„ฐ ์˜ค๋ฅธ์ชฝ ํ•˜๋‹จ์œผ๋กœ ์ด๋™์‹œํ‚ค๋ฉด์„œ Object๋ฅผ Detection ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
์•ฝ๊ฐ„ ์ด˜์ด˜ํžˆ, ์„ธ๋ฐ€ํ•˜๊ฒŒ window๋ฅผ ์ด๋™์‹œํ‚ค๋ฉด์„œ ๊ฐ์ฒด ํƒ์ง€๋ฅผ ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

  • ์ด๋ฏธ์ง€๋ฅผ ์ž‘์€ ์˜์—ญ์œผ๋กœ ๋‚˜๋ˆ„๊ณ , ๊ฐ๊ฐ์˜ ์ž‘์€ ์˜์—ญ(์œˆ๋„์šฐ)์—์„œ ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€๋ฅผ ํƒ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
  • ์žฅ์ ์€ ๋งŽ์€ ์˜์—ญ์„ Scan ํ• ์ˆ˜ ์žˆ๋Š”๊ฒƒ, Window์˜ ํ˜•ํƒœ๋ž‘ Image Scale์„ ๋‹ค์–‘ํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.
  • ๋‹จ์ ์€ Object ์—†๋Š” ์˜์—ญ๋„ ๋ฌด์กฐ๊ฑด ์Šฌ๋ผ์ด๋”ฉ ํ•˜์—ฌ์•ผ ํ•˜๋ฉฐ ์—ฌ๋Ÿฌ ํ˜•ํƒœ์˜ Window์™€ ์—ฌ๋Ÿฌ Scale์„ ๊ฐ€์ง„ ์ด๋ฏธ์ง€๋ฅผ ์Šค์บ”ํ•ด์„œ ๊ฒ€์ถœํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ˆ˜ํ–‰ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ณ  ๊ฒ€์ถœ ์„ฑ๋Šฅ์ด ์ƒ๋Œ€์ ์œผ๋กœ ๋‚ฎ์Šต๋‹ˆ๋‹ค.
  • Region Proposal(์˜์—ญ ์ถ”์ •) ๊ธฐ๋ฒ•์˜ ๋“ฑ์žฅ์œผ๋กœ ํ™œ์šฉ๋„๋Š” ๋–จ์–ด์กŒ์ง€๋งŒ Object Detection ๋ฐœ์ „์„ ์œ„ํ•œ ๊ธฐ์ˆ ์  ํ† ๋Œ€ ์ œ๊ณตํ–ˆ๋‹ค๋Š” ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ Window๋ฅผ ์ด˜์ด˜, ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ด๋™์‹œํ‚ค๋ฉด์„œ ๊ฐ์ฒด ํƒ์ง€๋ฅผ ํ•ฉ๋‹ˆ๋‹ค.

Slicing Window ๋ฐฉ์‹ ๊ณผ์ •

์ง„ํ–‰ ๋ฐฉ์‹์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  1. ์œˆ๋„์šฐ ํฌ๊ธฐ ์„ค์ •: ํƒ์ง€ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ์ฒด์˜ ํฌ๊ธฐ์— ๋”ฐ๋ผ ์œˆ๋„์šฐ์˜ ํฌ๊ธฐ๋ฅผ ์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ์œˆ๋„์šฐ๋Š” ์ด๋ฏธ์ง€ ์ „์ฒด์— ๊ฑธ์ณ ์ด๋™ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  2. ์œˆ๋„์šฐ ์ด๋™: ์œˆ๋„์šฐ๋ฅผ ์ด๋ฏธ์ง€์˜ ์‹œ์ž‘์ ์—์„œ๋ถ€ํ„ฐ, ์ผ๋ฐ˜์ ์œผ๋กœ ์ขŒ์ธก ์ƒ๋‹จ์—์„œ ์šฐ์ธก ํ•˜๋‹จ ๋ฐฉํ–ฅ์œผ๋กœ, ์ง€์ •๋œ ์Šคํ… ํฌ๊ธฐ๋งŒํผ ์ด๋™์‹œํ‚ค๋ฉฐ ๊ฐ ์œ„์น˜์—์„œ ๊ฐ์ฒด๋ฅผ ํƒ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  3. ๊ฐ์ฒด ํƒ์ง€: ๊ฐ ์œˆ๋„์šฐ ์œ„์น˜์—์„œ, ์ด๋ฏธ ์ •์˜๋œ ๊ฐ์ฒด ํƒ์ง€ ์•Œ๊ณ ๋ฆฌ์ฆ˜(์˜ˆ: Haar feature-based cascade classifiers, SVM ๋“ฑ)์„ ์‚ฌ์šฉํ•˜์—ฌ ์œˆ๋„์šฐ ๋‚ด๋ถ€์— ๊ฐ์ฒด๊ฐ€ ์žˆ๋Š”์ง€ ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค.
  4. ๊ฒฐ๊ณผ ์ฒ˜๋ฆฌ: ๊ฐ ์œˆ๋„์šฐ์—์„œ์˜ ํƒ์ง€ ๊ฒฐ๊ณผ๋ฅผ ์ข…ํ•ฉํ•˜์—ฌ, ์ตœ์ข…์ ์œผ๋กœ ๊ฐ์ฒด์˜ ์œ„์น˜๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ์—ฌ๋Ÿฌ ์œˆ๋„์šฐ์—์„œ ์ค‘๋ณต์œผ๋กœ ๊ฐ์ฒด๋ฅผ ํƒ์ง€ํ–ˆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์ค‘๋ณต ์ œ๊ฑฐ ๊ณผ์ •(non-max suppression)์„ ๊ฑฐ์ณ ์ตœ์ข… ํƒ์ง€ ๊ฒฐ๊ณผ๋ฅผ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

Region Proposal (์˜์—ญ ์ถ”์ •) ๋ฐฉ์‹

"Object๊ฐ€ ์žˆ์„ ๋งŒํ•œ ํ›„๋ณด ์˜์—ญ์„ ์ฐพ์ž" ์ด๋Ÿฌํ•œ ๊ฐœ๋…์œผ๋กœ ์˜์—ญ ์ถ”์ •์„ ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ Object Detection์„ ํ•ฉ๋‹ˆ๋‹ค.

Region Proposal (์˜์—ญ ์ถ”์ •) ๋ฐฉ์‹์˜ ์ฃผ์š” ๊ณผ์ •

  • ์ด ๋ฐฉ๋ฒ•์€ ์ด๋ฏธ์ง€ ๋‚ด์—์„œ ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์€ ์˜์—ญ๋“ค์„ ๋จผ์ € ์‹๋ณ„ํ•˜๊ณ , ๊ทธ ํ›„์— ์‹๋ณ„๋œ ์˜์—ญ๋“ค์„ ๋Œ€์ƒ์œผ๋กœ ๊ฐ์ฒด ํƒ์ง€๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
  • ์ด๋Ÿฌํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์€ ๊ณ„์‚ฐ ๋น„์šฉ์„ ํฌ๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ฒ˜๋ฆฌ ์†๋„์™€ ์ •ํ™•๋„๋ฅผ ๋™์‹œ์— ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

Selective Search – Region Proposal์˜ ๋Œ€ํ‘œ ๋ฐฉ๋ฒ•

Seltective Search๋Š” ์ด๋ฏธ์ง€ ๋‚ด์—์„œ ๋†’์€ ์ •ํ™•๋„๋กœ ๊ฐ์ฒด๊ฐ€ ์œ„์น˜ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ์˜์—ญ์„ ์‹ ์†ํ•˜๊ฒŒ ์ถ”์ •ํ•˜๋Š” ๋ฐ ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค.
  • Selective Search๋Š” ์ด๋ฏธ์ง€ ์„ธ๋ถ„ํ™”(image segmentation) ๊ธฐ์ˆ ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋น ๋ฅธ Detection๊ณผ ๋†’์€ Recall ์˜ˆ์ธก ์„ฑ๋Šฅ์„ ๋™์‹œ์— ๋งŒ์กฑํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค.
  • ์ปฌ๋Ÿฌ, ๋ฌด๋Šฌ(Texture), ํฌ๊ธฐ(Size), ํ˜•ํƒœ(Shape)์— ๋”ฐ๋ผ ์œ ์‚ฌํ•œ Region์„ ๊ณ„์ธต์  ๊ทธ๋ฃนํ•‘ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
  • Selective Search๋Š” ์ตœ์ดˆ์—๋Š” Pixel Intensity๊ธฐ๋ฐ˜ํ•œ graph-based segment ๊ธฐ๋ฒ•์— ๋”ฐ๋ผ Over Segmentation์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.
    • (๊ฐ๊ฐ์˜ object๋“ค์ด 1๊ฐœ์˜ ๊ฐœ๋ณ„ ์˜์—ญ์— ๋‹ด๊ธธ ์ˆ˜ ์žˆ๋„๋ก ๋งŽ์€ ์ดˆ๊ธฐ ์˜์—ญ์„ ์ƒ์„ฑ by Felzenszwalb and Huttenlocher 2004)

Selective Search์˜ ์ง„ํ–‰๊ณผ์ •

  • ํŠน์ง•์€, ์›๋ณธ ์ด๋ฏธ์ง€์—์„œ Segmentation์„ ์ ์šฉํ•  ๋•Œ ๊ฐ ํ”ฝ์…€ ๊ฐ’์— ๊ธฐ๋ฐ˜ํ•ด์„œ Object๊ฐ€ ๋ ์ˆ˜ ์žˆ๋Š” ๊ทœ์น™์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ ํ›„, image๋“ค์˜ ํŠน์ • ์˜์—ญ์„ Segmentation์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. (pixel by pixel)

 

Selective Search์˜ ์ˆ˜ํ–‰ Process

์–ด๋– ํ•œ ๊ณผ์ •์œผ๋กœ Selective Search์˜ ์ˆ˜ํ–‰ Process๊ฐ€ ์‹คํ–‰๋˜๋Š”์ง€ ํ•œ๋ฒˆ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
  1. ๊ฐœ๋ณ„ Segment๋œ ๋ชจ๋“  ๋ถ€๋ถ„๋“ค์„ Bounding box๋กœ ๋งŒ๋“ค์–ด์„œ Region Proposal ๋ฆฌ์ŠคํŠธ๋กœ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  2. ์ปฌ๋Ÿฌ, ๋ฌด๋Šฌ(Texture), ํฌ๊ธฐ(Size), ํ˜•ํƒœ(Shape)์— ๋”ฐ๋ผ ์œ ์‚ฌ๋„๊ฐ€ ๋น„์Šทํ•œ Segment๋“ค์„ ๊ทธ๋ฃนํ•‘ํ•ฉ๋‹ˆ๋‹ค.
  3. ๋‹ค์‹œ 1๋ฒˆ Step Region Proposal ๋ฆฌ์ŠคํŠธ ์ถ”๊ฐ€, 2๋ฒˆ Step ์œ ์‚ฌ๋„๊ฐ€ ๋น„์Šทํ•œ Segment๋“ค ๊ทธ๋ฃนํ•‘์„ ๊ณ„์† ๋ฐ˜๋ณต ํ•˜๋ฉด์„œ Region Proposal์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Selective Search์˜ ์ˆ˜ํ–‰ Process๋ฅผ ์‹œ๊ฐํ™” ํ•ด๋†“์€ ๊ทธ๋ฆผ์ž…๋‹ˆ๋‹ค.

 

selective search๋ฅผ ์ด์šฉํ•˜์—ฌ Object Detection์„ ์œ„ํ•œ Region Proposal ์˜์—ญ์„ ๋„์ถœ

๊ทธ๋Ÿฌ๋ฉด ํ•œ๋ฒˆ ์ฝ”๋“œ๋ฅผ ๋Œ๋ ค์„œ ์˜์–ต์„ ํ•œ๋ฒˆ ๋„์ถœ์„ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
  • ์ผ๋‹จ ์‚ฌ์ง„์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ Matplotlib์œผ๋กœ ์‹œ๊ฐํ™”๋ฅผ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
import selectivesearch
import cv2
import matplotlib.pyplot as plt
%matplotlib inline

### ์˜ค๋“œ๋ฆฌํ—ต๋ฒˆ ์ด๋ฏธ์ง€๋ฅผ cv2๋กœ ๋กœ๋“œํ•˜๊ณ  matplotlib์œผ๋กœ ์‹œ๊ฐํ™” 
img = cv2.imread('/content/drive/MyDrive/แ„ƒแ…ตแ†ธแ„…แ…ฅแ„‚แ…ตแ†ผ แ„แ…ฅแ†ทแ„‘แ…ฒแ„แ…ฅ แ„‡แ…ตแ„Œแ…ฅแ†ซ แ„€แ…กแ„‹แ…ตแ„ƒแ…ณ/Deep_learning computer Vision Guide/data/image/audrey01.jpg')
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
print('img shape:', img.shape)

plt.figure(figsize=(8, 8))
plt.imshow(img_rgb)
plt.show()

 

# selective_search ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ img_rgb ์ด๋ฏธ์ง€์—์„œ Region Proposal์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
# scale ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์ด๋ฏธ์ง€ ์„ธ๋ถ„ํ™” ์‹œ ์„ธ๊ทธ๋จผํŠธ์˜ ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•˜๋ฉฐ, min_size๋Š” ์ƒ์„ฑ๋˜๋Š” ์ตœ์†Œ ์˜์—ญ์˜ ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
_, regions = selectivesearch.selective_search(img_rgb, scale=100, min_size=2000)

# regions์˜ ํƒ€์ž…๊ณผ ๊ธธ์ด๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
print(type(regions), len(regions))

 

๋ฐ˜ํ™˜๋œ Region Proposal(ํ›„๋ณด ์˜์—ญ)์— ๋Œ€ํ•œ ์ •๋ณด ๋ณด๊ธฐ.

๋ฐ˜ํ™˜๋œ regions ๋ณ€์ˆ˜๋Š” ๋ฆฌ์ŠคํŠธ ํƒ€์ž…์œผ๋กœ ์„ธ๋ถ€ ์›์†Œ๋กœ ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฑด ๊ฐœ๋ณ„ ๋”•์…”๋„ˆ๋ฆฌ๋‚ด KEY๊ฐ’์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • rect ํ‚ค๊ฐ’์€ x,y ์‹œ์ž‘ ์ขŒํ‘œ์™€ ๋„ˆ๋น„, ๋†’์ด ๊ฐ’์„ ๊ฐ€์ง€๋ฉฐ ์ด ๊ฐ’์ด Detected Object ํ›„๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” Bounding box ์ž…๋‹ˆ๋‹ค.
  • size๋Š” Bounding box์˜ ํฌ๊ธฐ์ž…๋‹ˆ๋‹ค.
  • labels๋Š” ํ•ด๋‹น rect๋กœ ์ง€์ •๋œ Bounding Box๋‚ด์— ์žˆ๋Š” ์˜ค๋ธŒ์ ํŠธ๋“ค์˜ ๊ณ ์œ  ID๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • ์•„๋ž˜๋กœ ๋‚ด๋ ค๊ฐˆ ์ˆ˜๋ก ๋„ˆ๋น„์™€ ๋†’์ด ๊ฐ’์ด ํฐ Bounding box์ด๋ฉฐ ํ•˜๋‚˜์˜ Bounding box์— ์—ฌ๋Ÿฌ๊ฐœ์˜ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์žˆ์„ ํ™•๋ฅ ์ด ์ปค์ง‘๋‹ˆ๋‹ค.
[{'rect': (0, 0, 107, 167), 'size': 11166, 'labels': [0.0]},
  • Regions๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด ์œ„์— ์ฒ˜๋Ÿผ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ต๋‹ˆ๋‹ค.
  • ์˜๋ฏธํ•˜๋Š”๊ฑด 'rect': (0, 0, 107, 167) ์—์„œ (0, 0)์€ Bounding Box์˜ ์ขŒ์ƒ๋‹จ ์ขŒํ‘œ, 107์€ Width(๋„ˆ๋น„), 167์€ Height(๋†’์ด)๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
# rect์ •๋ณด๋งŒ ์ถœ๋ ฅํ•ด์„œ ๋ณด๊ธฐ
cand_rects = [cand['rect'] for cand in regions]
print(cand_rects)
  • ๊ทธ๋Ÿฌ๋ฉด ํ•œ๋ฒˆ Bounding Box๋ฅผ ํ•œ๋ฒˆ ์‹œ๊ฐํ™”๋ฅผ ํ•ด์„œ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
# opencv์˜ rectangle()์„ ์ด์šฉํ•˜์—ฌ ์‹œ๊ฐํ™”
# rectangle()์€ ์ด๋ฏธ์ง€์™€ ์ขŒ์ƒ๋‹จ ์ขŒํ‘œ, ์šฐํ•˜๋‹จ ์ขŒํ‘œ, box์ปฌ๋Ÿฌ์ƒ‰, ๋‘๊ป˜๋“ฑ์„ ์ธ์ž๋กœ ์ž…๋ ฅํ•˜๋ฉด ์›๋ณธ ์ด๋ฏธ์ง€์— box๋ฅผ ๊ทธ๋ ค์คŒ. 

# RGB ์ƒ‰์ƒ์œผ๋กœ ๋…น์ƒ‰์„ ์ •์˜.
green_rgb = (125, 255, 51)

# ์›๋ณธ ์ด๋ฏธ์ง€์˜ ๋ณต์‚ฌ๋ณธ์„ ์ƒ์„ฑ. ๋ณต์‚ฌ๋ณธ์— ์‚ฌ๊ฐํ˜•์„ ๊ทธ๋ ค ์›๋ณธ ์ด๋ฏธ์ง€๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š.
img_rgb_copy = img_rgb.copy()

# cand_rects ๋ฆฌ์ŠคํŠธ์˜ ๊ฐ ์‚ฌ๊ฐํ˜• ์˜์—ญ(rect)์— ๋Œ€ํ•ด ๋ฐ˜๋ณต ์ˆ˜ํ–‰.
for rect in cand_rects:
    
    # ์ขŒ์ƒ๋‹จ ์ขŒํ‘œ๋ฅผ ์ถ”์ถœ.
    left = rect[0]
    top = rect[1]
    
    # rect[2]์™€ rect[3]๋Š” ๊ฐ๊ฐ ๋„ˆ๋น„์™€ ๋†’์ด์ด๋ฏ€๋กœ, ์šฐํ•˜๋‹จ ์ขŒํ‘œ๋ฅผ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ด ์ขŒ์ƒ๋‹จ ์ขŒํ‘œ์— ๋”ํ•ฉ๋‹ˆ๋‹ค.
    right = left + rect[2]
    bottom = top + rect[3]
    
    # cv2.rectangle ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฏธ์ง€์— ์‚ฌ๊ฐํ˜•์„ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค.
    # ์ขŒ์ƒ๋‹จ ์ขŒํ‘œ (left, top)๊ณผ ์šฐํ•˜๋‹จ ์ขŒํ‘œ (right, bottom)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ์‚ฌ๊ฐํ˜•์˜ ์ƒ‰์ƒ์€ ๋…น์ƒ‰, ๋‘๊ป˜๋Š” 2๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.
    img_rgb_copy = cv2.rectangle(img_rgb_copy, (left, top), (right, bottom), color=green_rgb, thickness=2)
    

plt.figure(figsize=(8, 8))
plt.imshow(img_rgb_copy)
plt.show()

๊ทธ๋Ÿฌ๋ฉด ์‚ฌ์ง„์— Bounding Box๊ฐ€ ์žกํ˜€์„œ ๋‚˜์˜ค๋Š”๊ฑธ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

Bounding Box์˜ ํฌ๊ธฐ๊ฐ€ ํฐ ํ›„๋ณด๋งŒ ์ถ”์ถœ

4๋‹จ๊ณ„๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค. ์˜์—ญํ•„ํ„ฐ๋ง, ์ดˆ๊ธฐ ์„ค์ •, Bounding Box ๊ทธ๋ฆฌ๊ธฐ, ์ด๋ฏธ์ง€ ์‹œ๊ฐํ™”๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค.
# regions์—์„œ ๊ฐ ํ›„๋ณด ์˜์—ญ์˜ ์‚ฌ์ด์ฆˆ๊ฐ€ 10,000 ์ด์ƒ์ธ ๊ฒƒ๋งŒ์„ ์„ ํƒํ•˜์—ฌ cand_rects ๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
cand_rects = [cand['rect'] for cand in regions if cand['size'] > 10000]

# ์‚ฌ๊ฐํ˜•์˜ ์ƒ‰์ƒ์œผ๋กœ ๋…น์ƒ‰์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
green_rgb = (125, 255, 51)
# ์›๋ณธ ์ด๋ฏธ์ง€์˜ ๋ณต์‚ฌ๋ณธ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—… ์ค‘ ์›๋ณธ ์ด๋ฏธ์ง€๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
img_rgb_copy = img_rgb.copy()

# ํ•„ํ„ฐ๋ง๋œ ์‚ฌ๊ฐํ˜• ์˜์—ญ๋“ค์„ ๋ฐ˜๋ณตํ•˜๋ฉฐ ์ด๋ฏธ์ง€์— ์‚ฌ๊ฐํ˜•์„ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค.
for rect in cand_rects:
    # ์‚ฌ๊ฐํ˜•์˜ ์ขŒ์ƒ๋‹จ ์ขŒํ‘œ๋ฅผ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.
    left = rect[0]
    top = rect[1]
    # ๋„ˆ๋น„์™€ ๋†’์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ๊ฐํ˜•์˜ ์šฐํ•˜๋‹จ ์ขŒํ‘œ๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
    right = left + rect[2]
    bottom = top + rect[3]
    # OpenCV์˜ rectangle ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ์ด๋ฏธ์ง€ ๋ณต์‚ฌ๋ณธ์— ์‚ฌ๊ฐํ˜•์„ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค.
    img_rgb_copy = cv2.rectangle(img_rgb_copy, (left, top), (right, bottom), color=green_rgb, thickness=2)

# matplotlib ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฏธ์ง€๋ฅผ ์‹œ๊ฐํ™”ํ•ฉ๋‹ˆ๋‹ค.
plt.figure(figsize=(8, 8))
plt.imshow(img_rgb_copy)
plt.show()

  • ์ด๋ ‡๊ฒŒ ๊ฒฐ๊ณผ๋กœ ๋ณด์ด๋“ฏ์ด, ์œ„์˜ ๊ฒฐ๊ณผ์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ํฐ Bounding Box๋งŒ ์ถ”์ถœ ํ•˜๋Š”๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Object Detection ์„ฑ๋Šฅ ํ‰๊ฐ€ Metric - IoU: Intersection over Union

IoU๋Š” ์˜ˆ์ธก๋œ ๊ฒฝ๊ณ„ ์ƒ์ž(Bounding Box)์™€ ์‹ค์ œ ๊ฐ์ฒด์˜ ๊ฒฝ๊ณ„ ์ƒ์ž ๊ฐ„์˜ ์˜ค๋ฒ„๋žฉ์„ ์ธก์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ,
๋ชจ๋ธ์ด ์˜ˆ์ธกํ•œ ๊ฒฐ๊ณผ์™€ ์‹ค์ธก(Ground Truth) Box๊ฐ€ ์–ผ๋งˆ๋‚˜ ์ •ํ™•ํ•˜๊ฒŒ ๊ฒน์น˜๋Š”๊ฐ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ง€ํ‘œ์ž…๋‹ˆ๋‹ค.

  • IoU์˜ ๊ณ„์‚ฐ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.
IoU = Area of Union / Area of Overlapโ€‹
  • ์—ฌ๊ธฐ์„œ, Area of Overlap์€ ์˜ˆ์ธก๋œ ์ƒ์ž์™€ ์‹ค์ œ ์ƒ์ž๊ฐ€ ๊ฒน์น˜๋Š” ์˜์—ญ์˜ ๋ฉด์ ์ž…๋‹ˆ๋‹ค.
  • Area of Union์€ ์˜ˆ์ธก๋œ ์ƒ์ž์™€ ์‹ค์ œ ์ƒ์ž๊ฐ€ ํ•ฉ์ณ์ง„ ์˜์—ญ์˜ ๋ฉด์ ์ž…๋‹ˆ๋‹ค.
    • ์ฆ‰ ๋‘ ์ƒ์ž์˜ ๋ฉด์  ํ•ฉ์—์„œ ๊ฒน์น˜๋Š” ๋ถ€๋ถ„์˜ ๋ฉด์ ์„ ๋บ€ ๊ฐ’์ž…๋‹ˆ๋‹ค.
  • IoU์˜ ๊ฐ’ ํ•ด์„
    • 1.0: ์™„๋ฒฝํ•œ ๊ฒน์นจ. ์˜ˆ์ธก๋œ ์ƒ์ž์™€ ์‹ค์ œ ์ƒ์ž๊ฐ€ ์ •ํ™•ํžˆ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.
    • 0.0: ์ „ํ˜€ ๊ฒน์น˜์ง€ ์•Š์Œ. ์˜ˆ์ธก๋œ ์ƒ์ž์™€ ์‹ค์ œ ์ƒ์ž ์‚ฌ์ด์— ๊ฒน์น˜๋Š” ์˜์—ญ์ด ์—†์Šต๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜์ ์œผ๋กœ, IoU์˜ ๊ฐ’์ด ๋†’์„์ˆ˜๋ก ๊ฐ์ฒด ํƒ์ง€ ๋ชจ๋ธ์˜ ์„ฑ๋Šฅ์ด ์ข‹๋‹ค๊ณ  ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • ๋งŒ์•ฝ IoU ๊ฐ’์ด 0.5 ์ด์ƒ์ธ ๊ฒฝ์šฐ์— ๊ฐ์ฒด ํƒ์ง€๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋Ÿฌ๋ฉด ํ•œ๋ฒˆ IoU๋ฅผ ๊ตฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ IoU์— ๋”ฐ๋ฅธ Detection์˜ ์„ฑ๋Šฅ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

 

IoU ๊ตฌํ•˜๊ธฐ

์ž…๋ ฅ์ธ์ž๋กœ ํ›„๋ณด Box์™€ ์‹ค์ œ Box๋ฅผ ๋ฐ›์•„์„œ IoU๋ฅผ ๊ณ„์‚ฐ ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์„œ ๊ณ„์‚ฐ์„ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

  • IoU ๊ณ„์‚ฐ ํ•จ์ˆ˜ ์ฝ”๋“œ
import numpy as np 

def compute_iou(cand_box, gt_box):
    # ๊ฐ ๊ฒฝ๊ณ„ ์ƒ์ž์˜ ์ขŒํ‘œ๋ฅผ ๋น„๊ตํ•˜์—ฌ ๊ฒน์น˜๋Š” ์˜์—ญ์˜ ์ขŒ์ƒ๋‹จ๊ณผ ์šฐํ•˜๋‹จ ์ขŒํ‘œ๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
    # np.maximum๊ณผ np.minimum์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ์ขŒํ‘œ์˜ ์ตœ๋Œ€ ๋ฐ ์ตœ์†Œ๊ฐ’์„ ์ฐพ์•„ ๊ฒน์น˜๋Š” ์˜์—ญ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
    x1 = np.maximum(cand_box[0], gt_box[0])
    y1 = np.maximum(cand_box[1], gt_box[1])
    x2 = np.minimum(cand_box[2], gt_box[2])
    y2 = np.minimum(cand_box[3], gt_box[3])
    
    # ๊ฒน์น˜๋Š” ์˜์—ญ์˜ ๋„ˆ๋น„์™€ ๋†’์ด๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ๊ฐ’์ด ์Œ์ˆ˜์ธ ๊ฒฝ์šฐ 0์œผ๋กœ ์„ค์ •ํ•˜์—ฌ ๊ฒน์น˜๋Š” ์˜์—ญ์ด ์—†์Œ์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
    intersection = np.maximum(x2 - x1, 0) * np.maximum(y2 - y1, 0)
    
    # ํ›„๋ณด ์ƒ์ž(cand_box)์™€ ์‹ค์ œ ์ƒ์ž(gt_box)์˜ ๋„ˆ๋น„์™€ ๋†’์ด๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ ๊ฐ ์ƒ์ž์˜ ๋ฉด์ ์„ ๊ตฌํ•ฉ๋‹ˆ๋‹ค.
    cand_box_area = (cand_box[2] - cand_box[0]) * (cand_box[3] - cand_box[1])
    gt_box_area = (gt_box[2] - gt_box[0]) * (gt_box[3] - gt_box[1])
    
    # ํ•ฉ์ง‘ํ•ฉ ์˜์—ญ์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค: ๋‘ ์ƒ์ž์˜ ๋ฉด์  ํ•ฉ์—์„œ ๊ฒน์น˜๋Š” ์˜์—ญ์˜ ๋ฉด์ ์„ ๋นผ์ค๋‹ˆ๋‹ค.
    union = cand_box_area + gt_box_area - intersection
    
    # IoU๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ๊ฒน์น˜๋Š” ์˜์—ญ์„ ํ•ฉ์ง‘ํ•ฉ์œผ๋กœ ๋‚˜๋ˆˆ ๊ฐ’์ž…๋‹ˆ๋‹ค.
    iou = intersection / union
    return iou

 

  • ์‚ฌ์ง„์„ ๋ถˆ๋Ÿฌ์™€์„œ ์‹œ๊ฐํ™” ํ•˜๋Š” ์ฝ”๋“œ
import cv2
import matplotlib.pyplot as plt
%matplotlib inline

# ์‹ค์ œ box(Ground Truth)์˜ ์ขŒํ‘œ๋ฅผ ์•„๋ž˜์™€ ๊ฐ™๋‹ค๊ณ  ๊ฐ€์ •. 
gt_box = [60, 15, 320, 420]

img = cv2.imread('/content/drive/MyDrive/แ„ƒแ…ตแ†ธแ„…แ…ฅแ„‚แ…ตแ†ผ แ„แ…ฅแ†ทแ„‘แ…ฒแ„แ…ฅ แ„‡แ…ตแ„Œแ…ฅแ†ซ แ„€แ…กแ„‹แ…ตแ„ƒแ…ณ/Deep_learning computer Vision Guide/data/image/audrey01.jpg')
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

red = (255, 0 , 0)
img_rgb = cv2.rectangle(img_rgb, (gt_box[0], gt_box[1]), (gt_box[2], gt_box[3]), color=red, thickness=2)

plt.figure(figsize=(8, 8))
plt.imshow(img_rgb)
plt.show()

  • Selective Search Code
# selective_search ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ img_rgb ์ด๋ฏธ์ง€์—์„œ Region Proposal์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
# scale ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์ด๋ฏธ์ง€ ์„ธ๋ถ„ํ™” ์‹œ ์„ธ๊ทธ๋จผํŠธ์˜ ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•˜๋ฉฐ, min_size๋Š” ์ƒ์„ฑ๋˜๋Š” ์ตœ์†Œ ์˜์—ญ์˜ ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
_, regions = selectivesearch.selective_search(img_rgb, scale=100, min_size=2000)

# regions์˜ ํƒ€์ž…๊ณผ ๊ธธ์ด๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
print(type(regions), len(regions))

 

  • regions์—์„œ ๋ฐ›์€ ํ›„๋ณด ์˜์—ญ(cand_rects)์— ๋Œ€ํ•ด ๊ฐ๊ฐ์˜ cand_box๋ฅผ ์กฐ์ •ํ•˜๊ณ ,
  • ์‹ค์ œ ๊ฐ์ฒด ์˜์—ญ์ธ gt_box์™€์˜ IoU(Intersection over Union)๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ ์ถœ๋ ฅํ•˜๋Š” ๊ณผ์ •์„ ๋‹ด์€ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.
# regions๋กœ๋ถ€ํ„ฐ ๊ฐ ํ›„๋ณด์˜ ์‚ฌ๊ฐํ˜• ๊ฒฝ๊ณ„('rect')๋ฅผ ์ถ”์ถœํ•˜์—ฌ cand_rects ๋ฆฌ์ŠคํŠธ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
cand_rects = [cand['rect'] for cand in regions]

# cand_rects ๋ฆฌ์ŠคํŠธ๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ๊ฐ ํ›„๋ณด ์ƒ์ž์˜ ์ธ๋ฑ์Šค์™€ ๊ฐ’์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
for index, cand_box in enumerate(cand_rects):
    # cand_box๋Š” ํŠœํ”Œ์ด๋ฏ€๋กœ ๋ฆฌ์ŠคํŠธ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ˆ˜์ • ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
    cand_box = list(cand_box)
    
    # cand_box์˜ ๋„ˆ๋น„์™€ ๋†’์ด ๊ฐ’์„ ์ขŒํ‘œ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    # cand_box[2]์™€ cand_box[3]๋Š” ์›๋ž˜ ๋„ˆ๋น„์™€ ๋†’์ด์ด๋ฏ€๋กœ ์ด๋ฅผ ์ขŒ์ƒ๋‹จ ์ขŒํ‘œ์— ๋”ํ•˜์—ฌ ์šฐํ•˜๋‹จ ์ขŒํ‘œ๋ฅผ ๊ตฌํ•ฉ๋‹ˆ๋‹ค.
    cand_box[2] += cand_box[0]
    cand_box[3] += cand_box[1]
    
    # ์ˆ˜์ •๋œ cand_box์™€ ์ฃผ์–ด์ง„ gt_box(์‹ค์ œ ๊ฐ์ฒด ์˜์—ญ)์˜ IoU๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
    iou = compute_iou(cand_box, gt_box)
    
    # ๊ฐ ํ›„๋ณด ์ƒ์ž์˜ ์ธ๋ฑ์Šค์™€ ๊ณ„์‚ฐ๋œ IoU ๊ฐ’์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
    print('index:', index, "iou:", iou)

 

  • ์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ๊ฐ index ๋ณ„๋กœ IoU ๊ฐ’์ด ๋‚˜์˜ต๋‹ˆ๋‹ค.
index: 0 iou: 0.0
index: 1 iou: 0.0713319505816575
index: 2 iou: 0.1134453781512605
index: 3 iou: 0.9874899187876287
index: 4 iou: 0.9748907882241216
index: 5 iou: 0.09851851851851852
index: 6 iou: 0.04228869895536562
index: 7 iou: 0.15042735042735042
index: 8 iou: 0.14541310541310543
index: 9 iou: 0.10112060778727446
index: 10 iou: 0.1194681861348528
index: 11 iou: 0.14017094017094017

 

  • ์ด ์ฝ”๋“œ๋Š” ์ฃผ์–ด์ง„ regions ๋ฐ์ดํ„ฐ์—์„œ ํŠน์ • ์กฐ๊ฑด(size > 5000)์„ ๋งŒ์กฑํ•˜๋Š” ํ›„๋ณด ์˜์—ญ๋“ค์„ ํ•„ํ„ฐ๋งํ•˜๊ณ , ์ด๋“ค์„ ์ •๋ ฌํ•˜๋Š” ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.
# regions ๋ฆฌ์ŠคํŠธ์—์„œ ๊ฐ ํ›„๋ณด ์˜์—ญ์˜ 'size' ์†์„ฑ์ด 5000 ์ดˆ๊ณผ์ธ ํ›„๋ณด๋“ค๋งŒ์„ ์„ ํƒํ•˜์—ฌ cand_rects ๋ฆฌ์ŠคํŠธ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
cand_rects = [cand['rect'] for cand in regions if cand['size'] > 5000]

# cand_rects ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์ „ ์ˆœ์œผ๋กœ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค. 
# ์—ฌ๊ธฐ์„œ ๊ฐ ํ›„๋ณด ์˜์—ญ(rect)์€ (x1, y1, width, height)์˜ ํŠœํ”Œ ํ˜•ํƒœ๋กœ ๊ฐ€์ •๋˜๋ฉฐ, Python์˜ ๊ธฐ๋ณธ ์ •๋ ฌ์€ ํŠœํ”Œ์˜ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๋ถ€ํ„ฐ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.
# ๋”ฐ๋ผ์„œ x1 ๊ฐ’์— ๋”ฐ๋ผ ์ •๋ ฌ๋˜๋ฉฐ, ๊ฐ™์€ x1 ๊ฐ’์„ ๊ฐ€์ง„ ์š”์†Œ๋Š” y1 ๊ฐ’์— ๋”ฐ๋ผ ์ •๋ ฌ๋ฉ๋‹ˆ๋‹ค.
cand_rects.sort()

# ์ •๋ ฌ๋œ cand_rects ๋ฆฌ์ŠคํŠธ๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
cand_rects

 

  • ๊ทธ๋Ÿฌ๋ฉด ์ด์ œ, Object Detection์„ ์œ„ํ•ด ์ด๋ฏธ์ง€์—์„œ ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ํ›„๋ณด ์˜์—ญ๋“ค์„ ์ถ”์ถœํ•˜๊ณ , ์ด๋“ค ์˜์—ญ์— ๋Œ€ํ•œ IoU (Intersection over Union) ๊ฐ’์„ ๊ณ„์‚ฐํ•˜์—ฌ ์ด๋ฏธ์ง€์— ์‹œ๊ฐํ™”ํ•˜๋Š” ๊ณผ์ •์„ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
img = cv2.imread('/content/drive/MyDrive/๋”ฅ๋Ÿฌ๋‹ ์ปดํ“จํ„ฐ ๋น„์ „ ๊ฐ€์ด๋“œ/Deep_learning computer Vision Guide/data/image/audrey01.jpg')
# BGR ์ƒ‰์ƒ ํ˜•์‹์˜ ์ด๋ฏธ์ง€๋ฅผ RGB ์ƒ‰์ƒ ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# ์ด๋ฏธ์ง€์˜ ํ˜•ํƒœ(ํฌ๊ธฐ, ์ฑ„๋„)๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
print('img shape:', img.shape)

# gt_box๋ฅผ ์ •์˜ํ•˜๊ณ  ์‹ค์ œ ๊ฐ์ฒด์˜ ๊ฒฝ๊ณ„ ์ƒ์ž๋ฅผ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ 'red'๊ฐ€ ์ •์˜๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ์ ์ ˆํ•œ ์ƒ‰์ƒ ๊ฐ’์œผ๋กœ ๋Œ€์ฒดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
green_rgb = (125, 255, 51)
gt_box = [60, 15, 320, 420]
img_rgb = cv2.rectangle(img_rgb, (gt_box[0], gt_box[1]), (gt_box[2], gt_box[3]), color=green_rgb, thickness=2)

# 'regions'์—์„œ ํŠน์ • ํฌ๊ธฐ ์ด์ƒ์˜ ํ›„๋ณด ์ƒ์ž๋งŒ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
cand_rects = [cand['rect'] for cand in regions if cand['size'] > 3000]
# ํ›„๋ณด ์ƒ์ž๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ๊ฐ ์ƒ์ž์— ๋Œ€ํ•œ IoU๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ , ์กฐ๊ฑด์— ๋งž๋Š” ๊ฒฝ์šฐ์—๋งŒ ํ…์ŠคํŠธ์™€ ์ƒ์ž๋ฅผ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค.
for index, cand_box in enumerate(cand_rects):
    # ํ›„๋ณด ์ƒ์ž์˜ ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
    cand_box = list(cand_box)
    cand_box[2] += cand_box[0]
    cand_box[3] += cand_box[1]
    
    # IoU๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
    iou = compute_iou(cand_box, gt_box)
    
    # IoU๊ฐ€ 0.5 ์ด์ƒ์ธ ๊ฒฝ์šฐ, ์ƒ์ž๋ฅผ ๊ทธ๋ฆฌ๊ณ  ์ธ๋ฑ์Šค์™€ IoU ๊ฐ’์„ ํ…์ŠคํŠธ๋กœ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
    if iou > 0.5:
        print('index:', index, "iou:", iou, 'rectangle:', (cand_box[0], cand_box[1], cand_box[2], cand_box[3]))
        cv2.rectangle(img_rgb, (cand_box[0], cand_box[1]), (cand_box[2], cand_box[3]), color=green_rgb, thickness=1)
        text = "{}: {:.2f}".format(index, iou)
        cv2.putText(img_rgb, text, (cand_box[0] + 100, cand_box[1] + 10), cv2.FONT_HERSHEY_SIMPLEX, 0.4, color=green_rgb, thickness=1)

plt.figure(figsize=(12, 12))
plt.imshow(img_rgb)
plt.show()

 

IoU (Intersection over Union) ๊ฐ’์„ ๊ณ„์‚ฐํ•˜์—ฌ ์ด๋ฏธ์ง€์— ์‹œ๊ฐํ™”ํ•˜๋Š” ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.


NMS (Non Max Supression)

NMS (Non-Max Suppression, ๋น„์ตœ๋Œ€ ์–ต์ œ)๋Š” ์ปดํ“จํ„ฐ ๋น„์ „, ํŠนํžˆ ๊ฐ์ฒด ํƒ์ง€์—์„œ ์ค‘๋ณต ๊ฒ€์ถœ๋œ ๊ฐ์ฒด๋“ค์„ ์ •์ œํ•˜๋Š” ๊ณผ์ •์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค.
  • ๊ฐ์ฒด ํƒ์ง€ ๊ณผ์ •์—์„œ ํ•˜๋‚˜์˜ ๊ฐ์ฒด์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ Bounding box๊ฐ€ ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Object Detection ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ Object ๊ฐ€์žˆ์„ ๋งŒํ•œ ์œ„์น˜์— ๋งŽ์€ Detection์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝํ–ฅ์ด ๊ฐ•ํ•ฉ๋‹ˆ๋‹ค.
  • ์—ฌ๊ธฐ์„œ NMS๋Š” Detected ๋œ Object์˜ Bounding box์ค‘์— ๋น„์Šทํ•œ ์œ„์น˜์— ์žˆ๋Š” box๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๊ฐ€์žฅ ์ ํ•ฉํ•œ box๋ฅผ ์„ ํƒํ•˜๋Š” ๊ธฐ๋ฒ• ์ž…๋‹ˆ๋‹ค. ์ผ์ข…์˜ filtering ์ž…๋‹ˆ๋‹ค.

NMS ๋ฐฉ์‹์„ ์ ์šฉ์ „, ํ›„์™€ ์ฐจ์ด

 

NMS (Non Max Supression)์˜ ์ˆ˜ํ–‰ ๋กœ์ง

์ˆ˜ํ–‰ Logic์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.
  1. Detected ๋œ bounding box๋ณ„๋กœ ํŠน์ • Confidence threshold ์ดํ•˜ bounding box๋ฅผ ๋จผ์ € ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
    • (Confidence score < 0.5)
  2. ๊ฐ€์žฅ ๋†’์€ confidence score๋ฅผ ๊ฐ€์ง„ box ์ˆœ์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌํ•˜๊ณ  ์•„๋ž˜ ๋กœ์ง์„ ๋ชจ๋“  box์— ์ˆœ์ฐจ์ ์œผ๋กœ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ๋†’์€ Confidence score๋ฅผ ๊ฐ€์ง„ box์™€ ๊ฒน์น˜๋Š” ๋‹ค๋ฅธ box๋ฅผ ๋ชจ๋‘ ์กฐ์‚ฌํ•˜์—ฌ IOU๊ฐ€ ํŠน์ • threshold ์ด์ƒ์ธ box๋ฅผ ๋ชจ๋‘ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
    • (์˜ˆ: IOU Threshold > 0.4 )
    • ์ฆ‰, Confidence Score๊ฐ€ ์ œ์ผ ๋†’์€๊ฒƒ๋งŒ ์‚ฐ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.
  3. ๋‚จ์•„ ์žˆ๋Š” box๋งŒ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  • ์ฃผ์š”ํ•œ ํŠน์ง•์€ Confidence Score๊ฐ€ ๋†’์„์ˆ˜๋ก, IoU Threshold๊ฐ€ ๋‚ฎ์„์ˆ˜๋ก ๋งŽ์€ Box๊ฐ€ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.


Object Detection ์„ฑ๋Šฅ ํ‰๊ฐ€ Metric - mAP (mean Average Precision)

mAP (mean Average Precision)๋Š” ๊ฐ์ฒด ํƒ์ง€(object detection) ๋ถ„์•ผ์—์„œ ๋ชจ๋ธ์˜ ์„ฑ๋Šฅ์„ ํ‰๊ฐ€ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์ฃผ์š” ์ง€ํ‘œ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.
  • ์‹ค์ œ Object๊ฐ€ Detected๋œ ์žฌํ˜„์œจ(Recall)์˜ ๋ณ€ํ™”์— ๋”ฐ๋ฅธ ์ •๋ฐ€๋„(Presion)์˜ ๊ฐ’์„ ํ‰๊ท ํ•œ ์„ฑ๋Šฅ ์ˆ˜์น˜ ์ž…๋‹ˆ๋‹ค.
  • ์ด ๋ฉ”ํŠธ๋ฆญ์€ ๋‹ค์–‘ํ•œ ํด๋ž˜์Šค์— ๋Œ€ํ•œ ๋ชจ๋ธ์˜ ์ •ํ™•์„ฑ์„ ํ‰๊ฐ€ํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ํ‰๊ท ๋‚ด์–ด ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ๋‹ค์–‘ํ•œ ๊ฐ์ฒด๋ฅผ ํƒ์ง€ํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์—์„œ ๊ทธ ์„ฑ๋Šฅ์„ ์ „์ฒด์ ์œผ๋กœ ์ดํ•ดํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

mAP์˜ ๊ณ„์‚ฐ ๋ฐฉ๋ฒ•

mAP๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋จผ์ € Precision๊ณผ Recall์ด๋ผ๋Š” ๋‘ ๊ธฐ๋ณธ ๊ฐœ๋…์„ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค:
  • Precision์€ ๋ชจ๋ธ์ด ๊ฐ์ฒด๋ผ๊ณ  ํƒ์ง€ํ•œ ๊ฒƒ๋“ค ์ค‘ ์‹ค์ œ๋กœ ๊ฐ์ฒด์ธ ๊ฒƒ์˜ ๋น„์œจ์ž…๋‹ˆ๋‹ค.
  • Recall์€ ์‹ค์ œ ๊ฐ์ฒด ์ค‘์—์„œ ๋ชจ๋ธ์ด ๊ฐ์ฒด๋กœ ํƒ์ง€ํ•œ ๋น„์œจ์ž…๋‹ˆ๋‹ค.
  • ๊ฐ์ฒด ํƒ์ง€์—์„œ๋Š” ๊ฐ ํด๋ž˜์Šค์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ Precision-Recall ์Œ์„ ๊ณ„์‚ฐํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ด๋Š” ๋‹ค์–‘ํ•œ IoU (Intersection over Union) ์ž„๊ณ„๊ฐ’์„ ์ ์šฉํ•˜์—ฌ ์–ป์–ด์ง‘๋‹ˆ๋‹ค.
  • ๊ฐ ํด๋ž˜์Šค์— ๋Œ€ํ•ด, Precision์„ Recall์˜ ํ•จ์ˆ˜๋กœ ๊ทธ๋ฆฐ ๊ณก์„  ์•„๋ž˜์˜ ๋ฉด์ ์„ Average Precision(AP)์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹ค์‹œ ๋งํ•ด, AP๋Š” ํ•ด๋‹น ํด๋ž˜์Šค์— ๋Œ€ํ•œ Precision-Recall ๊ณก์„  ์•„๋ž˜์˜ ๋ฉด์ ์ž…๋‹ˆ๋‹ค.
  • mAP๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค:
  1. ๊ฐ ํด๋ž˜์Šค๋ณ„ AP ๊ณ„์‚ฐ: ๋ชจ๋“  ํด๋ž˜์Šค์— ๋Œ€ํ•ด AP๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
  2. ํด๋ž˜์Šค๋ณ„ AP ํ‰๊ท  ๊ณ„์‚ฐ: ๋ชจ๋“  ํด๋ž˜์Šค์˜ AP ๊ฐ’๋“ค์˜ ํ‰๊ท ์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

 

  • ๊ทธ๋Ÿฌ๋ฉด ์žฌํ˜„์œจ(Recall), ์ •๋ฐ€๋„(Presion)์ด ๋ฌด์Šจ๋ง์ผ๊นŒ์š”? ๊ทธ๊ฑด ๋‹ค์Œ๊ธ€์—์„œ ํ•œ๋ฒˆ ์•Œ์•„ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.