이미지 학습데이터를 크롤링하며 수집하는 도중 이런 생각이 들었다.
아니 어차피 <img src> 값을 통해 이미지 url을 열어서 하드에 저장하는 방식인데.
그냥 src 값만 저장하고 나중에 읽기만한 다음에 트레이닝데이터로 쓰면 좋지 않을까?
심지어 PIL 의 Image 패키지를 사용하면 로컬경로를 넣지않고 이미지 주소값을 넣어도
이미지가 주피터에서 열린다는 사실도 알고있었다.
Image.open(url) 하면 해당 이미지가 주피터에서 열림..
그래서 나는 이미지주소만 받아서 그 이미지를 numpy 객체로 변환하는 방법을 공유하려 한다.
어차피 모델 학습을 위한 input data 는 numpy 이니까.. ㅎㅎ
먼저 나는 이미지주소만 크롤링했다.
url 을 다 크롤링했다면 함수를 정의해서 사용하면된다.
import urllib
import cv2
import numpy as np
def url_to_image(url, readFlag=cv2.IMREAD_COLOR):
# download the image, convert it to a NumPy array, and then read
# it into OpenCV format
resp = urllib.request.urlopen(url)
image = np.asarray(bytearray(resp.read()), dtype="uint8")
image = cv2.imdecode(image, cv2.IMREAD_COLOR)
# return the image
return image
이 함수를 간단히 설명하자면 request를 통해 url의 있는 이미지 정보를 가져오고
그 url을 읽어서 bytearray로 감싸주고 그걸 다시 uint8 형식의 np.array로 변환한다.
그리고 그것을 디코딩하여 3차원 이미지 np.array형식으로 바꿔 리턴
어렵게 설명했지만 함수이름대로 그냥 이미지 주소를 학습하기 좋은 3차원 행렬 데이터로 바꿔준다고 보면된다.
labels_np = imgPre[['imgAdr','log_score']].values
여기서 이미지 주소(imgAdr)와 종속변수인(log_score)를 가지고 있는
데이터프레임의 .value를 해주면 np.array형식으로 바뀐다.
이제 이걸 for 문을 통해 순회하면서 처리하면 되는데.
imgs = np.empty((len(labels_np),188,336,3),dtype=np.uint8)
for i, (imgAdress, score) in enumerate(labels_np):
img = url_to_image(imgAdress)
if img.shape[0] != 188 or img.shape[1] != 336:
print(imgAdress)
imgs[i] = img
print(i)
먼저 차원이 동일한 np.empty 를 만들어준다.
이것은 모든 값이 0인 np.array를 만들어주는 것으로 데이터가 들어갈 통이라고 생각하면 된다.
이제 for문을 돌면서 값을 대입한다.
여기서 주의할 점은 for문을 돌면서 request를 통해 계속 인터넷에 접속을 하는데
자꾸 접속을 반복하면 해당 호스트에서 아이피를 차단할 수 도 있고
이미지주소가 사라져서 404에러를 발생시킬수도 있다.
그래서 print(i) 를 찍어보고 에러가 발생한다면 i번째 다음부터 진행하면 된다.
* i 의 값을 에러가 발생한 인덱스 값으로 지정하면 그 다음부터 다시 값을 대입하기 시작한다.
그리고 혹시 모르니 결과값을 저장하는 습관을 기르도록하자.
np.save('img.npy',imgs)
.npy 형태로 저장한다.
'Computer Vision' 카테고리의 다른 글
[이미지 전처리]. ImageDataGenerator 클래스 : 이미지 제너레이터 (0) | 2020.12.07 |
---|---|
[이미지 전처리] Pillow PIL , Opencv cv2 , 이미지 형태 정규화(RGB, RGBA) (0) | 2020.12.04 |
[이미지 전처리]. 이미지 차원 추가하기 , np.append_dim() (0) | 2020.12.04 |
[이미지 전처리]. image to base64 , base64 to image 변환하는 방법 (2) | 2020.11.25 |
[이미지 전처리]. 이미지 크기 한꺼번에 변경하기 ( image preprocessing) (0) | 2020.11.25 |