Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- 함수
- AIFFEL
- 아이펠
- 카카오
- 스크랩
- 사이킷런
- 파이썬
- 추천시스템
- AI
- 제로베이스 데이터사이언스
- 데이터사이언스 스쿨
- numpy
- 후기
- 데이터분석
- 재귀함수
- NLP
- 코딩도장
- 딥러닝
- 제어문
- Set
- Python
- 딕셔너리
- 속성
- 자연어처리
- 클래스
- TensorFlow
- 머신러닝
- 파이썬코딩도장
- 데이터사이언티스트
- 기사
Archives
- Today
- Total
뮤트 개발일지
AIFFEL 아이펠 21일차 본문
인물사진을 만들어보자
셸로우 포커스 만들기
사진 준비하기
import os
# 웹에서 데이터를 다운로드할 때 사용
import urllib
# OpenCV라이브러리, 이미지를 처리할 때 사용
import cv2
import numpy as np
# 시맨틱 세그멘테이션을 사용할 수 있도록 지원하는 라이브러리
from pixellib.semantic import semantic_segmentation
from matplotlib import pyplot as plt
# 이미지 불러오기
img_path = os.getenv('HOME')+'/aiffel/human_segmentation/images/samsuni.jpeg'
img_orig = cv2.imread(img_path)
print(img_orig.shape)
plt.imshow(cv2.cvtColor(img_orig, cv2.COLOR_BGR2RGB))
plt.show()
이미지 추출하기
세그멘테이션: 이미지에서 픽셀 단위로 관심 객체를 추출하는 방법
시맨틱 세그멘테이션: 세그멘테이션 중 우리가 인식하는 세계처럼 물리적 의미 단위로 인식하는 세그멘테이션. 이미지에서 픽셀을 사람, 자동차, 비행기 등의 물리적 단위로 분류하는 방법
인스턴스 세그멘테이션: 시맨틱 세그멘테이션은 '사람'이라는 추상적인 정보를 이미지에서 추출해 내는 방법. 사람이 누구인지 관계없이 같은 라벨로 표현된다. 인스턴스 세그멘테이션은 사람 개개인별로 다른 라벨을 가지게 한다.
DeepLab 모델 사용
DeepLab에 대한 설명
모델 불러오기: pixeLib에서 제공
# 저장할 파일 이름을 결정
model_dir = os.getenv('HOME')+'/aiffel/human_segmentation/models'
model_file = os.path.join(model_dir, 'deeplabv3_xception_tf_dim_ordering_tf_kernels.h5')
# PixelLib가 제공하는 모델의 url
model_url = 'https://github.com/ayoolaolafenwa/PixelLib/releases/download/1.1/deeplabv3_xception_tf_dim_ordering_tf_kernels.h5'
# 다운로드 시작
urllib.request.urlretrieve(model_url, model_file)
# 모델 생성
model = semantic_segmentation()
model.load_pascalvoc_model(model_file)
# 모델에 이미지 불러오기
segvalues, output = model.segmentAsPascalvoc(img_path)
segmentAsPascalvoc(): pascal voc 데이터로 학습된 모델을 이용한다.
* 어떤 데이터를 학습시켰는지 확인하기!
# pascal voc 데이터의 라벨 종류
LABEL_NAMES = [
'background', 'aeroplane', 'bicycle', 'bird', 'boat', 'bottle', 'bus',
'car', 'cat', 'chair', 'cow', 'diningtable', 'dog', 'horse', 'motorbike',
'person', 'pottedplant', 'sheep', 'sofa', 'train', 'tv'
]
len(LABEL_NAMES)
>>> 21
# 모델에서 나온 출력값 확인
plt.imshow(output)
plt.show()
for class_id in segvalues['class_ids']:
print(LABEL_NAMES[class_id])
>>>
background
dog
output 이미지는 BGR 순서로 배치되어 있다. colormap은 RGB 순서이기 때문에 배치 순서를 바꿔야한다.
# 'dog' 색상 확인
colormap[12]
# 순서 바꾸기
seg_color = (128, 0, 64)
# seg_color 로만 이루어진 마스크 만들기
# output의 픽셀 별로 색상이 seg_color와 같다면 1(True), 다르다면 0(False)이 된다.
seg_map = np.all(output==seg_color, axis=-1)
print(seg_map.shape)
plt.imshow(seg_map, cmap='gray')
plt.show()
# 원래 이미지랑 겹쳐보기
img_show = img_orig.copy()
# True과 False인 값을 각각 255과 0으로 바꿔준다
img_mask = seg_map.astype(np.uint8) * 255
# 255와 0을 적당한 색상으로 바꾼다
color_mask = cv2.applyColorMap(img_mask, cv2.COLORMAP_JET)
# 원본 이미지와 마스트를 적당히 합친다
# 0.6과 0.4는 두 이미지를 섞는 비율
img_show = cv2.addWeighted(img_show, 0.6, color_mask, 0.4, 0.0)
plt.imshow(cv2.cvtColor(img_show, cv2.COLOR_BGR2RGB))
plt.show()
배경 흐리게 하기
# (50,50)은 blurring kernel size
img_orig_blur = cv2.blur(img_orig, (50,50))
plt.imshow(cv2.cvtColor(img_orig_blur, cv2.COLOR_BGR2RGB))
plt.show()
# 배경만 추출하기
img_mask_color = cv2.cvtColor(img_mask, cv2.COLOR_GRAY2BGR)
img_bg_mask = cv2.bitwise_not(img_mask_color)
img_bg_blur = cv2.bitwise_and(img_orig_blur, img_bg_mask)
plt.imshow(cv2.cvtColor(img_bg_blur, cv2.COLOR_BGR2RGB))
plt.show()
배경과 물체 합치기
img_concat = np.where(img_mask_color==255, img_orig, img_bg_blur)
plt.imshow(cv2.cvtColor(img_concat, cv2.COLOR_BGR2RGB))
plt.show()
https://github.com/pjk7565/AIFFEL/blob/main/Exploration07/segmentation-Copy1.ipynb
'AIFFEL' 카테고리의 다른 글
AIFFEL 아이펠 23일차 (0) | 2022.02.03 |
---|---|
AIFFEL 아이펠 22일차 (0) | 2022.01.26 |
AIFFEL 아이펠 20일차 (0) | 2022.01.25 |
AIFFEL 아이펠 19일차 (0) | 2022.01.25 |
AIFFEL 아이펠 18일차 (0) | 2022.01.25 |