๋ฐ์ํ
OpenCV DNN ์ฅ๋จ์
OpenCV Deep Neural Network์ ์ฅ๋จ์ ์ ๋ฐํ์ฌ ์์๋ณด๊ฒ ์ต๋๋ค.
- OpenCV ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ Intel์ ์ํ์ฌ ์ต์ด ๊ฐ๋ฐ ๋์์ต๋๋ค. ์ฅ๋จ์ ์ ์ค๋ช ํด๋ณด๊ฒ ์ต๋๋ค.
OpenCV DNN ์ฅ์
- ๋ฅ๋ฌ๋ ๊ฐ๋ฐ ํ๋ ์ ์ํฌ ์์ด ์ฝ๊ฒ Inference๋ฅผ ๊ตฌํ ๊ฐ๋ฅ ํฉ๋๋ค.
- OpenCV์์ ์ง์ํ๋ ๋ค์ํ Computer Vision ์ฒ๋ฆฌ ๋ฐ API์ Deep learning์ ์ฝ๊ฒ ๊ฒฐํฉํ ์ ์๋ค๋ ํน์ง์ด ์์ต๋๋ค.
OpenCV DNN ๋จ์
- GPU ์ง์ ๊ธฐ๋ฅ์ด ์ฝํฉ๋๋ค.
- DNN ๋ชจ๋์ ๊ณผ๊ฑฐ์ NVIDIA GPU ์ง์์ด ๋์ง ์์์ต๋๋ค. 2019๋ 10์์ Google์์ NVIDIA GPU ์ง์ ๋ฐํํ์ง๋ง. ์์ง ํ๊ฒฝ ๊ตฌ์ฑ/์ค์น๊ฐ ์ด๋ ต์ต๋๋ค. ์ ์ฐจ ๊ฐ์ ์์ ์ด ์งํ์ค์ ๋๋ค.
- OpenCV๋ ๋ชจ๋ธ์ ํ์ตํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ง ์์ผ๋ฉฐ ์ค์ง Inference๋ง ๊ฐ๋ฅํฉ๋๋ค.
- CPU ๊ธฐ๋ฐ์์ Inference ์๋๊ฐ ๊ฐ์ ๋์์ผ๋, GPU(NVIDIA)๊ฐ ์ง์๋์ง ์์ ํ Deep learning framework ๋๋น Inference ์๋๊ฐ ํฌ๊ฒ ์ ํ๋๋ค๋ ํน์ง์ด ์์ต๋๋ค.
๊ธฐ์กด Deep Learning Frame๊ณผ์ ์ฐ๋
- OpenCV๋ ์์ฒด์ ์ผ๋ก ๋ฅ๋ฌ๋ ๊ฐ์ค์น ๋ชจ๋ธ์ ์์ฑํ์ง ์๊ณ ํ Framework์์ ์์ฑ๋ ๋ชจ๋ธ์ ๋ณํํ์ฌ ๋ก๋ฉํฉ๋๋ค.
- DNN ํจํค์ง๋ ํ์ผ๋ก ์์ฑ๋ ํ ํ๋ ์์ํฌ ๋ชจ๋ธ์ ๋ก๋ฉํ ์ ์๋๋ก readNetFromXXX(๊ฐ์ค์น ๋ชจ๋ธํ์ผ, ํ๊ฒฝ ํ์ผ) API๋ฅผ ์ ๊ณตํฉ๋๋ค.
- Weight(๊ฐ์ค์น) ๋ชจ๋ธ ํ์ผ์ ํ ํ๋ ์์ํฌ ๋ชจ๋ธ ํ์ผ, ํ๊ฒฝ ํ์ผ์ ํ ํ๋ ์์ํฌ ๋ชจ๋ธ ํ์ผ์ ํ๊ฒฝ(Config) ํ์ผ์ DNN ํจํค์ง์์ ๋ค์ ๋ณํํ ํ๊ฒฝ ํ์ผ ์ ๋๋ค.
OpenCV ์ง์ Tensorflow ๋ชจ๋ธ
OpenCV DNN์ ์ด์ฉํ Inference ์ํ ์ ์ฐจ
OpenCV DNN์ ์ด์ฉํ Inference ์ํ ์ ์ฐจ์ ๋ฐํ์ฌ ํ๋ฒ ์์๋ณด๊ฒ ์ต๋๋ค.
1. Weight(๊ฐ์ค์น)๋ชจ๋ธ ํ์ผ๊ณผ ํ๊ฒฝ ์ค์ ํ์ผ์ ๋ก๋ํ์ฌ Inference Network ๋ชจ๋ธ์ ์์ฑํฉ๋๋ค.
cvNet = cv2.dnn.readNetFromTensorflow('frozen_inference_graph.pb', 'graph.pbtxt')
img = cv2.imread('img.jpg')
rows, cols, channels = img.shape
2. ์ ๋ ฅ ์ด๋ฏธ์ง๋ฅผ Preprocessingํ์ฌ Network์ ์ ๋ ฅํฉ๋๋ค.
cvNet.setInput(cv2.dnn.blobFromImage(img, size=(300, 300), swapRB=True, crop=False))
3. inference Network์์ Output์ ์ถ์ถํฉ๋๋ค.
networkOutput = cvNet.forward()
4. ์ถ์ถ๋ Output์์ Detect ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋กํ ์๋ณธ Image ์์ Object Detection์ ์๊ฐํ ํฉ๋๋ค.
for detection in networkOutput[0,0]:
๊ทธ๋ฆฌ๊ณ Object Detected๋ ๊ฒฐ๊ณผ, Bounding Box ์ขํ, ์์ธก ๋ ์ด๋ธ๋ค์ ์๋ณธ image ์์ ์๊ฐํ ๋ก์ง์ ๊ตฌํํฉ๋๋ค.
OpenCV blobFromImage()
OpenCV blobFromImage()๋ Image๋ฅผ Preprocessing ์ํํ์ฌ Network์ ์ ๋ ฅ ํ ์ ์๊ฒ ์ ๊ณตํฉ๋๋ค.
- ์ฃผ์ํ ํน์ง์ผ๋ก๋ ์ด๋ฏธ์ง ์ฌ์ด์ฆ๋ฅผ ๊ณ ์ ํฉ๋๋ค.
- ์ด๋ฏธ์ง ๊ฐ์ ์ค์ผ์ผ๋ง ํฉ๋๋ค.
- BGR์ RGB๋ก ๋ณ๊ฒฝํ๋ฉฐ, ์ด๋ฏธ์ง๋ฅผ Cropt ํ ์ ์๋ ์ต์ ์ ์ ๊ณตํฉ๋๋ค.
- ๋ํ OpenCV๋ RGB์ด๋ฏธ์ง๋ฅผ BGR ํํ๋ก ์ ์ฅํ๋ฏ๋ก ์๋ณธ Image ๊ทธ๋๋ก ์ ์ฅํ๋ ค๋ฉด cvtColor()๋ฅผ ์ด์ฉํ์ฌ ๋ค์ RGB๋ก ๋ณํ ํ๋ ๊ณผ์ ์ด ํ์ํฉ๋๋ค.
img_bgr = cv2.imread(‘์๋ณธimage’)
img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)
- blobFromImage( )์ swapRB=True๋ cv2.imread()๋ก ๋ก๋ฉ๋ BGRํํ์ ๋ฐ์ดํฐ๋ฅผ RGB๋ก ๋ณํํ์ฌ Network์ผ๋ก ์ ๋ ฅํฉ๋๋ค.
img_bgr = cv2.imread(‘์๋ณธimage’)
cvNet.setInput(cv2.dnn.blobFromImage(
img_bgr, size=(300, 300), swapRB=True, crop=False))
OpenCV Video Stream Capture๋ฅผ ์ด์ฉํ Video Object Detection
OpenCV์ VideoCapture( ) API๋ฅผ ์ด์ฉํ์ฌ Video Stream์ Frame by Frame๋ณ๋ก Captureํ Image์ Object Detection์ ์ํํ๋ ๋ฐฉ์์ ๋ฐํ์ฌ ์์๋ณด๊ฒ ์ต๋๋ค.
input_video = cv2.VideoCapture(input_file_path) # Frame by Frame์ผ๋ก Iteration์ ์งํ ํฉ๋๋ค.
while(True):
frame ๋ณ๋ก Object Detection ์ํ
- ์ด ์์ ํ๋ฆ์ ๊ฐ๋จํ ์ค๋ช ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- VideoCapture ์ด๊ธฐํ: cv2.VideoCapture(input_file_path) ํจ์๋ ์ง์ ๋ ๊ฒฝ๋ก(input_file_path)์ ๋น๋์ค ํ์ผ์ ๋ก๋ฉํ์ฌ ๋น๋์ค ์คํธ๋ฆผ์ ์ด๊ธฐํํฉ๋๋ค.
- ์ด ํจ์๋ OpenCV ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ผ๋ถ๋ก์, ๋น๋์ค ํ์ผ์ด๋ ์ฐ๊ฒฐ๋ ์นด๋ฉ๋ผ์์ ๋น๋์ค๋ฅผ ์บก์ฒํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- ํ๋ ์๋ณ ์ฒ๋ฆฌ: while(True) ๋ฃจํ๋ capture.read()์ ๊ฐ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋์ค ์คํธ๋ฆผ์์ ๊ณ์ํด์ ๊ฐ ํ๋ ์์ ์ฝ์ต๋๋ค. ์ฌ๊ธฐ์ capture์ VideoCapture()์ ์ํด ์์ฑ๋ ์ธ์คํด์ค์
๋๋ค.
- ์ด ๋ฃจํ๋ ๋น๋์ค๊ฐ ๋๋๊ฑฐ๋ ์ค๋จ ์กฐ๊ฑด(๋ํ์๋ ํ์๋์ง ์์)์ด ์ถฉ์กฑ๋ ๋๊น์ง ๊ณ์ ์คํ๋ฉ๋๋ค.
- ๊ฐ ํ๋ ์์ ๋ํ ๊ฐ์ฒด ํ์ง: ์ถ์ถ๋ ๊ฐ ํ๋ ์์ ๋ํ์ฌ ๊ฐ์ฒด ํ์ง๊ฐ ์ํ๋ฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ ํ๋ จ๋ ๋ชจ๋ธ(์: YOLO, SSD, ๋๋ Faster R-CNN๊ณผ ๊ฐ์)์ ์ฌ์ฉํ์ฌ ๊ฐ ํ๋ ์ ๋ด์ ๊ฐ์ฒด๋ฅผ ํ์งํ๊ณ ์๋ณํ๋ ๋ฐฉ์์ด ํฌํจ๋ ์ ์์ต๋๋ค.
- ์ถ๋ ฅ ์๊ฐํ: ์ฒ๋ฆฌ ํ์๋ ๊ฒฐ๊ณผ(์: ๊ฐ์ง๋ ๊ฐ์ฒด ์ฃผ๋ณ์ ๊ฒฝ๊ณ ์์, ํด๋์ค ๋ ์ด๋ธ)๋ฅผ ํ๋ ์์ ๊ทธ๋ฆฌ๊ณ ์ด ํ๋ ์๋ค์ ๋์คํ๋ ์ดํ๊ฑฐ๋ ์ถ๋ ฅ์ผ๋ก ์ ์ฅํ ์ ์์ต๋๋ค.
- ์ฐ์์ฑ: ๋น๋์ค ์คํธ๋ฆผ์ ๋๊น์ง, ๋๋ ํน์ ์ค๋จ ์กฐ๊ฑด์ด ๋ง์กฑ๋ ๋๊น์ง ์ด ํ๋ก์ธ์ค๊ฐ ๋ชจ๋ ์ ํ๋ ์์ ๋ํด ๋ฐ๋ณต๋ฉ๋๋ค.
- ์ด๋ฅผ ํตํด ๋น๋์ค ๋ฐ์ดํฐ์ ๋ํ ์ค์๊ฐ ๋๋ ์ผ๊ด ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํด ๊ฐ์ฒด ํ์ง ๋ชฉ์ ์ผ๋ก ํ์ฉ๋ ์ ์์ต๋๋ค.
MS-COCO Dataset ์ค๋ธ์ ํธ ์นดํ ๊ณ ๋ฆฌ
์ด๋ ๊ฒ ๋ณด์๋๊ฒ ์ฒ๋ผ ๋๋ต 80๊ฐ ์ ๋์ Object Category๊ฐ ์์ต๋๋ค.
๋ฐ์ํ
'๐ Computer Vision' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[CV] SSD - Single Shot (Multibox) Detector (0) | 2024.07.07 |
---|---|
[CV] OpenCV๋ก Object Detection ๊ตฌํํ๊ธฐ (Part.2) (0) | 2024.06.04 |
[CV] Faster R-CNN (Faster Region-based Convolutional Neural Network) (0) | 2024.05.29 |
[CV] Fast R-CNN (Fast Region-based Convolutional Neural Network) (0) | 2024.05.27 |
[CV] SPPNet - Spatial Pyramid Pooling Net (0) | 2024.05.25 |