Utambuzi wa uso (face detection) ndio lango la kwanza la mifumo mingi ya computer vision. Kila simu ya video, galari ya picha, na mtiririko wa usalama unategemea kutambua nyuso za binadamu kabla ya jambo lingine lolote kufanyika. Hata hivyo, uchaguzi wa modeli mara nyingi unalazimisha mabadilishano (trade-off) usioridhisha. Mitandao mizito inatoa usahihi lakini inahitaji GPU ghali na mifumo ya upozaji ya rack-mounted. Modeli ndogo zinafanya kazi kwenye vifaa vya kawaida lakini mara nyingi hushindwa kutambua nyuso ndogo au picha zenye utata wa juu (high-resolution). Modeli ya YuNet kutoka OpenCV Zoo inavunja mfumo huo. Nilitumia muda kupima utendaji wake katika vipimo tofauti ili kuona kama inastahili nafasi katika miradi halisi au inavutia tu kwenye karatasi.
Kwa nini YuNet Inastahili Kuangaliwa kwa Karibu
YuNet si kitu cha utafiti tu. Ipo ndani ya OpenCV Zoo, mkusanyiko wa modeli zilizofundishwa tayari (pre-trained) zilizoboreshwa kwa ajili ya moduli ya OpenCV DNN. Toleo maalum nililojaribu linatumia INT8 quantization, kumaanisha uzito (weights) na activations zake zinapunguzwa hadi kuwa namba za integer za bit 8 badala ya namba za kawaida za floating-point za bit 32. Hili si jambo dogo la kiufundi. INT8 inapunguza bandwidth ya kumbukumbu, inapunguza shinikizo la cache, na kuruhusu CPU za kisasa kufanya inference bila shida. Kwa yeyote anayejenga mifumo kwenye laptop, kifaa cha ukingoni (edge device), au seva isiyo na kadi ya picha (graphics card) maalum, ufanisi huu ndio tofauti kati ya mfumo mzuri na mfumo unaokwama kama slideshow.
Muundo (architecture) wenyewe ni mwepesi kwa asili. Unapunguza mzigo wa mifumo mikubwa (backbones) na unajikita kwenye kazi moja tu ya kutambua nyuso. Nidhamu hiyo inalipa unapohitaji kuunganisha utambuzi huo kwenye programu kubwa ambapo rasilimali za CPU na betri zinashirikishwa na ufuatiliaji (tracking), utambuzi (recognition), au uandishi wa video (video encoding).
Maandalizi
Majaribio yote yalifanyika kwenye Mac Studio yenye chip ya Apple M4 Max. Faili la modeli lilikuwa toleo la YuNet INT8 quantized ONNX kutoka kwenye repozitori ya OpenCV Zoo. Nimepima kasi ya inference kwenye picha ya 1280x720 kwanza, kisha nikalinganisha idadi ya nyuso zilizotambuliwa katika vipimo vinne tofauti vya picha ili kuelewa jinsi ukubwa unavyoathiri matokeo.
Ikiwa unataka kuhakiki namba hizi kwenye mashine yako mwenyewe, mchakato huu unaweza kurudiwa kikamilifu. Run amri zifuatazo ili kupata repozitori ya sparse na kuendesha kipimo (benchmark):
git clone --depth 1 --filter=blob:none --sparse https://github.com/kiarina/labs.git
cd labs
git sparse-checkout set .gitignore .mise/tasks Makefile mise.toml 2026/07/08/yunet-face-detection
mise -C 2026/07/08/yunet-face-detection run
Sparse checkout inafanya upakuaji uwe mdogo, na mise task runner inashughulikia utegemezi (dependencies) kwa nyuma. Huhitaji kupambana na mazingira ya Python au kusakinisha vifurushi (packages) kwa mkono.
Kasi Inayobaki Imara
Kwenye picha ya 1280x720, modeli ya INT8 YuNet ilichukua wastani wa milisekunde 9.21 kwa kila inference. Kasi ya haraka zaidi ilikuwa ms 8.03, wakati ya polepole zaidi ilikuwa ms 10.47. Hiyo ni tofauti ndogo sana. Chini ya milisekunde mbili na nusu hutenganisha muda bora na mbaya zaidi.
Katika matumizi ya vitendo, uthabiti huu ni muhimu zaidi kuliko sifa za kujivuna. Programu za wakati halisi (real-time) hazihitaji tu latency ndogo ya wastani; zinahitaji latency inayotabirika. Modeli inayochukua ms 50 wakati mwingine husababisha kusuasua (stutter) kwenye mtiririko wa webcam. YuNet inabaki imara. Unaweza kuitegemea kumaliza fremu moja kabla ya inayofuata kuingia, jambo ambalo hufanya kupanga mfumo wako mwingine kuwa rahisi zaidi.
Tofauti ya Ukubwa Inafichua Ukweli
Kasi ya raw ina maana ndogo ikiwa modeli itakosa nusu ya nyuso kwenye mandhari. Ili kujaribu hili, niliingiza picha zilezile kupitia YuNet katika vipimo vinne tofauti. Idadi hiyo inatoa picha halisi:
- 320 x 180: nyuso 6 zimetambuliwa
- 640 x 360: nyuso 26 zimetambuliwa
- 1280 x 720: nyuso 38 zimetambuliwa
- 2560 x 1440: nyuso 52 zimetambuliwa
Ongezeko hilo ni kubwa sana. Katika 320 x 180, nyuso kubwa na za karibu pekee ndizo zinatambuliwa. Ukiongeza hadi 640 x 360, idadi hiyo inazidika mara nne. Katika 1440p kamili, YuNet inapata nyuso zaidi ya mara nane kuliko ilivyopata kwenye kipimo cha chini kabisa.
Hii hutokea kwa sababu downsampling inaharibu maelezo (detail) haraka kuliko unavyoweza kufikiria. Uso unaochukua sehemu ndogo katika fremu ya 1440p unaweza kusinyaa na kuwa doa la piksel tano kwa tano kwenye 360p. Mara tu sifa za uso zinapopungua chini ya receptive field ya modeli, zinakuwa kelele (noise) zisizoonekana. Macho yanajichanganya na nyusi. Pua zinapotea. YuNet haina kitu cha kushikilia.
Matokeo ya vitendo yanayopaswa kukumbukwa ni haya. Ikiwa kamera yako inachukua picha ya upana (wide-angle) wa darasa, chumba cha mikutano, au kona ya mtaa, nyuso za mbali hazitaonekana isipokuwa uipe modeli piksel za kutosha. Hapa, resolution si kuhusu ubora wa picha tu. Ni lever ya moja kwa moja kwenye uwezo wa kutambua (recall).
Mkakati wa Kurekebisha Ukubwa (Resize) Unaohitaji Hivi Halisi
YuNet ni ya haraka kiasi kwamba huhitaji kulazimisha pembejeo yako iwe 320 x 240 kwa mazoea. Kwenye M4 Max, hata 2560 x 1440 inafanya kazi bila GPU maalum. Hilo linabadilisha jinsi unavyopaswa kuunda mfumo (pipeline).
Badala ya kulazimisha kila fremu ipite kwenye ukubwa mdogo uliowekwa, chagua azimio (resolution) la pembejeo kulingana na kile unachojaribu kutafuta. Ikiwa unajali tu mtu aliye mbele ya kamera moja kwa moja, 720p au hata 640p inatosha. Ikiwa unahitaji kuorodhesha kila mshiriki katika ukumbi mkubwa, ipatie modeli sehemu ya picha (crop) yenye azimio la juu au fremu nzima asilia. Kwa sababu YuNet ni nyepesi, una nafasi ya kufanya uamuzi huo. Haufungwi kwenye mipangilio mmoja (preset) ili kuepuka ucheleweshaji (lag) wa milisekunde 200.
Kuna angalizo moja linabaki. Modeli bado inategemea ukubwa wa uso kuhusiana na tensor ya pembejeo. Hakuna uwezo wa kipekee wa kutotegemea ukubwa (scale invariance) hapa. Nyuso ndogo zinaendelea kutokuonekana isipokuwa ziwe na piksel za kutosha. Suluhisho ni la kimekanika: badilisha ukubwa wa picha yako ya chanzo kwenda juu kabla ya utambuzi (inference) unapotafuta wahusika walio mbali, kisha uunganishe masanduku ya mipaka (bounding boxes) yanayotokana na hayo kwenye uratibu (coordinates) wa asili. YuNet inakupa muda wa kasi wa kumudu hatua hiyo.
Jinsi Hii Inavyofaa Katika Mfumo Wako
YuNet si suluhisho kwa kila kazi inayowezekana ya kutambua nyuso. Kufunikwa sana (heavy occlusion), pembe kali za upande, au uchimbaji wa 3D mesh viko nje ya uwezo wake. Lakini kwa kazi za msingi za kutambua nyuso kwenye picha na mtiririko wa video, inafanya kazi vizuri sana. Programu za webcam za wakati halisi (real-time), zana za uchujaji wa picha za kiotomatiki, na mifumo midogo ya embedded yote yananufaika na mtambuzi unaofanya kazi haraka kwenye CPU za kawaida.
Format ya INT8 ONNX pia inafanya uwekaji (deployment) kuwa rahisi. Huhitaji kusakinisha PyTorch au TensorFlow kwenye kifaa unacholenga. Moduli ya DNN ya OpenCV inapakia modeli moja kwa moja, jambo ambalo linaweka faili yako ya binary kuwa ndogo na mnyororo wako wa utegemezi (dependency tree) kuwa mfupi.
Hitimisho
YuNet inathibitisha kuwa utambuzi wa uso hauhitaji vifaa vya viwandani au mifumo mizito (bloated frameworks). Takwimu zinasema wazi: chini ya milisekunde kumi kwa fremu ya 720p, na ongezeko la moja kwa moja na linalotabirika la idadi ya utambuzi kadiri azimio linapoongezeka. Unapata nafasi ya kuchagua ikiwa unataka kasi ya juu kwa azimio la wastani au ufunuo mpana zaidi kwa kiwango cha juu, na modeli haitakuadhibu kwa uamuzi huo.
Ikiwa unajenga kitu chochote kinachohusiana na picha za ulimwengu halisi, endesha hatua za uzalishaji (reproduction steps) hapo juu kwenye vifaa vyako mwenyewe. Ijaribu dhidi ya video zako. Kisha rekebisha mantiki yako ya kubadilisha ukubwa ili kuendana na nyuso unazohitaji kuzipata. Kasi ni muhimu tu unapoweza kuielekeza. YuNet inakupa kasi na udhibiti kwa wakati mmoja.
