재료들이 찍혀있는 사진에서 재료를 인식하고 문자열로 추출해야한다.
여러 AI 학습 방식을 알아봤지만, 우리팀은 관련 경험이 전무하기 때문에 처음부터 끝까지 하나하나 하기는 어려웠다.
조사 도중 Roboflow라는 사이트를 알게 되었다.
- 이미지 전처리 작업을 도와주며, 사용자 지정 모델을 기반으로 모델 구성까지 도와주는 사이트이다.
- 이미지 전처리 작업 후, 외부 모델에 적용시키면 딱히 제한도 없다.
- 내부 모델도 여러 객체를 인식하는데 적절한 모델(roboflow 3.0)이 있다.
- Java API를 지원한다.
완벽해 보이지만 단점도 있다.
- 한 계정당 모델 훈련 횟수가 3번으로 제한된다는 것이다.
- API 호출 횟수가 계정당 1000번으로 매우 적은 편이다.
- 만일 유료버전으로 업그레이드 한다 하더라도 가격이 한달에 30만원에 육박한다.
이같은 단점 때문에 배포해서 여러 사람들이 이용하는 프로젝트에 적용하기에는 부적절하다.
하지만 우리 팀이 이용하기에는 적절하다.
- 당장 여러 사람이 이용할 필요가 없다.
- AI 사용이 필수적(사진으로 재료 인식)이다.
- 조원이 4명이나 있고, 메일도 인당 3개씩 있으니 30번 넘게 모델 구성이 가능하다.
- 이미지 전처리, 모델 학습 과정이 매우 단순하다.
위와 같은 이유로 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 데이터셋을 제공하며, 그 숫자도 적지 않다.
- 자신이 원하는 roboflow 링크에 접속
- Images 클릭
- 좀 내리다보면 50 per page가 보임 이걸 200으로 변경
- 위로 올려서 select all 클릭 그 후 다음 페이지로 넘어가서 다시 select all 반복
- Clone 00 Selected Images 클릭
- 자기 워크스페이스 선택하고 Finish Cloning 00 Images
- 끝~
roboflow public dataset의 장점은 라벨링 정보까지 모두 가져올 수 있다는 점이다.
이는 이미지 전처리에 대한 내용으로 다음 글에서 설명하겠다.
Roboflow 이미지 전처리 + 모델 훈련 (tistory.com)
'프로젝트 > AI명종원' 카테고리의 다른 글
GPT-4: 재료->음식->레시피 기능 구현 (1) | 2024.05.17 |
---|---|
GPT-3.5: 재료->음식->레시피 기능 구현 (0) | 2024.05.16 |
Roboflow Java API (0) | 2024.05.10 |
Roboflow 이미지 전처리 + 모델 훈련 (0) | 2024.05.10 |
Session 기반 로그인 (0) | 2024.05.08 |