sql >> Databasteknik >  >> RDS >> MariaDB

Del 1:Bildklassificering med MariaDB Server och TensorFlow – en översikt

Spjutspetsföretag vänder sig till artificiell intelligens och maskininlärning för att möta utmaningarna i den nya digitala affärstransformationseran.

Enligt Gartner:"87 procent av seniora företagsledare säger att digitalisering är en företagsprioritet och 79% av företagsstrateger säger att det återuppfinner deras verksamhet – skapar nya intäktsströmmar på nya sätt ".

Källa :Gartner, Speed ​​Up Your Digital Business Transformation, 15 januari 2019

Men hittills har den digitala förändringen varit utmanande. Komplexiteten i verktygen, arkitekturen och miljön skapar hinder för att använda maskininlärning. Att använda SQL-baserad relationsdatahantering för att lagra och utföra datautforskning av bilder minskar barriärerna och låser upp fördelarna med maskininlärning.

Det här blogginlägget visar hur man använder populära open source-verktyg MariaDB Server, TensorFlow Python-biblioteket och Keras neurala nätverksbibliotek för att förenkla komplexiteten i att implementera maskininlärning. Att använda dessa tekniker kan hjälpa dig att påskynda din tid till marknad genom att effektivt komma åt, uppdatera, infoga, manipulera och modifiera data.

Machine Learning på relationsdatabaser

I centrum för den digitala affärstransformationen som möjliggörs av maskininlärning är teknologier som chatbots, rekommendationsmotorer, personlig kommunikation, intelligent annonsinriktning och bildklassificering.

Bildklassificering har ett brett utbud av användningsfall – från brottsbekämpning och militär, till detaljhandel och självkörande bilar. När den implementeras med maskininlärning kan bildklassificering ge affärsintelligens i realtid. Syftet med bildklassificering är att identifiera och skildra, som en unik grånivå (eller färg), de egenskaper som förekommer i en bild. De vanligaste verktygen för bildklassificering är TensorFlow och Keras.

TensorFlow är ett Python-bibliotek för snabb numerisk beräkning skapad och släppt av Google. MariaDB Server är en relationsdatabas med öppen källkod med ett SQL-gränssnitt för att komma åt och hantera data. Keras är ett neuralt nätverksbibliotek med öppen källkod skrivet i Python.

I det här inlägget kommer du att upptäcka hur du testar bildklassificering genom att möjliggöra interoperabilitet mellan TensorFlow och MariaDB Server. Det här inlägget använder Fashion MNIST-datauppsättningen som innehåller 70 000 gråskalebilder i 10 kategorier. Bilderna visar enskilda klädesplagg med låg upplösning (28 x 28 pixlar).

Att ladda och förbereda data till MariaDB Server är utanför omfattningen av detta inlägg. Följande tabeller har skapats och fyllts i i förväg med Fashion MNIST-datauppsättningen.

Bilder Bildroll Bildetikett
CREATE TABLE tf_images (
 img_label tinyint(4),
 img_vector blob,
 img_idx    int(10) unsigned NOT NULL,
 img_blob   blob,
 img_use 4)  tinyint /> ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
CREATE TABLE img_use (
 use_id tinyint(4) NOT NULL AUTO_INCREMENT,
 use_name varchar(10) NOT NULL,
 use_desc varchar(100) NOT NULL,
 PRIMARY KEY (use_id)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4
CREATE TABLE categories (
 class_idx tinyint(4) NOT NULL,
 class_name char(20) DEFAULT NULL,
 PRIMARY KEY (class_idx)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

Datautforskning

Följande bibliotek används för att utföra grundläggande datautforskning med MariaDB Server:

  1. io Modulen tillhandahåller Pythons huvudfaciliteter för att hantera olika typer av I/O.
  2. Matplotlib är ett Python 2D-ritningsbibliotek för att producera en mängd olika grafer över plattformar.
  3. Pandas erbjuder datastrukturer och operationer för att manipulera numeriska tabeller och tidsserier.
  4. pymysql Paketet innehåller ett rent Python-klientbibliotek för att komma åt MariaDB Server.

Låt oss börja med att ansluta till databasservern via Python:

import io
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import pandas as pd
import pymysql as MariaDB
%matplotlib inline

conn = MariaDB.connect( host = '127.0.0.1'
, port = 3306
, user = 'mdb'
, passwd = 'letmein'
, db = 'ml'
, charset = 'utf8')

cur = conn.cursor()

När de är anslutna till MariaDB-servern kan bilderna i databasen lätt nås och hanteras. Alla bilder som används för att träna och testa modellen lagras i en enda tabell (tf_images). Hur bilden kommer att användas definieras i bildanvändningstabellen (img_use). I det här fallet har bordet bara två tupler, träning och testning:

sql="SELECT use_name AS 'Image Role'
          , use_desc AS 'Description'
     FROM img_use"
display( pd.read_sql(sql,conn) )

Bildroll Beskrivning
Utbildning Bilden används för att träna modellen
Testar Bilden används för att testa modellen

Att kartlägga målattribut till bildobjekt i en datauppsättning kallas märkning. Etikettdefinitionen varierar från applikation till applikation, och det finns knappast en universell definition av vad en "korrekt" etikett är för en bild. Att använda en relationsdatabas förenklar märkningsprocessen och ger ett sätt att gå från grova till finkorniga etiketter.

I det här exemplet, med hjälp av tabellen "kategorier", har en bild bara en etikett (grov) som visas nedan:

sql="SELECT class_name AS 'Class Name' FROM categories"
display( pd.read_sql(sql,conn) )
Klassnamn
0 T-shirt/tröja
1 Byxa
2 Tröja
3 Klänning
4 rock
5 Sandal
6 Tröja
7 Sneaker
8 Väska
9 Stövel

bilderna Tabellen innehåller alla bilder som ska användas för träning och testning. Varje bild har en unik identifierare, en etikett och om den används för att träna eller testa modellen. Bilderna lagras i sitt ursprungliga PNG-format och som förbehandlade flyttals-tensorer. En enkel inre koppling på denna tabell kan utföras för att visa bildrepresentationerna (vektor- eller png-format), dess etikett och den avsedda användningen.

sql="SELECT cn.class_name AS 'Class Name' 
          , iu.use_name AS 'Image Use' 
          , img_vector AS 'Vector Representation' 
          , img_blob AS 'Image PNG' 
     FROM tf_images AS ti 
          INNER JOIN categories AS cn ON ti.img_label = cn.class_idx
          INNER JOIN img_use AS iu ON ti.img_use  = iu.use_id
     LIMIT 5"
display( pd.read_sql(sql,conn) )

Klassnamn Bildanvändning Vektorrepresentation Bild PNG
Stövel Träning b’\x80\x02cnumpy.core.multiarray\n_reconstruct... b’\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\…
T-shirt/tröja Träning b’\x80\x02cnumpy.core.multiarray\n_reconstruct... b”\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\…
T-shirt/tröja Träning b’\x80\x02cnumpy.core.multiarray\n_reconstruct... b’\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\…
Klänning Träning b”\x80\x02cnumpy.core.multiarray\n_reconstruct… b’\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\…
T-shirt/tröja Träning b’\x80\x02cnumpy.core.multiarray\n_reconstruct... b’\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\…

Att använda SQL-satser gör datautforskningsprocessen enkel. SQL-satsen nedan visar till exempel bildfördelningen efter bildetikett.

sql="SELECT class_name AS 'Image Label' \
     , COUNT(CASE WHEN img_use = 1 THEN img_label END) AS 'Training Images'\
     , COUNT(CASE WHEN img_use = 2 THEN img_label END) AS 'Testing Images'\
     FROM tf_images INNER JOIN categories ON class_idx = img_label \
     GROUP BY class_name"
df = pd.read_sql(sql,conn)
display (df)
ax = df.plot.bar(rot=0)

Bildetikett Träningsbilder Testa bilder
0 Stövel 6000 1000
1 Väska 6000 1000
2 rock 6000 1000
3 Klänning 6000 1000
4 Tröja 6000 1000
5 Sandal 6000 1000
6 Tröja 6000 1000
7 Sneaker 6000 1000
8 T-shirt/tröja 6000 1000
9 Byxa 6000 1000

Det finns 6 000 bilder för varje etikett i träningssetet och 1 000 bilder för varje etikett i testsetet. Det finns totalt 60 000 bilder i träningssetet och totalt 10 000 bilder i testsetet.

Enskilda klädesplagg lagras som lågupplösta bilder. Eftersom databasen kan lagra dessa bilder effektivt som binära stora objekt (BLOB) är det mycket enkelt att hämta en bild med SQL, som visas nedan:

sql="SELECT img_blob \
     FROM tf_images INNER JOIN img_use ON use_id = img_use \
     WHERE use_name = 'Testing' and img_idx = 0"

cur.execute(sql)
data = cur.fetchone()
file_like=io.BytesIO(data[0])
img = mpimg.imread(file_like)
plt.imshow(img)

ovan:bild från fashion_mnist dataset

Denna första del av bloggserien har visat hur en relationsdatabas kan användas för att lagra och utföra datautforskning av bilder med enkla SQL-satser. Del 2 kommer att visa hur man formaterar data till de datastrukturer som behövs av TensorFlow, och sedan hur man tränar modellen, utför förutsägelser (dvs. identifierar bilder) och lagrar dessa förutsägelser tillbaka i databasen för vidare analys eller användning.

MIT-licens

Uppsättningen Fashion MNIST (fashion_mnist) som utnyttjas av den här bloggen är licensierad under MIT-licensen.

MIT-licensen (MIT) Copyright © 2017 Zalando SE, https://tech.zalando.com

Tillstånd ges härmed kostnadsfritt till varje person som skaffar en kopia av denna programvara och tillhörande dokumentationsfiler ("Programvaran") att handla med programvaran utan begränsningar, inklusive utan begränsning rätten att använda, kopiera, modifiera, slå samman, publicera, distribuera, underlicensiera och/eller sälja kopior av programvaran och att tillåta personer till vilka programvaran tillhandahålls att göra det, under förutsättning att följande villkor är uppfyllda:

Ovanstående copyrightmeddelande och detta tillståndsmeddelande ska inkluderas i alla kopior eller väsentliga delar av programvaran.

PROGRAMVARAN TILLHANDAHÅLLS "I BEFINTLIGT SKICK", UTAN GARANTIER AV NÅGOT SLAG, UTTRYCKTA ELLER UNDERFÖRSTÅDDA, INKLUSIVE MEN INTE BEGRÄNSAT TILL GARANTIER FÖR SÄLJBARHET, LÄMPLIGHET FÖR ETT SÄRSKILT ÄNDAMÅL OCH INTRÄNGNING. UNDER INGA OMSTÄNDIGHETER SKALL FÖRFATTARE ELLER UPPHOVSRÄTTSinnehavare VARA ANSVARIGA FÖR NÅGOT ANSVAR, SKADA ELLER ANNAT ANSVAR, VARKEN I EN ANVÄNDNING AV KONTRAKT, TORT ELLER ANNAT SÄTT, SOM UPPSTÅR FRÅN, UR ELLER I SAMBAND MED ANVÄNDNINGEN ELLER MJUKVARAN. PROGRAMVARA.

Referenser

Konvertera egen bild till MNIST:s bild
matplotlib:Bildhandledning
5 sätt AI förvandlar kundupplevelsen
Digitalisering uppfinner verksamheten på nytt
Vad är bildklassificering?
Introduktion till Python Deep Learning Library TensorFlow


  1. 7 alternativ för att aktivera rör (||) som sammanfogningsoperatör i MariaDB

  2. Skapa dynamiskt kolumner sql

  3. "Dödligt fel på intern anslutning" vid exekvering av en inbyggt kompilerad lagrad procedur i SQL Server 2019 (känd bugg)

  4. Hur skapar jag en främmande nyckel i SQL Server?