0%

구찌 크롤링 데이터를 활용한 비슷한 이미지 출력(간단한 머신러닝)

비슷한 구찌 가방 찾기!

GUCCI 사이트 크롤링 데이터를 활용한 유사한 이미지 찾기

  • 직접 작성한 구찌 크롤링 코드를 활용하여 가방 사진을 다운받은 후 이를 활용하여 비슷한 이미지를 찾는다

1. 이미지 다운로드

  • pip install Boutique_crawling으로 다운로드 받아도 된다.
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# 크롤링 코드

def bags():
pages = 10
title = []
price = []
sex = []
img = []
dfs = []
for page in range(1, pages+1):
url = "https://www.gucci.com/kr/ko/c/productgrid?categoryCode=men-bags&show=Page&page={}".format(page)
response = requests.get(url)
print("여자 가방 {}페이지 크롤링 중 입니다...".format(page))
a = response.json()['products']
b = a['items']
for idx in range(len(b)):
title.append(b[idx]['title'])
price.append(b[idx]['price'])
img.append(b[idx]['primaryImage']['src'][2:])
sex.append('Men')
for page in range(1, pages+1):
url = "https://www.gucci.com/kr/ko/c/productgrid?categoryCode=women-handbags&show=Page&page={}".format(page)
response = requests.get(url)
print("남자 가방 {}페이지 크롤링 중 입니다...".format(page))
a = response.json()['products']
b = a['items']
for idx in range(len(b)):
title.append(b[idx]['title'])
price.append(b[idx]['price'])
img.append(b[idx]['primaryImage']['src'][2:])
sex.append('Women')
title_df = pd.DataFrame(title)
price_df = pd.DataFrame(price)
img_df = pd.DataFrame(img)
sex_df = pd.DataFrame(sex)
dfs.append(title_df)
dfs.append(price_df)
dfs.append(img_df)
dfs.append(sex_df)
gucci_bags_df = pd.concat(dfs, axis=1)
gucci_bags_df.reset_index(drop=True, inplace=True)
gucci_bags_df['brand'] = 'GUCCI'
gucci_bags_df.columns = ['title', 'price', 'image', 'sex', 'brand']
gucci_bags_df = gucci_bags_df[['brand', 'title', 'price', 'sex', 'image']]
a = list(gucci_bags_df['price'])
ls = []
for x in a:
num = re.findall("\d+", x)
num = "".join(num)
num = int(num)
ls.append(num)
gucci_bags_df['price'] = ls
gucci_bags_df.to_csv("gucci_bags.csv", index=False, encoding="utf-8")
print("사진 저장을 시작합니다")
for idx, link in enumerate(img):
url = "http://" + link
urllib.request.urlretrieve(url, 'bags/' + 'g' + str(idx) + '.jpg')
return gucci_bags_df
1
2
3
# 코드 실행
import urllib.request
bags()
여자 가방 1페이지 크롤링 중 입니다...
여자 가방 2페이지 크롤링 중 입니다...
여자 가방 3페이지 크롤링 중 입니다...
여자 가방 4페이지 크롤링 중 입니다...
여자 가방 5페이지 크롤링 중 입니다...
여자 가방 6페이지 크롤링 중 입니다...
여자 가방 7페이지 크롤링 중 입니다...
여자 가방 8페이지 크롤링 중 입니다...
여자 가방 9페이지 크롤링 중 입니다...
여자 가방 10페이지 크롤링 중 입니다...
남자 가방 1페이지 크롤링 중 입니다...
남자 가방 2페이지 크롤링 중 입니다...
남자 가방 3페이지 크롤링 중 입니다...
남자 가방 4페이지 크롤링 중 입니다...
남자 가방 5페이지 크롤링 중 입니다...
남자 가방 6페이지 크롤링 중 입니다...
남자 가방 7페이지 크롤링 중 입니다...
남자 가방 8페이지 크롤링 중 입니다...
남자 가방 9페이지 크롤링 중 입니다...
남자 가방 10페이지 크롤링 중 입니다...
사진 저장을 시작합니다

brand title price sex image
0 GUCCI [오피디아] GG 서류 가방 2470000 Men media.gucci.com/style/DarkGray_South_0_160_316...
1 GUCCI [오피디아] GG 화장품 케이스 990000 Men media.gucci.com/style/DarkGray_South_0_160_316...
2 GUCCI [오피디아] GG 파우치 1220000 Men media.gucci.com/style/DarkGray_South_0_160_316...
3 GUCCI [오피디아] 스몰 사이즈 GG 백팩 2080000 Men media.gucci.com/style/DarkGray_South_0_160_316...
4 GUCCI [오피디아] GG 수프림 포트폴리오 1240000 Men media.gucci.com/style/DarkGray_South_0_160_316...
... ... ... ... ... ...
296 GUCCI [네오 빈티지] GG 수프림 메신저 백 1410000 Women media.gucci.com/style/DarkGray_South_0_160_316...
297 GUCCI [네오 빈티지] 백팩 2460000 Women media.gucci.com/style/DarkGray_South_0_160_316...
298 GUCCI 소호 스몰 가죽 디스코 백 1450000 Women media.gucci.com/style/DarkGray_South_0_160_316...
299 GUCCI [소호] 스몰 가죽 디스코 백 1450000 Women media.gucci.com/style/DarkGray_South_0_160_316...
300 GUCCI [GG 마몽] 스몰 마틀라세 숄더백 2720000 Women media.gucci.com/style/DarkGray_South_0_160_316...

301 rows × 5 columns

확보한 사진 데이터를 활용하여 간단한 머신러닝을 해보자!

1
2
import mahotas as mh
from glob import glob

이미지 불러오기

1
2
3
# images = glob('bags/*.jpg')
images = glob('bags/*.jpg')
images
['bags/g269.jpg', ... 중간 생략
 'bags/g270.jpg']

이미지를 배열로 만들기 & grey로 만들기

1
2
3
4
5
6
features = []

for im in images:
im = mh.imread(im)
im = mh.colors.rgb2gray(im, dtype=np.uint8)
features.append(mh.features.haralick(im).ravel())

각 사진 별 거리구하기

1
2
3
4
5
6
7
from scipy.spatial import distance
from sklearn.preprocessing import StandardScaler

sc = StandardScaler()
features = sc.fit_transform(features)

dists = distance.squareform(distance.pdist(features))
1
dists
array([[ 0.        ,  6.626829  , 10.96937821, ...,  6.41357824,
         7.76924545,  5.18205591],
       [ 6.626829  ,  0.        ,  7.80597792, ...,  8.07493656,
         4.2529202 ,  6.68458331],
       [10.96937821,  7.80597792,  0.        , ..., 12.43831703,
         6.09376376, 11.31567013],
       ...,
       [ 6.41357824,  8.07493656, 12.43831703, ...,  0.        ,
         7.56989192,  1.70162557],
       [ 7.76924545,  4.2529202 ,  6.09376376, ...,  7.56989192,
         0.        ,  6.37412609],
       [ 5.18205591,  6.68458331, 11.31567013, ...,  1.70162557,
         6.37412609,  0.        ]])
1
2
3
4
def selectImage(n, m, dists, images):
image_position = dists[n].argsort()[m]
image = mh.imread(images[image_position])
return image
1
2
3
4
5
6
7
8
def plotImages(n):
fig, ax = plt.subplots(1,4, figsize=(15, 5))

for i in range(4):
ax[i].imshow(selectImage(n, i, dists, images))
ax[i].set_xticks([])
ax[i].set_yticks([])
plt.show()

grey로 바꾼 후의 비슷한 가방 모양 찾기

1
plotImages(80)

색을 그대로 두면 어떨까?

1
2
3
4
5
features_c = []

for im in images:
im = mh.imread(im)
features_c.append(mh.features.haralick(im).ravel())
1
2
3
4
5
6
7
from scipy.spatial import distance
from sklearn.preprocessing import StandardScaler

sc = StandardScaler()
features_c = sc.fit_transform(features_c)

dists_c = distance.squareform(distance.pdist(features_c))
1
2
3
4
def selectImage_c(n, m, dists, images):
image_position = dists_c[n].argsort()[m]
image = mh.imread(images[image_position])
return image
1
2
3
4
5
6
7
8
def plotImages_c(n):
fig, ax = plt.subplots(1,4, figsize=(15, 5))

for i in range(4):
ax[i].imshow(selectImage_c(n, i, dists, images))
ax[i].set_xticks([])
ax[i].set_yticks([])
plt.show()

색을 그대로 두면 RGB 값이 다 살아있기 때문에 색이 비슷한 가방을 우선적으로 찾아준다

1
plotImages_c(80)