高分辨率圖像建築物提取數據集制作


  1. 目錄結構

    /dataset/
    	xxxx.tif  # 原始圖像
    	image-3000
    		0.tif # 切割后的tif
    		1.tif
    		........
    		xxx_0.json # 生成的json文件也放在該文件夾下
    		xxx_1.json
    		.......
    		xxx_0_json # 調用labelme_json_to_dataset 0.json 生成的0_json文件夾
    			img.png # 原始圖片的png格式
    			info.yaml
    			label.png # 標簽圖片
    			label_names.txt 
    			label_viz.png
    		xxx_1_json
    		.......
    		0.png  # 將json文件夾中的label.png 提取出來
    		1.png 
    		.......
    		label_0.tif # 將上邊的png標簽文件轉換為tif格式
    

  2. 收集數據,高分辨率圖像

    1. 無人機數據,航空數據等
  3. 圖像切割,像素大小該為多少?

    1. 本數據集平均像素大小(40000*50000) tif格式,LZW壓縮方式壓縮

    2. 要考慮計算機顯卡,目標建築無盡量不被切割等問題,本利使用3000*3000

      # data:2020-01-04
      # user:dean
      # desc:圖像切割腳本
      import tifffile as tiff  # 也可使用pillow或opencv 但若圖片過大時可能會出問題
      import os
      width = 1500*2   # 切割圖像大小
      height = 1500*2  # 切割圖像大小
      home = "/media/dean/Document/AI_dataset/DOM/"
      file_name = "裴庄村51-dom"
      image_dir = os.path.join(home,file_name)
      image = os.path.join(image_dir,file_name+".tif")
      target_dir = os.path.join(image_dir,"image-"+str(width))  # 切割后圖片存儲位置
      if not os.path.exists(target_dir):
          os.mkdir(target_dir)
      img = tiff.imread(image)  # 導入圖片
      print("導入圖片完成",img.shape) # 原始圖片大小
      pic_width = img.shape[1]
      pic_height = img.shape[0]
      row_num = pic_width//width  # 縱向切割數量
      col_num = pic_height // height  # 橫向切割數量
      print("開始進行切割,可切割總數為{}".format(col_num*row_num))
      for j in range(col_num):
          for i in range(row_num):
              num = j * row_num + i
              print("正在進行第{}張切割".format(num + 1))
              row = i * width
              row_end = row + width
              col = j * height
              col_end = col + height
              # print(col,col_end,row,row_end)
              cropped = img[col:col_end,row:row_end]
              name = "{}_{}.tif".format(file_name,num)
              image_path = os.path.join(target_dir,name)
              tiff.imsave(image_path, cropped)
      
  4. 標注工具 labelme

    1. 使用label標注每張圖片

      pip install labelme  # 安裝labelme
      
    2. 每張圖片標注后會生成對應name.json文件

      labelme_json_to_dataset xxx.json 
      

      # data:2020-01-04
      # user:dean
      # desc:批量將json文件轉為 label
      import os
      dir = r"I:\人工智能數據\DOM\裴庄村51-dom\image-3000"
      files = [os.path.join(dir,file) for file in os.listdir(dir) if file.endswith(".json")]
      for file in files:
          cmd = "labelme_json_to_dataset {}".format(file)
          print(cmd)
          os.system(cmd)
      
    3. 將所有的json/label.png 提取到統一文件夾

      # data:2020-01-04
      # user:dean
      # desc:將label文件夾中的laebl提取出來
      import tifffile as tiff
      from PIL import Image
      import os
      target_dir = r"/media/dean/Document/AI_dataset/DOM/裴庄村51-dom/image-3000"  # json_label 所在的文件夾
      files = [os.path.join(target_dir,file) for file in os.listdir(target_dir)]
      for i in files:
          if os.path.isdir(i):
              lables = os.listdir(i)
              for file in lables:
                  if file == "label.png":
                      image_path = os.path.join(i, "label.png")
                      imgae = Image.open(image_path)
                      parent_dir_name = os.path.basename(os.path.dirname(image_path))
                      new_name = "{}.png".format(parent_dir_name.split("_")[1])
                      imgae.save(os.path.join(target_dir,new_name))
                      print("第{}個文件夾".format(i))
                      break;
      
    4. 將所有的label.png轉換為tif格式 並轉換為單通道黑白照片

      # coding:utf-8
      # file: change_format.py
      # author: Dean
      # contact: 1028968939@qq.com
      # time: 2020/1/4 20:41
      # desc: 將png 標簽轉化為單通道 黑白標簽 並轉化為tif
      import os
      from PIL import Image
      threshold = 0
      table = []
      for i in range(256):
          if i > threshold:
              table.append(255)
          else:
              table.append(0)
      target_dir = r"/media/dean/Document/AI_dataset/DOM/裴庄村51-dom/image-3000"
      files = [os.path.join(target_dir,file) for file in os.listdir(target_dir) if file.endswith(".png")]
      for file in files:
          image_file_name = os.path.basename(file)
          num = image_file_name.split(".")[0]
          image_file = Image.open(file)  # open colour image
          # image_file = image_file.convert('L') # convert image to black and white
          image_file = image_file.point(table, '1')
          new_file = os.path.join(target_dir,"{}.tif".format(num))
          image_file.save(new_file)
          print(new_file)
      
    5. 結束(根據需要提取相應數據即可)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM