想構建服裝推薦系統?用深度學習模型

全文共3095字,預計學習時長9分鐘

來源:Pexels

本文將解釋如何整合深度學習模型,構建服裝推薦系統。

我們想要建立一個服裝推薦系統,可以使用四種深度學習模型來獲取用戶服裝使用的重要特徵。

推薦系統可分為4類:

  • 基於產品特性的推薦
  • 基於其他用戶對產品的行為的推薦
  • 基於用戶一般特徵的推薦
  • 基於上述多項標準的推薦

來源:Pexels

在案例中,我們將根據用戶和產品特性提出建議。計入考慮的用戶特徵是性別、年齡和體重指數(BMI)。計入考慮的產品特徵是用戶所穿的衣服類型。因此,我們需要一張用戶的照片,對所有特徵進行預測,推薦相應的服裝。

將從用戶的全身圖像中獲得服裝特徵。

使用名為AlphaPose的人體姿態估計系統來確定用戶是否完整。AlphaPose檢測一個人的19個點。如果檢測到至少17個點,就認定是完整人形。

圖1: AlphaPose估計系統

我們重新訓練了網上最知名的其中一種分類器——YOLO v3。YOLO同時也是最精確的圖像分類器之一。用於訓練的數據集是一組巨大的 MMLAB 數據集,DeepFashion。

使用的另一個模型是 Dlib,get_frontal_face_detector()函數。此模型由 5 個 HOG 篩選器構建。模型檢測前視圖面和側視圖面。之所以選擇該模型是因為它速度快且精確。在檢測年齡和性別時,我們根據數據科學的文章,使用 openCV 和卷積神經網絡對年齡和性別進行分類。

基於一篇名為《利用Keras和轉移學習從人臉圖像中估計身體質量指數》(Estimating Body Mass Index from face images using Keras andtransfer learning)的文章對IMC進行估計。

圖2:推薦系統的體系結構

模型集成

所有代碼都是使用一些計算機視覺庫(如 OpenCV)和一些深度學習框架(如Keras)在 Python3.5 中編寫的。

  1. detector =dlib.get_frontal_face_detector()# Carga de modelos
  2. # CNN
  3. age_net, gender_net =load_caffe_models()
  4. # Boddy Mass Index
  5. model_bmi = get_trained_model()
  6. ### Face Detection
  7. img_h, img_w, _ = np.shape(image)
  8. detected = detector(image, 1)
  9. faces
  10. =
  11. np.empty((1,
  12. config.RESNET50_DEFAULT_IMG_WIDTH, 3))
  13. config.RESNET50_DEFAULT_IMG_WIDTH,detection= {}
  14. if len(detected) > 0:
  15. for i,d in enumerate(detected):
  16. x1, y1, x2, y2, w, h = d.left(),d.top(), d.right() + 1, d.bottom() + 1, d.width(),
  17. d.height()
  18. xw1 = max(int(x1 - margin * w), 0)
  19. yw1 = max(int(y1 - margin * h), 0)
  20. xw2 = min(int(x2 + margin * w), img_w - 1)
  21. yw2 = min(int(y2 + margin * h), img_h - 1)
  22. cv2.rectangle(image, (xw1, yw1),(xw2, yw2), (255, 0, 0), 2)
  23. #Get Face
  24. face_img = frame[yw1:yw2,xw1:xw2].copy()
  25. # Estimación
  26. age, gender = get_age_and_gender(face_img,age_net, gender_net)
  27. # Boddy Mass Index
  28. faces[0,:,:,:]=cv2.resize(face_img,
  29. (config.RESNET50_DEFAULT_IMG_WIDTH,3 )) /255.00
  30. bmi = round(float(model_bmi.predict(faces)[0][0]),2)
  31. detection[i]={'gender':gender, 'age':age, 'bmi':bmi}

通過這些代碼,將模型加載到RAM中進行姿態估計(poseestimation)。為了估測年齡、性別和BMI,我們還剪切了臉部所在的區域。然後,使用 YOLO 對衣服進行分類,顯示推薦的衣服類型。

  1. def eval_cloth(img_test,categoria_test, size_test):
  2. filename = './ClothEmbedding/X_reduced2.sav'
  3. X_reduced, hasher, pca, df =joblib.load(filename)
  4. img = cv2.imread(img_test)
  5. img_c = cv2.resize(img, (80, 80), interpolation=cv2.INTER_CUBIC)
  6. img_data_test = img_c.reshape(-1).astype(np.float32)
  7. img_transformed =hasher.transform(img_data_test.reshape(1, -1))
  8. img_reduced =pca.transform(img_transformed)
  9. # Distancia entre la muestra y la basede datos
  10. dist = [np.linalg.norm(img_reduced-e) for e in X_reduced]
  11. df['distance'] =dist
  12. df_test = df.sort_values(['distance'])
  13. # Se conserva sólo la categiríarequerida
  14. df_test = df_test[df_test['categoria2'] == categoria_test]
  15. # Se conservan sólo las tallasrequeridas
  16. cat_ns = ['tacones', 'chanclas', 'botas', 'bolsa', 'ropa_interior']
  17. ifnot(categoria_test in cat_ns):
  18. if(len(size_test) == 2):
  19. true_table = [(size_test[0] in sizes_r or size_test[1] in sizes_r) for sizes_r in df_test['tallas']]
  20. else:
  21. true_table = [size_test[0] in sizes_r for sizes_r in df_test['tallas']]
  22. df_test = df_test[true_table]
  23. returndf_test

最後一個功能會接收人和衣服的所有信息。將服裝特性與數據庫中的服裝進行比對。會推薦與用戶身着相似的服裝。

最後,考慮到用戶體驗,就做了一個前端。

圖3:為推薦系統構建Web試圖

感謝閱讀!記得踴躍發言喲~

留言點贊關注

我們一起分享AI學習與發展的乾貨

如轉載,請後台留言,遵守轉載規範