介绍影像辨识的处理流程 - Day 10
所有影像辨识的问题都会面临以下几个问题:图片中有几个要辨识的对象 (影像切割,Image Segmentation),他们的位置在哪里 (对象定位,Object Localization),要如何辨识(影像分类,Image Classification)。而对象侦测 (Object detection) 的技术,就算是对象定位与影像分类的完整解决方案。
从这个概念开始就可以清楚理解,为何近年来对象侦测的算法,有所谓的二阶式 (two-stage),也就是先找到定位的区域 (Region-based Proposal),再来进行影像分类的动作,常见的模型为:Region-CNN,Fast R-CNN, Faster R-CNN;以及一阶式 (one-stage) 高效算法,简单来说就是把定位跟分类一次处理,常见的有:YOLO (You Only Look Once) , SSD (Single Shot Detector),这之中以 YOLO 系列最受大家喜爱。
最初版本的 YOLO 论文公布于 2015 年,主要的作者是 Joseph Redmon,而后续的版本 V2, V3 中他持续改善了效率,图型大小以及定锚 (anchor) 等功能,但是接着的 YOLOV4,V5 作者就不再是他本人。
本项目的主要目的是整合一个全端的辨识系统,所以针对 YOLO 的部份只是将实作部署上去,当然也会分析评估辨识的效果,采用的是 YOLOV3 这个版本,整个过程分成:
- 取得数据集:取得的视频数据。
- 将视频转换成图片,并调成 YOLO 可以处理的大小。
- 数据增量。
- 影像分割与标注。
- 分成训练、验证与测试数据集
- 分析测试结果
- 进行优化
- 布署到后端伺服器
可以到个人的github下载需要的视频,如下图所示,分别是帝王鲷、黄金珍珠虎与麒麟鹦鹉这三种观赏鱼,样本有点少,有需要的人可以自己在 Google 上在找些照片放进行也可以。
图 1、 从 github 下载需要的资料集影片
接下来的操作可以在自己的电脑里完成,所以需要在自己的电脑也安装需要的环境,资料前处理的部份都可以在自己的电脑完成,只要训练模型才需要用到 GPU 的 EC2,当然这些操作也可以在 EC2 中进行,只是需要按时收费。首先,到 Python 的官网下载直译器,不需要安装最新的,因为最新的直译器会导致很多套件都还只有原始码,还得自己编译,所以建议下载 3.7 或 3.8 版即可,如下图所示。
图 2、 下载 Python 直译器
安装 VS Code
透过浏览器连到 VS Code 官方网站 https://code.visualstudio.com/ ,下载并安装即可
图 3、 VS Code 下载
VS Code 的 Python 插件
安装完 VS Code ,1. 启动后在画面左下角有一个积木形状的图形,这是 VS Code 用来安装插件 (Extensions) 的图示,进入插件安装区后,2. 在上方的文字块输入 Python 就会出现相关的插件 ,3. 选择第一个插件,4. 就会出现这个插件的详细介绍,如插件名称、开发厂商、下载次数以及插件的使用说明等信息,如下图所示。按下安装 (install) 后,就会自动安装该插件,记得要致能 (Enable) 该插件,不然只是安装并不表示就可以使用该插件。
图 4、 Python for VS Code 插件下载
安装完插件后重新开启 VS Code,请选择创建工作区 (Add wordspace folder…),所谓工作区指的是可以把这次工作所需要的目录和档案都放在一起,因为本次的需求为撰写技术手册,所以同时需要代码以及说明文件,所以开一个工作区,一个目录放说明文件,一个目录放代码脚本,如下图所示
图 5. 创建 VS Code 工作区
建立完工作区,记得点选右边工具栏的第一个图示-文件管理区 (Explorer),1. 在工作区中建立第一个目录 py,用来存放 python 脚本,2. 因为工作区尚未取储存,所以显示 Untitled,如下图所示 。
图 6. 设定工作区目录
在文件管理区中按下滑鼠右键,将另一个目录 PythonMD 加入工作区中,这个目录是用来撰写文件的,如下图所示。
图 7. 将目录加入工作区中
最后将目前的工作区的状态储存起来,如下图所示。
图 8. 储存目前的工作区的状态
开始第一个 Python 脚本
步骤 1 选择 Python 直译器
Python 是一种解释语言,为了运行 Python 代码,得到 Python 智能感知 (IntelliSense) 的功能,必须告诉 VS Code 编辑器使用哪个版本的直译器。在 VS 代码中,通过打开命令面板 (Command Palette) Ctrl+Shift+P ,1. 开始键入 Python: Select Interpreter 命令进行搜索,2. 然后选择该命令,如下图所示。您也可以使用选择 Python 环境状态栏上的选项(如果可用,它可能已经显示了选定的直译器):
图 9. 打开命令面板,并输入指令
接着会询问直译器要套用到工作区的那一个目录,因为目前有两个目录,而 py 目录是用来存放代码的,所以就指定到哪个目录,如下图所示
图 10. 询问直译器要套用到那一个目录
指定直译器版本或是运行的虚拟环境,虚拟环境这部份会在后面有更清楚地描述,本课程指定 Python 3.9 直译器,如下图所示
图 11. 指定直译器版本
步骤 2 创建一个 Hello World 原始码文件
从文件资源管理器工具栏中,1. 在 py 文件夹,选择 2. 新文件按钮,通过使用 .py 文件扩展名,告诉 VS Code 把这个文件解释为 Python 程序,这样它就用 Python 扩展名和选择的直译器来评估内容。如下图所示
图 12. 创建一个原始码文件
现在工作区中有了一个代码文件,请在中输入以下原始码,
Hello.py
Msg = “Hello World”
Print(msg)
在文件中打完原始码后,1. 可以看到在文件的页签上,除了有文件名称外,还会出现一个小白点,这是表示文件有更新,尚未存档,2. 是原始码本文, 3. 表示在目前编辑的文档中,尚未存档的文件数量,可以按下 ctrl + s 去存储档案,如下图所示
图 13. 原始码文件编辑状况
步骤 3 运行原始码
点击在 Python 文件编辑器 1. 右上角的播放按钮,该按钮打开 2. 一个终端面板,在其中 Python 直译器被自动激活,然后 3. 运行 python hello.py,并可以看到运行结果,如下图所示
图 14. 运行原始码
最后补充,接下来的所有 Python 语法的介绍,都是针对如何撰写原始码,默认情况下,Python 源码文件以 UTF-8 编码方式处理。在这种编码方式中,世界上大多数语言的字符都可以同时用于字符串字面值、变量或函数名称以及注释中——尽管标准库中只用常规的 ASCII 字符作为变量或函数名,而且任何可移植的代码都应该遵守此约定。要正确显示这些字符,你的编辑器必须能识别 UTF-8 编码,而且必须使用能支持打开的文件中所有字符的字体。
参考资料
- Object Detection vs Object Recognition vs Image Segmentation, https://www.geeksforgeeks.org/object-detection-vs-object-recognition-vs-image-segmentation/
- Image Classification vs. Object Detection vs. Image Segmentation, https://medium.com/analytics-vidhya/image-classification-vs-object-detection-vs-image-segmentation-f36db85fe81
- Yolo v4, v3 and v2 for Windows and Linux, https://github.com/AlexeyAB/darknet
- You Only Look Once: Unified, Real-Time Object Detection, https://arxiv.org/abs/1506.02640
- YOLOv3: An Incremental Improvement, https://pjreddie.com/media/files/papers/YOLOv3.pdf
- YOLOv5 Documentation, https://docs.ultralytics.com/
- Difference between YOLO and SSD, https://www.geeksforgeeks.org/difference-between-yolo-and-ssd/