상세 컨텐츠

본문 제목

AI 소프트웨어 API 사용하여 이미지 인식 기술 구현하기1

AI-VR-AR

by 김일국 2024. 5. 20. 18:40

본문

### 목적: 웹 페이지에서 업로드한 사진을 분석하여 사진속 사람의 특징(머리색, 의복색 시각화 하기(아래)

### 실습 소스는 이전 포스트[파이썬으로 웹 스크레핑과 반응형 대시보드 앱 만들기(강의용)] https://kimilguk.tistory.com/872 의 소스에 이어서 페이지를 추가해 작업 하였다.

### 실습에 사용한 결과 : 위 기능과 비슷하게 구현하고 있다. 현재는 2개 이미지만 가져와서 검사해 보았다.(아래)

- 사용한 이미지는 픽사베이의 무료 이미지이다. : https://pixabay.com/ko/photos/%EC%83%81%EC%9C%84-%EC%97%B0%EC%84%B8%EA%B0%80-%EB%93%9C%EC%8B%A0-%EC%82%AC%EB%9E%8C%EB%93%A4-3336451/

위 오른쪽화면의 사진의 결과를 보면 알겠으나, 3명만 검출이 되었다. AI API 성능이 아직은 만족할 수준은 아니다.(위)

- koyeb 플랫폼에서 실행 URL : https://interior-sondra-kimilguk-app-99ae6359.koyeb.app/

- VS Code 소스에서 반환받아서 출력하는 @콜백+함수 부분의 Output 과 리턴값이 화면처리의 핵심이다.(아래)

위 update_table콜백함수의 매개변수는 @callback내부의 Input의 2번째 인자 value와 n_clicks와 매칭되고, data인자는 State 부분의 2번째 인자이다.

- 위에서 작업소스는 다음 깃 허브에 있다. : https://github.com/kimilguk/python-dash/tree/koyeb

### 국가공공기관에서 운영하는 AI 허브 사이트 사용

- 아래 AI 허브 사이트는 굳이 회원 가입할 필요가 없다. 이후 AI API-DATA 사이트에서 별도로 이메일과 암호를 등록해야 API S/W를 이용할 수 있다.

- 다음 AI HUB 사이트 상단 메뉴의 AI 개발지원 메뉴내 AI S/W 지원 메뉴 클릭: https://www.aihub.or.kr/ (아래)

- 위 링크로 따라 들어간 AI API-DATA 사이트에서 제공하는 API 키 발급 : https://aiopen.etri.re.kr/ (아래)

- 위 키 발급시 별도의 이메일과 암호를 등록한다. 아래 사이트는 별도의 로그인이 없이 등록한 이메일과 암호로 키를 확인가능하다. https://aiopen.etri.re.kr/keyCreation (AI API키 발급 신청 후 키 확인 아래)

- 위 링크로 따라 들어간 AI API-DATA 사이트에서 제공하는 API 개발가이드 사용 : https://aiopen.etri.re.kr/guide/pd (아래)

- 구현 예제 샘플 중  API1 사람속성 검출 Python 소스코드 (아래)

- AI API로 가져온 결과를 판다스 데이터프레임을 사용하는 방식과 고전적인 방식으로 데이터를 파싱하는 방식 2가지를 사용해 보았다.(아래)

#-*- coding:utf-8 -*-
import urllib3
import json
import base64

# API1 사람속성 검출URL(아래)
openApiURL = "http://aiopen.etri.re.kr:8000/HumanParsing"
# API2 객체검출URL(아래)
# openApiURL = "http://aiopen.etri.re.kr:8000/ObjectDetect"
accessKey = "여기에 api key 넣으시구요"
imageFilePath = "여기에 파일경로 넣으시구요.jpg"
type = "여기에 확장자 넣으시면 됩니다. "
#위 입력예시) ---------
# imageFilePath = "./boardwalk.jpg"
# type = "jpg"
#-------------

file = open(imageFilePath, "rb")
imageContents = base64.b64encode(file.read()).decode("utf8")
file.close()

requestJson = {
    "argument": {
        "type": type,
        "file": imageContents
    }
}

http = urllib3.PoolManager()
response = http.request(
    "POST",
    openApiURL,
    headers={"Content-Type": "application/json; charset=UTF-8", "Authorization":accessKey},
    body=json.dumps(requestJson)
)

print("[responseCode] " + str(response.status))
print("[responBody]")
print(response.data) # print를 통해 결과가 json 형태로 나오는걸 보실수 있습니다.
#여기까지가 공통 샘플 소스이다. 이후 아래 소스는 API1, API2 기능별로 선택해서 사용-

# API1. 여기서부터는 샘플 소스 이후 사람속성 검출 API 시각화 소스
# 참고, 자바스크립트의 json과 파이썬의 딕셔너리는 같은 데이터 형이다.(아래)
data = json.loads(response.data) # string 형태의 json이라서 json.loads를 통해 읽어서 딕셔너리로 반환한다.
data_list = data.get("return_object") #딕셔너리에서 특정 값을 가져와서 딕셔너리로 반환한다.
print(data_list)
print('사진에 있는 사람의 수와 복장 특징 목록')

# 데이터프레임 사용에 필요한 판다스 모듈 임포트
import pandas as pd
#####################################################################
# dsah_table 모듈사용 시(아래) 
# 데이터 프레임 생성
df_person = pd.DataFrame(data_list) # 딕셔너리 데이터를 판다스 DataFrame으로 변환
df_person = df_person.transpose() # 딕셔너리 데이터의 행열 변환
# print(df_person.columns) # 컬럼출력
df_person = df_person[['hair color','coat color','pants color']]
df_person.columns = ['머리색상', '상의색상', '바지색상'] # 열 이름 변경
df_person = df_person.reset_index().rename(columns={'index':'사람객체명'}) # 인덱스 명 출력
print(df_person.head()) # 많은 데이터 중 상위 몇개만 표시
#######################################################################

#######################################################################
# 데이터프레임.to_html()을 사용하여 웹용으로 변경 사용 시(아래)
person_list = [] # 개체(json=dictionary) 배열변수 추가
for i in data_list: # 하나씩 가져다가 리스트로 출력하는 코드입니다.
    person_list.extend([{'person':i,'hair color':data_list.get(i).get('hair color'),'coat color':data_list.get(i).get('coat color'),'pants color':data_list.get(i).get('pants color')}])
    #print(i,' = hair color:',data_list.get(i).get('hair color'),' coat color:',data_list.get(i).get('coat color'),' pants color:',data_list.get(i).get('pants color'))
# print(person_list)
df_person_html = pd.DataFrame(person_list) # 딕셔너리 데이터를 판다스 DataFrame으로 변환
# print(df_person.columns)
df_person_html.columns = ['사람객체명', '머리색상', '상의색상', '바지색상'] # 열 이름 변경
print(df_person_html.head()) # 많은 데이터 중 상위 몇개만 표시

 

- 위 소스에서 무료 이미지로 사용할 사진을 assets폴더에 저장 시켜 놓았다.(아래 VS Code 왼쪽의 탐색기에서 확인)

imageFilePath = "senior-3336451_640.jpg"

- 위  터미널에서 API1 사람속성 검출 AI를 사용한 결과(아래 person_1, person_2 처럼 2명이 나온다.)

- 구현 예제 API 명세서(아래)

 

Ps. 기술참조 : https://m.blog.naver.com/doksg/222059041080

 

관련글 더보기

댓글 영역