基于时空序列模型ConvLstm的气象预测

一、数据获取

  1. 去国家气象科学数据中心下载雷达拼图 可以手动收集也可以写爬虫程序收集 手动收集就更改日期和时间

    中国气象数据网 – Online Data


二、数据预处理

  1.  得到这些PNG图片后,首先做处理,只关注东南部分,其他的都扔掉(即从图中截取一个固定的长方形,就差不多是下面这个部分。保证截取的图中不包括左下角的南海诸岛以及右下角的基本反射率图例,这些都是干扰。你可以扔掉更多的部分,比如西宁以西都扔掉)。对所有的PNG图片都这样操作。
  2. 可能截取完之后,图片的像素仍然过多,那你可以截取更小的一个部分。比如:
    pic_name_list
    cuted_img_list = []
    save_img_path = os.path.join(wd, 'output')
    if not os.path.exists(save_img_path):
        os.makedirs(save_img_path)
        
    for pic_id in range(len(pic_name_list)):
        pic_name = str(pic_id) + '.png'
        temp = os.path.join(pic_root_path, pic_name)
        img = cv.imread(temp)
        
        print("This is the "+pic_name+":")
        print(img.shape)
        # (y, x)
        cuted_img = img[633:725, 510:665] 
        #cv.imwrite(os.path.join(save_img_path, pic_name),cuted_img)
        cuted_img_list.append(cuted_img)
        plt.imshow(cuted_img)
        plt.show()
  3. 识别出基本反射率图例中每一个不同数值对应的颜色RGB常数,将图片中每个像素的RGB映射到基本反射率。如果没有对应的值(比如白色,黑色)统统设置为255。
  4. 转为灰度图。

        

 

def viewColor(pic, color):
    #pic = Image.copy()
    for i, nar in enumerate(pic):
        for j, n in enumerate(nar):
            if list(n) == list(color): # 南宁附近的三八线不需要的
                pic[i][j] = np.array([255,255,255])
    
def get_usedColor(img):
    from collections import defaultdict
    colorMap = defaultdict(int)
    usedColor = []
    
    for i, nar in enumerate(img):
        for j, n in enumerate(nar):
            if str(n) not in colorMap:
                usedColor.append(list(n))
            colorMap[str(n)] += 1
    return usedColor
    
def Image_Preprocessing(img):
    use_color = []
    use_color.append([178, 178, 178])
    use_color.append([247, 221, 136])
    use_color.append([104, 104, 104])
    use_color.append([182, 255, 255])
    use_color.append([0, 0, 102])
    use_color.append([219, 144, 58])
    use_color.append([58, 144, 219])
    use_color.append([102, 0, 0])
    use_color.append([255, 255, 182])
    use_color.append([219, 255, 255])
    use_color.append([219, 182, 182])
    use_color.append([219, 144, 144])
    use_color.append([219, 219, 219])
    use_color.append([0, 58, 144])
    use_color.append([182, 182, 182])
    use_color.append([0, 0, 0])
    use_color.append([58, 0, 0])
    use_color.append([255, 219, 144])
    for c in use_color:
        viewColor(img, c)
    return img

def pltShow(img):
    plt.imshow(img)
    plt.show()
    
def cvShow(img):
    cv.imshow("mat", img)
    cv.waitKey(0)

imgGray_list = []
for id, cuted_img in enumerate(cuted_img_list):
    img = Image_Preprocessing(cuted_img)
    imgGray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    pltShow(img)
    temp = os.path.join(save_img_path, str(id)+'.png')
    if os.path.exists(temp):
        os.remove(temp)
    cv.imwrite(temp, imgGray)
    imgGray_list.append(imgGray)
    print(str(id)+'.png is preprocesed, Wait next!')
print("Everything is OK!")

三、ConvLstm模型

## NEW NETWORK ##
def mainmodel():
  # Inputs
  dtype='float32'

  nk = 128     # number of kernels for conv layers #48 
  fs = (3,3)  # filter size for convolutional kernels
  
  contentInput = Input(shape=(None, WIDTH, HEIGHT, 1), name='content_input', dtype=dtype)

  # Encoding Network
  x1 = ConvLSTM2D(nk, (5,5), padding='same', return_sequences=True, kernel_initializer ='he_normal', name='layer1')(contentInput)
  x2 = ConvLSTM2D(nk, (5,5), padding='same', return_sequences=True, kernel_initializer ='he_normal', name='layer2')(x1) 

  # Forecasting Network
  x3 = ConvLSTM2D(nk, (5,5), padding='same', return_sequences=True, kernel_initializer ='he_normal', name='layer3')(x1)
  add1 = Add()([x3, x2])
  x4 = ConvLSTM2D(nk, (5,5), padding='same', return_sequences=True, kernel_initializer ='he_normal', name='layer4')(add1)

  # Prediction Network
  conc = Concatenate()([x4, x3]) 
  predictions = Conv3D(1, (5,5,5), activation='sigmoid', padding='same',  name='prediction')(conc) #sigmoid original

  model = Model(inputs=contentInput, outputs=predictions)
  
  return model

四、训练

  (待补)

五、预测

(待补)

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
社会演员多的头像社会演员多普通用户
上一篇 2022年5月18日
下一篇 2022年5月18日

相关推荐