Kuinka soveltaa etäisyysmittareita Street-to-Shop -ongelmaan

Aloitetaan määritelmällä street-to-shop-ongelma - muotituotteen tunnistaminen käyttäjän kuvassa ja löytäminen verkkokaupasta. Oletko koskaan nähnyt joku kadulla ja ajatellut ”Vau, tämä on mukava mekko, ihmettelen, mistä voin ostaa sen?” En ole. Minulle se oli siisti tehtävä kokeilla etämetrisen oppimisen tekniikoita. Toivon, että löydät siitä myös mielenkiintoisen.

aineisto

Ensinnäkin tarvitsemme sitä varten tietojoukon. Oikeastaan ​​tulin tähän ajatukseen saatuaani tietää, että Aliexpressissä on tonnia käyttäjien ottamia kuvia. Ja ajattelin: "Vau, voin tehdä kuvanhaun näiden tietojen avulla, tietysti hauskanpitoa varten". Olen päättänyt keskittyä naisten päähineisiin yksinkertaisuuden vuoksi.

Alla on luettelo luokista, joita käytin romuttamiseen:

  • Mekot
  • Paitapuserot ja paidat
  • Hupparit
  • neuleet
  • Takit ja takit

Käytin romuttamiseen pyyntöjä ja BeautifulSoupia. Myyjän kuvia voi saada tuotteen pääsivulta, mutta käyttäjän kuvien saamiseksi meidän täytyy käydä palautussivujen läpi. Tuotteen sivulla on asia, jota kutsutaan väreiksi. Väri voi olla vain toisen värin esine tai jopa kokonaan toinen esine. Joten harkitsemme erilaisia ​​värejä eri esineinä.

”Värit” esineen sivulta

Löydät koodin, jota olen käyttänyt saadaksenne kaikki tiedot yhdestä tuotteesta (se romuttaa jopa enemmän kuin tarvitsemme tehtäväämme) linkistä https://github.com/movchan74/street_to_shop_experiments/blob/master/get_item_info.py.

Tarvitsemme vain käydä läpi kunkin luokan hakusivut, ottaa kaikkien esineiden URL-osoitteet ja käyttää yllä olevaa toimintoa saadaksesi tietoja jokaisesta tuotteesta.

Lopuksi, meillä on kaksi kuvajoukkoa jokaisesta tuotteesta: myyjän kuvat (kenttien URL-osoitteet jokaiselle elementin aloitukselle ['värit']) ja käyttäjien kuvat (kenttämerkit jokaiselle alkioalustalle ['palautteet']).

Kullakin värillä meillä on vain yksi kuva myyjältä, mutta se voi olla useampi kuin yksi kuva jokaiselta käyttäjän käyttämältä väriltä (joskus väreissä ei ole lainkaan kuvia).

Loistava! Meillä on tietoja. Kerätty aineisto on kuitenkin meluisa:

  • Käyttäjiltä löytyy meluisia kuvia (valokuvia pakkauslaatikoista, valokuvia tekstuurista tai vain osa tuotteesta, pakkaamattomat tuotteet, etuyhteydettömät valokuvat).
Esimerkkejä melusta käyttäjän kuvissa.

Tämän ongelman lieventämiseksi olen luokitellut 5000 kuvaa kahteen luokkaan: hyvät kuvat ja kohinakuvat. Aluksi suunnitelmani oli kouluttaa kahden luokan luokittelulaite ja käyttää sitä tietoaineiston puhdistamiseen. Mutta myöhemmin päätin jättää tämän idean tulevalle työlle ja lisäsin juuri puhdistetut kuvat testi- ja validointijoukkoihin.

  • Toinen ongelma on, että on tavaroita, joita myyvät useat myyjät. Myyjillä on jopa samat kuvat joskus (tai hiukan muokattuja kuvia). Mutta miten käsitellä sitä? Helpoin tapa on tehdä mitään ja käyttää vankkaa algoritmia etäisyysmittariin. Se voi kuitenkin vaikuttaa validointiin, koska meillä voi olla sama kohde validointi- ja koulutustiedoissa. Joten se johtaa tietovuotoon. Toinen tapa on löytää jotain löytää samanlaisia ​​(tai jopa samanlaisia ​​kuvia) ja yhdistää ne yhdeksi esineeksi. Voimme käyttää havainnollista hajauttamista samanlaisten kuvien löytämiseen (kuten faasi tai whash), tai voimme kouluttaa mallin meluisasta tiedosta ja soveltaa mallia samanlaisten kuvien löytämiseen. Valitsin toisen vaihtoehdon, koska se sallii jopa hiukan muokattujen kuvien yhdistämisen.

Etämittarit

Yksi suosituimmista etäisyysmittarin oppimismenetelmistä on triplettitappio:

missä max (x, 0) on saranafunktio, d (x, y) on etäisyysfunktio x: n ja y: n välillä, F (x) on syvä hermoverkko, M on marginaali, a on ankkuri, p on positiivinen piste, n on negatiivinen piste.

F (a), F (p), F (n) ovat pisteitä korkean ulottuvuuden tilassa (upotukset), jotka syvä hermoverkko tuottaa. On syytä mainita, että upotukset on usein normalisoitava, jotta niillä olisi yksikköpituus, ts. || x || = 1, jotta se olisi kestävä valaistus- ja kontrastimuutoksille sekä harjoituksen vakaudelle. Ankkuri ja positiiviset näytteet kuuluvat samaan luokkaan, negatiivinen näyte on toisen luokan esimerkki.

Joten kolmikantamenetyksen pääidea on erottaa positiivisen parin upotukset (ankkuri ja positiivinen) negatiivisen parin upotuksista (ankkuri ja negatiivinen) etäisyydellä M.

Mutta kuinka valita tripletti (a, p, n)? Voimme vain satunnaisesti valita näytteitä kolminkertaiseksi, mutta se aiheuttaa seuraavia ongelmia. Ensinnäkin on olemassa N³ mahdollisia triplettejä. Se tarkoittaa, että tarvitsemme paljon aikaa kaikkien mahdollisten triplettien läpi. Mutta itse asiassa meidän ei tarvitse tehdä sitä, koska muutaman harjoittelun toiston jälkeen on monia triplettejä, jotka eivät riko triplettirajoitusta (aiheuttavat nollahäviön). Se tarkoittaa, että nämä kolmoset ovat turhia koulutuksessa.

Yksi yleisimmistä tavoista triplettien valinnassa on kova negatiivinen kaivostoiminta:

Vaikeimpien negatiivien valinta voi käytännössä johtaa huonoihin paikallisiin minimiharjoitteluihin jo varhaisessa vaiheessa. Erityisesti se voi johtaa romahtuneeseen malliin (ts. F (x) = 0). Tämän lieventämiseksi voimme käyttää puolikovaa negatiivista kaivosta.

Puolivaikeat negatiiviset näytteet ovat kauempana ankkurista kuin positiiviset näytteet, mutta ne ovat silti kovia (rikkovat kolmoisrajoitusta), koska ne sijaitsevat marginaalin M sisällä.

Edellytykset kolmikannalle, jossa on puolikova negatiivinen näyte

Puolikova (ja kova) negatiivisen näytteen luominen on kaksi tapaa: online ja offline.

  • Online tarkoittaa, että valitsemme satunnaisesti näytteet junarekisteristä minieräksi ja valitsemme kolmoisryhmät näytteistä sen sisällä. Meillä on kuitenkin oltava suuri minierä koko online-menetelmää varten. Se ei ole mahdollista minun tapauksessani, koska minulla on vain yksi GTX 1070 ja 8 Gt RAM-muistia.
  • Offline-menetelmässä meidän on lopetettava harjoittelu jonkin ajan kuluttua, ennustettava upotuksia tietylle määrälle näytteitä, valittava kolmoset ja harjoiteltava malli näillä kolmoilla. Se tarkoittaa, että meidän on tehtävä eteenpäin kaksi kertaa, mutta se on offline-menetelmän hinta.

Hyvä! Voimme jo alkaa kouluttaa mallia kolmoismenetyksellä ja offline-puolikiinteillä negatiivisilla kaivoksilla. Mutta! Tässä puutteellisessa maailmassa on aina "mutta". Tarvitsemme vielä yhden tempun onnistuneesti ratkaisemaan katukaupasta -ongelman. Tehtävämme on löytää myyjän imago, joka on kaikkein samanlainen kuin käyttäjän kuva. Yleensä myyjän kuvilla on kuitenkin paljon parempi laatu (valaistuksen, kameran, sijainnin suhteen) kuin käyttäjän kuvilla, joten meillä on kaksi verkkotunnusta: myyjän ja käyttäjän kuvat. Tehokkaan mallin saamiseksi meidän on vähennettävä kuilua näiden kahden alueen välillä. Tätä ongelmaa kutsutaan verkkotunnuksen mukautukseksi.

Vasen: käyttäjän kuva, oikea: myyjän kuva

Ehdotan todella yksinkertaista tekniikkaa verkkotunnuksen aukon vähentämiseksi: Valitaan ankkurit myyjän kuvista, positiiviset ja negatiiviset näytteet käyttäjän kuvista. Siinä kaikki! Yksinkertainen mutta tehokas.

täytäntöönpano

Ideoideni toteuttamiseksi ja nopean kokeilun tekemiseen olen käyttänyt Keras-kirjastoa Tensorflow-taustajärjestelmällä.

Valitsin Inception V3 -mallin mallin perus CNN: ksi. Kuten yleensä, alustain CNN: n ImageNet-painoilla. Olen lisännyt kaksi täysin kytkettyä kerrosta globaalin yhdistämisen jälkeen L2-normalisoinnin avulla verkon lopussa. Upotuskoko on 128.

Meidän on myös otettava käyttöön kolmoismenetyksen toiminto. Läpäisemme ankkurin, positiiviset / negatiiviset näytteet yhtenä minieränä ja jaamme sen kolmeen tenoriin häviötoiminnon sisällä. Etäisyysfunktio on neliöinen euklidinen etäisyys.

Ja koota malli:

Kokeelliset tulokset

Hakutulokset. Ensimmäinen sarake - kysely (käyttäjän kuva), seuraava 5 - samankaltaisimman myyjän kuvat.

Suorituskyky mitataan vetäytymisen suhteen kohdasta K (R @ K).

Katsotaanpa kuinka laskea R @ K. Jokaisen käyttäjän validointijoukon kuvaa käytettiin kyselynä ja meidän on löydettävä vastaavan myyjän kuva. Otetaan yksi kyselykuva, lasketaan upotusvektori ja haetaan tämän vektorin lähimmistä naapureista myyjän kaikkien kuvien vektorien joukosta. Käytämme paitsi myyjän kuvia validointijoukosta, myös kuvia junajoukosta, koska se mahdollistaa häiriöiden lisäämisen ja tekee tehtävästämme haastavamman.

Joten meillä on kyselykuva ja luettelo samankaltaisimmista myyjän kuvista. Jos K: n samankaltaisimmassa kuvassa on vastaava myyjäkuva, palautamme 1 tälle kyselylle muut tuotot 0. Nyt meidän on tehtävä se jokaiselle käyttäjän validointijoukon kuvalle ja löydettävä kunkin kyselyn pisteiden keskiarvo. Se on R @ K.

Kuten aiemmin totesin, olen puhdistanut pienen määrän käyttäjän kuvia meluisista kuvista. Joten olen mitannut mallin laadun kahdessa validointitietokokonaisuudessa: täydellisessä validointijoukossa ja vain puhtaiden kuvien alajoukossa.

R @ K validointitietoihin

Tulokset eivät ole kaukana ihanteellisista, tekemistä on paljon:

  • Puhdista käyttäjän kuvat melusta. Astuin jo ensin tähän suuntaan puhdistamalla pienen sarjan.
  • Yhdistä kohteet tarkemmin (ainakin validointijoukossa).
  • Pienennä verkkotunnuksen aukkoa. Oletan, että se voidaan tehdä verkkotunnuskohtaisella lisäyksellä (esimerkiksi valaistuslisäys) ja käyttämällä erikoistuneita menetelmiä (kuten tämä https://arxiv.org/abs/1409.7495).
  • Käytä toista etäisyysmittarin oppimistekniikkaa. Olen kokeillut tätä https://arxiv.org/abs/1703.07464, mutta se toimii minun tapauksessani huonommin.
  • Kerää tietysti enemmän tietoja.

Demo, koodi ja koulutettu malli

Olen tehnyt mallin esittelyn. Voit tarkistaa sen täältä: http://vps389544.ovh.net:5555/. Voit lähettää oman kuvan hakua varten tai käyttää satunnaista kuvaa validointijoukosta.

Koodi ja koulutettu malli: https://github.com/movchan74/street_to_shop_experiments

Kiitos käsittelystä. Jos nautit artikkelista, kerro siitä minulle taputtamalla. Jos haluat lisätietoja, voit ottaa minuun yhteyttä LinkedInissä.