{"id":346532,"date":"2023-03-09T21:01:26","date_gmt":"2023-03-09T21:01:26","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=346532"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=346532","title":{"rendered":"<span>\u041f\u0438\u0448\u0435\u043c \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u0434\u043b\u044f \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0441\u043d\u0438\u043c\u043a\u043e\u0432 \u0441\u043e \u0441\u043f\u0443\u0442\u043d\u0438\u043a\u0430<\/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-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u043e\u0447\u0438\u0442\u0430\u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 \u043f\u043e \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0441\u043f\u0443\u0442\u043d\u0438\u043a\u043e\u0432\u044b\u0445 \u0441\u043d\u0438\u043c\u043a\u043e\u0432 \u0437\u0435\u043c\u043b\u0438, \u044f \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438 \u043e\u0431\u0443\u0447\u0438\u0442\u044c \u0441\u0432\u043e\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438 \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438. \u0418 \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u043b\u043e \u043c\u043d\u043e\u0433\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432, \u0441\u0432\u043e\u0438\u043c\u0438 \u043e\u0442\u0432\u0435\u0442\u0430\u043c\u0438 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u044d\u0442\u043e\u0433\u043e \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u0430. \u041f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0442\u0430\u043a \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0438 \u043f\u0440\u043e\u0441\u0442\u043e, \u043a\u0430\u043a \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0442\u0430\u043a\u0438\u043c \u043d\u043e\u0432\u0438\u0447\u043a\u0430\u043c, \u043a\u0430\u043a \u044f.<\/p>\n<ol>\n<li>\n<p><a href=\"#idea\" rel=\"noopener noreferrer nofollow\">\u0418\u0434\u0435\u044f<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#imports\" rel=\"noopener noreferrer nofollow\">\u0418\u043c\u043f\u043e\u0440\u0442\u044b<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#dataset\" rel=\"noopener noreferrer nofollow\">\u0414\u0430\u0442\u0430\u0441\u0435\u0442<\/a><\/p>\n<ol>\n<li>\n<p><a href=\"#dataset_download\" rel=\"noopener noreferrer nofollow\">\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#dataset_organization\" rel=\"noopener noreferrer nofollow\">\u041e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#support_functions_and_dataset_class\" rel=\"noopener noreferrer nofollow\">\u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u043a\u043b\u0430\u0441\u0441 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430<\/a><\/p>\n<\/li>\n<\/ol>\n<\/li>\n<li>\n<p><a href=\"#model\" rel=\"noopener noreferrer nofollow\">\u041c\u043e\u0434\u0435\u043b\u044c<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#training_and_testing_model\" rel=\"noopener noreferrer nofollow\">\u041e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438<\/a><\/p>\n<ol>\n<li>\n<p><a href=\"#metrics\" rel=\"noopener noreferrer nofollow\">\u041c\u0435\u0442\u0440\u0438\u043a\u0438<\/a><\/p>\n<ol>\n<li>\n<p><a href=\"#metrics_pixel_accuracy\" rel=\"noopener noreferrer nofollow\">Pixel Accuracy<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#metrics_iou\" rel=\"noopener noreferrer nofollow\">IoU<\/a><\/p>\n<\/li>\n<\/ol>\n<\/li>\n<li>\n<p><a href=\"#training\" rel=\"noopener noreferrer nofollow\">\u041e\u0431\u0443\u0447\u0435\u043d\u0438\u0435<\/a><\/p>\n<ol>\n<li>\n<p><a href=\"#training_research\" rel=\"noopener noreferrer nofollow\">\u0418\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#save_model\" rel=\"noopener noreferrer nofollow\">\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438<\/a><\/p>\n<\/li>\n<\/ol>\n<\/li>\n<li>\n<p><a href=\"#testing\" rel=\"noopener noreferrer nofollow\">\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/a><\/p>\n<\/li>\n<\/ol>\n<\/li>\n<li>\n<p><a href=\"#conclusion\" rel=\"noopener noreferrer nofollow\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/a><\/p>\n<\/li>\n<\/ol>\n<p><a class=\"anchor\" name=\"idea\" id=\"idea\"><\/a><\/p>\n<h2>\u0418\u0434\u0435\u044f<\/h2>\n<p>\u041e\u0434\u043d\u0438\u043c \u0438\u0437 \u0433\u043b\u0430\u0432\u043d\u044b\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432 \u0438\u0434\u0435\u0438 \u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0435\u0439 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438 \u0441\u0442\u0430\u043b\u0430 \u0441\u0442\u0430\u0442\u044c\u044f <a href=\"https:\/\/arxiv.org\/abs\/2008.10736\" rel=\"noopener noreferrer nofollow\">LULC Segmentation of RGB Satellite Image Using FCN-8<\/a> [<a href=\"https:\/\/habr.com\/ru\/post\/720214\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u0438\u0439<\/a>]: \u0431\u0435\u0440\u0435\u043c \u0434\u0430\u0442\u0430\u0441\u0435\u0442 \u0441\u043f\u0443\u0442\u043d\u0438\u043a\u043e\u0432\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0437\u0435\u043c\u043b\u0438 <strong>Gaofen Image Dataset<\/strong> \u2192 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043f\u043e\u0434\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0432\u043c\u0435\u0441\u0442\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044f \u0438 \u0430\u0443\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439: \u0442\u0430\u043a \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u043b\u0443\u0447\u0448\u0435 \u043e\u0431\u0443\u0447\u0430\u0442\u044c\u0441\u044f \u2192 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u043c\u043e\u0434\u0435\u043b\u044c \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438 \u0441 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043e\u0439 <a href=\"https:\/\/arxiv.org\/abs\/1605.06211\" rel=\"noopener noreferrer nofollow\">Fully Convolutional Network<\/a> (FCN, FCN-8) \u2192 \u043e\u0431\u0443\u0447\u0430\u0435\u043c \u0435\u0435. \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435, \u0432\u043c\u0435\u0441\u0442\u043e \u043c\u043e\u0434\u0435\u043b\u0438 FCN-8 \u044f \u0440\u0435\u0448\u0438\u043b \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0443\u044e \u0432 PyTorch \u043f\u0440\u0435\u0434\u043e\u0431\u0443\u0447\u0435\u043d\u043d\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c <a href=\"https:\/\/arxiv.org\/pdf\/1512.03385.pdf\" rel=\"noopener noreferrer nofollow\">ResNet101<\/a>, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u0443\u044e \u043f\u043e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 FCN (<strong>FCN.ResNet101<\/strong>). \u0422\u0430\u043a\u0436\u0435 \u0432\u043c\u0435\u0441\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430 (Large) \u044f \u0432\u044b\u0431\u0440\u0430\u043b \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e (Fine) \u2014 \u043e\u043d\u0430 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f 10 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u0438 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043f\u043e 15 \u043a\u043b\u0430\u0441\u0441\u0430\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 tif \u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 7200&#215;6800. \u041c\u043e\u0434\u0435\u043b\u044c FCN.ResNet101 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 224&#215;224, \u0430 \u0442\u0430\u043a-\u043a\u0430\u043a \u0440\u0430\u0437\u043c\u0435\u0440 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u043c\u043e\u0436\u0435\u0442 \u0432\u043c\u0435\u0441\u0442\u0438\u0442\u044c\u0441\u044f \u0446\u0435\u043b\u043e\u0435 \u043a\u043e\u043b-\u0432\u043e \u043f\u043e\u0434\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 224&#215;224, \u043c\u044b \u043e\u0431\u0440\u0435\u0437\u0430\u0435\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0434\u043e 7168&#215;6720 (\u0438\u043c\u0435\u043d\u043d\u043e \u043e\u0431\u0440\u0435\u0437\u0430\u0435\u043c, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u043e\u0442\u0435\u0440\u0438 \u0434\u0435\u0442\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438); \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0443 \u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f 960 \u043f\u043e\u0434\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0441 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u044d\u0442\u043e\u0439 \u0438\u0434\u0435\u0438!<\/p>\n<p><a class=\"anchor\" name=\"imports\" id=\"imports\"><\/a><\/p>\n<h2>\u0418\u043c\u043f\u043e\u0440\u0442\u044b<\/h2>\n<p>\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438:<\/p>\n<pre><code class=\"python\">import torch import torchvision import numpy as np import matplotlib.pyplot as plt from PIL import Image from sklearn.model_selection import train_test_split from os import listdir from typing import Tuple, List, Dict, Generator, Any from IPython.display import clear_output<\/code><\/pre>\n<p><a class=\"anchor\" name=\"dataset\" id=\"dataset\"><\/a><\/p>\n<h2>\u0414\u0430\u0442\u0430\u0441\u0435\u0442<\/h2>\n<p>\u0421\u0430\u0439\u0442 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e \u044d\u0442\u043e\u0439 <a href=\"https:\/\/x-ytong.github.io\/project\/GID.html\" rel=\"noopener noreferrer nofollow\">\u0441\u0441\u044b\u043b\u043a\u0435<\/a>, \u0430 \u0434\u0432\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430 (Fine \u0438 Large) \u043d\u0430 <a href=\"https:\/\/whueducn-my.sharepoint.com\/:f:\/g\/personal\/xinyi_tong_whu_edu_cn\/El2LVTJPk3VAuL7_eENrZ68BLPDsJJvm80uYbwXABx5Wuw?e=GwePwA\/\" rel=\"noopener noreferrer nofollow\">OneDrive<\/a>. \u041d\u043e \u0437\u0434\u0435\u0441\u044c \u044f \u0431\u0443\u0434\u0443 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0435\u0433\u043e \u0441\u043e \u0441\u0432\u043e\u0435\u0433\u043e Google Drive.<\/p>\n<p><a class=\"anchor\" name=\"dataset_download\" id=\"dataset_download\"><\/a><\/p>\n<h3>\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430<\/h3>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435\u0441\u044c \u043d\u0435 Google Colab, \u0432\u0430\u043c \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044c gdown:<\/p>\n<pre><code class=\"bash\">pip3 install gdown <\/code><\/pre>\n<p>\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u043c \u0430\u0440\u0445\u0438\u0432\u044b \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430:<\/p>\n<pre><code class=\"python\">%%capture # clear output !gdown \"https:\/\/drive.google.com\/uc?id=1--fNMFRXmBRDQPwdFqh54Sx7_RNE6z4a&amp;confirm=t\" # download image_RGB.zip !gdown \"https:\/\/drive.google.com\/uc?id=1-3y-bJK-QZapo3nwZEXdVLWDjkVO4AYN&amp;confirm=t\" # download label_15classes.zip<\/code><\/pre>\n<p>\u0418 \u0440\u0430\u0437\u0430\u0440\u0445\u0438\u0432\u0438\u0440\u0443\u0435\u043c \u0438\u0445:<\/p>\n<pre><code class=\"python\">%%capture !unzip image_RGB.zip !unzip label_15classes.zip<\/code><\/pre>\n<p><a class=\"anchor\" name=\"dataset_organization\" id=\"dataset_organization\"><\/a><\/p>\n<h3>\u041e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f<\/h3>\n<p>\u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u043d\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c \u0432\u0441\u0435\u043c\u0438 \u043f\u043e\u0434\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438, \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u0430\u0436\u0434\u043e\u0435 \u043a\u0430\u043a \u0444\u0430\u0439\u043b \u0438 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u043f\u043e\u0434\u0433\u0440\u0443\u0437\u043a\u0443. \u0421\u0434\u0435\u043b\u0430\u0435\u043c \u044d\u0442\u043e, \u043d\u043e \u043f\u0435\u0440\u0435\u0434 \u044d\u0442\u0438\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c\u0441\u044f \u0441 \u043a\u043b\u0430\u0441\u0441\u0430\u043c\u0438.<\/p>\n<p>\u0423\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430, \u043a\u0430\u043a \u0443\u0436\u0435 \u0431\u044b\u043b\u043e \u0441\u043a\u0430\u0437\u0430\u043d\u043e, \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e 15 \u043a\u043b\u0430\u0441\u0441\u0430\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u0418\u0445 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 readme.txt \u043d\u0430 <a href=\"https:\/\/whueducn-my.sharepoint.com\/:f:\/g\/personal\/xinyi_tong_whu_edu_cn\/El2LVTJPk3VAuL7_eENrZ68BLPDsJJvm80uYbwXABx5Wuw?e=GwePwA\/\" rel=\"noopener noreferrer nofollow\">OneDrive<\/a>:<\/p>\n<pre><code>label information of 15 classes: industrial land RGB:    200,    0,    0 urban residential RGB:    250,    0, 150 rural residential RGB:    200, 150, 150 traffic land RGB:    250, 150, 150 paddy field RGB:    0,     200,    0 irrigated land RGB:    150,  250,   0 ...<\/code><\/pre>\n<p>\u0418 \u0442\u0430\u043a-\u043a\u0430\u043a \u0432 \u0432\u044b\u0448\u0435\u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0438 \u0438 \u043e\u0431\u0443\u0447\u0430\u043b\u0438 \u0434\u043b\u044f \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0446\u0435\u043b\u0435\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430, \u0432\u044b\u0431\u0435\u0440\u0435\u043c \u043e\u0434\u0438\u043d \u0438\u0437 \u043d\u0438\u0445, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <em>Irrigated Land<\/em>: \u043e\u043d \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u0445 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430, \u0430 \u043f\u043e\u0442\u043e\u043c\u0443 \u0441 \u043d\u0438\u043c \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e. \u041d\u043e \u0442\u0430\u043a\u0436\u0435 \u0432\u0430\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u043a\u043b\u0430\u0441\u0441 \u2014 <em>Background<\/em>, \u0442\u0430\u043a-\u043a\u0430\u043a \u043e\u043d \u0432\u0430\u0436\u0435\u043d \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0438.<\/p>\n<p>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0441\u043b\u043e\u0432\u0430\u0440\u0438 \u0441 \u043a\u043b\u0430\u0441\u0441\u0430\u043c\u0438 \u2014 <code>classes<\/code> \u0438 <code>classes_by_id<\/code> (\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0434\u0430\u043b\u0435\u0435):<\/p>\n<pre><code class=\"python\">classes = {     (0, 0, 0): (0, '__background__'),     (150, 250, 0): (1, 'irrigated_land') }  classes_by_id = dict() for rgb, (id, name) in classes.items():   classes_by_id[id] = (rgb, name)<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0434\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u041d\u0430\u043f\u0438\u0448\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043f\u043e\u0434\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"python\">def get_subimages_generator(     image: Image.Image,     subimage_size: Tuple[int, int, int] ) -> Generator[Image.Image, None, None]:   for r in range(image.size[1] \/\/ subimage_size[1]):     for c in range(image.size[0] \/\/ subimage_size[0]):       yield image.crop(box=(               c * subimage_size[0],               r * subimage_size[1],               (c + 1) * subimage_size[0],               (r + 1) * subimage_size[1]           )       )<\/code><\/pre>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e dataset \u0441 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f\u043c\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u043f\u043e\u0434\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430 (\u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0438 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435):<\/p>\n<pre><code class=\"python\">!mkdir dataset dataset\/originals dataset\/labeleds<\/code><\/pre>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0432\u0441\u0435 \u043f\u043e\u0434\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u043f\u043e\u0434 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u043c\u0438 id (\u043e\u043d\u0438 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u043d\u0430\u043c \u0434\u0430\u043b\u0435\u0435). \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e \u043a\u0430\u0436\u0434\u044b\u043c \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043f\u043e\u0434\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c, \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u043f\u043e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u0430\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0432\u0435\u0442\u0430 \u0438, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c:<\/p>\n<pre><code class=\"python\">def save_dataset_subimages(classes_filter: Dict[Tuple[int, int, int], float]):    for i, filename in enumerate(listdir('image_RGB\/')):       basename = filename[:filename.find('.tif')]              image = Image.open(fp=f'image_RGB\/{basename}.tif').crop(box=(16, 40, 7200 - 16, 6800 - 40))       image_labeled = Image.open(fp=f'label_15classes\/{basename}_label.tif').crop(box=(16, 40, 7200 - 16, 6800 - 40))       subimages = get_subimages_generator(image=image, subimage_size=(224,224))       subimages_labeleds = get_subimages_generator(image=image_labeled, subimage_size=(224,224))        for si, subimage in enumerate(subimages):         subimage_labeled = next(subimages_labeleds)                  # classes filter         do_continue = False         subimage_labeled_colors_dict = {rgb: count for count, rgb in subimage_labeled.getcolors()}         for rgb, min_percent in classes_filter.items():           if rgb not in subimage_labeled_colors_dict \\               or subimage_labeled_colors_dict[rgb] * 100 \/ 50176 &lt; min_percent:               # 50176 = subimage width * subimage height             do_continue = True             break         if do_continue:           continue          subimage.save(fp=f'dataset\/originals\/i{i}si{si}.tif')         subimage_labeled.save(fp=f'dataset\/labeleds\/i{i}si{si}_labeled.tif')<\/code><\/pre>\n<p>\u0417\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u043c \u0435\u0435:<\/p>\n<pre><code class=\"python\">save_dataset_subimages(     classes_filter={         (150, 250, 0): 5     } )<\/code><\/pre>\n<p>\u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u043d\u0438\u0436\u0435 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u043c \u0443\u0437\u043d\u0430\u0442\u044c, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0441\u0435\u0433\u043e \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0445, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0438 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445, \u043f\u043e\u0434\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0431\u044b\u043b\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043e:<\/p>\n<pre><code class=\"python\">!ls -lR dataset\/originals\/*.tif | wc -l<\/code><\/pre>\n<p>\u0412\u0441\u0435\u0433\u043e \u0434\u043b\u044f \u0446\u0435\u043b\u0435\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 <em>Irrigated Land<\/em> \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043e 4166 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0445, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0438 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445, \u043f\u043e\u0434\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439.<\/p>\n<p><a class=\"anchor\" name=\"support_functions_and_dataset_class\" id=\"support_functions_and_dataset_class\"><\/a><\/p>\n<h3>\u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u043a\u043b\u0430\u0441\u0441 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430<\/h3>\n<p>\u0414\u043b\u044f \u043f\u043e\u0434\u0433\u0440\u0443\u0437\u043a\u0438 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0434\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u043a\u043b\u0430\u0441\u0441 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0438\u0445 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0442\u0430\u043a, \u043a\u0430\u043a \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0443\u0434\u043e\u0431\u043d\u043e \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043c\u043e\u0434\u0435\u043b\u044c\u044e. \u0410 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0438 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0434\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u0432\u0438\u0434\u0435 \u0442\u0435\u043d\u0437\u043e\u0440\u043e\u0432 (\u0442\u0438\u043f\u0435 <code>torch.Tensor<\/code>), \u043f\u0440\u0438\u0447\u0435\u043c \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u043c\u043e\u0434\u0435\u043b\u0435\u0439, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 \u0434\u043b\u044f FCN.ResNet101, \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u044c \u0442\u0435\u043d\u0437\u043e\u0440\u043e\u0432 \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u0430\u0440\u0442\u0438\u0439 (batches): (batches, width, height, channels), \u0433\u0434\u0435 width, height \u0438 channels \u2014 \u0448\u0438\u0440\u0438\u043d\u0430, \u0432\u044b\u0441\u043e\u0442\u0430 \u0438 \u043a\u043e\u043b-\u0432\u043e \u043a\u0430\u043d\u0430\u043b\u043e\u0432 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u2014 224, 224 \u0438 3 (R, G, B) \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438, \u043e\u043d\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043e \u0435\u0449\u0435 \u0438 \u0432 \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u0438 (batches, classes, width, height), \u0433\u0434\u0435 classes \u2014 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u2014 2; \u0442\u043e \u0435\u0441\u0442\u044c \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u0437 \u0441\u0435\u0431\u044f \u043c\u0430\u0441\u043a\u0443, \u0433\u0434\u0435 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0441\u043a\u0430 224&#215;224, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 0 \u0438\u043b\u0438 1, \u043d\u0430 \u043a\u0430\u043a\u043e\u043c \u043f\u0438\u043a\u0441\u0435\u043b\u0435 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441, \u0430 \u043d\u0430 \u043a\u0430\u043a\u043e\u043c \u043d\u0435\u0442. \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u044d\u0442\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f (0 \u0438\u043b\u0438 1) \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043c\u0430\u0441\u043a\u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u043b\u044f \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0438 \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c, \u043e\u043f\u0435\u0440\u0438\u0440\u0443\u044f \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0442 0 \u0434\u043e 1.<\/p>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u043a\u043e\u0434\u0443. \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0447\u0442\u043e\u0431\u044b\u2026<\/p>\n<ul>\n<li>\n<p>\u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0434\u0432\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043f\u043e\u0434\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f (\u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0438 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435) \u043f\u043e \u0438\u0445 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u043c id, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u043f\u0440\u0438 \u0438\u0445 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0438:<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"python\">def get_dataset_subimage(dataset_subimage_id: str) -> Tuple[Image.Image, Image.Image]:    subimage = Image.open(fp=f'dataset\/originals\/{dataset_subimage_id}.tif')   subimage_labeled = Image.open(fp=f'dataset\/labeleds\/{dataset_subimage_id}_labeled.tif')    return subimage, subimage_labeled<\/code><\/pre>\n<ul>\n<li>\n<p>\u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043c\u0430\u0441\u043a\u0443 \u0438\u0437 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442:<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043c\u0441\u044f \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043f\u0438\u043a\u0441\u0435\u043b\u044e \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c \u043c\u0430\u0441\u043a\u0435 \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u043c\u0430\u0441\u043a\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 1.0, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c, \u0435\u0441\u043b\u0438 \u0434\u043b\u044f \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u043d\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043a\u043b\u0430\u0441\u0441\u0430, \u043e\u0442\u043d\u043e\u0441\u0438\u043c \u0435\u0433\u043e \u043a \u043a\u043b\u0430\u0441\u0441\u0443 <em>Background.<\/em> \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432 \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u044c\u044e <code>(classes, width, height)<\/code>:<\/p>\n<pre><code class=\"python\">def get_image_mask_from_labeled(     image_labeled: Image.Image,     classes: Dict[Tuple[int, int, int], Tuple[int, str]] ) -> np.ndarray:    image_mask = np.zeros(shape=(len(classes),image_labeled.size[0],image_labeled.size[1]))    image_labeled_ndarray = np.array(object=image_labeled)   for r in np.arange(stop=image_labeled_ndarray.shape[0]):     for c in np.arange(stop=image_labeled_ndarray.shape[1]):       class_rgb = tuple(image_labeled_ndarray[r][c])       class_value = classes.get(class_rgb)       if class_value != None:         image_mask[class_value[0]][r][c] = 1.0       else:         image_mask[0][r][c] = 1.0    return image_mask<\/code><\/pre>\n<p>\u0412\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432 \u0438\u0437 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u0441\u0440\u0435\u0434\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044f, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043f\u0438\u043a\u0441\u0435\u043b\u044e \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0446\u0432\u0435\u0442 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u043e\u043c. \u0422\u043e \u0435\u0441\u0442\u044c, \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432 \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u044c\u044e <code>(width, height, channels)<\/code>:<\/p>\n<pre><code class=\"python\">def get_image_labeled_from_mask(     image_mask: np.ndarray,     classes_by_id: Dict[Tuple[int, int, int], Tuple[int, str]] ) -> Image.Image:    image_labeled_ndarray = np.zeros(       shape=(image_mask.shape[1],image_mask.shape[2],3),       dtype=np.uint8   )    image_mask_hot = image_mask.argmax(axis=0)   for r in np.arange(stop=image_mask_hot.shape[0]):     for c in np.arange(stop=image_mask_hot.shape[1]):       class_id = image_mask_hot[r][c]       class_by_id_value = classes_by_id.get(class_id)       image_labeled_ndarray[r][c] = np.array(object=class_by_id_value[0])      image_labeled = Image.fromarray(obj=image_labeled_ndarray)      return image_labeled<\/code><\/pre>\n<ul>\n<li>\n<p>\u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0435\u0434\u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f (\u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u044c \u0432 \u0442\u0435\u043d\u0437\u043e\u0440):<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"python\">def image_preprocess(image: Image.Image) -> torch.Tensor:   return torchvision.transforms.ToTensor()(pic=image)<\/code><\/pre>\n<ul>\n<li>\n<p>\u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u044c \u0434\u0432\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043f\u043e\u0434\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u0442\u0435\u043d\u0437\u043e\u0440\u044b:<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"python\">def get_dataset_subimage_tensor(     subimage: Image.Image,     subimage_labeled: Image.Image,     classes: Dict[Tuple[int, int, int], Tuple[int, str]],     dtype: torch.FloatType = None, ) -> Tuple[torch.Tensor, torch.Tensor]:    subimage_tensor = image_preprocess(image=subimage)   subimage_mask_tensor = torch.tensor(       data=get_image_mask_from_labeled(           image_labeled=subimage_labeled,           classes=classes       ),       dtype=dtype   )    return subimage_tensor, subimage_mask_tensor<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u043a\u0430\u043a \u043e\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442. \u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0434\u0432\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043f\u043e\u0434\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u0438\u0445 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u043c\u0443 id:<\/p>\n<pre><code class=\"python\">subimage, subimage_labeled = get_dataset_subimage(dataset_subimage_id='i0si0')<\/code><\/pre>\n<p>\u0412\u044b\u0432\u043e\u0434\u0438\u043c \u0438\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u043e\u0434\u0443\u043b\u044f <code>matplotlib.pyplot<\/code>:<\/p>\n<pre><code class=\"python\">fig, ax = plt.subplots(ncols=2) ax[0].imshow(subimage) ax[1].imshow(subimage_labeled) plt.show()<\/code><\/pre>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/aeb\/a2e\/be3\/aeba2ebe380eaafa7702a8c784b70a9a.png\" width=\"375\" height=\"187\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/aeb\/a2e\/be3\/aeba2ebe380eaafa7702a8c784b70a9a.png\"\/><\/figure>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043c\u0430\u0441\u043e\u043a. \u041f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u043c \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043f\u043e\u0434\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432 \u043c\u0430\u0441\u043a\u0443:<\/p>\n<pre><code class=\"python\">subimage_mask = get_image_mask_from_labeled(     image_labeled=subimage_labeled,     classes=classes )<\/code><\/pre>\n<p>\u041f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u043c \u043c\u0430\u0441\u043a\u0443 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043f\u043e\u0434\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435:<\/p>\n<pre><code class=\"python\">subimage_labeled_from_mask = get_image_labeled_from_mask(     image_mask=subimage_mask,     classes_by_id=classes_by_id )<\/code><\/pre>\n<p>\u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u0434\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0438\u0437 \u043c\u0430\u0441\u043a\u0438:<\/p>\n<pre><code class=\"python\">fig, ax = plt.subplots(ncols=2) ax[0].imshow(subimage) ax[1].imshow(subimage_labeled_from_mask) plt.show()<\/code><\/pre>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c65\/dd9\/9e0\/c65dd99e024e5a4a56dc9887345d32c1.png\" width=\"375\" height=\"187\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c65\/dd9\/9e0\/c65dd99e024e5a4a56dc9887345d32c1.png\"\/><\/figure>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u043d\u043e!<\/p>\n<p>\u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430 (\u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 <code>torch.utils.data.Dataset<\/code>), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0434\u0430\u0442\u0430\u043b\u043e\u0430\u0434\u0435\u0440\u043e\u043c (\u0442\u0438\u043f\u043e\u043c <code>torch.utils.data.DataLoader<\/code>) \u043f\u043e\u043c\u043e\u0433\u0443\u0442 \u0443\u0434\u043e\u0431\u043d\u043e \u043f\u043e\u0434\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043f\u043e\u0434\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u0418 \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0435 \u043e\u043d\u0438 \u043d\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u0438 \u043c\u043d\u043e\u0433\u043e \u043f\u0430\u043c\u044f\u0442\u0438, \u0432 \u0441\u0430\u043c\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430 \u043c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0438\u0445 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0435 id, \u0430 \u043f\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0443 \u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 (\u0432\u044b\u0437\u043e\u0432\u0443 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 <code>__getitem__<\/code>) \u0431\u0443\u0434\u0435\u043c \u0443\u0436\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0438\u0445, \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u044c \u0432 \u0442\u0435\u043d\u0437\u043e\u0440\u044b \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u0430\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u043e\u0432 \u2014 \u043e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439.<\/p>\n<p>\u041d\u043e \u043f\u0435\u0440\u0435\u0434 \u044d\u0442\u0438\u043c, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0432\u0441\u0435 id \u043f\u043e\u0434\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439:<\/p>\n<pre><code class=\"python\">def get_dataset_subimages_id() -> List[str]:   return [       filename[:filename.find('.tif')]       for filename in listdir(path='dataset\/originals\/')   ]<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0437\u043e\u0431\u044a\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a id \u043d\u0430 \u043e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0439 \u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>train_test_split<\/code> \u0438\u0437 \u043c\u043e\u0434\u0443\u043b\u044f <code>sklearn<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u0438\u0445 \u043d\u0430 \u043e\u0431\u0443\u0447\u0430\u044e\u0449\u0443\u044e \u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u0443\u044e \u0432\u044b\u0431\u043e\u0440\u043a\u0438, \u0433\u0434\u0435 \u0434\u043b\u0438\u043d\u0430 \u043e\u0431\u0443\u0447\u0430\u044e\u0449\u0435\u0439 \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c 90%, \u0430 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0439 \u2014 10%:<\/p>\n<pre><code class=\"python\">train_dataset_subimages_id, test_dataset_subimages_id = train_test_split(get_dataset_subimages_id(), train_size=0.9)<\/code><\/pre>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043a\u043b\u0430\u0441\u0441 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430. \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0434\u0430\u0442\u0430\u043b\u043e\u0430\u0434\u0435\u0440\u0430 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043c\u0435\u0442\u043e\u0434 <code>__len__<\/code> (\u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430) \u2014 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0434\u043b\u0438\u043d\u044b \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430 \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u0434\u043b\u0438\u043d\u0430 \u0441\u043f\u0438\u0441\u043a\u0430 id:<\/p>\n<pre><code class=\"python\">class Dataset(torch.utils.data.Dataset):   def __init__(self,       dataset_subimages_id: List[str],       classes: Dict[Tuple[int, int, int], Tuple[int, str]],   ):     self.dataset_subimages_id = dataset_subimages_id     self.classes = classes      def __getitem__(self, idx: int) -> Tuple[torch.Tensor, torch.Tensor]:     subimage = Image.open(fp=f'dataset\/originals\/{self.dataset_subimages_id[idx]}.tif')     subimage_labeled = Image.open(fp=f'dataset\/labeleds\/{self.dataset_subimages_id[idx]}_labeled.tif')     subimage_tensor, subimage_mask_tensor = get_dataset_subimage_tensor(         subimage=subimage,         subimage_labeled=subimage_labeled,         classes=self.classes     )     return subimage_tensor, subimage_mask_tensor      def __len__(self) -> int:     return len(self.dataset_subimages_id)<\/code><\/pre>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0432\u044b\u0448\u0435\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u043e\u0432:<\/p>\n<pre><code class=\"python\">train_dataset = Dataset(     dataset_subimages_id=train_dataset_subimages_id,     classes=classes, ) test_dataset = Dataset(     dataset_subimages_id=test_dataset_subimages_id,     classes=classes )<\/code><\/pre>\n<p>\u0414\u0430\u0442\u0430\u043b\u043e\u0430\u0434\u0435\u0440\u044b \u0443\u0434\u043e\u0431\u043d\u044b \u0442\u0435\u043c, \u0447\u0442\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u043e \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0442\u044c \u0434\u0430\u0442\u0430\u0441\u0435\u0442 \u043d\u0430 \u043f\u0430\u0440\u0442\u0438\u0438 \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0438\u0432\u0430\u0442\u044c. \u041e\u0431\u0430 \u044d\u0442\u0438\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u0430\u0436\u043d\u044b\u043c\u0438 \u043f\u0440\u0438 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0438. \u0414\u043b\u044f \u043d\u0430\u0448\u0435\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u043c \u0434\u043b\u044f \u043e\u0431\u0443\u0447\u0430\u044e\u0449\u0435\u0439 \u0432\u044b\u0431\u043e\u0440\u043a\u0438, \u043f\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c \u043c\u043e\u0438\u0445 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432, \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <code>batch_size=32<\/code> \u0438 <code>shuffle=True<\/code>.<\/p>\n<pre><code class=\"python\">train_dataloader = torch.utils.data.DataLoader(     dataset=train_dataset,     batch_size=32,     shuffle=True ) test_dataloader = torch.utils.data.DataLoader(     dataset=test_dataset,     batch_size=1 )<\/code><\/pre>\n<p><a class=\"anchor\" name=\"model\" id=\"model\"><\/a><\/p>\n<h2>\u041c\u043e\u0434\u0435\u043b\u044c<\/h2>\n<p>\u041c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u043c\u043e\u0434\u0435\u043b\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 <code>torch.nn.Module<\/code>, \u043e\u0434\u043d\u0430\u043a\u043e, \u043a\u0430\u043a \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u043e\u0441\u044c \u0432 \u043d\u0430\u0447\u0430\u043b\u0435, \u044f \u0440\u0435\u0448\u0438\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u0441 \u043f\u0440\u0435\u0434\u043e\u0431\u0443\u0447\u0435\u043d\u043d\u044b\u043c\u0438 \u043d\u0430 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0435 <em>ImageNet1K<\/em> \u0432\u0435\u0441\u0430\u043c\u0438 \u0438\u0437 \u043c\u043e\u0434\u0443\u043b\u044f <code>torchvision<\/code> \u2014 <strong>FCN.ResNet101<\/strong>. \u041f\u0440\u0438\u0447\u0435\u043c, c \u043f\u0440\u0435\u0434\u043e\u0431\u0443\u0447\u0435\u043d\u043d\u044b\u043c\u0438 \u0432\u0435\u0441\u0430\u043c\u0438 \u043d\u0435 \u0432\u0441\u0435\u0439 \u043c\u043e\u0434\u0435\u043b\u0438, \u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u043e\u0435\u0432 backbone\u2019\u0430 (\u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u0435\u0439 \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u043e\u0432), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u044b \u043d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b FCN \u043d\u0438\u0436\u0435 \u043c\u0435\u0436\u0434\u0443 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c \u043a\u043e\u0442\u0438\u043a\u0430 \u0441 \u0441\u043e\u0431\u0430\u0447\u043a\u043e\u0439 \u0438 \u0441\u043b\u043e\u044f pixelwise prediction.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/aa9\/a5d\/d89\/aa9a5dd892f4d1fbdd0a300c94b43521.png\" alt=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a \u0438\u0437 \u0441\u0442\u0430\u0442\u044c\u0438 Fully Convolutional Network for Semantic Segmentation, \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c FCN \u043e\u0431\u0443\u0447\u0430\u0442\u044c\u0441\u044f \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438.\" title=\"\u0420\u0438\u0441\u0443\u043d\u043e\u043a \u0438\u0437 \u0441\u0442\u0430\u0442\u044c\u0438 Fully Convolutional Network for Semantic Segmentation, \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c FCN \u043e\u0431\u0443\u0447\u0430\u0442\u044c\u0441\u044f \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438.\" width=\"4514\" height=\"2343\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/aa9\/a5d\/d89\/aa9a5dd892f4d1fbdd0a300c94b43521.png\"\/><\/p>\n<div><figcaption>\u0420\u0438\u0441\u0443\u043d\u043e\u043a \u0438\u0437 \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/arxiv.org\/abs\/1411.4038\" rel=\"noopener noreferrer nofollow\">Fully Convolutional Network for Semantic Segmentation<\/a>, \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c FCN \u043e\u0431\u0443\u0447\u0430\u0442\u044c\u0441\u044f \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438.<\/figcaption><\/div>\n<\/figure>\n<p>\u041d\u043e \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u043d\u0443\u0436\u043d\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <code>device<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u043c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c, \u043d\u0430 \u043a\u0430\u043a\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 (CPU \u0438\u043b\u0438 GPU) \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0438 \u043d\u0430 \u043a\u0430\u043a\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438. \u041f\u0440\u0438 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0438 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0441 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043e\u0439, \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430\u043c\u0438 \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0432\u0430\u043d\u0438\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u043d\u0430 GPU, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0434\u0435\u043b\u044c \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b\u0430 \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435:<\/p>\n<pre><code class=\"python\">device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')<\/code><\/pre>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043c\u043e\u0434\u0435\u043b\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u043e\u0434\u0443\u043b\u044f <code>torchvision<\/code> \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043a\u043e\u043b-\u0432\u043e \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0438 \u0432\u0435\u0441\u0430 backbone\u2019\u0430:<\/p>\n<pre><code class=\"python\">%%capture model = torchvision.models.segmentation.fcn_resnet101(     num_classes=len(classes),     weights_backbone=torchvision.models.ResNet101_Weights.IMAGENET1K_V1 ).to(device=device)<\/code><\/pre>\n<p>\u041d\u0430\u043f\u0438\u0448\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043d\u0438\u044f \u043f\u043e \u0432\u0445\u043e\u0434\u043d\u043e\u043c\u0443 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044e:<\/p>\n<pre><code class=\"python\">def predict(     image: Image.Image,     model: torch.nn.Module,     device: torch.DeviceObjType, ) -> Image.Image:    image_tensor = image_preprocess(image=image)    with torch.no_grad():     output_image_mask = model(image_tensor.unsqueeze(0).to(device))['out'][0].cpu().numpy()    predicted_image_labeled = get_image_labeled_from_mask(       image_mask=output_image_mask,       classes_by_id=classes_by_id   )    return predicted_image_labeled<\/code><\/pre>\n<p>\u0418 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0435\u0435:<\/p>\n<pre><code class=\"python\">predicted_image_labeled = predict(     image=subimage,     model=model,     device=device )<\/code><\/pre>\n<pre><code class=\"python\">fig, ax = plt.subplots(ncols=3) ax[0].imshow(subimage) ax[1].imshow(predicted_image_labeled) ax[2].imshow(subimage_labeled) plt.show()<\/code><\/pre>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/326\/58b\/c72\/32658bc72e3678c26c0c51ef113a4867.png\" width=\"375\" height=\"133\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/326\/58b\/c72\/32658bc72e3678c26c0c51ef113a4867.png\"\/><\/figure>\n<p>\u0425\u043e\u0440\u043e\u0448\u043e, \u043e\u043d\u0430 \u043d\u0430 \u0447\u0442\u043e-\u0442\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u0430.<\/p>\n<p><a class=\"anchor\" name=\"training_and_testing_model\" id=\"training_and_testing_model\"><\/a><\/p>\n<h2>\u041e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438<\/h2>\n<p><a class=\"anchor\" name=\"metrics\" id=\"metrics\"><\/a><\/p>\n<h3>\u041c\u0435\u0442\u0440\u0438\u043a\u0438<\/h3>\n<p>\u041f\u0440\u0438 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0438 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u043c\u0435\u0442\u0440\u0438\u043a\u0430\u043c\u0438, \u0447\u0442\u043e\u0431\u044b \u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0437\u0430 \u0435\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435\u043c. \u0418 \u0435\u0441\u043b\u0438 \u043c\u0435\u0442\u0440\u0438\u043a\u0443 \u043f\u043e\u0442\u0435\u0440\u044c \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e\u0442\u0435\u0440\u044c (\u0435\u0435 \u043c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043f\u043e\u0441\u043b\u0435), \u0442\u043e \u0432 \u043c\u043e\u0434\u0443\u043b\u044f\u0445 <code>torch<\/code> \u0438 <code>torchvision<\/code> \u0442\u0430\u043a\u0438\u0445 \u0432\u0430\u0436\u043d\u044b\u0445 \u0434\u043b\u044f \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043c\u0435\u0442\u0440\u0438\u043a \u043a\u0430\u043a Pixel Accuracy \u0438 Intersection over Union (IoU) \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f. \u0425\u043e\u0442\u044f \u043e\u043d\u0438 \u0435\u0441\u0442\u044c \u0432 <code>torchmetrics<\/code>, \u043d\u043e \u044f \u0440\u0435\u0448\u0438\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0432\u0435\u0440\u0441\u0438\u0438 Pixel Accuracy \u0438 IoU, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u043e\u043d\u0438 \u0438\u0437 \u0441\u0435\u0431\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442. \u0425\u043e\u0440\u043e\u0448\u0438\u0439 \u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043e\u0431\u0437\u043e\u0440 \u043f\u043e \u044d\u0442\u0438\u043c \u0438 \u0434\u0440\u0443\u0433\u0438\u043c \u043c\u0435\u0442\u0440\u0438\u043a\u0430\u043c \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0432\u0435\u043b \u0414\u0436\u0435\u0440\u0435\u043c\u0438 \u0414\u0436\u043e\u0440\u0434\u0430\u043d \u043d\u0430 \u0441\u0432\u043e\u0435\u043c <a href=\"https:\/\/www.jeremyjordan.me\/evaluating-image-segmentation-models\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0430\u0439\u0442\u0435<\/a>.<\/p>\n<p><a class=\"anchor\" name=\"metrics_pixel_accuracy\" id=\"metrics_pixel_accuracy\"><\/a><\/p>\n<h4>Pixel Accuracy<\/h4>\n<blockquote>\n<p>\u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043c\u0435\u0442\u0440\u0438\u043a\u043e\u0439 \u0434\u043b\u044f \u043e\u0446\u0435\u043d\u043a\u0438 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043e\u0442\u0447\u0435\u0442 \u043e \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u0435 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u043d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u044b. \u0422\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u043e\u0431\u044b\u0447\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432. (\u0414\u0436\u0435\u0440\u0435\u043c\u0438 \u0414\u0436\u043e\u0440\u0434\u0430\u043d)<\/p>\n<\/blockquote>\n<p>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0435\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u043e\u0440\u043c\u0443\u043b\u044b:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"pixel \\space accuracy = \\frac{correct \\space pixels}{correct \\space pixels + uncorrect \\space pixels}\" alt=\"pixel \\space accuracy = \\frac{correct \\space pixels}{correct \\space pixels + uncorrect \\space pixels}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9b2\/5bf\/8f1\/9b25bf8f161250bb7619080558214547.svg\" width=\"417\" height=\"45\"\/><\/p>\n<p>\u041d\u0430\u043f\u0438\u0448\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043c\u0435\u0442\u0440\u0438\u043a\u0438 Pixel Accuracy. \u041f\u0440\u0438\u0447\u0435\u043c, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u0438\u043a\u0441\u0435\u043b\u0438 \u0442\u0430\u043a, \u043a\u0430\u043a \u043c\u044b \u0431\u044b \u0438\u0445 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u043b\u0438, \u0442\u043e \u0435\u0441\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043c\u0430\u0441\u0438\u0432\u0430 \u0438\u0437 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u0441\u0440\u0435\u0434\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044f:<\/p>\n<pre><code class=\"python\">def metric_pixel_accuracy(     y_pred: torch.Tensor,     y_true: torch.Tensor ) -> float:    y_pred_argmax = y_pred.argmax(dim=1)   y_true_argmax = y_true.argmax(dim=1)    correct_pixels = (y_pred_argmax == y_true_argmax).count_nonzero()   uncorrect_pixels = (y_pred_argmax != y_true_argmax).count_nonzero()   result = (correct_pixels \/ (correct_pixels + uncorrect_pixels)).item()    return result<\/code><\/pre>\n<p><a class=\"anchor\" name=\"metrics_iou\" id=\"metrics_iou\"><\/a><\/p>\n<h4>IoU<\/h4>\n<blockquote>\n<p>\u041c\u0435\u0442\u0440\u0438\u043a\u0430 Intersection over Union (IoU), \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u0430\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c \u0416\u0430\u043a\u043a\u0430\u0440\u0430, \u043f\u043e \u0441\u0443\u0442\u0438, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043e\u0446\u0435\u043d\u043a\u0438 \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0442\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u043c\u0430\u0441\u043a\u043e\u0439 \u0438 \u043d\u0430\u0448\u0438\u043c \u043f\u0440\u043e\u0433\u043d\u043e\u0437\u0438\u0440\u0443\u0435\u043c\u044b\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c. \u042d\u0442\u0430 \u043c\u0435\u0442\u0440\u0438\u043a\u0430 \u0442\u0435\u0441\u043d\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u0430 \u0441 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u043e\u043c \u0414\u0430\u0439\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e\u0442\u0435\u0440\u044c \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f. (\u0414\u0436\u0435\u0440\u0435\u043c\u0438 \u0414\u0436\u043e\u0440\u0434\u0430\u043d)<\/p>\n<\/blockquote>\n<p>\u0415\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u043e\u0440\u043c\u0443\u043b\u044b:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"formula\" source=\"IoU = \\frac{target \\cap prediction}{target \\cup prediction}\" alt=\"IoU = \\frac{target \\cap prediction}{target \\cup prediction}\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/157\/cf8\/137\/157cf8137d1ecb4f7bc7d2aa4825b4a4.svg\" width=\"218\" height=\"45\"\/><\/p>\n<p>\u041d\u0430\u0438\u0448\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043c\u0435\u0442\u0440\u0438\u043a\u0438 IoU. \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435 \u043f\u0438\u043a\u0441\u0435\u043b\u0438, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u044b\u0448\u0435 0.51 (51%):<\/p>\n<pre><code class=\"python\">def metric_iou(     y_pred: torch.Tensor,     y_true: torch.Tensor ) -> float:    y_pred_hot = y_pred >= 0.51    intersection = torch.logical_and(y_pred_hot, y_true).count_nonzero()   union = torch.logical_or(y_pred_hot, y_true).count_nonzero()   result = (intersection \/ union).item()    return result<\/code><\/pre>\n<p><a class=\"anchor\" name=\"training\" id=\"training\"><\/a><\/p>\n<h3>\u041e\u0431\u0443\u0447\u0435\u043d\u0438\u0435<\/h3>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043f\u043e\u0434\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u043f\u043e\u0434\u0430\u0432\u0430\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u0438 \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0442\u0435\u043d\u0437\u043e\u0440\u044b \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0435, \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u043d\u0430 \u0438\u0445 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u043e\u0442\u0435\u0440\u044e, \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435, \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u043c\u0435\u0442\u0440\u0438\u043a \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u0430\u0440\u0442\u0438\u0438, \u0438 \u0432\u0441\u0435 \u044d\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u043a\u043e\u043b-\u0432\u043e \u044d\u043f\u043e\u0445. \u041f\u0440\u0438\u0447\u0435\u043c, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u043f\u0430\u043c\u044f\u0442\u044c \u043d\u0435 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0430\u043b\u0430\u0441\u044c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u0443\u0436\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u044b\u0435 \u0433\u0440\u043e\u043c\u043e\u0437\u0434\u043a\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438 \u043e\u0447\u0438\u0449\u0430\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430, \u0435\u0441\u043b\u0438 \u043c\u044b \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c:<\/p>\n<pre><code class=\"python\">def train(     model: torch.nn.Module,     device: torch.DeviceObjType,     train_dataloader: torch.utils.data.DataLoader,     loss_fn: Any,     optim_fn: Any,     epochs: int ) -> Dict[str, List[float]]:    history_metrics = {       'loss': list(),       'pixel_accuracy': list(),       'iou': list()   }    for e in range(1, epochs + 1):     for b, data in enumerate(train_dataloader, start=1):       subimage_tensor, subimage_mask_tensor = data              if device.type == 'cuda':         subimage_tensor = subimage_tensor.to(device)         subimage_mask_tensor = subimage_mask_tensor.to(device)              optim_fn.zero_grad()       output = model(subimage_tensor)       loss = loss_fn(output['out'], subimage_mask_tensor)       loss.backward()       optim_fn.step()        loss_item = loss.item()       pixel_accuracy = metric_pixel_accuracy(output['out'], subimage_mask_tensor)       iou = metric_iou(output['out'], subimage_mask_tensor)        history_metrics['loss'].append(loss_item)       history_metrics['pixel_accuracy'].append(pixel_accuracy)       history_metrics['iou'].append(iou)  # dynamic output       clear_output()       print(           'Epoch: {}. Batch: {}. Loss: {:.3f} | Pixel Accuracy: {:.3f} | IoU: {:.3f}'.format(               e, b,               loss, pixel_accuracy, iou           )       )        # memory clear       del subimage_tensor, subimage_mask_tensor, output, loss       if device.type == 'cuda':         torch.cuda.empty_cache()      return history_metrics<\/code><\/pre>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0442\u0430\u043a\u0436\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e\u0442\u0435\u0440\u044c \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043a\u043e\u043b-\u0432\u043e \u044d\u043f\u043e\u0445. \u0414\u043b\u044f \u043d\u0430\u0448\u0435\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0438 \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0435\u0439 \u043e\u043d\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u043c\u0438, \u0432\u0435\u0434\u044c \u043e\u043d\u0438 \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e\u0442\u0435\u0440\u044c \u044f \u0432\u044b\u0431\u0440\u0430\u043b \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u0443\u044e \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 <strong>CrossEntropyLoss<\/strong> (<code>torch.nn.CrossEntropyLoss<\/code>). \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u2014 <strong>AdamW<\/strong> (<code>torch.optim.AdamW<\/code>), \u0438 \u0432\u0430\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441 \u0435\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438: \u043f\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c \u043c\u043e\u0438\u0445 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432, \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u043c \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u043c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u043e\u043c \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f (learning rate, <code>lr<\/code>) \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f 0.0001 (1e-4). \u041d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u043a\u043e\u043b-\u0432\u043e \u044d\u043f\u043e\u0445, \u043e\u043f\u044f\u0442\u044c-\u0436\u0435, \u043f\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c \u043c\u043e\u0438\u0445 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432, \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f 8, \u0432\u0435\u0434\u044c \u043f\u043e \u043c\u043e\u0438\u043c \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u044f\u043c \u0434\u0430\u043b\u044c\u0448\u0435 \u043e\u043d \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0435\u0442 \u043e\u0431\u0443\u0447\u0430\u0442\u044c\u0441\u044f, \u0445\u043e\u0442\u044f \u0432 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u043e\u043c \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0446\u0435\u043b\u044b\u0445 100 \u044d\u043f\u043e\u0445, \u043d\u043e \u0434\u043b\u044f \u0441\u0432\u043e\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430.<\/p>\n<p>\u0412\u0441\u0435 \u0433\u043e\u0442\u043e\u0432\u043e \u043a \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044e. \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u0435\u0433\u043e:<\/p>\n<pre><code class=\"python\">history_metrics = train(     model=model,     device=device,     train_dataloader=train_dataloader,     loss_fn=torch.nn.CrossEntropyLoss(),     optim_fn=torch.optim.AdamW(params=model.parameters(), lr=1e-4),     epochs=8 )<\/code><\/pre>\n<p>\u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043e\u043b\u0433\u0438\u043c \u0434\u0430\u0436\u0435 \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 GPU \u0432 Google Colab. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0447\u0430\u0441\u0442\u044c  \u043a\u043e\u0434\u0430 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u0443\u0434\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u043e, \u0435\u0441\u043b\u0438 \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0434\u043b\u044f \u0441\u0432\u043e\u0438\u0445 \u0437\u0430\u0434\u0430\u0447.<\/p>\n<p><a class=\"anchor\" name=\"training_research\" id=\"training_research\"><\/a><\/p>\n<h4>\u0418\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f<\/h4>\n<p>\u0412\u044b\u0432\u0435\u0434\u0435\u043c \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u043c\u0435\u0442\u0440\u0438\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>matplotlib.pyplot<\/code>:<\/p>\n<pre><code class=\"python\">plt.plot(     history_metrics['loss'], 'red',     history_metrics['pixel_accuracy'], 'green',     history_metrics['iou'], 'blue', ) plt.title('History Metrics in Training\\nep=8, bs=32, loss_fn=CrossEntopyLoss(), optim_fn=AdamW(lr=1e-4)') plt.xlabel('Batch') plt.ylabel('Value') plt.legend(('Loss', 'Pixel Accuracy', 'IoU')) plt.show()<\/code><\/pre>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7a4\/60f\/d78\/7a460fd78b04b0f662a57383804bbdb8.png\" width=\"435\" height=\"293\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7a4\/60f\/d78\/7a460fd78b04b0f662a57383804bbdb8.png\"\/><\/figure>\n<p>\u0425\u043e\u0442\u044f \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432\u0438\u0434\u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u044f\u0432\u043d\u043e: \u043f\u043e\u0442\u0435\u0440\u0438 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u044e\u0442\u0441\u044f, \u043c\u0435\u0442\u0440\u0438\u043a\u0438 Pixel Accuracy \u0438 IoU \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0438 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f. \u041e\u0434\u043d\u0430\u043a\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u043c\u0435\u043d\u044f \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043a\u043e\u043b\u0435\u0431\u043b\u044e\u0449\u0438\u043c\u0438\u0441\u044f. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u0430\u0440\u0442\u0438\u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0440\u0435\u0437\u043a\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f. \u0412\u0441\u0435 \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0433\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430, \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043f\u0430\u0440\u0442\u0438\u0439 (<code>batch_size<\/code>), \u0432\u044b\u0431\u043e\u0440\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043f\u043e\u0442\u0435\u0440\u044c, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 (learning rate \u0438 \u0434\u0440\u0443\u0433\u0438\u0445) \u0438 \u0442.\u043f. \u0412\u0441\u0435 \u044d\u0442\u043e \u0432\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u043f\u0435\u043a\u0442\u0440 \u043c\u043e\u0435\u0433\u043e \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443, \u0435\u0441\u043b\u0438 \u0432\u044b \u0432 \u044d\u0442\u043e\u043c \u0445\u043e\u0440\u043e\u0448\u043e \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442\u0435\u0441\u044c, \u044f \u0431\u0443\u0434\u0443 \u0440\u0430\u0434, \u0435\u0441\u043b\u0438 \u0432\u044b \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u0435\u0441\u044c \u0441\u043e \u043c\u043d\u043e\u0439 \u0441\u0432\u043e\u0438\u043c\u0438 \u0437\u043d\u0430\u043d\u0438\u044f\u043c\u0438.<\/p>\n<p><a class=\"anchor\" name=\"save_model\" id=\"save_model\"><\/a><\/p>\n<h4>\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438<\/h4>\n<p>\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u043c \u043c\u043e\u0434\u0435\u043b\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>save<\/code> \u0438\u0437 \u043c\u043e\u0434\u0443\u043b\u044f <code>torch<\/code> \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 h5:<\/p>\n<pre><code class=\"python\">torch.save( model.state_dict(), 'remezova_fcn_resnet101_ep8bs32lr1e-4.h5' )<\/code><\/pre>\n<p><a class=\"anchor\" name=\"testing\" id=\"testing\"><\/a><\/p>\n<h3>\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/h3>\n<p>\u041d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u043e\u0445\u043e\u0436\u0443\u044e \u043d\u0430 <code>train<\/code> \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>test<\/code>, \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u0435\u0437 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0438 c \u0432\u044b\u0432\u043e\u0434\u043e\u043c \u043c\u0435\u0434\u0438\u0430\u043d\u044b \u043c\u0435\u0442\u0440\u0438\u043a \u0438\u0437 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u043c\u0435\u0442\u0440\u0438\u043a \u0441 \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u0430\u0440\u0442\u0438\u0435\u0439:<\/p>\n<pre><code class=\"python\">def test(     model: torch.nn.Module,     device: torch.DeviceObjType,     test_dataloader: torch.utils.data.DataLoader,     loss_fn: Any, ) -> Dict[str, List[float]]:    history_metrics = {       'pixel_accuracy': list(),       'iou': list()   }    for b, data in enumerate(test_dataloader, start=1):     subimage_tensor, subimage_mask_tensor = data          if device.type == 'cuda':       subimage_tensor = subimage_tensor.to(device)       subimage_mask_tensor = subimage_mask_tensor.to(device)          with torch.no_grad():       output = model(subimage_tensor)      pixel_accuracy = metric_pixel_accuracy(output['out'], subimage_mask_tensor)     iou = metric_iou(output['out'], subimage_mask_tensor)      history_metrics['pixel_accuracy'].append(pixel_accuracy)     history_metrics['iou'].append(iou)      clear_output()     print(         'Batch: {}. median Pixel Accuracy: {:.3f} | median IoU: {:.3f}'.format(             b,             np.median(a=history_metrics['pixel_accuracy']),             np.median(a=history_metrics['iou'])         )     )      # memory clear     del subimage_tensor, subimage_mask_tensor, output     if device.type == 'cuda':       torch.cuda.empty_cache()      return history_metrics<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0434\u0435\u043c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435:<\/p>\n<pre><code class=\"python\">test_history_metrics = test(     model=model,     device=device,     test_dataloader=test_dataloader,     loss_fn=torch.nn.CrossEntropyLoss() )<\/code><\/pre>\n<p>\u0418 \u0442\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<pre><code>Batch: 417. median Pixel Accuracy: 0.703 | median IoU: 0.523<\/code><\/pre>\n<p>\u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u0439. \u0412\u044b\u0432\u0435\u0434\u0435\u043c \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u043f\u043e \u043f\u044f\u0442\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u043c \u043f\u043e\u0434\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c:<\/p>\n<pre><code class=\"python\">fig, ax = plt.subplots(nrows=3, ncols=5, figsize=(16,8)) for si, (subimage_tensor, subimage_mask_tensor) in enumerate(test_dataloader):   subimage = torchvision.transforms.ToPILImage()(pic=subimage_tensor[0])   subimage_labeled = get_image_labeled_from_mask(       image_mask=subimage_mask_tensor[0].cpu().numpy(),       classes_by_id=classes_by_id   )   predicted_subimage_labeled = predict(       image=subimage,       model=model,       device=device   )   ax[0][si].imshow(subimage)   ax[1][si].imshow(predicted_subimage_labeled)   ax[2][si].imshow(subimage_labeled)      if si == 5 - 1:     break  plt.show()<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9b5\/b07\/4ba\/9b5b074ba7637b6fb32b99e63b3fb862.png\" alt=\"\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u0439. \u0421\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437: \u043f\u043e\u0434\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u043c\u0430\u0441\u043a\u0430 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438 \u043c\u0430\u0441\u043a\u0430 \u0438\u0441\u0442\u0438\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\" title=\"\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u0439. \u0421\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437: \u043f\u043e\u0434\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u043c\u0430\u0441\u043a\u0430 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438 \u043c\u0430\u0441\u043a\u0430 \u0438\u0441\u0442\u0438\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\" width=\"907\" height=\"469\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9b5\/b07\/4ba\/9b5b074ba7637b6fb32b99e63b3fb862.png\"\/><\/p>\n<div><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u0439. \u0421\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437: <em>\u043f\u043e\u0434\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435<\/em>, <em>\u043c\u0430\u0441\u043a\u0430 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f<\/em> \u0438 <em>\u043c\u0430\u0441\u043a\u0430 \u0438\u0441\u0442\u0438\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f<\/em><\/figcaption><\/div>\n<\/figure>\n<p><a class=\"anchor\" name=\"conclusion\" id=\"conclusion\"><\/a><\/p>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>\u041c\u044b \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043b\u0438 \u0434\u0430\u0442\u0430\u0441\u0435\u0442, \u0441\u043e\u0437\u0434\u0430\u043b\u0438, \u043e\u0431\u0443\u0447\u0438\u043b\u0438 \u0438 \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u043b\u044f \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0441\u043f\u0443\u0442\u043d\u0438\u043a\u043e\u0432\u044b\u0445 \u0441\u043d\u0438\u043c\u043a\u043e\u0432. \u041d\u0435 \u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438, \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0445\u043e\u0440\u043e\u0448\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b. \u041e\u0434\u043d\u0430\u043a\u043e \u044d\u0442\u043e\u0442 \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b \u0438 \u0432\u0435\u0441\u044c \u043a\u043e\u0434 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u0438\u043b\u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435\u043c \u043c\u043e\u0438\u0445 \u0437\u043d\u0430\u043d\u0438\u0439 \u0438\u043b\u0438 \u0432\u0430\u0448\u0438\u0445 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0439.<\/p>\n<p>\u042d\u0442\u043e\u0442 \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b \u0432\u044b\u0448\u0435\u043b \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u043c, \u043d\u043e \u044f \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u044f \u0441\u043c\u043e\u0433 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u043e\u0442\u0432\u0435\u0442\u0438\u0442\u044c \u043d\u0430 \u0442\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043f\u043e \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044f\u043c \u0434\u043b\u044f \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0438 \u0438 \u0443 \u0432\u0430\u0441; \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e, \u0435\u0441\u043b\u0438 \u0432\u044b \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u043d\u043e\u0432\u0438\u0447\u043e\u043a, \u043a\u0430\u043a \u0438 \u044f.<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u044d\u0442\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 <a href=\"https:\/\/github.com\/fruitourist\/Remezova\" rel=\"noopener noreferrer nofollow\">Remezova<\/a> \u043d\u0430 GitHub. \u2764\ufe0f<\/p>\n<\/p>\n<\/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\/post\/721414\/\"> https:\/\/habr.com\/ru\/post\/721414\/<\/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-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u043e\u0447\u0438\u0442\u0430\u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 \u043f\u043e \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0441\u043f\u0443\u0442\u043d\u0438\u043a\u043e\u0432\u044b\u0445 \u0441\u043d\u0438\u043c\u043a\u043e\u0432 \u0437\u0435\u043c\u043b\u0438, \u044f \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438 \u043e\u0431\u0443\u0447\u0438\u0442\u044c \u0441\u0432\u043e\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438 \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438. \u0418 \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u043b\u043e \u043c\u043d\u043e\u0433\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432, \u0441\u0432\u043e\u0438\u043c\u0438 \u043e\u0442\u0432\u0435\u0442\u0430\u043c\u0438 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u044d\u0442\u043e\u0433\u043e \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u0430. \u041f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0442\u0430\u043a \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0438 \u043f\u0440\u043e\u0441\u0442\u043e, \u043a\u0430\u043a \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0442\u0430\u043a\u0438\u043c \u043d\u043e\u0432\u0438\u0447\u043a\u0430\u043c, \u043a\u0430\u043a \u044f.<\/p>\n<ol>\n<li>\n<p><a href=\"#idea\" rel=\"noopener noreferrer nofollow\">\u0418\u0434\u0435\u044f<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#imports\" rel=\"noopener noreferrer nofollow\">\u0418\u043c\u043f\u043e\u0440\u0442\u044b<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#dataset\" rel=\"noopener noreferrer nofollow\">\u0414\u0430\u0442\u0430\u0441\u0435\u0442<\/a><\/p>\n<ol>\n<li>\n<p><a href=\"#dataset_download\" rel=\"noopener noreferrer nofollow\">\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#dataset_organization\" rel=\"noopener noreferrer nofollow\">\u041e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#support_functions_and_dataset_class\" rel=\"noopener noreferrer nofollow\">\u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u043a\u043b\u0430\u0441\u0441 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430<\/a><\/p>\n<\/li>\n<\/ol>\n<\/li>\n<li>\n<p><a href=\"#model\" rel=\"noopener noreferrer nofollow\">\u041c\u043e\u0434\u0435\u043b\u044c<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#training_and_testing_model\" rel=\"noopener noreferrer nofollow\">\u041e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438<\/a><\/p>\n<ol>\n<li>\n<p><a href=\"#metrics\" rel=\"noopener noreferrer nofollow\">\u041c\u0435\u0442\u0440\u0438\u043a\u0438<\/a><\/p>\n<ol>\n<li>\n<p><a href=\"#metrics_pixel_accuracy\" rel=\"noopener noreferrer nofollow\">Pixel Accuracy<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#metrics_iou\" rel=\"noopener noreferrer nofollow\">IoU<\/a><\/p>\n<\/li>\n<\/ol>\n<\/li>\n<li>\n<p><a href=\"#training\" rel=\"noopener noreferrer nofollow\">\u041e\u0431\u0443\u0447\u0435\u043d\u0438\u0435<\/a><\/p>\n<ol>\n<li>\n<p><a href=\"#training_research\" rel=\"noopener noreferrer nofollow\">\u0418\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#save_model\" rel=\"noopener noreferrer nofollow\">\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438<\/a><\/p>\n<\/li>\n<\/ol>\n<\/li>\n<li>\n<p><a href=\"#testing\" rel=\"noopener noreferrer nofollow\">\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/a><\/p>\n<\/li>\n<\/ol>\n<\/li>\n<li>\n<p><a href=\"#conclusion\" rel=\"noopener noreferrer nofollow\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/a><\/p>\n<\/li>\n<\/ol>\n<p><a class=\"anchor\" name=\"idea\" id=\"idea\"><\/a><\/p>\n<h2>\u0418\u0434\u0435\u044f<\/h2>\n<p>\u041e\u0434\u043d\u0438\u043c \u0438\u0437 \u0433\u043b\u0430\u0432\u043d\u044b\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432 \u0438\u0434\u0435\u0438 \u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0435\u0439 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438 \u0441\u0442\u0430\u043b\u0430 \u0441\u0442\u0430\u0442\u044c\u044f <a href=\"https:\/\/arxiv.org\/abs\/2008.10736\" rel=\"noopener noreferrer nofollow\">LULC Segmentation of RGB Satellite Image Using FCN-8<\/a> [<a href=\"https:\/\/habr.com\/ru\/post\/720214\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u0438\u0439<\/a>]: \u0431\u0435\u0440\u0435\u043c \u0434\u0430\u0442\u0430\u0441\u0435\u0442 \u0441\u043f\u0443\u0442\u043d\u0438\u043a\u043e\u0432\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0437\u0435\u043c\u043b\u0438 <strong>Gaofen Image Dataset<\/strong> \u2192 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043f\u043e\u0434\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0432\u043c\u0435\u0441\u0442\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044f \u0438 \u0430\u0443\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439: \u0442\u0430\u043a \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u043b\u0443\u0447\u0448\u0435 \u043e\u0431\u0443\u0447\u0430\u0442\u044c\u0441\u044f \u2192 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u043c\u043e\u0434\u0435\u043b\u044c \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438 \u0441 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043e\u0439 <a href=\"https:\/\/arxiv.org\/abs\/1605.06211\" rel=\"noopener noreferrer nofollow\">Fully Convolutional Network<\/a> (FCN, FCN-8) \u2192 \u043e\u0431\u0443\u0447\u0430\u0435\u043c \u0435\u0435. \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435, \u0432\u043c\u0435\u0441\u0442\u043e \u043c\u043e\u0434\u0435\u043b\u0438 FCN-8 \u044f \u0440\u0435\u0448\u0438\u043b \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0443\u044e \u0432 PyTorch \u043f\u0440\u0435\u0434\u043e\u0431\u0443\u0447\u0435\u043d\u043d\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c <a href=\"https:\/\/arxiv.org\/pdf\/1512.03385.pdf\" rel=\"noopener noreferrer nofollow\">ResNet101<\/a>, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u0443\u044e \u043f\u043e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 FCN (<strong>FCN.ResNet101<\/strong>). \u0422\u0430\u043a\u0436\u0435 \u0432\u043c\u0435\u0441\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430 (Large) \u044f \u0432\u044b\u0431\u0440\u0430\u043b \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e (Fine) \u2014 \u043e\u043d\u0430 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f 10 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u0438 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043f\u043e 15 \u043a\u043b\u0430\u0441\u0441\u0430\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 tif \u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 7200&#215;6800. \u041c\u043e\u0434\u0435\u043b\u044c FCN.ResNet101 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 224&#215;224, \u0430 \u0442\u0430\u043a-\u043a\u0430\u043a \u0440\u0430\u0437\u043c\u0435\u0440 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u043c\u043e\u0436\u0435\u0442 \u0432\u043c\u0435\u0441\u0442\u0438\u0442\u044c\u0441\u044f \u0446\u0435\u043b\u043e\u0435 \u043a\u043e\u043b-\u0432\u043e \u043f\u043e\u0434\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 224&#215;224, \u043c\u044b \u043e\u0431\u0440\u0435\u0437\u0430\u0435\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0434\u043e 7168&#215;6720 (\u0438\u043c\u0435\u043d\u043d\u043e \u043e\u0431\u0440\u0435\u0437\u0430\u0435\u043c, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u043e\u0442\u0435\u0440\u0438 \u0434\u0435\u0442\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438); \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0443 \u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f 960 \u043f\u043e\u0434\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0441 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u044d\u0442\u043e\u0439 \u0438\u0434\u0435\u0438!<\/p>\n<p><a class=\"anchor\" name=\"imports\" id=\"imports\"><\/a><\/p>\n<h2>\u0418\u043c\u043f\u043e\u0440\u0442\u044b<\/h2>\n<p>\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438:<\/p>\n<pre><code class=\"python\">import torch import torchvision import numpy as np import matplotlib.pyplot as plt from PIL import Image from sklearn.model_selection import train_test_split from os import listdir from typing import Tuple, List, Dict, Generator, Any from IPython.display import clear_output<\/code><\/pre>\n<p><a class=\"anchor\" name=\"dataset\" id=\"dataset\"><\/a><\/p>\n<h2>\u0414\u0430\u0442\u0430\u0441\u0435\u0442<\/h2>\n<p>\u0421\u0430\u0439\u0442 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e \u044d\u0442\u043e\u0439 <a href=\"https:\/\/x-ytong.github.io\/project\/GID.html\" rel=\"noopener noreferrer nofollow\">\u0441\u0441\u044b\u043b\u043a\u0435<\/a>, \u0430 \u0434\u0432\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430 (Fine \u0438 Large) \u043d\u0430 <a href=\"https:\/\/whueducn-my.sharepoint.com\/:f:\/g\/personal\/xinyi_tong_whu_edu_cn\/El2LVTJPk3VAuL7_eENrZ68BLPDsJJvm80uYbwXABx5Wuw?e=GwePwA\/\" rel=\"noopener noreferrer nofollow\">OneDrive<\/a>. \u041d\u043e \u0437\u0434\u0435\u0441\u044c \u044f \u0431\u0443\u0434\u0443 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0435\u0433\u043e \u0441\u043e \u0441\u0432\u043e\u0435\u0433\u043e Google Drive.<\/p>\n<p><a class=\"anchor\" name=\"dataset_download\" id=\"dataset_download\"><\/a><\/p>\n<h3>\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430<\/h3>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435\u0441\u044c \u043d\u0435 Google Colab, \u0432\u0430\u043c \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044c gdown:<\/p>\n<pre><code class=\"bash\">pip3 install gdown <\/code><\/pre>\n<p>\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u043c \u0430\u0440\u0445\u0438\u0432\u044b \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430:<\/p>\n<pre><code class=\"python\">%%capture # clear output !gdown \"https:\/\/drive.google.com\/uc?id=1--fNMFRXmBRDQPwdFqh54Sx7_RNE6z4a&amp;confirm=t\" # download image_RGB.zip !gdown \"https:\/\/drive.google.com\/uc?id=1-3y-bJK-QZapo3nwZEXdVLWDjkVO4AYN&amp;confirm=t\" # download label_15classes.zip<\/code><\/pre>\n<p>\u0418 \u0440\u0430\u0437\u0430\u0440\u0445\u0438\u0432\u0438\u0440\u0443\u0435\u043c \u0438\u0445:<\/p>\n<pre><code class=\"python\">%%capture !unzip image_RGB.zip !unzip label_15classes.zip<\/code><\/pre>\n<p><a class=\"anchor\" name=\"dataset_organization\" id=\"dataset_organization\"><\/a><\/p>\n<h3>\u041e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f<\/h3>\n<p>\u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u043d\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c \u0432\u0441\u0435\u043c\u0438 \u043f\u043e\u0434\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438, \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u0430\u0436\u0434\u043e\u0435 \u043a\u0430\u043a \u0444\u0430\u0439\u043b \u0438 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u043f\u043e\u0434\u0433\u0440\u0443\u0437\u043a\u0443. \u0421\u0434\u0435\u043b\u0430\u0435\u043c \u044d\u0442\u043e, \u043d\u043e \u043f\u0435\u0440\u0435\u0434 \u044d\u0442\u0438\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c\u0441\u044f \u0441 \u043a\u043b\u0430\u0441\u0441\u0430\u043c\u0438.<\/p>\n<p>\u0423\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430, \u043a\u0430\u043a \u0443\u0436\u0435 \u0431\u044b\u043b\u043e \u0441\u043a\u0430\u0437\u0430\u043d\u043e, \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e 15 \u043a\u043b\u0430\u0441\u0441\u0430\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u0418\u0445 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 readme.txt \u043d\u0430 <a href=\"https:\/\/whueducn-my.sharepoint.com\/:f:\/g\/personal\/xinyi_tong_whu_edu_cn\/El2LVTJPk3VAuL7_eENrZ68BLPDsJJvm80uYbwXABx5Wuw?e=GwePwA\/\" rel=\"noopener noreferrer nofollow\">OneDrive<\/a>:<\/p>\n<pre><code>label information of 15 classes: industrial land RGB:    200,    0,    0 urban residential RGB:    250,    0, 150 rural residential RGB:    200, 150, 150 traffic land RGB:    250, 150, 150 paddy field RGB:    0,     200,    0 irrigated land RGB:    150,  250,   0 ...<\/code><\/pre>\n<p>\u0418 \u0442\u0430\u043a-\u043a\u0430\u043a \u0432 \u0432\u044b\u0448\u0435\u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0438 \u0438 \u043e\u0431\u0443\u0447\u0430\u043b\u0438 \u0434\u043b\u044f \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0446\u0435\u043b\u0435\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430, \u0432\u044b\u0431\u0435\u0440\u0435\u043c \u043e\u0434\u0438\u043d \u0438\u0437 \u043d\u0438\u0445, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <em>Irrigated Land<\/em>: \u043e\u043d \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u0445 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430, \u0430 \u043f\u043e\u0442\u043e\u043c\u0443 \u0441 \u043d\u0438\u043c \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e. \u041d\u043e \u0442\u0430\u043a\u0436\u0435 \u0432\u0430\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u043a\u043b\u0430\u0441\u0441 \u2014 <em>Background<\/em>, \u0442\u0430\u043a-\u043a\u0430\u043a \u043e\u043d \u0432\u0430\u0436\u0435\u043d \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0438.<\/p>\n<p>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0441\u043b\u043e\u0432\u0430\u0440\u0438 \u0441 \u043a\u043b\u0430\u0441\u0441\u0430\u043c\u0438 \u2014 <code>classes<\/code> \u0438 <code>classes_by_id<\/code> (\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0434\u0430\u043b\u0435\u0435):<\/p>\n<pre><code class=\"python\">classes = {     (0, 0, 0): (0, '__background__'),     (150, 250, 0): (1, 'irrigated_land') }  classes_by_id = dict() for rgb, (id, name) in classes.items():   classes_by_id[id] = (rgb, name)<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0434\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u041d\u0430\u043f\u0438\u0448\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043f\u043e\u0434\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"python\">def get_subimages_generator(     image: Image.Image,     subimage_size: Tuple[int, int, int] ) -> Generator[Image.Image, None, None]:   for r in range(image.size[1] \/\/ subimage_size[1]):     for c in range(image.size[0] \/\/ subimage_size[0]):       yield image.crop(box=(               c * subimage_size[0],               r * subimage_size[1],               (c + 1) * subimage_size[0],               (r + 1) * subimage_size[1]           )       )<\/code><\/pre>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e dataset \u0441 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f\u043c\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u043f\u043e\u0434\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430 (\u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0438 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435):<\/p>\n<pre><code class=\"python\">!mkdir dataset dataset\/originals dataset\/labeleds<\/code><\/pre>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0432\u0441\u0435 \u043f\u043e\u0434\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u043f\u043e\u0434 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u043c\u0438 id (\u043e\u043d\u0438 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u043d\u0430\u043c \u0434\u0430\u043b\u0435\u0435). \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e \u043a\u0430\u0436\u0434\u044b\u043c \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043f\u043e\u0434\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c, \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u043f\u043e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u0430\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0432\u0435\u0442\u0430 \u0438, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c:<\/p>\n<pre><code class=\"python\">def save_dataset_subimages(classes_filter: Dict[Tuple[int, int, int], float]):    for i, filename in enumerate(listdir('image_RGB\/')):       basename = filename[:filename.find('.tif')]              image = Image.open(fp=f'image_RGB\/{basename}.tif').crop(box=(16, 40, 7200 - 16, 6800 - 40))       image_labeled = Image.open(fp=f'label_15classes\/{basename}_label.tif').crop(box=(16, 40, 7200 - 16, 6800 - 40))       subimages = get_subimages_generator(image=image, subimage_size=(224,224))       subimages_labeleds = get_subimages_generator(image=image_labeled, subimage_size=(224,224))        for si, subimage in enumerate(subimages):         subimage_labeled = next(subimages_labeleds)                  # classes filter         do_continue = False         subimage_labeled_colors_dict = {rgb: count for count, rgb in subimage_labeled.getcolors()}         for rgb, min_percent in classes_filter.items():           if rgb not in subimage_labeled_colors_dict \\               or subimage_labeled_colors_dict[rgb] * 100 \/ 50176 &lt; min_percent:               # 50176 = subimage width * subimage height             do_continue = True             break         if do_continue:           continue          subimage.save(fp=f'dataset\/originals\/i{i}si{si}.tif')         subimage_labeled.save(fp=f'dataset\/labeleds\/i{i}si{si}_labeled.tif')<\/code><\/pre>\n<p>\u0417\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u043c \u0435\u0435:<\/p>\n<pre><code class=\"python\">save_dataset_subimages(     classes_filter={         (150, 250, 0): 5     } )<\/code><\/pre>\n<p>\u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u043d\u0438\u0436\u0435 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u043c \u0443\u0437\u043d\u0430\u0442\u044c, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0441\u0435\u0433\u043e \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0445, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0438 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445, \u043f\u043e\u0434\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0431\u044b\u043b\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043e:<\/p>\n<pre><code class=\"python\">!ls -lR dataset\/originals\/*.tif | wc -l<\/code><\/pre>\n<p>\u0412\u0441\u0435\u0433\u043e \u0434\u043b\u044f \u0446\u0435\u043b\u0435\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 <em>Irrigated Land<\/em> \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043e 4166 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0445, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0438 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445, \u043f\u043e\u0434\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439.<\/p>\n<p><a class=\"anchor\" name=\"support_functions_and_dataset_class\" id=\"support_functions_and_dataset_class\"><\/a><\/p>\n<h3>\u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u043a\u043b\u0430\u0441\u0441 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430<\/h3>\n<p>\u0414\u043b\u044f \u043f\u043e\u0434\u0433\u0440\u0443\u0437\u043a\u0438 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0434\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u043a\u043b\u0430\u0441\u0441 \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0438\u0445 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0442\u0430\u043a, \u043a\u0430\u043a \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0443\u0434\u043e\u0431\u043d\u043e \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043c\u043e\u0434\u0435\u043b\u044c\u044e. \u0410 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0438 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0434\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u0432\u0438\u0434\u0435 \u0442\u0435\u043d\u0437\u043e\u0440\u043e\u0432 (\u0442\u0438\u043f\u0435 <code>torch.Tensor<\/code>), \u043f\u0440\u0438\u0447\u0435\u043c \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u043c\u043e\u0434\u0435\u043b\u0435\u0439, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 \u0434\u043b\u044f FCN.ResNet101, \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u044c \u0442\u0435\u043d\u0437\u043e\u0440\u043e\u0432 \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u0430\u0440\u0442\u0438\u0439 (batches): (batches, width, height, channels), \u0433\u0434\u0435 width, height \u0438 channels \u2014 \u0448\u0438\u0440\u0438\u043d\u0430, \u0432\u044b\u0441\u043e\u0442\u0430 \u0438 \u043a\u043e\u043b-\u0432\u043e \u043a\u0430\u043d\u0430\u043b\u043e\u0432 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u2014 224, 224 \u0438 3 (R, G, B) \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438, \u043e\u043d\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043e \u0435\u0449\u0435 \u0438 \u0432 \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u0438 (batches, classes, width, height), \u0433\u0434\u0435 classes \u2014 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u2014 2; \u0442\u043e \u0435\u0441\u0442\u044c \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u0437 \u0441\u0435\u0431\u044f \u043c\u0430\u0441\u043a\u0443, \u0433\u0434\u0435 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0441\u043a\u0430 224&#215;224, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 0 \u0438\u043b\u0438 1, \u043d\u0430 \u043a\u0430\u043a\u043e\u043c \u043f\u0438\u043a\u0441\u0435\u043b\u0435 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441, \u0430 \u043d\u0430 \u043a\u0430\u043a\u043e\u043c \u043d\u0435\u0442. \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u044d\u0442\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f (0 \u0438\u043b\u0438 1) \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043c\u0430\u0441\u043a\u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u043b\u044f \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0438 \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c, \u043e\u043f\u0435\u0440\u0438\u0440\u0443\u044f \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0442 0 \u0434\u043e 1.<\/p>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u043a\u043e\u0434\u0443. \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0447\u0442\u043e\u0431\u044b\u2026<\/p>\n<ul>\n<li>\n<p>\u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0434\u0432\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043f\u043e\u0434\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f (\u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0438 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435) \u043f\u043e \u0438\u0445 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u043c id, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u043f\u0440\u0438 \u0438\u0445 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0438:<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"python\">def get_dataset_subimage(dataset_subimage_id: str) -> Tuple[Image.Image, Image.Image]:    subimage = Image.open(fp=f'dataset\/originals\/{dataset_subimage_id}.tif')   subimage_labeled = Image.open(fp=f'dataset\/labeleds\/{dataset_subimage_id}_labeled.tif')    return subimage, subimage_labeled<\/code><\/pre>\n<ul>\n<li>\n<p>\u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043c\u0430\u0441\u043a\u0443 \u0438\u0437 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442:<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043c\u0441\u044f \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043f\u0438\u043a\u0441\u0435\u043b\u044e \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c \u043c\u0430\u0441\u043a\u0435 \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u043c\u0430\u0441\u043a\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 1.0, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c, \u0435\u0441\u043b\u0438 \u0434\u043b\u044f \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u043d\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043a\u043b\u0430\u0441\u0441\u0430, \u043e\u0442\u043d\u043e\u0441\u0438\u043c \u0435\u0433\u043e \u043a \u043a\u043b\u0430\u0441\u0441\u0443 <em>Background.<\/em> \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432 \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u044c\u044e <code>(classes, width, height)<\/code>:<\/p>\n<pre><code class=\"python\">def get_image_mask_from_labeled(     image_labeled: Image.Image,     classes: Dict[Tuple[int, int, int], Tuple[int, str]] ) -> np.ndarray:    image_mask = np.zeros(shape=(len(classes),image_labeled.size[0],image_labeled.size[1]))    image_labeled_ndarray = np.array(object=image_labeled)   for r in np.arange(stop=image_labeled_ndarray.shape[0]):     for c in np.arange(stop=image_labeled_ndarray.shape[1]):       class_rgb = tuple(image_labeled_ndarray[r][c])       class_value = classes.get(class_rgb)       if class_value != None:         image_mask[class_value[0]][r][c] = 1.0       else:         image_mask[0][r][c] = 1.0    return image_mask<\/code><\/pre>\n<p>\u0412\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432 \u0438\u0437 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0441 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u0441\u0440\u0435\u0434\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044f, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043f\u0438\u043a\u0441\u0435\u043b\u044e \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0446\u0432\u0435\u0442 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u043e\u043c. \u0422\u043e \u0435\u0441\u0442\u044c, \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432 \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u044c\u044e <code>(width, height, channels)<\/code>:<\/p>\n<pre><code class=\"python\">def get_image_labeled_from_mask(     image_mask: np.ndarray,     classes_by_id: Dict[Tuple[int, int, int], Tuple[int, str]] ) -> Image.Image:    image_labeled_ndarray = np.zeros(       shape=(image_mask.shape[1],image_mask.shape[2],3),       dtype=np.uint8   )    image_mask_hot =<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\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-346532","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/346532","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=346532"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/346532\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=346532"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=346532"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=346532"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}