/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 - 2 0 2 2 ĠJetBrains Ġs . r . o . Ġand ĠKotlin ĠDeep ĠLearning Ġproject Ġcontributors . ĠAll ĠRights ĠReserved . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE . txt Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin x . dl . api . inference . onnx . pose detection Ċ Ċ import Ġorg . jetbrains . kotlin x . dl . api . inference . onnx . ON NX Models Ċ import Ġorg . jetbrains . kotlin x . dl . api . inference . onnx . On nx Inference Model Ċ import Ġorg . jetbrains . kotlin x . dl . api . inference . pose detection . Detected Pose Ċ import Ġorg . jetbrains . kotlin x . dl . api . inference . pose detection . Pose Edge Ċ import Ġorg . jetbrains . kotlin x . dl . api . inference . pose detection . Pose Land mark Ċ import Ġorg . jetbrains . kotlin x . dl . dataset . image . Color Mode Ċ import Ġorg . jetbrains . kotlin x . dl . dataset . preprocessor . Pre processing Ċ import Ġorg . jetbrains . kotlin x . dl . dataset . preprocessor . image . convert Ċ import Ġorg . jetbrains . kotlin x . dl . dataset . preprocessor . image . resize Ċ import Ġorg . jetbrains . kotlin x . dl . dataset . preprocessor . preprocess Ċ import Ġorg . jetbrains . kotlin x . dl . dataset . preprocessor . transform Image Ċ import Ġjava . io . File Ċ import Ġjava . lang . Float . min Ċ Ċ private Ġconst Ġval ĠOUTPUT _ NAME Ġ= Ġ" output _ 0 " Ċ Ċ /** Ċ Ġ* ĠSingle Pose Detection Model Ġis Ġan Ġul tra - fast Ġand Ġaccurate Ġmodel Ġthat Ġdetect s Ġ 1 7 Ġkey points Ġand Ġ 1 8 Ġbasic Ġedges Ġof Ġa Ġbody . Ċ Ġ* Ċ Ġ* ĠIt Ġinternally Ġuses Ġ[ ON NX Models . Pose Estimation . Move Net Single Pose Lighting ] Ċ Ġ* Ġor Ġ[ ON NX Models . Pose Estimation . Move Net Single Pose Th under ] Ġunder Ġthe Ġh ood Ġto Ġmake Ġpredictions . Ċ Ġ*/ Ċ public Ġclass ĠSingle Pose Detection Model Ġ: ĠOn nx Inference Model () Ġ{ ĊĠĠĠ Ġpublic Ġfun Ġdetect Pose ( input Data : ĠFloat Array ): ĠDet ected Pose Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġraw Prediction Ġ= Ġthis . predict Raw ( input Data ) ĊĠĠĠĠĠĠĠ Ġval Ġraw Pose Land Marks Ġ= Ġ( raw Prediction [ OUTPUT _ NAME ] Ġas ĠArray < Array < Array < Float Array >> >) [ 0 ][ 0 ] ĊĊĠĠĠĠĠĠĠ Ġval Ġfound Pose Land marks Ġ= Ġmutable ListOf < Pose Land mark >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġraw Pose Land Marks . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpose Land mark Ġ= ĠP ose Land mark ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpose Land mark Label Ġ= Ġkey Points [ i ] !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ= Ġraw Pose Land Marks [ i ][ 1 ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy Ġ= Ġraw Pose Land Marks [ i ][ 0 ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprobability Ġ= Ġraw Pose Land Marks [ i ][ 2 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfound Pose Land marks . add ( i , Ġpose Land mark ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġfound Pose Edges Ġ= Ġbuild Pose Edges ( found Pose Land marks ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠDet ected Pose ( found Pose Land marks , Ġfound Pose Edges ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun Ġdetect Pose ( image File : ĠFile ): ĠDet ected Pose Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġheight Ġ= Ġinput Shape [ 1 ] ĊĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġinput Shape [ 2 ] ĊĊĠĠĠĠĠĠĠ Ġval Ġpreprocessing Ġ= Ġpreprocess Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransform Image Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresize Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Height Ġ= Ġheight . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Width Ġ= Ġwidth . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconvert Ġ{ Ġcolor Mode Ġ= ĠColor Mode . BGR Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġ( data , Ġshape ) Ġ= Ġpreprocessing ( image File ) ĊĊĠĠĠĠĠĠĠ Ġval Ġpre processed Data Ġ= ĠON NX Models . Pose Estimation . Move Net Single Pose Lighting . preprocess Input ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlong ArrayOf ( shape . width !! , Ġshape . height !! , Ġshape . channels !! ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis . detect Pose ( pre processed Data ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġfun Ġbuild Pose Edges ( found Pose Land marks : ĠMutable List < Pose Land mark >): ĠMutable List < Pose Edge > Ġ{ ĊĠĠĠ Ġval Ġfound Pose Edges Ġ= Ġmutable ListOf < Pose Edge >() ĊĠĠĠ Ġedge Key Points Pairs . forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstart Point Ġ= Ġfound Pose Land marks [ it . first ] ĊĠĠĠĠĠĠĠ Ġval Ġend Point Ġ= Ġfound Pose Land marks [ it . second ] ĊĠĠĠĠĠĠĠ Ġfound Pose Edges . add ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠP ose Edge ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpose Edge Label Ġ= Ġstart Point . pose Land mark Label Ġ+ Ġ"_" Ġ+ Ġend Point . pose Land mark Label , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprobability Ġ= Ġmin ( start Point . probability , Ġend Point . probability ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= Ġstart Point , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġ= Ġend Point ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġfound Pose Edges Ċ } Ċ Ċ /** Ċ Ġ* ĠDictionary Ġthat Ġmaps Ġfrom Ġjoint Ġnames Ġto Ġkey point Ġindices . Ċ Ġ*/ Ċ public Ġval Ġkey Points : ĠMap < Int , ĠString > Ġ= Ġmap Of ( ĊĠĠĠĠ 0 Ġto Ġ" nose ", ĊĠĠĠĠ 1 Ġto Ġ" left _ eye ", ĊĠĠĠĠ 2 Ġto Ġ" right _ eye ", ĊĠĠĠĠ 3 Ġto Ġ" left _ ear ", ĊĠĠĠĠ 4 Ġto Ġ" right _ ear ", ĊĠĠĠĠ 5 Ġto Ġ" left _ sh oulder ", ĊĠĠĠĠ 6 Ġto Ġ" right _ sh oulder ", ĊĠĠĠĠ 7 Ġto Ġ" left _ el bow ", ĊĠĠĠĠ 8 Ġto Ġ" right _ el bow ", ĊĠĠĠĠ 9 Ġto Ġ" left _ w rist ", ĊĠĠĠĠ 1 0 Ġto Ġ" right _ w rist ", ĊĠĠĠĠ 1 1 Ġto Ġ" left _ hip ", ĊĠĠĠĠ 1 2 Ġto Ġ" right _ hip ", ĊĠĠĠĠ 1 3 Ġto Ġ" left _ k nee ", ĊĠĠĠĠ 1 4 Ġto Ġ" right _ k nee ", ĊĠĠĠĠ 1 5 Ġto Ġ" left _ ank le ", ĊĠĠĠĠ 1 6 Ġto Ġ" right _ ank le " Ċ ) Ċ Ċ /** Ċ Ġ* ĠPair Ġof Ġpoints Ġwhich Ġdefine Ġbody Ġedges . Ċ Ġ*/ Ċ public Ġval Ġedge Key Points Pairs : ĠList < Pair < Int , ĠInt >> Ġ= ĠlistOf ( ĊĠĠĠ ĠPair ( 0 , Ġ 1 ), ĊĠĠĠ ĠPair ( 0 , Ġ 2 ), ĊĠĠĠ ĠPair ( 1 , Ġ 3 ), ĊĠĠĠ ĠPair ( 2 , Ġ 4 ), ĊĠĠĠ ĠPair ( 0 , Ġ 5 ), ĊĠĠĠ ĠPair ( 0 , Ġ 6 ), ĊĠĠĠ ĠPair ( 5 , Ġ 7 ), ĊĠĠĠ ĠPair ( 7 , Ġ 9 ), ĊĠĠĠ ĠPair ( 6 , Ġ 8 ), ĊĠĠĠ ĠPair ( 8 , Ġ 1 0 ), ĊĠĠĠ ĠPair ( 5 , Ġ 6 ), ĊĠĠĠ ĠPair ( 5 , Ġ 1 1 ), ĊĠĠĠ ĠPair ( 6 , Ġ 1 2 ), ĊĠĠĠ ĠPair ( 1 1 , Ġ 1 2 ), ĊĠĠĠ ĠPair ( 1 1 , Ġ 1 3 ), ĊĠĠĠ ĠPair ( 1 3 , Ġ 1 5 ), ĊĠĠĠ ĠPair ( 1 2 , Ġ 1 4 ), ĊĠĠĠ ĠPair ( 1 4 , Ġ 1 6 ) Ċ ) Ċ