使用 labelme 批量标注时会遇到一个问题:
labelme 的 json 只保存一张图中存在的标注,这意味着一张图中不包含所有类别的时候,它的标注颜色(值)不一样,相当于类别标注错误了,这样的数据肯定是不能送去训练的。
(比如这批数据总共有类别 [ ‘a’, ‘b’, ‘c’, ‘d’, ‘e’],分别对应值[1,2,3,4,5]而这张图只包含[ ‘a’, ‘c’, ‘e’],json中只保存ace,在转化成mask图时图中类别和对应的值会变成{ ‘a’->1 , ‘c’->2 , ‘e’->3 },这样类别就错误了)
解决方法
:json中保存的类别是标注时输入的字符串,因此只需要修改 labelme_json_to_dataset 指令执行的文件,使字符串和类别值对应上就可以了。
先看看 labelme_json_to_dataset 指令的入口在哪里
which labelme
得到
/anaconda3/bin/labelme_json_to_dataset
从 /anaconda3/bin 里找到
labelme_json_to_dataset
打开看到
from labelme.cli.json_to_dataset import main
接下来需要找到labelme.cli
打开python,输入
import labelme
print(labelme.__file__)
得到 labelme 路径
/anaconda3/lib/python3.8/site-packages/labelme/__init__.py
从labelme路径进入cli
修改 json_to_dataset.py 文件
找到
label_name_to_value = {"_background_": 0}
在字典中自定义自己的类别就行了
label_name_to_value = {"_background_": 0,
'dam':1,
'water':2,
'mountain':3,
'shore':4,
'sky':5,
'tree':6}
批量转化方法:
写一个shell脚本,我这里是把 .json 文件全部放到一个 json 文件夹中,新建一个 data 文件夹存放解压 .json 的数据,data 文件夹中有 train_imgs 和 train_labels 两个文件夹,将原图和mask图解压分别存入两个文件夹。
#!/bin/bash
path='./json'
files=$(ls $path)
for filename in $files
do
a=${filename%.*}
labelme_json_to_dataset $path/$filename -o ./data
cd data
mv img.png $a.png
mv $a.png train_imgs
mv label.png $a.png
mv $a.png train_labels
cd ..
done
cd data
rm label_viz.png
rm label_names.txt