{"id":302397,"date":"2020-04-23T15:01:55","date_gmt":"2020-04-23T15:01:55","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=302397"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=302397","title":{"rendered":"\u0412\u0438\u0434\u0435\u043e\u0437\u0432\u043e\u043d\u043a\u0438 \u0441 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c \u0444\u043e\u043d\u043e\u043c \u0438 \u043e\u043f\u0435\u043d\u0441\u043e\u0440\u0441\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/498458\/\">\u0421\u0435\u0439\u0447\u0430\u0441, \u043a\u043e\u0433\u0434\u0430 \u043c\u043d\u043e\u0433\u0438\u0435 \u0438\u0437 \u043d\u0430\u0441 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u043d\u0430 <a href=\"https:\/\/www.sfchronicle.com\/local-politics\/article\/Bay-Area-must-shelter-in-place-Only-15135014.php\">\u043a\u0430\u0440\u0430\u043d\u0442\u0438\u043d\u0435<\/a> \u0438\u0437-\u0437\u0430 <a href=\"https:\/\/www.cdc.gov\/coronavirus\/2019-ncov\/index.html\">COVID-19<\/a>, \u0432\u0438\u0434\u0435\u043e\u0437\u0432\u043e\u043d\u043a\u0438 \u0441\u0442\u0430\u043b\u0438 \u043a\u0443\u0434\u0430 \u0431\u043e\u043b\u0435\u0435 \u0447\u0430\u0441\u0442\u044b\u043c \u044f\u0432\u043b\u0435\u043d\u0438\u0435\u043c, \u0447\u0435\u043c \u0440\u0430\u043d\u044c\u0448\u0435. \u0412 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u0441\u0435\u0440\u0432\u0438\u0441 <a href=\"https:\/\/zoom.us\/\">ZOOM<\/a> <a href=\"https:\/\/en.wikipedia.org\/wiki\/Zoom_Video_Communications#Criticism\">\u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u043e<\/a> \u0441\u0442\u0430\u043b \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u043c. \u0412\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0441\u0430\u043c\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e Zoom \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0444\u043e\u043d\u0430 (<a href=\"https:\/\/support.zoom.us\/hc\/en-us\/articles\/210707503-Virtual-Background\">Virtual Background<\/a>). \u041e\u043d\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c, \u0432 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435, \u0437\u0430\u043c\u0435\u043d\u044f\u0442\u044c \u0444\u043e\u043d, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0439\u0441\u044f \u043f\u043e\u0437\u0430\u0434\u0438 \u043d\u0438\u0445, \u043d\u0430 \u043b\u044e\u0431\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u0432\u0438\u0434\u0435\u043e.<\/p>\n<p>  <a href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/498458\/\"><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/wf\/46\/1p\/wf461pvjwrwmpzvkvnhyvzcf8xy.jpeg\"><\/div>\n<p><\/a><\/p>\n<p>  \u042f \u0443\u0436\u0435 \u0434\u0430\u0432\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e Zoom \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0435, \u043d\u0430 \u043e\u043f\u0435\u043d\u0441\u043e\u0440\u0441\u043d\u044b\u0445 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0445, \u043f\u043e\u0441\u0432\u044f\u0449\u0451\u043d\u043d\u044b\u0445 Kubernetes, \u0434\u0435\u043b\u0430\u044f \u044d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u0441 \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043d\u043e\u0443\u0442\u0431\u0443\u043a\u0430. \u0422\u0435\u043f\u0435\u0440\u044c \u044f, \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u0438\u0437 \u0434\u043e\u043c\u0430, \u0441\u043a\u043b\u043e\u043d\u0435\u043d \u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e \u0431\u043e\u043b\u0435\u0435 \u043c\u043e\u0449\u043d\u043e\u0433\u043e \u0438 \u0443\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430 \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u0437 \u043c\u043e\u0438\u0445 \u043e\u043f\u0435\u043d\u0441\u043e\u0440\u0441\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447.<\/p>\n<p>  \u041a \u043d\u0435\u0441\u0447\u0430\u0441\u0442\u044c\u044e, Zoom \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043b\u0438\u0448\u044c \u0441\u043f\u043e\u0441\u043e\u0431 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0444\u043e\u043d\u0430, \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u043a\u0430\u043a \u00ab<a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A5%D1%80%D0%BE%D0%BC%D0%B0%D0%BA%D0%B5%D0%B9\">\u0445\u0440\u043e\u043c\u0430\u043a\u0435\u0439<\/a>\u00bb \u0438\u043b\u0438 \u00ab<a href=\"https:\/\/en.wikipedia.org\/wiki\/Green_screen_(disambiguation)\">\u0437\u0435\u043b\u0451\u043d\u044b\u0439 \u044d\u043a\u0440\u0430\u043d<\/a>\u00bb. \u0414\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0444\u043e\u043d \u0431\u044b\u043b \u0431\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043d\u0435\u043a\u0438\u043c \u0441\u043f\u043b\u043e\u0448\u043d\u044b\u043c \u0446\u0432\u0435\u0442\u043e\u043c, \u0432 \u0438\u0434\u0435\u0430\u043b\u0435 \u2014 \u0437\u0435\u043b\u0451\u043d\u044b\u043c, \u0438 \u0431\u044b\u043b \u0431\u044b \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e \u043e\u0441\u0432\u0435\u0449\u0451\u043d.<\/p>\n<p>  \u0422\u0430\u043a \u043a\u0430\u043a \u0437\u0435\u043b\u0451\u043d\u043e\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430 \u0443 \u043c\u0435\u043d\u044f \u043d\u0435\u0442, \u044f \u0440\u0435\u0448\u0438\u043b \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0444\u043e\u043d\u0430. \u0410 \u044d\u0442\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043a\u0443\u0434\u0430 \u043b\u0443\u0447\u0448\u0435, \u0447\u0435\u043c \u043d\u0430\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u0432 \u043a\u0432\u0430\u0440\u0442\u0438\u0440\u0435, \u0438\u043b\u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u043d\u043e\u0443\u0442\u0431\u0443\u043a\u0430.<\/p>\n<p>  \u041a\u0430\u043a \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0432 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u043e\u043f\u0435\u043d\u0441\u043e\u0440\u0441\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0432 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u043e\u043a \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0435\u0441\u044c\u043c\u0430 \u0434\u043e\u0441\u0442\u043e\u0439\u043d\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b.<br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<h2><font color=\"#3AC1EF\">\u0427\u0442\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043a\u0430\u043c\u0435\u0440\u044b<\/font><\/h2>\n<p>  \u041d\u0430\u0447\u043d\u0451\u043c \u0441 \u043d\u0430\u0447\u0430\u043b\u0430 \u0438 \u043e\u0442\u0432\u0435\u0442\u0438\u043c \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0432\u043e\u043f\u0440\u043e\u0441: \u00ab\u041a\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0438\u0434\u0435\u043e \u0441 \u0432\u0435\u0431-\u043a\u0430\u043c\u0435\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c?\u00bb.<\/p>\n<p>  \u0422\u0430\u043a \u043a\u0430\u043a \u044f \u043d\u0430 \u0434\u043e\u043c\u0430\u0448\u043d\u0435\u043c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e Linux (\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0438\u0433\u0440\u0430\u044e \u0432 \u0438\u0433\u0440\u044b), \u044f \u0440\u0435\u0448\u0438\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/pypi.org\/project\/opencv-python\/\">Python-\u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438<\/a> <a href=\"https:\/\/opencv.org\/\">Open CV<\/a>, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u044f \u0443\u0436\u0435 \u0437\u043d\u0430\u043a\u043e\u043c. \u041e\u043d\u0438, \u043f\u043e\u043c\u0438\u043c\u043e <a href=\"https:\/\/en.wikipedia.org\/wiki\/Video4Linux\">V4L2<\/a>-\u0431\u0438\u043d\u0434\u0438\u043d\u0433\u043e\u0432 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0432\u0435\u0431-\u043a\u0430\u043c\u0435\u0440\u044b, \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0442 \u0432 \u0441\u0435\u0431\u044f \u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0432\u0438\u0434\u0435\u043e.<\/p>\n<p>  \u0427\u0442\u0435\u043d\u0438\u0435 \u043a\u0430\u0434\u0440\u0430 \u0441 \u0432\u0435\u0431-\u043a\u0430\u043c\u0435\u0440\u044b \u0432 python-opencv \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e:<\/p>\n<pre><code class=\"python\">import cv2 cap = cv2.VideoCapture('\/dev\/video0') success, frame = cap.read() <\/code><\/pre>\n<p>  \u042f, \u0447\u0442\u043e\u0431\u044b \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u043c\u043e\u0435\u0439 \u043a\u0430\u043c\u0435\u0440\u043e\u0439, \u043f\u0435\u0440\u0435\u0434 \u0437\u0430\u0445\u0432\u0430\u0442\u043e\u043c \u0441 \u043d\u0435\u0451 \u0432\u0438\u0434\u0435\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438:<\/p>\n<pre><code class=\"python\"># \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043a\u0430\u043c\u0435\u0440\u044b \u043d\u0430 720p @ 60 FPS height, width = 720, 1280 cap.set(cv2.CAP_PROP_FRAME_WIDTH ,width) cap.set(cv2.CAP_PROP_FRAME_HEIGHT,height) cap.set(cv2.CAP_PROP_FPS, 60) <\/code><\/pre>\n<p>  \u0412\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0442\u0430\u043a\u043e\u0435 \u043e\u0449\u0443\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u0434\u043b\u044f \u0432\u0438\u0434\u0435\u043e\u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0439 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u044e\u0442 \u0432\u0438\u0434\u0435\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 720p @ 30 FPS, \u0438\u043b\u0438 \u043d\u0438\u0436\u0435. \u041d\u043e \u043c\u044b, \u0432 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043c\u043e\u0436\u0435\u043c \u0438 \u043d\u0435 \u0447\u0438\u0442\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u0430\u0434\u0440. \u0422\u0430\u043a\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0437\u0430\u0434\u0430\u044e\u0442 \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u043b\u0438\u043c\u0438\u0442.<\/p>\n<p>  \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u043c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0437\u0430\u0445\u0432\u0430\u0442\u0430 \u043a\u0430\u0434\u0440\u0430 \u0432 \u0446\u0438\u043a\u043b. \u0422\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0438\u0434\u0435\u043e\u043f\u043e\u0442\u043e\u043a\u0443 \u0441 \u043a\u0430\u043c\u0435\u0440\u044b!<\/p>\n<pre><code class=\"python\">while True: \u00a0\u00a0\u00a0\u00a0success, frame = cap.read() <\/code><\/pre>\n<p>  \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u0430\u0434\u0440 \u0432 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0446\u0435\u043b\u044f\u0445 \u043c\u043e\u0436\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"python\">cv2.imwrite(&quot;test.jpg&quot;, frame) <\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043a\u0430\u043c\u0435\u0440\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0417\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e!<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/96c\/1ea\/155\/96c1ea155c714c5f1c8ab70f737444f8.jpg\"><\/div>\n<p>  <i><font color=\"#999999\">\u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0432\u044b \u043d\u0435 \u043f\u0440\u043e\u0442\u0438\u0432 \u043c\u043e\u0435\u0439 \u0431\u043e\u0440\u043e\u0434\u044b<\/font><\/i><\/p>\n<h2><font color=\"#3AC1EF\">\u041e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0444\u043e\u043d\u0430<\/font><\/h2>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0432\u0438\u0434\u0435\u043e\u043f\u043e\u0442\u043e\u043a\u0443, \u043f\u043e\u0434\u0443\u043c\u0430\u0435\u043c \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u044c \u0444\u043e\u043d, \u0441\u0434\u0435\u043b\u0430\u0432 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b, \u043d\u0430\u0439\u0434\u044f \u0435\u0433\u043e, \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c. \u0410 \u0432\u043e\u0442 \u044d\u0442\u043e \u2014 \u0443\u0436\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430.<\/p>\n<p>  \u0425\u043e\u0442\u044f \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0442\u0430\u043a\u043e\u0435 \u043e\u0449\u0443\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u0438 Zoom \u043d\u0438\u0433\u0434\u0435 \u043d\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0443\u0431\u0438\u0440\u0430\u0435\u0442 \u0444\u043e\u043d, \u0442\u043e, \u043a\u0430\u043a \u0432\u0435\u0434\u0451\u0442 \u0441\u0435\u0431\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430, \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u043d\u044f \u0437\u0430\u0434\u0443\u043c\u0430\u0442\u044c\u0441\u044f \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0442\u0443\u0442 \u043d\u0435 \u043e\u0431\u043e\u0448\u043b\u043e\u0441\u044c \u0431\u0435\u0437 \u043d\u0435\u0439\u0440\u043e\u043d\u043d\u044b\u0445 \u0441\u0435\u0442\u0435\u0439. \u042d\u0442\u043e \u0441\u043b\u043e\u0436\u043d\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c, \u043d\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u044f \u043d\u0430\u0448\u0451\u043b \u0441\u0442\u0430\u0442\u044c\u044e \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0432 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Microsoft_Teams\">Microsoft Teams<\/a> \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e <a href=\"https:\/\/en.pingwest.com\/a\/1579\">\u0440\u0430\u0437\u043c\u044b\u0442\u0438\u0435 \u0444\u043e\u043d\u0430<\/a> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/en.wikipedia.org\/wiki\/Convolutional_neural_network\">\u0441\u0432\u0451\u0440\u0442\u043e\u0447\u043d\u043e\u0439 \u043d\u0435\u0439\u0440\u043e\u043d\u043d\u043e\u0439 \u0441\u0435\u0442\u0438<\/a>.<\/p>\n<p>  \u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u043d\u0435\u0439\u0440\u043e\u043d\u043d\u0443\u044e \u0441\u0435\u0442\u044c \u043d\u0435 \u0442\u0430\u043a \u0443\u0436 \u0438 \u0441\u043b\u043e\u0436\u043d\u043e. \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0430\u0442\u0435\u0439 \u0438 \u043d\u0430\u0443\u0447\u043d\u044b\u0445 \u0442\u0440\u0443\u0434\u043e\u0432 \u043d\u0430 \u0442\u0435\u043c\u0443 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Image_segmentation\">\u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439<\/a>. \u0415\u0441\u0442\u044c \u043c\u0430\u0441\u0441\u0430 \u043e\u043f\u0435\u043d\u0441\u043e\u0440\u0441\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432. \u041d\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d, \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0445\u043e\u0440\u043e\u0448\u0438\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432, \u0432\u0435\u0441\u044c\u043c\u0430 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0434\u0430\u0442\u0430\u0441\u0435\u0442.<\/p>\n<p>  \u0412 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u044e\u0449\u0438\u0445 \u0442\u0435, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u044b \u0441 \u0432\u0435\u0431-\u043a\u0430\u043c\u0435\u0440\u044b, \u0441 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u043e\u0439 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430 \u043d\u0430 \u043f\u0435\u0440\u0435\u0434\u043d\u0435\u043c \u043f\u043b\u0430\u043d\u0435. \u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u0442\u0430\u043a\u043e\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u043c\u0430\u0440\u043a\u0438\u0440\u043e\u0432\u0430\u043d \u043a\u0430\u043a \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u043e\u0442 \u0444\u043e\u043d\u0430.<\/p>\n<p>  \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0442\u0430\u043a\u043e\u0433\u043e \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430 \u043f\u0440\u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0435 \u043a \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044e \u043d\u0435\u0439\u0440\u043e\u043d\u043d\u043e\u0439 \u0441\u0435\u0442\u0438, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043d\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0443\u0441\u0438\u043b\u0438\u0439. \u042d\u0442\u043e \u2014 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438\u0437 Google \u0443\u0436\u0435 \u0441\u0434\u0435\u043b\u0430\u043b\u0430 \u0432\u0441\u0451 \u0441\u0430\u043c\u043e\u0435 \u0442\u044f\u0436\u0451\u043b\u043e\u0435 \u0438 \u0432\u044b\u043b\u043e\u0436\u0438\u043b\u0430 \u0432 \u043e\u043f\u0435\u043d\u0441\u043e\u0440\u0441 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u043d\u0443\u044e \u043d\u0435\u0439\u0440\u043e\u043d\u043d\u0443\u044e \u0441\u0435\u0442\u044c \u0434\u043b\u044f \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043b\u044e\u0434\u0435\u0439. \u042d\u0442\u0430 \u0441\u0435\u0442\u044c \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <a href=\"https:\/\/blog.tensorflow.org\/2019\/11\/updated-bodypix-2.html\">BodyPix<\/a>. \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043e\u043d\u0430 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u043e!<\/p>\n<p>  \u0421\u0435\u0442\u044c BodyPix \u0441\u0435\u0439\u0447\u0430\u0441 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u043b\u0438\u0448\u044c \u0432 \u0444\u043e\u0440\u043c\u0435, \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0439 \u0434\u043b\u044f <a href=\"https:\/\/www.tensorflow.org\/js\">TensorFlow.js<\/a>. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435, \u043b\u0435\u0433\u0447\u0435 \u0432\u0441\u0435\u0433\u043e \u0435\u0451 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c, \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0432\u0448\u0438\u0441\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 <a href=\"https:\/\/www.npmjs.com\/package\/body-pix-node\">body-pix-node<\/a>.<\/p>\n<p>  \u0414\u043b\u044f \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f <a href=\"https:\/\/blogs.nvidia.com\/blog\/2016\/08\/22\/difference-deep-learning-training-inference-ai\/\">\u0432\u044b\u0432\u043e\u0434\u0430 \u0441\u0435\u0442\u0438<\/a> (\u043f\u0440\u043e\u0433\u043d\u043e\u0437\u0430) \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f <a href=\"https:\/\/en.wikipedia.org\/wiki\/WebGL\">WebGL<\/a>-\u0431\u044d\u043a\u0435\u043d\u0434\u043e\u043c, \u043d\u043e \u0432 \u0441\u0440\u0435\u0434\u0435 <a href=\"https:\/\/nodejs.org\/en\/\">Node.js<\/a> \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0431\u044d\u043a\u0435\u043d\u0434\u043e\u043c <a href=\"https:\/\/www.tensorflow.org\/install\/gpu\">Tensorflow GPU<\/a> (\u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0430 \u043e\u0442 <a href=\"https:\/\/www.nvidia.com\/en-us\/\">NVIDIA<\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0443 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c).<\/p>\n<p>  \u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435\u043c, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0449\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0443 TensorFlow GPU \u0438 Node.js. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e\u0433\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/github.com\/NVIDIA\/nvidia-docker\">nvidia-docker<\/a> \u2014 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043b\u0435\u0433\u0447\u0435, \u0447\u0435\u043c \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0431\u043e\u0440 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u043d\u0430 \u0441\u0432\u043e\u0451\u043c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 Docker \u0438 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u043e\u0432.<\/p>\n<p>  \u0412\u043e\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0444\u0430\u0439\u043b\u0430 <code>bodypix\/package.json<\/code>:<\/p>\n<pre><code class=\"json\">{ \u00a0\u00a0\u00a0\u00a0&quot;name&quot;: &quot;bodypix&quot;, \u00a0\u00a0\u00a0\u00a0&quot;version&quot;: &quot;0.0.1&quot;, \u00a0\u00a0\u00a0\u00a0&quot;dependencies&quot;: { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&quot;@tensorflow-models\/body-pix&quot;: &quot;^2.0.5&quot;, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&quot;@tensorflow\/tfjs-node-gpu&quot;: &quot;^1.7.1&quot; \u00a0\u00a0\u00a0\u00a0} } <\/code><\/pre>\n<p>  \u0412\u043e\u0442 \u2014 \u0444\u0430\u0439\u043b <code>bodypix\/Dockerfile<\/code>:<\/p>\n<pre><code class=\"python\"># \u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043e\u0431\u0440\u0430\u0437, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c TensorFlow GPU FROM nvcr.io\/nvidia\/cuda:10.0-cudnn7-runtime-ubuntu18.04 # \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c node RUN apt update &amp;&amp; apt install -y curl make build-essential \\ \u00a0\u00a0\u00a0\u00a0&amp;&amp; curl -sL https:\/\/deb.nodesource.com\/setup_12.x | bash - \\ \u00a0\u00a0\u00a0\u00a0&amp;&amp; apt-get -y install nodejs \\ \u00a0\u00a0\u00a0\u00a0&amp;&amp; mkdir \/.npm \\ \u00a0\u00a0\u00a0\u00a0&amp;&amp; chmod 777 \/.npm # \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u043b\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u0438\u0434\u0435\u043e\u043f\u0430\u043c\u044f\u0442\u0438\u00a0 # \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e tfjs-node-gpu \u043d\u0435 \u0434\u0430\u0451\u0442 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u0439 \u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 GPU :( ENV TF_FORCE_GPU_ALLOW_GROWTH=true # \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c node-\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 WORKDIR \/src COPY package.json \/src\/ RUN npm install # \u0417\u0430\u0434\u0430\u0451\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0442\u043e\u0447\u043a\u0438 \u0432\u0445\u043e\u0434\u0430 COPY app.js \/src\/ ENTRYPOINT node \/src\/app.js <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432. \u041d\u043e \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0430\u044e: \u044f \u043d\u0435 \u043e\u0442\u043d\u043e\u0448\u0443\u0441\u044c \u043a Node.js-\u044d\u043a\u0441\u043f\u0435\u0440\u0442\u0430\u043c! \u042d\u0442\u043e \u2014 \u043b\u0438\u0448\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043c\u043e\u0438\u0445 \u0432\u0435\u0447\u0435\u0440\u043d\u0438\u0445 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u0443\u0434\u044c\u0442\u0435 \u043a\u043e \u043c\u043d\u0435 \u0441\u043d\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b :-).<\/p>\n<p>  \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u0437\u0430\u043d\u044f\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0439 \u043c\u0430\u0441\u043a\u043e\u0439, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c HTTP POST-\u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u041c\u0430\u0441\u043a\u0430 \u2014 \u044d\u0442\u043e \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439. \u041f\u0438\u043a\u0441\u0435\u043b\u0438, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u043d\u0443\u043b\u044f\u043c\u0438 \u2014 \u044d\u0442\u043e \u0444\u043e\u043d.<\/p>\n<p>  \u0412\u043e\u0442 \u2014 \u043a\u043e\u0434 \u0444\u0430\u0439\u043b\u0430 <code>app.js<\/code>:<\/p>\n<pre><code class=\"javascript\">const tf = require('@tensorflow\/tfjs-node-gpu'); const bodyPix = require('@tensorflow-models\/body-pix'); const http = require('http'); (async () =&gt; { \u00a0\u00a0\u00a0\u00a0const net = await bodyPix.load({ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0architecture: 'MobileNetV1', \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0outputStride: 16, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0multiplier: 0.75, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0quantBytes: 2, \u00a0\u00a0\u00a0\u00a0}); \u00a0\u00a0\u00a0\u00a0const server = http.createServer(); \u00a0\u00a0\u00a0\u00a0server.on('request', async (req, res) =&gt; { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0var chunks = []; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0req.on('data', (chunk) =&gt; { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0chunks.push(chunk); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0req.on('end', async () =&gt; { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0const image = tf.node.decodeImage(Buffer.concat(chunks)); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0segmentation = await net.segmentPerson(image, { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0flipHorizontal: false, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0internalResolution: 'medium', \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0segmentationThreshold: 0.7, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0res.writeHead(200, { 'Content-Type': 'application\/octet-stream' }); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0res.write(Buffer.from(segmentation.data)); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0res.end(); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0tf.dispose(image); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}); \u00a0\u00a0\u00a0\u00a0}); \u00a0\u00a0\u00a0\u00a0server.listen(9000); })(); <\/code><\/pre>\n<p>  \u0414\u043b\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u0430\u0434\u0440\u0430 \u0432 \u043c\u0430\u0441\u043a\u0443 \u043c\u044b, \u0432 Python-\u0441\u043a\u0440\u0438\u043f\u0442\u0435, \u043c\u043e\u0436\u0435\u043c \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0430\u043a\u0435\u0442\u0430\u043c\u0438 <a href=\"https:\/\/numpy.org\/\">numpy<\/a> \u0438 <a href=\"https:\/\/requests.readthedocs.io\/en\/master\/\">requests<\/a>:<\/p>\n<pre><code class=\"python\">def get_mask(frame, bodypix_url='http:\/\/localhost:9000'): \u00a0\u00a0\u00a0\u00a0_, data = cv2.imencode(&quot;.jpg&quot;, frame) \u00a0\u00a0\u00a0\u00a0r = requests.post( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0url=bodypix_url, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0data=data.tobytes(), \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0headers={'Content-Type': 'application\/octet-stream'}) \u00a0\u00a0\u00a0\u00a0# \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u043d\u0435\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0435 \u0431\u0430\u0439\u0442\u044b \u0432 numpy-\u043c\u0430\u0441\u0441\u0438\u0432 \u00a0\u00a0\u00a0\u00a0# \u043d\u0435\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u043a\u0430\u043a uint8[width * height] \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 0 \u0438\u043b\u0438 1 \u00a0\u00a0\u00a0\u00a0mask = np.frombuffer(r.content, dtype=np.uint8) \u00a0\u00a0\u00a0\u00a0mask = mask.reshape((frame.shape[0], frame.shape[1])) \u00a0\u00a0\u00a0\u00a0return mask <\/code><\/pre>\n<p>  \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/e51\/7db\/e3c\/e517dbe3ce6eee99d646a8e4257a627f.jpg\"><\/div>\n<p>  <i><font color=\"#999999\">\u041c\u0430\u0441\u043a\u0430<\/font><\/i><\/p>\n<p>  \u041f\u043e\u043a\u0430 \u044f \u0432\u0441\u0435\u043c \u044d\u0442\u0438\u043c \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u0441\u044f, \u044f \u043d\u0430\u0442\u043a\u043d\u0443\u043b\u0441\u044f \u043d\u0430 <a href=\"https:\/\/t.co\/Urz62Kg32k\">\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439<\/a> \u0442\u0432\u0438\u0442.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/5a5\/c4b\/4dd\/5a5c4b4dda480f0fa58807ec5b89b457.jpg\"><\/div>\n<p>  <i><font color=\"#999999\">\u042d\u0442\u043e, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e, \u0441\u0430\u043c\u044b\u0439 \u043b\u0443\u0447\u0448\u0438\u0439 \u0444\u043e\u043d \u0434\u043b\u044f \u0432\u0438\u0434\u0435\u043e\u0437\u0432\u043e\u043d\u043a\u043e\u0432<\/font><\/i><\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u0443 \u043d\u0430\u0441 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u043c\u0430\u0441\u043a\u0430 \u0434\u043b\u044f \u043e\u0442\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0434\u043d\u0435\u0433\u043e \u043f\u043b\u0430\u043d\u0430 \u043e\u0442 \u0444\u043e\u043d\u0430, \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0444\u043e\u043d \u043d\u0430 \u0447\u0442\u043e-\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e.<\/p>\n<p>  \u042f \u0432\u0437\u044f\u043b \u0438\u0437 \u0432\u0435\u0442\u043a\u0438 \u0442\u043e\u0433\u043e \u0442\u0432\u0438\u0442\u0430 \u0444\u043e\u043d\u043e\u0432\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438 \u043e\u0431\u0440\u0435\u0437\u0430\u043b \u0435\u0433\u043e \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u0431\u044b \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 16&#215;9.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/900\/311\/537\/900311537df81d74a682ddfd447a85a5.jpg\"><\/div>\n<p>  <i><font color=\"#999999\">\u0424\u043e\u043d\u043e\u0432\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435<\/font><\/i><\/p>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<pre><code class=\"python\"># \u0447\u0438\u0442\u0430\u0435\u043c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0444\u043e\u043d (\u0441\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u0441\u0442\u043e\u0440\u043e\u043d \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c 16:9) replacement_bg_raw = cv2.imread(&quot;background.jpg&quot;)  # \u043c\u0435\u043d\u044f\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u043e \u0432\u043f\u0438\u0441\u0430\u043b\u043e\u0441\u044c \u0431\u044b \u0432 \u043a\u0430\u0434\u0440 (width &amp; height \u0438\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043a\u043e\u0434\u0430) width, height = 720, 1280 replacement_bg = cv2.resize(replacement_bg_raw, (width, height))  # \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u0443\u0435\u043c \u0444\u043e\u043d \u0438 \u043f\u0435\u0440\u0435\u0434\u043d\u0438\u0439 \u043f\u043b\u0430\u043d, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u043c\u0430\u0441\u043a\u0443 inv_mask = 1-mask for c in range(frame.shape[2]): \u00a0\u00a0\u00a0\u00a0frame[:,:,c] = frame[:,:,c]*mask + replacement_bg[:,:,c]*inv_mask <\/code><\/pre>\n<p>  \u0412\u043e\u0442 \u0447\u0442\u043e \u0443 \u043c\u0435\u043d\u044f \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/500\/fbf\/e3b\/500fbfe3ba3753878562533ced87ed69.jpg\"><\/div>\n<p>  <i><font color=\"#999999\">\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0437\u0430\u043c\u0435\u043d\u044b \u0444\u043e\u043d\u0430<\/font><\/i><\/p>\n<p>  \u0422\u0430\u043a\u0430\u044f \u043c\u0430\u0441\u043a\u0430, \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0442\u043e\u0447\u043d\u0430, \u043f\u0440\u0438\u0447\u0438\u043d\u043e\u0439 \u044d\u0442\u043e\u0433\u043e \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0442\u0435 \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0438\u0441\u0441\u044b \u0432 \u0441\u0444\u0435\u0440\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u043f\u043e\u0448\u043b\u0438, \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u044f BodyPix. \u0412 \u043e\u0431\u0449\u0435\u043c, \u043f\u043e\u043a\u0430 \u0432\u0441\u0451 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0431\u043e\u043b\u0435\u0435 \u0438\u043b\u0438 \u043c\u0435\u043d\u0435\u0435 \u0442\u0435\u0440\u043f\u0438\u043c\u043e.<\/p>\n<p>  \u041d\u043e, \u043a\u043e\u0433\u0434\u0430 \u044f \u0441\u043c\u043e\u0442\u0440\u0435\u043b \u043d\u0430 \u044d\u0442\u043e\u0442 \u0444\u043e\u043d, \u043c\u0435\u043d\u044f \u043f\u043e\u0441\u0435\u0442\u0438\u043b\u0430 \u043e\u0434\u043d\u0430 \u0438\u0434\u0435\u044f.<\/p>\n<h2><font color=\"#3AC1EF\">\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b<\/font><\/h2>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c \u0441 \u043c\u0430\u0441\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c, \u0437\u0430\u0434\u0430\u0434\u0438\u043c\u0441\u044f \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.<\/p>\n<p>  \u041f\u0435\u0440\u0432\u044b\u0439 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0439 \u0448\u0430\u0433 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u043c\u044f\u0433\u0447\u0435\u043d\u0438\u0438 \u043a\u0440\u0430\u0451\u0432 \u043c\u0430\u0441\u043a\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"python\">def post_process_mask(mask): \u00a0\u00a0\u00a0\u00a0mask = cv2.dilate(mask, np.ones((10,10), np.uint8) , iterations=1) \u00a0\u00a0\u00a0\u00a0mask = cv2.erode(mask, np.ones((10,10), np.uint8) , iterations=1) \u00a0\u00a0\u00a0\u00a0return mask <\/code><\/pre>\n<p>  \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u043d\u043e \u043e\u0441\u043e\u0431\u043e\u0433\u043e \u043f\u0440\u043e\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u0432\u043f\u0435\u0440\u0451\u0434 \u0442\u0443\u0442 \u043d\u0435\u0442. \u0414\u0430 \u0438 \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0437\u0430\u043c\u0435\u043d\u0430 \u2014 \u0434\u0435\u043b\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e-\u0442\u0430\u043a\u0438 \u0441\u043a\u0443\u0447\u043d\u043e\u0435. \u041d\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0434\u043e\u0448\u043b\u0438 \u0434\u043e \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e\u0433\u043e \u0441\u0430\u043c\u0438, \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u043e\u0439 \u0432\u0441\u0451 \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0431\u0440\u0430\u0442\u044c \u0444\u043e\u043d.<\/p>\n<p>  \u0423\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u0442\u043e, \u0447\u0442\u043e \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0444\u043e\u043d \u0438\u0437 \u00ab\u0417\u0432\u0451\u0437\u0434\u043d\u044b\u0445 \u0432\u043e\u0439\u043d\u00bb, \u044f \u0440\u0435\u0448\u0438\u043b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442 \u0433\u043e\u043b\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435. \u042d\u0442\u043e, \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0433\u043b\u0430\u0434\u0438\u0442\u044c \u0440\u0430\u0437\u043c\u044b\u0442\u0438\u0435 \u043c\u0430\u0441\u043a\u0438.<\/p>\n<p>  \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u0431\u043d\u043e\u0432\u0438\u043c \u043a\u043e\u0434 \u043f\u043e\u0441\u0442-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0438\u043d\u0433\u0430:<\/p>\n<pre><code class=\"python\">def post_process_mask(mask): \u00a0\u00a0\u00a0\u00a0mask = cv2.dilate(mask, np.ones((10,10), np.uint8) , iterations=1) \u00a0\u00a0\u00a0\u00a0mask = cv2.blur(mask.astype(float), (30,30)) \u00a0\u00a0\u00a0\u00a0return mask <\/code><\/pre>\n<p>  \u041a\u0440\u0430\u044f \u0442\u0435\u043f\u0435\u0440\u044c \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u043c\u044b\u0442\u044b\u043c\u0438. \u042d\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u043e, \u043d\u043e \u043d\u0430\u043c \u0435\u0449\u0451 \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442 \u0433\u043e\u043b\u043e\u0433\u0440\u0430\u043c\u043c\u044b.<\/p>\n<p>  \u0413\u043e\u043b\u043b\u0438\u0432\u0443\u0434\u0441\u043a\u0438\u0435 \u0433\u043e\u043b\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438:<\/p>\n<ul>\n<li>\u0411\u043b\u0435\u0434\u043d\u0430\u044f \u0446\u0432\u0435\u0442\u043d\u0430\u044f \u0438\u043b\u0438 \u043c\u043e\u043d\u043e\u0445\u0440\u043e\u043c\u043d\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 \u2014 \u0431\u0443\u0434\u0442\u043e \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u044f\u0440\u043a\u0438\u043c \u043b\u0430\u0437\u0435\u0440\u043e\u043c.<\/li>\n<li>\u042d\u0444\u0444\u0435\u043a\u0442, \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u044e\u0449\u0438\u0439 \u043b\u0438\u043d\u0438\u0438 \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u043a\u0438 \u0438\u043b\u0438 \u043d\u0435\u0447\u0442\u043e \u0432\u0440\u043e\u0434\u0435 \u0441\u0435\u0442\u043a\u0438 \u2014 \u0431\u0443\u0434\u0442\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043b\u0443\u0447\u0430\u043c\u0438.<\/li>\n<li>\u00ab\u042d\u0444\u0444\u0435\u043a\u0442 \u043f\u0440\u0438\u0432\u0438\u0434\u0435\u043d\u0438\u044f\u00bb \u2014 \u0431\u0443\u0434\u0442\u043e \u0431\u044b \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u043e\u0439\u043d\u043e \u0438\u043b\u0438 \u0442\u0430\u043a, \u043a\u0430\u043a \u0435\u0441\u043b\u0438 \u0431\u044b \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u043d\u0435 \u0432\u044b\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u043b\u043e\u0441\u044c \u0431\u044b \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c\u0441\u044f.<\/li>\n<\/ul>\n<p>  \u0412\u0441\u0435 \u044d\u0442\u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u044b \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0448\u0430\u0433\u043e\u0432\u043e.<\/p>\n<p>  \u0421\u043d\u0430\u0447\u0430\u043b\u0430, \u0447\u0442\u043e\u0431\u044b \u043e\u043a\u0440\u0430\u0441\u0438\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432 \u043e\u0442\u0442\u0435\u043d\u043e\u043a \u0441\u0438\u043d\u0435\u0433\u043e, \u043c\u043e\u0436\u0435\u043c \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u043c <code>applyColorMap<\/code>:<\/p>\n<pre><code class=\"python\"># \u0434\u0435\u043b\u0430\u0435\u043c \u043c\u044d\u043f\u043f\u0438\u043d\u0433 \u043a\u0430\u0434\u0440\u0430 \u0432 \u0441\u0438\u043d\u0435-\u0437\u0435\u043b\u0451\u043d\u043e\u0435 \u0446\u0432\u0435\u0442\u043e\u0432\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e holo = cv2.applyColorMap(frame, cv2.COLORMAP_WINTER) <\/code><\/pre>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u2014 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043b\u0438\u043d\u0438\u0438 \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u043a\u0438 \u0441 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u043c, \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u044e\u0449\u0438\u043c \u0443\u0445\u043e\u0434 \u0432 \u043f\u043e\u043b\u0443\u0442\u043e\u043d\u0430:<\/p>\n<pre><code class=\"python\"># \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 bandLength \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u044f\u0440\u043a\u043e\u0441\u0442\u044c \u043d\u0430 10-30%, # \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0438 bandGap. bandLength, bandGap = 2, 3 for y in range(holo.shape[0]): \u00a0\u00a0\u00a0\u00a0if y % (bandLength+bandGap) &lt; bandLength: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0holo[y,:,:] = holo[y,:,:] * np.random.uniform(0.1, 0.3) <\/code><\/pre>\n<p>  \u0414\u0430\u043b\u0435\u0435, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u00ab\u044d\u0444\u0444\u0435\u043a\u0442 \u043f\u0440\u0438\u0432\u0438\u0434\u0435\u043d\u0438\u044f\u00bb, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044f \u043a \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044e \u0441\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0435 \u0432\u0437\u0432\u0435\u0448\u0435\u043d\u043d\u044b\u0435 \u043a\u043e\u043f\u0438\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0430:<\/p>\n<pre><code class=\"python\"># shift_img \u0438\u0437: https:\/\/stackoverflow.com\/a\/53140617 def shift_img(img, dx, dy): \u00a0\u00a0\u00a0\u00a0img = np.roll(img, dy, axis=0) \u00a0\u00a0\u00a0\u00a0img = np.roll(img, dx, axis=1) \u00a0\u00a0\u00a0\u00a0if dy&gt;0: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0img[:dy, :] = 0 \u00a0\u00a0\u00a0\u00a0elif dy&lt;0: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0img[dy:, :] = 0 \u00a0\u00a0\u00a0\u00a0if dx&gt;0: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0img[:, :dx] = 0 \u00a0\u00a0\u00a0\u00a0elif dx&lt;0: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0img[:, dx:] = 0 \u00a0\u00a0\u00a0\u00a0return img  # \u043f\u0435\u0440\u0432\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u0438\u043c: holo * 0.2 + shifted_holo * 0.8 + 0 holo2 = cv2.addWeighted(holo, 0.2, shift_img(holo1.copy(), 5, 5), 0.8, 0) holo2 = cv2.addWeighted(holo2, 0.4, shift_img(holo1.copy(), -5, -5), 0.6, 0) <\/code><\/pre>\n<p>  \u0418 \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u0446\u0432\u0435\u0442\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u0443\u0435\u043c \u0433\u043e\u043b\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u044d\u0444\u0444\u0435\u043a\u0442 \u0441 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u043c \u043a\u0430\u0434\u0440\u043e\u043c, \u043f\u043e\u0441\u0442\u0443\u043f\u0438\u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a, \u043a\u0430\u043a \u043f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u00ab\u044d\u0444\u0444\u0435\u043a\u0442\u0430 \u043f\u0440\u0438\u0432\u0438\u0434\u0435\u043d\u0438\u044f\u00bb:<\/p>\n<pre><code class=\"python\">holo_done = cv2.addWeighted(img, 0.5, holo2, 0.6, 0) <\/code><\/pre>\n<p>  \u0412\u043e\u0442 \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u0434\u0440 \u0441 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u043c \u0433\u043e\u043b\u043e\u0433\u0440\u0430\u043c\u043c\u044b:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/8ba\/bda\/21c\/8babda21c3f11e9fa3867faf65e14c24.jpg\"><\/div>\n<p>  <i><font color=\"#999999\">\u041a\u0430\u0434\u0440 \u0441 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u043c \u0433\u043e\u043b\u043e\u0433\u0440\u0430\u043c\u043c\u044b<\/font><\/i><\/p>\n<p>  \u0421\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435 \u044d\u0442\u043e\u0442 \u043a\u0430\u0434\u0440 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043d\u0435\u043f\u043b\u043e\u0445\u043e.<\/p>\n<p>  \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u0441 \u0444\u043e\u043d\u043e\u043c.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/297\/7b7\/ce4\/2977b7ce4f9efdedd6632ffb0a3ad621.jpg\"><\/div>\n<p>  <i><font color=\"#999999\">\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0435 \u043d\u0430 \u0444\u043e\u043d<\/font><\/i><\/p>\n<p>  \u0413\u043e\u0442\u043e\u0432\u043e! (\u043e\u0431\u0435\u0449\u0430\u044e \u2014 \u0432\u0438\u0434\u0435\u043e \u0442\u0430\u043a\u043e\u0433\u043e \u0440\u043e\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435).<\/p>\n<h2><font color=\"#3AC1EF\">\u0412\u044b\u0432\u043e\u0434 \u0432\u0438\u0434\u0435\u043e<\/font><\/h2>\n<p>  \u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0434\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u044b \u0442\u0443\u0442 \u043a\u043e\u0435-\u0447\u0442\u043e \u0443\u043f\u0443\u0441\u0442\u0438\u043b\u0438. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432\u0441\u0435\u043c \u044d\u0442\u0438\u043c \u043c\u044b \u043f\u043e\u043a\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0432\u0438\u0434\u0435\u043e\u0437\u0432\u043e\u043d\u043a\u043e\u0432.<\/p>\n<p>  \u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c, \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f <a href=\"https:\/\/github.com\/jremmons\/pyfakewebcam\">pyfakewebcam<\/a> \u0438 <a href=\"https:\/\/github.com\/umlaeute\/v4l2loopback\">v4l2loopback<\/a> \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0444\u0438\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0432\u0435\u0431-\u043a\u0430\u043c\u0435\u0440\u044b.<\/p>\n<p>  \u041c\u044b, \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u043c \u043f\u0440\u0438\u0446\u0435\u043f\u0438\u0442\u044c \u044d\u0442\u0443 \u043a\u0430\u043c\u0435\u0440\u0443 \u043a Docker.<\/p>\n<p>  \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0444\u0430\u0439\u043b <code>fakecam\/requirements.txt<\/code> \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439:<\/p>\n<pre><code class=\"python\">numpy==1.18.2 opencv-python==4.2.0.32 requests==2.23.0 pyfakewebcam==0.1.0 <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0444\u0430\u0439\u043b <code>fakecam\/Dockerfile<\/code> \u0434\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0435\u0433\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0444\u0438\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u043a\u0430\u043c\u0435\u0440\u044b:<\/p>\n<pre><code class=\"python\">FROM python:3-buster # \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u043c \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c pip RUN pip install --upgrade pip # \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 opencv RUN apt-get update &amp;&amp; \\ \u00a0\u00a0\u00a0\u00a0apt-get install -y \\ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0`# opencv requirements` \\ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0libsm6 libxext6 libxrender-dev \\ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0`# opencv video opening requirements` \\ \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0libv4l-dev # \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0438\u0437 requirements.txt WORKDIR \/src COPY requirements.txt \/src\/ RUN pip install --no-cache-dir -r \/src\/requirements.txt # \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0444\u043e\u043d COPY background.jpg \/data\/ # \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u0444\u0438\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u043a\u0430\u043c\u0435\u0440\u044b (\u0441 \u043d\u0435\u0431\u0443\u0444\u0435\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0432\u044b\u0432\u043e\u0434\u043e\u043c \u0434\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438) COPY fake.py \/src\/ ENTRYPOINT python -u fake.py <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c, \u0438\u0437 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c v4l2loopback:<\/p>\n<pre><code class=\"bash\">sudo apt install v4l2loopback-dkms <\/code><\/pre>\n<p>  \u041d\u0430\u0441\u0442\u0440\u043e\u0438\u043c \u0444\u0438\u043a\u0442\u0438\u0432\u043d\u0443\u044e \u043a\u0430\u043c\u0435\u0440\u0443:<\/p>\n<pre><code class=\"python\">sudo modprobe -r v4l2loopback sudo modprobe v4l2loopback devices=1 video_nr=20 card_label=&quot;v4l2loopback&quot; exclusive_caps=1 <\/code><\/pre>\n<p>  \u041d\u0430\u043c, \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 (Chrome, Zoom), \u043d\u0443\u0436\u043d\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 <code>exclusive_caps<\/code>. \u041c\u0435\u0442\u043a\u0430 <code>card_label<\/code> \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u0434\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0432\u044b\u0431\u043e\u0440\u0430 \u043a\u0430\u043c\u0435\u0440\u044b \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445. \u0423\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u043d\u043e\u043c\u0435\u0440\u0430 <code>video_nr=20<\/code> \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 <code>\/dev\/video20<\/code> \u0432 \u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043d\u043e\u043c\u0435\u0440 \u043d\u0435 \u0437\u0430\u043d\u044f\u0442, \u0430 \u043e\u043d \u0432\u0440\u044f\u0434 \u043b\u0438 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043d\u044f\u0442.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0432\u043d\u0435\u0441\u0451\u043c \u0432 \u0441\u043a\u0440\u0438\u043f\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0435 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0444\u0438\u043a\u0442\u0438\u0432\u043d\u0443\u044e \u043a\u0430\u043c\u0435\u0440\u0443:<\/p>\n<pre><code class=\"python\"># \u0442\u0443\u0442, \u043e\u043f\u044f\u0442\u044c \u0436\u0435, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0442\u0435 \u0436\u0435, \u0447\u0442\u043e \u0438 \u0440\u0430\u043d\u044c\u0448\u0435, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f width \u0438 height fake = pyfakewebcam.FakeWebcam('\/dev\/video20', width, height) <\/code><\/pre>\n<p>  \u041d\u0443\u0436\u043d\u043e \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e pyfakewebcam \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441 \u043a\u0430\u043d\u0430\u043b\u0430\u043c\u0438 RGB (Red, Green, Blue \u2014 \u043a\u0440\u0430\u0441\u043d\u044b\u0439, \u0437\u0435\u043b\u0451\u043d\u044b\u0439, \u0441\u0438\u043d\u0438\u0439), \u0430 Open CV \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u043c \u043a\u0430\u043d\u0430\u043b\u043e\u0432 BGR (Blue, Green, Red).<\/p>\n<p>  \u0418\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0434\u043e \u0432\u044b\u0432\u043e\u0434\u0430 \u043a\u0430\u0434\u0440\u0430, \u0430 \u0437\u0430\u0442\u0435\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u0434\u0440 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"python\">frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) fake.schedule_frame(frame) <\/code><\/pre>\n<p>  \u0412\u043e\u0442 \u2014 \u043f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u0441\u043a\u0440\u0438\u043f\u0442\u0430 <code>fakecam\/fake.py<\/code>:<\/p>\n<pre><code class=\"python\">import os import cv2 import numpy as np import requests import pyfakewebcam  def get_mask(frame, bodypix_url='http:\/\/localhost:9000'): \u00a0\u00a0\u00a0\u00a0_, data = cv2.imencode(&quot;.jpg&quot;, frame) \u00a0\u00a0\u00a0\u00a0r = requests.post( \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0url=bodypix_url, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0data=data.tobytes(), \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0headers={'Content-Type': 'application\/octet-stream'}) \u00a0\u00a0\u00a0\u00a0mask = np.frombuffer(r.content, dtype=np.uint8) \u00a0\u00a0\u00a0\u00a0mask = mask.reshape((frame.shape[0], frame.shape[1])) \u00a0\u00a0\u00a0\u00a0return mask  def post_process_mask(mask): \u00a0\u00a0\u00a0\u00a0mask = cv2.dilate(mask, np.ones((10,10), np.uint8) , iterations=1) \u00a0\u00a0\u00a0\u00a0mask = cv2.blur(mask.astype(float), (30,30)) \u00a0\u00a0\u00a0\u00a0return mask  def shift_image(img, dx, dy): \u00a0\u00a0\u00a0\u00a0img = np.roll(img, dy, axis=0) \u00a0\u00a0\u00a0\u00a0img = np.roll(img, dx, axis=1) \u00a0\u00a0\u00a0\u00a0if dy&gt;0: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0img[:dy, :] = 0 \u00a0\u00a0\u00a0\u00a0elif dy&lt;0: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0img[dy:, :] = 0 \u00a0\u00a0\u00a0\u00a0if dx&gt;0: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0img[:, :dx] = 0 \u00a0\u00a0\u00a0\u00a0elif dx&lt;0: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0img[:, dx:] = 0 \u00a0\u00a0\u00a0\u00a0return img  def hologram_effect(img): \u00a0\u00a0\u00a0\u00a0# \u043e\u043a\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c \u0432 \u0441\u0438\u043d\u0438\u0439 \u043e\u0442\u0442\u0435\u043d\u043e\u043a \u00a0\u00a0\u00a0\u00a0holo = cv2.applyColorMap(img, cv2.COLORMAP_WINTER) \u00a0\u00a0\u00a0\u00a0# \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u044d\u0444\u0444\u0435\u043a\u0442 \u043f\u043e\u043b\u0443\u0442\u043e\u043d\u043e\u0432 \u00a0\u00a0\u00a0\u00a0bandLength, bandGap = 2, 3 \u00a0\u00a0\u00a0\u00a0for y in range(holo.shape[0]): \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if y % (bandLength+bandGap) &lt; bandLength: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0holo[y,:,:] = holo[y,:,:] * np.random.uniform(0.1, 0.3) \u00a0\u00a0\u00a0\u00a0# \u044d\u0444\u0444\u0435\u043a\u0442 \u043f\u0440\u0438\u0432\u0438\u0434\u0435\u043d\u0438\u044f \u00a0\u00a0\u00a0\u00a0holo_blur = cv2.addWeighted(holo, 0.2, shift_image(holo.copy(), 5, 5), 0.8, 0) \u00a0\u00a0\u00a0\u00a0holo_blur = cv2.addWeighted(holo_blur, 0.4, shift_image(holo.copy(), -5, -5), 0.6, 0) \u00a0\u00a0\u00a0\u00a0# \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u0443\u0435\u043c \u0441 \u043f\u0435\u0440\u0435\u043d\u0430\u0441\u044b\u0449\u0435\u043d\u043d\u044b\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u0446\u0432\u0435\u0442\u043e\u043c \u00a0\u00a0\u00a0\u00a0out = cv2.addWeighted(img, 0.5, holo_blur, 0.6, 0) \u00a0\u00a0\u00a0\u00a0return out  def get_frame(cap, background_scaled): \u00a0\u00a0\u00a0\u00a0_, frame = cap.read() \u00a0\u00a0\u00a0\u00a0# \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u043c\u0430\u0441\u043a\u0443 \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u043f\u043e\u0432\u0442\u043e\u0440\u043e\u0432 (\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0437\u043e\u0433\u0440\u0435\u0442\u044c\u0441\u044f, \u0430 \u043c\u044b \u043b\u0435\u043d\u0438\u0432\u044b) \u00a0\u00a0\u00a0\u00a0# \u0432\u0441\u0451 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043e \u043f\u043e \u043f\u0440\u043e\u0448\u0435\u0441\u0442\u0432\u0438\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u00a0\u00a0\u00a0\u00a0mask = None \u00a0\u00a0\u00a0\u00a0while mask is None: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0try: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0mask = get_mask(frame) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0except requests.RequestException: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0print(&quot;mask request failed, retrying&quot;) \u00a0\u00a0\u00a0\u00a0# \u043f\u043e\u0441\u0442-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0438\u043d\u0433 \u043c\u0430\u0441\u043a\u0438 \u0438 \u043a\u0430\u0434\u0440\u0430 \u00a0\u00a0\u00a0\u00a0mask = post_process_mask(mask) \u00a0\u00a0\u00a0\u00a0frame = hologram_effect(frame) \u00a0\u00a0\u00a0\u00a0# \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u0443\u0435\u043c \u0444\u043e\u043d \u0438 \u043f\u0435\u0440\u0435\u0434\u043d\u0438\u0439 \u043f\u043b\u0430\u043d \u00a0\u00a0\u00a0\u00a0inv_mask = 1-mask \u00a0\u00a0\u00a0\u00a0for c in range(frame.shape[2]): \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0frame[:,:,c] = frame[:,:,c]*mask + background_scaled[:,:,c]*inv_mask \u00a0\u00a0\u00a0\u00a0return frame  # \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u0430\u043c\u0435\u0440\u0435 cap = cv2.VideoCapture('\/dev\/video0') height, width = 720, 1280 cap.set(cv2.CAP_PROP_FRAME_WIDTH, width) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, height) cap.set(cv2.CAP_PROP_FPS, 60)  # \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u0444\u0438\u043a\u0442\u0438\u0432\u043d\u0443\u044e \u043a\u0430\u043c\u0435\u0440\u0443 fake = pyfakewebcam.FakeWebcam('\/dev\/video20', width, height)  # \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0444\u043e\u043d background = cv2.imread(&quot;\/data\/background.jpg&quot;) background_scaled = cv2.resize(background, (width, height))  # \u0432\u0435\u0447\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u0430 \u043a\u0430\u0434\u0440\u043e\u0432 while True: \u00a0\u00a0\u00a0\u00a0frame = get_frame(cap, background_scaled) \u00a0\u00a0\u00a0\u00a0# \u0444\u0438\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u043a\u0430\u043c\u0435\u0440\u0430 \u043e\u0436\u0438\u0434\u0430\u0435\u0442 RGB-\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u00a0\u00a0\u00a0\u00a0frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) \u00a0\u00a0\u00a0\u00a0fake.schedule_frame(frame) <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0431\u0435\u0440\u0451\u043c \u043e\u0431\u0440\u0430\u0437\u044b:<\/p>\n<pre><code class=\"python\">docker build -t bodypix .\/bodypix docker build -t fakecam .\/fakecam <\/code><\/pre>\n<p>  \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u0438\u0445:<\/p>\n<pre><code class=\"python\"># \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441\u0435\u0442\u044c docker network create --driver bridge fakecam # \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 bodypix docker run -d \\ \u00a0\u00a0--name=bodypix \\ \u00a0\u00a0--network=fakecam \\ \u00a0\u00a0--gpus=all --shm-size=1g --ulimit memlock=-1 --ulimit stack=67108864 \\ \u00a0\u00a0bodypix # \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u043a\u0430\u043c\u0435\u0440\u0443, \u0443\u0447\u0442\u044f \u0442\u043e, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0439\u0442\u0438\u0441\u044c \u043f\u043e \u0432\u0438\u0434\u0435\u043e\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c, \u0438 \u0442\u043e, # \u0447\u0442\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0438 \u0433\u0440\u0443\u043f\u043f\u0430 \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u043c\u0435\u0442\u044c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043d\u0438\u043c # \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 \u0432\u0438\u0434\u0430 `sudo groupadd $USER video` docker run -d \\ \u00a0\u00a0--name=fakecam \\ \u00a0\u00a0--network=fakecam \\ \u00a0\u00a0-p 8080:8080 \\ \u00a0\u00a0-u &quot;$$(id -u):$$(getent group video | cut -d: -f3)&quot; \\ \u00a0\u00a0$$(find \/dev -name 'video*' -printf &quot;--device %p &quot;) \\ \u00a0\u00a0fakecam <\/code><\/pre>\n<p>  \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0443\u0447\u0435\u0441\u0442\u044c \u043b\u0438\u0448\u044c \u0442\u043e, \u0447\u0442\u043e \u044d\u0442\u043e \u043d\u0430\u0434\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0434\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043a\u0430\u043c\u0435\u0440\u044b \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u043b\u044e\u0431\u044b\u043c\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438. \u0410 \u0432 Zoom \u0438\u043b\u0438 \u0433\u0434\u0435-\u0442\u043e \u0435\u0449\u0451 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043a\u0430\u043c\u0435\u0440\u0443 <code>v4l2loopback<\/code> \/ <code>\/dev\/video20<\/code>.<\/p>\n<h2><font color=\"#3AC1EF\">\u0418\u0442\u043e\u0433\u0438<\/font><\/h2>\n<p>  \u0412\u043e\u0442 \u043a\u043b\u0438\u043f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043c\u043e\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b.<\/p>\n<div class=\"oembed\">\n<div>\n<div style=\"left: 0; width: 100%; height: 0; position: relative; padding-bottom: 56.25%;\"><video controls style=\"top: 0; left: 0; width: 100%; height: 100%; position: absolute;\">Your browser does not support HTML5 video.<source src=\"https:\/\/elder.dev\/posts\/open-source-virtual-background\/holo-demo.webm\" type=\"video\/webm\"><\/source><\/video><\/div>\n<\/div>\n<\/div>\n<p>  <i><font color=\"#999999\">\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0437\u0430\u043c\u0435\u043d\u044b \u0444\u043e\u043d\u0430<\/font><\/i><\/p>\n<p>  \u0412\u0438\u0434\u0438\u0442\u0435! \u042f \u0437\u0432\u043e\u043d\u044e \u0441 \u0421\u043e\u043a\u043e\u043b\u0430 \u0422\u044b\u0441\u044f\u0447\u0435\u043b\u0435\u0442\u0438\u044f, \u043f\u043e\u043b\u044c\u0437\u0443\u044f\u0441\u044c \u043e\u043f\u0435\u043d\u0441\u043e\u0440\u0441\u043d\u044b\u043c \u0441\u0442\u0435\u043a\u043e\u043c \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u0430\u043c\u0435\u0440\u043e\u0439!<\/p>\n<p>  \u0422\u043e, \u0447\u0442\u043e \u0443 \u043c\u0435\u043d\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c, \u043c\u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u043e\u0441\u044c. \u0418 \u044f, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e, \u0432\u0441\u0435\u043c \u044d\u0442\u0438\u043c \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0441\u044c \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0432\u0438\u0434\u0435\u043e\u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438.<\/p>\n<p>  <b>\u0423\u0432\u0430\u0436\u0430\u0435\u043c\u044b\u0435 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438!<\/b> \u041f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0435 \u043b\u0438 \u0432\u044b \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0442\u043e, \u0447\u0442\u043e \u0432\u0438\u0434\u043d\u043e \u043f\u0440\u0438 \u0432\u0438\u0434\u0435\u043e\u0437\u0432\u043e\u043d\u043a\u0430\u0445 \u0443 \u0432\u0430\u0441 \u0437\u0430 \u0441\u043f\u0438\u043d\u043e\u0439, \u043d\u0430 \u0447\u0442\u043e-\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0435?<\/p>\n<p>  <a href=\"https:\/\/ruvds.com\/ru-rub\/#order\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/iq\/fi\/b4\/iqfib45pgphfrxv--zfemt0qnmw.jpeg\"><\/a><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/498458\/\"> https:\/\/habr.com\/ru\/company\/ruvds\/blog\/498458\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/498458\/\">\u0421\u0435\u0439\u0447\u0430\u0441, \u043a\u043e\u0433\u0434\u0430 \u043c\u043d\u043e\u0433\u0438\u0435 \u0438\u0437 \u043d\u0430\u0441 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u043d\u0430 <a href=\"https:\/\/www.sfchronicle.com\/local-politics\/article\/Bay-Area-must-shelter-in-place-Only-15135014.php\">\u043a\u0430\u0440\u0430\u043d\u0442\u0438\u043d\u0435<\/a> \u0438\u0437-\u0437\u0430 <a href=\"https:\/\/www.cdc.gov\/coronavirus\/2019-ncov\/index.html\">COVID-19<\/a>, \u0432\u0438\u0434\u0435\u043e\u0437\u0432\u043e\u043d\u043a\u0438 \u0441\u0442\u0430\u043b\u0438 \u043a\u0443\u0434\u0430 \u0431\u043e\u043b\u0435\u0435 \u0447\u0430\u0441\u0442\u044b\u043c \u044f\u0432\u043b\u0435\u043d\u0438\u0435\u043c, \u0447\u0435\u043c \u0440\u0430\u043d\u044c\u0448\u0435. \u0412 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u0441\u0435\u0440\u0432\u0438\u0441 <a href=\"https:\/\/zoom.us\/\">ZOOM<\/a> <a href=\"https:\/\/en.wikipedia.org\/wiki\/Zoom_Video_Communications#Criticism\">\u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u043e<\/a> \u0441\u0442\u0430\u043b \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u043c. \u0412\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0441\u0430\u043c\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e Zoom \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0444\u043e\u043d\u0430 (<a href=\"https:\/\/support.zoom.us\/hc\/en-us\/articles\/210707503-Virtual-Background\">Virtual Background<\/a>). \u041e\u043d\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c, \u0432 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435, \u0437\u0430\u043c\u0435\u043d\u044f\u0442\u044c \u0444\u043e\u043d, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0439\u0441\u044f \u043f\u043e\u0437\u0430\u0434\u0438 \u043d\u0438\u0445, \u043d\u0430 \u043b\u044e\u0431\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u0432\u0438\u0434\u0435\u043e.<\/p>\n<p>  <a href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/498458\/\"><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/wf\/46\/1p\/wf461pvjwrwmpzvkvnhyvzcf8xy.jpeg\"><\/div>\n<p><\/a><\/p>\n<p>  \u042f \u0443\u0436\u0435 \u0434\u0430\u0432\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e Zoom \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0435, \u043d\u0430 \u043e\u043f\u0435\u043d\u0441\u043e\u0440\u0441\u043d\u044b\u0445 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0445, \u043f\u043e\u0441\u0432\u044f\u0449\u0451\u043d\u043d\u044b\u0445 Kubernetes, \u0434\u0435\u043b\u0430\u044f \u044d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u0441 \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043d\u043e\u0443\u0442\u0431\u0443\u043a\u0430. \u0422\u0435\u043f\u0435\u0440\u044c \u044f, \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u0438\u0437 \u0434\u043e\u043c\u0430, \u0441\u043a\u043b\u043e\u043d\u0435\u043d \u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e \u0431\u043e\u043b\u0435\u0435 \u043c\u043e\u0449\u043d\u043e\u0433\u043e \u0438 \u0443\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430 \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u0437 \u043c\u043e\u0438\u0445 \u043e\u043f\u0435\u043d\u0441\u043e\u0440\u0441\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447.<\/p>\n<p>  \u041a \u043d\u0435\u0441\u0447\u0430\u0441\u0442\u044c\u044e, Zoom \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043b\u0438\u0448\u044c \u0441\u043f\u043e\u0441\u043e\u0431 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0444\u043e\u043d\u0430, \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u043a\u0430\u043a \u00ab<a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A5%D1%80%D0%BE%D0%BC%D0%B0%D0%BA%D0%B5%D0%B9\">\u0445\u0440\u043e\u043c\u0430\u043a\u0435\u0439<\/a>\u00bb \u0438\u043b\u0438 \u00ab<a href=\"https:\/\/en.wikipedia.org\/wiki\/Green_screen_(disambiguation)\">\u0437\u0435\u043b\u0451\u043d\u044b\u0439 \u044d\u043a\u0440\u0430\u043d<\/a>\u00bb. \u0414\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0444\u043e\u043d \u0431\u044b\u043b \u0431\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043d\u0435\u043a\u0438\u043c \u0441\u043f\u043b\u043e\u0448\u043d\u044b\u043c \u0446\u0432\u0435\u0442\u043e\u043c, \u0432 \u0438\u0434\u0435\u0430\u043b\u0435 \u2014 \u0437\u0435\u043b\u0451\u043d\u044b\u043c, \u0438 \u0431\u044b\u043b \u0431\u044b \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e \u043e\u0441\u0432\u0435\u0449\u0451\u043d.<\/p>\n<p>  \u0422\u0430\u043a \u043a\u0430\u043a \u0437\u0435\u043b\u0451\u043d\u043e\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430 \u0443 \u043c\u0435\u043d\u044f \u043d\u0435\u0442, \u044f \u0440\u0435\u0448\u0438\u043b \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0444\u043e\u043d\u0430. \u0410 \u044d\u0442\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043a\u0443\u0434\u0430 \u043b\u0443\u0447\u0448\u0435, \u0447\u0435\u043c \u043d\u0430\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u0432 \u043a\u0432\u0430\u0440\u0442\u0438\u0440\u0435, \u0438\u043b\u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u043d\u043e\u0443\u0442\u0431\u0443\u043a\u0430.<\/p>\n<p>  \u041a\u0430\u043a \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0432 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u043e\u043f\u0435\u043d\u0441\u043e\u0440\u0441\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0432 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u043e\u043a \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0435\u0441\u044c\u043c\u0430 \u0434\u043e\u0441\u0442\u043e\u0439\u043d\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-302397","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/302397","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=302397"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/302397\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=302397"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=302397"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=302397"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}