eIQ Portal由恩智浦于2018年推出,经过不断发展,可支持系统级应用和机器学习算法实现,适用于恩智浦i.MX系列,包括低功耗i.MX RT跨界微控制器(MCU),以及基于Arm® Cortex®-M和Cortex®-A内核的多核i.MX 8和i.MX 8M应用处理器。是一款使用方便,新手友好的深度学习开发软件。然而,我在使用中发现,现有的eIQ教程在“如何批量导入数据”这个问题上并未做深入讲解,有时哪怕照搬例程依然会导致脚本报错。因此,我决定根据自身实践结果,说明如何向eIQ中批量导入分类任务所需的图片数据。
目录
一、我遇到的问题
在数周的使用中,我遇到的主要问题为DataStoreWrapper()函数报错。我参考的教程是这一篇:eIQ ToolKit上手指南——特别篇
这篇教程使用了DataStoreWrapper()函数以声明数据加载器,然而我在importer库中完全找不到该函数,导致一运行函数就会报错:
我曾经以为是importer库版本过高的问题,然而在我安装1.0版本的importer库后,依然会报相同的错误,当时我以为importer库的版本仍然过高,希望上官网找到更早的版本,然而当我使用pip show命令后顿时傻了眼:
于是我在GitHub上以“Keen-Importer”为关键词搜索python项目,找到了它:
项目中的超链接指向了这个网页:
好吧,看来1.0版本就是它的最早版本了 。无法声明函数加载器意味着无法向其中导入数据,自然也无法开始后续的训练。当然我可以选择手动导入,但那就意味着我要手动对数据进行标记,整整一千四百多张图啊……
二、我的解决办法
那难道就没有办法自动导入了吗?当然不是,我注意到在创建模型时有“import dataset”选项,那是否意味着我们可以导入数据集呢?
在点击该选项后出现了导入数据集的格式选择页面,如下所示:
中间structured folders选项机翻如下:
结构化文件夹数据集用于导入分类任务的数据集。它导入存储在特定文件夹结构中的图像。图像应首先分为两个子文件夹训练和测试。这两个文件夹都应包含带有标签名称和相应图像的子文件夹。如果图像存储在训练/测试子文件夹之外,则加载时不会进行分组。如果图像存储在标签子文件夹之外,则导入时将不带任何标签。
以第18届智能车智能视觉组的任务为例,结构化文件夹数据集如下所示:
各个子文件夹下直接存储要导入的图像即可,使用时只需导入母文件夹(我的母文件夹是dataset),程序会自动将相应的文件夹名设为图像标记,并区分训练集和测试集。
三、代码实现
所需的库:os,random,opencv,其中opencv库主要用于图像预处理
import os
import random
import cv2
folder_list1 = ('train', 'test') # 训练集和测试集
folder_list2 = \
(
'BaiCai', 'CanDou', 'ChengZi', 'FanShu', 'HuaSheng',
'HuangGua', 'LaJiao', 'LiuLian', 'LuoBo', 'PingGuo',
'PuTao', 'QieZi', 'ShuiDao', 'XiangJiao', 'YuMi'
) # 类标签,同时也是文件夹名
img_path = 'E:/18th Smart Car/download pictures' # 图片存储位置
folder_path = 'E:/18th Smart Car/Machine visionV04/dataset' # 结构化文件夹数据集位置
judge = 25 # 将25%的数据放入测试集
flag = random.randrange(0, 100) # 产生0-99的伪随机整数以判定图片所属数据集
for folder_name1 in folder_list1:
for folder_name2 in folder_list2:
os.makedirs(os.path.join(folder_path, folder_name1, folder_name2))
# 第一部分:创建结构化文件夹
for index, label in enumerate(folder_list2):
for img in os.listdir(os.path.join(img_path, label)):
temp = cv2.imread(os.path.join(img_path, label, img), 1) # 读取图片
temp = cv2.resize(temp, (96, 96)) # 将图片像素设置为96*96
flag = random.randrange(0, 100)
full_file_name = os.path.join(img_path, label, img)
print(label, img, flag)
if (flag < judge) and (os.path.isfile(full_file_name)):
cv2.imwrite(os.path.join(folder_path, 'test', label, img), temp)
if (flag >= judge) and (os.path.isfile(full_file_name)):
cv2.imwrite(os.path.join(folder_path, 'train', label, img), temp)
# 第二部分,将图片在预处理后导入结构化文件夹的对应位置