前提
最近要用yolov5训练看效果,发现网上很多博文都有点问题,感觉不适合我,就自己整理一下,给各位做个参考。
声明一下啊,代码有些是网上找的,然后根据我自己需求改了一下,侵权可以联系我删除。
电脑已配置conda环境,使用pycharm,仅供参考。
一、图像标注
我这里使用的Anaconda,打开Anaconda Prompt,创建一个环境(已有环境可以忽略这步)
conda create -n env_name python=x.x
env_name是环境名,随便取一个能记住的就行,python=x.x是指定python版本。
我这里使用3.9,环境名为了好记取了py39,进入环境
conda activate py39
安装labelimg
pip install labelimg
运行labelimg
labelimg
Open Dir是需要标注的图片路径,Change Save Dir是标注完图片保存的路径,第三个是指保存的格式,现在这个代表保存为VOC格式。
标注前建议打开自动保存,View-->Auto Save Mode。快捷键W为开始画框,A和D控制上下张。
二、数据处理
数据标注完成后,打开yolo v5文件夹,找到yolo v5下data文件夹,在其中新建一个文件夹,命名能记住就行,我标记了几张江西脐橙的数据,此处命名为jiangxi_qicheng。
将图片和标签丢进这个文件夹里,图片文件夹命名为images,标签文件夹命名为xml。
这里有个问题,你如果是按照我的方法来做,标签就是voc格式(文件拓展名为xml),如果你直接标注为yolo格式(拓展名为txt),按照后面的代码就运行不了,我懒得改代码了,如果你是yolo格式,可以使用下方代码,把yolo转换成VOC格式。
import os
import cv2
import pathlib
from xml.dom.minidom import Document
# 支持多种格式图片,可以自己添加
def search_file_name(file_path, img_root):
file_format = ['.jpg', '.JPG', '.png', '.PNG', '.JPEG', '.jpeg', '.bmp']
file_path = pathlib.Path(file_path)
file_name = file_path.stem
for endsw in file_format:
file_judge = file_name + endsw
if os.path.isfile(os.path.join(img_root, file_judge)):
return file_name, endsw
return 'stop', 0
def yolo2voc(src_img_root, src_label_root, dst_label_root, class_map):
not_have_img = []
if not os.path.exists(dst_label_root):
os.makedirs(dst_label_root)
# 遍历所有txt文件
for i, src_label_name in enumerate(os.listdir(src_label_root)):
xmlBuilder = Document()
annotation = xmlBuilder.createElement("annotation") # 创建annotation标签
xmlBuilder.appendChild(annotation)
src_label_path = os.path.join(src_label_root, src_label_name)
file_name, endsw = search_file_name(src_label_path, src_img_root)
if file_name == 'stop':
not_have_img.append(os.path.basename(src_label_path))
continue
with open(src_label_path, 'r')