물체 검출과 오검출 평가
학습 목표
검출 개수가 많다고 좋은 설정은 아닙니다. 알고 있는 원의 위치·크기와 비교해 오검출을 판단합니다.
실행 조건
opencv-python-headless·NumPy·Matplotlib을 사용합니다.
정답이 있는 영상 만들기
시작 조건
160×200 Gray 영상에 중심 (50,50), (140,70), (90,120), 반지름 15,20,12인 원을 그립니다.
진행 방법
- 제공된 원 영상에 HoughCircles를 적용하세요.
- 검출 결과를 원본 위에 그려 실제 원과 대응시키세요.
남길 결과
- 정답·검출 비교 그림과 원별 오차 표.
import numpy as np
import matplotlib.pyplot as plt
import cv2 as cv
truth=[(50,50,15),(140,70,20),(90,120,12)]
image=np.full((160,200),230,dtype=np.uint8)
for x,y,r in truth:cv.circle(image,(x,y),r,30,-1)
blur=cv.GaussianBlur(image,(5,5),1)
def detect(frame,threshold=20):
return cv.HoughCircles(frame,cv.HOUGH_GRADIENT,dp=1,minDist=25,param1=100,param2=threshold,minRadius=8,maxRadius=25)
found=detect(blur);print(found)
plt.imshow(image,cmap='gray')
if found is not None:
for x,y,r in found[0]:plt.gca().add_patch(plt.Circle((x,y),r,fill=False,color='tab:red'))
결과 기록·자가 점검
원:
실제 중심·반지름:
검출 중심·반지름:
오차 [pixel]:
확인할 점
- 검출하지 못한 경우를 오차 0으로 기록하지 않았는가?
- 가까운 원을 중복 대응시키지 않았는가?
검출 기준 하나 바꾸기
시작 조건
param2=15와 25를 비교합니다. 같은 영상·반지름 범위를 유지합니다.
진행 방법
- 검출 수·놓친 원·중복·오검출을 각각 세세요.
- 중심 오차 5 pixel 이내이고 반지름 오차 4 pixel 이내인 검출을 대응으로 정하세요.
- 어떤 기준이 더 나은지 검출 수가 아니라 오류의 종류로 판단하세요.
남길 결과
- 두 설정의 검출 그림과 대응 표.
for threshold in [15,25]:print(threshold,detect(blur,threshold))
# TODO: 검출을 정답과 일대일 대응해 오류를 세세요.
결과 기록·자가 점검
param2:
대응된 원:
놓친 원:
오검출:
중심 오차:
확인할 점
- 서로 다른 임계값에서 같은 대응 기준을 사용했는가?
- 원 하나에 여러 검출을 모두 정답으로 세지 않았는가?
흐림·잡음에서 실패 찾기
시작 조건
seed=7, 표준편차 15의 영상 잡음을 추가하고 같은 설정을 적용합니다.
진행 방법
- 검출 전에 Median 또는 Gaussian Filter 중 하나를 선택하세요.
- 필터 전후의 검출과 계산 시간을 비교하세요.
- 영상 기반 제어에서 검출을 신뢰할 수 없는 조건을 한 가지 정하세요.
남길 결과
- 잡음 영상의 전처리 비교와 유효성 기준.
rng=np.random.default_rng(7)
noisy=np.clip(image.astype(float)+rng.normal(0,15,image.shape),0,255).astype(np.uint8)
filtered=cv.medianBlur(noisy,5);print(detect(filtered))
# TODO: 필터 전후의 대응 결과와 시간을 비교하세요.
결과 기록·자가 점검
전처리:
검출 수:
대응 성공:
처리 시간 [ms]:
확인할 점
- uint8 변환 전에 값을 0…255로 제한했는가?
- 시간은 한 번의 실행 수치로 알고리즘의 일반적 속도라고 단정하지 않았는가?