Kuidas kasutada kaugmõõdiku õpet tänavapoe probleemile

Alustame probleemiga, mis puudutab tänavat-poodi - kasutajapildis moeeseme tuvastamine ja veebipoes leidmine. Kas olete kunagi näinud kedagi tänaval ja mõelnud: “Vau, see on kena kleit, ma ei tea, kust seda osta saab?” Mul pole seda. Kuid minu jaoks oli lahe ülesanne proovida kaugmõõdiku õppe tehnikaid. Loodan, et ka teil on see huvitav.

Andmekogum

Esiteks vajame selle jaoks andmekogumit. Tegelikult jõudsin selle mõtteni selleni, et sain teada, et Aliexpressis on palju kasutaja tehtud pilte. Ja ma mõtlesin, et "vau, ma saan neid andmeid kasutades pildi järgi otsida, muidugi lihtsalt lõbu pärast". Olen otsustanud lihtsuse huvides keskenduda naiste pealisrõivastele.

Allpool on loetelu kategooriatest, mida kasutasin vanametalliks:

  • Kleidid
  • Pluusid ja särgid
  • Pusad ja dressipluusid
  • Kampsunid
  • Joped ja mantlid

Kasutasin vanarauaks päringuid ja BeautifulSoupi. Müüja pilte saab saada üksuse põhilehelt, kuid kasutaja piltide jaoks peame läbima tagasiside lehed. Üksuse lehel on asi, mida nimetatakse värvideks. Värv võib olla lihtsalt mõne teise värvi ese või isegi täiesti muu toode. Niisiis käsitleme erinevaid värve erinevate esemetena.

Üksuse lehel „Värvid”

Koodi, mida olen kasutanud kogu teabe saamiseks ühe üksuse kohta (see kraabib isegi rohkem, kui me oma ülesande jaoks vajame), leiate lingi https://github.com/movchan74/street_to_shop_experiments/blob/master/get_item_info.py kaudu.

Kõik, mida vajame, on liikuda läbi otsingukategooriad iga kategooria kaupa, võtta kõigi üksuste URL-id ja kasutada ülaltoodud funktsiooni iga üksuse kohta teabe saamiseks.

Lõpuks on meil iga üksuse jaoks kaks pildikomplekti: pildid müüjalt (välja elementide URL-id iga elemendi algoritmil ['värvid']) ja kasutajate pildid (iga elemendi algoritmi väljade pildid ['tagasisidete']).

Iga värvi kohta on meil ainult üks pilt müüjalt, kuid kasutajal võib see olla rohkem kui üks pilt iga värvi kohta (mõnikord pole värvi jaoks üldse pilte).

Tore! Saime andmeid. Kogutud andmestik on siiski mürarikas:

  • Kasutajate poolt on mürarikkaid pilte (pakendikastide fotod, tekstuuri fotod või eseme ainult mõni osa, pakkimata kaubad, sõltumatud fotod).
Näited kasutaja piltide mürast.

Selle probleemi leevendamiseks olen nimetanud 5000 pildi kahte kategooriasse: head pildid ja mürapildid. Alguses oli minu plaan koolitada kahe kategooria klassifikaator ja kasutada seda andmestiku puhastamiseks. Kuid hiljem otsustasin jätta selle idee edaspidiseks tööks ja lisasin lihtsalt puhastatud pildid testi- ja valideerimiskomplektidesse.

  • Teine probleem on üksused, mida müüvad mitu müüjat. Müüjatel on millalgi isegi samad pildid (või veidi muudetud pildid). Aga kuidas sellega toime tulla? Lihtsaim viis on mitte midagi teha ja kasutada kaugmõõdiku õppimiseks kindlat algoritmi. See võib siiski valideerimist mõjutada, kuna meil võib sama teema olla ka valideerimis- ja koolitusandmetes. Nii et see viib andmete lekkeni. Teine võimalus on kasutada midagi sarnaste (või isegi identsete piltide) leidmiseks ja nende ühendamiseks üheks elemendiks. Saame identsete piltide (näiteks faaside või whashide) leidmiseks kasutada tajumise räsimist või koolitada mudelit mürarohketel andmetel ja rakendada mudelit sarnaste piltide leidmiseks. Valisin teise variandi, kuna see võimaldab ühendada isegi pisut redigeeritud pilte.

Kaugõpe

Üks populaarsemaid kaugmõõdikute õppimismeetodeid on kolmikute kaotus:

kus max (x, 0) on liigendfunktsioon, d (x, y) on kauguse funktsioon x ja y vahel, F (x) on sügav närvivõrk, M on veeris, a on ankur, p on positiivne punkt, n on negatiivne punkt.

F (a), F (p), F (n) on kõrgmõõtmelises ruumis (manused) asuvad punktid, mille tekitab sügav närvivõrk. Väärib märkimist, et manustamist tuleb sageli normaliseerida, et sellel oleks ühiku pikkus, s.o || x || = 1, et olla vastupidav valgustuse ja kontrastsuse muutuste suhtes ning treenida stabiilselt. Ankur ja positiivsed proovid kuuluvad samasse klassi, negatiivne proov on teise klassi näide.

Niisiis on kolmikute kaotuse peamine idee eraldada positiivse paari (ankur ja positiivne) manused negatiivse paari (ankur ja negatiiv) manustamistest kauguse M abil.

Kuid kuidas valida kolmik (a, p, n)? Saame proovid lihtsalt juhuslikult valida kolmikuna, kuid see põhjustab järgmisi probleeme. Esiteks on võimalik N³ kolmikuid. See tähendab, et vajame kõigi võimalike kolmikute läbimiseks palju aega. Kuid tegelikult ei ole meil seda vaja teha, sest pärast väheseid treeningute korduvusi on palju kolmikuid, mis ei riku kolmikute piiranguid (annavad nulli kaotuse). See tähendab, et need kolmikud on koolituse jaoks kasutud.

Üks levinumaid kolmikute valimise viise on kõva negatiivne kaevandamine:

Kõige raskemate negatiivide valimine võib praktikas viia juba koolituse alguses halbade kohalike miinimumideni. Täpsemalt, selle tulemuseks võib olla ahendatud mudel (st F (x) = 0). Selle leevendamiseks võime kasutada poolkõva negatiivset kaevandamist.

Poolkõvad negatiivsed proovid asuvad ankrust kaugemal kui positiivsed proovid, kuid need on endiselt kõvad (rikuvad kolmikute piiranguid), kuna asuvad marginaali M sees.

Poolkõva negatiivse prooviga kolmiku tingimused

Poolkõvade (ja kõvade) negatiivsete proovide genereerimiseks on kaks võimalust: veebis ja mujal.

  • Veebipõhine tähendab, et valime juhuslikult rongide andmekogumist proovid minikomplektina ja valime selle sees olevatest proovidest kolmikud. Kuid võrgumeetodi jaoks peab meil olema suur mini-partii suurus. Minu puhul pole see võimalik, kuna mul on ainult üks GTG 1070 koos 8Gb RAM-iga.
  • Võrguühenduseta meetodi puhul peame mõne aja pärast koolituse katkestama, ennustama teatud hulga proovide manustamist, valima kolmikud ja treenima nende kolmikutega mudeli. See tähendab, et peame kaks korda edastama, kuid see on offline-meetodi hind.

Tore! Juba saame hakata mudelit treenima nii kolmikute kadude kui ka poolkõva negatiivse kaevandamise korral. Aga! Selles ebatäiuslikus maailmas on alati "aga". Tänavate vahelise probleemi edukaks lahendamiseks on vaja veel ühte trikki. Meie ülesanne on leida müüja pilt, mis on kasutaja kujutisega kõige sarnasem. Tavaliselt on müüja piltidel siiski palju parem kvaliteet (valgustuse, kaamera, positsiooni osas) kui kasutaja piltidel, nii et meil on kaks domeeni: müüja ja kasutaja pildid. Tõhusa mudeli saamiseks peame vähendama lõhet nende kahe valdkonna vahel. Seda probleemi nimetatakse domeeni kohanemiseks.

Vasakul: kasutaja pilt, paremal: müüja pilt

Pakun välja domeeni lõhe vähendamiseks tõeliselt lihtsa meetodi: valime müüja piltide seast ankrud, kasutaja piltide positiivsed ja negatiivsed proovid. See on kõik! Lihtne, kuid tõhus.

Rakendamine

Oma ideede elluviimiseks ja kiirete katsete tegemiseks olen kasutanud Kerase teeki koos Tensorflow taustaprogrammiga.

Valisin oma mudeli jaoks CNN-na Inception V3 mudeli. Nagu tavaliselt, vormindasin CNN-i ImageNeti kaaludega. Olen lisanud kaks täielikult ühendatud kihti pärast globaalset ühendamist koos L2-normaliseerimisega võrgu lõpus. Manustamise suurus on 128.

Peame rakendama ka kolmekordse kadude funktsiooni. Me läbime ankru, positiivsed / negatiivsed proovid ühe minikomplektina ja jaotame selle 3 funktsiooni kaotusfunktsiooni sees olevaks tenoriks. Kauguse funktsioon on eukleidiline vahemaa ruudus.

Ja koostage mudel:

Katsetulemused

Otsingu tulemused. Esimene veerg - päring (kasutaja pilt), järgmine 5 - kõige sarnasema müüja pildid.

Toimivust mõõdetakse tagasivõtmise teel temperatuuril K (R @ K).

Vaatame, kuidas arvutada R @ K. Iga kasutaja valideerimiskomplekti pilti kasutati päringuna ja me peame leidma vastava müüja pildi. Võtame ühe päringupildi, arvutame manustamisvektori ja otsime selle vektori lähimad naabrid kõigi müüja piltide vektorite hulgast. Me ei kasuta mitte ainult müüja pilte valideerimiskomplektist, vaid ka rongikomplekti pilte, kuna see võimaldab suurendada häirete tekitajate arvu ja muudab meie ülesande keerukamaks.

Nii et meil on päringupilt ja loetelu kõige sarnasematest müüja piltidest. Kui K-sarnasemas pildis on vastav müüjapilt, siis tagastame selle päringu korral vastuse 1 korral vastuse korral 0. Nüüd peame selle valideerimiskomplekti iga kasutaja pildi jaoks leidma ja leidma iga päringu keskmised hinded. Sellest saab R @ K.

Nagu ma juba ütlesin, olen väikese osa kasutaja piltidest mürarikast pilti puhastanud. Niisiis olen mõõtnud mudeli kvaliteeti kahel valideerimise andmekogumil: täielik valideerimise komplekt ja ainult puhaste piltide alamhulk.

R @ K valideerimisandmete jaoks

Tulemused pole kaugeltki ideaalsed, teha on palju asju:

  • Puhastage kasutaja pildid mürast. Tegin juba esimese sammu selles suunas, puhastades väikese komplekti.
  • Ühendage üksused täpsemalt (vähemalt valideerimiskomplektis).
  • Vähendage domeenivahet. Ma arvan, et seda saab teha domeenispetsiifilise suurendamise (näiteks valgustuse suurendamise) abil ja kasutades spetsiaalseid meetodeid (nt see https://arxiv.org/abs/1409.7495).
  • Kasutage mõnda muud kaugmõõdiku õppe tehnikat. Olen seda ühte https://arxiv.org/abs/1703.07464 proovinud, kuid see töötab minu puhul halvemini.
  • Koguge muidugi rohkem andmeid.

Demo, kood ja koolitatud mudel

Olen teinud mudeli demo. Seda saate vaadata siit: http://vps389544.ovh.net:5555/. Saate otsingu jaoks üles laadida oma pildi või kasutada kinnituskomplekti juhuslikku pilti.

Kood ja koolitatud mudel: https://github.com/movchan74/street_to_shop_experiments

Täname, et lugesite Kui teile artikkel meeldib, andke mulle sellest plaksutades teada. Kui soovite lisateavet, saate minuga LinkedInis ühendust võtta.