项目名称
《基于Yolov5算法的中老年人带状疱疹皮肤病检测》
项目简介
本项目基于yolov5算法进行皮肤病检测,实现识别带状疱疹皮肤病的任务。带状疱疹为中老年人常见感染性皮肤病之一,为了帮助中老年人预防常见感染性疾病,我们将从网络中搜集大量针对带状疱疹检测的数据集,然后用labelImg对采集得到的照片进行特征标注在输入到yolov5算法模型,最后得到检测模型后在AidLux进行部署。本文重点介绍如何使用AidLu进行带状疱疹皮肤病的检测。
预期效果
本项目基于Yolov5-Lite模型,利用安装AidLux的安卓手机实现,设备型号小米11,骁龙865,8+256。本项目在医疗市场上存在巨大的潜在价值。当前,随着我国人口老龄化的加剧,针对中老年慢性病,提高基层防病治病和健康管理能力显得尤为重要。我们的项目针对带状疱疹的检测,有利于中老年慢性疾病的防治。本项目响应“健康老龄化”的政策,可从主流医院开始推广,慢慢到各大医院。每年带状疱疹的患者都在增加,可给医院提供一种高效的检测手段,。除此之外,也可在中老年人社区中推广运行,中老年人能够较早发现自己的病症,即可进行及时就医。
对于开发者而言,AI项目中各种算法的数据集准备+模型训练+模型部署依然存在着不小的难度。AidLux的出现,可以将我们的安卓设备以非虚拟的形式变成同时拥有Android和Linux系统环境的边缘计算设备,支持主流AI框架,非常易于部署,还有专门的接口调度算力资源,极大地降低了AI应用落地门槛。
操作流程
以下是操作流程图
1.数据集准备
想要Train一个目标检测模型,训练集是第一步,所以我们使用了python爬虫技术在网上大量爬取了带状疱疹和正常皮肤的相关图片。在本项目中我设置了两种检测类型。
Shigles——(患有带状疱疹皮肤)
Normal——(正常皮肤)
2.数据集标注
在采集完图像数据之后,我们就进入到了数据的标注环节。本项目采用的标注工具为labelme,他的下载和使用非常简单,只需一下两步:
pip install labelme
labelme
唤起labelme图像界面之后,单击左上角的file,我们需要对其进行一些设置:
在配置好我们的输入images文件夹和输出labels文件夹的路径之后,我们就可以进入到标注环节,create rectangle创建矩形框来框住我们图像中的物体。标注的话是个 体力活,体力活,体力活 。
在标注完成后,我们图片的json文件是长这样的:
可以看到这里表示bbox是图像中的真实值,而我们送入yolov5-master里面训练的bbox是需要归一化之后的数据,所以我们对数据经行归一化,即将json文件修改为txt文件,生产符合yolov5-Lite训练格式的文件。同时我们也得分割训练集和测试集。
3、Yolov5的准备
3.1.基本的Python环境配置
我采用的是Anaconda+Pycharm的配置,大家要了解一些关于pip的指令,方便管理包,这里就不赘述了。
3.2.下载Yolov5
https://github.com/ultralytics/yolov5,放在合理的位置,如果这个下的慢的话见文末资源
3.3.安装依赖库
当我们下好yolov5后,可以发现有一个requirements.txt文件,我们可以使用Anaconda Prompt,切换到咱们Yolov5的位置,pip install -r requirements.txt即可一步到位全部下完。
大部分都能pip install 。重点说两个
(1)对于Pytorch,如果文件较大没有办法下完的话,可以用我下面的网址单独下载whl文件,
https://download.pytorch.org/whl/torch_stable.html
(2)对于wandb,wandb安装方法,这个好像不是必须的,但我还是下了,版本为0.12.19,刚好能兼容,作用就是对训练分析,如图所示
wandb实际上是非必须的,如果影响到了使用,那么在程序中可以把它禁止使用,不影响任何效果。在yolov5/utils/loggers/wandb/wandb_utils.py前面几行,加入如下图所示的第28行输入wandb=None
3.4.初步测试:detect.py
下载完yolov5后,什么都不用改,运行detect.py
这个是帮你检测能不能正常运行的
若正常:
在runs/detect/exp中能发现被处理过的标签,说明成功了!若程序报错,大概率是因为有的库版本不正确或者还未安装,这个自己调试一下即可,应该没有太大难度
4、训练集要求及路径要求
4.1 目录格式
首先按照这个目录格式去建立文件夹。(一定要按照这个格式建立文件夹)
images是图片,labels是标签,train的话是用于训练的,test就是用于测试的
4.2 修改配置文件
1.coco128.yaml->shigles_parameter.yaml
在yolov5/data/coco128.yaml中先复制一份,粘贴到shigles中,改名为shigles_parameter.yaml(意义为shigles的参数配置)
shigles_parameter.yaml文件需要修改的参数是nc与names。nc是标签名个数,names就是标签的名字,带状疱疹的例子中有2个标签,标签名字都如下。
说明:
path是绝对路径
train是在path绝对路径条件下的训练集路径,即:shigles/datasets/images/train
val同上,但是是验证集,这里我为了方便,让训练集和验证集是一个,也没啥大问题。
test可不填nc是训练集中种类的个数,names是他们对应的名字,这个顺序不要混了,尤其是自己打标签时,会有对应的顺序的。
2.yolov5x.yaml->shigles_model.yaml
yolov5有4种配置,不同配置的特性如下,我这里选择yolov5x,效果较好,但是训练时间长,也比较吃显存
在yolov5/models先复制一份yolov5x.yaml至wzry,更名为shigles_model.yaml(意为模型),只将如下的nc修改为训练集种类即可
5、开始训练train
5.1.调参
在train.py,找到def parse_opt(known=False)这行,这下面是我们要修改的程序部分
我标注“修改处”的,是一定要修改的;其他的注释是一些较为重要的参数不改也可以。具体修改的地方为defalut后
479行:是我们训练的初始权重的位置,是以.pt结尾的文件,第一次训练用别人已经训练出来的权重。可能有朋友会想,自己训练的数据集和别人训练的数据集不一样,怎么能通用呢?实际上他们是通用的,后面训练会调整过来。而如果不填已有权重,那么训练效果可能会不好;
480行:训练模型文件,在本项目中对应shigles_model.yaml;
481行:数据集参数文件,在本项目中对于shigles_parameter.yaml;
482行:超参数设置,是人为设定的参数。包括学习率啥的等等,可不改;
483行:训练轮数,决定了训练时间与训练效果。如果选择训练模型是yolov5x.yaml,那么大约200轮数值就稳定下来了(收敛);
484行:批量处理文件数,这个要设置地小一些,否则会out of memory。这个决定了我们训练的速度;
485行:图片大小,虽然我们训练集的图片是已经固定下来了,但是传入神经网络时可以resize大小,太大了训练时间会很长,且有可能报错,这个根据自己情况调小一些;
487行:断续训练,如果说在训练过程中意外地中断,那么下一次可以在这里填True,会接着上一次runs/exp继续训练
496行:GPU加速,填0是电脑默认的CUDA,前提是电脑已经安装了CUDA才能GPU加速训练,安装过程可查博客
501行:多线程设置,越大读取数据越快,但是太大了也会报错,因此也要根据自己状况填小。
5.2.结果
结果保存在runs/train/exp中,多次训练就会有exp1、exp2、等等
best.pt和last.pt是我们训练出来的权重文件,比较重要,用于detect.py。last是最后一次的训练结果,best是效果最好的训练结果(只是看起来,但是泛化性不一定强)。
6、识别检测detect.py
6.1.调参
找到def parse_opt():这行,以下是我们要调参的位置
217行:填我们训练好的权重文件路径
218行:我们要检测的文件,可以是图片、视频、摄像头。填0时为打开电脑默认摄像头
219行:数据集参数文件,同上
220行:图片大小,同上
221行:置信度,当检测出来的置信度大于该数值时才能显示出被检测到,就是显示出来的框框
222行:非极大抑制,具体不赘述了,自行查阅,可不改
224行:GPU加速,同上
9.2.结果
结果在runs/detect/exp中
导出.tflite文件
7.1 tflite介绍
tflite其实就是谷歌自己的一个轻量级推理库。主要用于移动端。之前的tensorflow mobile那一套到2019年就不再维护了。
tflite使用的思路主要是从预训练的模型转换为tflite模型文件,拿到移动端部署。
tflite的源模型可以来自tensorflow的saved model或者frozen model,也可以来自keras。
本项目也使用了tflite文件在Aidlux进行推理,我们先将best.pt文件导出为best.tflite:
7.2 pt模型转换
因为aidlux里面用的是tensorflow框架的tflite模型,所以我们先将训练好的pt模型转换成tflite模型。
先在PC端电脑上,打开yolov5的代码,找到export.py,主要修改两个地方。
第一个是修改模型的路径,即weights的路径,修改export.py文件最下面的parse_opt配置函数。
因为yolov5的模型,放在models文件夹里面,所以将detault修改成“models/yolov5s.pt”。
第二个是修改模型转换成的格式,将include的default修改成“tflite”。
改好文件如下
best.tflite文件导出成功,接下来我们就可以在Aidlux上进行推理测试了。
8 AidLux端进行模型部署
8.1 上传代码到AiLlux
我们首先打开手机版的aidlux,并投影到电脑网页上。然后第一步先将Yolov5的所有代码,上传到aidlux的平台里面。
点击电脑端页面菜单栏的第一个,文件浏览器,打开文件管理页面。
找到home文件夹,并双击进入此文件夹。
点击右上角往上的箭头“upload”,再选择Folder,将前面Yolov5的文件夹上传到home文件夹内。
点击选择上传。
上传好后,在Yolov5的aidlux文件夹中
其中包含了三个文件,yolov5.py是主函数文件,utils.py是配置文件,yolov5s.tflite是模型转换后的文件
8.2 运行对应app_main.py代码
8.3 即可进行带状疱疹皮肤病检测
8.4 AidLux展示效果视频
AidLux部署基于Yolov5算法的中老年人带状疱疹皮肤病检测_哔哩哔哩_bilibili
对AidLux感兴趣的同学,可以加入AidLux官方交流群,群内有官方工程师和AI行业的大神在线互动。