deeplabv3+源码之慢慢解析29 第五章utils文件夹(4)ext_transforms.py--ExtResize类,ExtColorJitter类,Lambda类和Compose类

本文详细解析了deeplabv3项目的源码,涵盖主函数、数据集处理、评估、网络结构(包括多个backbone)、metrics、以及ext_transforms模块中的ExtResize、ExtColorJitter、Lambda和Compose类。

系列文章目录(共五章33节已完结)

第一章deeplabv3+源码之慢慢解析 根目录(1)main.py–get_argparser函数
第一章deeplabv3+源码之慢慢解析 根目录(2)main.py–get_dataset函数
第一章deeplabv3+源码之慢慢解析 根目录(3)main.py–validate函数
第一章deeplabv3+源码之慢慢解析 根目录(4)main.py–main函数
第一章deeplabv3+源码之慢慢解析 根目录(5)predict.py–get_argparser函数和main函数

第二章deeplabv3+源码之慢慢解析 datasets文件夹(1)voc.py–voc_cmap函数和download_extract函数
第二章deeplabv3+源码之慢慢解析 datasets文件夹(2)voc.py–VOCSegmentation类
第二章deeplabv3+源码之慢慢解析 datasets文件夹(3)cityscapes.py–Cityscapes类
第二章deeplabv3+源码之慢慢解析 datasets文件夹(4)utils.py–6个小函数

第三章deeplabv3+源码之慢慢解析 metrics文件夹stream_metrics.py–StreamSegMetrics类和AverageMeter类

第四章deeplabv3+源码之慢慢解析 network文件夹(1)backbone文件夹(a1)hrnetv2.py–4个函数和可执行代码
第四章deeplabv3+源码之慢慢解析 network文件夹(1)backbone文件夹(a2)hrnetv2.py–Bottleneck类和BasicBlock类
第四章deeplabv3+源码之慢慢解析 network文件夹(1)backbone文件夹(a3)hrnetv2.py–StageModule类
第四章deeplabv3+源码之慢慢解析 network文件夹(1)backbone文件夹(a4)hrnetv2.py–HRNet类
第四章deeplabv3+源码之慢慢解析 network文件夹(1)backbone文件夹(b1)mobilenetv2.py–2个类和2个函数
第四章deeplabv3+源码之慢慢解析 network文件夹(1)backbone文件夹(b2)mobilenetv2.py–MobileNetV2类和mobilenet_v2函数
第四章deeplabv3+源码之慢慢解析 network文件夹(1)backbone文件夹(c1)resnet.py–2个基础函数,BasicBlock类和Bottleneck类
第四章deeplabv3+源码之慢慢解析 network文件夹(1)backbone文件夹(c2)resnet.py–ResNet类和10个不同结构的调用函数
第四章deeplabv3+源码之慢慢解析 network文件夹(1)backbone文件夹(d1)xception.py–SeparableConv2d类和Block类
第四章deeplabv3+源码之慢慢解析 network文件夹(1)backbone文件夹(d2)xception.py–Xception类和xception函数
第四章deeplabv3+源码之慢慢解析 network文件夹(2)_deeplab.py–ASPP相关的4个类和1个函数
第四章deeplabv3+源码之慢慢解析 network文件夹(3)_deeplab.py–DeepLabV3类,DeepLabHeadV3Plus类和DeepLabHead类
第四章deeplabv3+源码之慢慢解析 network文件夹(4)modeling.py–5个私有函数(4个骨干网,1个模型载入)
第四章deeplabv3+源码之慢慢解析 network文件夹(5)modeling.py–12个调用函数
第四章deeplabv3+源码之慢慢解析 network文件夹(6)utils.py–_SimpleSegmentationModel类和IntermediateLayerGetter类

第五章deeplabv3+源码之慢慢解析 utils文件夹(1)ext_transforms.py.py–2个翻转类和ExtCompose类
第五章deeplabv3+源码之慢慢解析 utils文件夹(2)ext_transforms.py.py–2个裁剪类和2个缩放类
第五章deeplabv3+源码之慢慢解析 utils文件夹(3)ext_transforms.py.py–旋转类,填充类,张量转化类和标准化类
第五章deeplabv3+源码之慢慢解析 utils文件夹(4)ext_transforms.py.py–ExtResize类,ExtColorJitter类,Lambda类和Compose类
第五章deeplabv3+源码之慢慢解析 utils文件夹(5)loss.py–FocalLoss类
第五章deeplabv3+源码之慢慢解析 utils文件夹(6)scheduler.py–PolyLR类
第五章deeplabv3+源码之慢慢解析 utils文件夹(7)utils.py–去标准化,momentum设定,标准化层锁定和路径创建
第五章deeplabv3+源码之慢慢解析 utils文件夹(8)visualizer.py–Visualizer类(完结)


说明

提示:本节介绍ext_transforms.py中的ExtResize类,ExtColorJitter类,Lambda类和Compose类。

尺寸调整 ExtResize类

class ExtResize(object):  #重调尺寸。如果size=(h,w)则直接使用。如果size=a,则图像短边=a,长边按原来的宽高比进行调整。
    """Resize the input PIL Image to the given size.
    Args:
        size (sequence or int): Desired output size. If size is a sequence like
            (h, w), output size will be matched to this. If size is an int,
            smaller edge of the image will be matched to this number.
            i.e, if height > width, then image will be rescaled to
            (size * height / width, size)
        interpolation (int, optional): Desired interpolation. Default is
            ``PIL.Image.BILINEAR``
    """

    def __init__(self, size, interpolation=Image.BILINEAR):
        assert isinstance(size, int) or (isinstance(size, collections.Iterable) and len(size) == 2)
        self.size = size
        self.interpolation = interpolation

    def __call__(self, img, lbl):
        """
        Args:
            img (PIL Image): Image to be scaled.
        Returns:
            PIL Image: Rescaled image.
        """
        return F.resize(img, self.size, self.interpolation), F.resize(lbl, self.size, Image.NEAREST) #直接调用F.resize函数。

    def __repr__(self):
        interpolate_str = _pil_interpolation_to_str[self.interpolation]
        return self.__class__.__name__ + '(size={0}, interpolation={1})'.format(self.size, interpolate_str) 

颜色微调 ExtColorJitter类

class ExtColorJitter(object): #随机改变图片的亮度,对比度和饱和度,还有色调。
    """Randomly change the brightness, contrast and saturation of an image. 
    Args:
        brightness (float or tuple of float (min, max)): How much to jitter brightness.
            brightness_factor is chosen uniformly from [max(0, 1 - brightness), 1 + brightness]
            or the given [min, max]. Should be non negative numbers.
        contrast (float or tuple of float (min, max)): How much to jitter contrast.
            contrast_factor is chosen uniformly from [max(0, 1 - contrast), 1 + contrast]
            or the given [min, max]. Should be non negative numbers.
        saturation (float or tuple of float (min, max)): How much to jitter saturation.
            saturation_factor is chosen uniformly from [max(0, 1 - saturation), 1 + saturation]
            or the given [min, max]. Should be non negative numbers.
        hue (float or tuple of float (min, max)): How much to jitter hue.
            hue_factor is chosen uniformly from [-hue, hue] or the given [min, max].
            Should have 0<= hue <= 0.5 or -0.5 <= min <= max <= 0.5.
    """
    def __init__(self, brightness=0, contrast=0, saturation=0, hue=0):
        self.brightness = self._check_input(brightness, 'brightness')  #亮度
        self.contrast = self._check_input(contrast, 'contrast')       #对比度
        self.saturation = self._check_input(saturation, 'saturation')  #饱和度
        self.hue = self._check_input(hue, 'hue', center=0, bound=(-0.5, 0.5),
                                     clip_first_on_zero=False)   #色调

    def _check_input(self, value, name, center=1, bound=(0, float('inf')), clip_first_on_zero=True):
        if isinstance(value, numbers.Number):
            if value < 0:
                raise ValueError("If {} is a single number, it must be non negative.".format(name))
            value = [center - value, center + value] #取值范围value在center附近
            if clip_first_on_zero:
                value[0] = max(value[0], 0)
        elif isinstance(value, (tuple, list)) and len(value) == 2: #如果是tuple或者list,且长度为2,即输入是个大小值范围。
            if not bound[0] <= value[0] <= value[1] <= bound[1]: #value的大小范围不能超过bound的大小范围。
                raise ValueError("{} values should be between {}".format(name, bound))
        else:
            raise TypeError("{} should be a single number or a list/tuple with lenght 2.".format(name))

        # if value is 0 or (1., 1.) for brightness/contrast/saturation
        # or (0., 0.) for hue, do nothing
        if value[0] == value[1] == center: #如果波动为0,则value=None
            value = None
        return value

    @staticmethod
    def get_params(brightness, contrast, saturation, hue):
        """Get a randomized transform to be applied on image.
        Arguments are same as that of __init__.
        Returns:
            Transform which randomly adjusts brightness, contrast and
            saturation in a random order.
        """
        transforms = []

        if brightness is not None:
            brightness_factor = random.uniform(brightness[0], brightness[1]) #在brightness[0]和brightness[1]之间随机选择brightness_factor。
            transforms.append(Lambda(lambda img: F.adjust_brightness(img, brightness_factor)))  #调用F.adjust_brightness调整亮度。

        if contrast is not None:    #同上,调整对比度
            contrast_factor = random.uniform(contrast[0], contrast[1])
            transforms.append(Lambda(lambda img: F.adjust_contrast(img, contrast_factor)))

        if saturation is not None: #同上,调整饱和度
            saturation_factor = random.uniform(saturation[0], saturation[1])
            transforms.append(Lambda(lambda img: F.adjust_saturation(img, saturation_factor)))

        if hue is not None:  #同上,调整色度
            hue_factor = random.uniform(hue[0], hue[1])
            transforms.append(Lambda(lambda img: F.adjust_hue(img, hue_factor)))

        random.shuffle(transforms)  #重调transforms的顺序。
        transform = Compose(transforms)  #即新的转化操作组合。

        return transform

    def __call__(self, img, lbl):
        """
        Args:
            img (PIL Image): Input image.
        Returns:
            PIL Image: Color jittered image.
        """
        transform = self.get_params(self.brightness, self.contrast,
                                    self.saturation, self.hue)  #得到转换操作。
        return transform(img), lbl     #对输入img进行转换操作,标签不变。

    def __repr__(self):
        format_string = self.__class__.__name__ + '('
        format_string += 'brightness={0}'.format(self.brightness)
        format_string += ', contrast={0}'.format(self.contrast)
        format_string += ', saturation={0}'.format(self.saturation)
        format_string += ', hue={0})'.format(self.hue)
        return format_string

自定义功能 Lambda类

class Lambda(object):  #自定义lambda转换功能,调用使用。供ExtColorJitter类调用。
    """Apply a user-defined lambda as a transform.
    Args:
        lambd (function): Lambda/function to be used for transform.
    """

    def __init__(self, lambd):
        assert callable(lambd), repr(type(lambd).__name__) + " object is not callable"
        self.lambd = lambd

    def __call__(self, img):
        return self.lambd(img)

    def __repr__(self):
        return self.__class__.__name__ + '()'

功能组合 Compose类

class Compose(object):  #多操作组合,与ExtCompose不同,只对输入的img进行操作。供ExtColorJitter类调用。
    """Composes several transforms together.
    Args:
        transforms (list of ``Transform`` objects): list of transforms to compose.
    Example:
        >>> transforms.Compose([
        >>>     transforms.CenterCrop(10),
        >>>     transforms.ToTensor(),
        >>> ])
    """

    def __init__(self, transforms):
        self.transforms = transforms

    def __call__(self, img):
        for t in self.transforms:
            img = t(img)
        return img

    def __repr__(self):
        format_string = self.__class__.__name__ + '('
        for t in self.transforms:
            format_string += '\n'
            format_string += '    {0}'.format(t)
        format_string += '\n)'
        return format_string

Tips

  1. Lambda类和Compose类是为ExtColorJitter类服务的。至此,ext_transforms.py内容结束。
  2. 下一个节介绍loss.py中的内容。
C:\Users\15444\AppData\Local\Programs\Python\Python311\Scripts>pip install GDAL Collecting GDAL Using cached gdal-3.11.3.tar.gz (878 kB) Installing build dependencies ... done Getting requirements to build wheel ... done Preparing metadata (pyproject.toml) ... done Building wheels for collected packages: GDAL Building wheel for GDAL (pyproject.toml) ... error error: subprocess-exited-with-error × Building wheel for GDAL (pyproject.toml) did not run successfully. │ exit code: 1 ╰─> [130 lines of output] C:\Users\15444\AppData\Local\Temp\pip-build-env-hy1ff_ep\overlay\Lib\site-packages\setuptools\config\_apply_pyprojecttoml.py:82: SetuptoolsWarning: `license` overwritten by `pyproject.toml` corresp(dist, value, root_dir) C:\Users\15444\AppData\Local\Temp\pip-build-env-hy1ff_ep\overlay\Lib\site-packages\setuptools\config\_apply_pyprojecttoml.py:82: SetuptoolsWarning: `extras_require` overwritten in `pyproject.toml` (optional-dependencies) corresp(dist, value, root_dir) Using numpy 2.3.1 running bdist_wheel running build running build_py creating build\lib.win-amd64-cpython-311\osgeo copying osgeo\gdal.py -> build\lib.win-amd64-cpython-311\osgeo copying osgeo\gdalconst.py -> build\lib.win-amd64-cpython-311\osgeo copying osgeo\gdalnumeric.py -> build\lib.win-amd64-cpython-311\osgeo copying osgeo\gdal_array.py -> build\lib.win-amd64-cpython-311\osgeo copying osgeo\gdal_fsspec.py -> build\lib.win-amd64-cpython-311\osgeo copying osgeo\gnm.py -> build\lib.win-amd64-cpython-311\osgeo copying osgeo\ogr.py -> build\lib.win-amd64-cpython-311\osgeo copying osgeo\osr.py -> build\lib.win-amd64-cpython-311\osgeo copying osgeo\__init__.py -> build\lib.win-amd64-cpython-311\osgeo creating build\lib.win-amd64-cpython-311\osgeo_utils copying gdal-utils\osgeo_utils\gdal2tiles.py -> build\lib.win-amd64-cpython-311\osgeo_utils copying gdal-utils\osgeo_utils\gdal2xyz.py -> build\lib.win-amd64-cpython-311\osgeo_utils copying gdal-utils\osgeo_utils\gdalattachpct.py -> build\lib.win-amd64-cpython-311\osgeo_utils copying gdal-utils\osgeo_utils\gdalcompare.py -> build\lib.win-amd64-cpython-311\osgeo_utils copying gdal-utils\osgeo_utils\gdalmove.py -> build\lib.win-amd64-cpython-311\osgeo_utils copying gdal-utils\osgeo_utils\gdal_calc.py -> build\lib.win-amd64-cpython-311\osgeo_utils copying gdal-utils\osgeo_utils\gdal_edit.py -> build\lib.win-amd64-cpython-311\osgeo_utils copying gdal-utils\osgeo_utils\gdal_fillnodata.py -> build\lib.win-amd64-cpython-311\osgeo_utils copying gdal-utils\osgeo_utils\gdal_merge.py -> build\lib.win-amd64-cpython-311\osgeo_utils copying gdal-utils\osgeo_utils\gdal_pansharpen.py -> build\lib.win-amd64-cpython-311\osgeo_utils copying gdal-utils\osgeo_utils\gdal_polygonize.py -> build\lib.win-amd64-cpython-311\osgeo_utils copying gdal-utils\osgeo_utils\gdal_proximity.py -> build\lib.win-amd64-cpython-311\osgeo_utils copying gdal-utils\osgeo_utils\gdal_retile.py -> build\lib.win-amd64-cpython-311\osgeo_utils copying gdal-utils\osgeo_utils\gdal_sieve.py -> build\lib.win-amd64-cpython-311\osgeo_utils copying gdal-utils\osgeo_utils\ogrmerge.py -> build\lib.win-amd64-cpython-311\osgeo_utils copying gdal-utils\osgeo_utils\ogr_layer_algebra.py -> build\lib.win-amd64-cpython-311\osgeo_utils copying gdal-utils\osgeo_utils\pct2rgb.py -> build\lib.win-amd64-cpython-311\osgeo_utils copying gdal-utils\osgeo_utils\rgb2pct.py -> build\lib.win-amd64-cpython-311\osgeo_utils copying gdal-utils\osgeo_utils\__init__.py -> build\lib.win-amd64-cpython-311\osgeo_utils creating build\lib.win-amd64-cpython-311\osgeo_utils\auxiliary copying gdal-utils\osgeo_utils\auxiliary\array_util.py -> build\lib.win-amd64-cpython-311\osgeo_utils\auxiliary copying gdal-utils\osgeo_utils\auxiliary\base.py -> build\lib.win-amd64-cpython-311\osgeo_utils\auxiliary copying gdal-utils\osgeo_utils\auxiliary\batch_creator.py -> build\lib.win-amd64-cpython-311\osgeo_utils\auxiliary copying gdal-utils\osgeo_utils\auxiliary\color_palette.py -> build\lib.win-amd64-cpython-311\osgeo_utils\auxiliary copying gdal-utils\osgeo_utils\auxiliary\color_table.py -> build\lib.win-amd64-cpython-311\osgeo_utils\auxiliary copying gdal-utils\osgeo_utils\auxiliary\extent_util.py -> build\lib.win-amd64-cpython-311\osgeo_utils\auxiliary copying gdal-utils\osgeo_utils\auxiliary\gdal_argparse.py -> build\lib.win-amd64-cpython-311\osgeo_utils\auxiliary copying gdal-utils\osgeo_utils\auxiliary\numpy_util.py -> build\lib.win-amd64-cpython-311\osgeo_utils\auxiliary copying gdal-utils\osgeo_utils\auxiliary\osr_util.py -> build\lib.win-amd64-cpython-311\osgeo_utils\auxiliary copying gdal-utils\osgeo_utils\auxiliary\progress.py -> build\lib.win-amd64-cpython-311\osgeo_utils\auxiliary copying gdal-utils\osgeo_utils\auxiliary\raster_creation.py -> build\lib.win-amd64-cpython-311\osgeo_utils\auxiliary copying gdal-utils\osgeo_utils\auxiliary\rectangle.py -> build\lib.win-amd64-cpython-311\osgeo_utils\auxiliary copying gdal-utils\osgeo_utils\auxiliary\util.py -> build\lib.win-amd64-cpython-311\osgeo_utils\auxiliary copying gdal-utils\osgeo_utils\auxiliary\__init__.py -> build\lib.win-amd64-cpython-311\osgeo_utils\auxiliary creating build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\assemblepoly.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\build_jp2_from_xml.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\classify.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\crs2crs2grid.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\densify.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\dump_jp2.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\epsg_tr.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\esri2wkt.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\fft.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\fix_gpkg.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\gcps2ogr.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\gcps2vec.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\gcps2wld.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\gdal2grd.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\gdalbuildvrtofvrt.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\gdalchksum.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\gdalcopyproj.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\gdalfilter.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\gdalident.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\gdalimport.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\gdalinfo.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\gdallocationinfo.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\gdal_auth.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\gdal_cp.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\gdal_create_pdf.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\gdal_ls.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\gdal_lut.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\gdal_minmax_location.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\gdal_mkdir.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\gdal_remove_towgs84.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\gdal_rm.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\gdal_rmdir.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\gdal_vrtmerge.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\get_soundg.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\histrep.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\hsv_merge.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\jpeg_in_tiff_extract.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\load2odbc.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\loslas2ntv2.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\magphase.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\make_fuzzer_friendly_archive.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\mkgraticule.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\ogr2vrt.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\ogrinfo.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\ogrupdate.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\ogr_build_junction_table.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\ogr_dispatch.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\rel.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\tigerpoly.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\tile_extent_from_raster.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\tolatlong.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\validate_cloud_optimized_geotiff.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\validate_geoparquet.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\validate_gpkg.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\validate_jp2.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\val_repl.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\vec_tr.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\vec_tr_spat.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\wcs_virtds_params.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples copying gdal-utils\osgeo_utils\samples\__init__.py -> build\lib.win-amd64-cpython-311\osgeo_utils\samples running egg_info writing gdal-utils\GDAL.egg-info\PKG-INFO writing dependency_links to gdal-utils\GDAL.egg-info\dependency_links.txt writing entry points to gdal-utils\GDAL.egg-info\entry_points.txt writing requirements to gdal-utils\GDAL.egg-info\requires.txt writing top-level names to gdal-utils\GDAL.egg-info\top_level.txt reading manifest file &#39;gdal-utils\GDAL.egg-info\SOURCES.txt&#39; writing manifest file &#39;gdal-utils\GDAL.egg-info\SOURCES.txt&#39; running build_ext building &#39;osgeo._gdal&#39; extension building &#39;osgeo._gnm&#39; extension building &#39;osgeo._ogr&#39; extension building &#39;osgeo._osr&#39; extension building &#39;osgeo._gdalconst&#39; extension building &#39;osgeo._gdal_array&#39; extension error: Microsoft Visual C++ 14.0 or greater is required. Get it with "Microsoft C++ Build Tools": https://visualstudio.microsoft.com/visual-cpp-build-tools/ [end of output] note: This error originates from a subprocess, and is likely not a problem with pip. ERROR: Failed building wheel for GDAL Failed to build GDAL ERROR: Failed to build installable wheels for some pyproject.toml based projects (GDAL)
最新发布
07-23
<think>我们正在处理一个关于在Windows上使用pip安装GDAL包时遇到编译错误的问题。错误信息明确指出需要Microsoft Visual C++ 14.0或更高版本(即VC++ 2015或更高版本)的构建工具。 根据引用[1]、[2]、[3]、[4],我们可以总结出以下解决方案: ### 解决方案步骤: 1. **安装Microsoft Visual C++ Build Tools**: - 访问 [Microsoft C++ Build Tools](https://visualstudio.microsoft.com/visual-cpp-build-tools/) 下载页面。 - 下载并运行安装程序。 - 在安装过程中,选择“C++ 生成工具”工作负载(Workload),并确保选中以下组件: - “Windows 10 SDK”(根据你的Windows版本选择,通常选择最新版本或与你的系统兼容的版本) - “MSVC v140 - VS 2015 C++ 生成工具(v14.00)”(或更高版本,如v141、v142等) - 注意:虽然错误提示要求VC++14.0(即2015),但安装更新的版本(如2017、2019、2022)通常也兼容,因为它们包含向后兼容的库。 2. **重启计算机**: - 安装完成后,建议重启计算机,以确保环境变量路径更新生效。 3. **重新安装GDAL**: - 打开命令提示符(CMD)或PowerShell,并尝试重新安装GDAL: ```bash pip install GDAL ``` - 如果仍然遇到问题,可以尝试指定GDAL的版本(有时特定版本可能更容易安装): ```bash pip install GDAL==<version> ``` 例如,安装3.4.1版本: ```bash pip install GDAL==3.4.1 ``` 4. **替代方法:使用预编译的二进制包**: - 如果不想安装庞大的Visual Studio Build Tools,可以尝试安装预编译的GDAL二进制包。推荐从[Christoph Gohlke的非官方Windows二进制包](https://www.lfd.uci.edu/~gohlke/pythonlibs/#gdal)下载对应版本的GDAL wheel文件。 - 下载后,使用pip安装该wheel文件。例如,如果你下载的是`GDAL‑3.4.1‑cp39‑cp39‑win_amd64.whl`(对应Python 3.964位系统),则运行: ```bash pip install GDAL‑3.4.1‑cp39‑cp39‑win_amd64.whl ``` ### 注意事项: - 确保安装的构建工具版本与Python版本兼容。例如,如果你使用的是Python 3.5到3.8,通常需要VC++14.0(即2015)或更高版本。对于Python 3.9及以上,需要VC++14.22019)或更高版本[^4]。 - 如果你已经安装了Visual Studio(2015、2017、2019、2022),则可能已经包含了所需的构建工具,只需确保在安装时选择了C++开发组件。 ### 引用说明: 以上解决方案参考了多个来源,特别是引用[3]中提到的使用Microsoft Build Tools for Visual Studio的安装方法,以及引用[4]中关于错误信息的描述。同时,引用[1][2]也提供了似的问题描述解决方案。 ### 相关问题: 1. 如何验证Microsoft Visual C++ Build Tools是否已正确安装? 2. 除了安装构建工具,还有哪些方法可以解决Python包安装时的编译错误? 3. 在Windows上安装需要编译的Python包时,有哪些最佳实践?</think>### 解决 GDAL 安装报错:Microsoft Visual C++ 14.0 or greater is required #### 问题原因分析 该错误表明 GDAL 包包含 C/C++ 编写的组件,安装时需要 **Microsoft Visual C++ 编译器**(版本 ≥14.0)。Windows 上的 Python 包通常依赖此工具链编译原生代码[^1][^2][^3][^4]。 #### 完整解决方案 **1. 安装 Microsoft C++ 生成工具**(推荐) ```bash # 步骤: 1. 访问官方下载页:https://visualstudio.microsoft.com/visual-cpp-build-tools/ 2. 下载并运行安装程序 3. 勾选以下组件: - [√] "C++ 生成工具"(核心组件) - [√] "Windows 10 SDK"(或最新版) - [√] "MSVC v140/v142 生成工具"(对应 VS2015/VS2019) 4. 点击安装(约 4-8GB 空间) 5. 重启系统使环境生效 ``` **2. 验证编译器安装** ```bash # 在CMD执行: cl.exe # 若显示 "Microsoft (R) C/C++ Optimizing Compiler..." 表示成功 ``` **3. 重新安装 GDAL** ```bash # 在管理员权限的CMD中执行: pip install GDAL --no-cache-dir # 若版本冲突可指定版本(推荐): pip install GDAL==3.6.2 # 2023年稳定版 ``` #### 替代方案(无需编译) **使用预编译的 GDAL 轮子(.whl):** 1. 访问 [Unofficial Windows Binaries](https://www.lfd.uci.edu/~gohlke/pythonlibs/#gdal) 2. 下载对应版本的 .whl 文件(如 `GDAL‑3.6.2‑cp311‑cp311‑win_amd64.whl`) 3. 直接安装: ```bash pip install GDAL‑3.6.2‑cp311‑cp311‑win_amd64.whl ``` #### 验证安装 ```python # Python 终端测试 import gdal print(gdal.__version__) # 应输出如 "3.6.2" ``` #### 注意事项 1. 确保 Python 架构(32/64位)与 C++ 工具链匹配 2. 若使用 Anaconda,可尝试: ```bash conda install -c conda-forge gdal # 自动处理依赖 ``` 3. 安装后若仍有问题,检查环境变量是否包含: - `C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.xx.x\bin\Hostx64\x64` > 注:完整安装 C++ 生成工具约需 5GB 空间,但可解决大多数 Python 包的编译依赖问题[^3][^4]。 --- ### 相关问题 1. **如何检查已安装的 Microsoft Visual C++ 版本?** - 通过控制面板 → 程序与功能 → 查看 Microsoft Visual C++ 20xx Redistributable 列表 2. **为什么 Conda 安装 GDAL 不需要 C++ 编译器?** - Conda 直接提供预编译的二进制包,避免本地编译过程[^3] 3. **安装 C++ 生成工具后仍报错的可能原因?** - Python 与编译器架构不匹配(如 32Python + 64 位编译器) - 未重启系统导致环境变量未更新 - 未正确勾选 Windows SDK 组件 4. **哪些常见 Python 包需要 C++ 编译工具?** - 科学计算:`GDAL`、`Cartopy`、`Pyproj` - 加速模块:`Scipy`、`Numba`、`Cython` - 数据库驱动:`MySQL-python`、`psycopg2`
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值