简介:
在机器学习训练中常常会有不同格式的标签之间的转换,在此造个轮子方便使用。
1.labelme标注:
labelme.PNG2.json文件
{
"version": "4.5.6",
"flags": {},
"shapes": [
{
"label": "1",
"points": [
[
1609.6923076923076,
884.6153846153846
],
[
1988.1538461538462,
1172.3076923076924
]
],
"group_id": null,
"shape_type": "rectangle",
"flags": {}
},
{
"label": "0",
"points": [
[
1352.7692307692307,
3.0769230769230766
],
[
1925.076923076923,
578.4615384615385
]
],
"group_id": null,
"shape_type": "rectangle",
"flags": {}
}
],
"imagePath": "..\\imgs\\0001.jpg",
"imageData": null,
"imageHeight": 1492,
"imageWidth": 2040
}
3.json解析:
- annotation里面存放labelme生成的标注文件
- imgs里面存图片
- txtlabel文件夹存放我们转换后的txt标签文件
3.1 从json查看标注结果
import json
import os
import cv2
img_folder_path=r'F:\imagedata\FOV\FOV_SRC_2\imgs'#原图片存放地址
folder_path=r"F:\imagedata\FOV\FOV_SRC_2\annotation"#标注数据的文件地址
# cv2.putText(img, str, (123,456)), font, 2, (0,255,0), 3)
# 各参数依次是:图片,添加的文字,左上角坐标,字体,字体大小,颜色,字体粗细
def show_label_from_json(img_path,json_d):
window_name = ('src')
cv2.namedWindow(window_name,cv2.WINDOW_FREERATIO)
src_img=cv2.imread(img_path)
font = cv2.FONT_HERSHEY_SIMPLEX
for item in json_d["shapes"]:
#print(item['points'])
point=item['points']
p1=(int(point[0][0]),int(point[0][1]))
p2=(int(point[1][0]),int(point[1][1]))
cv2.rectangle(src_img, p1, p2, (0, 255, 0), 2)
cv2.putText(src_img,item['label'],p1,font,2,(0,255,255),3)
cv2.imshow(window_name,src_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
return
i=0
for jsonfile in os.listdir(folder_path):
temp_path=os.path.join(folder_path,jsonfile)
i+=1
if i>5:
break
#如果是一个子目录就继续
if os.path.isdir(temp_path):
continue
print("json_path:\t",temp_path)
temp_path
with open(temp_path, "r", encoding='utf-8') as f:
json_d = json.load(f)
img_name=json_d['imagePath'].split("\\")[-1].split(".")[0]+".jpg"
img_path=os.path.join(img_folder_path,img_name)
print("img_path:\t",img_path)
show_label_from_json(img_path,json_d)
image.png
3.2 json转txt
有些用图片的绝对坐标,有的用相对坐标,下面两种方式都写了
- 相对坐标形式 :label x_center y_center w h
- 绝对坐标形式 :label x1 y1 x2 y2(x1,y1是标记的左上角的坐标,x2 y2右下角坐标)
import json
import os
import cv2
img_folder_path=r'F:\imagedata\FOV\FOV_SRC_2\imgs'#图片存放文件夹
folder_path=r"F:\imagedata\FOV\FOV_SRC_2\annotation"#标注数据的文件地址
txt_folder_path = r"F:\imagedata\FOV\FOV_SRC_2\txtlabel"#转换后的txt标签文件存放的文件夹
#保存为相对坐标形式 :label x_center y_center w h
def relative_coordinate_txt(img_name,json_d,img_path):
src_img=cv2.imread(img_path)
h,w = src_img.shape[:2]
txt_name = img_name.split(".")[0]+".txt"
txt_path = os.path.join(txt_folder_path,txt_name)
print(txt_path)
with open(txt_path,'w') as f:
for item in json_d["shapes"]:
#print(item['points'])
#print(item['label'])
point=item['points']
x_center = (point[0][0]+point[1][0])/2
y_center = (point[0][1]+point[1][1])/2
width = point[1][0]-point[0][0]
hight = point[1][1]-point[0][1]
#print(x_center)
f.write(" {} ".format(item['label']))
f.write(" {} ".format(x_center/w))
f.write(" {} ".format(y_center/h))
f.write(" {} ".format(width/w))
f.write(" {} ".format(hight/h))
f.write(" \n")
#保存为绝对坐标形式 :label x1 y1 x2 y2
def absolute_coordinate_txt(img_name,json_d,img_path):
src_img=cv2.imread(img_path)
h,w = src_img.shape[:2]
txt_name = img_name.split(".")[0]+".txt"
txt_path = os.path.join(txt_folder_path,txt_name)
print("txt_path:\t",txt_path)
with open(txt_path,'w') as f:
for item in json_d["shapes"]:
#print(item['points'])
#print(item['label'])
point=item['points']
x1 = point[0][0]
y1 = point[0][1]
x2 = point[1][0]
y2 = point[1][1]
f.write(" {} ".format(item['label']))
f.write(" {} ".format(x1))
f.write(" {} ".format(y1))
f.write(" {} ".format(x2))
f.write(" {} ".format(y2))
f.write(" \n")
i=0
for jsonfile in os.listdir(folder_path):
temp_path=os.path.join(folder_path,jsonfile)
i+=1
if i>5:
break
#如果是一个子目录就继续
if os.path.isdir(temp_path):
continue
print("json_path:\t",temp_path)
jsonfile_path=temp_path
with open(jsonfile_path, "r", encoding='utf-8') as f:
json_d = json.load(f)
img_name=json_d['imagePath'].split("\\")[-1].split(".")[0]+".jpg"
img_path=os.path.join(img_folder_path,img_name)
print("img_path:\t",img_path)
relative_coordinate_txt(img_name,json_d,img_path)
absolute_coordinate_txt(img_name,json_d,img_path)
3.3 从txt查看标注结果
import json
import os
import cv2
img_folder_path=r'F:\imagedata\FOV\FOV_SRC_2\imgs'#图片存放文件夹
folder_path=r"F:\imagedata\FOV\FOV_SRC_2\annotation"#标注数据的文件地址
txt_folder_path = r"F:\imagedata\FOV\FOV_SRC_2\txtlabel"#转换后的txt标签文件存放的文件夹
#相对坐标格式
def show_label_from_txt(img_path,txt_path):
window_name = ('src')
cv2.namedWindow(window_name,cv2.WINDOW_FREERATIO)
src_img=cv2.imread(img_path)
h,w = src_img.shape[:2]
font = cv2.FONT_HERSHEY_SIMPLEX
with open(temp_path, "r", encoding='utf-8') as f:
lines = f.readlines()
for line in lines:
data = line.split(' ')
label = data[1]
x1 = int((float(data[3]) - float(data[7])/2)*w)
y1 = int((float(data[5]) - float(data[9])/2)*h)
x2 = int((float(data[3]) + float(data[7])/2)*w)
y2 = int((float(data[5]) + float(data[9])/2)*h)
p1 = (x1,y1)
p2 = (x2,y2)
cv2.rectangle(src_img, p1, p2, (0, 250, 0), 2)
cv2.putText(src_img,label,p1,font,2,(0,255,255),3)
cv2.imshow(window_name,src_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
return
i=0
for txtfile in os.listdir(txt_folder_path):
temp_path=os.path.join(txt_folder_path,txtfile)
i+=1
if i>15:
break
#如果是一个子目录就继续
if os.path.isdir(temp_path):
continue
print("txt_path:\t",temp_path)
img_name=txtfile.split("\\")[-1].split(".")[0]+".jpg"
img_path=os.path.join(img_folder_path,img_name)
show_label_from_txt(img_path,temp_path)
image.png
网友评论