{"id":389315,"date":"2024-06-29T08:31:33","date_gmt":"2024-06-29T08:31:33","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=389315"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=389315","title":{"rendered":"<span>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0430\u0443\u0434\u0438\u043e \u0434\u0438\u0444\u0444\u0443\u0437\u0438\u043e\u043d\u043d\u043e\u0439 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c\u044e. \u0421\u0442\u043e\u0438\u0442 \u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u0443\u044e \u0434\u0438\u0444\u0444\u0443\u0437\u0438\u044e \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043c\u0435\u043b-\u0441\u043f\u0435\u043a\u0442\u0440\u043e\u0433\u0440\u0430\u043c\u043c?<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\"><a href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/708182\/\"><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/post_images\/333\/a90\/a33\/333a90a33155b1e501ed2e45a97de7fe.jpg\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/333\/a90\/a33\/333a90a33155b1e501ed2e45a97de7fe.jpg\" data-blurred=\"true\"\/><\/div>\n<p><\/a><br \/>  \u0412 \u0443\u0445\u043e\u0434\u044f\u0449\u0435\u043c \u0433\u043e\u0434\u0443 \u0432\u044b \u043c\u043e\u0433\u043b\u0438 \u0432\u0438\u0434\u0435\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0435\u0439 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439. \u0421\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0434\u0430\u0436\u0435 \u0432\u0430\u0448\u0430 \u0431\u0430\u0431\u0443\u0448\u043a\u0430 \u0441\u043b\u044b\u0448\u0430\u043b\u0430 \u043f\u0440\u043e Stable Diffusion \u0438\u043b\u0438 DALL-E, \u043d\u043e \u044d\u0442\u0438 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u0442 \u043e\u0434\u043d\u0430 \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u0430\u044f \u0434\u0435\u0442\u0430\u043b\u044c \u2014 \u043e\u043d\u0438 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u044b \u043d\u0430 \u043c\u0435\u0442\u043e\u0434\u0435 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0439 \u0434\u0438\u0444\u0444\u0443\u0437\u0438\u0438. \u042d\u0442\u043e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u0442\u0430\u043b \u0441\u0430\u043c\u044b\u043c \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u043c \u0432 2022 \u0433\u043e\u0434\u0443. \u041f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u043d\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0435\u0433\u043e \u043d\u0435 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a, \u0430 \u0434\u043b\u044f \u043c\u0443\u0437\u044b\u043a\u0438 \u0438\u043b\u0438 \u043f\u0435\u043d\u0438\u044f \u043f\u0442\u0438\u0446?<\/p>\n<p>  \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0430\u0443\u0434\u0438\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0434\u0438\u0444\u0444\u0443\u0437\u0438\u043e\u043d\u043d\u043e\u0439 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438, \u0438 \u043d\u044e\u0430\u043d\u0441\u0430\u0445 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430.<a name=\"habracut\"><\/a><\/p>\n<h2><font color=\"#3AC1EF\">\u258d \u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0437\u0432\u0443\u043a? \u041c\u0435\u043b-\u0441\u043f\u0435\u043a\u0442\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b<\/font><\/h2>\n<p>  \u0417\u0432\u0443\u043a \u2014 \u044d\u0442\u043e \u0432\u043e\u043b\u043d\u043e\u0432\u043e\u0435 \u044f\u0432\u043b\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u043e \u043c\u0435\u0445\u0430\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u043a\u043e\u043b\u0435\u0431\u0430\u043d\u0438\u044f\u043c\u0438 \u0432 \u0432\u043e\u0437\u0434\u0443\u0445\u0435, \u0436\u0438\u0434\u043a\u043e\u0441\u0442\u044f\u0445 \u0438\u043b\u0438 \u0442\u0432\u0451\u0440\u0434\u044b\u0445 \u0442\u0435\u043b\u0430\u0445. \u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u0441\u043b\u044b\u0448\u0438\u043c \u0437\u0432\u0443\u043a, \u043d\u0430\u0448\u0438 \u0443\u0448\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442 \u0441\u0438\u0433\u043d\u0430\u043b\u044b \u043d\u0430\u0448\u0435\u043c\u0443 \u043c\u043e\u0437\u0433\u0443 (\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u0440\u043e \u043c\u043e\u0437\u0433 \u0447\u0443\u0442\u044c \u043d\u0438\u0436\u0435), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u0443\u0435\u0442 \u044d\u0442\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u044b \u043a\u0430\u043a \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0437\u0432\u0443\u043a\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0433\u043e\u043b\u043e\u0441\u0430, \u043c\u0443\u0437\u044b\u043a\u0443 \u0438\u043b\u0438 \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0448\u0443\u043c\u044b. \u041d\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430\u0445 \u0437\u0432\u0443\u043a \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0435 \u043d\u0430\u0431\u043e\u0440\u0430 \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434, \u043c\u0435\u043d\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u0442\u044b\u0441\u044f\u0447\u0438 \u0440\u0430\u0437 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443. <\/p>\n<p>  \u0417\u0432\u0443\u043a \u0432 \u0432\u0438\u0434\u0435 \u043d\u0430\u0431\u043e\u0440\u0430 \u0430\u043c\u043f\u043b\u0438\u0442\u0443\u0434 \u043d\u0435\u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0432 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044f\u0445, \u0445\u043e\u0442\u044c \u0438 \u0434\u043b\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440 \u044d\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043d\u043e \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043c\u0435\u043b-\u0441\u043f\u0435\u043a\u0442\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b.<\/p>\n<p>  \u0421\u043f\u0435\u043a\u0442\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043c\u0435\u043b\u0430 \u2014 \u044d\u0442\u043e \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043f\u0435\u043a\u0442\u0440\u0430 \u0437\u0432\u0443\u043a\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0435\u043b\u043e\u0432\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430. \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0424\u0443\u0440\u044c\u0435 \u2014 \u044d\u0442\u043e \u0442\u0435\u0445\u043d\u0438\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0447\u0430\u0441\u0442\u043e\u0442\u043d\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u0430\u0432\u0430 \u0437\u0432\u0443\u043a\u0430. \u0421\u0442\u043e\u0438\u0442 \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u043d\u0430\u0448 \u0441\u043b\u0443\u0445\u043e\u0432\u043e\u0439 \u0430\u043f\u043f\u0430\u0440\u0430\u0442 \u0438 \u0435\u0441\u0442\u044c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0424\u0443\u0440\u044c\u0435, \u0438 \u043c\u043e\u0437\u0433 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0443\u0436\u0435 \u043d\u0435 \u0432\u043e\u043b\u043d\u044b, \u0430 \u0441\u043f\u0435\u043a\u0442\u0440. \u0412 \u0441\u043f\u0435\u043a\u0442\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u043c\u0435\u043b\u0430 \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u0441\u0438, \u0430 \u0447\u0430\u0441\u0442\u043e\u0442\u0430 \u2014 \u043d\u0430 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439. \u041a\u0430\u0436\u0434\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u043d\u0430 \u0441\u043f\u0435\u043a\u0442\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u043e\u0442\u0435 \u0437\u0432\u0443\u043a\u0430 \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/p>\n<p>  \u0424\u0440\u0430\u0437\u0430 \u00ab\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0432\u0443\u043a\u0430\u00bb \u044f\u0432\u043d\u043e \u043d\u0430\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u0442 \u043d\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0435\u0439 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0437\u0432\u0443\u043a\u0430. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0438\u0444\u0444\u0443\u0437\u0438\u044e \u0434\u043b\u044f \u0438\u0445 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438!<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/post_images\/ac5\/154\/cd4\/ac5154cd433d455510b256409c2a3edb.jpg\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/ac5\/154\/cd4\/ac5154cd433d455510b256409c2a3edb.jpg\" data-blurred=\"true\"\/><\/div>\n<h2><font color=\"#3AC1EF\">\u258d \u0414\u0438\u0444\u0444\u0443\u0437\u0438\u043e\u043d\u043d\u044b\u0435 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438<\/font><\/h2>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/5a3\/6bf\/b49\/5a36bfb497d4a7191d1f4c666d5ba2f2.png\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/5a3\/6bf\/b49\/5a36bfb497d4a7191d1f4c666d5ba2f2.png\"\/><\/div>\n<p>  \u042f \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u043b \u0440\u0430\u0431\u043e\u0442\u0443 \u0434\u0438\u0444\u0444\u0443\u0437\u0438\u043e\u043d\u043d\u044b\u0445 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0435\u0439 \u0432 \u044d\u0442\u043e\u0439 <a href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/689072\/\">\u0441\u0442\u0430\u0442\u044c\u0435<\/a>, \u043d\u043e \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u0430:<\/p>\n<blockquote><p>\u041d\u0430\u0443\u0447\u0438\u0442\u0435 \u043c\u043e\u0434\u0435\u043b\u044c \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0437\u0430\u0448\u0443\u043c\u043b\u0451\u043d\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u0438 \u043e\u043d\u0430 \u0441\u043c\u043e\u0436\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0438\u0437 \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u043e\u0433\u043e \u0448\u0443\u043c\u0430.<\/p><\/blockquote>\n<p>  \u041d\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u043b-\u0441\u043f\u0435\u043a\u0442\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043d\u0435 \u0442\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e. \u0414\u0438\u0444\u0444\u0443\u0437\u0438\u043e\u043d\u043d\u044b\u0435 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u0435\u0439 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430\u043c\u0438 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u2014 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0441\u043f\u0435\u043a\u0442\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0438\u0437 512 \u0445 512 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0432 64 \u0445 64 \u043f\u0438\u043a\u0441\u0435\u043b\u044f, \u0430 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438 \u0434\u043b\u044f \u0430\u043f\u0441\u043a\u0435\u0439\u043b\u0430 \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c.<\/p>\n<h2><font color=\"#3AC1EF\">\u258d \u0418\u0434\u0435\u044f<\/font><\/h2>\n<p>  \u0418\u0434\u0435\u044f \u043f\u0440\u043e\u0441\u0442\u0430 \u2014 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0441\u0436\u0430\u0442\u044b\u0435 \u0441\u043f\u0435\u043a\u0442\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u0430\u043a\u0438\u0445-\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0437\u0432\u0443\u043a\u043e\u0432, \u0442\u0438\u043f\u0430 \u043f\u0435\u043d\u0438\u044f \u043f\u0442\u0438\u0446.<\/p>\n<p>  \u041c\u044b \u043e\u0431\u0443\u0447\u0430\u0435\u043c \u0434\u0438\u0444\u0444\u0443\u0437\u0438\u043e\u043d\u043d\u0443\u044e \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c, \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u043f\u043e\u0434 \u0427\u0411, \u043d\u0430 \u043c\u0435\u043b-\u0441\u043f\u0435\u043a\u0442\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u0445 \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0438\u0445 \u0432 \u0437\u0432\u0443\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0413\u0440\u0438\u0444\u0444\u0438\u043d\u0430-\u041b\u0438\u043c\u0430.<\/p>\n<p>  \u042f \u0432\u0437\u044f\u043b \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0437\u0432\u0443\u043a\u043e\u0432 BBC, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043b \u0432 \u0441\u043f\u0435\u043a\u0442\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0438 \u0441\u0436\u0430\u043b \u0434\u043e 64 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439, \u0447\u0442\u043e\u0431\u044b \u0434\u0438\u0444\u0444\u0443\u0437\u0438\u043e\u043d\u043d\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043e\u0431\u0443\u0447\u0438\u0442\u044c \u043d\u0430 \u043c\u043e\u0435\u0439 Nvidia RTX 3060, \u0442. \u043a. \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f\u0445 \u043a\u043e\u043d\u0447\u0430\u043b\u0430\u0441\u044c \u043f\u0430\u043c\u044f\u0442\u044c. \u041a\u043e\u0434 \u0434\u0438\u0444\u0444\u0443\u0437\u0438\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0435\u0439 <a href=\"https:\/\/github.com\/dome272\/Diffusion-Models-pytorch\">Diffusion-Models-pytorch<\/a>, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0434\u0435\u043b\u0430\u043b \u044f \u0441 OxDEADFACE. \u0422\u0430\u043a\u0436\u0435 \u0437\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u0441\u043f\u0430\u0441\u0438\u0431\u043e Cene655.<\/p>\n<p>  \u0412\u043e\u0442 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u043c\u043e\u0434\u0435\u043b\u0438:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/post_images\/8b5\/ca4\/947\/8b5ca4947d112a324e8fd10ce3e86461.jpg\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/8b5\/ca4\/947\/8b5ca4947d112a324e8fd10ce3e86461.jpg\" data-blurred=\"true\"\/><\/div>\n<h2><font color=\"#3AC1EF\">\u258d \u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445<\/font><\/h2>\n<p>  1. \u041d\u0430\u0440\u0435\u0437\u043a\u0430 \u0434\u043e\u0440\u043e\u0436\u0435\u043a \u0430\u0443\u0434\u0438\u043e \u043d\u0430 \u043e\u0442\u0440\u0435\u0437\u043a\u0438 \u043f\u043e 5 \u0441\u0435\u043a\u0443\u043d\u0434. \u0414\u043b\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0437\u0432\u0443\u043a\u0430 \u0432 \u0441\u043f\u0435\u043a\u0442\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0430\u0443\u0434\u0438\u043e \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0441\u0442\u0440\u043e\u0433\u043e \u043f\u043e 5 \u0441\u0435\u043a\u0443\u043d\u0434 \u043a\u0430\u0436\u0434\u043e\u0435.<\/p>\n<p>  \u0414\u043b\u044f \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u043c\u043d\u043e\u0439 \u0431\u044b\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u044d\u0442\u043e\u0442 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"python\">import os input_filename = \"\/content\/bird.mp3\" output_folder = \"output\"   if not os.path.exists(output_folder):     os.makedirs(output_folder)   command = f\"ffmpeg -i {input_filename} -f segment -segment_time 5 {output_folder}\/11out%03d.wav\" os.system(command)<\/code><\/pre>\n<p>  \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u043c\u043e\u0451\u043c <a href=\"https:\/\/colab.research.google.com\/drive\/1g9wgBMYrnGtXgnh66jcvwGYNiatHQ9-q?usp=sharing\">\u0431\u043b\u043e\u043a\u043d\u043e\u0442\u0435 Colab<\/a>.<\/p>\n<p>  2. \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0430\u0443\u0434\u0438\u043e\u0444\u0430\u0439\u043b\u043e\u0432 \u0432 \u0441\u043f\u0435\u043a\u0442\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b<\/p>\n<p>  \u041d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u043e \u0441\u043f\u0435\u043a\u0442\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u043c\u0438, \u0438 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430 \u043d\u0430\u0448\u0438 \u0430\u0443\u0434\u0438\u043e\u0444\u0430\u0439\u043b\u044b \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043d\u0438\u0445. \u041c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043a\u043e\u0434 \u0438\u0437 <a href=\"https:\/\/github.com\/chavinlo\/riffusion-manipulation\">Riffusion Manipulation<\/a>.<\/p>\n<p>  \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u0432\u043e\u0442 \u044d\u0442\u043e\u0442 <a href=\"https:\/\/colab.research.google.com\/drive\/1-REue4KpDhOMDI-v6gRytMpANoMUqFvi?usp=sharing\">\u0431\u043b\u043e\u043a\u043d\u043e\u0442 colab<\/a>, \u0432 4-\u0439 \u044f\u0447\u0435\u0439\u043a\u0435 \u0435\u0441\u0442\u044c \u043c\u0430\u0441\u0441\u043e\u0432\u0430\u044f \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u044f \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0438\u0437 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u043f\u0430\u043f\u043a\u0438.<\/p>\n<p>  3. \u0421\u0436\u0430\u0442\u0438\u0435 \u0441\u043f\u0435\u043a\u0442\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u0434\u043e 64 \u0445 64 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439.<\/p>\n<p>  \u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0430\u043c\u044b\u043c \u043e\u0431\u044b\u0447\u043d\u044b\u043c \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c, \u0447\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0441\u043a\u043e\u0440\u044f\u0435\u0442 \u043d\u0430\u0448\u0443 \u043c\u043e\u0434\u0435\u043b\u044c.<\/p>\n<pre><code class=\"python\">import os from PIL import Image   # \u0418\u043c\u044f \u043f\u0430\u043f\u043a\u0438 \u0441 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438 input_folder = 'input'   # \u0418\u043c\u044f \u043f\u0430\u043f\u043a\u0438 \u0434\u043b\u044f \u0441\u0436\u0430\u0442\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 output_folder = 'output'   # \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043f\u0430\u043f\u043a\u0443 \u0434\u043b\u044f \u0441\u0436\u0430\u0442\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u0435\u0441\u043b\u0438 \u043e\u043d\u0430 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 if not os.path.exists(output_folder):     os.makedirs(output_folder)   # \u041f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u0441\u0435 \u0444\u0430\u0439\u043b\u044b \u0432 \u043f\u0430\u043f\u043a\u0435 \u0441 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438 for file in os.listdir(input_folder):      # \u0418\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u043c \u0444\u0430\u0439\u043b\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438     if not file.endswith('.jpg') and not file.endswith('.png'):         continue       # \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435     image = Image.open(os.path.join(input_folder, file))       # \u0421\u0436\u0438\u043c\u0430\u0435\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0434\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 64 x 64 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439     image = image.resize((64, 64))       # \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0441\u0436\u0430\u0442\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432 \u043f\u0430\u043f\u043a\u0443 output     image.save(os.path.join(output_folder, file))<\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0442\u0430\u0441\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0433\u043e\u0442\u043e\u0432 \u043a \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044e.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/post_images\/f42\/0aa\/8a3\/f420aa8a3c6b85b0b75fa3497c1dc9bf.png\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/f42\/0aa\/8a3\/f420aa8a3c6b85b0b75fa3497c1dc9bf.png\"\/><\/div>\n<h2><font color=\"#3AC1EF\">\u258d \u041a\u043e\u0434 \u043c\u043e\u0434\u0435\u043b\u0438<\/font><\/h2>\n<p>  \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0444\u0430\u0439\u043b ddpm, \u0433\u0434\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0432\u0441\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043c\u043e\u0434\u0435\u043b\u0438 \u0438 \u0435\u0451 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041a\u043e\u0434<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"python\">import os import torch import torch.nn as nn from matplotlib import pyplot as plt from tqdm import tqdm from torch import optim from utils import * from modules import UNet import logging from torch.utils.tensorboard import SummaryWriter  logging.basicConfig(format=\"%(asctime)s - %(levelname)s: %(message)s\", level=logging.INFO, datefmt=\"%I:%M:%S\")   class Diffusion:     def __init__(self, noise_steps=1000, beta_start=1e-4, beta_end=0.02, img_size=64, device=\"cuda\"):         self.noise_steps = noise_steps         self.beta_start = beta_start         self.beta_end = beta_end         self.img_size = img_size         self.device = device          self.beta = self.prepare_noise_schedule().to(device)         self.alpha = 1. - self.beta         self.alpha_hat = torch.cumprod(self.alpha, dim=0)      def prepare_noise_schedule(self):         return torch.linspace(self.beta_start, self.beta_end, self.noise_steps)      def noise_images(self, x, t):         sqrt_alpha_hat = torch.sqrt(self.alpha_hat[t])[:, None, None, None]         sqrt_one_minus_alpha_hat = torch.sqrt(1 - self.alpha_hat[t])[:, None, None, None]         \u0190 = torch.randn_like(x)         return sqrt_alpha_hat * x + sqrt_one_minus_alpha_hat * \u0190, \u0190      def sample_timesteps(self, n):         return torch.randint(low=1, high=self.noise_steps, size=(n,))      def sample(self, model, n):         logging.info(f\"Sampling {n} new images....\")         model.eval()         with torch.no_grad():             x = torch.randn((n, 1, self.img_size, self.img_size)).to(self.device)             for i in tqdm(reversed(range(1, self.noise_steps)), position=0):                 t = (torch.ones(n) * i).long().to(self.device)                 predicted_noise = model(x, t)                 alpha = self.alpha[t][:, None, None, None]                 alpha_hat = self.alpha_hat[t][:, None, None, None]                 beta = self.beta[t][:, None, None, None]                 if i > 1:                     noise = torch.randn_like(x)                 else:                     noise = torch.zeros_like(x)                 x = 1 \/ torch.sqrt(alpha) * (x - ((1 - alpha) \/ (torch.sqrt(1 - alpha_hat))) * predicted_noise) + torch.sqrt(beta) * noise         model.train()         x = (x.clamp(-1, 1) + 1) \/ 2         x = (x * 255).type(torch.uint8)         return x   def train(args):     setup_logging(args.run_name)     device = args.device     dataloader = get_data(args)     model = UNet().to(device)     optimizer = optim.AdamW(model.parameters(), lr=args.lr)     mse = nn.MSELoss()     diffusion = Diffusion(img_size=args.image_size, device=device)     logger = SummaryWriter(os.path.join(\"runs\",  ))     l = len(dataloader)      for epoch in range(args.epochs):         logging.info(f\"Starting epoch {epoch}:\")         pbar = tqdm(dataloader)         for i, (images, _) in enumerate(pbar):             images = images.to(device)             t = diffusion.sample_timesteps(images.shape[0]).to(device)             x_t, noise = diffusion.noise_images(images, t)             predicted_noise = model(x_t, t)             loss = mse(noise, predicted_noise)              optimizer.zero_grad()             loss.backward()             optimizer.step()              pbar.set_postfix(MSE=loss.item())             logger.add_scalar(\"MSE\", loss.item(), global_step=epoch * l + i)          sampled_images = diffusion.sample(model, n=images.shape[0])         save_images(sampled_images, os.path.join(\"results\", args.run_name, f\"{epoch}.jpg\"))         torch.save(model.state_dict(), os.path.join(\"models\", args.run_name, f\"ckpt.pt\"))   def launch():     import argparse     parser = argparse.ArgumentParser()     args = parser.parse_args()     args.run_name = \"DDPM_Uncondtional\"     args.epochs = 500     args.batch_size = 8     args.image_size = 64     args.dataset_path = r\"D:\\AudioDatasets\\Songs64\"     args.device = \"cuda\"     args.lr = 3e-4     train(args)   if __name__ == '__main__':     launch()<\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u043d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430 \u0432 \u043c\u043e\u0434\u0435\u043b\u044c utils.py.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041a\u043e\u0434<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"python\">import os import torch import torchvision from PIL import Image from matplotlib import pyplot as plt from torch.utils.data import DataLoader   def plot_images(images):     plt.figure(figsize=(32, 32))     plt.imshow(torch.cat([         torch.cat([i for i in images.cpu()], dim=-1),     ], dim=-2).permute(1, 2, 0).cpu())     plt.show()   def save_images(images, path, **kwargs):     grid = torchvision.utils.make_grid(images, **kwargs)     ndarr = grid.permute(1, 2, 0).to('cpu').numpy()     im = Image.fromarray(ndarr)     im.save(path)   def get_data(args):     transforms = torchvision.transforms.Compose([         torchvision.transforms.ToTensor(),         torchvision.transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)),         torchvision.transforms.Grayscale(num_output_channels=1)     ])     dataset = torchvision.datasets.ImageFolder(args.dataset_path, transform=transforms)     dataloader = DataLoader(dataset, batch_size=args.batch_size, shuffle=True)     return dataloader   def setup_logging(run_name):     os.makedirs(\"models\", exist_ok=True)     os.makedirs(\"results\", exist_ok=True)     os.makedirs(os.path.join(\"models\", run_name), exist_ok=True)     os.makedirs(os.path.join(\"results\", run_name), exist_ok=True)<\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0418 \u0441\u0430\u043c\u044b\u043c \u0433\u043b\u0430\u0432\u043d\u044b\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f modules.py, \u0433\u0434\u0435 \u043c\u044b \u0437\u0430\u0434\u0430\u0451\u043c Unet.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041a\u043e\u0434<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"python\">import torch import torch.nn as nn import torch.nn.functional as F   class EMA:     def __init__(self, beta):         super().__init__()         self.beta = beta         self.step = 0      def update_model_average(self, ma_model, current_model):         for current_params, ma_params in zip(current_model.parameters(), ma_model.parameters()):             old_weight, up_weight = ma_params.data, current_params.data             ma_params.data = self.update_average(old_weight, up_weight)      def update_average(self, old, new):         if old is None:             return new         return old * self.beta + (1 - self.beta) * new      def step_ema(self, ema_model, model, step_start_ema=2000):         if self.step &lt; step_start_ema:             self.reset_parameters(ema_model, model)             self.step += 1             return         self.update_model_average(ema_model, model)         self.step += 1      def reset_parameters(self, ema_model, model):         ema_model.load_state_dict(model.state_dict())   class SelfAttention(nn.Module):     def __init__(self, channels, size):         super(SelfAttention, self).__init__()         self.channels = channels         self.size = size         self.mha = nn.MultiheadAttention(channels, 4, batch_first=True)         self.ln = nn.LayerNorm([channels])         self.ff_self = nn.Sequential(             nn.LayerNorm([channels]),             nn.Linear(channels, channels),             nn.GELU(),             nn.Linear(channels, channels),         )      def forward(self, x):         x = x.view(-1, self.channels, self.size * self.size).swapaxes(1, 2)         x_ln = self.ln(x)         attention_value, _ = self.mha(x_ln, x_ln, x_ln)         attention_value = attention_value + x         attention_value = self.ff_self(attention_value) + attention_value         return attention_value.swapaxes(2, 1).view(-1, self.channels, self.size, self.size)   class DoubleConv(nn.Module):     def __init__(self, in_channels, out_channels, mid_channels=None, residual=False):         super().__init__()         self.residual = residual         if not mid_channels:             mid_channels = out_channels         self.double_conv = nn.Sequential(             nn.Conv2d(in_channels, mid_channels, kernel_size=3, padding=1, bias=False),             nn.GroupNorm(1, mid_channels),             nn.GELU(),             nn.Conv2d(mid_channels, out_channels, kernel_size=3, padding=1, bias=False),             nn.GroupNorm(1, out_channels),         )      def forward(self, x):         if self.residual:             return F.gelu(x + self.double_conv(x))         else:             return self.double_conv(x)   class Down(nn.Module):     def __init__(self, in_channels, out_channels, emb_dim=256):         super().__init__()         self.maxpool_conv = nn.Sequential(             nn.MaxPool2d(2),             DoubleConv(in_channels, in_channels, residual=True),             DoubleConv(in_channels, out_channels),         )          self.emb_layer = nn.Sequential(             nn.SiLU(),             nn.Linear(                 emb_dim,                 out_channels             ),         )      def forward(self, x, t):         x = self.maxpool_conv(x)         emb = self.emb_layer(t)[:, :, None, None].repeat(1, 1, x.shape[-2], x.shape[-1])         return x + emb   class Up(nn.Module):     def __init__(self, in_channels, out_channels, emb_dim=256):         super().__init__()          self.up = nn.Upsample(scale_factor=2, mode=\"bilinear\", align_corners=True)         self.conv = nn.Sequential(             DoubleConv(in_channels, in_channels, residual=True),             DoubleConv(in_channels, out_channels, in_channels \/\/ 2),         )          self.emb_layer = nn.Sequential(             nn.SiLU(),             nn.Linear(                 emb_dim,                 out_channels             ),         )      def forward(self, x, skip_x, t):         x = self.up(x)         x = torch.cat([skip_x, x], dim=1)         x = self.conv(x)         emb = self.emb_layer(t)[:, :, None, None].repeat(1, 1, x.shape[-2], x.shape[-1])         return x + emb   class UNet(nn.Module):     def __init__(self, c_in=1, c_out=1, time_dim=256, device=\"cuda\"):         super().__init__()         self.device = device         self.time_dim = time_dim         self.inc = DoubleConv(c_in, 64)         self.down1 = Down(64, 128)         self.sa1 = SelfAttention(128, 32)         self.down2 = Down(128, 256)         self.sa2 = SelfAttention(256, 16)         self.down3 = Down(256, 256)         self.sa3 = SelfAttention(256, 8)          self.bot1 = DoubleConv(256, 512)         self.bot2 = DoubleConv(512, 512)         self.bot3 = DoubleConv(512, 256)          self.up1 = Up(512, 128)         self.sa4 = SelfAttention(128, 16)         self.up2 = Up(256, 64)         self.sa5 = SelfAttention(64, 32)         self.up3 = Up(128, 64)         self.sa6 = SelfAttention(64, 64)         self.outc = nn.Conv2d(64, c_out, kernel_size=1)      def pos_encoding(self, t, channels):         inv_freq = 1.0 \/ (             10000             ** (torch.arange(0, channels, 2, device=self.device).float() \/ channels)         )         pos_enc_a = torch.sin(t.repeat(1, channels \/\/ 2) * inv_freq)         pos_enc_b = torch.cos(t.repeat(1, channels \/\/ 2) * inv_freq)         pos_enc = torch.cat([pos_enc_a, pos_enc_b], dim=-1)         return pos_enc      def forward(self, x, t):         t = t.unsqueeze(-1).type(torch.float)         t = self.pos_encoding(t, self.time_dim)          x1 = self.inc(x)         x2 = self.down1(x1, t)         x2 = self.sa1(x2)         x3 = self.down2(x2, t)         x3 = self.sa2(x3)         x4 = self.down3(x3, t)         x4 = self.sa3(x4)          x4 = self.bot1(x4)         x4 = self.bot2(x4)         x4 = self.bot3(x4)          x = self.up1(x4, x3, t)         x = self.sa4(x)         x = self.up2(x, x2, t)         x = self.sa5(x)         x = self.up3(x, x1, t)         x = self.sa6(x)         output = self.outc(x)         return output   class UNet_conditional(nn.Module):     def __init__(self, c_in=1, c_out=1, time_dim=256, num_classes=None, device=\"cuda\"):         super().__init__()         self.device = device         self.time_dim = time_dim         self.inc = DoubleConv(c_in, 64)         self.down1 = Down(64, 128)         self.sa1 = SelfAttention(128, 32)         self.down2 = Down(128, 256)         self.sa2 = SelfAttention(256, 16)         self.down3 = Down(256, 256)         self.sa3 = SelfAttention(256, 8)          self.bot1 = DoubleConv(256, 512)         self.bot2 = DoubleConv(512, 512)         self.bot3 = DoubleConv(512, 256)          self.up1 = Up(512, 128)         self.sa4 = SelfAttention(128, 16)         self.up2 = Up(256, 64)         self.sa5 = SelfAttention(64, 32)         self.up3 = Up(128, 64)         self.sa6 = SelfAttention(64, 64)         self.outc = nn.Conv2d(64, c_out, kernel_size=1)          if num_classes is not None:             self.label_emb = nn.Embedding(num_classes, time_dim)      def pos_encoding(self, t, channels):         inv_freq = 1.0 \/ (             10000             ** (torch.arange(0, channels, 2, device=self.device).float() \/ channels)         )         pos_enc_a = torch.sin(t.repeat(1, channels \/\/ 2) * inv_freq)         pos_enc_b = torch.cos(t.repeat(1, channels \/\/ 2) * inv_freq)         pos_enc = torch.cat([pos_enc_a, pos_enc_b], dim=-1)         return pos_enc      def forward(self, x, t, y):         t = t.unsqueeze(-1).type(torch.float)         t = self.pos_encoding(t, self.time_dim)          if y is not None:             t += self.label_emb(y)          x1 = self.inc(x)         x2 = self.down1(x1, t)         x2 = self.sa1(x2)         x3 = self.down2(x2, t)         x3 = self.sa2(x3)         x4 = self.down3(x3, t)         x4 = self.sa3(x4)          x4 = self.bot1(x4)         x4 = self.bot2(x4)         x4 = self.bot3(x4)          x = self.up1(x4, x3, t)         x = self.sa4(x)         x = self.up2(x, x2, t)         x = self.sa5(x)         x = self.up3(x, x1, t)         x = self.sa6(x)         output = self.outc(x)         return output<\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0412\u043e\u0442 \u0438 \u0432\u0441\u044f \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c. \u041f\u043e\u0441\u043b\u0435 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0438\u043d\u0444\u0435\u0440\u0435\u043d\u0441\u0430 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0435\u0433\u043a\u0430 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 ddpm. inferddpm.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041a\u043e\u0434<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"python\">import os import torch import torch.nn as nn from matplotlib import pyplot as plt from tqdm import tqdm from torch import optim from utils import * from modules import UNet import logging from torch.utils.tensorboard import SummaryWriter  logging.basicConfig(format=\"%(asctime)s - %(levelname)s: %(message)s\", level=logging.INFO, datefmt=\"%I:%M:%S\")   class Diffusion:     def __init__(self, noise_steps=1000, beta_start=1e-4, beta_end=0.02, img_size=64, device=\"cuda\"):         self.noise_steps = noise_steps         self.beta_start = beta_start         self.beta_end = beta_end         self.img_size = img_size         self.device = device          self.beta = self.prepare_noise_schedule().to(device)         self.alpha = 1. - self.beta         self.alpha_hat = torch.cumprod(self.alpha, dim=0)      def prepare_noise_schedule(self):         return torch.linspace(self.beta_start, self.beta_end, self.noise_steps)      def noise_images(self, x, t):         sqrt_alpha_hat = torch.sqrt(self.alpha_hat[t])[:, None, None, None]         sqrt_one_minus_alpha_hat = torch.sqrt(1 - self.alpha_hat[t])[:, None, None, None]         \u0190 = torch.randn_like(x)         return sqrt_alpha_hat * x + sqrt_one_minus_alpha_hat * \u0190, \u0190      def sample_timesteps(self, n):         return torch.randint(low=1, high=self.noise_steps, size=(n,))      def sample(self, model, n):         logging.info(f\"Sampling {n} new images....\")         model.eval()         with torch.no_grad():             x = torch.randn((n, 1, self.img_size, self.img_size)).to(self.device)             for i in tqdm(reversed(range(1, self.noise_steps)), position=0):                 t = (torch.ones(n) * i).long().to(self.device)                 predicted_noise = model(x, t)                 alpha = self.alpha[t][:, None, None, None]                 alpha_hat = self.alpha_hat[t][:, None, None, None]                 beta = self.beta[t][:, None, None, None]                 if i > 1:                     noise = torch.randn_like(x)                 else:                     noise = torch.zeros_like(x)                 x = 1 \/ torch.sqrt(alpha) * (x - ((1 - alpha) \/ (torch.sqrt(1 - alpha_hat))) * predicted_noise) + torch.sqrt(beta) * noise         model.train()         print(f'{torch.min(x):.2f} {torch.mean(x):.2f} {torch.max(x):.2f} {x.shape}')         # x = (x.clamp(-1, 1) + 1) \/ 2         print(f'{torch.min(x):.2f} {torch.mean(x):.2f} {torch.max(x):.2f} {x.shape}')         x = -x         # x = x - torch.min(x)         x = x - torch.mean(x)         print(f'{torch.min(x):.2f} {torch.max(x):.2f} {x.shape}')         x = x.clamp(0, torch.inf) \/ torch.max(x)         print(f'{torch.min(x):.2f} {torch.max(x):.2f} {x.shape}')         x = (x * 255).type(torch.uint8)         print(f'{torch.min(x):.2f} {torch.max(x):.2f} {x.shape}')         return x   def train(args):     setup_logging(args.run_name)     device = args.device     dataloader = get_data(args)     model = UNet().to(device)     optimizer = optim.AdamW(model.parameters(), lr=args.lr)     mse = nn.MSELoss()     diffusion = Diffusion(img_size=args.image_size, device=device)     logger = SummaryWriter(os.path.join(\"runs\",  ))     l = len(dataloader)      for epoch in range(args.epochs):         logging.info(f\"Starting epoch {epoch}:\")         pbar = tqdm(dataloader)         for i, (images, _) in enumerate(pbar):             images = images.to(device)             t = diffusion.sample_timesteps(images.shape[0]).to(device)             x_t, noise = diffusion.noise_images(images, t)             predicted_noise = model(x_t, t)             loss = mse(noise, predicted_noise)              optimizer.zero_grad()             loss.backward()             optimizer.step()              pbar.set_postfix(MSE=loss.item())             logger.add_scalar(\"MSE\", loss.item(), global_step=epoch * l + i)          sampled_images = diffusion.sample(model, n=images.shape[0])         save_images(sampled_images, os.path.join(\"results\", args.run_name, f\"{epoch}.jpg\"))         torch.save(model.state_dict(), os.path.join(\"models\", args.run_name, f\"ckpt.pt\"))  def infer(args):     setup_logging(args.run_name)     device = args.device     model = UNet().to(device)     diffusion = Diffusion(img_size=args.image_size, device=device)      checkpoint = torch.load('D:\\Python\\VS code\\Diff\\models\\DDPM_Uncondtional_bird\\ckpt.pt')     model.load_state_dict(checkpoint)      model.eval()     sampled_images = diffusion.sample(model, n=1)     save_images(sampled_images, os.path.join(\"results\", f\"tes47t.jpg\"))  def launch():     import argparse     parser = argparse.ArgumentParser()     args = parser.parse_args()     args.run_name = \"DDPM_Uncondtional\"     args.epochs = 500     args.batch_size = 8     args.image_size = 64     args.dataset_path = r\"D:\\AudioDatasets\\Songs64\"     args.device = \"cuda\"     #args.lr = 3e-4     args.lr = 0.00015     infer(args)   if __name__ == '__main__':     launch()<\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0438\u043d\u0444\u0435\u0440\u0435\u043d\u0441\u0430 \u043e\u0442\u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043e 512 \u0445 512 \u043c\u043e\u0436\u043d\u043e \u0442\u0430\u043a.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041a\u043e\u0434<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"python\">import os from PIL import Image   # \u0418\u043c\u044f \u043f\u0430\u043f\u043a\u0438 \u0441 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438 input_folder = 'input'   # \u0418\u043c\u044f \u043f\u0430\u043f\u043a\u0438 \u0434\u043b\u044f \u0441\u0436\u0430\u0442\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 output_folder = 'output'   # \u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043f\u0430\u043f\u043a\u0443 \u0434\u043b\u044f \u0441\u0436\u0430\u0442\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u0435\u0441\u043b\u0438 \u043e\u043d\u0430 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 if not os.path.exists(output_folder):     os.makedirs(output_folder)   # \u041f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u0441\u0435 \u0444\u0430\u0439\u043b\u044b \u0432 \u043f\u0430\u043f\u043a\u0435 \u0441 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438 for file in os.listdir(input_folder):     # \u0418\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u043c \u0444\u0430\u0439\u043b\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438     if not file.endswith('.jpg') and not file.endswith('.png'):         continue       # \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435     image = Image.open(os.path.join(input_folder, file))       # \u0421\u0436\u0438\u043c\u0430\u0435\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0434\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 512 x 512 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439     image = image.resize((512, 512))       # \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0441\u0436\u0430\u0442\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432 \u043f\u0430\u043f\u043a\u0443 output     image.save(os.path.join(output_folder, file))<\/code><\/pre>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u041d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0435\u0439 \u0434\u043b\u044f \u0430\u043f\u0441\u043a\u0435\u0439\u043b\u0430, \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 Real-ESRGAN, \u0434\u0430\u0441\u0442 \u043c\u0435\u043d\u0435\u0435 \u0448\u0443\u043c\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.<\/p>\n<p>  \u041d\u0443 \u0438 \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u043e\u0434\u0438\u043d \u0448\u0430\u0433 \u2014 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043c\u0435\u043b-\u0441\u043f\u0435\u043a\u0442\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0432 \u0430\u0443\u0434\u0438\u043e\u0444\u0430\u0439\u043b. \u041a\u043e\u0434 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043f\u0435\u043a\u0442\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0432 \u0430\u0443\u0434\u0438\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u0431\u043b\u043e\u043a\u0435 \u0432 \u044d\u0442\u043e\u043c <a href=\"https:\/\/colab.research.google.com\/drive\/1-REue4KpDhOMDI-v6gRytMpANoMUqFvi?usp=sharing\">\u043a\u043e\u043b\u0430\u0431\u0435<\/a>.<\/p>\n<h2><font color=\"#3AC1EF\">\u258d \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b<\/font><\/h2>\n<p>  \u041c\u043e\u0434\u0435\u043b\u044c \u0443\u0447\u0438\u0442\u0441\u044f \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u043e \u043d\u0430 \u0442\u0430\u043a\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0439\u0442\u0438 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434. \u041d\u043e \u043f\u0440\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0445\u043e\u0440\u043e\u0448\u0435\u043c \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u0435\u043f\u043b\u043e\u0445\u0438\u0435 \u0430\u0443\u0434\u0438\u043e\u0434\u043e\u0440\u043e\u0436\u043a\u0438. \u0412\u043e\u0442 <a href=\"https:\/\/soundcloud.com\/nikuson\/bird?si=eff36be56bcf4a2d90e917282cf862de&amp;utm_source=clipboard&amp;utm_medium=text&amp;utm_campaign=social_sharing\">\u044d\u0442\u043e<\/a> \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043f\u0435\u043d\u0438\u0435 \u043f\u0442\u0438\u0446\u044b.<\/p>\n<p>  \u0412 \u0446\u0435\u043b\u043e\u043c \u0438\u0437-\u0437\u0430 \u043f\u043b\u043e\u0445\u043e\u0439 \u0441\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043c\u043e\u0434\u0435\u043b\u0438 \u044f \u0431\u044b \u043d\u0435 \u043d\u0430\u0437\u0432\u0430\u043b \u044d\u0442\u043e \u043b\u0443\u0447\u0448\u0438\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u043c \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0430\u0443\u0434\u0438\u043e, \u043d\u043e \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442 \u0438 \u0435\u0433\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c\u0438. \u0412\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u043e \u0442\u0435\u043c\u0435 \u044f \u043f\u043e\u043a\u0430\u0436\u0443 \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0430\u0443\u0434\u0438\u043e, \u0442\u0435\u043f\u0435\u0440\u044c \u0443\u0436\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 \u0441 \u043b\u0430\u0442\u0435\u043d\u0442\u043d\u043e\u0439 \u0434\u0438\u0444\u0444\u0443\u0437\u0438\u0435\u0439.<\/p>\n<p>  <a href=\"http:\/\/ruvds.com\/ru-rub?utm_source=habr&amp;utm_medium=article&amp;utm_campaign=Nikuson&amp;utm_content=generaciya_audio_diffuzionnoj_nejrosetyu._stoit_li_ispolzovat_obychnuyu_diffuziyu_dlya_generacii_mel-spektrogramm?\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/ym\/oc\/6_\/ymoc6_v0doy8yrm1y4xsrjlxotc.jpeg\" data-src=\"https:\/\/habrastorage.org\/webt\/ym\/oc\/6_\/ymoc6_v0doy8yrm1y4xsrjlxotc.jpeg\" data-blurred=\"true\"\/><\/a><\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \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\/articles\/708182\/\"> https:\/\/habr.com\/ru\/articles\/708182\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\"><a href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/708182\/\"><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/post_images\/333\/a90\/a33\/333a90a33155b1e501ed2e45a97de7fe.jpg\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/333\/a90\/a33\/333a90a33155b1e501ed2e45a97de7fe.jpg\" data-blurred=\"true\"\/><\/div>\n<p><\/a><br \/>  \u0412 \u0443\u0445\u043e\u0434\u044f\u0449\u0435\u043c \u0433\u043e\u0434\u0443 \u0432\u044b \u043c\u043e\u0433\u043b\u0438 \u0432\u0438\u0434\u0435\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0435\u0439 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439. \u0421\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0434\u0430\u0436\u0435 \u0432\u0430\u0448\u0430 \u0431\u0430\u0431\u0443\u0448\u043a\u0430 \u0441\u043b\u044b\u0448\u0430\u043b\u0430 \u043f\u0440\u043e Stable Diffusion \u0438\u043b\u0438 DALL-E, \u043d\u043e \u044d\u0442\u0438 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u0442 \u043e\u0434\u043d\u0430 \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u0430\u044f \u0434\u0435\u0442\u0430\u043b\u044c \u2014 \u043e\u043d\u0438 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u044b \u043d\u0430 \u043c\u0435\u0442\u043e\u0434\u0435 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0439 \u0434\u0438\u0444\u0444\u0443\u0437\u0438\u0438. \u042d\u0442\u043e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u0442\u0430\u043b \u0441\u0430\u043c\u044b\u043c \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u043c \u0432 2022 \u0433\u043e\u0434\u0443. \u041f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u043d\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0435\u0433\u043e \u043d\u0435 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a, \u0430 \u0434\u043b\u044f \u043c\u0443\u0437\u044b\u043a\u0438 \u0438\u043b\u0438 \u043f\u0435\u043d\u0438\u044f \u043f\u0442\u0438\u0446?<\/p>\n<p>  \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0430\u0443\u0434\u0438\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0434\u0438\u0444\u0444\u0443\u0437\u0438\u043e\u043d\u043d\u043e\u0439 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438, \u0438 \u043d\u044e\u0430\u043d\u0441\u0430\u0445 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430.<\/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-389315","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/389315","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=389315"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/389315\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=389315"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=389315"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=389315"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}