Skip to content
Snippets Groups Projects
Commit eb6b4596 authored by Tamino Huxohl's avatar Tamino Huxohl
Browse files

provide title to skin color task

parent bc432754
No related branches found
No related tags found
No related merge requests found
%% Cell type:markdown id: tags:
 
# Aufgabe
# Aufgabe - Hautfarbe
 
In dieser Aufgabe geht es um die Klassifikation von Pixeln in Hautfarbe.
Implementieren Sie die mit `#TODO` gekennzeichneten Codestellen und beantworten Sie die mit `#TODO` gekennzeichneten Fragen.
Beachten Sie ggf. die Hinweise.
 
%% Cell type:markdown id: tags:
 
## Teil 1
 
* Worauf müssen Sie bei der Berechnung des Skin Locus achten, um einen Programmabsturz zu vermeiden?
 
`#TODO`
 
%% Cell type:markdown id: tags:
 
## Teil 2
 
Im Code unten werden aus einer Datei 8344 hautfarbene Pixel geladen.
Visualisieren Sie diese Pixel in der rg-Ebene.
 
* Was fällt Ihnen im Vergleich zum Skin-Locus aus dem Skript auf?
 
`#TODO`
 
%% Cell type:code id: tags:
 
``` python
import os
 
import numpy as np
import cv2 as cv
 
%matplotlib inline
import matplotlib.pyplot as plt
 
 
dir_resources = '../resources'
storage = cv.FileStorage(os.path.join(dir_resources, 'skin_color.yml'), cv.FILE_STORAGE_READ)
skin_pixels = storage.getNode('skin').mat()
storage.release()
print(f'Loaded {skin_pixels.shape[0]} skin pixels!')
 
#TODO: visualisieren Sie die Pixel in skin_pixels in der rg-Ebene
```
 
%% Output
 
Loaded 8344 skin pixels!
 
%% Cell type:markdown id: tags:
 
## Teil 3
 
Erstellen Sie einen eigenen Datensatz an Hautfarbenen Pixeln.
Führen Sie dafür die Code-Zelle unter diesem Text aus.
Das startet ein kleines Tool in dem Sie mit zwei linken Mausklicks rechteckige Regionen markieren können.
Markieren Sie auf den Gesichtsbildern ein Paar solcher Rechtecke, die hautfarbene Pixel enthalten.
 
Implementieren Sie das `#TODO` in der zweiten Code-Zelle unter diesem Text indem Sie den Code aus **Teil 2** erneut verwenden.
Vergleichen Sie den so entstandenen Skin-Locus mit dem aus dem Skript.
 
* Was gibt es für Unterschiede und was könnten Gründe für diese Unterschiede sein?
 
`#TODO`
 
%% Cell type:code id: tags:
 
``` python
%matplotlib notebook
 
from util import PixelSelectionTool
 
dir_images = os.path.join(dir_resources, 'skin_images')
images = [os.path.join(dir_images, img_name) for img_name in os.listdir(dir_images)]
 
skin_pixels_own = []
pixel_selection_tool = PixelSelectionTool(images[:9], figsize=(12, 12), movement_filter_ms=250)
_ = pixel_selection_tool.on_new_pixels(lambda new_pixels: skin_pixels_own.extend(new_pixels))
```
 
%% Output
 
 
 
%% Cell type:code id: tags:
 
``` python
%matplotlib inline
 
skin_pixels_own = np.array(skin_pixels_own)
print(f'Annotated {skin_pixels_own.shape[0]} skin pixels!')
 
#TODO visualisieren Sie die von Ihnen annotierten hautfarbenen Pixel in der rg-Ebene
```
 
%% Output
 
Annotated 0 skin pixels!
 
%% Cell type:markdown id: tags:
 
## Teil 4
* Um eine effiziente Klassifikation in hautfarbene und nicht-hautfarbene Pixel durchzuführen, approximiert man die Ränder des Skin Locus mittels zweier Parabeln ($ax^2 + bx + c$). Wie kann man die Parameter dieser Parabeln sinnvoll bestimmen?
 
`#TODO`
 
* Wie kann die Klassifikation in hautfarbene und nicht-hautfarbene Pixel noch effizienter als über die Approximation von Parabeln realisiert werden und was sind Nachteile eines solchen Verfahrens gegenüber den Parabeln?
 
`#TODO`
 
* Meist befindet sich die Farbe weiß ($r=g=0.33$) innerhalb des Skin Locus. Wie könnte man vorgehen um solche Flaschklassifikationen zu vermeiden?
 
`#TODO`
 
%% Cell type:markdown id: tags:
 
## Teil 5
 
 
Ein anderer Hautfarbenklassifikator ist durch die folgenden Regeln definiert [(Peer et al., 2003, "Human skin color clustering for face detection", EUROCON2003)](https://ieeexplore.ieee.org/abstract/document/1248169):
 
$$(r > 95) \land (g > 40) \land (b > 20) \\ \land (max\{r,g,b\}-min\{r,g,b\} > 15) \\ \land (|r-g|>15) \land (r>g) \land (r>b)$$
 
Implementieren Sie diesen Klassifikator und visualisieren Sie erneut die von ihm als Hautfarbe klassifizierten Pixel in der rg-Ebene, indem Sie die `#TODOs` in der Code-Zelle unter dem Text implementieren.
Führen Sie danach die Code-Zelle darunter aus, um sich die Ergebnisse des Klassifikators auf Gesichtsbildern anzeigen zu lassen.
 
* Was fällt Ihnen auf?
 
`#TODO`
 
* Was sind Vorteile und Nachteile dieses Klassifikators?
 
`#TODO`
 
%% Cell type:code id: tags:
 
``` python
%matplotlib inline
 
def is_skin(pixel):
#TODO implementieren sie den Klassifikator
return False
 
skin_pixels_cls = []
for r in range(96, 256, 10):
for g in range(41, 256, 10):
for b in range(21, 256, 10):
pixel = np.array((b, g, r))
if is_skin(pixel):
skin_pixels_cls.append(pixel)
 
#TODO visualisieren Sie die vom Klassifikator als Hautfarbe beurteilten Pixel (skin_pixels_cls) in der rg-Ebene
```
 
%% Cell type:code id: tags:
 
``` python
imgs = [cv.imread(image, cv.IMREAD_COLOR) for image in images]
masks = [np.zeros(img.shape, np.uint8) for img in imgs]
 
for img, mask in zip(imgs, masks):
for i in range(img.shape[0]):
for j in range(img.shape[1]):
if is_skin(img[i, j]):
mask[i, j] = (255, 255, 255)
 
for i in range(len(imgs)):
imgs[i] = np.where(masks[i] == (255, 255, 255), imgs[i], np.zeros(imgs[i].shape, np.uint8))
 
fig, axs = plt.subplots(3, 3, figsize=(12, 12))
for i in range(3):
for j in range(3):
ax = axs[i, j]
ax.axis('off')
ax.imshow(cv.cvtColor(imgs[i * 3 + j], cv.COLOR_BGR2RGB))
```
 
%% Output
 
 
%% Cell type:markdown id: tags:
 
### Hinweise
 
#### Teil 1
* Was passiert bei der Normierung (Berechnung von r und g) von einem schwarzen Pixel?
 
#### Teil 2
* Beachten Sie die Reihenfolge der Farbkanäle! Diese ist BGR in OpenCV
* Zur Visualisierung eignet es sich entweder ein Grauwertbild zu erstellen auf dem die entsprechenden Koordinaten weiß gefärbt werden oder die Funktion [scatter](https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.scatter.html) von matplotlib zu verwenden
 
#### Teil 3
* Welche Punkte des Skin-Locus sollten auf jeden Fall von der Parabel getroffen werden.
* Wie viele Punkte braucht man, um die Parameter der Parabeln eindeutig zu bestimmen.
 
#### Teil 5
* Beachten Sie wieder die Reihenfolge der Farbkanäle (BGR)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment