引言

赛题介绍

遥感技术已成为获取地表覆盖信息最为行之有效的手段,遥感技术已经成功应用于地表覆盖检测、植被面积检测和建筑物检测任务。本赛题使用航拍数据,需要参赛选手完成地表建筑物识别,将地表航拍图像素划分为有建筑物和无建筑物两类。
赛题数据来源(Inria Aerial Image Labeling),并进行拆分处理。数据集报名后可见并可下载。赛题数据为航拍图,需要参赛选手识别图片中的地表建筑具体像素位置。

  • train_mask.csv:存储图片的标注的rle编码;
  • train和test文件夹:存储训练集和测试集图片;

链接:https://tianchi.aliyun.com/competition/entrance/531872/information

关于RLE算法:

RLE压缩算法(下简称RLE算法)的基本思路是把数据按照线性序列分成两种情况:一种是连续的重复数据块,另一种是连续的不重复数据块。

RLE算法的原理就是用一个表示块数的属性加上一个数据块代表原来连续的若干块数据,从而达到节省存储空间的目的。一般RLE算法都选择数据块的长度为 1 字节,表示块数的诚性也用1字节表示,对于颜色数小于 256 色的图像文件或文本文件,块长度选择 1 字节是比较合适的。

链接:http://data.biancheng.net/view/152.html

评估标准

赛题使用Dice coefficient来衡量选手结果与真实标签的差异性,Dice coefficient可以按像素差异性来比较结果的差异性。Dice coefficient的具体计算方式如下:

2 ∗ ∣ X ∩ Y ∣ ∣ X ∣ + ∣ Y ∣ \frac{2 * \left | X \cap Y \right |}{\left | X \right | + \left | Y \right |} ∣X∣+∣Y∣2∗∣X∩Y∣​

其中 X X X是预测结果, Y Y Y为真实标签的结果。当 X X X与 Y Y Y完全相同时Dice coefficient为1,排行榜使用所有测试集图片的平均Dice coefficient来衡量,分数值越大越好。

数据处理

本次需要处理的数据格式为:

FileName Size 含义
test_a.zip 314.49MB 测试集A榜图片
test_a_samplesubmit.csv 46.39KB 测试集A榜提交样例
train.zip 3.68GB 训练集图片
train_mask.csv.zip 97.52MB 训练集图片标注

解压后分析train_mask是一个csv文件,可以读取查看:

train_mask = pd.read_csv('train_mask.csv', sep='\t', names=['name', 'mask'])
train_mask.head()"""
name    mask
0   train/KWP8J3TRSV.jpg    1 33 82 125 292 254 594 125 804 254 1106 125 1...
1   train/DKI3X4VFD3.jpg    NaN
2   train/AYPOE51XNI.jpg    NaN
3   train/1D9V7N0DGF.jpg    135016 4 135527 8 136039 12 136551 15 137062 2...
4   train/AWXXR4VYRI.jpg    301 53 504 9 812 54 1016 9 1324 54 1528 9 1836...
"""

然后我们发现有很多的mask是空的,也就是说没有标注,那么针对DKI3X4VFD3还有AYPOE51XNI图片打开后,能看到图片是一片森林,确实没有建筑物,但不清楚是不是全部都没有,因为时间不多,所以这里简单做处理,直接留空,不然imread会报错:

dataset = TianChiDataset(train_mask['name'].values,train_mask['mask'].fillna('').values,trfm, False
)

而关于RLE编码的方法,赛题有提供python方法为:

import numpy as np
import pandas as pd
import cv2# 将图片编码为rle格式
def rle_encode(im):'''im: numpy array, 1 - mask, 0 - backgroundReturns run length as string formated'''pixels = im.flatten(order = 'F')pixels = np.concatenate([[0], pixels, [0]])runs = np.where(pixels[1:] != pixels[:-1])[0] + 1runs[1::2] -= runs[::2]return ' '.join(str(x) for x in runs)# 将rle格式进行解码为图片
def rle_decode(mask_rle, shape=(512, 512)):'''mask_rle: run-length as string formated (start length)shape: (height,width) of array to return Returns numpy array, 1 - mask, 0 - background'''s = mask_rle.split()starts, lengths = [np.asarray(x, dtype=int) for x in (s[0:][::2], s[1:][::2])]starts -= 1ends = starts + lengthsimg = np.zeros(shape[0]*shape[1], dtype=np.uint8)for lo, hi in zip(starts, ends):img[lo:hi] = 1return img.reshape(shape, order='F')读取样例:train_mask = pd.read_csv('train_mask.csv', sep='\t', names=['name', 'mask'])# 读取第一张图,并将对于的rle解码为mask矩阵
img = cv2.imread('train/'+ train_mask['name'].iloc[0])
mask = rle_decode(train_mask['mask'].iloc[0])print(rle_encode(mask) == train_mask['mask'].iloc[0])
# 结果为True

那拿到了真正的图片,这里基本上跳过了数据处理,可以直接进入数据扩增,这里基础的扩增方法,我在之前的pytorch部分已经基本都写了,这里主要介绍的是albumentations:

albumentations数据扩增

albumentations是基于OpenCV的快速训练数据增强库,拥有非常简单且强大的可以用于多种任务(分割、检测)的接口,易于定制且添加其他框架非常方便。

它的特点是:

  • 基于高度优化的 OpenCV 库实现图像快速数据增强.
  • 针对不同图像任务,如分割,检测等,超级简单的 API 接口.
  • 易于个性化定制.
  • 易于添加到其它框架,比如 PyTorch.

albumentations它可以对数据集进行逐像素的转换,如模糊、下采样、高斯造点、高斯模糊、动态模糊、RGB转换、随机雾化等;也可以进行空间转换(同时也会对目标进行转换),如裁剪、翻转、随机裁剪等。

随机裁剪为:

# 随机裁剪
augments = A.RandomCrop(p=1, height=256, width=256)(image=img, mask=mask)
img_aug, mask_aug = augments['image'], augments['mask']x, y = np.random.randint(0, 256), np.random.randint(0, 256)plt.figure(figsize=(16, 8))
plt.subplot(1, 2, 1)
plt.imshow(img_aug[x:x+256, y:y+256])plt.subplot(1, 2, 2)
plt.imshow(mask_aug[x:x+256, y:y+256])


所用的扩增方式为:

class TianChiDataset(D.Dataset):def __init__(self, paths, rles, transform, test_mode=False):self.paths = pathsself.rles = rlesself.transform = transformself.test_mode = test_modeself.len = len(paths)self.as_tensor = T.Compose([T.ToPILImage(),T.Resize(IMAGE_SIZE),T.ToTensor(),T.Normalize([0.625, 0.448, 0.688],[0.131, 0.177, 0.101]),])# get data operationdef __getitem__(self, index):img = cv2.imread(self.paths[index])if not self.test_mode:mask = rle_decode(self.rles[index])augments = self.transform(image=img, mask=mask)return self.as_tensor(augments['image']), augments['mask'][None]else:return self.as_tensor(img), ''        def __len__(self):"""Total number of samples in the dataset"""return self.len

关于归一化参数比较合适的值我只看到两组,第一组是上面的参数,第二组为(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225)),,不清楚这两种对准确率有什么影响,之后看情况会抛下试试,然后就能按照baseline里的用FCN ret50做骨干网络进行训练了:

模型优化(02/23——)

如果按照baseline的提交,大概能到0.77的分数,那提分的方式也和md写得一样,无非就是从模型还有训练集以及训练次数来进行分析,那这部分主要从模型优化来进行重新考虑分析:

说明:

因为赛题需要实现的是对图像的分割,为二分类问题,因此我们主要的代码逻辑如下:

  1. 读入数据集和标签, 进行数据增强
  2. 预编译一个loss函数为binary_crossentropy的Unet模型,或者直接从公共模型里选取
  3. 使用数据和标签对Unet进行训练, 将训练好的模型进行保存
  4. 加载模型进行预测和图片生成,并保存结果

这题的数据处理非常简单,可不排除原始数据存在一定情况的问题,在论坛里看到了有选手提出了数据标注有存在遗漏与不正确的地方,证实了我在数据处理的猜想,可能这个量级会有点多,不过目前只能看做是干扰,虽然我感觉可以用一些方法除去,比如图片做一个霍夫变换后提取iou比对,之后有时间再想想这种问题,在写这篇博客期间还有其它事情与赛题,只能说都玩玩,长长见识,而且按baseline来讲也并不需要如何担心。

数据增强

这里还是回头在介绍下albumentations,它支持所有常见的计算机视觉任务,例如分类,语义分割,实例分割,对象检测和姿势估计。在GitHub上有albumentations的benchmark,基本上对于对于数据增强的优化算目前最快的:

而它的api也算是最多的了:

>>> import albumentations as A
>>> dir(A)
['BasicIAATransform', 'BasicTransform', 'BboxParams', 'BboxProcessor', 'Blur', 'CLAHE', 'CenterCrop', 'ChannelDropout', 'ChannelShuffle', 'CoarseDropout', 'ColorJitter', 'Compose', 'Crop', 'CropNonEmptyMaskIfExists', 'Cutout', 'Downscale', 'DualIAATransform', 'DualTransform', 'ElasticTransform', 'Equalize', 'FDA', 'FancyPCA', 'Flip', 'FromFloat', 'GaussNoise', 'GaussianBlur', 'GlassBlur', 'GridDistortion', 'GridDropout', 'HistogramMatching', 'HorizontalFlip', 'HueSaturationValue', 'IAAAdditiveGaussianNoise', 'IAAAffine', 'IAACropAndPad', 'IAAEmboss', 'IAAFliplr', 'IAAFlipud', 'IAAPerspective', 'IAAPiecewiseAffine', 'IAASharpen', 'IAASuperpixels', 'ISONoise', 'ImageCompression', 'ImageOnlyIAATransform', 'ImageOnlyTransform', 'InvertImg', 'JpegCompression', 'KeypointParams', 'KeypointsProcessor', 'Lambda', 'LongestMaxSize', 'MAX_VALUES_BY_DTYPE', 'MaskDropout', 'MedianBlur', 'MotionBlur', 'MultiplicativeNoise', 'NoOp', 'Normalize', 'OneOf', 'OneOrOther', 'OpticalDistortion', 'PadIfNeeded', 'Posterize', 'RGBShift', 'RandomBrightness', 'RandomBrightnessContrast', 'RandomContrast', 'RandomCrop', 'RandomCropNearBBox', 'RandomFog', 'RandomGamma', 'RandomGridShuffle', 'RandomRain', 'RandomResizedCrop', 'RandomRotate90', 'RandomScale', 'RandomShadow', 'RandomSizedBBoxSafeCrop', 'RandomSizedCrop', 'RandomSnow', 'RandomSunFlare', 'ReplayCompose', 'Resize', 'Rotate', 'Sequential', 'ShiftScaleRotate', 'SmallestMaxSize', 'Solarize', 'ToFloat', 'ToGray', 'ToSepia', 'Transpose', 'VerticalFlip', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '__version__', 'absolute_import', 'add_fog', 'add_rain', 'add_shadow', 'add_snow', 'add_sun_flare', 'adjust_brightness_torchvision', 'adjust_contrast_torchvision', 'adjust_hue_torchvision', 'adjust_saturation_torchvision', 'angle_2pi_range', 'angle_to_2pi_range', 'augmentations', 'bbox_center_crop', 'bbox_crop', 'bbox_flip', 'bbox_hflip', 'bbox_random_crop', 'bbox_rot90', 'bbox_rotate', 'bbox_shift_scale_rotate', 'bbox_transpose', 'bbox_utils', 'bbox_vflip', 'blur', 'brightness_contrast_adjust', 'calculate_bbox_area', 'center_crop', 'channel_dropout', 'channel_shuffle', 'check_keypoints', 'clahe', 'clamping_crop', 'clip', 'clipped', 'convert_bbox_from_albumentations', 'convert_bbox_to_albumentations', 'convert_bboxes_from_albumentations', 'convert_bboxes_to_albumentations', 'convert_keypoints_from_albumentations', 'convert_keypoints_to_albumentations', 'core', 'crop', 'crop_bbox_by_coords', 'crop_keypoint_by_coords', 'cutout', 'cv2', 'denormalize_bbox', 'denormalize_bboxes', 'division', 'domain_adaptation', 'downscale', 'elastic_transform', 'elastic_transform_approx', 'equalize', 'fancy_pca', 'filter_bboxes_by_visibility', 'filter_keypoints', 'fourier_domain_adaptation', 'from_dict', 'from_float', 'functional', 'gamma_transform', 'gauss_noise', 'gaussian_blur', 'gaussian_filter', 'get_center_crop_coords', 'get_num_channels', 'get_random_crop_coords', 'glass_blur', 'grid_distortion', 'hflip', 'hflip_cv2', 'image_compression', 'imgaug', 'invert', 'is_grayscale_image', 'is_multispectral_image', 'is_rgb_image', 'iso_noise', 'keypoint_center_crop', 'keypoint_flip', 'keypoint_hflip', 'keypoint_random_crop', 'keypoint_rot90', 'keypoint_rotate', 'keypoint_scale', 'keypoint_shift_scale_rotate', 'keypoint_transpose', 'keypoint_vflip', 'keypoints_utils', 'linear_transformation_rgb', 'load', 'longest_max_size', 'math', 'median_blur', 'motion_blur', 'multiply', 'non_rgb_warning', 'noop', 'normalize', 'normalize_bbox', 'normalize_bboxes', 'np', 'optical_distortion', 'pad', 'pad_with_params', 'posterize', 'preserve_channel_dim', 'preserve_shape', 'product', 'py3round', 'random_crop', 'random_flip', 'read_bgr_image', 'read_rgb_image', 'resize', 'rot90', 'rotate', 'save', 'scale', 'shift_hsv', 'shift_rgb', 'shift_scale_rotate', 'smallest_max_size', 'solarize', 'swap_tiles_on_image', 'to_dict', 'to_float', 'to_gray', 'to_tuple', 'transforms', 'transpose', 'utils', 'vflip', 'warn', 'wraps']

关于albumentations的demo,可以参考如下链接:

https://albumentations.readthedocs.io/en/latest/examples.html

https://albumentations.ai/docs/examples/pytorch_semantic_segmentation/

所以这里选用的增强策略为:

trfm = T.Compose([T.ToPILImage(),T.Resize(IMAGE_SIZE),T.ToTensor(),T.Normalize([0.625, 0.448, 0.688],[0.131, 0.177, 0.101]),
])

这里相对而言还是偏于保守,可以写一个通用类来根据业务程度选择不同的扩增量:


def light_training_transforms(crop_size=256):return A.Compose([A.RandomResizedCrop(height=crop_size, width=crop_size),A.OneOf([A.Transpose(),A.VerticalFlip(),A.HorizontalFlip(),A.RandomRotate90(),A.NoOp()], p=1.0),])def medium_training_transforms(crop_size=256):return A.Compose([A.RandomResizedCrop(height=crop_size, width=crop_size),A.OneOf([A.Transpose(),A.VerticalFlip(),A.HorizontalFlip(),A.RandomRotate90(),A.NoOp()], p=1.0),A.OneOf([A.CoarseDropout(max_holes=16, max_height=16, max_width=16),A.NoOp()], p=1.0),])def heavy_training_transforms(crop_size=256):return A.Compose([A.RandomResizedCrop(height=crop_size, width=crop_size),A.OneOf([A.Transpose(),A.VerticalFlip(),A.HorizontalFlip(),A.RandomRotate90(),A.NoOp()], p=1.0),A.ShiftScaleRotate(p=0.75),A.OneOf([A.CoarseDropout(max_holes=16, max_height=16, max_width=16),A.NoOp()], p=1.0),])

数据处理

为了加快EPOCHES的迭代速度,其实可以对数据集做一个过滤,每七张选出两张,虽然会影响最后的准确率,但是影响也不是很大:

valid_idx, train_idx = [], []
for i in range(len(dataset)):if i % 7 == 0:valid_idx.append(i)
#     else:elif i % 7 == 1:train_idx.append(i)train_ds = D.Subset(dataset, train_idx)
valid_ds = D.Subset(dataset, valid_idx)# define training and validation data loaders
loader = D.DataLoader(train_ds, batch_size=BATCH_SIZE, shuffle=True, num_workers=0)vloader = D.DataLoader(valid_ds, batch_size=BATCH_SIZE, shuffle=False, num_workers=0)

DataLoader是一个比较重要的类,它为我们提供的常用操作有:batch_size(每个batch的大小), shuffle(是否进行shuffle操作), num_workers(加载数据的时候使用几个子进程),这里选用的BATCH_SIZE为32.

模型训练

这里直接使用segmentation自带的fcn_resnet50当做骨干网络,能选择的还有fcn_resnet101,ResNeXt系列以及efficient系列,就不再过多叙述了。

def get_model():model = torchvision.models.segmentation.fcn_resnet50(True)      # ResNeXt101   fcn_resnet50model.classifier[4] = nn.Conv2d(512, 1, kernel_size=(1, 1), stride=(1, 1))return model

而网络模型,选用Unet进行构建:

import segmentation_models_pytorch as smpmodel = smp.Unet(encoder_name="resnet50",        # choose encoder, e.g. mobilenet_v2 or efficientnet-b7encoder_weights="imagenet",     # use `imagenet` pre-trained weights for encoder initializationin_channels=1,                  # model input channels (1 for gray-scale images, 3 for RGB, etc.)classes=3,                      # model output channels (number of classes in your dataset)
)

这个没啥说的,调用的时候注解已经很清晰了,keras也有相关文档进行说明:

https://keras-cn.readthedocs.io/en/latest/legacy/models/model/#_1

损失函数

Dice评价指标

Dice系数(Dice coefficient)是常见的评价分割效果的方法之一,同样也可以改写成损失函数用来度量prediction和target之间的距离。Dice系数定义如下:
x D i c e ( T , P ) = 2 ∣ T ∩ P ∣ ∣ T ∣ ∪ ∣ P ∣ = 2 T P F P + 2 T P + F N xDice (T, P) = \frac{2 |T \cap P|}{|T| \cup |P|} = \frac{2TP}{FP+2TP+FN} xDice(T,P)=∣T∣∪∣P∣2∣T∩P∣​=FP+2TP+FN2TP​
式中: T T T表示真实前景(target), P P P表示预测前景(prediction)。Dice系数取值范围为 [ 0 , 1 ] [0,1] [0,1],其中值为1时代表预测与真实完全一致。所以,Dice系数不仅在直观上体现了target与prediction的相似程度,同时其本质上还隐含了精确率和召回率两个重要指标。

BCE损失函数

BCE损失函数(Binary Cross-Entropy Loss)是交叉熵损失函数(Cross-Entropy Loss)的一种特例,BCE Loss只应用在二分类任务中。针对分类问题,单样本的交叉熵损失为:

x l ( y , y ^ ) = − [ y ⋅ l o g y ^ + ( 1 − y ) ⋅ l o g ( 1 − y ^ ) ] xl(y,\hat y)=-[y \cdot log\hat y +(1-y)\cdot log (1-\hat y)] xl(y,y^​)=−[y⋅logy^​+(1−y)⋅log(1−y^​)]

这个函数看起来与Logistic 回归的损失函数相似。式中, y y y为真实值,非1即0; y ^ \hat y y^​为所属此类的概率值,为预测值。这个公式也就是BCE损失函数,即二分类任务时的交叉熵损失。

那么我们此处将要定义的损失函数为两个加起来的合量:

class SoftDiceLoss(nn.Module):def __init__(self, smooth=1., dims=(-2,-1)):super(SoftDiceLoss, self).__init__()self.smooth = smoothself.dims = dimsdef forward(self, x, y):tp = (x * y).sum(self.dims)fp = (x * (1 - y)).sum(self.dims)fn = ((1 - x) * y).sum(self.dims)dc = (2 * tp + self.smooth) / (2 * tp + fp + fn + self.smooth)dc = dc.mean()return 1 - dcbce_fn = nn.BCEWithLogitsLoss()
dice_fn = SoftDiceLoss()def loss_fn(y_pred, y_true):bce = bce_fn(y_pred, y_true)dice = dice_fn(y_pred.sigmoid(), y_true)return 0.8*bce+ 0.2*dice

模型预测

这一步可以直接看论坛的baseline,我能补充的不多:

https://tianchi.aliyun.com/notebook-ai/detail?postId=170488

header = r'''Train | Valid
Epoch |  Loss |  Loss | Time, m
'''
#          Epoch         metrics            time
raw_line = '{:6d}' + '\u2502{:7.3f}'*2 + '\u2502{:6.2f}'
print(header)EPOCHES = 6
best_loss = 10
for epoch in range(1, EPOCHES+1):losses = []start_time = time.time()model.train()for image, target in tqdm_notebook(loader):image, target = image.to(DEVICE), target.float().to(DEVICE)optimizer.zero_grad()output = model(image)["out"]    loss = loss_fn(output, target)loss.backward()optimizer.step()losses.append(loss.item())# print(loss.item())

最后需要提醒的一点是:在使用pytorch中的torchvision.models.segmentation.fcn_resnet50进行获得已经训练好的预训练模型时,所得结果的网络输出是OrderedDict而不是Tensor。只有取[“out”]这部分才是tensor,也就是对out这一key进行索引。那么就能直接跑了:

总结

这个总结是已经过了一个月后回头发现缺了点什么,就回头补个。最终很开心拿到了一个不错的名次,用efficient做骨干,Unet+做网络,收获了很多,最开始的baseline只跑到了0.79的样子,就感觉FCN有些乏力,然后来回使用了resnet和efficient,最终发现efficient b6的效益比较高,这也和它训练是256 * 256的有关,最终经过调参到了0.89,不包含TTA以及融合,因为中途没时间了,论坛的竞赛圈里公开了top 1的方案,我感觉确实还有得参数能调,emmm。。。另外,又一种检测模型公开了,听说是swin,这个应该也是可以用用的。

地表建筑物识别笔记总结相关推荐

  1. 语义分割-地表建筑物识别的一种解决方案

    语义分割-地表建筑物识别的一种解决方案 一,前言 该篇博客是用于记录阿里天池上的一个比赛--语义分割-地表建筑物识别的整个学习,编程的过程,由于是该比赛是我做的第一个机器学习的项目,因此记录的比较详细 ...

  2. 天池赛题解析:零基础入门语义分割-地表建筑物识别-CV语义分割实战(附部分代码)

    赛题内容 赛题背景 赛题以计算机视觉为背景,要求选手使用给定的航拍图像训练模型并完成地表建筑物识别任务.为更好的引导大家入门,我们为本赛题定制了学习方案和学习任务,具体包括语义分割的模型和具体的应用案 ...

  3. 【天池赛事】零基础入门语义分割-地表建筑物识别 Task6:分割模型模型集成

    [天池赛事]零基础入门语义分割-地表建筑物识别 Task1:赛题理解与 baseline(3 天) – 学习主题:理解赛题内容解题流程 – 学习内容:赛题理解.数据读取.比赛 baseline 构建 ...

  4. 【天池赛事】零基础入门语义分割-地表建筑物识别 Task5:模型训练与验证

    [天池赛事]零基础入门语义分割-地表建筑物识别 Task1:赛题理解与 baseline(3 天) – 学习主题:理解赛题内容解题流程 – 学习内容:赛题理解.数据读取.比赛 baseline 构建 ...

  5. 【天池赛事】零基础入门语义分割-地表建筑物识别 Task4:评价函数与损失函数

    [天池赛事]零基础入门语义分割-地表建筑物识别 Task1:赛题理解与 baseline(3 天) – 学习主题:理解赛题内容解题流程 – 学习内容:赛题理解.数据读取.比赛 baseline 构建 ...

  6. 【天池赛事】零基础入门语义分割-地表建筑物识别 Task3:网络模型结构发展

    [天池赛事]零基础入门语义分割-地表建筑物识别 Task1:赛题理解与 baseline(3 天) – 学习主题:理解赛题内容解题流程 – 学习内容:赛题理解.数据读取.比赛 baseline 构建 ...

  7. 【天池赛事】零基础入门语义分割-地表建筑物识别 Task2:数据扩增方法

    [天池赛事]零基础入门语义分割-地表建筑物识别 Task1:赛题理解与 baseline(3 天) – 学习主题:理解赛题内容解题流程 – 学习内容:赛题理解.数据读取.比赛 baseline 构建 ...

  8. 【天池赛事】零基础入门语义分割-地表建筑物识别 Task1:赛题理解与 baseline

    [天池赛事]零基础入门语义分割-地表建筑物识别 Task1:赛题理解与 baseline(3 天) – 学习主题:理解赛题内容解题流程 – 学习内容:赛题理解.数据读取.比赛 baseline 构建 ...

  9. 【天池赛事】零基础入门语义分割-地表建筑物识别

    https://tianchi.aliyun.com/competition/entrance/531872/introduction [天池赛事]零基础入门语义分割-地表建筑物识别:第一章 赛题及b ...

最新文章

  1. 多级反馈队列列算法的几点说明
  2. 今天收拾了个电脑抽屉,发现原来我是个有钱人
  3. python库迁移到没有网的电脑_关于换机器后python库的迁移-偷懒做法
  4. leetcode 65. 有效数字(正则表达式)
  5. mysql 输出参数 sql语句_MySQL: 详细的sql语句
  6. Python+pandas+matplotlib数据分析与可视化案例(附源码)
  7. javacript Function parameters(函数参数)
  8. 在线XML转HTML工具
  9. 车牌自动识别在智能交通系统中的应用及前景分析
  10. 解题:CEOI 2017 Mousetrap
  11. Codevs P1066 引水入城 2010年NOIP全国联赛提高组
  12. 1153: 简易版最长序列
  13. mysql查询低效语句_MySQL数据库中查找执行从命慢的SQL语句
  14. 第十二周项目四----利用遍历思想求解图问题之6最短路径
  15. dubbo中文官网地址
  16. java unbox_Java ValueConversions.unbox方法代码示例
  17. 【Excel】工作中会用到的excel操作和技巧
  18. Redhat相关快捷键
  19. react-native 实现渐变色背景
  20. Windows Server 2008 R2中关闭“IE增强的安全配置”

热门文章

  1. 手把手教你使用 Python 抓取并存储网页数据!最详细的爬虫教程!
  2. 三星s7572无法显示toast的问题解决
  3. 图像中米粒个数的识别(2)——如何从左到右依次给米粒计数
  4. 地图基本知识学习、GIS基础学习
  5. ADO.net入门(五):口袋礼品的欣赏
  6. 计算机辅助教育教学方案,计算机辅助教学及设计
  7. 有什么文字转图片的软件?快把这些软件收好
  8. MATLAB寻找100以内素数对
  9. 数据科学与大数据技术专业适合女生学吗?
  10. 字符串位置的查询Python习题