Computer vision

Introduzione

ATTENZIONE: Ciò che segue è solo una bozza MOLTO IN-PROGRESS !!!!!

Installazione

Se hai con Anaconda:

  • apri Anaconda Navigator

  • seleziona tab Environments sulla sinistra

  • seleziona l’ambiente (se non hai idea di cosa scegliere, seleziona base (root))

  • sulla destra, seleziona Not installed

  • cerca opencv e installalo

Se hai Linux / Ubuntu:

sudo apt update
sudo apt install python3-opencv

Riferimenti

Mettiamo qua una lista di riferimenti per lavorare con Python e le immagini:

Che fare

  • scompatta lo zip in una cartella, dovresti ottenere qualcosa del genere:

computer-vision
    computer-vision.ipynb
    computer-vision-sol.ipynb
    jupman.py

ATTENZIONE: Per essere visualizzato correttamente, il file del notebook DEVE essere nella cartella szippata.

  • apri il Jupyter Notebook da quella cartella. Due cose dovrebbero aprirsi, prima una console e poi un browser. Il browser dovrebbe mostrare una lista di file: naviga la lista e apri il notebook computer-vision.ipynb

  • Prosegui leggendo il file degli esercizi, ogni tanto al suo interno troverai delle scritte ESERCIZIO, che ti chiederanno di scrivere dei comandi Python nelle celle successive.

Scorciatoie da tastiera:

  • Per eseguire il codice Python dentro una cella di Jupyter, premi Control+Invio

  • Per eseguire il codice Python dentro una cella di Jupyter E selezionare la cella seguente, premi Shift+Invio

  • Per eseguire il codice Python dentro una cella di Jupyter E creare una nuova cella subito dopo, premi Alt+Invio

  • Se per caso il Notebook sembra inchiodato, prova a selezionare Kernel -> Restart

1. Anonimizzazione facce

Proponiamo un semplice programmino per anonimizzare volti.

Facendo partire la cella seguente, dovrebbe caricare una foto, mostrare i rettangoli sulle facce e anonimizzarla, salvandola in 'results/simple_output.png'. Non è detto che trovi tutti i volti, potreste dover aggiustare dei parametri. Alcune foto di test sono fornite nella cartella images, di quelle nei campi da calcio a seconda della foto i volti vengono riconosciuti oppure no.

[1]:
# A simple algorithm for face detection which also allows the user to automatically hide the detected faces. Moreover, in the case the detection missed some face, those can be manually selected and obscured.

# At the moment the implemented hiding methods are four:
#   - *Blur*
#   - *Pixel Shuffle*
#   - *Image Swap*
#   - *Negative*



import numpy as np
import cv2

# fonte:  https://en.wikipedia.org/wiki/File:Amateur_Football_in_Kilkenny-Ireland.jpg
#filename = 'images/football/Amateur_Football_in_Kilkenny-Ireland.jpg'

# fonte: https://commons.wikimedia.org/wiki/File:Ronaldo_-_Manchester_United_vs_Chelsea.jpg
#filename = 'images/football/800px-Ronaldo_-_Manchester_United_vs_Chelsea.jpg'

# fonte: https://commons.wikimedia.org/wiki/File:6_a_side_football_-_5_a_side_football_-_7_a_side_football_-_Ballerz_league.jpg
#filename = 'images/football/6_a_side_football_-_5_a_side_football_-_7_a_side_football_-_Ballerz_league.jpg'
# fonte: https://commons.wikimedia.org/wiki/File:2018_IBSA_Blind_Football_Madrid_Argentina.JPG
filename = 'images/football/800px-2018_IBSA_Blind_Football_Madrid_Argentina.jpeg'

#filename = "images/square_faces.jpg"
grrr = "images/grrr_reaction.png"

# Loading image
img_raw = cv2.imread(filename)
img_raw_copy = cv2.imread(filename)
grrr_image = cv2.imread(grrr)
# print(img_raw[1:10,1:10])

# Converting image to grey-scale
img_raw_grey = cv2.cvtColor(img_raw, cv2.COLOR_BGR2GRAY)
# Create and load the CascadeClassifier for face detection
haar_cascade_face = cv2.CascadeClassifier()
loaded = haar_cascade_face.load('resources/haarcascade_frontalface_default.xml')

'''
Returns a rectangle around the face.

@param scale_factor: compensate the distance of the face from the camera
@param minNeighbors: number of neighbors for a rectangle to be considered as a face
'''
#  scaleFactor: 1 - 1.5 2.0 massimo
#  minNeighbors = tra 1 e 6  NON è il numero di facce
faces_rects = haar_cascade_face.detectMultiScale(img_raw_grey, scaleFactor = 1.2, minNeighbors = 3);
print('facce trovate: ', len(faces_rects))
for (x,y,w,h) in faces_rects:
    # print(x, y, w,h)
    cv2.rectangle(img_raw_copy, (x, y), (x+w, y+h), (0, 255, 0), 2)
    # UNCOMMENT THE DESIRED HIDING METHOD
    # 1] BLUR
    img_raw[y:y+h, x:x+w] = cv2.blur(img_raw[y:y+h, x:x+w], (40, 40))
    # 2] SHUFFLING PIXELS
    # np.random.shuffle(img_raw[y:y+h, x:x+w].flat)
    # 3] NEGATIVE
    #img_raw[y:y+h, x:x+w] = cv2.bitwise_not(img_raw[y:y+h, x:x+w])
    # 4] EMOJI
    #grrr_resize = cv2.resize(grrr_image, (w, h))
    #img_raw[y:y+h, x:x+w] = grrr_resize
    pass
cv2.namedWindow("img_copy")
cv2.imshow("img_copy", img_raw_copy)
# togli i commenti per permettere all'utente di selezionare manualmente un riquadro attorno al volto
#fromCenter = False
#roi = cv2.selectROI("", img_raw, fromCenter)
#img_raw[roi[1]:roi[1]+roi[3], roi[0]:roi[0]+roi[2]] = cv2.blur(img_raw[roi[1]:roi[1]+roi[3], roi[0]:roi[0]+roi[2]], (40, 40))

out_filename = 'results/simple_output.png'
cv2.imwrite('results/simple_output.png', img_raw)
print("immagine anonimizzata salvata in:   " + out_filename)

# mostra l'immagine in Jupyter:
# ATTENZIONE: a volte blocca l'esecuzione della cella e bisogna far ripartire il kernel Jupyter.
#cv2.namedWindow("img")
#cv2.imshow("img", img_raw)

facce trovate:  3
immagine anonimizzata salvata in:   results/simple_output.png
Mostra soluzione
[2]:

[ ]: