labelme是數據標註中最常用到的標註工具。可以標註矩形框、圓形、線條、不規則圖形等等。所以這種多功能的標註工具,也應用廣泛。
但是,有時候我們也會從別處獲取一些已經標註好的數據,或只是坐標點。那如何用labelme查看呢?今天這篇文章就介紹,如何生成能labelme直接打開的json文件。
本文閱讀大約需要2min,但建議收藏,動手實踐之。
任意四邊形坐標標記格式:tl_x,tl_y,tr_x,tr_y,br_x,br_y,bl_x,bl_y。從左上點開始順時針旋轉的四個頂點的坐標,如下圖所示:
將TXT文檔中標註信息,存儲到labelme標註的json文件內,代碼如下:
import json
import base64
from PIL import Image
import io
import os
import cv2
import numpy as np
def generate_json(file_dir, file_name):
str_json = {}
shapes = []
# 讀取坐標
fr = open(os.path.join(file_dir, file_name))
for line in fr.readlines(): # 逐行讀取,濾除空格等
print(line.strip())
print(type(line.strip()))
lineArr = line.strip().split(',')
print("lineArr:", lineArr)
points = []
points.append([float(lineArr[0]), float(lineArr[1])])
points.append([float(lineArr[2]), float(lineArr[3])])
points.append([float(lineArr[4]), float(lineArr[5])])
points.append([float(lineArr[6]), float(lineArr[7])])
print(points) # 從左上點開始順時針旋轉的四個頂點的坐標
shape = {}
shape["label"] = "plate_1"
shape["points"] = points
shape["line_color"] = []
shape["fill_color"] = []
shape["flags"] = {}
shapes.append(shape)
str_json["version"] = "3.14.1"
str_json["flags"] = {}
str_json["shapes"] = shapes
str_json["lineColor"] = [0, 255, 0, 128]
str_json["fillColor"] = [255, 0, 0, 128]
picture_basename = file_name.replace('.txt', '.png')
str_json["imagePath"] = picture_basename
img = cv2.imread(os.path.join(file_dir, picture_basename))
str_json["imageHeight"] = img.shape[0]
str_json["imageWidth"] = img.shape[1]
str_json["imageData"] = base64encode_img(os.path.join(file_dir, picture_basename))
return str_json
def base64encode_img(image_path):
src_image = Image.open(image_path)
output_buffer = io.BytesIO()
src_image.save(output_buffer, format='JPEG')
byte_data = output_buffer.getvalue()
base64_str = base64.b64encode(byte_data).decode('utf-8')
return base64_str
if __name__=="__main__":
"""
txt文件和圖像(png)文件,均存儲在下面這個文件夾下
生成的json文件,也保存到這個文件夾下
"""
file_dir = r"E:\temp"
file_name_list = [file_name for file_name in os.listdir(file_dir) \
if file_name.lower().endswith('txt')]
for file_name in file_name_list:
str_json = generate_json(file_dir, file_name)
json_data = json.dumps(str_json, indent=2, ensure_ascii=False)
jsonfile_name = file_name.replace(".txt", ".json")
f = open(os.path.join(file_dir, jsonfile_name), 'w')
f.write(json_data)
f.close()
檢驗下生成的json,是否成功。用labelme打開,查看標註結果,進行檢驗:
這裡與bbox的區別就在於:
所以,在poly中坐標點的數量是不固定的。在讀取時候,依次將坐標點存儲進來就行
import json
import base64
from PIL import Image
import io
import os
import cv2
import numpy as np
def generate_json(file_dir, file_name):
str_json = {}
shapes = []
# 讀取坐標
fr = open(os.path.join(file_dir, file_name))
for line in fr.readlines(): # 逐行讀取,濾除空格等
print(line.strip())
print(type(line.strip()))
lineArr = line.strip().split(',')
print("lineArr:", lineArr)
points = []
for i in range(0, len(lineArr), 2):
points.append([float(lineArr[i]), float(lineArr[i+1])])
print(points) # 從左上點開始順時針旋轉的四個頂點的坐標
shape = {}
shape["label"] = "plate_1"
shape["points"] = points
shape["line_color"] = []
shape["fill_color"] = []
shape["flags"] = {}
shapes.append(shape)
str_json["version"] = "3.14.1"
str_json["flags"] = {}
str_json["shapes"] = shapes
str_json["lineColor"] = [0, 255, 0, 128]
str_json["fillColor"] = [255, 0, 0, 128]
picture_basename = file_name.replace('.txt', '.png')
str_json["imagePath"] = picture_basename
img = cv2.imread(os.path.join(file_dir, picture_basename))
str_json["imageHeight"] = img.shape[0]
str_json["imageWidth"] = img.shape[1]
str_json["imageData"] = base64encode_img(os.path.join(file_dir, picture_basename))
return str_json
def base64encode_img(image_path):
src_image = Image.open(image_path)
output_buffer = io.BytesIO()
src_image.save(output_buffer, format='JPEG')
byte_data = output_buffer.getvalue()
base64_str = base64.b64encode(byte_data).decode('utf-8')
return base64_str
if __name__=="__main__":
"""
txt文件和圖像(png)文件,均存儲在下面這個文件夾下
生成的json文件,也保存到這個文件夾下
"""
file_dir = r"E:\temp\polygon"
file_name_list = [file_name for file_name in os.listdir(file_dir) \
if file_name.lower().endswith('txt')]
for file_name in file_name_list:
str_json = generate_json(file_dir, file_name)
json_data = json.dumps(str_json, indent=2, ensure_ascii=False)
jsonfile_name = file_name.replace(".txt", ".json")
with open(os.path.join(file_dir, jsonfile_name), 'w') as f:
f.write(json_data)
同樣,labelme打開,查看標註結果:
參考連結:https://blog.csdn.net/skye_95/article/details/103635846
課程推薦:NumPy 手碼一層神經網絡,訓練貓咪二分類
神經網絡越寫越深,參數容量越來越大。那只有一層的神經網絡,能不能訓練用於識別可愛的貓咪呢?
這篇文章不再用 TensorFlow、PyTorch 等人工智慧的框架,採用最基礎的數學庫 NumPy,手把手帶你一步步吃透深度學習最基礎知識點:
數據的讀取與分析
NumPy 定義一層網絡的權重 w 和偏置 b,並初始化網絡
定義損失函數、參數梯度優化
整體梳理數據的流向和計算
總結
學完本Chat,希望能幫助你對深層、複雜的神經網絡有更加深刻的理解。對網絡中的數據流向、參數優化有更加清晰的認識。
獲取連結方式:
1.點擊「閱讀原文」,直達獲取連結。
2.可在公眾號聊天框,回復關鍵字「gitchat」,獲取直達連結。