본문 바로가기
프로젝트/AI명종원

Roboflow 선택 과정 + 이미지 수집(크롤링)

by HWK 2024. 5. 10.

재료들이 찍혀있는 사진에서 재료를 인식하고 문자열로 추출해야한다.

여러 AI 학습 방식을 알아봤지만, 우리팀은 관련 경험이 전무하기 때문에 처음부터 끝까지 하나하나 하기는 어려웠다.

 

조사 도중 Roboflow라는 사이트를 알게 되었다.

  1. 이미지 전처리 작업을 도와주며, 사용자 지정 모델을 기반으로 모델 구성까지 도와주는 사이트이다.
  2. 이미지 전처리 작업 후, 외부 모델에 적용시키면 딱히 제한도 없다.
  3. 내부 모델도 여러 객체를 인식하는데 적절한 모델(roboflow 3.0)이 있다.
  4. Java API를 지원한다.

완벽해 보이지만 단점도 있다.

  1. 한 계정당 모델 훈련 횟수가 3번으로 제한된다는 것이다.
  2. API 호출 횟수가 계정당 1000번으로 매우 적은 편이다.
  3. 만일 유료버전으로 업그레이드 한다 하더라도 가격이 한달에 30만원에 육박한다.

이같은 단점 때문에 배포해서 여러 사람들이 이용하는 프로젝트에 적용하기에는 부적절하다.

하지만 우리 팀이 이용하기에는 적절하다.

  1. 당장 여러 사람이 이용할 필요가 없다.
  2. AI 사용이 필수적(사진으로 재료 인식)이다.
  3. 조원이 4명이나 있고, 메일도 인당 3개씩 있으니 30번 넘게 모델 구성이 가능하다.
  4. 이미지 전처리, 모델 학습 과정이 매우 단순하다.

위와 같은 이유로 roboflow를 선택했다. 이미지 수집 과정은 다음과 같이 진행한다.

 

구글 크롤링

크롤링 코드는 기존 여러 코드를 참고했다.

image_info_list = soup.find_all('img', class_='YQ4gaf') 부분이 다른 코드들과의 차이점이며,

구글 html 코드는 주기적으로 바뀐다고 한다. YQ4gaf를 찾는데 가장 오래 걸린 것 같다.

from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import urllib.request
import time
import os

# 페이지를 아래로 스크롤하는 함수
def scroll_down():
    SCROLL_PAUSE_TIME = 1
    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 > 0:
            last_height = new_height
            continue
        else:
            break

if __name__ == "__main__":
    query = input("검색어 : ") 
    image_cnt = int(input("수집할 이미지 개수 : ")) 

    save_dir = "/" + query  # 저장할 디렉토리 이름
    os.makedirs(save_dir, exist_ok=True)  # 디렉토리 생성 (이미 존재하면 무시)
    os.chdir(save_dir)  # 작업 디렉토리 변경

    driver = webdriver.Chrome()  # Chrome 웹 드라이버 실행
    URL = 'https://www.google.com/search?tbm=isch&q='
    driver.get(URL + query)  # 검색어를 포함한 URL로 이동

    scroll_down()  # 페이지 스크롤 함수 호출

    # 이미지 정보 추출
    soup = BeautifulSoup(driver.page_source, 'html.parser')
    image_info_list = soup.find_all('img', class_='YQ4gaf')
    image_and_name_list = []

    print('=== 이미지 수집 시작 ===')

    downlaod_cnt = 0
    for i in range(len(image_info_list)):
        if i == image_cnt:
            break
        if 'src' in image_info_list[i].attrs:
            save_image = image_info_list[i]['src']

            image_path = os.path.join(query.replace(' ', '_') + '_' + str(downlaod_cnt) + '.jpg')
            image_and_name_list.append((save_image, image_path))
            downlaod_cnt += 1

    # 이미지 다운로드
    for i in range(len(image_and_name_list)):
        urllib.request.urlretrieve(image_and_name_list[i][0], image_and_name_list[i][1])

    print('=== 이미지 수집 종료 ===')
    driver.close()  # 브라우저 닫기

 

 

Roboflow Public Dataset

구글 크롤링을 하지 않더라도 roboflow에서는 무려 public 데이터셋을 제공하며, 그 숫자도 적지 않다.

  1. 자신이 원하는 roboflow 링크에 접속
  2. Images 클릭
  3. 좀 내리다보면 50 per page가 보임 이걸 200으로 변경
  4. 위로 올려서 select all 클릭 그 후 다음 페이지로 넘어가서 다시 select all 반복
  5. Clone 00 Selected Images 클릭
  6. 자기 워크스페이스 선택하고 Finish Cloning 00 Images
  7. 끝~ 

roboflow public dataset의 장점은 라벨링 정보까지 모두 가져올 수 있다는 점이다.

이는 이미지 전처리에 대한 내용으로 다음 글에서 설명하겠다.

Roboflow 이미지 전처리 + 모델 훈련 (tistory.com)

 

Roboflow 이미지 전처리 + 모델 훈련

이미지 전처리Upload Data → 파일 올리기 또는 폴더 올리기Not Annotated 클릭 → 아무 사진 클릭각각의 객체 선택, 클래스는 없으면 만들어주기(영어) 한 사진 작업 끝나면 좌측 상단의 뒤로가기 버튼

hwk99.tistory.com