이글은 www.analyticsvidhya.com의 내용임. (링크) Show 원문에서는 PyTorch를 사용하지만, 여기서는 Tensorflow에 맞게 수정 정리하였다. Deploy an Image Classification Model Using FlaskOverview
Introduction 이미지 분류는 소셜미디어의 건강 기능일 때 중요한 요소이다. 어떤 태그에 기초하여 컨텐츠를 분류하는 것은 다양한 법률과 규정을 대신한다. 이는 특정 대상의 집합으로부터 컨텐츠를 숨기기 위해 중요하다. 인스타그램의 이미지를 보면 이미지 몇몇은 "Sensitive Content"로 표시된다. 인도주의에 대한 위협, 테러 또는 폭력적인 이미지는 일반적으로 "Sensitive Content"로 분류된다. 인스타그램은 어떻게 이미지를 분류하는지는 항상 궁금했다. 이 호기심이 이미지 분류 절차를 이해하기 위한 답을 찾도록 했다. 대부분의 이미지는 인스타그램이 배포한 이미지 분류 모델로 탐지된다. 또한 커뮤니티 기반 피드백도 있다. 이는 이미지 분류에 대한 중요한 사용 사례이다. 이글에서는 이미지의 분류를 감지하기 위한
이미지 분류보델을 배포해 본다. Table of Contents
모델 배포(Deployment)란? 전형적인 ML(Machine Learning)과 DL(Deep Learning) 프로젝트에서 보통 문제 상태를 정의하고 데이터를 수집하고 준비하고 모델을 구축한다. 모델을 성공적으로 구축하고 훈련한 이후, 이를
최종사용자가 사용할 수 있기를 바란다. 따라서 최종 사용자가 이용할 수 있도록 모델을 배포(deploy)해야 한다. 모델 배포는 ML과 DL 프로젝트의 최종 단계중 하나이다. 이글에서는 분류 모델을 구축하고 Flask를 사용하여 배포하는 법을 알아본다. Flask란? Flask는 파이썬으로 구현한 웹 어플리케이션 프레임워크이다. 이는 프로토콜 관리, 쓰레드 관리 등과 같은 자세한 것에 대한 걱정 없이 어플리케이션을 웹 개발자가 더 쉽게 작성할 수 있게 만들어진 여러개의 모듈이 있다. Flask는 웹 어플리케이션 개발을 위한 다양한 선택을 할 수 있고 웹 어플리케이션 구축을 위해 필수적인 도구와 라이브러리를 제공한다. Flask 설치 다음 명령으로 설치한다 >>Linux 문제 상태(Statement) 이해하기 문제 상태를 이야기해 보자. (아래 그림과 같은) 텍스트 박스를 포함한 웹페이지를 만들고 URL을 입력한다. 여기서 작업은 URL로부터의 모든 이미지를 긁어오는 것(Scrape)하는 것이다. 각 이미지에 대해 이미지 분류모델을 사용하여 분류하고 웹페이지에 표시한다. 다음은 단대단(end-to-end)모델의 작업흐름(workflow)이다. 프로젝트 작업 흐름 설정
아래 그림은 위 단계를 나타낸 것이다 사전훈련 이미지 분류모델 설정 이미지
분류를 위해 사전훈련된 Densenet 121 모델을 사용한다. 필요한 라이브러리를 임포트하고 텐서플로에서 사전훈련된 densenet 121 모델을 사용하고 테스트 이미지를 [다운로드]하여 dog.jpg로 저장한다. 우선 필요한
라이브러리를 임포트한다. >> get_prediction.py
이미지를 전처리하기 위한 함수를 정의한다. densenet 121인 입력크기인 224 X 224로 맞춘다. >> get_prediction.py
모델을 통해 분류하는 함수를 정의한다. >> get_prediction.py
모델을 로드하고 샘플 이미지로 테스트한다.
예측결과를 분류명과 매핑하기 위해 [imagenet_class_index.json]파일을 다운로드한 후
사용하였다. 아래는 실행 결과와 샘플 이미지이다.
>> dog.jpg
>> sunflower.jpg [get_prediction.py 전체소스 다운로드] 이미지 스크래퍼(Scraper) 구축 사용자가 입력한 URL로부터 이미지(여기서는 jpeg만을 대상으로 한다.)를 다운받기 위한 웹 스크랩퍼를 구축한다. 이를 위해 BeautifulSoup라이브러리를 사용한다. 필요한
라이브러리를 임포트한다. >> get_images.py
사용자가 URL을 입력하면 해당 URL의 이미지를 저장하기 위한 디렉토리를 생성하고 이미지를 저장한다. 이를 위해 스크래핑한 이미지를 저장하기 위한 디렉토리 경로를 반환하는 get_path함수를 정의한다. >> get_images.py
입력받은 URL에서 이미지를 다운로드 받아 저장하기 위한 get_images함수를 정의한다. 이 함수는 get_path 함수로 저장할 디렉토리를 생성하고 URL의 소스코드를 요청한다. 이 소스코드에서 "img" 태그로 이미지를 추출한다. 이 글에서는 jpeg 포멧만을 대상으로 하며, 이미지 파일명은 counter 이름 저장한다. 이
함수를 실행하려면, static/ 서브디렉토리가 생서되어 있어야 한다. >> get_images.py
다운로드 결과는 아래와 같다. [get_images.py 전체소스 다운로드] 웹페이지 생성 웹 서비스를 위해 아래와 같이 "home.html"과"image_class.html" 두개의 웹페이지를 생성하자.
1. home.html 위 이미지와 같이 검색 컨텐이너에서 데이터를 수집하기 위해 home.html파일을 아래와 같이 작성한다. 이렇게 함으로써 백엔드(backend) 코드는 "search"라는 이름으로 어떠한 데이터를 받아들일 수 있다. [home.html 전체소스 다운로드] 2. image_class.html 결과를 계산하는 동안 다른 페이지는 아래처럼 결과를 보여준다. 이 "image_class.html"페이지는 매번 요청시마다 업데이트 되고 웹페이지에서 아래 정보를 볼 수 있게 한다.
[image_class.html 전체 샘플소스 다운로드] 실제로는 generate_html.py에서 동적으로 image_class.html을 생성한다. >> generate_html.py
[generate_html.py 전체소스 다운로드] 이제 각각의 조각을 조합한 Flask 프로젝트를 설정하자. Flask 프로젝트 설정 프로젝트와 관련된 다음 작업을 완료했다.
Flask 프로젝트를 구성하기 위해 각각의 모듈을 아래와 같은 구조로 만든다.
Flask Application 실행 Flask 어플리케이션은 home.html 파일 먼저 랜더링 하여 자용자로부터 이미지 분류를 위한 요청을 받을 준비를 한다. 사용자가 URL을 입력하면 Flask는 POST를 감지하고 get_image_class 함수를 호출한다. get_image_class 함수는 다음과 같은 단계로 진행된다.
>> get_class.py
여기까지 사용자에게 결과를 제공하기 위한 준비를 마쳤다. success 함수를 호출한 후 image_class.html 파일을 랜더링한다. >> get_class.py
[get_class.py 전체소스 다운로드] URL의 모든 이미지에 대한 예측하기 지금까지 각각의 이미지에
대해 개별적으로 예측을 진행했다. 여러 이미지를 포함하는 새로운 파라미터인 directory_path를 get_category에 추가하여 이를 개선한다.
배포된 모델 작업 이제 get_class.py를 실행하면 Flask 서버가 localhost:5000로 시작된다. |