0

DIY RASPBERRY NEURAL NETWORK SEES ALL, RECOGNIZES SOME

April 27, 2022

As a fun project I thought I’d put Google’s Inception-v3 neural network on a Raspberry Pi to see how well it does at recognizing objects first hand. It [turned out to be] not only fun to implement, but also the way I’d implemented it ended up making for loads of fun for everyone I showed it to, mostly folks at hackerspaces and such gatherings. And yes, some of it bordering on pornographic — cheeky hackers.

An added benefit numerous pointed out is that, once installed, no internet access is required. This is state-of-the-art, standalone object recognition with no big brother knowing what you’ve been up to, unlike with that nosey Alexa.

But will it result in widespread helpful AI? If a neural network can recognize every object around it, will that result in human-like skills? Läs vidare.

How To Do object Recognition

Inception object recognizer internals
The implementation consists of:

Raspberry Pi 3 model B

amplifier and speaker

PiCamera

momentary swtich

cellphone charger battery for the Pi

The heart of the required software is Google’s Inception neural network which is implemented using their TensorFlow framework. You can download it by following the TensorFlow tutorial for image recognition. The tutorial doesn’t involve any programing so don’t worry if you don’t know Python or TensorFlow. That is, unless you’re going to modify their sample code as I did.

classify_image.py printing that it saw a panda
The sample code takes a fixed named file including a picture of a panda and does object recognition on it. It gives the result by printing out that it saw a panda. But that wasn’t enough fun.

I hunted around for some text-to-speech software and found Festival. Now when it wants to say it saw a panda, I modified the sample code to run festival in a linux shell and tell it to actually say “I saw a panda” to the speaker.

Audio Playerhttps://hackaday.com/wp-content/uploads/2017/06/classify_speak_panda_audio.wav

00:00
00:00
00:00

But that still wasn’t fun enough. I connected a PiCamera to the Raspberry Pi, and had that take a photo and give it to the TensorFlow code to do object recognition. In the vernacular, it now ran inference on my photo.

And lastly, to make it all real easy I connected a momemtary switch to one of the Pi’s GPIO pins and took the photo when the momentary switch was pressed.

Here’s the Python program’s main() function before…

1
2
3
4
5
def main(_):
  maybe_download_and_extract()
  image = (FLAGS.image_file if FLAGS.image_file else
           os.path.join(FLAGS.model_dir, ‘cropped_panda.jpg’))
  run_inference_on_image(image)

… och efter.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
def main(_):
  os.system("echo %s | festival –tts" % "Wait while I prepare my brain…")

  maybe_download_and_extract()
  # creates graph from saved GraphDef.
  create_graph()

  # preparing for the switch
  GPIO.setmode(GPIO.BCM)
  GPIO.setup(17, GPIO.IN)

  camera = PiCamera()

  os.system("echo %s | festival –tts" % "I am ready to see things.")

  while True:
    # loop for the switch
    while (GPIO.input(17) == GPIO.LOW):
      time.sleep(0.01)

    # take and write a snapshot to a file
    image = os.path.join(FLAGS.model_dir, ‘seeing_eye_image.jpg’)
    camera.capture(image)

    os.system("echo %s | festival –tts" % "I am thinking about what you showed me…")
    human_string = run_inference_on_image(image)
    os.system("echo I saw a %s | festival –tts" % human_string)

The calls to os.system() are where I run the festival text-to-speech program to make it say something to the speaker.

maybe_download_and_extract() is where Google’s Inception neural network would be downloaded from the Internet, if it’s not already present. By default, it downloads it to /tmp/imagenet which is on a RAM disk. The first time it did this, I copied it from /tmp/imagenet to /home/inception on the SD card and now run the program using a command line that includes where to find the Inception network.

Running the inception object recognizer
The call to create_graph() was moved from inside the run_inference_on_image() function. create_graph() sets up the neural network, which you need do only once. previously the program was a one-shot deal, but now it has an unlimited while loop which calls run_inference_on_image() each time through the loop. Obviously, setting up the neural network is something you do only once (see our introduction to TensorFlow for much more about graphs) so it had to be moved above the loop.

The run_inference_on_image() function is where the image is given to the neural network to do the object recognition. It used to just print out whatever it thought was in the image, but I modified it to instead return the text string including what it thinks the object is, “coffee mug” for example. So the last line is where it would say”Jag såg en kaffekopp” till förstärkaren och högtalaren.

Boxning allt som upp gav mig ett litet, fristående paket som kunde transporteras och provade av någon. Här är en video av det i aktion.

En förbättring skulle vara att lägga till en liten skärm så att användaren kunde se vad videokameran ser, men picamera har en bred att sevinkel och en skärm visar sig vara inte nödvändig.

Hur bra är dess objektigenkänning

Inledande att se en tobak
Visar det en mobiltelefon resulterar ofta i att det säger att det såg en mobiltelefon, men i vissa fall en iPod. Men hittills har det fått vattenflaskor och kaffe muggar som är lämpliga varje gång.

Men det gör det inte bra med människor. Pekar på mig på mitt kontor får det att säga att det såg en “tobaksaffär, tobakskonst, tobakskonist”, förmodligen på grund av hyllorna av utrustning och delar direkt bakom mig. Men stående mot en tom vägg sa det att det såg en tröja och avlägsnades att det såg en tee-skjorta och avlägsnade det, det sa “badstrumpor, simma trunkar”, trots att du bara ser min nakna övre torso och huvud. (Jag sparar dig bilden.)

ImageNet Prov Cellphone Images

ImageNet Prov Kaffe Kopp Bilder

Neural Network är utbildat på en dataset som heter ImageNet, versionen från den stora visuella erkännandeutmaningen från 2012. Den dataset består av en stor samling bilder uppdelad i 1000 klasser, varje klass inklusive bilder av ett visst objekt. Som du kan se från det här lilla provet från mobilklassen är några av telefonbilderna lite daterade. Men objekt som kaffe mugg förändras inte över tiden.

Men det stannade inte alla som spelade med det från att ha kul och gick runt att testa det på allt i sikte, som att hitta en trollstav för första gången och vinka runt för att se vad det kunde framträda.

Är det det bästa du kan göra?

Tja, först, varje erkännande tar cirka 10 sekunder på en hallon Pi 3 så det som måste spädas upp eller en snabbare processor som används, helst en med en CUDA-aktiverad NVIDIA GPU eftersom det är den enda typen av GPU-tensorflöde som för närvarande stöder.

Introption Neural Net är bara lika bra som den data som den är utbildad på. De fel som jag påpekade ovan angående att erkänna mobiltelefoner och människor är problem med ImageNet dataset. Endast 3,46% av tiden är alla 5 av sina bästa gisser fel, medan människor som gör samma test är fel i sina 5 bästa gisser 5% av tiden. Inte dåligt.

När vi påpekade i vår korta artikel om de freakiga sakerna Neural Networks gör idag, kan långa kortsiktiga minne (LSTM) neurala nätverk undersöka vad de ser i en enda bild av en video, samtidigt som de tar hänsyn till vad som kom före i videon. Till exempel har det mycket mer förtroende för att det såg en strandboll istället för en korgboll om den föregående scenen var den för en strandfest. Det skiljer sig från det neurala nätverket Neural Network i den början har bara den bild du visar på.

Var får det oss?

Kommer förbättrat objektigenkänningsresultatet i utbrett hjälpsamma AI med mänskliga fack? Utvecklingen av ögat är ofta citerad som en stor orsak till explosionen i livsformer som kallas den cambrian explosionen omkring 541 miljoner år sedan, men det finns mycket argument om det som orsakar.

När de ögonen utvecklades var det dock redan någon form av hjärna att använda dem. Den hjärnan hanterade redan känslan av beröring, vibration och lukt. Så förbättrat objektigenkänning ensam skulle inte orsaka en revolution. För mänskliga färdigheter skulle vår AIS behöva mycket mer intelligens. Vi har för närvarande bara bitar och bitar av idéer om vad vi behöver för det.

Vad många är överens om är att vår ai skulle behöva göra förutsägelser så att det kunde planera. För det kan det ha en intern modell eller förståelse av världen att använda som grund för dessa förutsägelser. För den mänskliga färdigheten att tillämpa ett lödningsförslag till en tråd skulle en intern modell förutsäga vad som skulle hända när förslaget gjorde kontakt och planerar sedan baserat på det. När förslaget kontaktar tråden, om saker inte går som förutspådda, skulle Ai reagera.

Nyligen arbete från Facebook med generativa motståndsnät (GANS) kan tippa till en utgångspunkt här som innehåller en sådan modell och prediktiv kapacitet (om du inte är bekant med gans, hänvisar vi igen till vår korta artikel om de neakiga grejerna Neural Networks gör idag). Den “generativa” delen av namnet innebär att de genererar bilder. Men mycket mer specifikt är det djupt konvolerade gans, vilket innebär att de inkluderar en förståelse för vad de har sett i de bilder de har utbildats på. Till exempel vet de om fönster, dörrar och TV och där de går i rum.

ADGL Video Förutsägelser
Vad sägs om att göra förutsägelser? Mycket mer arbete från Facebook involverar videogenerering. Använda adversarial gradient skillnad förlust prediktorer (AGDL) de förutsäger vad de två följande ramarna av en video borde vara. På bilden av ett biljardspel kan du se grounD Sanning, d.v.s. det som verkligen hände, och vad Agdl-nätverket förutspådde. Det är inte så långt in i framtiden men det är en början.

Det är åtminstone små steg på vägen från ett naivt objektigenkännare till en med mänskliga färdigheter.

I stängning

Var kan du ha sett starten Neural Network igenkänna objekt före? Vi har täckt [Lukas Biewald] med det på en RC-bil för att känna igen objekt i sitt garage / verkstad.

Medan detta [visade sig vara] roligt för alla att använda som, vilka andra användningsområden kan du tänka på för det? Vilken användbar applikation kan du tänka på? Vad kan läggas till? Låt oss veta i kommentarerna nedan.