Mask R-CNN은 원래 있던 Faster-RCNN에 기반한 모델입니다. 간단하게 말하면 Faster R-CNN으로 Object를 검출한 box 안에 Object에 예측된 부분을 mask 씌워준 것입니다. 기존의 Faster R-CNN을 Object Detection 역할로 하고 각각의 RoI(Region of Interest)에 mask를 입혀주는 작은 FCN(Fully Covolutional Network)를 추가해준 것입니다. 또한 RoI Pooling이아닌 RoIAlign를 사용했다는데 , mask accuracy가 증가하였다고 합니다. 자세한 내용은 추후에 포스팅 할 예정입니다.
Mask R-CNN 세팅하기
기본적으로 Anaconda가 세팅이 되어있어야합니다. 이글은 Windows10을 기준으로 작성합니다.
GPU를 사용하기 위해 CUDA 와 CUDNN을 설치해야하는데 버전이 맞지 않으면 호환이 되지 않아 오류가 날 가능성이 큽니다. 제가 구동한 버전은 아래와 같습니다.
추가적으로 이사이트에 들어가서 mask_rcnn_coco.h5.file 을 다운로드하여 Mask_RCNN 폴더에 넣어줍니다.
이제 주피터 노트북을 이용하여 예제를 실행해 보도록 하겠습니다.
Mask_RCNN 폴더내에 samples 폴더에 들어가서 demo.ipynb 파일을 실행시켜서 데모를 구동해봅니다.
성공적으로 구동이 되었습니다.
# Load a random image from the images folder
file_names = next(os.walk(IMAGE_DIR))[2]
image = skimage.io.imread(os.path.join(IMAGE_DIR, random.choice(file_names)))
Mask_RCNN폴더내에 images에 자신이 원하는 사진을 넣고 아래와 같이 코드 수정을 하면 다른 사진도 돌려볼 수 있습니다.
# Load a random image from the images folder
filename = os.path.join(IMAGE_DIR, 'doge.jpg')
image= skimage.io.imread(filename)
n = 1
for i in img:
imgUrl = i['data-source']
with urlopen(imgUrl) as f:
with open('./img/' + plusUrl + str(n)+'.jpg','wb') as h: # w - write b - binary
img = f.read()
h.write(img)
n += 1
print('다운로드 완료')
네이버 이미지는 한페이지에 50개의 이미지만 생성되므로 보통 이미지가 다운로드되면 50개까지 크롤링이 가능합니다.
아래는 전체 소스 코드입니다.
from urllib.request import urlopen
from bs4 import BeautifulSoup as bs
from urllib.parse import quote_plus
baseUrl = 'https://search.naver.com/search.naver?where=image&sm=tab_jum&query='
plusUrl = input('검색어를 입력하세요 : ')
# 한글 검색 자동 변환
url = baseUrl + quote_plus(plusUrl)
html = urlopen(url)
soup = bs(html, "html.parser")
img = soup.find_all(class_='_img')
n = 1
for i in img:
imgUrl = i['data-source']
with urlopen(imgUrl) as f:
with open('./img/' + plusUrl + str(n)+'.jpg','wb') as h: # w - write b - binary
img = f.read()
h.write(img)
n += 1
print('다운로드 완료')
눈을 감게 되면 눈의 세로 비율이 작아지고, EAR 비율역시 작아집니다. 사람이 깜박이면 눈의 종횡비가 급격히 감소하여 0에 가까워집니다. 사람이 졸리면 눈을 감거나 눈을 조그마하게 뜨는 행동을 하게 되므로 EAR값을 이용하여 주기적으로 낮아지면 알람을 울리게 하는 졸음감지 시스템을 구현할 수 있습니다.
def eye_aspect_ratio(eye):
#눈에 랜드마크 좌표를 찍어서 EAR값을 예측합니다.
A = dist.euclidean(eye[1],eye[5])
B = dist.euclidean(eye[2],eye[4])
C = dist.euclidean(eye[0],eye[3])
ear = (A+B) / (2.0 * C)
return ear
또한 평소 눈의 THRESH값을 0.3정도로 설정해놓고 눈을 감게되면 EAR비율이 작아지므로 ALARM이 울리게 됩니다.
# 눈의 EAR의 THRESH 기본값을 0.3으로 설정합니다.
EYE_AR_THRESH = 0.3
EYE_AR_CONSEC_FRAMES = 48
# 프레임 카운터와 부울을 초기화하는 데 사용
# 알람이 울리면 표시
counter = 0
ALARM_ON = false
OpenCV의 drawContours 함수를 이용하여 눈 주변에 선을 실시간으로 그려줍니다.