위 개와 고양이 이미지는 만약 이미지 분류를 했을 때, 특징이 뚜렷하여 구별이 쉽다. 하지만 아래 사진은 어떨까? 컴퓨터는 분류를 위해 스킨 헤어, 안경, 사람이라는 특징을 제외한 다른 특징을 찾아내야 한다. 구별은 가능할지라도 어떤 부분이 다른지 설명하기 매우 어려울 것이다.

이번 연구의 배경은 이미지 분류와 유사 이미지 분류의 차이에서 기인했다. 유사 이미지 분류는 이미지들간 특성을 추출하여 분류해야 하기 때문에, 단순 이미지 분류와는 차이가 있다. 더불어 참고 자료가 적고 이미지 데이터 전처리, 하이퍼 파라미터 조정, 파인 튜닝 등 미세한 조정이 필요하다. 여기서 유사 이미지 분류에 있어서 '실용적이고 범용적인 모델을 만들 수 있을까?'라는 생각을 했고 자동차라는 아이템을 선정해 연구를 시작했다.
연구의 목적은 첫번째로, 자동차 이미지를 크롤링하여 직접 수집 및 설계하여 질 좋은 데이터 셋을 구성하고자 했다. 두번째로, 수집한 데이터 셋을 기반으로 분류 모델 설계를 진행하고, 그 과정에서 참고 자료 및 선행 연구와 전이 학습 모델을 찾아보았다. 또한 직접 하이퍼 파라미터 및 파인 튜닝을 통해 구체적인 모델링까지 목표로 하였다. 이는 모델링 과정에서 발생 가능한 문제의 원인을 파악하고 해결해 볼 수 있는 기회라고 생각했기 때문이다. 추가적으로 다른 데이터 셋에서의 성능을 확인하기 위하여 kaggle의 자동차 분류 데이터 셋을 이용해 모델의 성능을 검증하고자 하였다.
시중에 판매하는 5개의 국내 차량 브랜드를 기준으로 이미지 데이터를 수집했다.
# 함수로 만들어서 나머지 모델 이미지 크롤링
def GoogleImgCrawling(model):
# 1. 이미지 저장할 상위 폴더 생성
if not os.path.isdir(f"{model}/"):
os.makedirs(f"{model}/")
# 2. 크롬 웹드라이버 연결
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get("https://www.google.co.kr/imghp?hl=ko")
# 3. 검색어 입력하기
search = model
elem = driver.find_element(By.NAME, "q")
elem.send_keys(search)
elem.send_keys(Keys.RETURN)
# 4. 스크롤 끝까지 내리기
SCROLL_PAUSE_TIME = 2
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(SCROLL_PAUSE_TIME)
new_height = driver.execute_script("return document.body.scrollHeight")
if new_height == last_height:
try:
driver.find_element(By.CSS_SELECTOR, ".mye4qd").click()
except:
break
last_height = new_height
# 5. 이미지 찾아서 원본 파일로 저장하기
images = driver.find_elements(By.CSS_SELECTOR, ".rg_i.Q4LuWd")
count = 1
for image in images:
try:
image.click()
time.sleep(2)
image = image.get_attribute('src')
urllib.request.urlretrieve(image, f"{model}/" + search + "_" + str(count) + ".jpg")
print(f"Image saved: {model}_{count}.jpg")
count += 1
except:
pass
driver.close()
GoogleImgCrawling('The all-new GRANDEUR')
기아, 현대, 르노 삼성, 쌍용, 제네시스로 구성된 5개 브랜드의 차종을 Selenium을 활용해 구글 이미지에 검색하고 나오는 차량 이미지 데이터를 수집하였다. 각 모델 당 500장의 이미지를 수집하였고, Image Generator를 통해 모델 당 1000장의 데이터셋을 구성했다.
이렇게 구성된 데이터셋을 학습 시켰을 때, 전이 학습의 유무와 상관 없이 성능이 매우 좋지 않았다. 성능이 잘 나오지 않는 것에 대해 데이터셋에 문제가 있는지, 아니면 모델 자체에 문제가 있는지 판단하고 해결 방안을 찾아야했다. 정제된 데이터 셋을 가지고 성능을 확인해보기로 했다.
https://journal-home.s3.ap-northeast-2.amazonaws.com/site/2022w/pre/0746.pdf
경북대학교에서 스마트팜 이미지 데이터를 이용한 딸기의 생육 단계 분류 모델 개발에 관한 연구를 참고하였습니다. 위 연구에서 98.7%의 정확도로 우수한 성능을 보였고, 이를 딥러닝 모델에 적용시켜보았을 때, 전 처리나 하이퍼 파라미터 조정, Fine Tuning을 수행하지 않은 상태에서 훈련 데이터에 대해 약 98%, 검증 데이터에 대해 약 77%의 성능을 보였다. 물론 과대적합이 발생 하였지만, 데이터셋과 딥러닝 모델에 대한 수정 없이 어느 정도 성능을 보인다는 점에서 딥러닝 모델 자체의 문제는 없다고 판단하였다.
기존의 차량 이미지 데이터셋보다 품질이 더 뛰어난 데이터셋을 갖춰야 하기 때문에, 정제된 형태의 이미지를 수집해야했습니다. 각 브랜드의 홈페이지에 모델링 된 차량 이미지가 있었고, 이를 크롤링하여 정제된 데이터를 구할 수 있었다. 단, 모델링 된 차량 이미지만 사용하게 되면 모델링 되지 않은 차량 이미지에 대해서는 학습하지 못하기 때문에 한 차량 모델에 대해 모델링 된 차량 이미지 120장, 크롤링을 통한 차량 이미지 180장으로 데이터셋을 구성하였다. 총 33개의 차량 모델을 각 300장씩 9900장이 됐다.
다음 포스트에서는 딥 러닝 모델 설계에 대한 내용을 다룰 예정이다.
댓글