рд▓реЗрдЦ рдХрд╛ рд▓реЗрдЦрдХ, рдЬрд┐рд╕рдХрд╛ рдЕрдиреБрд╡рд╛рдж рд╣рдо рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡реЗрдм рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрдВрдкреНрдпреВрдЯрд░ рджреГрд╖реНрдЯрд┐ рдХреЗ рдХреНрд╖реЗрддреНрд░ рд╕реЗ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛
рд╕рдорд╛рдзрд╛рди рдХрд░рдирд╛
рдЯреЗрдиреНрд╕рд░рдлреНрд▓реЛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдореЙрдбрд▓ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдФрд░ рддреИрдпрд╛рд░ рдЙрддреНрдкрд╛рдж рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдЙрдиреНрд╣реЗрдВ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдбреЗрдЯрд╛ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдФрд░ рдЕрдкрдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкрд░ рд╕реАрдзреЗ рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдореЙрдбрд▓ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рджреЗрдВрдЧреЗред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реИред

рдЖрдк рдЕрдиреБрднрд╡ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╕рд╛рдордЧреНрд░реА
рдпрд╣рд╛рдВ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рд╕рдорд░реНрдкрд┐рдд
рд╣реИ ред рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдПрдХ рдЖрдзреБрдирд┐рдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░, рд╡реЗрдм рдХреИрдорд░рд╛ рдФрд░ рдорд╛рдЙрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рдпрд╣рд╛рдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рд╕реЛрд░реНрд╕ рдХреЛрдб рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЙрдиреНрд╣реЗрдВ рдореЛрдмрд╛рдЗрд▓ рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓реЗрдЦрдХ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рдЙрдкрдпреБрдХреНрдд рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рд╕рдордп рдирд╣реАрдВ рдерд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд╣ рдиреЛрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдЖрдк рдПрдХ рдЪрд▓рддреЗ рдХреИрдорд░реЗ рд╕реЗ рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣рд╛рдВ рдорд╛рдирд╛ рдЧрдпрд╛ рдХрд╛рд░реНрдп рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
рд╡рд┐рдЪрд╛рд░
рдЖрдЗрдП рдорд╢реАрди рд╕реАрдЦрдиреЗ рдХреА рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд┐рд╕реА рд╡реЗрдм рдкреЗрдЬ рдХреЛ рджреЗрдЦрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рд╣рдо рдПрдХ рд╡реЗрдмрдХреИрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрд╕рдХреА рдЖрдБрдЦреЛрдВ рдХреЛ рджреЗрдЦрдХрд░ рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВред
рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рд╡реЗрдмрдХреИрдо рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рдпрджрд┐ рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХреИрдорд░реЗ рд╕реЗ рдкреВрд░реА рдЫрд╡рд┐ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдПрдЧреА, рддреЛ рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдмрдбрд╝реА рд╣реИред рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдЫрд╡рд┐ рдкрд░ рдЬрдЧрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХрд╛рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрд╣рд╛рдВ рдЖрдБрдЦреЗрдВ рд╣реИрдВред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЦреБрдж рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рджрд┐рдЦрд╛ рд╕рдХрддрд╛ рд╣реИ рдЕрдЧрд░ рд╣рдо рдПрдХ рдореЙрдбрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдбреЗрд╡рд▓рдкрд░ рдЕрдкрдиреЗ рдЖрдк рд╕реЗ рдЯреНрд░реЗрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рд░реНрд╡рд░ рдкрд░ рддреИрдирд╛рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдХрд┐рд╕реА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдФрд░ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИред
рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕реЗ рдХреЗрд╡рд▓ рдЫрд╡рд┐ рдХреЗ рдПрдХ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд╕рд╛рде рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдПрдХ рдЬрд┐рд╕рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдЖрдВрдЦреЗрдВ рдФрд░ рдЙрдирдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рдЫреЛрдЯрд╛ рдХреНрд╖реЗрддреНрд░ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдХреНрд╖реЗрддреНрд░, рдЬреЛ рдЖрдВрдЦреЛрдВ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рдЖрдпрдд рд╣реИ, рдХреЛ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╣рдЪрд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдХрд╛рдо рдХрд╛ рдкрд╣рд▓рд╛ рд╣рд┐рд╕реНрд╕рд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
рд╡реЗрдм рдХреИрдорд░рд╛ рдЗрдирдкреБрдЯ, рдлреЗрд╕ рд░рд┐рдХрдЧреНрдирд┐рд╢рди, рдЖрдИ рдбрд┐рдЯреЗрдХреНрд╢рди, рдХреНрд░реЙрдкреНрдб рдЗрдореЗрдЬрдЫрд╡рд┐ рдореЗрдВ рдЪреЗрд╣рд░реЗ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд┐рд╕реЗ
рдХреНрд▓реИрдордЯреНрд░рдХ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕рд╣реА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЫреЛрдЯреЗ рдЖрдХрд╛рд░, рдЕрдЪреНрдЫреЗ рдкреНрд░рджрд░реНрд╢рди рдФрд░, рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ, рдЧрд░рд┐рдорд╛ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде рдЕрд▓рдЧ рд╣реИред
рдпрджрд┐ рдПрдХ рдЫреЛрдЯреА рд▓реЗрдХрд┐рди рд╕рдордЭрджрд╛рд░реА рд╕реЗ рдЪреБрдиреА рдЧрдИ рдЫрд╡рд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рд╕рд░рд▓ рджреГрдврд╝ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдиреЗрдЯрд╡рд░реНрдХ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕реАрдЦ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рджрд┐рдЦрддреА рд╣реИ:
рдЗрдирдкреБрдЯ рдЫрд╡рд┐, рдореЙрдбрд▓ рдПрдХ рджреГрдврд╝ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рд╣реИ, рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ, рдЙрд╕ рд╕реНрдерд╛рди рдкрд░ рдиреЗрдЯрд╡рд░реНрдХ рджреНрд╡рд╛рд░рд╛ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХреА рдЧрдИ рдЬрдЧрд╣ рдЬрд╣рд╛рдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреЗрдЦ рд░рд╣рд╛ рд╣реИредрдЗрд╕ рдЦрдВрдб рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд┐рдП рдЧрдП рд╡рд┐рдЪрд╛рд░реЛрдВ рдХрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдиреНрдпреВрдирддрдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдпрд╣рд╛рдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдкрд░рд┐рдпреЛрдЬрдирд╛, рдЬрд┐рд╕рдХрд╛ рдХреЛрдб
рдЗрд╕ рднрдВрдбрд╛рд░ рдореЗрдВ рд╣реИ, рдореЗрдВ рдХрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВред
рдЯреНрд░реЗрдирд┐рдВрдЧ
рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдкрдпреБрдХреНрдд
рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ
clmtrackr.js
ред рд╣рдо рдПрдХ рдЦрд╛рд▓реА HTML рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреЗ рд╕рд╛рде jQuery, TensorFlow.js, clmtrackr.js рдФрд░
main.js
рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЖрдпрд╛рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ:
<!doctype html> <html> <body> <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@0.12.0"></script> <script src="clmtrackr.js"></script> <script src="main.js"></script> </body> </html>
рдПрдХ рд╡реЗрдм рдХреИрдорд░рд╛ рд╕реЗ рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
рд╡реЗрдмрдХреИрдо рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░рдиреЗ рдФрд░ рдкреГрд╖реНрда рдкрд░ рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдЕрдиреБрдорддрд┐ рд▓реЗрдиреА рд╣реЛрдЧреАред рдпрд╣рд╛рдВ рдореИрдВ рдХреЛрдб рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреА рд╕рдВрдЧрддрддрд╛ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред рд╣рдо рдЗрд╕ рдзрд╛рд░рдгрд╛ рд╕реЗ рдЖрдЧреЗ рдмрдврд╝реЗрдВрдЧреЗ рдХрд┐ рд╣рдорд╛рд░реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ Google Chrome рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред
HTML рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рдореНрди рдХреЛрдб рдЬреЛрдбрд╝реЗрдВред рдЗрд╕реЗ
<body>
рднреАрддрд░ рд╕реНрдерд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди
<script>
рдЯреИрдЧ рдХреЗ рдКрдкрд░:
<video id="webcam" width="400" height="300" autoplay></video>
рдЕрдм
main.js
рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ:
$(document).ready(function() { const video = $('#webcam')[0]; function onStreaming(stream) { video.srcObject = stream; } navigator.mediaDevices.getUserMedia({ video: true }).then(onStreaming); });
рдЗрд╕ рдХреЛрдб рдХреЛ рдЕрдкрдиреЗ рджрдо рдкрд░ рдЖрдЬрд╝рдорд╛рдПрдВред рдЬрдм рдЖрдк рдкреГрд╖реНрда рдЦреЛрд▓рддреЗ рд╣реИрдВ, рддреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдЕрдиреБрдорддрд┐ рдХреЗ рд▓рд┐рдП рдкреВрдЫрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдлрд┐рд░ рд╡реЗрдм рдХреИрдорд░рд╛ рд╕реЗ рдПрдХ рддрд╕реНрд╡реАрд░ рд╕реНрдХреНрд░реАрди рдкрд░ рджрд┐рдЦрд╛рдИ рджреЗрдЧреАред
рдмрд╛рдж рдореЗрдВ рд╣рдо
onStreaming()
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХреЛрдб рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВрдЧреЗред
рдЪреЗрд╣рд░реЗ рдХреА рдЦреЛрдЬ
рдЕрдм рд╡реАрдбрд┐рдпреЛ рдореЗрдВ рдЪреЗрд╣рд░реЗ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП clmtrackr.js рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ,
const video = ...
рдХреЗ рдмрд╛рдж рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдЬреЛрдбрд╝рдХрд░ рдлреЗрд╕ рдЯреНрд░реИрдХрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░реЗрдВ
const video = ...
:
const ctrack = new clm.tracker(); ctrack.init();
рдЕрдм,
onStreaming()
рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдб рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдЪреЗрд╣рд░реЗ рдХреА рдЦреЛрдЬ рдкреНрд░рдгрд╛рд▓реА рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:
ctrack.start(video);
рд╣рдореЗрдВ рдмрд╕ рдЗрддрдирд╛ рд╣реА рдЪрд╛рд╣рд┐рдПред рдЕрдм рд╕рд┐рд╕реНрдЯрдо рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдЪреЗрд╣рд░реЗ рдХреЛ рдкрд╣рдЪрд╛рдирдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ред
рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реЛрддрд╛? рдпрд╣ рд╕рдЪ рд╣реИ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдЪреЗрд╣рд░реЗ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ "рдореБрдЦреМрдЯрд╛" рдмрдирд╛рдПрдВред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╡реАрдбрд┐рдпреЛ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рддрддреНрд╡ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдЫрд╡рд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреА рд╣реЛрдЧреАред рдЖрдк
<canvas>
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ HTML рдкреГрд╖реНрдареЛрдВ рдкрд░ рдХреБрдЫ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рд╣рдо рд╡реАрдбрд┐рдпреЛ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рддрддреНрд╡ рдкрд░ рд╕реБрдкрд░рдЗрдореНрдкреЛрдЬрд╝ рдХрд░рдХреЗ рдПрдХ рдРрд╕рд╛ рддрддреНрд╡ рдмрдирд╛рдПрдВрдЧреЗред рдирд┐рдореНрди рдХреЛрдб рд╣рдореЗрдВ рдЗрд╕рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛, рдЬрд┐рд╕реЗ
<video>
рддрддреНрд╡ рдХреЗ рддрд╣рдд HTML рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИ:
<canvas id="overlay" width="400" height="300"></canvas> <style> #webcam, #overlay { position: absolute; top: 0; left: 0; } </style>
рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ, рддреЛ рдЖрдк рдЗрдирд▓рд╛рдЗрди рд╢реИрд▓реА рдХреЛ рдПрдХ рдЕрд▓рдЧ рд╕реАрдПрд╕рдПрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣рд╛рдВ рд╣рдордиреЗ
<video>
рддрддреНрд╡ рдХреЗ рд╕рдорд╛рди рдкреГрд╖реНрда рдореЗрдВ
<canvas>
рдЬреЛрдбрд╝рд╛ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рддрддреНрд╡реЛрдВ рдХреЛ рдЙрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рдпрд╣рд╛рдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреА рдЧрдИ рд╢реИрд▓рд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЕрдм, рд╣рд░ рдмрд╛рд░ рдЬрдм рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╡реАрдбрд┐рдпреЛ рдХреЗ рдЕрдЧрд▓реЗ рдлреНрд░реЗрдо рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╣рдо
<canvas>
рдкрд░ рдХреБрдЫ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдлреНрд░реЗрдо рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рджреМрд░рд╛рди рдХрд┐рд╕реА рднреА рдХреЛрдб рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди
requestAnimationLoop()
рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо
<canvas>
рд▓рд┐рдП рдХреБрдЫ рднреА рдЖрдЙрдЯрдкреБрдЯ рдХрд░реЗрдВ, рд╣рдореЗрдВ рдЗрд╕реЗ рд╣рдЯрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕реЗ рд╣рдЯрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдлрд┐рд░ рд╣рдо рдЧреНрд░рд╛рдлрд┐рдХ рдХреЛ рд╕реАрдзреЗ
<canvas>
рдкрд░ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
clmtrackr
рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣рд╛рдБ рд╡рд╣ рдХреЛрдб рд╣реИ рдЬреЛ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдордиреЗ рдЕрднреА рдмрд╛рдд рдХреА рд╣реИред рдЗрд╕реЗ
ctrack.init()
рдХрдорд╛рдВрдб рдХреЗ рдиреАрдЪреЗ рдЬреЛрдбрд╝реЗрдВ:
const overlay = $('#overlay')[0]; const overlayCC = overlay.getContext('2d'); function trackingLoop() { // , , // - . requestAnimationFrame(trackingLoop); let currentPosition = ctrack.getCurrentPosition(); overlayCC.clearRect(0, 0, 400, 300); if (currentPosition) { ctrack.draw(overlay); } }
рдЕрдм
trackingLoop()
рдлрдВрдХреНрд╢рди рдХреЛ
onStreaming()
рдлрдВрдХреНрд╢рди рдореЗрдВ
onStreaming()
рддреБрд░рдВрдд рдмрд╛рдж
ctrack.start()
ред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рддреНрдпреЗрдХ рдлреНрд░реЗрдо рдореЗрдВ рд╕реНрд╡рдпрдВ рдХреЗ рдкреБрдирд░рд╛рд░рдВрдн рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдПрдЧрд╛ред
рдкреЗрдЬ рдХреЛ рд░рд┐рдлреНрд░реЗрд╢ рдХрд░реЗрдВ рдФрд░ рд╡реЗрдмрдХреИрдо рдкрд░ рджреЗрдЦреЗрдВред рдЖрдкрдХреЛ рд╡реАрдбрд┐рдпреЛ рд╡рд┐рдВрдбреЛ рдореЗрдВ рдЕрдкрдиреЗ рдЪреЗрд╣рд░реЗ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рд╣рд░реЗ рд░рдВрдЧ рдХрд╛ "рдорд╛рд╕реНрдХ" рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рдХрднреА-рдХрднреА, рдЪреЗрд╣рд░реЗ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкрд╣рдЪрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдлреНрд░реЗрдо рдореЗрдВ рдЕрдкрдиреЗ рд╕рд┐рд░ рдХреЛ рдереЛрдбрд╝рд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдЪреЗрд╣рд░реЗ рдХреА рдкрд╣рдЪрд╛рди рдХреЗ рдкрд░рд┐рдгрд╛рдордЖрдВрдЦреЛрдВ рд╕реЗ рдпреБрдХреНрдд рдЫрд╡рд┐ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдкрд╣рдЪрд╛рдиреЗрдВ
рдЕрдм рд╣рдореЗрдВ рдЙрд╕ рдЫрд╡рд┐ рдХреЗ рдЖрдпрддрд╛рдХрд╛рд░ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЖрдБрдЦреЗрдВ рд╕реНрдерд┐рдд рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ
<canvas>
ред
рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, cmltracker рд╣рдореЗрдВ рди рдХреЗрд╡рд▓ рдЪреЗрд╣рд░реЗ рдХреЗ рд╕реНрдерд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рджреЗрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ 70 рдирд┐рдпрдВрддреНрд░рдг рдмрд┐рдВрджреБ рднреА рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк cmltracker рдХреЗ
рдкреНрд░рд▓реЗрдЦрди рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдг рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рдЪрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдирд┐рдпрдВрддреНрд░рдг рдЕрдВрдХрд╣рдо рддрдп рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдВрдЦреЗрдВ рдЫрд╡рд┐ рдХрд╛ рдЖрдпрддрд╛рдХрд╛рд░ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рд╕реАрдорд╛рдПрдВ 23, 28, 24 рдФрд░ 26 рдХреЛ рдЫреВрддреА рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рджрд┐рд╢рд╛ рдореЗрдВ 5 рдкрд┐рдХреНрд╕реЗрд▓ рддрдХ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╣реЛрддреА рд╣реИрдВред рдЗрд╕ рдЖрдпрдд рдореЗрдВ рд╡рд╣ рд╕рдм рдХреБрдЫ рд╢рд╛рдорд┐рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдкрдиреЗ рд╕рд┐рд░ рдХреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рди рдЭреБрдХрд╛ рд▓реЗред
рдЕрдм, рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдЫрд╡рд┐ рдХреЗ рдЗрд╕ рдЯреБрдХрдбрд╝реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗрдВ, рд╣рдореЗрдВ рдЗрд╕рдХреЗ рдЙрддреНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░
<canvas>
рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдбрд╛рдЗрдореЗрдВрд╢рди 50x25 рдкрд┐рдХреНрд╕рд▓ рд╣реЛрдЧрд╛ред рдЖрдБрдЦреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЖрдпрдд рдЗрд╕ рддрддреНрд╡ рдореЗрдВ рдлрд┐рдЯ рд╣реЛрдЧрд╛ред рдереЛрдбрд╝рд╛ рдЫрд╡рд┐ рд╡рд┐рд░реВрдкрдг рдПрдХ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред
рдЗрд╕ рдХреЛрдб рдХреЛ HTML рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ рдЬреЛ
<canvas>
рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЙрд╕ рдЫрд╡рд┐ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рдЖрдБрдЦреЗрдВ рд╣реИрдВ:
<canvas id="eyes" width="50" height="25"></canvas> <style> #eyes { position: absolute; top: 0; right: 0; } </style>
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлрд╝рдВрдХреНрд╢рди
x
рдФрд░
y
рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд▓реМрдЯрд╛рдПрдЧрд╛, рд╕рд╛рде рд╣реА рдЖрдВрдЦреЛрдВ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЗ рдЖрдпрдд рдХреА рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдВрдЪрд╛рдИ рднреАред рдпрд╣, рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ, clmtrackr рд╕реЗ рдкреНрд░рд╛рдкреНрдд
positions
рдХреА рдПрдХ рд╕рд░рдгреА рд▓реЗрддрд╛ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ clmtrackr рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдкреНрд░рддреНрдпреЗрдХ рд╕рдордиреНрд╡рдп рдореЗрдВ рдШрдЯрдХ
x
рдФрд░
y
ред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ
main.js
рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
function getEyesRectangle(positions) { const minX = positions[23][0] - 5; const maxX = positions[28][0] + 5; const minY = positions[24][1] - 5; const maxY = positions[26][1] + 5; const width = maxX - minX; const height = maxY - minY; return [minX, minY, width, height]; }
рдЕрдм, рдкреНрд░рддреНрдпреЗрдХ рдлреНрд░реЗрдо рдореЗрдВ, рд╣рдо рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рд╕реЗ рдЖрдВрдЦреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЖрдпрдд рдирд┐рдХрд╛рд▓рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕реЗ
<canvas>
рдкрд░ рдПрдХ рд▓рд╛рд▓ рд░реЗрдЦрд╛ рдХреЗ рд╕рд╛рде рд╕рд░реНрдХрд▓ рдХрд░реЗрдВ, рдЬреЛ
<video>
рддрддреНрд╡ рдкрд░ рд╕реБрдкрд░рд┐рдВрдкреЛрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдирдП
<canvas>
рдХреЙрдкреА рдХрд░реЗрдВред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдореЗрдВ рдЙрд╕ рдХреНрд╖реЗрддреНрд░ рдХреА рд╕рд╣реА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рдВрдХреЗрддрдХ
resizeFactorX
рдФрд░
resizeFactorY
рдЧрдгрдирд╛ рдХрд░реЗрдВрдЧреЗред
trackingLoop()
рдХреЛрдб рдореЗрдВ
if
рдмреНрд▓реЙрдХ рдХреЛ рдмрджрд▓реЗрдВ
trackingLoop()
рдирд┐рдореНрди рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдп рдХрд░реЗрдВ:
if (currentPosition) { // , // <canvas>, <video> ctrack.draw(overlay); // , , // const eyesRect = getEyesRectangle(currentPosition); overlayCC.strokeStyle = 'red'; overlayCC.strokeRect(eyesRect[0], eyesRect[1], eyesRect[2], eyesRect[3]); // , // // const resizeFactorX = video.videoWidth / video.width; const resizeFactorY = video.videoHeight / video.height; // // <canvas> const eyesCanvas = $('#eyes')[0]; const eyesCC = eyesCanvas.getContext('2d'); eyesCC.drawImage( video, eyesRect[0] * resizeFactorX, eyesRect[1] * resizeFactorY, eyesRect[2] * resizeFactorX, eyesRect[3] * resizeFactorY, 0, 0, eyesCanvas.width, eyesCanvas.height ); }
рдЕрдм рдкреГрд╖реНрда рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдЖрдВрдЦреЛрдВ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рд▓рд╛рд▓ рдЖрдпрдд рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЗрд╕ рдЖрдпрдд рдореЗрдВ рдЬреЛ рд╕рдВрдЧрдд рд╣реИ рд╡рд╣ рд╣реИ
<canvas>
ред рдпрджрд┐ рдЖрдкрдХреА рдЖрдВрдЦреЗрдВ рдореЗрд░реА рддреБрд▓рдирд╛ рдореЗрдВ рдмрдбрд╝реА рд╣реИрдВ, рддреЛ
getEyeRectangle
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВред
<рдХреИрдирд╡рд╛рд╕> рддрддреНрд╡ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдЖрдВрдЦреЛрдВ рдХреА рдЫрд╡рд┐ рд╡рд╛рд▓реЗ рдПрдХ рдЖрдпрдд рдХреЛ рдЦреАрдВрдЪрддрд╛ рд╣реИрдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣
рдбреЗрдЯрд╛ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдЙрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЬреЛ рдорд╛рдЙрд╕ рдФрд░ рдХреАрдмреЛрд░реНрдб рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреГрд╖реНрда рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдХрд░реНрд╕рд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЙрд╕реЗ рдЕрдкрдиреА рдЖрдВрдЦреЛрдВ рд╕реЗ рджреЗрдЦрддрд╛ рд╣реИ, рд╣рд░ рдмрд╛рд░ рдХреАрдмреЛрд░реНрдб рдкрд░
рджрдмрд╛рддреЗ рд╣реБрдП рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдПрдХ рдФрд░ рдирдореВрдирд╛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, рдореЙрдбрд▓ рдХреЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдбрд╝реЗ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред
тЦНMouse рдЯреНрд░реИрдХрд┐рдВрдЧ
рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╡реЗрдм рдкреЗрдЬ рдкрд░ рдорд╛рдЙрд╕ рдкреЙрдЗрдВрдЯрд░ рдХрд╣рд╛рдВ рд╕реНрдерд┐рдд рд╣реИ, рд╣рдореЗрдВ рдПрдХ
document.onmousemove
рдЬрд░реВрд░рдд рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдп рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╡реЗ рд╕реАрдорд╛ рдореЗрдВ рдлрд┐рдЯ рд╣реЛ рдЬрд╛рдПрдВ [-1, 1]:
// : const mouse = { x: 0, y: 0, handleMouseMove: function(event) { // , [-1, 1] mouse.x = (event.clientX / $(window).width()) * 2 - 1; mouse.y = (event.clientY / $(window).height()) * 2 - 1; }, } document.onmousemove = mouse.handleMouseMove;
тЦН рдЫрд╡рд┐ рдкрд░ рдХрдмреНрдЬрд╛
<canvas>
рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдЫрд╡рд┐ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЗрд╕реЗ рдЯреЗрдВрд╕рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, TensorFlow.js рд╣реЗрд▓реНрдкрд░ рдлрд╝рдВрдХреНрд╢рди
tf.fromPixels()
рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╣рдо рдЗрд╕реЗ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЫрд╡рд┐ рдХреЛ
<canvas>
рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдЖрдВрдЦреЛрдВ рд╕реЗ рдпреБрдХреНрдд рдЖрдпрдд рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ:
function getImage() { // return tf.tidy(function() { const image = tf.fromPixels($('#eyes')[0]); // <i><font color="#999999"></font></i>: const batchedImage = image.expandDims(0); // : return batchedImage.toFloat().div(tf.scalar(127)).sub(tf.scalar(1)); }); }
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐
tf.tidy()
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╕рдлрд╛рдИ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╣рдо рд╕рд┐рд░реНрдл рдПрдХ рдмрдбрд╝реЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╕реЗрдЯ рдореЗрдВ рд╕рднреА рдирдореВрдиреЛрдВ рдХреЛ рдмрдЪрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдорд╢реАрди рд╕реАрдЦрдиреЗ рдореЗрдВ рдореЙрдбрд▓ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдХреБрдЫ рдирдореВрдиреЛрдВ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдирд┐рдпрдВрддреНрд░рдг рдирдореВрдиреЗ рдореЗрдВ рд╕рд╣реЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП рдирдП рдбреЗрдЯрд╛ рдкрд░ рдореЙрдбрд▓ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдореЙрдбрд▓ рдХреЛ рдУрд╡рд░-рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП, рдирд┐рдпрдВрддреНрд░рдг рдирдореВрдиреЗ рдореЗрдВ рдХреБрд▓ рдирдореВрдиреЛрдВ рдореЗрдВ рд╕реЗ 20% рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
рдпрд╣рд╛рдВ рдбреЗрдЯрд╛ рдФрд░ рдирдореВрдирд╛ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдб рд╣реИ:
const dataset = { train: { n: 0, x: null, y: null, }, val: { n: 0, x: null, y: null, }, } function captureExample() { // tf.tidy(function() { const image = getImage(); const mousePos = tf.tensor1d([mouse.x, mouse.y]).expandDims(0); // , ( ) const subset = dataset[Math.random() > 0.2 ? 'train' : 'val']; if (subset.x == null) { // subset.x = tf.keep(image); subset.y = tf.keep(mousePos); } else { // const oldX = subset.x; const oldY = subset.y; subset.x = tf.keep(oldX.concat(image, 0)); subset.y = tf.keep(oldY.concat(mousePos, 0)); } // subset.n += 1; }); }
рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╣рдореЗрдВ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ
рд╕реЗ рдмрд╛рдБрдзрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
$('body').keyup(function(event) { // if (event.keyCode == 32) { captureExample(); event.preventDefault(); return false; } });
рдЕрдм рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк
рджрдмрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдВрдЦ рдХреА рдЫрд╡рд┐ рдФрд░ рдорд╛рдЙрд╕ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдЬреБрдбрд╝ рдЬрд╛рддреЗ рд╣реИрдВред
рдореЙрдбрд▓ рдкреНрд░рд╢рд┐рдХреНрд╖рдг
рдПрдХ рд╕рд░рд▓ рджреГрдврд╝ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдмрдирд╛рдПрдБред TensorFlow.js рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдХреЗрд░рд╕ рдХреА рдПрдХ рдпрд╛рдж рддрд╛рдЬрд╛ рдХрд░рддреА рд╣реИред рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рдПрдХ
conv2d
рдкрд░рдд, рдПрдХ
maxPooling2d
рдкрд░рдд рдФрд░ рдЕрдВрдд рдореЗрдВ рджреЛ рдЖрдЙрдЯрдкреБрдЯ рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ
dense
рдкрд░рдд рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП (рд╡реЗ рд╕реНрдХреНрд░реАрди рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВ)ред рд░рд╛рд╕реНрддреЗ рдХреЗ рд╕рд╛рде, рдореИрдВрдиреЗ рджреЛ-рдЖрдпрд╛рдореА рдбреЗрдЯрд╛ рдХреЛ рдПрдХ-рдЖрдпрд╛рдореА рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд▓рд┐рдП рдПрдХ
dropout
рдкрд░рдд рдФрд░ рдПрдХ
flatten
рдкрд░рдд рдХреЛ рдЬреЛрдбрд╝рд╛ред рдПрдбрдо рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдиреЗрдЯрд╡рд░реНрдХ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореИрдВ рдЕрдкрдиреЗ рдореИрдХрдмреБрдХ рдПрдпрд░ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдпрд╣рд╛рдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкрд░ рдмрд╕ рдЧрдпрд╛ред рдЖрдк рдореЙрдбрд▓ рдХрд╛ рдЕрдкрдирд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣рд╛рдБ рдореЙрдбрд▓ рдХреЛрдб рд╣реИ:
let currentModel; function createModel() { const model = tf.sequential(); model.add(tf.layers.conv2d({ kernelSize: 5, filters: 20, strides: 1, activation: 'relu', inputShape: [$('#eyes').height(), $('#eyes').width(), 3], })); model.add(tf.layers.maxPooling2d({ poolSize: [2, 2], strides: [2, 2], })); model.add(tf.layers.flatten()); model.add(tf.layers.dropout(0.2)); // x y model.add(tf.layers.dense({ units: 2, activation: 'tanh', })); // Adam 0.0005 MSE model.compile({ optimizer: tf.train.adam(0.0005), loss: 'meanSquaredError', }); return model; }
рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдпреБрдЧ рдФрд░ рдПрдХ рдЪрд░ рдкреИрдХреЗрдЯ рдЖрдХрд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ (рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рд╢рд╛рдпрдж рдмрд╣реБрдд рдЫреЛрдЯреЗ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ)ред
function fitModel() { let batchSize = Math.floor(dataset.train.n * 0.1); if (batchSize < 4) { batchSize = 4; } else if (batchSize > 64) { batchSize = 64; } if (currentModel == null) { currentModel = createModel(); } currentModel.fit(dataset.train.x, dataset.train.y, { batchSize: batchSize, epochs: 20, shuffle: true, validationData: [dataset.val.x, dataset.val.y], }); }
рдЕрдм рд╕реАрдЦрдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреЗрдЬ рдкрд░ рдПрдХ рдмрдЯрди рдЬреЛрдбрд╝реЗрдВред рдпрд╣ рдХреЛрдб HTML рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИ:
<button id="train">Train!</button> <style> #train { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); font-size: 24pt; } </style>
рдЗрд╕ рдХреЛрдб рдХреЛ JS рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
$('#train').click(function() { fitModel(); });
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╣рд╛рдБ рджреЗрдЦ рд░рд╣рд╛ рд╣реИ?
рдЕрдм рдЬрдм рд╣рдо рдбреЗрдЯрд╛ рдПрдХрддреНрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдореЙрдбрд▓ рддреИрдпрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЙрд╕ рдкреГрд╖реНрда рдкрд░ рдЬрдЧрд╣ рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреЗрдЦ рд░рд╣рд╛ рд╣реИред рд╣рдо рдЗрд╕ рд╕реНрдерд╛рди рдХреА рдУрд░ рдПрдХ рд╣рд░реЗ рд╡реГрддреНрдд рдХреА рд╕рд╣рд╛рдпрддрд╛ рд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╕реНрдХреНрд░реАрди рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдШреВрдорддрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдкреЗрдЬ рдореЗрдВ рдПрдХ рд╕рд░реНрдХрд▓ рдЬреЛрдбрд╝реЗрдВ:
<div id="target"></div> <style> #target { background-color: lightgreen; position: absolute; border-radius: 50%; height: 40px; width: 40px; transition: all 0.1s ease; box-shadow: 0 0 20px 10px white; border: 4px solid rgba(0,0,0,0.5); } </style>
рдкреГрд╖реНрда рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдЗрд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рдордп-рд╕рдордп рдкрд░ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреА рдЖрдВрдЦреЛрдВ рдХреА рд╡рд░реНрддрдорд╛рди рдЫрд╡рд┐ рдХреЛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕рд╕реЗ рдПрдХ рд╕рд╡рд╛рд▓ рдкреВрдЫрддреЗ рд╣реИрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╣рд╛рдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реИред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдореЙрдбрд▓ рджреЛ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╕рд░реНрдХрд▓ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
function moveTarget() { if (currentModel == null) { return; } tf.tidy(function() { const image = getImage(); const prediction = currentModel.predict(image); // const targetWidth = $('#target').outerWidth(); const targetHeight = $('#target').outerHeight(); const x = (prediction.get(0, 0) + 1) / 2 * ($(window).width() - targetWidth); const y = (prediction.get(0, 1) + 1) / 2 * ($(window).height() - targetHeight); // : const $target = $('#target'); $target.css('left', x + 'px'); $target.css('top', y + 'px'); }); } setInterval(moveTarget, 100);
рдореИрдВрдиреЗ рдЕрдВрддрд░рд╛рд▓ рдХреЛ 100 рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ред рдпрджрд┐ рдЖрдкрдХрд╛ рдХрдВрдкреНрдпреВрдЯрд░ рдореЗрд░рд╛ рдЬрд┐рддрдирд╛ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реЗ рдмрдбрд╝рд╛ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред
рдкрд░рд┐рдгрд╛рдо
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕ рд╕рд╛рдордЧреНрд░реА рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рд╡рд┐рдЪрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдордиреЗ рдЬреЛ рдХрд┐рдпрд╛ рд╣реИ рдЙрд╕рдХрд╛ рдЕрдиреБрднрд╡ рдХрд░реЗрдВред рдЙрд╕рдХреА рдЖрдБрдЦреЛрдВ рдХреЗ рдкреАрдЫреЗ рдорд╛рдЙрд╕ рдХрд░реНрд╕рд░ рд▓реЗ рдЬрд╛рдПрдБ, рдФрд░ рд╕реНрдкреЗрд╕рдмрд╛рд░ рджрдмрд╛рдПрдБред рдЗрд╕рдХреЗ рдмрд╛рдж рд╕реНрдЯрд╛рд░реНрдЯ рдЯреНрд░реЗрдирд┐рдВрдЧ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред
рдЕрдзрд┐рдХ рдбреЗрдЯрд╛ рдПрдХрддреНрд░ рдХрд░реЗрдВ, рдлрд┐рд░ рд╕реЗ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рдмрд╛рдж, рд╣рд░реЗ рд░рдВрдЧ рдХрд╛ рдЪрдХреНрд░ рдЖрдкрдХреЗ рдЯрдХрдЯрдХреА рдХреЗ рдмрд╛рдж рд╕реНрдХреНрд░реАрди рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдШреВрдордирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдЧрд╛ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдЙрд╕ рдЬрдЧрд╣ рдкрд░ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЬрд╣рд╛рдВ рдЖрдк рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рдХрдИ рдЪрд░рдгреЛрдВ рдХреЗ рдмрд╛рдж, рд▓рдЧрднрдЧ 50 рдПрдХрддреНрд░ рдирдореВрдиреЛрдВ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдирд╛, рдФрд░ рдпрджрд┐ рдЖрдк рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рд╣реИрдВ, рддреЛ рдпрд╣ рдЙрд╕ рдкреГрд╖реНрда рдкрд░ рдмрд┐рдВрджреБ рдкрд░ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЪрд▓реЗрдЧрд╛ рдЬрд┐рд╕реЗ рдЖрдк рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВред ред рдЗрд╕ рд╕рд╛рдордЧреНрд░реА рдореЗрдВ рдкрд╛рд░реНрд╕ рдХрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдкреВрд░рд╛ рдХреЛрдб
рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛
рд╣реИ ред
рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЬреЛ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдХрд┐рдпрд╛ рдерд╛ рд╡рд╣ рдХрд╛рдлреА рджрд┐рд▓рдЪрд╕реНрдк рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рдлрд┐рд░ рднреА рдХрдИ рд╕реБрдзрд╛рд░ рд╣реИрдВ рдЬреЛ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдкрдирд╛ рд╕рд┐рд░ рдШреБрдорд╛рддрд╛ рд╣реИ рдпрд╛ рдХреИрдорд░реЗ рдХреЗ рд╕рд╛рдордиреЗ рдЕрдкрдиреА рд╕реНрдерд┐рддрд┐ рдмрджрд▓рддрд╛ рд╣реИ? рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЙрд╕ рдЖрдпрдд рдХреЗ рдЖрдХрд╛рд░, рд╕реНрдерд┐рддрд┐ рдФрд░ рдХреЛрдг рдХреЗ рдЪрдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЛ рдЪреЛрдЯ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрд╛рдПрдЧреА рдЬреЛ рдЙрд╕ рдЫрд╡рд┐ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдмрд╛рдВрдзрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЖрдБрдЦреЗрдВ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣рд╛рдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рдЙрджрд╛рд╣рд░рдг рдХреЗ
рдкреВрд░реНрдг рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд▓рд╛рдЧреВ рдХреА рдЧрдИ рд╣реИрдВред рдпрд╣рд╛рдБ рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рд╣реИрдВ:
- рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдЖрдВрдЦ-рдмрд╛рдЙрдВрдбрд┐рдВрдЧ рдЖрдпрдд рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдкред
- рдПрдХ рдЫрд╡рд┐ рдХреЛ рдЧреНрд░реЗрд╕реНрдХреЗрд▓ рдореЗрдВ рдмрджрд▓реЗрдВред
- CoordConv рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред
- рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреМрди рд╕рд╛ рдореЙрдбрд▓ рдЕрдЪреНрдЫрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдХрд╣рд╛рдБ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИред
- рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдФрд░ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ред
- рдореЙрдбрд▓ рдХреЛ рдмрдЪрд╛рдиреЗ рдФрд░ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ред
- рд╡рдЬрди рдХрд╛ рд╕рдВрд░рдХреНрд╖рдг рдЬрд┐рд╕рдиреЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рдмрд╛рдж рдиреНрдпреВрдирддрдо рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╣рд╛рдирд┐ рджрд┐рдЦрд╛рдИред
- рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде рдмреЗрд╣рддрд░ рдпреВрдЬрд░ рдЗрдВрдЯрд░рдлреЗрд╕ред
рдкреНрд░рд┐рдп рдкрд╛рдардХреЛрдВ! рдХреНрдпрд╛ рдЖрдк TensorFlow рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ?
