Tekintettel a mesterséges intelligenciát hasznosító alkalmazások közelmúltbeli felfutására, a modellképzéshez szükséges nagy adatkészletek egyre fontosabbá váltak. Amikor a rögzített videók képzési anyagként való felhasználásán gondolkodunk, fontos figyelembe venni az olyan szabályozásokat, mint például az Általános Adatvédelmi Rendelet (GDPR), amelyek megkövetelik a felvételen látható minden személy hozzájárulását vagy anonimizálást a felvételen. tartalomra.

Azonban nem mindig praktikus engedélyt kérni számos személytől, és az arcok manuális elmosása minden képkockában munkaigényes. Sajnos sok, a blogokban tárgyalt vagy a GitHubon elérhető automatizált megközelítés hiányzik a pontosságról és/vagy a teljesítményről.

Ez különösen akkor jelent problémát, ha egy startup általános forgatókönyve nagyszámú HD-minőségű képkockát dolgoz fel korlátozott erőforrásokkal. Ilyen esetekben a megbízható és hatékony megközelítés a lényeg.

tl;dr íme a GitHub repó, így csak l33 csatornát küldhetsz: https://github.com/markusschmitz53/demo-face-blur

Ebben a cikkben egy egyszerű Python-megközelítést fogunk közelebbről megvizsgálni, amelyet nemrégiben használtam, miért használtam, és miért érdemes neked is használni.

Miért fontos az anonimizálás?

A kiváló minőségű videoadatok és a hatékony mesterségesintelligencia-modellek növekvő elérhetősége miatt egyre nagyobb aggodalomra ad okot, hogy személyes adatok nyerhetők ki az ártalmatlannak tűnő felvételekből. Az azonosítható arcokat tartalmazó videoadatokat számos módon vissza lehet használni. Az egyik kiemelkedő példa a bíróságon használt „mélyhamisítás”.

Van még egy fontos tényező: az elfogult vagy méltánytalanul megjelölt adatokra kiképzett AI-modellek „fenntarthatják a meglévő torzításokat”. Az arcok anonimizálása segít abban, hogy ezek a torzítások ne kerüljenek be a képzési adatokba olyan tényezők miatt, mint például a faj, a nem, az életkor stb. Ez különösen fontos az olyan alkalmazásoknál, mint a bűnüldözés vagy a munkaerő-felvétel, ahol az elfogult modellek súlyos, valós következményekkel járhatnak.

„Azért vagyok itt, hogy megtanuljam, hogyan távolíthatok el érzékeny információkat a videókból 😤

… yadda yadda yadda, vágjunk bele.

A képek és a mintafelismerés megértése

Szeretnénk videóadatokat olvasni, képkockánként megkeresni az összes arcot, és lecserélni őket módosított tartalomra. Ez a tartalom tartalmazhat olyan technikákat, mint a Gauss-elmosás, vagy akár szintetikus képeket is, amelyek sokrétű képzési adatokhoz járulnak hozzá.

A folyamatmindig ugyanaz, a használt eszközöktől függetlenül:

  1. Képadatok olvasása videofolyamból vagy fájlból
  2. Végezzen arcfelismerést a képadatokon
  3. Bontsa ki az érdeklődési területet (ROI) minden arcra
  4. Minden ROI névtelenítése
  5. Adja vissza a frissített adatokat
  6. Ismételje meg a folyamatot a fájl végéig

Ahhoz, hogy jobban megértsük, mit kell tennünk, először nézzük meg, mit látunk és mit látnak a számítógépeink.

Amit Látunk

Amikor egy képet nézünk, agyunk "mintákat ismer fel", és összehasonlítja azokat az általunk ismert tárgyakkal. Innen tudjuk, hogy amit látunk, az egy személy (vagy bármilyen más tárgy). Mint bizonyára tudja, ez a felismerés néha nehéz lehet. Például. amikor egy tárgy részben le van takarva, vagy olyan perspektívából nézi, amelyet nem szokott.

Ne feledje: a mintafelismerés a képzéstől függ. Vagyis hányszor láttunk egy tárgyat? Hányszor láttuk egy tárgy variációit (különböző perspektívák, világítás stb.)?

Ha csak egy kutyát és egy rókát láttál életedben, akkor nem leszel jó felismerni őket, amikor különböző kutyákat és rókákat látsz. A kutyák és a rókák megkülönböztetésében sem lesz túl jó. Egy kutyás szakértő valószínűleg több ezer kutyát látott, és ezért bármelyik kutyát egy szempillantás alatt azonosítani tudja, miközben ismeri a fajtáját és nagyjából az életkorát is.

Mit látnak számítógépeink

A számítógép (legalábbis a gyakoribbak) számára a kép lényegében egy 2D mátrix, amely a pixelek színintenzitását reprezentáló értékekből áll. Ha részletesebb magyarázatra kíváncsi, tekintse meg ezt a nagyszerű bejegyzést, amely részletesen kifejti a fogalmakat.

Ezenkívül fontos szem előtt tartani, hogy a számítógépek nem ismerik a kontextus megértését. Az emberekkel ellentétben nem tudjuk könnyen átadni az olyan fogalmakat, mint a „kutyát keresek” (igen, megint kutyákat🙄), ami azt jelenti, hogy nem tudjuk egyszerűen a számítógép tudomására hozni, hogy „négylábú lényeket keresünk szőrme és egy farok” egy képen.

Itt jön képbe az AI – pontosabban a „neurális hálózatok” –. Manapság az agyunkhoz hasonlóan kiképezhetünk egy modellt a pixelértékek 2D-s mátrixának értelmezésére. Egy mátrixot biztosítunk a számítógépnek, és azt mondjuk: „Ez egy kutya”. Miután ezt sokszor megtesszük különböző képekkel, megadhatunk olyan értékeket, amelyeket nem használtunk a kiképzéshez, és megkérdezhetjük: „Ez egy kutya”? A számítógép ezeket az értékeket a neurális hálózaton keresztül küldi el, amely egy kimenetet generál, amely jelzi, hogy mennyire valószínű, hogy az értékek egy kutyát ábrázolnak.

Tudom, tudom. Rengeteg elmélet és fecsegés a kutyákról, rókákról és mindenféle dologról, de hamarosan rátérünk a lényegre. Maradj velem.

Az arcfelismerés megközelítései

Számos megközelítés létezik az arcfelismerés számítógépes látási feladatához. Ahhoz, hogy áttekintést nyerjünk és megértsük, miért használunk vagy nem használunk bizonyos technikákat, áttekintünk néhány régebbi módszert, mielőtt a modernekhez térnénk.

A tl;dr YuNet meglehetősen pontos, gyors és nem igényel GPU-t. „OpenCV-n keresztül” érhető el, és nagyszerű eszköz az arcfelismeréshez a CPU-kon.

Jogi nyilatkozat: Itt csak a felületet érintem. Ha mélyebbre szeretne merülni a nyúlüregben, olvassa el ezt a cikket: Mi az arcfelismerés? Ultimate Guide 2023 + modell-összehasonlítás

Haar Cascades (2001)

A 2000-es évek elején olyan kaszkád osztályozókat vezettek be, mint a széles körben ismert Haar Cascade. A Haar Cascades egy gépi tanulási technika, amelyet tárgyak észlelésére használnak, és gyakran alkalmaznak olyan számítógépes látási feladatokban, mint az arcfelismerés. Egy sor egyszerű funkcióval működnek, hogy azonosítsák a mintákat egy képen. Ezek a jellemzők szakaszok kaszkádjába vannak szervezve, ahol minden szakasz fokozatosan leszűkíti az objektum keresését a nem objektum régiók kiszűrésével. Sajnos a különböző forgatókönyvek (azaz elforgatott arcok) észlelési eredményei közel sem érik el a modern technikák pontosságát.

HOG + Lineáris SVM (2005)

2005-ben egy másik módszert javasoltak az objektumfelismerésre: "Orientált színátmenetek hisztogramja (HOG) képleíró és egy lineáris támogató vektorgép (SVM)". Megpróbálunk egyszerűbben lebontani egy összetett folyamatot: a HOG-ot objektumészlelésre használják, és régiók képjellemzőit rögzítik. Az „SVM-ek” egy „felügyelt tanulási” modell, amely arra van kiképezve, hogy e minták alapján különböztesse meg a különböző dolgokat, segítve a konkrét objektumok felismerését, amikor új képeket kap. Mindkettő együtt robusztus tárgydetektorként használható. Ez a megközelítés azonban csaknem két évtizedes, és bár a pontosság egyenlő lehet, a teljesítmény „hiányzik” a mély tanuláson alapuló modern megközelítések mögött.

Mély tanuláson alapuló arcdetektorok: YOLO és YuNet

Ahogy a számítógépes látás területe fejlődött, a kutatók pontosabb és sokoldalúbb módszereket kerestek a tárgyfelismeréshez, különösen az arcfelismeréssel összefüggésben. Ez a „mély tanuláson alapuló” technikák megjelenéséhez vezetett, amelyek a neurális hálózatok erejét hasznosították az objektumfelismerés forradalmasítására. E fejlesztések két kiemelkedő példája a „YOLO (2016)” és a „YuNet (2021)”.

A YOLO (You Only Look Once) keretrendszer jelentős figyelmet kapott azzal a képességével, hogy egyszerre nagyon nagy pontosságot és figyelemre méltó sebességet ér el az objektumészlelésben. Ahelyett, hogy elemzés céljából több régióra bontaná a képet, a YOLO aa teljes képet egy lépésben feldolgozza, közvetlenül előre jelezve a határolókereteket és az osztályvalószínűségeket (ezért a Csak egyszer nézd meg). Ez a valós idejű észlelési képesség a YOLO-t a játék megváltoztatójává tette különféle alkalmazásokban, beleértve az arcfelismerést is, ahol a sebesség és a pontosság kulcsfontosságú. Tapasztalataim szerint a jó teljesítmény eléréséhez „erős GPU” szükséges.

2021-ben a YuNet arcdetektorként mutatkozott be a képekhez, amelyek célja a nagy pontosság elérése „nagy képsebesség mellett”, erőteljes hardver szükségessége nélkül. Ezért használtam a YuNetet a múltban, és ebben a cikkben erre fogok összpontosítani.

Az „SFace” 2022-es bevezetésével egy másik detektort javasoltak, amely „a YuNet szerzője szerint” ismét körülbelül 4-szer gyorsabb.

Útmutató lépésről lépésre

Kezdésként szeretném megemlíteni, hogy az ebben az útmutatóban használt eszközkészletek bármilyen más szoftverrel helyettesíthetők, amely képes AI modellek végrehajtására, képek betöltésére,és képrégiók cseréjére >. Ha a JavaScript technológiai csomagot részesíti előnyben, hasonló szoftvereket implementáltam az ml5.js (arcfelismeréshez) és a p5.js (elmosás) használatával, de természetesen vannak teljesítménykorlátozások.

Python 3.9-et és OpenCV 4.7.0-t használok.

  1. Videókockák betöltése
import time
from imutils.video import FileVideoStream

queue_size = 64
fvs = FileVideoStream('video.mp4', None, queue_size).start()

# wait for queue to fill
while not fvs.more():
    time.sleep(0.1)

frame = fvs.read()
frame_height, frame_width, _ = frame.shape

yunet_model = cv2.FaceDetectorYN_create(
        model='models/face_detection_yunet_2022mar.onnx',
        config='',
        input_size=[frame_width, frame_height],
        score_threshold=0.7,
        nms_threshold=0.8,
        top_k=40)

A FileVideoStream (FVS) segítségével töltjük be a bemeneti videónkat egy külön szálba. Ezen a folyamaton belül egy sor kerül felhasználásra a keretek betöltésére. A főszál ezután szünetel, amíg a várólista nem tartalmaz elemeket. Ez lehetővé teszi az FVS szál végrehajtását. Miután elkészült, az első képkocka beolvasásra kerül a videó méretének meghatározásához.

A YuNet a modell „2022-es verziójával” a mi „osztályozónkként” van példányosítva, mivel illeszkedik az általam használt OpenCV verzióhoz, de használhatja a „2023-as verziót” az OpenCV 4.8.0-val.

2. Iteráljon a kereteken keresztül, és fedezze fel az arcokat

while fvs.running():
  frame = fvs.read()
  if frame is None:
      continue

  _, faces = yunet_model.detect(frame)
  faces = faces if faces is not None else []
  faces = np.asarray(faces, dtype=np.int16)

  for face in faces:
      x1, y1, w, h = face[:4] # bounding box coordinates
      x2 = x1 + w
      y2 = y1 + h

      # for implementations of anonymize_roi() see next section
      frame = anonymize_roi(frame, x1, y1, x2, y2)

Elindítunk egy ciklust, amely beolvassa a kereteket, és minden egyes keretet átad a YuNet példánynak. A YuNet egy sor határolókeretet ad vissza minden egyes észlelt archoz, amelyeket a numpy használatával egész számra öntünk, így nem kell később a lebegőértékekkel bajlódnunk. Ezután ismételjük az észlelt arcokat, és meghatározzuk a ROI koordinátákat, mielőtt bármilyen anonimizálást alkalmaznánk.

Ha a YuNet eredmények nem elegendőek, a YOLO vagy bármely más modell segítségével megismételheti ezt a lépést. Ehhez egyszerűen hozzon létre egy példányt a kiválasztott modellből a ciklus előtt, adja át a keretet az észleléshez, ahogy az imént tettük, és alkalmazza az anonymize_roi() elemet a modellpéldány által visszaadott határoló dobozokra.

3. Jelenítse meg vagy mentse el a frissített képkockákat

Most, hogy az aktuális keret frissül, vagy elmenthetjük egy fájlba, megjeleníthetjük vagy mindkettőt elvégezhetjük.

while fvs.running():
  frame = fvs.read()
  if frame is None:
      continue

  _, faces = yunet_model.detect(frame)
  faces = faces if faces is not None else []
  faces = np.asarray(faces, dtype=np.int16)

  for face in faces:
      x1, y1, w, h = face[:4] # bounding box coordinates
      x2 = x1 + w
      y2 = y1 + h

      # for implementations of anonymize_roi() see next section
      frame = anonymize_roi(frame, x1, y1, x2, y2)

  # save frame to video file here

  cv2.imshow('demo-face-blur', frame)
  if cv2.waitKey(1) == ord('q'):
      return

cv2.destroyAllWindows()

Ebben az alappéldában az OpenCV-t használjuk egy ablak megjelenítésére a keretünkkel tartalomként. Ha megnyomja a Q gombot, miközben az ablak fókuszban van, a végrehajtás a visszatéréssel fejeződik be. Mivel ez csak az ötletet hivatott demonstrálni, a kecses kilépés csak Önön múlik.

Szerkesztési technikák

Most nézzünk meg néhány gyakori módszert az érdeklődési körökben (= arcokban) lévő információk cseréjére. Ne feledje, hogy minél több eredeti képinformáció vész el, annál nehezebb lesz visszafordítani a folyamatot. Ez hasonló ahhoz, mintha markert használnánk a papír érzékeny részleteinek elfedésére.

Maszkolás

Mivel a ROI-n belül egyetlen eredeti információ sem marad meg, ez a stratégia meglehetősen biztonságos. Sajnos nem alkalmas a képzési adatokra, mivel a modellek valószínűleg a maszkokat és azok éles széleit jellemzőként fogják használni, és elkezdik „keresni” ezeket a funkciókat. Ha ez nem releváns az Ön esetében, ez egy nagyon gyors és egyszerű módszer.

def anonymize_roi(frame, x1, y1, x2, y2):
    roi = frame[y1:y2, x1:x2]
    if not roi.size:
        return frame

    return cv2.rectangle(frame, (x1, y1), (x2, y2), (255, 255, 255), -1)

Elmosódás / Pixeláció

Az elmosódás egy széles körben használt technika, és így a pixelezés is. A Gauss-elmosás alkalmazása elterjedt megközelítés, de vannak módszerek a jelfeldolgozás során a „visszafordításra”. Különösen akkor, ha a támadók hozzáférnek az elmosódási/pixelezési folyamat és a használt paraméterek részleteihez. Ha elegendő időt és erőforrást kap, a támadók képesek lehetnek kellően visszafordítani a folyamatot ahhoz, hogy ismét azonosítani tudják az arcokat.

Ennek ellenére ez még mindig elterjedt módszer, mivel könnyen megvalósítható és jól működik. A folyamat visszafordítása jelentős erőfeszítést igényel, ami sok esetben valószínűtlenné teszi az ilyen jellegű támadást.

Fontos figyelembe venni, hogy a mag mérete határozza meg az elmosódás mértékét, és így azt is, hogy mennyire takarják el az arcvonásokat. A kis kernelméret nem fog működni, ha az arcok közelebb kerülnek a kamerához, ezért módosításokra van szükség.

def anonymize_roi(frame, x1, y1, x2, y2):
    roi = frame[y1:y2, x1:x2]
    if not roi.size:
        return frame

    anonymized_roi = cv2.blur(roi, ksize=(20, 20))
    frame[y1:y2, x1:x2] = anonymized_roi

    return frame

Szintetikus adatok generálása

Ez egy másik módszer a ROI elfedésére, de mesterséges arcinformációkat használnak. Valószínűleg hallottál a "Deepfake"-ről, amelyek felépítésükben meglehetősen hasonlóak. Itt egy „Generatív ellenséges hálózatot” (GAN) használunk, amely két neurális hálózatból áll: egy generátorból, amely arcokat generál, és egy diszkriminátorból, amely megtanulja megkülönböztetni a hamisságot a valódi arcoktól. . Ezek a hálózatok együtt dolgoznak, és új arcot generálnak, ahogy az alábbi képen is látható.

A „DeepPrivacy2: Towards Realistic Full-Body Anonymization” című kiadványukkal Håkon Hukkelås és Frank Lindseth egy használatra kész eszközkészletet adott ki a „GitHubon”, amelyet az itt leírt folyamat keretében használtam.

Sajnos a teljesítmény 1 fps körül volt (lehet, hogy az én hibám volt 🙄). Ha van valami trükkje a gyorsabb végrehajtáshoz, kérjük, írjon megjegyzést lent.

Hallottam suttogást bizonyos cégekről, akik ezt szolgáltatásként nyújtják, de az általam látottak szerint hajlamos lyukat égetni a zsebében, és húzza a lábát a sebesség szempontjából 🤫.

Megfontolások, korlátozások és optimalizálás

Nem számít, melyik szerkesztési módszert választja, a a finomhangolás létfontosságú a jó edzési eredményekhez. Ha túlságosan elmosódik, akkor akár csak maszkot is használhat, mivel az arc minden vonása elveszik, és a szélek túl élesek lesznek. De csak kis elmosódással az arcok továbbra is azonosíthatók voltak. Ez hasonló a ROI méretének csökkentésére.

Míg a mérföldkő észlelése használata a ROI optimalizálására kielégítő eredményeket hoz, a tesztelés során azt tapasztaltam, hogy a befektetett erőfeszítések nem feltétlenül indokoltak, mert a ROI-nak még mindig le kell fednie az arc nagy részét.

Különböző ROI-formák és -méretek

Az arcszerűbb formák, például ellipszisek beépítése javíthatja az edzési eredményeket. Az ellipszis OpenCV használatával történő elmosásához azonban minden egyes ROI esetében „minden egyes képkockát le kell másolni és maszkolni”, ami jelentősen rontja a teljesítményt. Ha tud valami gyorsabb módot ennek elérésére, kérem, küldjön üzenetet.

Mint minden automatizált rendszer esetében, a szoftverünk időnként meghibásodhat (és meg is fog). Az arcfelismerés nem 100%-os pontosságú, ami azt jelenti, hogy egyes arcokat a rendszer nem észlel, és ezért egyáltalán nem cseréli le őket. A torz képek veszélyt jelentenek a pontosságra, csakúgy, mint az arcok, amelyek oldalra néznek a kamerába, és olyan tárgyak, amelyek részben elzárják az arcokat (például az ujjak). Ezért ajánlatos a modell összes paraméterét aprólékosan módosítani, és a feldolgozást manuális kezeléssel követni.

Az osztályozó kombinálása nyomkövetővel

Egy közelmúltbeli kliensprojektben egy „Omni-Scale Network” (OSNet) nyomkövetőt használtam az eredmények javítására. A nyomkövetők stabilizálhatják a kimenetet, különösen akkor, ha az objektumok időnként elzáródnak. Íme egy remek példa a GitHubon: "Valós idejű többkamerás többobjektum-követő YOLOv7 és StrongSORT segítségével OSNettel"

Multi-Treading

A Python multi-threadingje segíthet az I/O-igényes feladatokban. A gyakori Python-megvalósítások az úgynevezett „globális értelmező zárolást” (GIL) használják a szálak biztonsága érdekében. Egyszerre csak egy értelmező példány kerül végrehajtásra. Ha az értelmezőt nem használják – például az I/O-ra várva – a GIL felszabadul. Sikeresen javítottam a teljesítményt azáltal, hogy szétválasztottam a) a keretek megjelenítését és b) a kereteket külön osztályokba és „külön szálakba” mentem.

Többszörös feldolgozás oszd meg és uralkodj algoritmussal

Egyes forgatókönyvekben a párhuzamosság több folyamat használatával is elérhető. Ez egy másik ötlet, amelyet a fent említett kereskedelmi projektben valósítottam meg.

Ha a feladatunk nem a valós idejű videó streamelést foglalja magában, van egy olyan technika, amelyet az „Oszd meg és uralkodj algoritmus” néven hasznosíthatunk. Ez magában foglalja a bemeneti videó szakaszokra bontását, és ugyanazt a műveletet ezeken a szegmenseken egyidejűleg.

Tapasztalataim szerint ez jobb erőforrás-kihasználáshoz és gyorsabb végrehajtási időhöz vezet. Ha kíváncsi a részletekre: Gyorsabb videófeldolgozás Pythonban párhuzamos számítástechnikával

Etikai megfontolások

Mivel egy felgyorsult, pénzügyileg vezérelt világban élünk, csábító lehet figyelmen kívül hagyni vagy alábecsülni a technológiahasználat által okozott nem kívánt következményeket. Alapvető fontosságú azonban annak felismerése, hogy a technológiák – köztük a videó megfigyelés és a mesterséges intelligencia – felelősségteljes használata jelentős etikai súllyal bír.

Minden egyén, szervezet és fejlesztő felelőssége, hogy mérlegelje tetteik potenciális hatásait a magánéletre, a biztonságra és a társadalmi értékekre.

Következtetés

Amint láttuk, a magánélet védelme összetett feladat lehet, amely sok szempontot magában foglal. Tekintettel a lehetséges kockázatokra, valamint a területen egyre erősödő szabályozásra, úgy gondolom, hogy jól eltöltött idő. Az arc anonimizálásának legmodernebb módszerei manapság szinte bárki számára megvalósíthatók és használhatók, ami emberi erőforrást szabadít fel a bonyolultabb feladatok elvégzésére.

Az automatizálási technikák és a mesterséges intelligencia használata azzal a kötelezettséggel jár, hogy gondosan kell eljárni a kockázatok megértésében és csökkentésében, biztosítva az anonimitás megőrzését és az újraazonosítás kockázatának minimalizálását.

Ez magában foglalja a felhasználói hozzájárulás, az adatvédelem és az elfogult eredmények elkerülését. Ezen elvek betartásával kihasználhatjuk a technológia előnyeit, miközben minimalizáljuk a negatív következményeket, elősegítve egy felelősségteljesebb és igazságosabb technológiai környezet kialakítását.

Az első cikkemben az Ön visszajelzése hihetetlenül fontos. Akár kérdései, javaslatai, akár hozzáfűznivalói vannak, szívesen tanulok Öntől. Nyugodtan ossza meg észrevételeit alább, vagy lépjen kapcsolatba velem közvetlenül. Várom, hogy kapcsolatba léphessünk Önnel!

További források

Források

  • „Összehasonlító tanulmány a járművek valós idejű osztályozásáról”
  • „A támogatási vektorgépek és a járműfelismerés mélyreható tanulásának összehasonlítása”
  • „Tárgyérzékelés a forgalmi forgatókönyvekben – a hagyományos és a mély tanulási megközelítések összehasonlítása”
  • „Arcok anonimizálásának megtanulása a magánélet védelmét megőrző akcióészlelés érdekében”, Zhongzheng Ren, Yong Jae Lee, Michael S. Ryoo
  • „DeepPrivacy2: Towards Realistic Full Body anonymization”, Håkon Hukkelås, Frank Lindseth

Kép kreditek