[수업 4째주 12일차] 머신러닝-3

김유민·2022년 4월 6일
0

대구 A.I. 스쿨

목록 보기
10/90

1. 학습내용

어제에 이어 오늘도 주피터 컴퓨터 프로그램을 사용해서 본인의 pc에 폴더를 만들고, 파이썬 파일을 만들어 마이크로소프트 사에서 개발한 머신러닝 API를 이용하는 방법을 배웠다.

무조건 ms APi를 이용하려면 패키지를 import함과 동시에 url와 토큰 키가 필요하다.
물론 url와 토큰 키는 ms Azure 클라우드에 계정이 있고, cognitive서비스를 클라우드에 계정을 생성해야 한다. 클라우드의 여러 서비스들을 '리소스'라고도 부르는데 그 수많은 리소스를 묶어 '리소스 그룹'이라 한다. 여기서 리소스 그룹을 계정을 만들듯이 생성하고, 그 그룹안에서 리소스를 만든다. 수많은 리소스들 중에 이미지를 이용해 만들 'computer vision'이란 리소스를 선택해서 만들면 되는데 이것도 유, 무료를 선택해야 한다. 무료도 있으나 한달에 5000번 정도 사용할 수 있을 정도로 제약이 있으므로 유료를 사용하는게 낫긴하다.
그렇게 절차가 끝나면 개인 계정으로 url과 토큰 키를 얻을 수 있는데 이걸 아래와 같이 넣으면 리소스를 이용할 수 있다.

analyze_url = vision_base_url + 'analyze'

그런다음 분석할 url을 임의의 이름으로 선언하고, 리소스 url +'analyze'를 입력한다.
그래야 저 analyze_url 만 쓰고 분석할 아무 이미지 url을 넣을 수 있기 때문이다.


그런다음 최대한 사람이랑 차가 섞인 이미지를 찾아서(분석할 대상의 이미지를 찾아서) 이미지 주소를 입력한다.

그런다음, 이미지 주소를 요구해 받아 온다는 선언문을 쓰고(response) 그 응답받은 주소를 이미지를 열수 있는 패키지 명령문을 써서 괄호로 감싼 뒤에, 또 그걸 괄호로 감싼뒤에 이미지를 오픈한다는 명령어를 쓴다. 매번 긴 명령문을 쓸수 없기 때문에 간단히 'image'라는 단어만 입력하면 해당 코드가 수행되게 선언한다.


선언을 옳게 했다면, 'image'라는 단어를 입력하면 바로 이미지가 출력된다.

이미지를 불러왔다면, 이제 이미지를 분석할 차례이다. azure 리소스를 불러오는 걸 변수를 선언해서 불러온다. 아래는 거의 메뉴얼 같은거라 변수명를 제외하고는 고정으로 저렇게 입력해야 한다.

headers에서 ''부분 뒤에는 키값을 주면 된다.
params는 파라메터를 설정하는것인데, 어떤 값을 가져올 거냐는 것으로 뒤에 가져올 값들을 적어주면 된다. 우리는 카테고리와 ,description, 그리고 색을 가져 오기로 했다.
data에는 가져온 이미지 url를 쓰면 된다.

이제 가져올 정보들을 미리 셋팅했으니, 이제 호출만 하면 된다.
여기서 'response'라고 변수를 선언한다음, post방식으로 요청한다고 적고, 요청에 필요한 주소를 가져와야 한다. 그건 맨 위에 'analyze_url'이라고 선언한게 있고, 그 주소는 리소스 주소이므로 이걸 가져 오면 된다. 그다음은 헤더부분과 파라미터와 데이터를 뭘 가져 올 건지 위에 선언한 변수를 이용해 가져 온다.

response = requests.post(analyze_url, headers=headers, params=params,
                        json=data)

밑에 아무런 에러가 뜨지 않으면 실행이 된거다. 실행 결과를 가져오기 위해서는 먼저 json에 대해 알아야 한다.

저 response된 것의 결과를 json방식으로 호출해 보여주는 변수를 입력해 제대로 되었는지 확인해 본다.

그럼 리소스가 분석한 결과가 아래와 같이 뜨면 성공한 것이다.


여러 계층별로 나눠서 출력되는 것을 볼수 있다. []<-안에 여러 배열로 포함되어 있다는 의미.
그런데 저 중에 만약 caption한줄만 표시하고 싶다면 captions의 순서중 첫번째인 0을 입력해 출력한다는 명령어를 입력한다.

analysis['description']['captions'][0]['text']


이렇게 출력된다.

다음은 어떤 사진의 찍힌 요소들이 뭔지 분석해주는 Object Detection을 해보기로 했다.
Object Detection은 특정한 요소들이 어디에 있는지 찾아준다.
예를 들어 이런 것이다.

리소스에서 쓸 Object Detection에 해당하는 변수를 선언한다.
그런다음 분석할 위와 다른 이미지의 url를 쓰고, 마찬가지고 이미지를 읽어올 이미지 패키지 변수를 선언한 뒤에 제대로 명령이 출력이되는지 변수를 입력해 확인한다.


그런다음 header와 data를 가져온다.(여기선 파라메터 요청없이 두가지만 요청한다.)

아까처럼 response 해서 변수를 선언하고, (가져올 url와 해더와 데이터)결과값을 json으로 불러올 변수도 선언해서 변수를 입력해 출력한다.

만약 저 결과값을 토대로 해당되는 사물에 박스 선이 그려지고, 글자가 쓰여지게 만들려면 아래와 같이 import해서 또 선을 긋고 글자를 사진위에 표시하는 패키지를 선언한다.

그 전에 아까 위의 결과 값중에 'ractangle'이란 값을 주목할 필요가 있다.
ractangle은 대상이 있으면 그 대상을 중앙에서 부터 사각형의 모양대로 인지한 값을 말한다.
여기서 우리가 사진위에 사각형 선으로 대상을 인지했다 표시하려면 먼저 두가지의 점만 있으면 되는데, 한가지 점은 xy값이 교차하는값이 그 하나고, 나머지는 그 x축에서 가로 길이를 합산하고 y축에서 세로길이인 높이를 합산해 나오는 좌표값이다.
저 값을 가져오려면 object값을 가져와야 한다.

objects = detectionResult['objects']

for obj in objects:
    #print(obj)

반복문이기 때문에 'object'에 있는 값이 'obj'로 계속 반복해서 들어가게 된다.

print해보면 rectangle값을 가져올 수 있는걸 알수 있다.
그럼 이제 좌표 값을 가져와야 한다.

위의 사진처럼 x,y,w,h값을 'rectangle'안에 있는 값을 가져와 변수 선언을 했더니 에러가 났다.
왜그러냐 하면, 좌표값은 object안의 rectangle안의 좌표값을 가져와야 한다. 즉 소속이 두번정도 더 들어가야 한단 말이다.
'rectangle'전체 값 하나만 가져왔기 때문에 오류가 난것이다.
그래서 위의 반복문을 수정하고 한줄을 더 추가해야 한다.

object안에 있는 'rectangle'값을 가져오는 변수를 선언하고 함수 값을 가져와야 한다.
그런다음 저 좌표를 불러왔으니, 저 좌표대로 사각형을 그리게 해야한다.

draw = ImageDraw.Draw(img) #이미지 자체를 그리기 모드로 들어와서 대기하라는 명령.

이미지를 그리기 모드로 불러왔으면, 이제 사각형을 좌표대로 그리고 라인의 컬러를 정해준다.

    #사각형을 그리는 코드
    draw.rectangle(((x, y), (x + w, y + h)), outline='red')

그럼 사각형 선이 가느다랗게 표시가 된다.

글자를 박스 상단에 입력하고 싶다면 아래와 같이 상단에 해당하는 x,y값을 넣고 objectName을 적으면 된다.

    #글자를 입력하는 코드
    objectName = obj['object']
    
    draw.text((x, y), objectName, fill='red') #이미지를 쓸수 있게끔 오픈된 상태 (draw)


그리고 나서 img를 입력하면 저렇게 출력되는 것을 알수 있다.

2. 어려웠던 점 및 해결 방안

얼굴인식 기능이 있는 Face API 도 해보았다.
여기서도 위와 값이 토큰값입력하고, url주소 불러오고.. 하는데 까지는 같았다.
두가지가 수업중에 놓친 부분이였는데, 하나는 파라미터 부분이였고, 하나는 위와 마찬가지로 사각형선을 그려줄때 였다.
먼저 파라미터부분이 딱히 어렵다거나 그런건 아니였는데, 파라미터가 뭔지 잘 모르겠다는게 문제였다.

headers = {'Ocp-Apim-Subscription-key': subscription_key}
params = {
    'returnFaceID': 'true',
    'returnFaceAttributes': 'age,gender,emotion'
}

아무래도 고유값 중 무슨 값을 추출할건지 선언하는 거 같은데, 동영상으론 잘 모르겠어서 구글링을 해 보았다.

참고자료: https://akdl911215.tistory.com/228

컴퓨터 프로그래밍에서 매개변수(parameter 파라미터)란 변수의 특별한 한 종류로서, 함수 등과 같은 서브루틴의 인풋으로 제공되는 여러 데이터 중 하나를 가리키기 위해 사용된다. 여기서 서브루틴의 인풋으로 제공되는 여러 데이터들을 전달인자(argument) 라고 부릅니다. 보통 매개변수의 목록은 서브루틴의 정의 부분에 포함되며, 매번 서브루틴이 호출될 때 마다 해당 호출에서 사용된 전달인자들을 각각에 해당하는 매개변수에 대입시켜 줍니다.

매개변수가 어떻게 정의되는지와 전달인자가 서브루틴의 매개변수에 어떻게 전달되는지에 대한 구문은 각각의 프로그래밍 언어에 따라 정의되지만, 이것이 각각의 컴퓨터 시스템 내부에서 실제로 어떻게 구현되는지에 대해서는 해당 시스템의 호출규약에 달려있습니다.

이렇게 되어 있긴했는데 잘 몰라서 보니 밑의 그림으로 약간 이해 할 수 있었다.

그리고 두번째는 사각형을 그릴때 선언하는 함수값을 추출하는건데 앞과 좀 달라서 좀 어려웠다.
왜 xy로 하지 않는지 동영상으로 강의를 다시 보니 알수 있었는데,
여기서는 좌표가 나오는게 아니고 그러니까 x,y값이 나오는게 아닌 사진 상단과 왼쪽으로부터 얼마나 떨어져 있는지에 대해 결과값이 나왔다. 그래서 그에 맞춰서 바꾸는거였다.

for face in faces:
    
    rect = face['faceRectangle']
    left = rect['left']
    top = rect['top']
    width = rect['width']
    height = rect['height']
    
    draw.rectangle(((left, top),(left+width,top+height)), outline='red')

3. 학습소감

어제꺼 까지 복습을 하고, 다시 오늘꺼 까지 동영상을 다시 봤다.
오탈자 때문에 해메는건 조금 줄어들었는데, 여전히 알수 없는 개념들이 튀어나올때 마다 설명만으론 이해하기 힘들었다.
구글링을 하니까 어렴풋이 이해하겠는데, 그래도 아직은 좀더 실습을 해봐야 알 수 있을거 같다는 생각이 들었다.
카메라로 들어가는 정보를 컴퓨터가 자동으로 분석해 내놓는 것을 그저 코드로 불러와서 보여줄수 있다는 점 자체는 신비로워서 이쪽 분야도 조금 흥미가 생기기 시작했다.

profile
친숙한 개발자가 되고픈 사람

0개의 댓글