在做目标检测任务时,需要进行标注,选择了LabelImg作为标注工具,下面是安装及使用过程。
我们使用Anconda的虚拟环境进行安装,激活环境后,执行:
pip install labelimg -i https://pypi.tuna.tsinghua.edu.cn/simple
安装结束后,输入labelimg即可。
然后我们还需要设置一下点击View显示如下图,然后把如下的几个选项勾上:
Auto Save mode
:当你切换到下一张图片时,就会自动把上一张标注的图片标签自动保存下来,这样就不用每标注一样图片都按Ctrl+S保存一下了Display Labels
:标注好图片之后,会把框和标签都显示出来Advanced Mode
:这样标注的十字架就会一直悬浮在窗口,不用每次标完一个目标,再按一次W快捷键,调出标注的十字架。
然后我们就可以进行标注了,博主标注格式为VOC,首先需要创建好对应的文件。
- JPEGImage 目录:存储的图片
- Annotation 目录:用于存放标注图片的标签文件
- predefined_classes.txt 文件:定义自己要标注的所有类别
然后我们需要定义好自己想要标注的类别,博主初步定义如下:
bus person car sign light
其中sign包含路牌,交通标识等,light指的是信号灯。
我们先将数据集统一重命名
import os
# 图片存放的路径
path = r"E:/KITTI/jiamusi/VOC/JPEGImage/"
# 遍历更改文件名
num = 1
for file in os.listdir(path):
os.rename(os.path.join(path,file),os.path.join(path,str(num))+".jpg")
num = num + 1
完成后labelimg打开 Open Dir 进行标注,w 快捷键进行标注:
标注完成:
Ctrl+S保存生成的标注文件
<annotation>
<folder>JPEGImage</folder>
<filename>1.jpg</filename>
<path>E:\KITTI\jiamusi\VOC\JPEGImage\1.jpg</path>
<source>
<database>Unknown</database>
</source>
<size>
<width>6960</width>
<height>4640</height>
<depth>3</depth>
</size>
<segmented>0</segmented>
<object>
<name>person</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>3106</xmin>
<ymin>2119</ymin>
<xmax>3364</xmax>
<ymax>2907</ymax>
</bndbox>
</object>
<object>
<name>person</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>3359</xmin>
<ymin>2225</ymin>
<xmax>3617</xmax>
<ymax>2878</ymax>
</bndbox>
</object>
<object>
<name>car</name>
<pose>Unspecified</pose>
<truncated>1</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>5894</xmin>
<ymin>2307</ymin>
<xmax>6960</xmax>
<ymax>3519</ymax>
</bndbox>
</object>
<object>
<name>car</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>6023</xmin>
<ymin>2155</ymin>
<xmax>6700</xmax>
<ymax>2513</ymax>
</bndbox>
</object>
<object>
<name>car</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>3641</xmin>
<ymin>2296</ymin>
<xmax>3829</xmax>
<ymax>2419</ymax>
</bndbox>
</object>
</annotation>
至此便标注完成了。
在上面中我们将自己的数据集完成了标注,那么接下来便是使用自己的数据集进行训练了。
我们看一下数据集标注的效果。分为3种,xml为voc格式,txt为yolo格式,json为coco格式。
这里的文件放置比较杂乱,我们将其分一下:
#将指定文件复制到某个文件夹中
def copyfile():
import os
import shutil
data_path = 'E:/KITTI/jiamusi/VOC/Annotation/'
for root, dirs, files in os.walk(data_path):
for file in files:
if file.endswith("xml"):
old_file_path = os.path.join(root, file)
# print(old_file_path)
new_path = 'E:/KITTI/jiamusi/VOC/COCO_Annotation/'
if not os.path.exists(new_path): # 创建新文件夹
os.makedirs(new_path)
new_file_path = new_path + '/' + file
print(new_file_path)
shutil.copyfile(old_file_path, new_file_path) # 复制文件
print('finished!')
这里我们可以判断下是否有标注遗漏的:
def serach():
import fnmatch
import os
data_path = 'E:/KITTI/jiamusi/VOC/VOC_Annotation/'
file_path = 'E:/KITTI/jiamusi/VOC/JPEGImage/'
data_list = []
file_list = []
for root, dirs, files in os.walk(data_path):
for file in files:
data_list.append(os.path.splitext(file)[0])
for root, dirs, files in os.walk(file_path):
for file in files:
file_list.append(os.path.splitext(file)[0])
diff = set(data_list).difference(set(file_list)) # 差集,在a中但不在b中的元素
for name in diff:
print("no file", name + "in data")
diff2 = set(file_list).difference(set(data_list)) # 差集,在b中但不在a中的元素
for name in diff2:
print("no data", name + "in file")
完成后便可以开始数据集处理了。
我们首先使用voc格式进行实验。
详情可用参考我的博客:
YOLOV7调试记录