目录
踩了太多坑,屡败屡战!
巨大成功,搞了2个小时,终于可以实现,将labelme的标注文件json转换为以下格式了!
踩坑
百度了一堆,我这都不行,咱就是说,一整个拒绝的大动作!下次不要再试了!
尝试了从本地电脑中找到labelme的env还是cli啥的,修改labelme里面的代码,达咩;
尝试写个sh文件直接操作,结果生成了空文件夹,达咩;
尝试了用anaconda中运行这个labelme2dataset.py啥的,达咩;
尝试labelme里的py文件下terminal中激活运行,报错文件权限不对,于是把文件只读格式兴高采烈地改完了,结果改了个寂寞,一会还是悄悄地自己变回只读,达咩;
尝试把脚本文件和labelme放到一个文件夹下,都达咩...猜不透是哪里出了错。
为啥没有yaml
先检查一下你的版本吧,要不还得回炉再造(狗头)
如果本就是低版本的,不管啥能用的代码运行完即可收获5个文件,包括label_viz.png yaml txt等;
如果是新版本的labelme,会发现只有txt等4个文件,没有yaml格式,那是版本高了而已,官方已经用txt取代yaml。需要把labelme的版本降低,在上面的py文件的terminal中写(pycharm就直接找底下的终端),不费事,一行代码:
pip install labelme==3.16.2
咋转换好使
现在版本好了,来说说怎么转换,5行代码非常easy啦,但需格外无比非常注意文件/文件夹的写法!!我大踩坑www
将所有json文件放到一个文件夹,如上,都在bjson文件夹中,里面不需要放对应的images!防止意外,也别整中文路径了。
之后执行代码即可(当然了得先电脑里装着labelme)
import os
path = 'E:/bjson/'
# path为json文件存放的路径,注意这里一定要写到文件夹就行,不要写进去到xx.json
# 这个bjson文件夹里有很多json,写到这种路径下就好!
json_file = os.listdir(path)
for file in json_file:
os.system("activate labelme && labelme_json_to_dataset.exe %s"%(os.path.join(path, file)))
安装好后再运行下面代码就可以了!!生成5个文件了。
16bit转8bit??
很多文章里还写需要将label转成8bit的,也就是别人示例文件夹里的一片黑。
but!!现在转换完的已经是8bit的了,是能可视化的,所以不用再转位深了!!
不信的话,你可以试试,确认一下:
子文件拿出合并,如何批量重命名
转换后的子文件并不能体现他是谁转的,没有代表性,都是人,不知道你叫啥名,谁家的。
如果后续需要将所yaml单独拿出来放一个文件夹里,但是每个都叫info.yaml那不傻了,忙碌了半天的老师傅啥也没留下?
那么如何把里面的都重命名为主文件夹的名字?比如a文件夹下的都叫a.json啥的,b里就是b啥的。这时就需要重命名子文件了:
import os
import shutil
import time
import sys
import importlib
importlib.reload(sys)
def copy_and_rename(fpath_input, fpath_output):
for file in os.listdir(fpath_input):
for inner in os.listdir(fpath_input+file+'/'):
print(inner)
if os.path.splitext(inner)[0] == "label":
former = os.path.join(fpath_input, file)
oldname = os.path.join(former, inner)
print(oldname)
newname_1 = os.path.join(fpath_output,
file.split('_')[0] + ".png")
# os.rename(oldname, newname)
shutil.copyfile(oldname, newname_1)
if __name__ == '__main__':
print('start ...')
t1 = time.time() * 1000
# 自己的文件路径
fpath_input = "xxxx/train_data/labelme_json/"
fpath_output = "xxx/train_data/cv2_mask/"
copy_and_rename(fpath_input, fpath_output)
t2 = time.time() * 1000
print('take time:' + str(t2 - t1) + 'ms')
print('end.')
一顿操作猛如虎,再也不做二百五!