[Django&MySQL] 의류 model 개선 및 크롤링 데이터 반영하기

chaewon Im·2022년 1월 14일
0

실전 기록✏️

목록 보기
8/8

개선 전

구현해둔 퍼스널컬러 분류 모듈을 DB에 있는 데이터에 반영하는 작업을 해야하는 단계였는데, 팀원이 만들어둔 서버 코드를 받아보니 의류 모델이 카테고리에 따라 총 8개로 만들어져있었고 그에 따라 뷰를 제공하고 있었다. 안에 들어가는 필드는 다 똑같은 채로 이름만 다른 8개의 모델이였다.

(이렇게 4번 반복)

이대로라면 퍼스널 컬러 데이터 세팅 작업도 똑같은 일을 8번 해야하고, 나중에 필터링 기능도 필터링이라고 부르기 애매하게 클라이언트 요청 내용에 따라 모델 object를 각각 보내주는 모델별 데이터 출력이 될 것 같았다.

뿐만 아니라 현재의 구현 방식으로는 전체 의류를 한번에 볼 수 없었기 때문에, 8개의 모델을 일일히 불러와 클라이언트로 보내주는 방식으로 구현이 되어있었다.

# 기존의 구현 방식

from .models import *

def musinsa_fashion(request):
    collar = Collar.objects.all().order_by('index')[:12]
    hoodie = Hoodie.objects.all().order_by('index')[:12]
    shirt = Shirt.objects.all().order_by('index')[:12]
    longsleeve = Longsleeve.objects.all().order_by('index')[:12]
    shortsleeve = Shortsleeve.objects.all().order_by('index')[:12]
    sleeveless = Sleeveless.objects.all().order_by('index')[:12]
    sweat = Sweat.objects.all().order_by('index')[:12]
    sweater = Sweater.objects.all().order_by('index')[:12]
    return render(request, 'fashion/musinsa_view.html', {'collar': collar, 'hoodie': hoodie, 'longsleeve': longsleeve,
                                                    'shirt': shirt, 'shortsleeve': shortsleeve, 'sleeveless': sleeveless,
                                                     'sweat': sweat, 'sweater': sweater})

이런 상황이였어서 나중에 추가적인 기능이 구현될때도 불편한 점이 많을 것으로 예상되었다.

그래서 기존 모델들을 하나로 합치고 합친 모델에 category 필드를 만들어 주는 것이 어떨지 제안했다. 8개의 모델을 만든 팀원도 이 의견에 동의했고, 마침 csv에 퍼스널 컬러 데이터를 삽입하는 일도 내가 맡은 일이여서 겸사겸사 내가 수정을 같이 해주기로 했다.

개선 과정✨

1. 모델을 수정한다.

같은 필드를 가진 Clothes라는 모델 클래스를 만들고, category 필드를 하나 더 추가했다.

수정 후 MySQL에 존재하던 기존의 테이블도 제거해주고, migration을 진행한다.

2. 크롤링해서 만들어둔 의류 데이터 csv파일들에 category 칼럼을 추가하고, 각 csv파일명에 따라 데이터를 넣어준다.

예를 들어 hoodie.csv면 category 데이터를 싹다 hoodie로 통일시켜서 삽입하는 파이썬 코드를 작성하여 csv파일에 반영시켜 주었다.

# insert_category.py
import pandas as pd

df = pd.read_csv('../predataset/hoodie.csv')
df['category'] = 'hoodie' //카테고리 컬럼 생성하고 그 안에 'hoodie'라는 값을 전부 삽입
df.head()
df.to_csv('../dataset/hoodie.csv') //새 파일로 저장

이렇게 데이터셋을 새롭게 생성하였다. 사실 파일이랑 파일명 한번에 추출해서 작업해도 됐는데..파일명이 애매한 애들이 몇개 있어서 카테고리명이랑 파일명도 바꿔줄 겸 수작업을 했다.(8개니까 가능한 일)

# /dataset/hoodie.csv
,index,url,brand,name,price,discount_price,thumbnail,category
0,0,https://store.musinsa.com/app/goods/1628385,예일,2 TONE ARCH HOODIE GRAY,"79,000","55,300",https://image.msscdn.net/images/goods_img/20200928/1628385/1628385_4_500.jpg,hoodie
1,1,https://store.musinsa.com/app/goods/2115555,디스이즈네버댓,T-Logo Hoodie Dark Navy,"82,000","57,400",https://image.msscdn.net/images/goods_img/20210908/2115555/2115555_2_500.jpg,hoodie
2,2,https://store.musinsa.com/app/goods/1615829,제멋,로그 오버핏 기모 후드 그레이 YHHD2302,"34,900","33,100",https://image.msscdn.net/images/goods_img/20200922/1615829/1615829_1_500.jpg,hoodie
3,3,https://store.musinsa.com/app/goods/644026,마크 곤잘레스,사인 로고 후드 그레이,"69,000","48,300",https://image.msscdn.net/images/goods_img/20170926/644026/644026_2_500.jpg,hoodie

이런식으로 category가 추가된 새 csv가 생겼다.

3. 이제 모든 csv데이터를 합친다.

#combine_csv.py

#카테고리별로 분리되어있는 csv파일들을 하나의 파일로 합친다.
import pandas as pd
import numpy as np
import os

# 파일들이 있는 폴더명으로 폴더내 파일 목록 불러오기
forders = os.listdir('../dataset')
df_all = pd.DataFrame()
for i in range(0,len(forders)):
    if forders[i].split('.')[1] == 'csv':
        file = '../dataset/'+forders[i]
        df= pd.read_csv(file,encoding='utf-8') 
        df_all = pd.concat([df_all, df])

df_all.to_csv('../dataset/all.csv')

전체 데이터를 합칠 데이터프레임을 하나 생성하고, csv 파일 목록들을 하나씩 돌면서 concat으로 새로운 데이터프레임에 결합했다.

결합이 끝난 후, 새로운 csv파일로 저장한다.
참고자료

4. 합쳐진 csv파일에서 tone,color 컬럼을 추가 & 데이터 추가.

이 과정은 아까 category를 추가했을 때와 동일하다. 차이점이라면 tone,color의 값을 넣기 위해 퍼스널 컬러 추출 모듈을 돌려야 한다.

해당 과정은 카테고리 삽입과정과 큰 차이가 없는데도 함께 작업하지 않고 따로 뒤에서 했다. 그 이유는 기존 파일에 작업한다면 각 파일별로 8번씩 퍼스널 컬러 모듈을 돌리는 작업을 해야하지만, 파일을 합친 후에 작업하면 딱 한번만 돌려주면 되기 때문이었다.

import numpy as np
from tone_extraction import *

df = pd.read_csv('../dataset/all.csv')

for i in range(0,len(df)):
    url = df['thumbnail'][i]
    tone_extraction_instance = ToneExtraction(url)
    tone,color = tone_extraction_instance.extract_tone()

    # df['tone'][i] = tone 
    # df['color'][i] = color
    df['tone'][i] = 'winter'
    df['color'][i] = 'red'

df.to_csv('../dataset/final_dataset.csv')

다음과 같이 csv파일을 차례로 돌면서 thumbnail 링크를 인자로 주면, 톤 추출 모듈에서 이미지를 인식해 톤과 색상명을 추출하고 그 값을 반환해 해당 row의 'tone'과 'color' column에 데이터로 입력되도록 구현했다.

⚠️ 그러나 이 과정에서 opencv가 웹상의 url 이미지를 인식하지 못한다는 문제가 발생했다.

일단 변경된 모델과 데이터들을 깃에 푸쉬를 해야 팀원이 다음 과정들을 진행할 수 있어서, 일단은 톤과 color에는 임시값으로 winter,red를 전부 입력해서 전달해주었다. url문제를 해결한 다음 데이터셋을 수정해서 전달하면 데이터셋만 바꾸면 되기 때문에 진행에는 차질이 없을 것으로 보인다.

5. 데이터 불러오기

데이터는 워크밴치에서 Table Data Import Wizard로 불러온다.

데이터를 불러오면 서버가 정상적으로 실행된다. 이렇게 의류 모델 개선을 완료했다.

열심히 만들어두신 걸 괜히 엎는 건 아닐까 조금 고민했었는데, 아깝더라도 무의미한 시간을 계속 투자하는 것 보다는 만들어진 모델들을 개선해서 생산성을 높이는 것이 길게 봤을 때 더 팀에 도움이 될 것이라고 생각해서 제안을 했고, 이렇게 직접 개선을 해보았다. 변경한 모델이 앞으로 구현과정에서 도움이 되었음 좋겠다!

그럼 이제 얼른 url문제를 해결하러 가야겠다..🤦‍♀️

profile
빙글빙글 FE 개발자

0개의 댓글