65.9K
CodeProject 正在变化。 阅读更多。
Home

Keras UI:管理图像分类的 GUI

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.88/5 (13投票s)

2019 年 5 月 13 日

CPOL

19分钟阅读

viewsIcon

31399

基于 Django 构建的图像分类管理工具,有助于理解图像分类。

引言

图像分类让我想起了大学时光,那时我有很多人工智能课程,并且第一次接触它。当时,这是一个非常实验性的领域,要在你的项目中使用它,你通常需要实现很多东西,并且要与代码搏斗,才能得到一些可以测试的东西。

几年前,当我再次有机会接触它时,我发现情况大不相同。大学时期的“实验性”事物,现在都成了“标准”,学术性的东西也变成了现成的库。当我发现 OpenCV、Tensorflow、Keras 时,我既惊叹又害怕。你可以复制一些网上的代码行,就可以得到一个训练好的网络,而无需了解任何关于 AI 的知识。这就是进步的力量。

在这篇文章中,我想更进一步。在大多数情况下,使用 AI 进行图像分类的过程都差不多。你有一些样本,希望是图像,每个图像都有一个标签,描述了图像的内容。例如,你可能有 1000 张动物的图片,并且必须知道每张图片是什么。然后你需要设计一个模型,能够从样本中训练和学习规则来判断这是什么。之后,你需要训练模型,可能需要尝试多次,调整参数。这个过程很长,即使硬件进步也无法与我大学时期相比。所以,放松下来,等待训练过程完成。最后,你得到了一个训练好的模型,它能够根据你教会它的内容来预测图像中的内容。

那么,为什么不创建一个 Web 应用程序来管理所有这些东西呢?想象一个工具,允许你上传或定义图像和图像标签。在这个应用程序中,你还可以定义模型,并开始训练。最后,你可以下载模型,或者通过 Web 服务来使用它,只需发送一张图像就能得到结果。

在这种情况下,你不需要开发环境来玩 AI。只需打开浏览器,定义模型,点击训练,然后等待结果。

基本上,这就是我在这篇文章中要做的项目,因为它基于 Keras,所以我称之为 KerasUI。

顺便说一句,我也想借此机会向初学者介绍图像分类。

文章路线图

  1. 图像分类:给我的奶奶讲清楚
  2. Keras UI:如何工作
  3. 教程
  4. 看点

注意:本项目是 Codeproject 上图像分类相关内容的一部分。特别感谢 Ryan Peden 的文章“猫还是不是猫”,我从中学习了管理训练过程和测试工具所需图像的基础知识。

图像分类:给我的奶奶讲清楚

图像分类问题是将图像分配给一组固定类别中的一个标签的任务。这是计算机视觉的核心问题之一,尽管它很简单,但有各种各样的实际应用。简单来说,你想做的是,如果你给计算机一张狗的图片,它会告诉你“这是一只狗”。

这个问题可以使用人工智能和计算机视觉来解决。计算机视觉有助于处理和预处理图像,使其成为计算机可以使用的形式(从位图到相关值矩阵)。一旦输入格式正确,你就可以应用算法来预测结果。

如今最常见的解决方案是使用 CNN(卷积神经网络)。这种神经网络非常适合图像处理,并针对你提供的数据集进行训练。

数据集就是样本列表,每个样本都有标签。主要思想是,你通过示例告诉机器如何做决定。通常,数据集被分为训练集、测试集和验证集。这是因为你想训练网络,然后在独立的数据上测试它的效果,直到它达到预期。最后,如果你想获得客观反馈,你必须使用其他数据:验证集。这主要是必需的,因为如果你总是用相同的数据训练网络,它会消除所有错误,但只能处理你提供给它的样本。所以,如果你输入一些稍微不同的东西,你希望得到好的结果。这叫做过拟合,是需要避免的,因为它意味着网络没有抽象出规则,只是重复你告诉它的内容。想想一个数学表达式 2*5+10,这就像记住结果是 25,而不是能够计算它。

CNN:卷积神经网络

Convolutional neural network: CNN with keras UI

CNN 的架构(来源

输入

在图像分类中,我们从...图像开始!图像是一个二维矩阵(宽度 * 高度),由像素组成,这并不难理解。每个像素由 RGB(红、绿、蓝)三个不同的值组成。为了使用 CNN,最好将这 3 个不同的层分开,所以你的最终输入矩阵来表示你的图像将是*图像尺寸 x 图像尺寸 x 3*。当然,如果你有一个黑白图像,你不需要 3 层,只需要一层,所以你将有*图像尺寸 x 图像尺寸 x 1*。嗯,如果你还考虑你的数据集将由 N 个项组成,则整个输入矩阵将是*N x 图像尺寸 x 图像尺寸 x 3*。图像的尺寸必须对所有图像都相同,并且不能是全高清图像,以避免处理时间过长。对此没有硬性规定,但通常是折衷:256x256 在某些情况下可能是一个好值,在其他情况下,你可能需要更高的分辨率。

卷积

图像中有许多细节、线索和阴影,这些对网络来说并不重要。所有这些细节都会混淆训练,因此主要思想是在保留所有提供信息的数据的同时简化图像。这在口头上是显而易见的,但在实践中呢?CNN 使用卷积步骤,这是这种方法的核心,它在简化图像的同时保留图像最重要的部分。卷积层之所以得名,是因为它在滑动矩阵片段和滤波器之间进行卷积。滤波器的大小和要分析的矩阵片段的大小相同。这个片段称为核。为了使矩阵大小适合核大小,它会在所有维度上用零填充。卷积会为所有核乘法产生一个标量值。这将导致尺寸减小,例如,在一个 32x32 的矩阵(1024 个元素)上使用 4x4 的核,输出将是一个 4x4 的矩阵(16 个元素)。核的大小会影响最终结果,通常最好使用较小的核并串联多个卷积层,可以在中间添加一些池化层(我稍后会讲到池化)。

CNN: how convolution works, with keras UI

卷积操作。输出矩阵称为卷积特征或特征图。来源

池化

池化层用于减小矩阵大小。有许多方法,但基本思想是:我取一组相邻的值,只使用其中一个。最常见的算法是最大池化,所以基本上,你取集合中的最大元素。

最大池化操作。来源,来自 O'Reilly media

全连接层

最后一步是神经网络。直到最后一步,我们进行了一些“确定性”的操作,只是代数计算。在这一步,我们有了真正的人工智能。之前所做的一切,都只是为了生成网络能够理解的数据。

Keras UI:如何工作

训练神经网络的过程通常是相同的。我可以将其总结为:

  1. 定义数据集
  2. 构建模型(网络配置、预处理层...)
  3. Train (训练)
  4. 检查是否正常工作,如果不正常,回到 1

这不是一个确定性的过程:你可能需要迭代很多次才能得到一些有效的东西。在大多数情况下,人们会构建脚本并手动运行它们,直到满意为止。这种方法有效,但也有一些限制:

  • 你在本地工作,所以会消耗你的物理资源。你可能受限于你的硬件,或者你可能被迫整夜开着电脑,直到训练完成。
  • 同事很难进行测试,也许是因为所有的数据集或训练好的模型都在你的电脑里。

所以,我的想法是创建一个 Web 应用程序来管理这个项目,让你可以在本地机器上自由地更改模型定义。通过这样的解决方案,你可以开始训练,关闭电脑,然后出去散步,因为所有的负载都在服务器端。你也可以用一台便宜的电脑或智能手机来训练神经网络。

此外,使用这样的系统还有一个巨大的好处。训练过程漫长、繁重且不确定,最终结果将是一个带有权重的模型(使用 Keras,只是一个文件)。所以,如果你在一段时间后不再需要费心处理这些东西,为什么还要纠结呢?问题在于你会将模型嵌入到应用程序中。也许现在这样足够了,但未来呢?你可能想交付一个更好的模型,或者将预测的负载从用户那里卸载。

因此,在设计 KerasUI 时,我保留了通过 API 公开模型的可能性。这样,你就可以发送图像并得到结果。所有计算部分都在服务器端,所以你可以随意更改它,而不会对调用者产生任何影响。

用法

  • 运行standalone.batsh standalone.bat(这将安装依赖项,应用迁移并运行服务器,同一个脚本在 UNIX 和 Windows 上都有效)
  • 使用python manage.py createsuperuser创建管理员用户
  • http://127.0.0.1:8000/

如何管理数据集

Keras UI 允许将数据集项(图像)上传到 Web 应用程序。你可以逐个上传,也可以添加一个包含多张图像的 zip 文件一次性上传。它可以管理多个数据集,因此你可以将内容分开。上传完图像后,你可以点击训练按钮并运行训练过程。它将在没有任何用户交互的情况下训练你定义的模型。你将得到训练结果,如果你很挑剔,可以查看日志文件,了解系统的输出。

how to manage a dataset with keras ui

如何使用 Web UI 测试

为了让你不再为此烦恼,我提供了一个简单的表单,你可以在其中上传你的图像并获得结果。

how to test an image using keras ui

如何使用 Django API UI 或 Postman 测试 API

你之前在 Web UI 中看到的所有内容都可以通过 API 来实现。

how to use api to call keras ui model

API 用法

此应用程序使用oauth2进行身份验证请求,因此第一步是获取令牌。Django 支持多种流程,在此示例中,我使用了密码流。请记住,你必须启用该应用程序(首次运行时此应用程序并非默认创建)。

POST to http://127.0.0.1:8000/o/token/

Headers:
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded

Body:
grant_type:password
username:admin
password:admin2019!

Response:

{
   "access_token": "h6WeZwYwqahFDqGDRr6mcToyAm3Eae",
   "expires_in": 36000,
   "token_type": "Bearer",
   "scope": "read write",
   "refresh_token": "eg97atDWMfqC1lYKW81XCvltj0sism"
}

用于获取预测的 API 可以通过 JSON POST 或表单 POST 进行。在 JSON POST 中,图像作为base64 字符串发送。这种双重消费服务的方式很有用,因为它支持不同的场景。你可以将其链接到表单,或者直接使用 wget 或 curl 工具,也可以从你的应用程序中使用。

POST http://127.0.0.1:8000/api/test/

Headers:
Content-Type:application/json
Authorization:Bearer <token>

Body:
{
  "image":"<base 64 image",
  "dataset":1
}

The response
{
   "result": "<LABEL PREDICTED>"
}

你可以查看完整的 Postman 文件以获取更多信息,或直接进行测试。

教程

本章将通过技术细节讲解它的构建方式和工作原理。该项目建立在 Django 之上,因此它遵循 Django 的准则,并且没有什么不标准的。

什么是 Django

我将涵盖最重要的几点,假设即使你不了解 Django,也能理解所有内容。对于 Django 新手来说,你需要知道的是,Django 主要是一个 RAD(快速应用开发)框架,允许从高层定义数据模型(例如,你可以说明有一个“email”或“image”字段)。模型直接映射到数据库结构,并自动与 UI 绑定。当然,你可以通过实现类或修改模板来配置几乎所有内容。所有与数据无关的内容,都可以通过创建自定义路由/操作来手动管理。

嗯,我担心我过于简化了,希望没有得罪太多 Django 支持者。;-)

总之,你可以在这里发现它。

技术栈

项目技术栈

  • Python
  • django 框架
  • keras, tensorflow, numpy
  • SQLite(或你喜欢的其他数据库)

使用的工具

  • Visual Studio Code
  • Postman
  • Web 浏览器

项目设置

如前所述,该项目基于 Django,因此第一步是使用 CLI 创建一个 Django 项目。

这需要系统上安装 Django,我们可以通过 pip 进行管理。

pip install Django

现在我们有了 Django,只需创建项目。

django-admin startproject kerasui 

此命令将生成以下结构:

root/
    manage.py
    kerasui/
        __init__.py
        settings.py
        urls.py
        wsgi.py

这些文件是:

  • 外部的kerasui/根目录只是项目容器。内部的mysite/目录是项目的实际 Python 包。它的名称是你需要导入内部任何内容的 Python 包名称(例如 mysite.urls)。
  • manage.py:一个命令行实用程序,允许你以各种方式与此 Django 项目进行交互。你可以在Django-adminmanage.py中阅读有关manage.py的所有详细信息。
  • __init__.py:一个空文件,告诉 Python 此目录应被视为 Python 包。如果你是 Python 初学者,请在官方 Python 文档中阅读有关包的更多信息。
  • kerasui/settings.py:此 Django 项目的设置/配置。Django 设置将告诉你有关设置工作方式的所有信息。
  • kerasui/urls.py:此 Django 项目的 URL 声明;你 Django 驱动的网站的“目录”。你可以在 URL 分派器中了解有关 URL 的更多信息。
  • kerasui/wsgi.py:用于 WSGI 兼容的 Web 服务器为你提供项目的入口点。有关更多详细信息,请参阅如何使用 WSGI 进行部署。

运行它

为了检查是否一切正常,只需使用内置服务器运行 Django(在生产环境中,我们将使用 WSGI 接口与我们喜欢的 Web 服务器集成)。

python manage.py runserver

你也可以使用 Visual Studio Code 来运行 Django。

这是 Django 配置

{
   // Use IntelliSense to learn about possible attributes.
   // Hover to view descriptions of existing attributes.
   // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387

   "version": "0.2.0",
   "configurations": [
       {
           "name": "Python: Django",
           "type": "python",
           "request": "launch",
           "program": "${workspaceFolder}\\kerasui\\manage.py",
           "args": [
               "runserver",
               "--noreload",
               "--nothreading"
           ],
           "django": true
       }
   ]
}

设置配置

这里是配置的基本部分,它指示:

  • 使用 OAuth 2 和会话身份验证,以便:常规 Web 用户登录并使用网站和 REST 沙盒,API 用户获取令牌并查询 API 服务。
  • 使用 SQLite(你可以更改为使用任何其他数据库)。
  • 添加所有 Django 模块(以及我们的两个自定义模块:管理 UI 和 API)。
  • 启用 CORS。
INSTALLED_APPS = [
   'python_field',
   'django.contrib.admin',
   'django.contrib.auth',
   'django.contrib.contenttypes',
   'django.contrib.sessions',
   'django.contrib.messages',
   'django.contrib.staticfiles',
   'oauth2_provider',
   'corsheaders',
   'rest_framework',  
   'management',
   'api',
]

MIDDLEWARE = [

   'django.middleware.security.SecurityMiddleware',
   'django.contrib.sessions.middleware.SessionMiddleware',
   'django.middleware.common.CommonMiddleware',
   'django.contrib.auth.middleware.AuthenticationMiddleware',
   'django.contrib.messages.middleware.MessageMiddleware',
   'django.middleware.clickjacking.XFrameOptionsMiddleware',
   'django.middleware.security.SecurityMiddleware',
   'corsheaders.middleware.CorsMiddleware',
]

ROOT_URLCONF = 'kerasui.urls'

REST_FRAMEWORK = {
   'DEFAULT_AUTHENTICATION_CLASSES': (
       'rest_framework.authentication.SessionAuthentication',
       'rest_framework.authentication.BasicAuthentication',
       'oauth2_provider.contrib.rest_framework.OAuth2Authentication',
   ),
   'DEFAULT_PERMISSION_CLASSES': (
       'rest_framework.permissions.IsAuthenticated',
   ),
   'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
   'PAGE_SIZE': 10,
}

DATABASES = {
   'default': {
       'ENGINE': 'django.db.backends.sqlite3',
       'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
   }
}

首次运行

Django 使用迁移系统,该系统从你定义模型生成迁移文件。要应用迁移,只需运行 migrate 命令(makemigration 用于从模型创建迁移文件)。

用户数据库最初是空的,所以你需要创建管理员用户才能登录。这是通过createsuperadmin命令完成的。

python manage.py migrate
python manage.py createsuperuser

如何构建

应用程序分为 3 个模块:

  • 管理部分:Web UI、模块和所有核心功能。
  • 后台工作程序:一个 Django 命令,可以在后台执行,用于针对数据集训练模型。
  • API:这部分公开 API 以便从外部与应用程序进行交互。在示例中,这允许从第三方应用程序向数据集中添加项。此外,最常见的用法是发送一张图像并获得预测结果。

管理

在 Django 中创建一个应用

python manage.py startapp management

这将为你创建主要文件。在此模块中,我们使用最多的与模型和模型表示相关。

  • module.py:这里是所有带有字段规格的模型。通过这样的类定义,一切都已设置好,可以对实体进行工作的 CRUD(创建、读取、更新、删除)。
  • admin.py:这一层描述了如何通过表单显示和编辑数据。

数据模型

我们的数据模型非常简单。假设我们每个数据集只训练一个模型(如果你想将数据集用于多个模型,这可能是一个限制……),我们有:

  • DataSet:包含模型、模型设置和数据集名称。
  • DataSetItem:包含数据集项,即每行一张图像及其关联的标签。

这里只是模型和模型表示的一个样本。

#from admin.py

class DataSetForm( forms.ModelForm ):
   process =forms.CharField( widget=forms.Textarea(attrs={'rows':40, 'cols':115}), 
            initial=settings.PROCESS_TEMPLATE )
   model_labels =forms.CharField(initial="[]")
   class Meta:
       model = DataSet
       fields = ['name', 'process','epochs','batchSize','verbose','model_labels','model']    

    def train(modeladmin, request, queryset):
      for dataset in queryset:
         DataSetAdmin.train_async(dataset.id)

class DataSetAdmin(admin.ModelAdmin):
   list_display = ('name','epochs','batchSize','verbose','progress')   
   form=DataSetForm
   actions = [train]
   change_list_template = "dataset_changelist.html"

   @staticmethod
   def train(datasetid):
       call_command('train',datasetid)

   @staticmethod
   def train_async(datasetid):
       t = threading.Thread(target=DataSetAdmin.train, args=(datasetid,))
       t.setDaemon(True)
       t.start()

admin.site.register(DataSet,DataSetAdmin)

#from model.py

class DataSet(models.Model):
   name= models.CharField(max_length=200)
   process = models.CharField(max_length=5000, default=settings.PROCESS_TEMPLATE)
   model = models.ImageField(upload_to=path_model_name,max_length=300,
           db_column='modelPath',blank=True, null=True)
   batchSize = models.IntegerField(validators=[MaxValueValidator(100), 
               MinValueValidator(1)],default=10)
   epochs = models.IntegerField(validators=[MaxValueValidator(100), 
            MinValueValidator(1)],default=10)
   verbose = models.BooleanField(default=True)
   progress = models.FloatField(default=0) 
   model_labels= models.CharField(max_length=200)

   def __str__(self):
       return self.name

Django 采用代码优先的方法,因此我们需要运行python manage.py makemigrations来生成将应用于数据库的迁移文件。

python manage.py makemigrations

后台工作者

后台工作程序是应用程序中在单独线程中运行的部分,负责管理长时间运行的进程,在本例中是网络训练。Django 支持“Commands”,它们设计为由 UI 或 shell 调用。要创建一个命令,你只需要创建一个带有类的文件,并将其放入一个名为“management”的特殊文件夹中。

要创建后台工作程序,我们需要一个模块来托管它,我使用了 management 模块。在其中,我们需要创建一个 management 文件夹(抱歉,名称与主模块相同,我希望这不会造成困扰)。其中的每个文件都可以通过python manage.py <commandname>或通过 API 运行。

在我们的例子中,我们通过常规 Django 操作在后台进程中启动命令。

这是相关部分:

class DataSetAdmin(admin.ModelAdmin): 
   actions = [train]
   # ....  

   @staticmethod
   def train(datasetid):
       call_command('train',datasetid)

   @staticmethod
   def train_async(datasetid):
       t = threading.Thread(target=DataSetAdmin.train, args=(datasetid,))
       t.setDaemon(True)
       t.start()

API

API 是在一个单独的应用程序中创建的,以保持事物隔离和更清晰。这也有助于分离关注点,避免淹没在大量文件中。

python manage.py startapp api

基本上,所有的 CRUD 模型都可以通过 API 公开,但是,你需要指定如何序列化它。

class DataSetItemSerializer(serializers.HyperlinkedModelSerializer):
   image = Base64ImageField()
   dataset=   serializers.PrimaryKeyRelatedField(many=False, read_only=True)
   class Meta:
       model = DataSetItem
       fields = ('label', 'image', 'dataset')

class DataSetSerializer(serializers.HyperlinkedModelSerializer):
   class Meta:
       model = DataSet
       fields = ('name', 'process')

你还需要创建ViewSet(模型与数据表示之间的映射)。

class DataSetItemViewSet(viewsets.ModelViewSet):
   queryset = DataSetItem.objects.all()
   serializer_class = DataSetItemSerializer

class DataSetViewSet(viewsets.ModelViewSet):
   queryset = DataSet.objects.all()
   serializer_class = DataSetSerializer

最后,你需要定义所有路由并将 viewset 映射到url。这将足以将模型作为 API 使用。

router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet)
router.register(r'datasetitem', views.DataSetItemViewSet)
router.register(r'dataset', views.DataSetViewSet)
router.register(r'test', views.TestItemViewSet, basename='test')
urlpatterns = [
   url(r'^', include(router.urls)),
   url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
]
urlpatterns += staticfiles_urlpatterns()

训练

这是应用程序的核心部分。除了所有其他主题,它们不过是一个 Web 应用程序,这更接近人工智能,在这里,我们开始有趣的部分。

算法非常简单:

  1. 获取数据集中的所有图像。
  2. 对它们进行标准化并添加到标记列表中。
  3. 创建模型,根据数据集记录的指定方式。
  4. 进行训练。

需要巧妙管理的部分是如何让用户有机会编写自己的自定义模型并进行训练。我有一个想法,就是给他们机会编写自己的 Python 代码。然后在训练过程中使用它。这在安全性方面可能不是最好的,因为用户可以在其中编写任何内容,包括恶意代码。是的,这是真的,但这不是一个 SaaS 项目,所以我们可以假设只有受信任的人才能作为管理员访问。相反,作为消费者,你只是查询已保存的模型,因此系统是完全安全的。

这是查询数据集项并加载图像的代码片段:

def load_data(self, datasetid):
       self.stdout.write("loading images")
       train_data = []     
       images = DataSetItem.objects.filter(dataset=datasetid)
       labels = [x['label'] for x in  DataSetItem.objects.values('label').distinct()]

       for image in images:           
           image_path = image.image.path
           if "DS_Store" not in image_path:          
               index=[x for x in range(len(labels)) if labels[x]==image.label]
               label = to_categorical([index,],len(labels))
               img = Image.open(image_path)
               img = img.convert('L')
               img = img.resize((self.IMAGE_SIZE, self.IMAGE_SIZE), Image.ANTIALIAS)
               train_data.append([np.array(img), np.array(label[0])])
       return train_data

看看

labels = [x['label'] for x in  DataSetItem.objects.values('label').distinct()]
label = to_categorical([index,],len(labels))

这为所有标签分配了一个顺序,例如 ["CAT","DOGS"],然后to_categorical将位置索引转换为独热编码表示。简单来说,这使得CAT = [1,0]DOG = [0,1]

训练模型

 model=Sequential()
 exec(dataset.process)
 model.add(Dense(len(labels), activation = 'softmax'))
 model.fit(training_images, training_labels, 
           batch_size=dataset.batchSize, epochs=dataset.epochs, verbose=dataset.verbose)

请注意,dataset.process是你输入到 Web 管理器中的 Python 模型定义,你可以根据需要进行调整。最后一层是在用户回调之外添加的,以确保匹配数组大小。

fit 方法只是运行使用所有数据的训练(Keras 会自动对测试集和训练集进行启发式分离,目前来说足够了,将来我们可以计划让用户选择每个部分使用数据的百分比,或逐项标记)。

最后,我们保存训练好的模型:

datasetToSave=DataSet.objects.get(pk=datasetid)
datasetToSave.progress=100
datasetToSave.model_labels=json.dumps(labels)
temp_file_name=str(uuid.uuid4())+'.h5'
model.save(temp_file_name)
datasetToSave.model.save('weights.h5',File(open(temp_file_name, mode='rb')))
os.remove(temp_file_name)
datasetToSave.save()

请注意,我还保存了标签顺序,因为它必须与模型相同,才能匹配独热编码约定。

预测

有一个通用方法,给定样本和dataset,检索模型,加载它并进行预测。这是代码片段:

def predict(image_path,datasetid):
     dataset=DataSet.objects.get(pk=datasetid)
     modelpath=dataset.model.path
     model=load_model(modelpath)
     labels=json.loads(dataset.model_labels)

     img = Image.open(image_path)
     img = img.convert('L')
     img = img.resize((256, 256), Image.ANTIALIAS)
     result= model.predict(np.array(img).reshape(-1,256,256, 1))
     max=result[0]

     idx=0

     for i in range(1,len(result)):
        if max<result[i]:
          max=result[i]
             idx=i

     return labels[idx]

模型使用load_modelmodelpath)加载,标签来自数据库。模型预测输出为值列表,选择最高索引并用于检索在训练时分配给网络输出的正确标签。

关注点

关于项目和创建 Keras UI 的想法

这个项目只是一个玩具。要成为一个真正的项目,还需要大量工作,并且作为一个潜在用户,在考虑云解决方案的良好运行方式和我们考虑服务质量的成本效益时,我会三思而后行。作为本地部署的解决方案,我会三思而后行。

该项目是一个借口,为我提供了一个机会,让我重新接触神经网络,并学习/试验 Keras 和人工智能。

关于 CNN、AI 和图像分类

自从我在 2008 年迈出这一领域的第一步以来,已经发生了重大变化。作为业余爱好者,第一个感觉是,现在整个过程都是“确定性的”。通过使用标准技术和良好的文档,使网络正常工作变得更加容易。经验仍然很重要,我不想将 AI 与常规的数据库读写操作进行比较,但找到大量的资料、教程、指南可以帮助新手获得一些有效的东西。

这要归功于大公司,像往常一样,它们使 AI 对开发者来说更容易获取,共享它们的库,也许只是为了让我们知道从它们那里作为服务来使用所有东西更容易。;-)

参考文献

历史

  • 2019 年 5 月 13 日:初始版本
© . All rights reserved.