本文针对于刚接触深度学习的小白(我也是这学期才开始接触,嘿嘿嘿)。今天,让我们从安装pycharm开始,搭建yolov5(建议使用,因为比较成熟了,而且后面的模型转化会很方便)环境(我用yolov7作演示,主要是两者的方式基本一致,顺便试验一下能不能跑通),制作数据集,通过租赁服务器运行代码并将最终结果量化为tflite并部署到Android Studio上生成APP。
首先,为什么要用专业版的Pycharm捏。我们登录官方的网站:https://www.jetbrains.com/pycharm/download/#section=windows
发现分为Community和Professional两个版本,如果你的主机上有2080ti,3060,3090,Tesla V100······的话,你两个都可以进行选择,但是如果你和我一样囊中羞涩,请安装专业版,因为他能连接云服务器租赁显卡来进行深度学习。对于自己有显卡的小伙伴,也可以按照我们的步骤下去,当然也可以安装cuda,安装cuda版本的pytorch在本机上进行运行。
我个人使用的是AutoDL(新注册一个账号就能免费获得5个小时的3090,只要你脸皮够厚,就能无限使用),如果你已经有了其他的云服务器平台,可以跳过这一环节。首先登陆矩池云的服务器租赁平台,进行简单的注册,微信绑定:
https://www.autodl.com/home
然后我们选择“我的实例”,租用新实例,会看到
这里推荐使用深圳A区,个人觉得地域会极大程度上后面数据上传的速度,所以可以选择离自己近一些的服务器。比如这里我选择深圳A区的3090,然后挑选镜像,这边我们选择pytorch1.9.0,python3.8,cuda11.1。
然后你就可以在“我的实例”中看到自己的服务器打开了,上面有自己的登陆指令。接下来返回Pycharm。(完成此项目不需要安装Anaconda,更不需要配置虚拟环境,都在服务器中完成环境配置)
首先,点击Pycharm的右下角<无解释器>,选择添加解释器
选择SSH解释器,将登陆指令的第一个填入主机,将其中的数字(我这边是53560)填入后方的端口,然后删除包括@之前的所有内容!删除包括@之前的所有内容!删除包括@之前的所有内容!用户名填写root,点击连接:
复制,粘贴密码后进入此界面。这里,解释器选择/root/minicinda3/bin/python,同步文件夹选择root/autodl-tmp,千万不要用默认的同步文件夹,否则以后要多次使用此文件夹时你就会感受到绝望。
最后,在终端Terminal中选择我们刚才创建的服务器就完成了第一阶段的所有任务(完成后你可以先关机,没为什么,省钱)
https://github.com/search?q=yolov5&type=
https://github.com/search?q=yolov7
在github上搜索yolov5或者yolov7,点击star数量最多的那一个并进行下载,解压,打开,你会得到如下的画面:
我们所要关注的只有三个文件,train.py,detect.py和自己生成的dataset.yaml
首先来说dataset.yaml,它的目的就是引入你的数据集路径(可以是相对路径,也可以是绝对路径),见下面的代码,因为最后我们要将代码在服务器中运行,所以路径并不是常见的C:///或者D:///,具体会在下一章节进行解释。nc表示的是接下来你的模型准备的分类个数,names表示分类的名称,这里一定要记住names的标签顺序,对于最后的APP顺序有不可忽视的影响。
train: /root/autodl-tmp/main/images/train # train images
val: /root/autodl-tmp/main/images/val # val images
test: /root/autodl-tmp/main/images/test # test images (optional)
# Classes
nc: 2 # number of classes
names: ['face','mask'] # class names
其次是train.py,我们将注意力放到这边:
第一个表示的是刚才我们放在data下的dataset.yaml文件,需要进行修改。第二个参数表示Epoch的迭代次数,yolov5和yolov7的设置稍有不同,yolov7的训练速度明显提升了,设置成200-300也没有什么关系。yolov5训练速度则相对较慢,基本迭代到100已经完全收敛了(不是太复杂的数据集),所以设置成100就行。第三个参数表示的是每次训练的图片数量,理论上其值越大,模型收敛的越快,模型的训练要过越好,但是明显的,其占用的显存也就越大,这里设置成8,16,32都可以。
如果想在没有自己训练结果的情况下得到目标检测的结果,可以从刚才下载文件的地址下方(yolov7)或者自带的文件夹中(yolov5)得到预训练权重,然后打开prcharm终端,输入:
python detect.py --weights yolov7.pt --conf 0.25 --img-size 640 --source inference/images/horses.jpg
来检测官方的示例图片。然后就可以在./runs/detect/exp中看到已经运行的图片结果。
接下来就要制作数据集了,这里以我的口罩检测数据集为例,首先,你得有一堆照片,可以去网上爬虫,当然向我们这种懒人直接下载我帮你们整理好的轻量级数据集就行,网盘链接我放在下边。
链接:https://pan.baidu.com/s/1Y47KpOmV4Y6q796a02SlQQ
提取码:gyo5
如果你想要自己制作一个数据集,请将图片按照这种格式进行排列,其中test,val,test的比例可以按照7:1.5:1.5进行分配:
其中,labels是标注,需要你通过labelimg,VOTT之类的标注软件进行标注,一个字,累,两个字,很累。作为一个一天标注过4000张图片的人来说,我太懂这种痛苦了。所以,作为新手教程,可以直接使用我的数据集,然后把.cache的所有文件给删掉,防止后面报错。
接下来将刚才关掉的服务器开机,哔~,这时候,你需要一个名叫FileZilla的软件来将你刚才的数据集放到root/autodl-tmp/下面。这个软件的按照包我也放在下面了,乌拉乌拉。
链接:https://pan.baidu.com/s/1K7fidcml-KMv5qb63o6BZg
提取码:zrbl
接下来,打开FileZilla,选择文件,打开站点管理器,和刚才连接一样,填写主机,端口号,选择协议为SFTP(玩过树莓派的应该熟悉的很)。登陆类型,用户,密码乖乖填写,然后连接,哔~,就连上了。然后,在右方找到root/autodl-tmp,将刚才下载好的main整个玩意儿拖过去就行了。
回到Pycharm,在服务器终端先输入这个来配置运行环境
pip install -r requirement.txt
然后再输入这个开始训练:
python train.py --workers 8 --device 0 --batch-size 16 --data data/dataset.yaml --img 640 640 --cfg cfg/training/yolov7.yaml --weights '' --name yolov7 --hyp data/hyp.scratch.p5.yaml
至于为啥不用Multiple GPU training,问就是没钱。实际上跑yolo这种模型,一张3090很够用了,而且我们的数据集也不大。
接下来,你就会很兴奋的看到在运行了:
QQ录屏20220717213551(1)
等待20-30分钟,就能在服务器中看到run这个文件夹了,对于yolov5来说,直接把整个文件夹拖动到自己的电脑上就行,对于yolov7的玩家,千万不要整个拖过来,因为yolov7保存的并不只有best.pt和last.pt,还有每隔50个epoch就保存的各种pt文件,所以,只要把best.pt和last.pt拖动过来,然后再把另外的不是pt文件的所有文件移动过来就行,就像这样
里面的各种文件是什么意思我就不解释了喔,只要得到了best.pt,你就已经成功了。
这一步原理很复杂,但是我们操作很简单,网上也有很多的视频和博主进行讲解,这边我们以操作实践为主,先不过多赘述。使用yolov5的玩家直接运行以下的两个命令就行,将其转化为fp16或者int8的tflite,yolov7的玩家就比较惨了,需要按照基本流程,回到熟悉的ONNX轨道完成模型转化,毕竟现在官方的转化方式还没出来。
python export.py --weights best.pt --include tflite --img 320
python export.py --weights best.pt --include tflite --img 320 --int8
生成best-fp16.tflite后接下来的这一步非常的关键,对于后面生成APP至关重要,就是要确认你的输入和输出的各种参数,原理也不用清楚,直接含泪拿代码去用吧:
import tensorflow as tf
yolo = 'best-fp16.tflite'
interpreter = tf.lite.Interpreter(model_path=yolo)
print(interpreter.get_input_details())
print(interpreter.get_output_details())
哦哦哦对了,各位还要安装一下tensorflow啊,有anaconda的小伙伴应该也不用我教了,pip install 就行,没有anaconda的解释器那边的+号输入tensorflow安装即可。
下面的两行就是一会我们要用到的参数。
首先,你得有一个Android Studio,官方下载比较坑,建议再Edge中下载,不要用QQ浏览器,谷歌浏览器。然后万一下载不成功,网页一直是白色的在那转圈圈,就把https://巴拉巴拉改成http://巴拉巴拉,大概率就开始下载了,然后就是安装啥的,可以借鉴别的博主,应该没啥难度。
然后在这里感谢哔哩哔哩up主“薛定谔的AI”对于我的帮助,以及他在github上的公开代码,以及讲解非常详细的视频,在这里附上他的视频,以及GitHub的代码:
https://www.bilibili.com/video/BV1La411e7NC?spm_id_from=333.999.0.0&vd_source=1503406ceaa38ef2b7a80858cc245359
https://github.com/yyccR/yolov5-tflite-android
解压后在Android Studio中打开工程,如果是第一次,首先会碰到的第一个问题就是gradle文件报错,这时候没关系,点击红色的连接进行下载,将安装包放到如下的目录中(不要解压),就像这样:
然后我们重启Android Studio,这时候,我们唯一需要改动的文件就是Yolov5TFLiteDetector.java,为四要修改的参数在图中已经标注(fp16),如果你使用量化为int8格式的tflite,请按照上面介绍的那位大佬的视频进行进一步的修改。320,320就是我们刚才得到的输入图片的大小。6300和7就是输出,然后把第三个方框改成自己的tflite文件,第四个txt需要自己写,注意顺序和训练时候的标注顺序相同,前面已经提醒过一次啦:
然后我们点击运行,如果没有虚拟设备的话就下载一个,建议安卓9(黑鲨2使用者,无比骄傲)主要是其兼容性比较好,安卓11,12会有时出现排版错乱的问题。
然后我们点击运行,如果没有问题的话(应该不会出问题吧,各位老铁)就生成apk文件,点击build,生成apk,然后一系列简单易懂的操作就能在release中得到apk文件,然后你进行安装,使用,得到最终的结果:
每秒10帧左右,运行起来比较流畅。
至此,我们这一个时间部分就完成了。大二下这学期开始接触深度学习以来,一直都是很有趣的,也接触了很多有意思的设备,比如说树莓派,K210,pynq-z2,roc-rk3588s等,如果大家对于这些设备有什么不懂的问题的话,可以在评论区留言,大家一起讨论。作为第一篇博客(《有关于机器人巡逻的一些有趣猜想》不算,去年发的一篇个人认为很有意思的文章,我用了一个很简单又很有趣的想法解决机器人的巡逻路线问题),也是对于自己的鼓励吧,接下来我会多发一些有关于边缘AI,或者是数学建模的文章,和大家一起讨论。