[Azure] Python으로 Custom Vision Service 두드리기

입문

Custom Vision Service는 Microsoft Azure 제품 중 하나로 이미지 인식 서비스를 제공합니다.

이러한 느낌은 이미지의 종류를 나타내는 라벨과 이와 관련된 이미지를 몇 장 업로드하여 학습시키고, 어떤 이미지가 어느 라벨과 얼마나 가까운지 알려주는 서비스이다.

위의 예에서 바이올린, 오보에, 관현악을 배우는 토대에서 구도가 조금 다른 바이올린 사진을 올린 결과 99.9%의 확률이 바이올린 사진이었다.
이번에는 Python에서 이 서비스의 API를 실행하고 싶습니다.

전체 프로세스


이 서비스를 이용하는 대체적인 절차로
  • 학습용 이미지에 태그를 붙여 로그인
  • 학습 수행
  • 판별할 이미지 업로드 결과
  • 이런 아주 간단한 것은 나처럼 기계 학습과 영상 처리를 전혀 모르는 사람이라도 쉽게 이동할 수 있다.
    그 중에서 브라우저에서 1, 2, 3을 실행하는 방법에 대해 아래의 보도는 매우 참고 가치가 있으니 저쪽을 참조하십시오.
    사용자 정의 Vision Service-Qiita 사용 시도
    이 글은 파이썬에서 어떻게 세 부분을 집행하는지 소개한다.

    본론


    말은 그렇지만 기본적으로 참고 자료 작성 절차에 따라 집행될 뿐이다.
    Overview - Custom Vision Service
    이 페이지의 왼쪽 메뉴 "참조"> "사용자 정의 Vision Prediction API 참조"를 열면 테스트 콘솔과 각 프로그래밍 언어의 예시 코드가 포함된 페이지와 API 규범이 표시됩니다.
    이번에는 파이썬을 선택하겠습니다.

    표시된 코드의 윗부분은 2입니다.X의 코드, 하반부는 3.x의 코드.
    자신의 환경에 맞는 것을 복사하여python 파일을 만듭니다.(이번엔 3.x로 진행)
    customvisionapi.py
    import io, http.client, urllib.request, urllib.parse, urllib.error, base64
    
    headers = {
        # Request headers
        'Content-Type': 'multipart/form-data',
        'Prediction-key': 'xxxxxxxxxxxxxxxxxxxxxxxx',
    }
    
    params = urllib.parse.urlencode({
        # Request parameters
        'iterationId': 'xxxxxxxxxxxxxxxxxxxxxxxx',
    })
    
    try:
        conn = http.client.HTTPSConnection('southcentralus.api.cognitive.microsoft.com')
        f = open("violin_a.jpg", "rb", buffering=0)
        conn.request("POST", "/customvision/v1.0/Prediction/xxxxxxxxxxxxxxxxxxxxxxxx/image?%s" % params, f.readall(), headers)
        response = conn.getresponse()
        data = response.read()
        print(data)
        conn.close()
    except Exception as e:
        # print("[Errno {0}] {1}".format(e.errno, e.strerror))
        print(e)
    
    여기에서 xxxxxxxxxxxxxxxxxxxxxxxx 에 기재된 각 매개 변수는 다음과 같이 확인할 수 있습니다.

  • Prediction-key
  • 사용자 정의 Vision Service Console 설정 화면의 "Prediction Key:"표시줄

  • iterationId
  • 콘솔의 "PERFORMANCE"화면에서 왼쪽의 "Prediction URL"을 누르면 표시되는 URL의 끝, "iterationId"파라미터 뒤에 있는 문자열

  • ProjectID
  • 콘솔 화면 자체의 URL의 "projects/"뒷부분
  • 더 좋은 조사 방법이 있을지도 모르지만, 상술한 것은 단번에 발견한 것이다.
    각각의 값을 설정하면 비교용 파일을 Python 파일과 같은 디렉터리에 놓고 실행합니다.
    $ python customvisionapi.py
    b'{"Id":"bxxxxxxxxxxxxxxxxxxxxxxxx","Project":"xxxxxxxxxxxxxxxxxxxxxxxx","Iteration":"xxxxxxxxxxxxxxxxxxxxxxxx","Created":"2017-06-06T13:59:23.5590916Z","Predictions":[{"TagId":"8fe34be4-eeff-495b-a83f-2a74bd25f035","Tag":"instrument","Probability":0.9999934},{"TagId":"bd2281d4-e4ff-48f1-a9ab-d525277479f9","Tag":"violin","Probability":0.9987756},{"TagId":"f33cdfdd-7eb2-47a2-8a30-2162a8f9e7fa","Tag":"oboe","Probability":3.22442238E-22},{"TagId":"b1490919-c0ab-4771-9564-13752bcfb96c","Tag":"tuba","Probability":7.720858E-24}]}'
    
    결과가 나왔습니다.
    이대로 가면 이해하기 어렵지만 라벨마다 Probability 데이터를 반환하고, Violin 라벨의 Probability0.9999934 높은 수치다.
    이렇게 하면 프로그램을 통해 이미지 식별을 할 수 있다!
    IoT 장치가 내장되어 Django 등 웹 응용 프로그램과 결합하면 꿈이 커진다.

    Bad Request Image Format 나와!


    그렇다면 위의 절차는 이미 끝났습니다. 제가 이것을 시도할 때 BadRequestImageFormat 결과를 얻지 못하는 현상이 생겨서 1, 2시간 정도 고민했기 때문에 해결 방법을 적어 두었습니다(원인은 잘 모르겠습니다,,,,)
    $ python customvisionapi.py
    b'{"Code":"BadRequestImageFormat","Message":""}'
    
    그나저나 구글 선생님께 직접 물어봐도 아무 말도 안 돼요.

    따라서 다음은 해결 방법이다.
    아까의 예시 코드였지만 실제로는 문서에 이미지 파일을 요청 주체의 부분에 붙이는 코드{body}만 써서 생략했습니다.
    conn.request("POST", "/customvision/v1.0/Prediction/{projectId}/image?%s" % params, "{body}", headers)
    
    처음에 저희가 이 부분을
    imagefile = open("./violin_a.jpg", "rb")
    conn.request("POST", "/customvision/v1.0/Prediction/{projectId}/image?%s" % params, imagefile, headers)
    
    이렇게 open() 방법으로 해봤는데 도저히 안 돼요.
    따라서 io 모듈 참조를 보면서 실험을 반복하는 과정에서 다음과 같은 내용을 주의함으로써 오류 없이 API를 두드릴 수 있다.
  • open()의 세 번째 매개 변수에 추가buffering=0
  • 파일 대상의 readall() 방법의 반환값을 요청 주체에 전달
  • 이미지 사용png이 아니라 이미지 사용(!)
  • (2017.06.25 수정)
    PNG 이미지에서 제대로 동작하지 않은 것은 동작 확인에 사용되는 PNG 파일 자체의 문제입니다.
    같은 원본 코드를 확인했기 때문에 PNG 이미지도 문제없이 결과를 얻을 수 있는 일, 수정.
    (/수정)
    어떤 뜻인지 모르지만 어쨌든 이렇게 움직였으니 일단 기재해 두자.
    (또한 Python2.x의 경우 세 번째 jpg를 제외하고는 모두 이동하고 있습니다. 무슨 뜻입니까?)
    결과적으로 실행된 프로그램은 본고에 기재된 것과 같다.

    총결산


    여기서 마치겠습니다.
    Azure의 각 서비스는 아직 정보가 적지만 활용할 수 있는 API를 많이 제공했다는 인상을 준다.2만 엔의 공짜 액자도 있기 때문에 앞으로도 다양한 방법을 시도해 보고 싶다.

    좋은 웹페이지 즐겨찾기