2 분 소요

[공지사항] [YOLOv5를 활용하여 남성 상하의를 감지하고, Kmeans와 KNN을 활용하여 트렌드에 맞는 패션 컬러를 자동으로 예측하는 개인 프로젝트입니다.] 👉🏻깃허브 바로가기

트렌드 기반 패션 컬러 매칭 프로젝트 4편



트렌드 기반 패션 컬러 매칭 프로젝트Permalink



파이프 라인 구성에 따라 3가지 모델을 완성 시켰고 이제 이 모델들을 불러와서 최종 프로젝트를 완성시키는 단계이다.

  • YOLOv5를 활용한 물체 감지 (프로젝트 1편)

    • AI 허브에서 연도별 남성 패션 데이터 수집 (화보, 스냅샷 등)

    • Roboflow 플랫폼을 활용하여 2019년 데이터에 대한 좌표 라벨링 설정

    • YOLO 모델을 학습시켜 이미지 데이터에서 상의와 하의를 자동으로 검출


  • Kmeans 클러스터링을 활용한 색상 검출 (프로젝트 2편)
    • Roboflow 플랫폼을 활용하여 2019년 데이터에 대한 좌표 라벨링 설정

    • 이전 단계와 유사하게 이미지 데이터와 좌표를 불러오고, Kmeans 클러스터링을 활용하여 경계 좌표 내의 픽셀에서 색상 추출

    • 각 데이터에 일괄 적용하여 학습 데이터프레임 생성


  • 2019년 트렌드 바지 색상 예측을 위한 상하의 색상 조합 분석 (KNN) (프로젝트 3편)
    • 1, 2번에서 얻은 상하의 데이터로 상의에 따른 하의 RGB값을 학습

    • 얻은 데이터프레임으로 KNN 알고리즘 학습

    • 상의와 하의의 색상 조합을 통해 2019년 트렌드 바지 색상을 비교 및 예측



모델 불러오기Permalink

먼저 앞에서 만들 었던 YOLOv5 의 best.pt 파일과 KNN 모델 파일이 필요하다. 밑에서 색상 추출 함수는 다시 정의해줬다.



또한 앞에서 정의 했던 RGB 정규화 함수와 다시 원래 형태로 변환하는 함수가 필요하다.

# RGB 값들을 0에서 1 사이의 실수 값으로 정규화
def convert_to_numeric(data):
    return np.array([np.array(rgb) / 255.0 for rgb in data])
  
# 정규화된 값을 원래의 RGB 형태로 변환하는 함수
def convert_to_original(data):
    return tuple(np.array(data) * 255.0)



그리고 트렌트 기반 컬러 매칭 프로젝트 2편 때와는 달리 RGB 코드 색상 변환기에 접속 할 필요 없이 색상을 변해주는 코드를 짰다. 이 함수를 통하면 R G B 값이 실제 색상으로 시각화 된다.

def show_color(rgb):
    color_str = f'rgb({rgb[0]}, {rgb[1]}, {rgb[2]})'
    display(HTML(f'<div style="width:100px; height:100px; background-color:{color_str};"></div>'))



모델 실행하기Permalink

YOLOv5 를 이용한 객체 검출Permalink

  • torch 라이브 러리를 이용하여 욜로 모델을 불러오는 함수이다.
  • 매개변수인 model_path는 “/Users/dessert_gomjelly/Desktop/yolo project/색상검출/best.pt” 를 통해 사용한다.
  • 이미지 리사이즈하고 좌표와 주요 색상을 추출하는 기능도 넣었다.
def extract_major_colors(image_path, model_path, resize=(400, 500)):
    # YOLOv5 모델 로드
    model = torch.hub.load('ultralytics/yolov5', 'custom', path=model_path)  

    # 이미지 열기
    image = Image.open(image_path)

    # 원하는 크기로 이미지 리사이징
    resized_image = image.resize(resize)

    # 객체 검출 수행
    results_resized = model(resized_image)

    # 바운딩 박스 좌표 추출
    bboxes = [detection[0:4].cpu().numpy().astype(int) for detection in results_resized.xyxy[0]]

    # 바운딩 박스 좌표와 주요 색상 추출
    result_df = extract_colors_from_bboxes(resized_image, bboxes)

    return result_df, results_resized



K-means를 이용한 색상 추출Permalink

def kmeans_find_major_color(image):
    pixels = np.array(image)[:, :, :3].reshape((-1, 3))
    kmeans = KMeans(n_clusters=1, n_init=10, random_state=42)
    kmeans.fit(pixels)
if kmeans.cluster_centers_ is not None and len(kmeans.cluster_centers_) > 0:
    dominant_color = tuple(map(int, kmeans.cluster_centers_[0]))
    return dominant_color
else:
    return None



KNN을 이용한 하의 색상 예측Permalink

# 모델 불러오기
KNN_model = joblib.load('tuned_knn_model.joblib')

# 데이터 준비
X_top = convert_to_numeric(result_dataframe['TOP_RGB'].tolist())
X_bottom = convert_to_numeric(result_dataframe['BOTTOM_RGB'].tolist())

# 상의의 색상을 기반으로 하의의 색상 예측
predicted_bottom = KNN_model.predict(X_top.reshape(1, -1))



👉🏻전체 코드 바로가기 전체 코드는 깃허브에서 참고 하면 된다.



결과Permalink

결과는 다음과 같다. 먼저 상하의 색상 추출한 결과를 보여준다.


YOLO 모델로 상하의 객체를 탐지하고 상하의의 RGB 값을 추출한다.


마지막으로 상의와 어울리는 해당 년도 트렌드 하의 색상을 예측, 비교 해준다.


하의 부분이 나오지 않는 사진 또한 상의의 색상으로 입어야할 하의 색상을 예측해준다.



다른 테스트 사진들 또한 잘 적용 되는 것을 볼 수 있다.

더 많은 테스트 사진은 깃허브 링크를 통해 들어가면 볼 수 있다.



마치며Permalink

트렌드 기반 색상 매칭 프로젝트를 진행하며 어려움 점이 많았다.

먼저 개인 프로젝트로 진행하면서 혼자 이미지 데이터 라벨링 하는 데에 시간이 많이 소요됐다.

또한 R G B 값을 예측 하는 데에 변수가 한개 지만 각 채널에 영향을 끼쳐야 한다는 점 때문에 모델 선정이 어려웠다. 이론과 실전을 적용하는것에 부족함을 느꼈다.

그래도 성공적으로 프로젝트를 마무리 한것이 뿌듯함을 느낀다.

태그:

카테고리:

업데이트:

댓글남기기