Sådan bruges fjernmetrisk læring til street-to-shop-problemer

Lad os starte med en definition af street-to-shop-problematik - identificere en modevare i et brugerbillede og finde det i en online shop. Har du nogensinde set nogen på gaden og tænkt ”Wow, dette er en dejlig kjole, jeg spekulerer på, hvor jeg kan købe den?” Jeg har ikke det. Men for mig var det den seje opgave at prøve teknikker til fjernundervisning. Jeg håber, at du også finder det interessant.

datasæt

For det første har vi brug for et datasæt til det. Faktisk kom jeg til denne idé, efter at jeg fandt ud af, at der er mange billeder taget af brugere på Aliexpress. Og jeg tænkte "Wow, jeg kan foretage en søgning efter billede ved hjælp af disse data, bare for sjov selvfølgelig". Jeg har besluttet at fokusere på kvinders top tøj for enkelhed.

Nedenfor er listen over de kategorier, jeg brugte til ophugning:

  • Kjoler
  • Bluser og skjorter
  • Hættetrøjer og sweatshirts
  • Trøjer
  • Jakker & frakker

Jeg brugte anmodninger og BeautifulSoup til ophugning. Sælgerbilleder kan fås fra hovedsiden af ​​varen, men for brugernes billeder skal vi gennem feedbacksider. Der er en ting, der kaldes "farver" på varens side. Farve kan kun være genstande af en anden farve eller endda helt andre genstande. Så vi vil betragte forskellige farver som forskellige genstande.

Du kan finde koden, som jeg har brugt til at få alle oplysninger om et emne (det skraber endnu mere, end vi har brug for vores opgave) ved at linke https://github.com/movchan74/street_to_shop_experiments/blob/master/get_item_info.py.

Alt, hvad vi har brug for, er at gå gennem søgesider efter hver kategori, tage URL-adresser til alle emner og bruge funktionen ovenfor til at få oplysninger om hvert enkelt emne.

Endelig har vi to sæt billeder til hvert element: billeder fra en sælger (felt-url for hvert element initem ['farver']) og billeder fra brugere (feltimgs for hvert element initem ['feedbacks']).

For hver farve har vi kun et billede fra en sælger, men det kan være mere end et billede for hver farve fra brugere (undertiden er der overhovedet ingen billeder til farve).

Store! Vi har data. Det indsamlede datasæt er dog støjende:

  • Der er støjende billeder fra brugere (fotos af pakkebokse, fotos af tekstur eller kun en del af en vare, udpakkede genstande, ikke-relaterede fotos).
Eksempler på støj i brugerens billeder.

For at afhjælpe dette problem har jeg mærket 5000 billeder i to kategorier: gode billeder og støjbilleder. I begyndelsen var min plan at træne en klassifikator til to kategorier og bruge det til at rense datasæt. Men senere besluttede jeg at overlade denne idé til fremtidig arbejde og tilføjede bare rensede billeder til test- og valideringssættene.

  • Det andet problem er, at der er varer, der sælges af flere sælgere. Sælgere har endda de samme billeder engang (eller let redigerede billeder). Men hvordan skal man håndtere det? Den nemmeste måde er ikke at gøre noget og bruge en robust algoritme til fjernmetrisk læring. Det kan dog påvirke valideringen, fordi vi kan have den samme vare i validerings- og træningsdataene. Så det fører til en datalækage. En anden måde er at bruge noget til at finde lignende (eller endda identiske billeder) og flette dem til et element. Vi kan bruge perseptuel hashing til at finde identiske billeder (som phash eller whash), eller vi kan træne en model på støjende data og anvende modellen til at finde lignende billeder. Jeg valgte den anden mulighed, fordi det muliggør sammenlægning af endda let redigerede billeder.

Afstandsmetrisk læring

En af de mest populære metriske fjernundervisningsmetoder er tripletab:

hvor max (x, 0) er hængselsfunktionen, d (x, y) er afstandsfunktionen mellem x og y, F (x) er dybt neuralt netværk, M er marginen, a er ankeret, p er det positive punkt, n er det negative punkt.

F (a), F (p), F (n) er punkter i højdimensionelt rum (indlejringer) produceret af et dybt neuralt netværk. Det er værd at nævne, at indlejringerne ofte skal normaliseres for at have enhedslængde, dvs. || x || = 1, for at være robust over for belysning og kontrastændringer og for træningsstabilitet. Ankeret og de positive prøver hører til den samme klasse, den negative prøve er forekomsten af ​​en anden klasse.

Så hovedideen med tripletabet er at adskille indlejringer af det positive par (anker og positivt) fra indbøjninger af det negative par (anker og negativ) med en afstandsmarginal M.

Men hvordan vælges tripletten (a, p, n)? Vi kan bare tilfældigt vælge prøver som en triplet, men det medfører følgende problemer. For det første er der N³ mulige tripletter. Det betyder, at vi har brug for meget tid til at gennemgå alle mulige tripletter. Men faktisk behøver vi ikke at gøre det, for efter få iterationer af træning vil der være mange tripletter, som ikke krænker tripletbegrænsningen (giver nultab). Det betyder, at disse trillinger er ubrugelige til en træning.

En af de mest almindelige måder til valg af triplet er hård negativ minedrift:

Valg af de hårdeste negativer kan i praksis føre til dårlige lokale minima tidligt i træningen. Specifikt kan det resultere i en sammenbrudt model (dvs. F (x) = 0). For at mindske dette kan vi bruge semi-hård negativ minedrift.

Halvharde negative prøver er længere væk fra ankeret end den positive prøve, men de er stadig hårde (krænker tripletbegrænsningen), fordi de ligger inden for margen M.

Betingelser for en triplet med semi-hård negativ prøve

Der er to måder at generere semi-hårde (og hårde) negative prøver på: online og offline.

  • Online betyder, at vi tilfældigt vælger prøver fra togets datasæt som en mini-batch og vælger tripletter fra prøver inde i det. Vi skal dog have en stor mini-batchstørrelse til online-metoden. Det er ikke muligt i mit tilfælde, fordi jeg kun har en GTX 1070 med 8 GB RAM.
  • I offline-metoden er vi nødt til at stoppe træningen efter nogen tid, forudsige indlejringer til en vis mængde prøver, vælge tripletter og træne model med disse tripletter. Det betyder, at vi er nødt til at gå fremadgående to gange, men det er prisen for offline-metoden.

Godt! Vi kan allerede nu begynde at træne modellen med tripletab og offline semi-hård negativ minedrift. Men! Der er altid et "men" i denne ufuldkomne verden. Vi har brug for endnu et trick for at løse street-to-shop-problemet. Vores opgave er at finde sælgers billede, der mest ligner brugerens billede. Normalt har sælgers billeder imidlertid meget bedre kvalitet (med hensyn til belysning, kamera, placering) end brugerens billeder, så vi har to domæner: sælgers billeder og brugers billeder. For at få en effektiv model er vi nødt til at reducere et mellemrum mellem disse to domæner. Dette problem kaldes domænetilpasning.

Venstre: brugerens billede, højre: sælgers billede

Jeg foreslår en rigtig enkel teknik til at reducere domænehuller: lad os vælge forankringer fra sælgers billeder, positive og negative prøver fra brugerens billeder. Det er alt! Enkel men effektiv.

Implementering

For at implementere mine ideer og til hurtigt at eksperimentere har jeg brugt Keras bibliotek med Tensorflow backend.

Jeg valgte Inception V3 model som base CNN til min model. Som sædvanligt initialiserede jeg CNN med ImageNet-vægte. Jeg har tilføjet to fuldt forbundne lag efter global pooling med L2-normalisering i slutningen af ​​netværket. Størrelsen på indlejring er 128.

Vi er også nødt til at implementere funktionen triple loss. Vi passerer ankeret, de positive / negative prøver som enkelt mini-batch og opdeler det i 3 tensorer inde i tabsfunktionen. Afstandsfunktionen er kvadratisk euklidisk afstand.

Og udarbejd model:

Eksperimentelle resultater

Indhentningsresultater. Første kolonne - forespørgsel (brugerbillede), næste 5 - mest lignende sælgers billeder.

Ydeevne måles med hensyn til tilbagekaldelse ved K (R @ K).

Lad os se, hvordan man beregner R @ K. Hver brugers billede fra valideringssæt blev brugt som en forespørgsel, og vi er nødt til at finde den tilsvarende sælgers billede. Vi tager et forespørgselsbillede, beregner indlejringsvektor og søger nærmeste naboer til denne vektor blandt vektorer af alle sælgers billeder. Vi bruger ikke kun sælgers billeder fra valideringssættet, men også billeder fra togsættet, fordi det giver mulighed for at øge antallet af distraherende og gør vores opgave mere udfordrende.

Så vi har et forespørgselsbillede og en liste over de mest lignende sælgers billeder. Hvis der er et tilsvarende sælgerbillede i K mest lignende billeder, returnerer vi 1 for denne forespørgsel ellers returnerer 0. Nu skal vi gøre det til hver brugers billede i valideringssættet og finde et gennemsnit af scoringer fra hver forespørgsel. Det vil være R @ K.

Som jeg sagde før, har jeg renset den lille mængde brugers billeder fra støjende billeder. Så jeg har målt en kvalitet på modellen på to valideringsdatasæt: fuldt valideringssæt og et undersæt med kun rene billeder.

R @ K for valideringsdata

Resultaterne er langt fra ideelle, der er mange ting at gøre:

  • Rengør brugerens billeder fra støj. Jeg gjorde allerede første skridt i denne retning ved at rense et lille sæt.
  • Flet elementer mere nøjagtigt (i det mindste i valideringssættet).
  • Reducer domænehul. Jeg formoder, at det kan ske ved domænespecifik augmentation (for eksempel belysning augmentation) og ved at bruge specialiserede metoder (som denne https://arxiv.org/abs/1409.7495).
  • Anvend en anden metrisk fjernundervisningsteknik. Jeg har prøvet denne https://arxiv.org/abs/1703.07464, men det fungerer dårligere i mit tilfælde.
  • Indsamle selvfølgelig flere data.

Demo, kode og trænet model

Jeg har lavet en demo af modellen. Du kan tjekke det her: http://vps389544.ovh.net:5555/. Du kan uploade dit eget billede til søgning eller bruge tilfældigt billede fra valideringssæt.

Kode og trænet model: https://github.com/movchan74/street_to_shop_experiments

Tak for at have læst. Hvis du nyder artiklen, så fortæl mig det ved at klappe. Hvis du ønsker mere information, kan du oprette forbindelse til mig på LinkedIn.