이번에 KT가 MS와 전략적 제휴를 맺은 만큼 Azure 관련한 클라우드 서비스를 알아보려고 합니다. 저도 이전 회사에서 Azure를 사용할 기회가 있었는데 제대로 써보질 못해서 아쉬웠는데 이번기회에 많이 써보려고 합니다.
포스팅하게 된 계기는 저도 Azure 초보자이고 아무래도 Cloud가 AWS 위주로 많이 포스팅이 되어있는 만큼 초보자들이 바로 검색해서 도움이 될 수 있기를 바라며 작성해 봅니다. 오늘 소개해드릴 콘텐츠는 Azure의 AI Custom Vision 기능입니다.
우선 Azure AI 를 활용하기 위해 Azure 평가판 첫 계정 가입 후, 카드 등록 시 200불의 크레디트와 다양한 무료 리소스들을 약 12개월 간 활용해 보실 수 있다는 점 참고해 주세요.
Custom Vision 이란?
Azure AI Custom Vision은 고유한 이미지 식별자 모델을 빌드, 배포 및 개선할 수 있는 이미지 인식 서비스입니다 . 이미지 식별자는 시각적 특성에 따라 이미지에 레이블을 적용합니다. 각 레이블은 분류 또는 개체를 나타냅니다. Custom Vision을 사용하면 고유한 레이블을 지정하고 사용자 지정 모델을 학습하여 검색할 수 있습니다.
가격정책
무료 계정 한도 내에서 2개의 프로젝트 월별 10,000개의 모델을 가지고 값을 예측이 가능하고 10,000개의 예측이 가능하고 5,000개의 이미지한도 내에서 업로드 또한 가능합니다. 학습 최대 시간은 1시간까지 무료입니다.
계정을 가입한 후, 먼저 커스텀 비전 리소스를 만들어 줘야 합니다.
위처럼 , 무료 계정의 Standard $0으로 설정해서 원하는 이름의 리소스를 만듭니다. 그 후 네트워크 설정에서는 모든 인터넷으로 사용하기 관련된 기본 체크를 한 후 검토 + 만들기를 진행합니다.
이런 형태로 리소스가 생성된 모습을 보실 수 있습니다. 리소스 그룹으로 이동을 눌러주세요.
리소스 개요에서는 두 개의 창이 뜨게 됩니다. 쉽게 말해서 하나는 학습할 수 있는 형태, 하나는 Prediction 즉 추론을 해볼 수 있는 리소스라고 생각하시면 됩니다. halland라는 리소스 안에서 다양하게 비용관리, 모니터링, 자동화 등 다양하게 사용을 할 수 있습니다.
minamhalland를 클릭을 하면 위처럼 리소스가 뜨게 되는데요, 옆 창에는 액세스를 제어할 수 있는(IAM 권한) 이 부분은 아마 AWS 해보신 분이라면 친숙하실 겁니다. 태그, 리소스관리(키 및 엔드포인트 등) 다양한 카테고리가 있습니다. 처음에 보면 어지러워서 복잡해 보이니 키 및 엔드포인트만 들어가고 " 아이거! GPT API처럼 쓰는 그런 거겠구나 " 하시면 됩니다.
2번째 개요에서 아래의 링크인 customvision.ai/project UI 홈페이지를 들어가시면 됩니다.(WEB 기반은 어렵지 않습니다)
환경변수설정
아까 리소스별 minamhalld, minamhalland 리소스관리에 들어가서 해당 아래에 환경변수 설정에 맞는 키 값을 입력해 줍니다.
key, endpoint 같은 경우는 키 및 엔드포인트에 있고, 속성에 리소스 id가 있습니다.
export VISION_TRAINING_KEY=your-training-key
export VISION_TRAINING_ENDPOINT=your-training-endpoint
export VISION_PREDICTION_KEY=your-prediction-key
export VISION_PREDICTION_ENDPOINT=your-prediction-endpoint
export VISION_PREDICTION_RESOURCE_ID=your-resource-id
키, 엔드포인트를 입력해 주고 클라이언트 인증을 실행해 줍니다.
credentials = ApiKeyCredentials(in_headers={"Training-key": training_key})
trainer = CustomVisionTrainingClient(ENDPOINT, credentials)
prediction_credentials = ApiKeyCredentials(in_headers={"Prediction-key": prediction_key})
predictor = CustomVisionPredictionClient(ENDPOINT, prediction_credentials)
Custom Vision 프로젝트 만들기
publish_iteration_name = "classifyModel"
credentials = ApiKeyCredentials(in_headers={"Training-key": training_key})
trainer = CustomVisionTrainingClient(ENDPOINT, credentials)
# Create a new project
print ("Creating project...")
project_name = uuid.uuid4()
project = trainer.create_project(project_name)
인스턴스가 생성되는 모습입니다.
프로젝트 태그 추가(라벨)
Custom Vision에서 class, label을 Tag라고 부릅니다.
# Make two tags in the new project
musk_tag = trainer.create_tag(project.id, "musk")
sam_tag = trainer.create_tag(project.id, "sam")
zuck_tag = trainer.create_tag(project.id,"zuck")
저는 3개의 이미지 분류를 위한 태그를 생성하였습니다.
이미지 업로드 및 태그 지정
라벨링을 코드로 하는 단계입니다. 미리 사용할 데이터를 폴더별로 구분해 주세요..!
독스의 포맷은 PNG이니 일단 PNG 포맷으로 따라줍니다.
저는 이번에 빅테크 CEO 얼굴 분류모델을 만들어보겠습니다. 얼굴 분류라 사진이 10장으로 될지는 잘 모르겠지만
base_image_location = "/Users/kdb/Desktop/KT_ds/azure/image/"
print("Adding images...")
image_list = []
for image_num in range(1, 11):
file_name = "musk_{}.jpeg".format(image_num)
with open(os.path.join (base_image_location, "musk", file_name), "rb") as image_contents:
image_list.append(ImageFileCreateEntry(name=file_name, contents=image_contents.read(), tag_ids=[musk_tag.id]))
for image_num in range(1, 11):
file_name = "sam_{}.jpeg".format(image_num)
with open(os.path.join (base_image_location, "sam", file_name), "rb") as image_contents:
image_list.append(ImageFileCreateEntry(name=file_name, contents=image_contents.read(), tag_ids=[sam_tag.id]))
for image_num in range(1, 11):
file_name = "zuck_{}.jpeg".format(image_num)
with open(os.path.join (base_image_location, "zuck", file_name), "rb") as image_contents:
image_list.append(ImageFileCreateEntry(name=file_name, contents=image_contents.read(), tag_ids=[zuck_tag.id]))
upload_result = trainer.create_images_from_files(project.id, ImageFileCreateBatch(images=image_list))
if not upload_result.is_batch_successful:
print("Image batch upload failed.")
for image in upload_result.images:
print("Image status: ", image.status)
exit(-1)
위와 같이 준비된 사진을 해당 프로젝트에 업로드시키는 코드입니다. 학습을 시켜보겠습니다. 해당 공식 독스에는 하이퍼파라미터 설정의 내용은 따로 없습니다. 데이터를 잘 조절해야 하는 부분 같은데요.. 이 부분은 제가 찾게 되면 다시 업로드하겠습니다.
print ("Training...")
iteration = trainer.train_project(project.id)
while (iteration.status != "Completed"):
iteration = trainer.get_iteration(project.id, iteration.id)
print ("Training status: " + iteration.status)
print ("Waiting 10 seconds...")
time.sleep(10)
10초 단위로 학습이 진행 중인지 출력이 될 것입니다. Completed 가 되면 루프는 멈추게 됩니다.
예측 Test
prediction_credentials = ApiKeyCredentials(in_headers={"Prediction-key": prediction_key})
predictor = CustomVisionPredictionClient(ENDPOINT, prediction_credentials)
with open(os.path.join (base_image_location, "/Users/kdb/Desktop/KT_ds/azure/image/test/sam_test.jpg"), "rb") as image_contents:
results = predictor.classify_image(
project.id, publish_iteration_name, image_contents.read())
# Display the results.
for prediction in results.predictions:
print("\t" + prediction.tag_name +
": {0:.2f}%".format(prediction.probability * 100))
다음은 Test 단계에서 예측을 해보겠습니다.
생각보다 너무 잘 맞춰서 놀라웠습니다. 단 사진 10장으로 분류를 해내다니?라는 생각이었습니다.
Custom Vision 홈페이지에서 만들기
위 홈페이지를 들어오면 아래처럼 구성이 되어있습니다.
Create new project를 누르고 Name / Description / Resource(minamhalland) / Classification types / Domains를 위처럼 설정을 해줍니다. 일반적으로 General으로 설정을 하였습니다. 아무래도 아래 Domains 각각 Downstream task에 더 효과적인 성능을 위한 도메인이라고 볼 수 있습니다.
저희가 만든 워크스페이스가 생성이 되었습니다. 그다음 이미지를 업로드해보겠습니다
위처럼 3개의 타깃이 설정이 되었고 이미지가 업로드가 되었습니다. 코드로 먼저 보셨으면 이게 얼마나 편한지 알 수 있습니다. 그리고 학습 버튼을 누르게 되면 Quick Training / Advanced Training 모드로 두 개가 있습니다.
따로 파라미터를 설정하는 부분은 없으나 시간 단위로 훈련을 설정해서 훈련이 완료되면 메일을 보내주는 듯합니다. 이때 과금이 소모가 될 수 있습니다. 이 부분은 자유롭게 선택하시면 됩니다. 훈련버튼을 누르면 위처럼 페이지가 나옵니다
이런 식으로 결과가 나오게 됩니다. Precision과 Recall 어느 정도 준수한 성능을 보여주고 있습니다.
아까와 같이 성능테스트를 해보니 더 성능이 안 좋아지고 오히려 머스크를 예측하고 있었습니다. 1시간 학습으로 설정을 해두었는데 오히려 Quick training 보다 성능이 안 좋았는데요 이유는 아무래도 데이터셋이 적기 때문에 계속 훈련을 시키면서 과소적합이 아니었나 생각이 듭니다. 이처럼 이렇게 쉽게 사진만 있다면 어렵지 않게 AI 모델을 만들고 사용을 할 수 있습니다.
다음 Detection이나 다른 AI Azure 기반의 설루션을 공부하면서 파헤쳐보는 포스팅을 하겠습니다. 감사합니다.