Aplicació de l'aprenentatge a distància al problema de la botiga al carrer

Comencem per definir el problema del carrer a la botiga: identificar un article de moda en una imatge d’usuari i trobar-lo en una botiga en línia. Alguna vegada heu vist algú al carrer i heu pensat: "Vaja, aquest és un bonic vestit, em pregunto on el puc comprar?" Però per a mi va ser la tasca interessant de provar tècniques d’aprenentatge mètric a distància. Espero que també us sigui interessant.

registre

En primer lloc, necessitem un conjunt de dades per a això. De fet, em va sorgir aquesta idea després de descobrir que hi ha un munt de fotografies preses pels usuaris a Aliexpress. I vaig pensar: "Vaja, puc fer una cerca d'imatges amb aquestes dades, per diversió, per descomptat". M’he centrat en la roba exterior de la dona per simplificar.

A continuació es mostra la llista de categories que he utilitzat per al desballestament:

  • roba
  • Bruses
  • Dessuadores amb i sense caputxa
  • jersei
  • Jaquetes

He fet servir Sol·licituds i BeautifulSoup per desfer. Es pot accedir a les imatges del venedor des de la pàgina principal de l’element. No obstant això, per a les imatges dels usuaris, hem de passar per les pàgines de comentaris. Al lateral de l'article hi ha un element anomenat "Colors". El color només pot ser un objecte d’un color diferent o objectes completament diferents. Per tant, considerem que els diferents colors són articles diferents.

El codi que he utilitzat per obtenir tota la informació sobre un element (en realitat es retalla més del que necessitem per a la nostra tasca) es troba a l’enllaç https://github.com/movchan74/street_to_shop_experiments/blob/master/get_item_info. py.

Tot el que hem de fer és passar per les pàgines de cerca per categories, obtenir les adreces URL de tots els elements i utilitzar la funció anterior per obtenir la informació sobre cada element.

Finalment, tenim dos conjunts d’imatges per a cada article: imatges d’un venedor (URL de camp per a cada element d’inici [«colors»]) i imatges d’usuaris (imatges de camp per a cada article d’inici [«comentaris»]).

Per a cada color, només tenim una imatge d’un venedor, però els usuaris poden tenir més d’una imatge per a cada color (de vegades no hi ha cap imatge per al color).

Genial! Tenim dades. Tot i això, el conjunt de dades recollides és sorollós:

  • Hi ha imatges sorolloses dels usuaris (fotos de caixes d’embalatge, fotos de textura o només part d’un element, articles sense embalar, fotos no relacionades).
Exemples de soroll a les imatges de l'usuari.

Per pal·liar aquest problema, he dividit 5.000 imatges en dues categories: bones imatges i imatges sorolloses. Al principi, el meu pla era formar un classificador per a dues categories i utilitzar-lo per netejar el conjunt de dades. Tanmateix, més tard vaig decidir deixar aquesta idea per a futurs treballs i vaig afegir imatges netejades als conjunts de prova i validació.

  • El segon problema és que hi ha articles que venen diversos venedors. Fins i tot els venedors tenen les mateixes imatges (o imatges lleugerament editades) de vegades. Però, com s’ho hauria d’afrontar? La manera més senzilla és no fer res i utilitzar un algorisme d’aprenentatge a distància robust. Tanmateix, això pot afectar la validació, ja que les dades de validació i formació poden contenir la mateixa entrada. Per tant, hi ha una filtració de dades. Una altra possibilitat és trobar imatges similars (o fins i tot idèntiques) i combinar-les en un sol objecte. Podem utilitzar el hash perceptiu per trobar imatges idèntiques (com el phash o el whash), o podem formar un model sobre dades sorolloses i aplicar-lo per trobar imatges similars. Vaig escollir la segona opció perquè us permet combinar imatges fins i tot lleugerament editades.

Ensenyament a distància

Una de les formes més populars d’aprendre mètriques a distància és la pèrdua de triplets:

on max (x, 0) és la funció de frontissa, d (x, y) és la funció de distància entre x i y, F (x) és una xarxa neuronal profunda, M és la vora, a és l’ancoratge, p és el punt positiu , n és el punt negatiu.

F (a), F (p), F (n) són punts de l’espai d’alta dimensió (incrustacions) que són generats per una xarxa neuronal profunda. Val a dir que sovint cal normalitzar les incrustacions per tenir una unitat de longitud; H. || x || = 1 per ser robust contra els canvis d'il·luminació i contrast i per a l'estabilitat de l'entrenament. L’àncora i les mostres positives pertanyen a la mateixa classe, la mostra negativa és una instància d’una classe diferent.

La idea principal de pèrdua de triplets és, per tant, separar incrustacions del parell positiu (ancoratge i positiu) a una distància M de les incrustacions del parell negatiu (ancoratge i negatiu).

Però, com es tria el triplet (a, p, n)? Només podem seleccionar mostres a l'atzar com a triplets, però això crea els següents problemes. En primer lloc, hi ha N³ possibles triplets. Vol dir que necessitem molt de temps passant per totes les tripletes possibles. De fet, no cal fer-ho, ja que després d’unes poques iteracions d’entrenament hi haurà molts triplets que no infringeixen la restricció de triplets (donen zero pèrdues). Això significa que aquestes tripletes no serveixen per a l’entrenament.

Un dels mètodes més comuns per a la selecció de triplets és la mineria negativa dura:

La selecció dels negatius més durs pot conduir a la pràctica a uns mínims locals pobres en una etapa inicial. En particular, això pot conduir a un model col·lapsat (és a dir, F (x) = 0). Per mitigar-ho, podem utilitzar mineria negativa semidura.

Les mostres semidures negatives estan més allunyades de l’ancoratge que la mostra positiva, però encara són dures (violació de la condició de triplet) perquè es troben dins del marge M.

Condicions per a un triplet amb una mostra semidura negativa

Hi ha dues maneres de generar mostres negatives semidures (i dures): en línia i fora de línia.

  • En línia significa que seleccionem aleatòriament mostres del conjunt de dades del tren com a mini-lot i seleccionem triplets de les mostres que contenen. No obstant això, per al mètode en línia, necessitem una mida de lot gran i petita. Això no és possible en el meu cas, ja que només tinc una GTX 1070 amb 8 GB de RAM.
  • En el mètode fora de línia, hem de deixar d’entrenar al cap de temps, predir incrustacions per a un nombre determinat de mostres, seleccionar triplets i formar el model amb aquests triplets. Això significa que hem de fer dues passades endavant, però el preu del mètode fora de línia.

Bé! Ja podem entrenar el model amb pèrdues de triplets i mineria fora de línia semi-dura. Però! En aquest món imperfecte sempre hi ha un "però". Encara necessitem un truc més per solucionar amb èxit el camí cap a la compra. La nostra feina és trobar la imatge del venedor que s’assembli més a la de l’usuari. Com a regla general, però, les imatges del venedor són de molta millor qualitat (en termes d’il·luminació, càmera, posició) que les imatges de l’usuari, de manera que tenim dues àrees: les imatges del venedor i les imatges de l’usuari. Per obtenir un model eficient, hem de superar una bretxa entre aquests dos dominis. Aquest problema es coneix com a personalització de dominis.

Esquerra: imatge de l'usuari, dreta: imatge del venedor

Proposo una tècnica molt senzilla per reduir la bretxa del domini: escollim àncores entre les imatges del venedor i mostres positives i negatives de les imatges de l'usuari. Això és tot! Simple però eficaç.

implementació

Per implementar les meves idees i experimentar ràpidament, he utilitzat la biblioteca Keras amb el backend Tensorflow.

Vaig triar el model Inception V3 com a CNN base per al meu model. Com de costum, vaig inicialitzar CNN amb pesos ImageNet. Després de l’agrupació global amb normalització L2 al final de la xarxa, vaig afegir dues capes completament connectades. La mida de la inserció és de 128.

També hem d’implementar la funció de triple pèrdua. Entreguem l’àncora i les mostres positives / negatives com a minibatchs individuals i les dividim en 3 tensors dins de la funció de pèrdua. La funció de distància és la distància euclidiana quadràtica.

I compileu el model:

Resultats experimentals

Obteniu resultats. Primera columna: consulta (imatge de l'usuari), 5 següent: imatges del venedor més similar.

El rendiment es mesura com a record a K (R @ K).

Fem una ullada al càlcul de R @ K. La imatge de cada usuari del conjunt de validació es va utilitzar com a consulta i hem de trobar la imatge corresponent del venedor. Prenem una imatge de consulta, calculem el vector d’incorporació i trobem els veïns més propers d’aquest vector entre els vectors de totes les imatges del venedor. No només fem servir imatges del venedor del conjunt de validació, sinó que també fem servir imatges del conjunt del tren, ja que augmenta el nombre de distractors i ens dificulta la feina.

Per tant, tenim una imatge de consulta i una llista de les imatges dels venedors més similars. Si hi ha una imatge de venedor corresponent a les imatges més semblants de K, en tornarem 1 per a aquesta consulta; en cas contrari, en tornarem 0. Ara hem de crear-la per a cada imatge d'usuari del conjunt de validació i promoure les valoracions de cada consulta. Serà R @ K.

Com he dit abans, he netejat la petita quantitat d’imatges de l’usuari de les imatges sorolloses. Així que vaig mesurar la qualitat del model en dos conjunts de dades de validació: el conjunt de validació complet i un subconjunt d’imatges només netes.

R @ K per a dades de validació

Els resultats són lluny de ser ideals, hi ha moltes coses a fer:

  • Neteja les imatges de l'usuari del soroll de la imatge. Ja he fet un primer pas en aquesta direcció netejant un petit conjunt.
  • Acosteu els elements (com a mínim al conjunt de validació).
  • Reduïu la bretxa del domini. Suposo que això es pot fer mitjançant una extensió específica de domini (per exemple, una extensió d’il·luminació) i mitjançant mètodes especialitzats (per exemple, https://arxiv.org/abs/1409.7495).
  • Utilitzeu una tècnica diferent d’aprenentatge mètric a distància. He provat aquest https://arxiv.org/abs/1703.07464, però funciona pitjor en el meu cas.
  • Recopileu més dades, és clar.

Demostració, codi i model format

Vaig fer una demostració del model. Podeu consultar-ho aquí: http://vps389544.ovh.net:5555/. Podeu penjar la vostra pròpia imatge per cercar o utilitzar una imatge aleatòria del conjunt de ressenyes.

Codi i model format: https://github.com/movchan74/street_to_shop_experiments

Gràcies per llegir. Si t’agrada l’article, fes-m’ho saber aplaudint. Si voleu més informació, podeu connectar amb mi a LinkedIn.