四维图新杯”自动驾驶视觉感知算法赛baseline-----第二部分

语义分割部分----baseline(https://github.com/upupbo/DF_autodring)

2.1图像预处理—图像扩增

将图片切割成512*512大小的图片,最后数据集的数量为2万张。

import numpy as np
import glob as glob
import cv2
from PIL import Image
import os

Image.MAX_IMAGE_PIXELS = 100000000000000000000000000000000000000

srcpath='/home/cb/code/zidonjiashi/dataset/zong/src/'
labelpath='/home/cb/code/zidonjiashi/dataset/zong/label_yuan/'

path_list=os.listdir(srcpath)
path_list.sort()
#path_list=['000000.jpg']

for i,filename in enumerate(path_list):
    src = srcpath + filename[:-4] + '.jpg'
    label = labelpath + filename[:-4] + '.png'
    #img = Image.open(src).convert('RGB')
    #mask = Image.open(label)
    img_1=cv2.imread(src)
    img_1_mask=cv2.imread(label)
    #img_1 = np.array(img)
    #img_1_mask = np.array(mask)
    #h,w = img_1_mask.shape
    h=720
    w=1280
    #print(h,w)
    step=300
    outsize=512
    cx=0
    cy=0
    while cy+outsize < h:
        cx=0
        while cx+outsize < w:
            img_s=img_1[cy:(outsize+cy),cx:(outsize+cx)]
            img_m=img_1_mask[cy:(outsize+cy),cx:(outsize+cx)]
            im_name='/home/cb/code/zidonjiashi/dataset/qiege/src/'+filename[:-4]+'_{}_{}.jpg'.format(cx,cy)
            im_name1='/home/cb/code/zidonjiashi/dataset/qiege/label_yuan/'+filename[:-4]+'_{}_{}.png'.format(cx,cy)
            cv2.imwrite(im_name,img_s)
            cv2.imwrite(im_name1,img_m)
            #img=Image.fromarray(img)
            #img.save('/home/cb/code/zidonjiashi/dataset/qiege/src/'+filename[:-4]+'_{}_{}.jpg'.format(cx,cy))
            #img1=dslb.ReadAsArray(cx,cy,outsize+cx,outsize+cy)
            #img1=Image.fromarray(img1).convert('L')
            #img1.save('/home/cb/code/zidonjiashi/dataset/qiege/label_yuan/'+filename[:-4]+'_{}_{}.png'.format(cx,cy))
            cx+=step
        cy+=step
    print('final',i)

2.2图像预处理—划分训练,验证集
此程序能保证类别均匀地划分训练集和验证集

from __future__ import print_function
from glob import glob
import torch.utils.data as data
import os
import cv2
from PIL import Image
#from utils import preprocess
import random
import numpy as np
import pandas as pd

save_root1='/home/cb/code/zidonjiashi/dataset/qiege/train1/src/'
save_root2='/home/cb/code/zidonjiashi/dataset/qiege/train1/label/'
save_root3='/home/cb/code/zidonjiashi/dataset/qiege/val1/src/'
save_root4='/home/cb/code/zidonjiashi/dataset/qiege/val1/label/'

CLASSES = ['background', 'tobacco', 'cron', 'barley-rice','building']#10类
#数据路径
imgpaths = sorted(glob('/home/cb/code/zidonjiashi/dataset/qiege/src' + '/*.jpg'))
maskpaths = sorted(glob('/home/cb/code/zidonjiashi/dataset/qiege/label_yuan' + '/*.png'))
    
print(len(imgpaths),len(maskpaths))
    
#获取四类label图像及mask路径
s1=[]
s2=[]
s3=[]
s4=[]
s5=[]
s6=[]
s7=[]
s8=[]
s9=[]
s0=[]
im1=[]
im2=[]
im3=[]
im4=[]
im5=[]
im6=[]
im7=[]
im8=[]
im9=[]
im0=[]
print("load dataset....")
for i in range(len(maskpaths)):
    img=cv2.imread(maskpaths[i])
    if img.max()==34:
        s9.append(maskpaths[i])
        im9.append(imgpaths[i])
    if img.max()==33:
        s8.append(maskpaths[i])
        im8.append(imgpaths[i])
    if img.max()==32:
        s7.append(maskpaths[i])
        im7.append(imgpaths[i])
    if img.max()==31:
        s6.append(maskpaths[i])
        im6.append(imgpaths[i])
    if img.max()==30:
        s5.append(maskpaths[i])
        im5.append(imgpaths[i])
    if img.max()==29:
        s4.append(maskpaths[i])
        im4.append(imgpaths[i])
    if img.max()==28:
        s3.append(maskpaths[i])
        im3.append(imgpaths[i])
    if img.max()==27:
        s2.append(maskpaths[i])
        im2.append(imgpaths[i])
    if img.max()==26:
        s1.append(maskpaths[i])
        im1.append(imgpaths[i])
    if img.max()==0:
        s0.append(maskpaths[i])
        im0.append(imgpaths[i])
    print(i+1,6987)
#打乱四类label图像路径
print(len(im0),0)
print(len(im1),1)
print(len(im2),2)
print(len(im3),3)
print(len(im4),4)
print(len(im5),5)
print(len(im6),6)
print(len(im7),7)
print(len(im8),8)
print(len(im9),9)

random_train = list(range(len(im0)))
random.seed(105)
random.shuffle(random_train)
im00 = [im0[idx] for idx in random_train]
s00 =[s0[idx] for idx in random_train]

random_train = list(range(len(im1)))
random.seed(105)
random.shuffle(random_train)
im11 = [im1[idx] for idx in random_train]
s11 =[s1[idx] for idx in random_train]
    
random_train = list(range(len(im2)))
random.seed(105)
random.shuffle(random_train)
im22 =[im2[idx] for idx in random_train]
s22 = [s2[idx] for idx in random_train]
    
random_train = list(range(len(im3)))
random.seed(105)
random.shuffle(random_train)
im33 = [im3[idx] for idx in random_train]
s33 = [s3[idx] for idx in random_train]
    
random_train = list(range(len(im4)))
random.seed(105)
random.shuffle(random_train)
im44 = [im4[idx] for idx in random_train]
s44 = [s4[idx] for idx in random_train]

random_train = list(range(len(im5)))
random.seed(105)
random.shuffle(random_train)
im55 = [im5[idx] for idx in random_train]
s55 =[s5[idx] for idx in random_train]

random_train = list(range(len(im6)))
random.seed(105)
random.shuffle(random_train)
im66 = [im6[idx] for idx in random_train]
s66 =[s6[idx] for idx in random_train]
    
random_train = list(range(len(im7)))
random.seed(105)
random.shuffle(random_train)
im77 =[im7[idx] for idx in random_train]
s77 = [s7[idx] for idx in random_train]
    
random_train = list(range(len(im8)))
random.seed(105)
random.shuffle(random_train)
im88 = [im8[idx] for idx in random_train]
s88 = [s8[idx] for idx in random_train]
    
random_train = list(range(len(im9)))
random.seed(105)
random.shuffle(random_train)
im99 = [im9[idx] for idx in random_train]
s99 = [s9[idx] for idx in random_train]
    
#获取训练和验证集
train_ratio = 0.85
    
train_image=im11[:int(len(im11)*train_ratio)]+im22[:int(len(im22)*train_ratio)]+im33[:int(len(im33)*train_ratio)]+im44[:int(len(im44)*train_ratio)]+im55[:int(len(im55)*train_ratio)]+im66[:int(len(im66)*train_ratio)]+im77[:int(len(im77)*train_ratio)]+im88[:int(len(im88)*train_ratio)]+im99[:int(len(im99)*train_ratio)]
train_mask=s11[:int(len(im11)*train_ratio)]+s22[:int(len(im22)*train_ratio)]+s33[:int(len(im33)*train_ratio)]+s44[:int(len(im44)*train_ratio)]+s55[:int(len(im55)*train_ratio)]+s66[:int(len(im66)*train_ratio)]+s77[:int(len(im77)*train_ratio)]+s88[:int(len(im88)*train_ratio)]+s99[:int(len(im99)*train_ratio)]
test_image=im11[int(len(im11)*train_ratio):]+im22[int(len(im22)*train_ratio):]+im33[int(len(im33)*train_ratio):]+im44[int(len(im44)*train_ratio):]+im55[int(len(im55)*train_ratio):]+im66[int(len(im66)*train_ratio):]+im77[int(len(im77)*train_ratio):]+im88[int(len(im88)*train_ratio):]+im99[int(len(im99)*train_ratio):]
test_mask=s11[int(len(im11)*train_ratio):]+s22[int(len(im22)*train_ratio):]+s33[int(len(im33)*train_ratio):]+s44[int(len(im44)*train_ratio):]+s55[int(len(im55)*train_ratio):]+s66[int(len(im66)*train_ratio):]+s77[int(len(im77)*train_ratio):]+s88[int(len(im88)*train_ratio):]+s99[int(len(im99)*train_ratio):]
print(len(train_image))
print(len(test_mask))
    
for i in range(int(len(train_image))):
    _img = Image.open(train_image[i]).convert('RGB')
    _target = Image.open(train_mask[i]).convert('L')
    img_name = '{0}'.format(i)
    label_name = '{0}'.format(i)
    _img.save(save_root1 +img_name+'.jpg')
    _target.save(save_root2 +label_name+ '.png')
print(1)
for i in range(int(len(test_mask))):
    _img = Image.open(test_image[i]).convert('RGB')
    _target = Image.open(test_mask[i]).convert('L')
    img_name = '{0}'.format(i)
    label_name = '{0}'.format(i)
    _img.save(save_root3 +img_name+ '.jpg')
    _target.save(save_root4 +label_name+ '.png')
print(2)
count = 0
for root,dirs,files in os.walk(save_root1):    #遍历统计
    for each in files:
        count += 1  #统计文件夹下文件个数
print (count)              #输出结果  


count = 0
for root,dirs,files in os.walk(save_root3):    #遍历统计
    for each in files:
        count += 1  #统计文件夹下文件个数
print (count)              #输出结果

2.3图像预处理—图像增强
在训练前对图像进行旋转,色调增强,随机裁剪等操作。

from PIL import Image,ImageFilter,ImageDraw,ImageEnhance
import random
import os
import numpy as np
from tqdm import tqdm
import cv2
from libtiff import TIFF
import scipy.misc
from scipy import misc

#要裁剪图像的大小
img_w = 256  
img_h = 256  
#读取路径下图片的名称
def file_name(file_dir):   
    L=[]   
    for root, dirs, files in os.walk(file_dir):  
        for file in files:   
            img_name = os.path.split(file)[1]    
            L.append(img_name)

    return L  
image_sets=file_name('/home/dataset/rssrai2019_semantic/val/src/');#图片存贮路径
#色调增强
def random_color(img):
    img = ImageEnhance.Color(img)
    img = img.enhance(2)
    return img
def data_augment(src_roi,label_roi):
    #图像和标签同时进行90,180,270旋转
    if np.random.random() < 0.25:
       src_roi=src_roi.rotate(90)
       label_roi=label_roi.rotate(90)
    if np.random.random() < 0.25:
       src_roi=src_roi.rotate(180)
       label_roi=label_roi.rotate(180)
    if np.random.random() < 0.25:
       src_roi=src_roi.rotate(270)
       label_roi=label_roi.rotate(270)
    #图像和标签同时进行竖直旋转   
    if np.random.random() < 0.25:
       src_roi=src_roi.transpose(Image.FLIP_LEFT_RIGHT)
       label_roi=label_roi.transpose(Image.FLIP_LEFT_RIGHT)
    #图像和标签同时进行水平旋转
    if np.random.random() < 0.25:
       src_roi=src_roi.transpose(Image.FLIP_TOP_BOTTOM)
       label_roi=label_roi.transpose(Image.FLIP_TOP_BOTTOM)
    #图像进行色调增强
    if np.random.random() < 0.25:
       src_roi=random_color(src_roi)
    return src_roi,label_roi
    
# image_num:增广之后的图片数据
def creat_dataset(image_num = 30000, mode = 'original'):
    print('creating dataset...')
    image_each = image_num / len(image_sets)
    g_count = 0
    for i in tqdm(range(len(image_sets))):
        count = 0
        src_img = TIFF.open('/home/dataset/rssrai2019_semantic/val/src/' + image_sets[i])  # 4 channels
        src_img = src_img.read_image()
        label_img = TIFF.open('/home/dataset/rssrai2019_semantic/val/label/' + image_sets[i]) # 4 channels
        label_img = label_img.read_image()
        

        #对图像进行随机裁剪,这里大小为256*256       
        while count < image_each:
            src_img = np.array(src_img)
            label_img = np.array(label_img)
            width0 = src_img.shape[0]
            height0 = src_img.shape[1]
            width1 = random.randint(0, width0 - img_w )
            height1 = random.randint(0, height0 - img_h)
            width2 = width1 + img_w
            height2 = height1 + img_h  
            
            
            label_img=Image.fromarray(label_img)
            src_img=Image.fromarray(src_img)

            src_roi=src_img.crop((width1, height1, width2, height2))
            label_roi=label_img.crop((width1, height1, width2, height2))
                       
            if mode == 'augment':
               src_roi,label_roi = data_augment(src_roi,label_roi)
            #scipy.misc.toimage(src_roi).save('/home/dataset/rssrai2019_semantic/train/train_src/%d.tif' % g_count)
            #scipy.misc.toimage(label_roi).save('/home/dataset/rssrai2019_semantic/train/train_label/%d.tif' % g_count)
            scipy.misc.imsave('/home/dataset/rssrai2019_semantic/val/train_src/%d.tif' % g_count,src_roi)
            scipy.misc.imsave('/home/dataset/rssrai2019_semantic/val/train_label/%d.tif' % g_count,label_roi)
            count += 1 
            g_count += 1
            print(count)

if __name__=='__main__':  
    creat_dataset(mode='augment')

2.4图像融合—模型融合

import os
import cv2
import torch
import random
from PIL import Image
import numpy as np
from utils.img_utils import random_scale, random_mirror_1, random_mirror_0, random_rotation, normalize, \
    generate_random_crop_pos, random_crop_pad_to_shape, random_gaussian_blur


def vote_fusion():

    data_path = '../MY/AgriculturalBrainAIChallenge/Datasets/vote'
    predict_3_1 = os.path.join(data_path, '1/image_3_predict.png') # cb 0.723
    predict_3_2 = os.path.join(data_path, '2/image_3_predict.png') # 2825 0.7277 resnet101 lovasz0.1
    predict_3_3 = os.path.join(data_path, '3/image_3_predict.png') # fusion 0.7250

    predict_4_1 = os.path.join(data_path, '1/image_4_predict.png')
    predict_4_2 = os.path.join(data_path, '2/image_4_predict.png')
    predict_4_3 = os.path.join(data_path, '3/image_4_predict.png')

    predict_3 = [predict_3_1, predict_3_2, predict_3_3]
    predict_4 = [predict_4_1, predict_4_2, predict_4_3]
    predict_ = [predict_3, predict_4]

    predict_path = '../MY/AgriculturalBrainAIChallenge/Datasets/predict/'
    predict = [os.path.join(predict_path, 'image_3_predict.png'), os.path.join(predict_path, 'image_4_predict.png')]

    for i in range(len(predict)):
        print('the', i + 1, 'image')
        result_list = []
        for j in range(len(predict_[i])):
            im = cv2.imread(predict_[i][j], 0)
            result_list.append(im)
        print('fusion number:', len(result_list))
        # each pixel
        height, width = result_list[0].shape
        vote_mask = np.zeros((height, width))
        for h in range(height):
            for w in range(width):
                record = np.zeros((1, 5))
                for n in range(len(result_list)):
                    mask = result_list[n]
                    pixel = mask[h, w]
                    # print('pix:',pixel)
                    record[0, pixel] += 1

                label = record.argmax()
                # print(label)
                vote_mask[h, w] = label

        cv2.imwrite(predict[i], vote_mask)
        print('Write', predict[i])



if __name__ == '__main__':
    vote_fusion()

发布了47 篇原创文章 · 获赞 21 · 访问量 7253

猜你喜欢

转载自blog.csdn.net/qq_18315295/article/details/102917913
今日推荐