우선, 연예인 얼굴 이미지가 필요하니 네이버에서 연예인들 이미지를 다운로드하도록 한다.
일일이 받아도 되나, 우리는 이미 파이썬을 다룰 줄 알고, 크롤링을 할 줄 알기 때문에, 코드로 구현해보자.
내가 만든 이미지 다운 크롤링은 다음과 같다.
케라스 수업이 이기에, 코드를 복사 붙여 넣기 해서 사용하기를 추천한다.
from urllib.request import urlopen
from bs4 import BeautifulSoup as bs
from urllib.parse import quote_plus
import os
naver_img_url = "https://search.naver.com/search.naver?where=image&sm=tab_jum&query="
actors = ["강동원", "원빈", "장동건", "마동석"]
for actor in actors :
print(f'{actor} 다운로드 시작')
url = naver_img_url + quote_plus(actor)
html = urlopen(url)
soup = bs(html, "html.parser")
img_all = soup.find_all(class_="_img")
for i in range(len(img_all)):
imgUrl = img_all[i]["data-source"]
save_img_dir = f"./img/{actor}"
with urlopen(imgUrl) as f:
try:
if not os.path.exists(save_img_dir) :
os.makedirs(save_img_dir)
except OSError as e:
print(e)
with open(f"{save_img_dir}/{actor}_{i}.jpg","wb") as h:
img = f.read()
h.write(img)
print(actor, "다운로드 완료")
actors 변수에 내가 생각나는 연예인들의 이름을 나열했다. 샘플을 만들 것이기 때문에 일부만 사용했다.
여러분들이 코드를 구현한다면, 여러분들이 좋아하는 연예인 이름을 나열하면 된다.
이미지 다운로드는, 현재 돌아가는 파이썬 폴더 경로에, 새로운 img 폴더를 만들고, 연예인 폴더를 만들고, 연예인명_번호.jpg로 저장시켜두게 하였다. 맘에 안 드시는 분들은 바꾸셔도 됩니다.
또한, 네이버 image에서 이미지에서 한 화면에서 50개까지밖에 출력되지 않기 때문에, 더 많은 사진을 갖고 싶으신 분들은, 셀리늄 스크롤바 내리기를 추가하시면 됩니다. 하지만 저는 30~50개면 충분하고 차라리 연예인들 이름을 더 추가하는 게 맞다고 생각이 들어서, 생략!
(가끔, 동명이인의 이름을 가진 사람이 다운로드하여지기도 하는데, 알아서 삭제하시면 됩니다.)
다운 완료된 강동원 님의 이미지를 확인해보자.
진짜 잘생기셨다.
만약 우리는 이 사진을 그대로 사용하게 된다면, 이미지 학습 시 강동원 님의 옷과 배경까지도 학습을 하게 될 것이기 때문에...
우리는 강동원 님의 얼굴만을 따올 것이다.
그렇다. 우리는 OpenCv를 다뤄봤다. OpenCV를 통해서 강동원 님의 얼굴만을 따오겠다.
쉽게 얼굴을 검출하기 위해, 하나의 xml 파일이 필요한데.. 바로..
haarcascade_frontalface_alt.xml
의 xml 파일이 필요하다. opencv에서 제공해주는 공식 xml 문서이며... 밑에 경로에서 직접 받으셔도 되나,
더 밑에 보시면, 바로 다운로드가 가능하게 파일을 올려두었습니다!
github.com/opencv/opencv/tree/master/data/haarcascades
파일을 다운로드하셨으면, 현재 프로그램하는 경로에 붙여 넣으시길 바랍니다.
그럼 이렇게 모듈을 불러주시고, face_cascade 변수에 우리가 받은 파일을 불러옵니다!
import numpy as np
import cv2
import os
face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_alt.xml")
이전에, 저장받은 파일 경로에 한글을 사용하였기 때문에, imread 함수를 사용하려다 보니
error: (-215:Assertion failed) VScn::contains(scn) && VDcn::contains(dcn) && VDepth::contains(depth) in function 'cv::CvtHelper<struct cv::Set<3,4,-1>,struct cv::Set<1,-1,-1>,struct cv::Set<0,2,5>,2>::CvtHelper'
다음과 같은 에러가 계속 났습니다.
(물론 모든 파일명을, 영어로 수정해서 사용하면 되나, 위에 코드 수정하기 귀찮아서, imread 함수에서 한글을 지원하는 새로운 imread function을 만들었다.)
def imread_korean(path):
with open(path, "rb") as fp:
bytes = bytearray(fp.read())
numpy_array = np.asarray(bytes, dtype=np.uint8)
return cv2.imdecode(numpy_array, cv2.IMREAD_UNCHANGED)
이렇게 함수를 만들었으니, cv2.imread 함수 대신, imread_korean 함수를 사용할 것이다.
def save_face(actor) :
try :
file_count = len([name for name in os.listdir(f"./img/{actor}/") if os.path.isfile(os.path.join(f"./img/{actor}/", name))])
for i in range(file_count) :
save_img_dir = f"./img/{actor}/{actor}_{i}.jpg"
new_save_img_dir = f"./img/{actor}_face"
img = imread_korean(f"{save_img_dir}")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3,5)
for (x,y,w,h) in faces:
actor_face = img[y:y+h, x:x+w]
try:
if not os.path.exists(new_save_img_dir) :
os.makedirs(new_save_img_dir)
except OSError as e:
print(e)
_, im_write_korean = cv2.imencode(".jpg", actor_face)
im_write_korean.tofile(f"{new_save_img_dir}/{actor}_{i}.jpg")
except :
pass
그럼, 다음과 같이 코드를 완성할 수 있을 것이고,
actors = ["강동원", "원빈", "장동건", "마동석"]
for actor in actors :
save_face(actor)
구현된 코드를 실행시키면....
얼굴만 따온 파일은, 원본 파일과 다르게 정리를 해주기 위해서, 연예인_face라는 새로운 폴더에 저장하게 해 두었다.
이렇게 해서 저장된 얼굴을 확인해 보자!
음... 얼굴만 잘 따온 것 같다.
(가끔 모든 이미지가 잘 검출하지 않을 수도 있기 때문에, 확인 작업이 필요합니다. 하지만 저는 믿고 그냥 갑니다! 어차피 코드를 보면 아시겠지만, 얼굴 검출이 안되어지는 경우는 새로운 경로에 저장이 안 되기 때문... )
우리는 인제 데이터 셋이 준비되었으니,
남은 과정을 설명드리도록 하겠습니다.
1. 변경된 사이즈 하나로 통일하기.
2. 클래스 지정하기.
3. 훈련/학습용 데이터 선별하기.
4. RNN 코드 만들기 - 참고하기 (CIFAR-10)
아마 CIFAR에 관련된 코드는 여러분들 책에도 나와 있고, 인터넷에서 널려 있을 것입니다.
비행기, 자동차, 새, 고양이..... 클래스를 우리의 연예인 이름으로 바꿔주면 되고...
사진들은 우리가 변환하였던 사진들로 대처하면 됩니다.
지금 포스팅에 첨부하면 아마 넓은 스크롤바가 엄청 조금 해질 것입니다.
하지만... 이런 귀찮은 작업들을 더 빠르고 간편하게 해주는 사이트가 있습니다.
teachablemachine.withgoogle.com
이라는 사이트인데요...
우리는 이 사이트의 도움을 받아, 더 빠르고 간편하게 학습된 모델을 만들어 보도록 하겠습니다.
다음 포스팅으로...
'AI > Keras-실습' 카테고리의 다른 글
케라스 - 닮은꼴 연예인 찾기(with OpenCV, TM)_2 (0) | 2020.09.11 |
---|---|
케라스 - 주가 예측 프로그램 만들기 (6) | 2020.09.10 |
케라스 - 구성 살펴보기(복습) (0) | 2020.09.10 |