(实训任务)yolov5分类 -- 舌象目标分类

目录

一、 使用yolov5 进行舌象目标分类的背景和目的

二、 任务步骤:

三 、数据集的准备(TCMID-Tongue):

四 、数据预处理:

4 .1 、 xml文件转txt文件(编写一个xml转txt脚本 xml2txt.py)

4.2 生成数据集数据的图片路径

4.3 、编写yaml 文件

 4.3.1 、编写 yaml文件1(里面存放训练、测试、预测路径 、分类的数量、分类的目标标签)

一般放在data目录(也可以自定义)下

 4.3.2 、编写 .yaml 文件二, 在models 目录下 复制(使用什么模型就复制哪个)一份 模型yaml文件(记录一些权重参数)

五 、训练和预测:

5.1 、开始训练(train.py)

5.1.1 、方法一:命令行方式

5.1.2 、方式二:修改train.py 一键运行

5.2 、开始预测(detect.py):

5.2.1 方式一:命令行启动

5.2.2 、方式二:修改detect.py一键运行


 

一、 使用yolov5 进行舌象目标分类的背景和目的

背景:舌象是中医诊断学的一项重要内容,也是应用传统经验、辅助医生指导医治疾病的方法之一。随着计算机视觉技术的发展,将舌象数字化并进行自动化分析已成为研究热点。其中,舌象目标分类任务是舌诊图像处理的一个重要步骤。

目的:深度学习技术在舌象分类任务上表现优异。其中,YoloV5 是一种基于 PyTorch 实现的深度学习目标检测框架。相比其他目标检测框架,YoloV5 具有模型轻量、速度快、检测精度高等优点。因此,使用 YoloV5 进行舌象目标分类任务,可以帮助中医医生快速准确地进行舌象诊断,提高中医诊断的精度和效率。

二、 任务步骤:

Yolov5作为目标检测框架,首先需要进行训练。下面是使用yolov5进行舌象目标分类任务的流程:

1. 数据集准备:收集标注好的舌诊图像数据集,并将其制作成 Yolov5 能够处理的格式,比如 COCO 格式。

2. 模型选择:根据数据集情况和任务需求,选择合适的 Yolov5 模型进行训练,例如 Yolov5s、Yolov5m、Yolov5l 等不同规模的模型。

3. 模型训练:利用所选模型对准备好的舌象图像数据集进行训练,训练过程需要注意合适的超参数设置(如学习率等)以及数据增强手段的运用(如随机裁剪、旋转等)。

4. 模型验证:使用测试集验证模型的准确率、召回率等指标,并根据评估结果反复调整模型参数。

5. 模型部署:在实际应用中,把训练好的模型部署到相应的平台上面,这需要对框架进行适当的修改来保证其与部署环境完全兼容。

值得注意的是,在进行舌象目标分类任务时,需要特别关注模型的分类结果是否符合中医常识。因为在现实舌诊中,不同类型的舌象可能存在相互重叠、混杂等情况,所以模型的设计和训练需要考虑到这方面特殊性。

 

三 、数据集的准备(TCMID-Tongue):

TCMID-Tongue(中医药信息数据库-舌象数据集)是由中国中医科学院中药研究所提供的,是一个主要用于中医诊断的公开舌象图像分类数据集。该数据集收集了1040张高分辨率的舌象图像,并涵盖了17种不同类型的舌象,包括苔质、暗红、淡红等。每张图片都配有对应的文字描述以及标签。

此次数据集(Tongue.zip)收集了1472张高分辨率的舌象图像以及对应的标签。

2cec1fd3a8364f13ab476286cf3479b7.png24992c1a630546ba8b0d22c0d61dad01.pnga62eac59cc68427ba55d1aea9b2e0c68.png

 

 1151ecacb0d24c75a674aa3414d9e112.png8755325115c743b98242c3c290d07b51.png

 目标:利用yolov5 进行五分类任务、训练出一个模型测试数据。

分类目标:Mirror-Approximated、Thin-white、White-Greasy、Yellow-Greasy、Grey-Black (镜像近似,薄白,白油腻,黄油腻,灰黑 ) 

四 、数据预处理:

4 .1 、 xml文件转txt文件(编写一个xml转txt脚本 xml2txt.py)

代码如下: 

import os
import xml.etree.ElementTree as ET

ANNOTATIONS_DIR = 'C:\\Users\\Administrator\\Desktop\\Annotations'  # xml标签目录路径
# CLASSES_FILE = "path_to_classes_file"
YOLO_OUTPUT_DIR = 'C:\\Users\\Administrator\\Desktop\\labels'  # 生成的txt标签目录路径

classes = ['Mirror-Approximated', 'Thin-White', 'White-Greasy', 'Yellow-Greasy', 'Grey-Black']
# with open(CLASSES_FILE, "r") as f:
#     classes = [line.strip() for line in f.readlines()]

if not os.path.exists(YOLO_OUTPUT_DIR):
    os.makedirs(YOLO_OUTPUT_DIR)

for filename in os.listdir(ANNOTATIONS_DIR):
    if not filename.endswith(".xml"):
        continue
    xml_file_path = os.path.join(ANNOTATIONS_DIR, filename)
    tree = ET.parse(xml_file_path)
    root = tree.getroot()
    size = root.find("size")
    if size is None:
        print(f"Annotation file {filename} has missing size information. Skipping...")
        continue
    width = int(size.find("width").text)
    height = int(size.find("height").text)
    if width <= 0 or height <= 0:
        print(f"Image in {filename} have invalid size ({width}*{height}). Skipping...")
        continue
    output_filename = os.path.splitext(filename)[0] + ".txt"
    output_file_path = os.path.join(YOLO_OUTPUT_DIR, output_filename)

    with open(output_file_path, "w") as out_file:
        for obj in root.iter("object"):
            class_name = obj.find("name").text
            if class_name is None or class_name not in classes:
                print(f"Object {obj} in {filename} has invalid category name {class_name}. Skipping...")
                continue
            class_index = classes.index(class_name)
            bndbox = obj.find("bndbox")
            if bndbox is None:
                print(f"Object {obj} in {filename} has missing bounding box information. Skipping...")
                continue
            x_min = int(bndbox.find("xmin").text)
            y_min = int(bndbox.find("ymin").text)
            x_max = int(bndbox.find("xmax").text)
            y_max = int(bndbox.find("ymax").text)
            if x_min >= x_max or y_min >= y_max or x_min < 0 or y_min < 0 or x_max > width or y_max > height:
                print(
                    f"Object {obj} in {filename} has invalid bounding box coordinates ({x_min},{y_min})-({x_max},{y_max}). Skipping...")
                continue
            x_center = (x_min + x_max) / 2 / width
            y_center = (y_min + y_max) / 2 / height
            w = (x_max - x_min) / width
            h = (y_max - y_min) / height
            out_file.write("{} {:.6f} {:.6f} {:.6f} {:.6f}\n".format(class_index, x_center, y_center, w, h))

运行后的效果:

139f52e9b6884d96836013e78faba99c.png

 

4.2 生成数据集数据的图片路径

247565224df341af923857c330d58bac.png

 查看该目录发现,这里记录了一些,需要分类的标签和训练、测试、预测的目标。

但是训练、测试、预测所加载的txt文件记录的不是图片的路径,因此,需要手动去编写 图片的路径。

如: 0fbddecdf7224df5bc67855db91e9973.png

编写一个python脚本去自动生成路径

2fc9cb3cc84448348d82fb23b3e5def3.png

代码如下:

import os

img_dir = "C:\\Users\\Administrator\\Desktop\\yolov5-master\\JPEGImages\\images"  #
img_dir1 = "C:\\Users\\Administrator\\Desktop\\yolov5-master\\JPEGImages"
with open(img_dir1+'/test.txt','r') as f:
    # print(f)
    data = f.read().split()

paths = []

for i in range(len(data)):
    path = os.path.join(img_dir, data[i])
    path = path + '.jpg'
    paths.append(path)
    # path = os.path.join(path, '.jpg')
print(paths)
with open(img_dir1+'/test.txt','w') as f:
    f.write('\n'.join(paths))

运行后的效果: 6b7870ff3e784637b708425c52748860.png

4.3 、编写yaml 文件

 4.3.1 、编写 yaml文件1(里面存放训练、测试、预测路径 、分类的数量、分类的目标标签)

一般放在data目录(也可以自定义)下

示例如下:

8294bc182b5a4609ada3a1e33a56319d.png

bcd3364f66d94dffb25928f34601dafe.png

 4.3.2 、编写 .yaml 文件二, 在models 目录下 复制(使用什么模型就复制哪个)一份 模型yaml文件(记录一些权重参数)

将复制的模型yaml放到指定目录(一般还是放在models下面)

示例如下:

91424d7c174d407c9d6b27325ef81ce6.png

五 、训练和预测:

5.1 、开始训练(train.py)

5.1.1 、方法一:命令行方式

python train.py --data coco.yaml --epochs 300 --weights '' --cfg yolov5n.yaml  --batch-size 128
                                                                 yolov5s                    64
                                                                 yolov5m                    40
                                                                 yolov5l                    24
                                                                 yolov5x   

5.1.2 、方式二:修改train.py 一键运行

d8c977ea904d42829b593340e524038a.png

具体参数修改看这个,百度也行。

运行如下:

cc38b7986a754766a7931747e1569e33.png

7c2138f99543452eba03922f93afc70d.png

查看结果图、和训练过程分析文件。(runs目录下)

506c24c454704581a3b2c02830ebd547.png

5.2 、开始预测(detect.py):

5.2.1 方式一:命令行启动

python detect.py --weights yolov5s.pt --source 0                               # webcam
                                               img.jpg                         # image
                                               vid.mp4                         # video
                                               screen                          # screenshot
                                               path/                           # directory
                                               list.txt                        # list of images
                                               list.streams                    # list of streams
                                               'path/*.jpg'                    # glob
                                               'https://youtu.be/Zgi9g1ksQHc'  # YouTube
                                               'rtsp://example.com/media.mp4'  # RTSP, RTMP, HTTP stream

5.2.2 、方式二:修改detect.py一键运行

08ac8d4fb18e469d9d15287cc60f1b3c.png

 具体参数修改 百度查阅。 

查看预测结果图。(runs目录下)

f67820fa0c8542d99a9bb7acca237f12.png

ok,整个训练过程和预测过程完毕。

 

 

 

 

 

  • 5
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 21
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

挽风起苍岚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值