全文共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 中編寫的。
- detector =dlib.get_frontal_face_detector()# Carga de modelos
- # CNN
- age_net, gender_net =load_caffe_models()
- # Boddy Mass Index
- model_bmi = get_trained_model()
- ### Face Detection
- img_h, img_w, _ = np.shape(image)
- detected = detector(image, 1)
- faces
- =
- np.empty((1,
- config.RESNET50_DEFAULT_IMG_WIDTH, 3))
- config.RESNET50_DEFAULT_IMG_WIDTH,detection= {}
- if len(detected) > 0:
- for i,d in enumerate(detected):
- x1, y1, x2, y2, w, h = d.left(),d.top(), d.right() + 1, d.bottom() + 1, d.width(),
- d.height()
- xw1 = max(int(x1 - margin * w), 0)
- yw1 = max(int(y1 - margin * h), 0)
- xw2 = min(int(x2 + margin * w), img_w - 1)
- yw2 = min(int(y2 + margin * h), img_h - 1)
- cv2.rectangle(image, (xw1, yw1),(xw2, yw2), (255, 0, 0), 2)
- #Get Face
- face_img = frame[yw1:yw2,xw1:xw2].copy()
- # Estimación
- age, gender = get_age_and_gender(face_img,age_net, gender_net)
- # Boddy Mass Index
- faces[0,:,:,:]=cv2.resize(face_img,
- (config.RESNET50_DEFAULT_IMG_WIDTH,3 )) /255.00
- bmi = round(float(model_bmi.predict(faces)[0][0]),2)
- detection[i]={'gender':gender, 'age':age, 'bmi':bmi}
通過這些代碼,將模型載入到RAM中進行姿態估計(poseestimation)。為了估測年齡、性別和BMI,我們還剪切了臉部所在的區域。然後,使用 YOLO 對衣服進行分類,顯示推薦的衣服類型。
- def eval_cloth(img_test,categoria_test, size_test):
- filename = './ClothEmbedding/X_reduced2.sav'
- X_reduced, hasher, pca, df =joblib.load(filename)
- img = cv2.imread(img_test)
- img_c = cv2.resize(img, (80, 80), interpolation=cv2.INTER_CUBIC)
- img_data_test = img_c.reshape(-1).astype(np.float32)
- img_transformed =hasher.transform(img_data_test.reshape(1, -1))
- img_reduced =pca.transform(img_transformed)
- # Distancia entre la muestra y la basede datos
- dist = [np.linalg.norm(img_reduced-e) for e in X_reduced]
- df['distance'] =dist
- df_test = df.sort_values(['distance'])
- # Se conserva sólo la categiríarequerida
- df_test = df_test[df_test['categoria2'] == categoria_test]
- # Se conservan sólo las tallasrequeridas
- cat_ns = ['tacones', 'chanclas', 'botas', 'bolsa', 'ropa_interior']
- ifnot(categoria_test in cat_ns):
- if(len(size_test) == 2):
- true_table = [(size_test[0] in sizes_r or size_test[1] in sizes_r) for sizes_r in df_test['tallas']]
- else:
- true_table = [size_test[0] in sizes_r for sizes_r in df_test['tallas']]
- df_test = df_test[true_table]
- returndf_test
最後一個功能會接收人和衣服的所有信息。將服裝特性與資料庫中的服裝進行比對。會推薦與用戶身著相似的服裝。
最後,考慮到用戶體驗,就做了一個前端。
圖3:為推薦系統構建Web試圖
感謝閱讀!記得踴躍發言喲~
留言點贊關注
我們一起分享AI學習與發展的乾貨
如轉載,請後台留言,遵守轉載規範