Дорога к внешнему ИИ: предварительное исследование KerasJS

машинное обучение Python Keras Нейронные сети

Рекомендуется сначала загрузить проект и запустить его напрямую, чтобы увидеть эффект. проектадрес

Введение

Keras — очень популярная среда разработки моделей глубокого обучения, основанная на Python, с лаконичным синтаксисом и высокой степенью инкапсуляции, для создания глубокой нейронной сети требуется всего дюжина строк кода.

Keras.js — это среда JS, которая может запускать глубокие нейронные сети в браузере, поддерживая вычисления на процессоре и графическом процессоре. В отличие от Keras, Keras.js может запускать только отлаженную модель и не может выполнять обучение модели.

0.375b6f6b4891.png

Процесс разработки KerasJS выглядит следующим образом: сначала используйте Keras для разработки и обучения нейронной сети, экспортируйте модель и параметры нейронной сети в виде файла, а KerasJS загружает этот файл на стороне браузера, чтобы можно было делать прогнозы.flow.818370d305d1.png

Модель

учиться уэта статья, разработав нейронную сеть для распознавания Санта-Клауса. В этой статье не рассматриваются подробности разработки Keras, заинтересованные студенты могут перейти к исходному тексту для просмотра. Код Python приведен непосредственно здесь.

def build_model():
    model = models.Sequential()
    model.add(layers.Conv2D(20,(5,5),activation='relu',input_shape=(128,128,3)))
    model.add(layers.MaxPooling2D(pool_size=(2,2),strides=(2,2)))
    model.add(layers.Conv2D(50,(5,5),activation='relu',padding='same'))
    model.add(layers.MaxPooling2D(pool_size=(2,2),strides=(2,2)))
    model.add(layers.Flatten())
    model.add(layers.Dense(500,activation='relu'))
    model.add(layers.Dense(1, activation='sigmoid'))
    model.compile(optimizer=optimizers.RMSprop(lr=2e-5),
                  loss='binary_crossentropy',
                  metrics=['acc'])
    return model

данные

Аннотированные данные — это исходный материал для моделей ИИ, а сбор данных, особенно сбор изображений, — это связующее звено, в которое может вмешаться внешний интерфейс. На основе React автор разработал плагин GetThemAll для пакетной загрузки изображений Chrome, который нам удобен для сбора тегированных изображений.

getthemall.3d5de42806bb.pngПосле установки плагина перейдите в Google Images для поиска «Санта», используйте плагин, чтобы отметить ненужные изображения, а затем загрузите их в локальную папку Санта-Клауса.Вы можете собрать 400 изображений Санта-Клауса через Google Images.

Затем мы загружаем несколько изображений, не относящихся к Санта-Клаусу, ищем «объект» и используем подключаемый модуль GetThemAll, чтобы загрузить около 400 изображений в локальную папку non_santa.

В дополнение к набору обучающих данных нам также нужен набор тестовых данных для измерения способности модели к обобщению. Создайте новую тестовую папку локально и переместите последние 100 изображений Санта-Клауса из только что подготовленного тренировочного набора в файл santa в тестовой папке.Точно так же переместите 100 изображений, не связанных с Санта-Клаусом, в файл non_stanta. Таким образом, вы можете получить локальный набор изображений следующим образом:

dataset.9f489acea74d.png

С помеченными данными мы можем обучить модель. Для конкретного процесса обучения, пожалуйста, обратитесь к коду pyton.Результаты обучения приведены здесь.Синие точки указывают на точность набора обучающих данных, а синяя линия указывает на скорость подготовки набора тестовых данных.Модель имеет очевидные проблемы High Variance, но эта ошибка зарезервирована для глубокого обучения.Пусть ее решают специалисты, предполагается, что эта модель доступна здесь.

result.0899f096f2ae.png

мигрировать

Модель keras_santa.h5 (h5 — суффикс файла, не имеет ничего общего с HTML5), обученная на предыдущем шаге, не может использоваться непосредственно KerasJS. Ее необходимо преобразовать с помощью инструмента преобразования, предоставляемого KerasJS, прежде чем ее можно будет загрузить и проанализировать. от KerasJS.

./encoder.py keras_santa.h5

После преобразования получается файл keras_santa.bin, размер которого составляет около 20 М. Этот файл содержит структуру нейронной сети и все параметры и может быть загружен KerasJS.

KerasJS

Выполнив описанные выше шаги, мы получили обученную нейронную сеть CNN и все параметры.Структура и параметры сети сохранены в файле keras_santa.bin. Далее нам нужно просто восстановить вышеуказанную нейронную сеть в браузере, и тогда мы сможем начать делать прогнозы.

Используйте webpack с React для создания простой среды разработки. После того, как основная работа сделана, можно приступить к первому шагу разработки и загрузить файл модели нейросети keras_santa.bin:

const model = new KerasJS.Model({
   filepath: 'http://localhost:3000/keras_santa.bin',
   gpu: false
})
//KerasJS提供模型加载进度接口,考虑到模型文件体积非常大,这个接口会经常用到
model.events.on('loadingProgress', (progress) => {
      this.setState({
        loadingtitle: '模型加载',
        progress: parseInt(progress)
      })
})

Прежде чем использовать приведенную выше модель для прогнозирования, вам необходимо преобразовать данные в формат данных, который может принять модель. Эта сеть Санта-Клауса требует, чтобы формат ввода данных был (128,128,3), то есть картинка должна иметь разрешение 128x128 и может содержать только три компонента RGB.

rgb.d8d48f48462a.png

С помощью холста можно добиться преобразования разрешения изображения:

_updateImageSrc(imgid) {
    const ctx = this.refs.canvas.getContext('2d');
    const imgdom = document.createElement('img');
    imgdom.src = `http://localhost:3000/${imgid}.jpeg`
    this.setState({
      prediction:0
    })
    imgdom.onload = ()=>{
      ctx.drawImage(imgdom,0,0,128,128)
      const imagedata = ctx.getImageData(0,0,128,128)
      const processeddata = ImageDataUtils.preprocess(imagedata)
      setTimeout(()=>{
        this.doPrediction(processeddata)
      },100);
    }
  }

Обратите внимание на метод preprocess, ресурс изображения, полученный через canvas, содержит четыре измерения rgba, а prepross возвращает первые три измерения этих четырех измерений, то есть rgb, и при этом стандартизирует данные:

export default class ImageDataUtils {
  static preprocess(imageData) {
    const {
      width,
      height,
      data
    } = imageData;
    const dataTensor = ndarray(new Float32Array(data),[width,height,4])
    const dataProcessedTensor = ndarray(new Float32Array(width*height*3),[width,height,3])
    //从[0,255]转化到[0,1]
    ops.divseq(dataTensor,255)
    //获取R数据
    ops.assign(dataProcessedTensor.pick(null,null,0),dataTensor.pick(null,null,0))
    //获取G数据
    ops.assign(dataProcessedTensor.pick(null,null,1),dataTensor.pick(null,null,1))
    //获取B数据
    ops.assign(dataProcessedTensor.pick(null,null,2),dataTensor.pick(null,null,2))
    const preprocessedData = dataProcessedTensor.data
    return preprocessedData
  }   
}

Наконец, используйте данные, возвращенные выше, чтобы делать прогнозы.

async doPrediction(imagedata) {
    if(!this.model) return;
    const inputname = this.model.inputLayerNames[0]
    const inputdata = {[inputname]: imagedata}
    const prediction = await this.model.predict(inputdata)
    this.setState({
      prediction: prediction.output[0]
    })
  }

0.4108a07f42f5.gif

считать

Видно, что в процессе предсказания KerasJS вся страница не может реагировать на действия пользователя. Это связано с тем, что в процессе расчета нейронной сети занято много ресурсов ЦП, из-за чего страница зависает. В следующей статье мы расскажем, как использовать WebGL для переноса процесса вычислений на GPU для достиженияПередние высокопроизводительные вычисленияцель.

При этом размер файла параметров модели превышает 20M. Как сжимать файлы моделей, чтобы соответствовать требованиям доступности на производственном уровне, также является направлением, в котором студенты, работающие с интерфейсом, могут углубиться.

связанные ресурсы

  1. Image classification with Keras and deep learning, Adrain Rosebrock

  2. GetThemAll, eeandrew

  3. React Keras,eeandrew

1
Рекомендуемое чтение