我对机器学习几乎是新手。我正在尝试使用turicreate创建一个手部检测的CoreML模型。
我使用的数据集来自https://github.com/aurooj/Hand-Segmentation-in-the-Wild,该数据集提供了从第一人称视角拍摄的手部图像,以及图像的掩膜。我按照turicreate的“数据准备”指南(https://github.com/apple/turicreate/blob/master/userguide/object_detection/data-preparation.md)逐步创建了SFrame。在整个过程中检查变量内容,似乎没有任何问题。
数据准备完成后,我按照https://github.com/apple/turicreate/tree/master/userguide/object_detection中的“入门示例”部分的步骤进行操作。
当turicreate进行迭代创建模型时,我发现了错误的提示。似乎完全没有损失,这看起来不对劲。
模型创建后,我尝试用SFrame的test_data部分进行测试。然而,这些预测的结果只是空数组,这显然是不正确的。
将模型导出为CoreML的.mlmodel格式并在应用程序中尝试后,它无法识别任何东西(这并不奇怪)。
作为一个完全新手,我无法弄清楚可能出了什么问题。我认为数据集相当准确。我对数据集所做的唯一更改是一些掩膜没有明确的文件扩展名(它们是PNG格式),所以我添加了.png扩展名。我还根据turicreate的教程格式重新命名了图像(例如vid4frame025.image.png
和vid4frame025.mask.0.png
)。再次使用这些数据创建SFrame的过程在每个步骤中似乎都是正确的。我能够成功地按照turicreate的教程数据集(自行车和汽车)完成这个过程。有什么想法可能出了什么问题吗?
回答:
我找到了问题所在,基本上是因为我不熟悉Python。
在数据准备部分的一个环节中,在从掩膜图像创建边界框后,每个注释都被分配了一个'label'
,表示注释所指的对象类型。我的数据与教程中的数据名称格式不同,因此每个注释不是'label': 'bike'
,而是我的注释有'label': 'vid4frame25', 'label': 'vid4frame26'等
。
将每个注释改为'label': 'hand'
似乎解决了这个问题(至少到目前为止,它正在创建一个看似合法的模型)。