본문 바로가기
Project/Image Classification Pipeline Project

1. 파이썬 이미지 데이터 크롤링하기 (이미지 수집부터 분류 모델까지)

by inhovation97 2021. 5. 23.

 

파이토치 공부를 끝낸 시점에서 공부한 것을 전부 적용해보기 위해 아래 순서대로 포스팅을 예정중입니다.

데이터 수집 - 전처리 - 모델링 - 성능 개선 

 

파이토치를 공부할 때에는 패키지를 이용해 cifar10 이미지를 분류했었는데, 이번에는 구글에서 직접 크롤링하여 이미지를 수집해보겠습니다.

 

 

 

포스팅 순서

1. 파이썬으로 구글창 열기
2. 크롤링하고싶은 이미지 검색하기
3. element를 이용해 url 저장하기
4. 이미지 저장

 

항상 실습 코드들을 보면 Dog - Cat 분류를 많이 하더라구요.

그래서 저는 shark - whale - dolphin 3가지 동물을 크롤링하여 딥러닝 모델로 multi classification을 하려합니다.

나중에 모델은 resnet을 transfer learning을 할 예정인데 resnet에서 쓰였던 imagenet 1000에서는 shark와 whale은 있지만 dolphin은 없더군요.

dolphin을 얼마나 잘 학습하느냐가 관건일 것 같은데 transfer leraning시에 어떻게 될 지 궁금하네요.

 

이 글 흥미롭게 보셨으면 모델링까지 제 포스팅을 따라서 한 번 같은 과정을 코딩하는 것도 재밌을 겁니다!

 

 

직접 구글 이미지 크롤링 자동화 코드를 작성해봅시다. 

원래는 google_images_download라고 구글에 검색하면 해당 페이지에 있는 코드만 복사해서 쓰는 아주 쉬운 방법이 있었는데 현재는 막힌 것 같더라구요.

 

tistory 블로그가 코드친화적이지 않아 가독성이 떨어지더라구요... 작성한 코드먼저 공유하고 이미지를 이용하겠습니다.

https://github.com/inhovation97/personal_project/blob/main/pytorch/pytorch_project-crawling.ipynb

 

inhovation97/personal_project

개인 프로젝트. Contribute to inhovation97/personal_project development by creating an account on GitHub.

github.com

 

 

<파이썬으로 구글창 열기>

selenium 라이브러리를 이용해서 구글에서 이미지를 따올겁니다.

가장 먼저 아래 주소에 가서 구글 드라이브를 다운로드해줍니다.

https://chromedriver.chromium.org/downloads

위 코드처럼 chrome 드라이버를 설치한 주소 경로를 지정해줍니다.

chrome_options 코드들은 드라이버를 열때 옵션을 추가해준건데 딱히 없어도 됩니다.

 

 

위 코드들을 전부 실행했을 때 구글창이 뜸과 동시에 파일에 google_screen 스샷이 생성돼 있으면 성공입니다.

driver.close()는 드라이버를 이용할 때 항상 넣어주세요.

코드로 닫지 않으면 종료되지 않아 계속 메모리를 잡아먹습니다.

 

 

<크롤링하고 싶은 이미지 검색하기>

 

앞서 얘기했듯이 저는 이미지 분류 모델을 만들어 분류하는 것이 크롤링 목적이기 때문에 어떤 키워드가 원하는 이미지가 많은지 먼저 확인합니다. 

shark, real shark 등등 검색해봤는데 해당 검색어가 깔끔한 이미지가 많이 나오네요 당첨입니다.

 

키워드를 정했으면 이제 코딩을 통해 열었던 구글창에 이미지를 검색하고 이미지 하나하나의 url을 리스트업한 뒤 그것들을 전부 다운로드 하는 단계로 나아갈 겁니다.

그러려면 화면의 레이아웃된 요소들에 접근하는 방식을 알아야합니다.

여기에 selenium 라이브러리가 굉장히 유용하죠.

 

웹페이지에는 요소들이 굉장히 많이 있는데 저는 css선택자, xpath를 이용해서 요소들을 활용할 겁니다.

 

 

 

코드를 보면 검색에 관한 element를 찾아서 browser를 정의한 뒤 키워드 a를 함께 지정하면, 구글에 키워드 a가 검색됩니다. 

 

 

 

 

<element를 이용해 url 저장하기>

 

f12를 눌러서 개발자 모드를 키면 표시한 것 이미지에 표시한 부분으로 요소들을 확인할 수 있습니다. 언급했던대로 저기서 이미지 클래스 요소를 이용하여 모든 이미지들을 리스트업 한 뒤 src를 이용하여 선택한 모든 이미지들의 url을 이용하여 이미지들을 다운받겠습니다.

 

 

이렇게 리스트업을 진행하죠. 이미지들을 살피다보면 간혹 이미지 url을 나타내는 src요소가 data-src도 있더라구요. 그래서 리스트업을 하는 데에 오류가 나지않게 data-src도 같이 append해줍니다.

 

 

건너 뛴 코드가 있죠?

이 부분은 서칭 후에 이미지를 최대한 많이 확보하기 위해 웹을 스크롤한 뒤 이미지 더보기 박스를 클릭해줍니다.

 

url 리스트를 생성하면 마지막으로 urlretrieve함수를 이용하여 url과 경로를 지정해주면 끝입니다.

미리 생성해 둔 폴더에 가보면 요로코롬 잘 저장돼 있습니다!

 

이제 제일 골치 아픈 일이 남아있습니다.

바로 일일이 수동으로 이상한 이미지들을 삭제해주는 것입니다.

 

가령 상어파일에 고래가 있는 경우입니다.

제일 어이없는건 돌고래와 고래 파일에 고래상어 이미지가 꽤 많이 있더군요 ㅋㅋ

고래상어는 엄연히 상어이므로 일일이 삭제해줘야합니다...

또 이미지의 왜곡이 심하거나 애니메이션 사진은 일일이 삭제해줬습니다.(이게 제일 오래 걸렸어요...)

 

이렇게 중간중간 애매한 사진들을 정제하면, 파일의 넘버가 뒤죽박주이 됩니다. 정렬이 안되죠.

그래서 다음 포스팅은 파일을 다시 넘버링해주고 train/test셋으로 분류하는 작업을 포스팅 합니다.

댓글