目的:
- 识别出一个菜里面有哪些食材
细节:
- 使用mobile net。输出层为多个2分类器的并列。也就是输出每一位代表一种食材,可以同时存在多种食材。
- 食材的标注比较麻烦
- 先通过关键字爬取不同食材相关的图片。比如爬取青椒肉食,虎皮青椒,青椒炒蛋等关键字的图片作为青椒食材的训练数据。爬下来后手动清洗出1000张图片。然后用搜索引擎的相似图片查找,手动清晰出相似的但是没有青椒的负样本3000张。
- 使用相同的方法收集其他食材的数据,每个食材都分为正样本和副样本。
- 为了让标注更加容易,还專門使用python的tkinter制作了小工具。
- 把第一批整理出来的数据进行训练
- 用训练的模型分类他更多的图片,把分类错误的图片加入到训练集中。
- 训练后再用来分类非训练集的图片,再把错误的图片加入到训练集中。
- 这样迭代5次。
- 最后使用python写的web app支持事实照相并上传服务器再返回结果。
结果:
- 某些食材非常容易识别,比如木耳,虾仁,花椰菜。这些食材的特点是形态单一。对于另外一些形态多变的食材:鸡蛋,青椒等的识别率就比较低。
- 感觉就是只要网络找到了对应食材独有特点了的话,一下就很robust了。
- 实际用起来基本正常的菜里面,食材的形态还比较明显的情况下。一盘菜都能识别出来1,2个食材。
讨论:
- 通过这个项目,自己尝试了从模型选取,数据集设计,爬取和清洗方案制定,训练等深度学习的全过程。
- 训练的时候没有直接对每张图片标注上面出现的所有食材,而是只标注是否存在某种食材。这样做是因为要同时标注出所有食材的难度和工作量太大。而且当需要添加食材的种类的时候,需要重新标注所有图片。不过感觉如果能同时标注所有食材,应该训练结果要好些。
相关代码: