Камера арқылы қимылдарды тану немесе менің Swift Student Challenge 2021 жұмысымды тану

Сәлем, Менің атым Тамерлан, мен iOS қосымшаларын жасаушы және Astana IT University студентімін. Мен Swift-ті 16 жастан бастап Мобильді қосымшаларды жасау үшін қолданамын және жыл сайын WWDC алдында өткізілетін Swift Student Challenge-ге қызығушылық таныттым, бірақ мен өткен жарыстарға қатыса алмадым. Себептері әр түрлі болды, негізінен барлық упиралось кемшілік уақыт, бұл шешім қабылдадым мүйіз қиялдың және қабылдауға қатысу.

Кіріспе
Енді үлкен ақпарат дәуірінде сіз өзіңізді сенімді сезіну және осы ағымда жүру үшін жақсы есте сақтауыңыз керек. Бірде мен миды жақсарту және есте сақтау қабілетін дамыту техникасын қолыммен қимылдарды әртүрлі ретпен қайталау арқылы кездестірдім. Саусақ жаттығулары іс жүзінде мидың жақсы жұмыс істеуі үшін, уақтылы және дұрыс церебральды айналым үшін пайдалы. Осы идеядан шабыт алып, Мен жоба үшін осы тақырыпты таңдап, осы гимнастиканы ойнауды шештім.

Жобасы туралы
Бағдарламаны іске қосқан кезде Сізді екі ойын режимі бар мәзір қарсы алады: бірізділікті есте сақтаңыз және бірізділікті қайталаңыз.

Бірізділікті есте сақтау режиміндегі ойын алгоритмі өте қарапайым, сіз кездейсоқ жасалған қол қимылдарының тізбегін есте сақтауыңыз керек, содан кейін оны көрсетілген ретпен қайталауыңыз керек.

Қайталау режимі-бұл назар аударатын қимылды көрсетуге уақыт қажет ойын. Ойын механикасы Just Dance танымал ырғақ ойынының механикасына ұқсас болды

Әрине, бұл әлі де ойын болғандықтан, әр режимде ойынның күрделілігі сәйкесінше артады.

Бұл қалай жұмыс істейді?
Алгоритм

Енді ең қызығы, қолданушы қандай қимыл көрсеткенін қолданба қалай түсінетінін білейік. Бұл мәселенің шешімі бетінде жатыр, қол қимылы бұл жабық және ашық саусақтардың тіркесімі, сондықтан сол немесе басқа қимылды тану үшін біз қандай саусақтардың жабық немесе ашық екенін түсінуіміз керек. Мысалы, ешкінің қимылын көрсету үшін біз ортаңғы саусақты және сақинаны жауып, қалғандарын ашық қалдырамыз. Өте қарапайым, солай емес пе?

Осыдан саусақтың ашылғанын немесе жоқтығын қалай анықтауға болады? Жауап саусақтардың фалангтарында жатыр, әр фалангтан білекке дейінгі қашықтықты салыстыра отырып, біз саусақтың созылғанын оңай түсінеміз. Егер сұқ саусақты қарастыратын болсақ, дистальды фалангадан білекке дейінгі қашықтық проксимальды фалангадан қашықтыққа қарағанда үлкен. Бас бармақты бөлек қарастырған жөн, өйткені фалангтардан қашықтық созылуды анықтау үшін жеткіліксіз, өйткені бас бармақты жапқан кезде алгоритм оны жабық деп анықтауы үшін оны қатты бүгу керек. Бұл мәселені шешу үшін проксимальды және метакарпальды фалангтардан пайда болған бұрыштың мәнін анықтап, оны қандай да бір мәнмен салыстыру керек, менің жағдайда мен 170 градус бұрышпен салыстыру көп жағдайда дәл мән беретінін білдім.

Жүзеге асыру

Мұның бәрін қалай жүзеге асыруға болады? Vision. IOS 11 - ден бастап бізге компьютерлік көру алгоритмдерін қолдануға мүмкіндік беретін осы аң қол жетімді. Wwdc20-да олар қазір рамка қол мен денені тани алатындығын көрсетті, бұл қазір біздің өмірімізді айтарлықтай жеңілдетеді.

Сессияны құру, жалдау және делегатқа жазылу арқылы біз құрылғы көрген Қол туралы танылған деректерді ала бастаймыз. Деректер VNHumanHandPoseObservation класының мысалы болып табылады, ол өз кезегінде recognizedPoints (_:) әдісіне ие. Бұл әдіс саусақтың қажетті буындарының нүктелер тобының атауын алады деп күтеді, өйткені біз барлық буындардың нүктелерін алуымыз керек, біз VNHumanHandPoseObservation береміз.JointsGroupName.all. Соңында біз сөздік аламыз, онда кілт-буынның атауы, ал мәні – нүкте.

Төмендегі суретте біз көре аламыз Apple әр буынды қалай атады және соған сүйене отырып, біз сөздіктен барлық танылған нүктелерді аламыз. Бірақ сәттілік, бізге таныс емес нүкте түрі-CGPoint, бірақ кейбір VNRecognizedPoint. Бұл класс суреттегі немесе бейнедегі қалыпты танылған нүктені білдіреді және бұл класс VNDetectedPoint мұрагері болғандықтан, ол өз кезегінде VNPoint-тен мұра болғандықтан, біз суперкласс айнымалыларын қолдана аламыз : confidence : VNConfidence(танылған нүктенің дәлдігін анықтайды) және орналасуы: CGPoint(нүктенің кеңістіктегі орнын анықтайды). Конфиденцияның қасиеті VNConfidence типіне ие деп қорқудың қажеті жоқ, өйткені бұл тек Float-қа қарағанда алиас.

Нәтижесінде, осының бәріне ие бола отырып, біз confidence > 0.3 шартымен барлық нүктелерді оңай жинап, онымен жұмыс істей аламыз. Бұл жерде Y осі төменгі сол жақ бұрышта орналасқан, сондықтан AVFoundation координаттарына айналу үшін (жоғарғы сол жақ бұрыштағы Y осі) массивке жазылмас бұрын Y координатасын аудару керек. Нәтижесінде массивке жазу кезінде біз осы рухта бір нәрсе аламыз:

var filteredPoints = points.filter { $0.value.confidence > 0.3 }.mapValues { value in
return CGPoint(x: value.location.x, y: 1 - value.location.y)
}


Бұл оқиғада нүкте алу әлі аяқталған жоқ, енді біз бұл нүктені қайтадан түрлендіруіміз керек, бірақ қазірдің өзінде AVFoundation координаттарынан UIKit координаттарына. Бақытымызға орай, бұл камера қабатының функциясы, layerPointConverted(fromCaptureDevicePoint:), ол бізге қажетті нүктені қайтарады.

Сондай-ақ, бас бармақтың басқа буын атаулары бар екенін, олардың атауларымен танысу үшін суретті тіркейтінімді атап өткен жөн.

Барлық осы манипуляциялардан кейін бізде бұрын түсіндірген алгоритм бойынша жұмыс істеуге болатын нүктелер болуы керек. Нүктелер арасындағы қашықтықты және нүктелердің құрылған бұрышын табу үшін(бас бармақ үшін) сізге ұнайтын кез-келген математикалық формулаларды қолдануға болады.

Қорытынды
Apple-дің компьютерлік көру технологиясын дамытып, қызықты және пайдалы қосымшаларды құруға көбірек мүмкіндік беретіні өте керемет. Қазірдің өзінде Vision мүмкіндіктерімен біз мәтінді, штрих-кодтарды, бетті, қолды, адам денесін және т.б. тани аламыз.

Бұл мақалада Мен осы шеңберді жобаға енгізудің барлық нюанстарын егжей-тегжейлі қарастырмадым, өйткені мақаланың мақсаты ең алдымен қол қимылдарын тану алгоритмін көрсету болып табылады, бірақ мен бұл құралды толығырақ зерттеуді жалғастыруды ұсынамын.

Егер мен алгоритмді қалай іске қосқанымды Мұқият қарастырғым келсе, онда менің жұмысымның бастапқы коды ашық, оны мына жерден көруге болады (жұлдыздарды қоюды ұмытпаңыз).

Мақала коммьюнитидің бір бөлігі үшін пайдалы болды деп үміттенемін, Мен кез-келген фидбекке қуаныштымын!

Айта кетейік, Astana Hub IT-стартаптар халықаралық технопаркінің барлық қатысушылары салық жеңілдіктеріне ие болады. Преференциялар қатысушыларды КТС, ҚҚС, тауарлар импортына ҚҚС, роялти салығы, ЖТС және резидент еместер үшін әлеуметтік салық сияқты салықтарды төлеуден босатады. Мемлекеттік қолдаудың осындай шарасы IT-компанияларға үнемделген қаражатты өз жобаларын дамытуға қайта инвестициялауға мүмкіндік береді.

Пікірлер 1

Кіру пікір қалдыру үшін

Идея очень крутая! Тамерлан, Вы молодец!

Жауап беру