Billedgenkendelse afmystificeret

Intet inden for maskinindlæring fanger fantasien, ligesom evnen til at genkende billeder. Identificerende billeder skal betegne "intelligens", ikke? Lad os afmystificere.

Evnen til at "se", når det kommer til software, begynder med evnen til at klassificere. Klassificering er mønstermatchning med data. Billeder er data i form af 2-dimensionelle matricer.

Billedgenkendelse klassificerer data i en spand ud af mange. Dette er nyttigt arbejde: du kan klassificere et helt billede eller ting i et billede.

En af de klassiske og ret nyttige applikationer til billedklassificering er optisk karaktergenkendelse (OCR): at gå fra billeder af skriftsprog til struktureret tekst .

Dette kan gøres for ethvert alfabet og en bred vifte af skrivestile.

Trin i processen

Vi bygger kode til at genkende numeriske cifre i billeder og vise, hvordan dette fungerer. Dette tager 3 trin:

  1. indsamle og organisere data at arbejde med (85% af indsatsen)
  2. opbygge og teste en forudsigende model (10% af indsatsen)
  3. Brug modellen til at genkende billeder (5% af indsatsen)

Forberedelse af data er langt den største del af vores arbejde, dette gælder for de fleste datalogiske arbejde . Der er en grund til, at det hedder DATA science!

Opbygningen af ​​vores forudsigelige model og dens anvendelse til forudsigelse af værdier er al matematik . Vi bruger software til at gentage gennem data, til iterativt at smede "vægte" inden for matematiske ligninger og til at arbejde med datastrukturer. Softwaren er ikke ”intelligent”, det fungerer matematiske ligninger for at udføre det snævre vidensarbejde, i dette tilfælde: genkende billeder af cifre.

I praksis er det meste af det, folk mærker ”AI”, egentlig kun software, der udfører vidensarbejde.

Vores forudsigelige model og data

Vi bruger en af ​​de enkleste forudsigelige modeller: "k-nærmeste naboer" eller "kNN" regression, først udgivet af E. Fix, JL Hodges i 1952.

En simpel forklaring på denne algoritme er her og en video af dens matematik her. Og også her for dem, der ønsker at opbygge algoritmen fra bunden.

Sådan fungerer det: forestil dig en graf over datapunkter og cirkler, der fanger k-punkter, med hver værdi af k valideret i forhold til dine data.

Valideringsfejlen for k i dine data har et minimum, der kan bestemmes.

I betragtning af den 'bedste' værdi for k kan du klassificere andre punkter med en vis grad af præcision.

Vi bruger scikit learns kNN-algoritme for at undgå at opbygge matematikken selv. Bekvemt giver dette bibliotek os også vores billeddata.

Lad os begynde.

Koden er her, vi bruger iPython notebook, som er en produktiv måde at arbejde på datavidenskabelige projekter på. Kodesyntaxen er Python, og vores eksempel er lånt fra sk-learn.

Start med at importere de nødvendige biblioteker:

Dernæst organiserer vi vores data:

training images: 1527, test images: 269

Du kan manipulere fraktionen og have mere eller mindre testdata, vi ser snart, hvordan dette påvirker vores models nøjagtighed.

Nu spekulerer du sandsynligvis på: hvordan er de cifrede billeder organiseret? De er matrixer af værdier, en for hver pixel i et 8x8 billede. Lad os inspicere en.

# one-dimension[ 0. 1. 13. 16. 15. 5. 0. 0. 0. 4. 16. 7. 14. 12. 0. 0. 0. 3. 12. 2. 11. 10. 0. 0. 0. 0. 0. 0. 14. 8. 0. 0. 0. 0. 0. 3. 16. 4. 0. 0. 0. 0. 1. 11. 13. 0. 0. 0. 0. 0. 9. 16. 14. 16. 7. 0. 0. 1. 16. 16. 15. 12. 5. 0.]
# two-dimensions[[ 0. 1. 13. 16. 15. 5. 0. 0.] [ 0. 4. 16. 7. 14. 12. 0. 0.] [ 0. 3. 12. 2. 11. 10. 0. 0.] [ 0. 0. 0. 0. 14. 8. 0. 0.] [ 0. 0. 0. 3. 16. 4. 0. 0.] [ 0. 0. 1. 11. 13. 0. 0. 0.] [ 0. 0. 9. 16. 14. 16. 7. 0.] [ 0. 1. 16. 16. 15. 12. 5. 0.]]

De samme billeddata vises som et fladt (endimensionelt) array og igen som et 8x8 array i et array (todimensionalt). Tænk på hver række i billedet som en matrix på 8 pixels, der er 8 rækker. Vi kunne ignorere gråskalaen (værdierne) og arbejde med 0 og 1, hvilket ville forenkle matematikken en smule.

Vi kan 'plotte' dette for at se dette array i dets 'pixelerede' form.

Hvilket ciffer er dette? Lad os spørge vores model, men først skal vi bygge den.

KNN score: 0.951852

I modsætning til vores testdata havde vores nærmeste nabo-model en nøjagtighedsscore på 95%, ikke dårligt. Gå tilbage og skift 'brøk' -værdien for at se, hvordan dette påvirker scoren.

array([2])

Modellen forudsiger, at arrayet vist ovenfor er et ' 2 ', som ser korrekt ud.

Lad os prøve et par mere, husk at dette er cifre fra vores testdata , vi brugte ikke disse billeder til at opbygge vores model (meget vigtigt).

Ikke dårligt.

Vi kan oprette et fiktivt ciffer og se, hvad vores model synes om det.

Hvis vi havde en samling af meningsløse cifferbilleder, kunne vi tilføje dem til vores træning med et ikke-numerisk mærke - bare en anden klassifikation.

Så hvordan fungerer billedgenkendelse?

  • billeddata er organiseret : både træning og test med etiketter (X, y)

Træningsdata holdes adskilt fra testdata, hvilket også betyder, at vi fjerner dubletter (eller næsten dubletter) mellem dem.

  • en model er bygget ved hjælp af en af ​​adskillige matematiske modeller (kNN, logistisk regression, konvolutionsneuralt netværk osv.)

Which type of model you choose depends on your data and the type and complexity of the classification work.

  • new data is put into the model to generate a prediction

This is lighting fast: the result of a single mathematical calculation.

If you have a collection of pictures with and without cats, you can build a model to classify if a picture contains a cat. Notice you need training images that are devoid of any cats for this to work.

Of course you can apply multiple models to a picture and identify several things.

Large Data

A significant challenge in all of this is the size of each image since 8x8 is not a reasonable image size for anything but small digits, it’s not uncommon to be dealing with 500x500 pixel images, or larger. That’s 250,000 pixels per image, so 10,000 images of training means doing math on 2.5Billion values to build a model. And the math isn’t just addition or multiplication: we’re multiplying matrices, multiplying by floating-point weights, calculating derivatives. This is why processing power (and memory) is key in certain machine learning applications.

There are strategies to deal with this image size problem:

  • use hardware graphic processor units (GPUs) to speed up the math
  • reduce images to smaller dimensions, without losing clarity
  • reducer farver til gråskala og gradienter (du kan stadig se katten)
  • se på sektioner af et billede for at finde det, du leder efter

Den gode nyhed er, når der først er bygget en model, uanset hvor besværlig den var, forudsigelsen er hurtig. Billedbehandling bruges i applikationer, der spænder fra ansigtsgenkendelse til OCR til selvkørende biler.

Nu forstår du det grundlæggende i, hvordan dette fungerer.