본문 바로가기
📂 프로젝트/◾ 국비지원 2차

[2차 프로젝트] CNN 구조의 차량 분류 모델 연구 (1) (개발자 취업코스, 국비 지원, 구글 크롤링, 데이터 전처리, 이미지 전처리, 전이 학습, CNN 모델)

by 이 정규 2023. 2. 7.
728x90
반응형

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

이번 연구의 배경은 이미지 분류와 유사 이미지 분류의 차이에서 기인했다. 유사 이미지 분류는 이미지들간 특성을 추출하여 분류해야 하기 때문에, 단순 이미지 분류와는 차이가 있다. 더불어 참고 자료가 적고 이미지 데이터 전처리, 하이퍼 파라미터 조정, 파인 튜닝 미세한 조정이 필요하다. 여기서 유사 이미지 분류에 있어서 '실용적이고 범용적인 모델을 만들 있을까?'라는 생각을 했고 자동차라는 아이템을 선정해 연구를 시작했다.

연구의 목적은 첫번째로, 자동차 이미지를 크롤링하여 직접 수집 설계하여 좋은 데이터 셋을 구성하고자 했다. 두번째로, 수집한 데이터 셋을 기반으로 분류 모델 설계를 진행하고, 과정에서 참고 자료 선행 연구와 전이 학습 모델을 찾아보았. 또한 직접 하이퍼 파라미터 파인 튜닝을 통해 구체적인 모델링까지 목표로 하였. 이는 모델링 과정에서 발생 가능한 문제의 원인을 파악하고 해결해 있는 기회라고 생각했기 때문이다. 추가적으로 다른 데이터 셋에서의 성능을 확인하기 위하여 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장이 됐다.

향상된 이미지 데이터 셋

다음 포스트에서는 딥 러닝 모델 설계에 대한 내용을 다룰 예정이다.

728x90
반응형

댓글