Определяем спелость арбуза с помощью Keras: полный цикл, от идеи до программы на Google Play +62



С чего все началось


Все началось с Эппл Маркета — я обнаружил, что у них есть программа, позволяющая определить спелость арбуза. Программа… странная. Чего стоит, хотя бы, предложение постучать по арбузу не костяшками пальцев, а… телефоном! Тем не менее, мне захотелось повторить это достижение на более привычной платформе Андроид.

Выбор инструментов


Задача наша решается несколькими способами, и если честно, мне пришлось приложить немалые усилия, чтобы не пойти «простым» путем. То есть, взять преобразования Фурье, вейвлеты и редактор сигналов. Однако, я хотел получить опыт работы с нейросетями, так что пусть сети и занимаются анализом данных.

В качестве библиотеки для создания и обучения нейросетей был выбран Керас — гугловская надстройка над TensorFlow и Theano. Вообще, если вы только начинаете работу с сетями глубокого обучения, лучше инструмента вам не найти. С одной стороны, Керас — мощный инструмент, оптимизированный по скорости, памяти и железу (да, он умеет работать на видеокартах и их кластерах). С другой — всё, что можно «спрятать» от пользователя, там спрятано, так что вам не придется ломать голову над стыковкой слоев нейросети, например. Очень удобно.

Как Керас, так и нейросети вообще, требуют знания Питона — этот язык, подобно змее обвил… извините, наболело. Короче, без Питона в современный Deep Learning соваться не стоит. К счастью, Питон можно изучить за две недели, в крайнем случае — за месяц.

К Питону вам потребуются еще некоторые библиотеки, но это уже мелочи — я имею в виду, если уж вы справились с самим Питоном. Потребуется знакомство (весьма поверхностное) с NumPy, PyPlot и возможно, еще с парой библиотек, из которых мы возьмем буквально по паре функций. Не сложно. Правда.

Ну и в завершение замечу, что упоминавшиеся выше кластеры видеокарт нам не потребуются — наша задача нормально решается с помощью компьютерного CPU — медленно, но не критично медленно.

План работы


Сначала нужно создать нейросеть — на Питоне и Керасе, под Убунту. Можно — на эмуляторе Убунты. Можно — под Виндоуз, но потраченного дополнительно времени вам хватит, чтобы упомянутую Убунту изучить, и далее работать под ней.

Следующий шаг — написание программы. Я планирую сделать это на Java под Андроид. Это будет прототип программы, в том смысле, что пользовательский интерфейс у нее будет, а вот нейросети пока что нет.

В чем же смысл написания «пустышки», спросите вы. А вот в чем: любая задача, связанная с анализом данных, рано или поздно упирается в поиск данных — для обучения нашей программы. В самом деле, сколько арбузов надо обстучать и попробовать на вкус, чтобы нейросеть смогла на этих данных построить достоверную модель? Сотню? Больше?

Здесь нам и поможет наша программа: заливаем ее на Google Play, раздаем (ладно, навязываем, выкручивая руки) всем друзьям, которым не повезло иметь телефон с Андроидом, и данные, тонюсеньким ручейком, начинают стекаться… а кстати, куда?

Следующий шаг — написание серверной программы, принимающей данные от нашего андроид клиента. Правда, эта серверная программа очень проста, я все закончил минут за двадцать. Но, тем не менее, это отдельный этап.

Наконец, данных достаточно. Обучаем нейросеть.

Портируем нейросеть на Java и выпускаем обновление нашей программы.

Профит. Хотя нет. Программа была бесплатной. Только опыт и набитые шишки.

Создание нейросети


Работа с аудио, каковым, безусловно, является постукивание по арбузу, это либо рекуррентные нейросети, либо так называемая одномерная конволюционная сеть. Причем, в последнее время конволюционные сети однозначно лидируют, вытесняя рекуррентные. Идея конволюционной сети заключается в том, что по массиву данных — графику «интерсивность звука — время» — скользит окошко, и вместо анализа сотен тысяч сэмплов, мы работаем только с тем, что в окошко попадает. Следующие слои объединяют и анализируют результаты работы этого слоя.

Чтобы было понятнее, представьте, что вам надо найти на фото морского пейзажа чайку. Вы сканируете картину — «окошко» вашего внимания движется вдоль воображаемых строк и столбцов, в поисках белой галочки. Именно так работает конволюционная 2D сеть, одномерная же сканирует вдоль одной координаты — оптимальный выбор, если мы имеем дело со звуковым сигналом.

Отмечу, однако, что зацикливаться на 1D сетях не обязательно. В качестве упражнения, я построил график звука и анализировал полученный битмап как картинку — с помощью 2d конволюционной сети. К моему удивлению, результат получился не хуже, чем при анализе «сырых одномерных» данных.

Используемая сеть имела следующую структуру:

model = Sequential()
model.add(Conv1D(filters=32, kernel_size=512, strides=3, 
	padding='valid', use_bias=False, input_shape=(nSampleSize, 1), name='c1d', 
	activation='relu'))
model.add(Activation('relu', input_shape=(nSampleSize, 1)))
model.add(MaxPooling1D(pool_size=(2)))

model.add(Conv1D(32, (3)))
model.add(Activation('relu'))
model.add(MaxPooling1D(pool_size=(2)))

model.add(Conv1D(64, (3)))
model.add(Activation('relu'))
model.add(MaxPooling1D(pool_size=(2)))

model.add(Flatten())
model.add(Dense(64))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(nNumOfOutputs)) #1))
model.add(Activation('sigmoid'))

model.compile(loss='mean_squared_error',
	optimizer='adam',
	metrics=['accuracy'])

У этой сети два выходных значения (она предсказывает две величины): сладость и спелость. Сладость бывает 0 (несладкий), 1 (нормальный) и 2 (превосходный), а спелость, соответственно, 0 — слишком твердый, 1 — то, что надо, и 2 — перезрелый, как вата с песком.

Оценки для тестовой выборки выставляются человеком, как именно — мы поговорим в разделе, посвященном программе для Андроид. Задача нейросети — предсказать, какую для данного арбуза (по записи постукивания) оценку поставит человек.

Написание программы


Я уже упоминал, что программа должна выйти в виде двух версий. Первая, предварительная, честно предупреждает пользователя, что ее предсказания — полный бред. Зато она позволяет пользователю записать стук по арбузу, выставить оценку вкусовых качеств этого арбуза и переслать по Интернет автору программы. То есть, первая версия просто собирает данные.

Вот страничка программы на Google Play, разумеется, программа бесплатна.

Что она делает:

1. Нажимаем кнопку с микрофоном и начинается запись. У вас есть пять секунд, чтобы три раза стукнуть по арбузу — тук-тук-тук. Кнопка с арбузом делает «предсказание», и ее мы пока не трогаем.

Примечание — если на Гугле старая версия, то запись и предсказание совмещены в кнопке с арбузом, а кнопки с микрофоном нету.

image

2. Сохраненный файл — временный, и будет перезаписан при следующем нажатии кнопки записи. Это позволяет повторить постукивание, если кто-то говорит под руку (вы не представляете, как трудно заставить окружающих заткнуться на пять секунд!) или просто шумит вода — звенит посуда — сверлит сосед…

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

На этой вкладке мы видим два комбобокса для выставления оценок — сладость и спелость (sweetness and ripeness, работа над переводом ведется). Выставили оценку — нажали Save.

Внимание! Save можно нажать лишь раз. Так что, сначала выставьте оценку. По нажатию кнопки, звуковой файл переименовывается, и теперь он не будет стерт при следующей записи.

image

3. Наконец, записав (и значит, съев) с десяток арбузов, вы вернулись с дачи, где у вас не было Интернета. Теперь Интернет есть. Открываем вкладку Submit и нажимаем кнопку. Пакет (с десятком арбузов) уходит на сервер разработчика.

image

Написание серверной программы


Тут все просто, так что я лучше выложу полный код этого скрипта. Программа «ловит» файлы, дает им уникальные имена и складывает в директории, доступной только владельцу сайта.

<?php

	if (is_uploaded_file($_FILES['file']['tmp_name'])) 
	{
		$uploads_dir = './melonaire/';
		$tmp_name = $_FILES['file']['tmp_name'];
		$pic_name = $_FILES['file']['name'];
		
		$filename = md5(date('Y-m-d H:i:s:u'));
		
		move_uploaded_file($tmp_name, $uploads_dir.$filename);
	}
	else
	{
		echo "File not uploaded successfully.";
	}

?>

Обучение нейросети


Данные делятся на обучающие и тестовые, 70 и 30 процентов, соответственно. Нейросеть — сходится. Здесь нет никаких неожиданностей, однако, для новичков: не забудьте нормировать входные данные, это съэкономит вам массу нервов. Что-то в таком роде:

for file_name in os.listdir(path):
	nSweetness, nRipeness, arr_loaded = loadData(file_name)
	arr_data.append(arr_loaded / max(abs(arr_loaded)))
	# 2 stands for num. of inputs of a combo box - 1
	arr_labels.append([nSweetness / 2.0, nRipeness / 2.0])

Портирование нейросети


Есть несколько способов портировать сеть из питоновского окружения в Java. В последнее время, Гугл сделал этот процесс удобнее, так что, будете читать учебники — убедитесь, что они не устарели. Вот как это делал я:

from keras.models import Model
from keras.models import load_model
from keras.layers import *
import os
import sys

import tensorflow as tf

# -------------------

def print_graph_nodes(filename):
    g = tf.GraphDef()
    g.ParseFromString(open(filename, 'rb').read())
    print()
    print(filename)
    print("=======================INPUT=========================")
    print([n for n in g.node if n.name.find('input') != -1])
    print("=======================OUTPUT========================")
    print([n for n in g.node if n.name.find('output') != -1])
    print("===================KERAS_LEARNING=====================")
    print([n for n in g.node if n.name.find('keras_learning_phase') != -1])
    print("======================================================")
    print()

# -------------------

def get_script_path():
    return os.path.dirname(os.path.realpath(sys.argv[0]))

# -------------------

def keras_to_tensorflow(keras_model, output_dir, 
	model_name,out_prefix="output_", log_tensorboard=True):

    if os.path.exists(output_dir) == False:
        os.mkdir(output_dir)

    out_nodes = []

    for i in range(len(keras_model.outputs)):
        out_nodes.append(out_prefix + str(i + 1))
        tf.identity(keras_model.output[i], out_prefix + str(i + 1))

    sess = K.get_session()

    from tensorflow.python.framework import graph_util, graph_io

    init_graph = sess.graph.as_graph_def()

    main_graph = graph_util.convert_variables_to_constants(sess, init_graph, out_nodes)

    graph_io.write_graph(main_graph, output_dir, name=model_name, as_text=False)

    if log_tensorboard:
        from tensorflow.python.tools import import_pb_to_tensorboard

        import_pb_to_tensorboard.import_to_tensorboard(
            os.path.join(output_dir, model_name),
            output_dir)

model = load_model(get_script_path() + "/models/model.h5")
#keras_to_tensorflow(model, output_dir=get_script_path() + "/models/model.h5",
#	model_name=get_script_path() + "/models/converted.pb")

print_graph_nodes(get_script_path() + "/models/converted.pb")


Обратите внимание на последнюю строку: в Java коде вам нужно будет указать имена ввода и вывода сети. Этот «print» как раз их и печатает.

Итак, кладем в директорию assets проекта в Андроид Студио полученный файл concerted.pb, подключаем (см. здесь, или здесь, а лучше, здесь) библиотеку tensorflowinferenceinterface, и всё.

Всё. Когда я делал это впервые, я ожидал, что будет трудно, но… заработало с первой попытки.

Вот как выглядит вызов нейросети из Java кода:

        protected Void doInBackground(Void... params)
        {
            try
            {
                //Pass input into the tensorflow
                tf.feed(INPUT_NAME, m_arrInput, 1, // batch ?
                        m_arrInput.length, 1); // channels ?

                //compute predictions
                tf.run(new String[]{OUTPUT_NAME});

                //copy the output into the PREDICTIONS array
                tf.fetch(OUTPUT_NAME, m_arrPrediction);
            } catch (Exception e)
            {
                e.getMessage();
            }
            return null;
        }

Здесь m_arrInput — массив с двумя элементами, содержащий — та-да! — наше предсказание, нормированное от нуля до единицы.

Заключение


Здесь, вроде, полагается поблагодарить за внимание, и выразить надежду, что было интересно. Вместо этого, замечу, что на Гугле лежит первая версия программы. Вторая полностью готова, но данных — мало. Так что, если вы любите арбузы — поставьте, пожалуйста, прогу на ваш Андроид. Чем больше данных вы пришлете, тем лучше будет работать вторая версия…

Разумеется, она будет бесплатной.

Удачи, и да: спасибо за внимание. Надеюсь, было интересно.

Важный апдейт: вышла новая версия с улучшенным анализом. Спасибо всем, приславшим арбузы, и шлите, пожалуйста, еще!

Вы можете помочь и перевести немного средств на развитие сайта



Комментарии (108):

  1. trimtomato
    /#19145607 / +2

    Поделитесь ссылкой на вдохновившее вас приложение из апп стора?
    Спасиб.

    • FizpokPak
      /#19145753 / +2

      Тут такое дело — я пользователь Андроида. И про новости Эппла узнаю из дайджестов, вроде этого:
      А в аппсторе я не ориентируюсь, сори :)

  2. sergku1213
    /#19145613 / +1

    Мне кажется, будет велик процент ошибочных оценок людьми из-за их необъективности. На мой взгляд, арбузы по звуку хорошо определяются. Похлопывая по нему слушаем звук. Звонкое эхо — арбуз достиг кондиций. Если эхо вялое, ватное или переспел или недоспел. Налитые соком упругие клетки -хорошо пропускают звук, когда переспел или лежалый — клетки начинают или отделяться одна от другой «рыхлый» или терять воду и становиться вялыми. Проводимость звука падает. Может использовать механизм вибрации в телефоне? Прижимаешь телефон, программа делает несколько пингов вибратором и анализирует отклик. Заодно можно получить/учесть оценку размера арбуза.

    • masai
      /#19145709

      Может использовать механизм вибрации в телефоне? Прижимаешь телефон, программа делает несколько пингов вибратором и анализирует отклик.

      Вибраторы у разных моделей разные, сложно будет анализировать. Можно, как вариант испускать громкий эталонный звук, этакое УЗИ, но, боюсь, это будет и анализировать трудно, и в использовании будет не очень удобно.

      • Alex_ME
        /#19145737

        Можно, как вариант испускать громкий эталонный звук, этакое УЗИ, но, боюсь, это будет и анализировать трудно, и в использовании будет не очень удобно.

        Ну, на Windows Mobile была программа-сонар. Конечно, точность у нее ужасная, но как proof of concept она работает.


        Так что вполне возможно, я думаю.

      • NSA
        /#19148081

        В качестве входных данных для нейросети можно использовать в т.ч. модель телефона.

        • king555
          /#19148245

          доп.измерение(фича) повышает потребность в количестве входных данных, а их тут и так маловато.

          • FizpokPak
            /#19149707

            Так три стука вместо одного это и есть…

    • FizpokPak
      /#19145761

      Пробовал. Увы, на записи, сделанной необученным человеком слышен, в основном, дикий скрип микрофона по арбузу. Что до испускания звука — надо этот звук потом из записи убирать, что сложно — телефон не умеет «стрелять» импульсами и ловить эхо в реальном времени. Да и фильтры в нем делать…
      С другой стороны, хорошая сеть должна (если будут образцы) сама поделить людей на категории по тому, как они стучат по арбузу. Вообще, я был потрясен, осознав, насколько сложно объяснить людям простые вещи, от «стучи костяшками, а не хлопай ладонью» и до «нажми кнопку и отпусти. Держать-то зачем?»

    • webkumo
      /#19146633

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

      • FizpokPak
        /#19146707

        Если бы я знал, как его учесть… Впрочем, если кто-то покупает арбузы из холодильника — сам виноват.

        • buriy
          /#19146939

          Ну так спрашивайте, тёплый ли арбуз, который сейчас измеряется.

        • webkumo
          /#19147375 / +1

          Покупал недели две назад в магните — были холодные (градусов так 15) и звонкие… они не были из холодильника, их, похоже, просто хранили в неотапливаемом помещении/очень долго везли/хранили в грузовике…
          В общем сладости почти не было, с сочностью тоже было не идеально… в общем расстроился я с этого арбуза.

          • sergku1213
            /#19148343

            8Ж!!! Ужас. Я уже много лет не встречал несладких арбузов. В Литве. Правда, я выбираю согласно своим критериям «звонкого эха». Но похоже, они все равно все спелые, 21 век, однако. Кстати — у нас самые вкусные арбузы — из России. Венгерские, Украинские, Итальянские — сладкие, красивые… но чего-то в них не хватает. Вероятно поливают излишне. Очень хороший попался арбуз из Бразилии. Практически как Российский — на 5++.

  3. cl0ne
    /#19145703

    Изображения в посте «умерли» только у меня одного?

    • FizpokPak
      /#19145765 / +2

      Вижу изображения.

      • STFBEE
        /#19148381

        Работают, только если открыть в новой вкладке, в посте только alt-текст показывается.

        UPD: Chrome ругается, что изображения лежат на http, а страница загружена по https.

        • FizpokPak
          /#19148659

          Понял. Буду исправлять. Странно, что у меня не ругается.

        • FizpokPak
          /#19149733

          Вроде, сделал. Посмотрите, плиз.

        • FizpokPak
          /#19151793

          Отложил до релиза. Сервер тоже надо переводить на https, а программа передает данные по http. Следующая версия перейдет на https, и сайт — вместе с ней.

  4. algotrader2013
    /#19145879

    Нашел в маркете еще под андроид
    https://play.google.com/store/apps/details?id=com.koolio.watermelonprober
    Но она стремная — требует доступа к файловой системе. Что-то можете о ней сказать?

    • hurtavy
      /#19145947

      Ну так она же пишет аудио в файл, логично, что требует доступ

      • FizpokPak
        /#19145961 / +1

        Тут есть один нюанс. Если программа пишет в свою внутреннюю директорию, доступ ей не нужен. Эти, видимо, пишут в общую.

  5. DmitrySpb79
    /#19145923

    Не вижу в статье ни одной сонограммы со звуками. Так чем же в итоге отличается звук у спелого арбуза и неспелого?

    PS Ну и это, мода у всех программ лезть в интернет за каждой ерундой это идиотизм. Скоро калькулятор будет 2+2 post-запросом на сервер отправлять…

    • FizpokPak
      /#19145971

      Отличается звуком :) Если бы я мог ткнуть пальцем, то нейросеть была бы не нужна.
      Что до Интернета… Допустим, сети нужна сотря образцов для обучения. Я не железный — есть сто арбузов. Значит, надо просить пользователей присылать оценки. Значит — Интернет, куда же без него?

  6. itconsulting
    /#19145955

    Эстетическое замечание — «How to test the Melon» переводится как «Как протестировать дыню». Советую написать «How to check your watermelon».

    • FizpokPak
      /#19145973

      Да. Все время сбиваюсь. Поправлю в след. версии. Спасибо.

  7. vindy123
    /#19145965 / +1

    А почему еще никто не вспомнил трушного советского школьника из «Юного техника», который решал задачу без всех этих ваших аппликушечек, нейросетей и прочей хипстоты?

    Письмо читателя
    image

    • FizpokPak
      /#19145985

      Я до сих пор собираю статистику по звуку, покупая арбузы. На работе уже смеются… Так вот, купил по звуку ПЛОХОЙ. То есть, специально выбрал, чтобы «тусклый» звук, а то в базе сплошь хорошие. Удельный вес — хороший. А арбуз оказался ТУХЛЫМ. И взвешивание тут не поможет.

      • vindy123
        /#19146031

        Вот люди проводили тест-драйв этого метода школьника, и тоже нарвались на тухлый)
        Надеюсь, метод в мобильном приложении работает лучше.
        66.ru/news/freetime/214031

        • FizpokPak
          /#19146159

          Пока что мобильное приложение работает не очень — мало данных. Его основная задача — собрать эти данные. В каждом следующем обновлении анализ будет точнее.

          • id_potassium_chloride
            /#19147803 / +1

            А сделайте обновление «на лету». То есть приложение просто скачивает обновлённую модель из Интернета и помещает в свою папку на устройстве. Так правильнее, мне кажется (на самом деле у меня просто gapps-ов нет на телефоне).

            • FizpokPak
              /#19147825

              … и тогда пролетают те, кто хочет обновление с русским текстом :)

      • ainoneko
        /#19147925 / +3

        А арбуз оказался ТУХЛЫМ. И взвешивание тут не поможет.
        А про это в «Науке и жизни» было, про программу для калькулятора:
        Заголовок спойлера
        image

    • 0o0
      /#19146151

      Погодите ка, а я с большой жо##й выбираю, а надо с маленькой что ли?

      • 0o0
        /#19147125 / +2

        минусаторы гуглят «попка арбуза» и идут лесом.

    • vasimv
      /#19146319

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

      • Alexsandr_SE
        /#19148701

        Несколько последних арбузов, что покупал имеют неправильную форму. Там уже и линейка не поможет.
        Научить бы тогда по снимкам с камеры делать 3Д модель и по ней + вес высчитывать спелость :)

  8. ioppoi
    /#19145977

    спасибо

  9. roryorangepants
    /#19146035 / -3

    Сначала нужно создать нейросеть — на Питоне и Керасе, под Убунту. Можно — на эмуляторе Убунты. Можно — под Виндоуз, но потраченного дополнительно времени вам хватит, чтобы упомянутую Убунту изучить, и далее работать под ней.

    Вы уж простите, но если у вас есть проблемы с поднятием Python, TF или Keras под виндой, то возможно проблема не в винде…

    • citius
      /#19146163 / +1

      Если поднять питон и нужный стек под виндой сложнее, чем написать кучку приложений под нейросети, сервера, и мобильники — проблема точно в винде.

      • roryorangepants
        /#19146551

        Очевидно, что этот комментарий означал: "На Винде нужный стек поднять так же легко, как на Убунте".
        Мне жаль, что вы почему-то поняли это иначе.

    • FizpokPak
      /#19146165

      У меня проблем нет :) Но если новичку предложить два пути на выбор, под Убунтой получится быстрее. Что я и написал.

      • Al_Azif
        /#19149065

        Получится ровно с такой же скоростью.

  10. DanilinS
    /#19146073 / +2

    На Анроид телефонах очень большой разброс по параметрам микрофона… Не уверен, что что-то можно из этого выжать. Разве что производить индивидуальную калибровку…
    Иначе будет вопрос: «это микрофон дал глухой звук или арбуз»? Или глухой звук из-за материала корпуса телефона или его чехла.

    • 0o0
      /#19146157

      Боюсь, если чехол закрывает микрофон, то юзеру об этом сразу скажут при первом звонке.

      • tormozedison
        /#19147761

        Мягкий чехол стучать об арбуз будет по-другому.

        • 0o0
          /#19147839

          по инструкции стучать надо пальцем :)

    • FizpokPak
      /#19146171

      Это проблема, но не очень серьёзная. Если мне пришлют запись на 8 килогерц (есть и такие андроиды) вместо 41.4, я это увижу, и в обучающую выборку не включу. А современные телефоны очень неплохо пишут звук — по крайней мере, те, что я тестировал.

  11. 0o0
    /#19146161

    Ой, как раз сегодня купил два небольших арбуза. Один был вкусный, а второй завтра узнаю, и постучу, видимо, по нему телефоном. Будет такой шаманский ритуал перед поеданием.

    • FizpokPak
      /#19146179

      Не надо телефоном! Кончиками пальцев или костяшками!

      • 0o0
        /#19146193

        Да, уже поставил прогу, там прочитал, как действовать, выбора языка нет, кстати.
        Про язык ос ничего слышать не хочу даже.

        Да, и пока игрался с постукиванием по стеклу планшета, она от 1.1 до 5.5 показывает рандомные цифири.

        • FizpokPak
          /#19146711

          Насчет рандома — эта версия собирает данные. Анализ у нее слабый. Будет больше самплов — будет точность. Кастрюли она у меня, например, учится различать с пол-пинка :)

          Что до перевода — в след. версии — то есть, вместе с апдейтом сети — будет русский.
          Кстати, Гугл Плей утверждает, что 17% скачавших — из Саудовской Аравии. Надеюсь, до перевода не дойдет…

          • 0o0
            /#19147853

            Ну что же, арбуз съеден, стуки отправлены, изучайте :)
            Ну и опять же, страна не определяет язык, но юзер должен его определять.

            • FizpokPak
              /#19148093

              Язык там пока только инглиш, вот и не определяется. Будет в ближайшем апдейте.

            • FizpokPak
              /#19148157

              За арбуз — спасибо. Сэмплы драгоценны :)))

  12. Arris
    /#19146169 / +1

    Но, возможно, машинное обучение для такой задачи и не нужно? :)

    С современным развитием техники измерить размеры арбуза (а, возможно, даже вычислить его окружность) несложно. Остается взвесить, потом навести камеру на арбуз, нажать на кнопку и получить ответ:

    Скрытый текст
    image

    • boootloader
      /#19146251

      А действительно, есть ведь ARKit/ARCore для измерений и даже дисплеи с определением силы нажатия для взвешивания (ну ладно, последнее спорно: неизвестен максимальный измеряемый вес без вреда для дисплея, это же арбузы как-никак). Но даже если взвешивать традиционными карманными весами, тот же ARKit 2.0 измерит габариты, приложение посчитает объём, останется только ввести массу.

      • Arris
        /#19146365

        Более того, вес можно сфотографировать и распознать ;)

      • FizpokPak
        /#19146719 / +1

        Ну вот смотрите — пришел я в Пятерочку. Там стоит картонный ящик, перетянутый лентами — 1 кубометр арбузов. Надо нагнуться, достать, взвесить… И так 20 раз. То есть, приложение для штангистов. Стучать же можно in-place.

        • boootloader
          /#19146791

          О как. В последний раз покупал арбузы на среднеазиатском базаре, где они лежат отдельно и их всё равно взвешивают — покупал не себе, сам не люблю. Так что с практикой приобретения в современных реалиях у меня всё плохо, да :)

          Но тогда другой вопрос, если в ящике арбузы соприкасаются (и немного сжимаются при этом), не будет ли это влиять на звучание?

          • FizpokPak
            /#19147483

            Вроде не влияет. По крайней мере, не сильно.

    • Zolg
      /#19146303

      Этот метод рассчитан на идеальные сферические арбузы в вакууме. В реальной жизни арбузы формой не очень похожии на шар.

    • WinPooh73
      /#19147613

      Ну что вы! С нейросетями и машинным обучением всё же становится лучше. А если ещё блокчейн каким-то образом к задаче приспособить…

      • FizpokPak
        /#19148097

        Рассчитать в смарт контракте спелость арбуза будет стоить дороже, чем все арбузы мира. А так да, можно :)

  13. mbait
    /#19146307

    конволюционная 2D сеть

    Конволюции, это когда ночью снится яркий и красочный сон, в котором ты работаешь в Google DeepMind, изобретаешь сильный ИИ, достигаешь острия прогресса, просыпаешься и обнаруживаешь себя в постели с ноубуком, всём исписанным приложением по распознаванию спелости арбузов. А тип сети, о котором идёт речь — свёрточный.

    • Dark_Daiver
      /#19146969

      Если честно, то я не понимаю за что заминусовали пост. «конволюционная 2D сеть» действительно очень странный термин. Первый раз вижу такой вариант перевода «Convolution» хотя уже несколько лет читаю статьи по DL

  14. S_A
    /#19146699

    В качестве упражнения, я построил график звука и анализировал полученный битмап как картинку — с помощью 2d конволюционной сети. К моему удивлению, результат получился не хуже, чем при анализе «сырых одномерных» данных.


    Это вы только как упражнение делали? А то в коде сети Conv1D. А в целом интересно весьма, достаточно простая сеть по объему (capacity). Сколько у вас датасет? Метрики можете написать? Видимо хорошо генерализовались данные сетью…

    • FizpokPak
      /#19146737

      Завтра попробую выложить. Там нет ничего такого, просто как экстра усилие надо потом в Java приложении строить те же графики, и генерировать битмапы. То есть, лишний шаг в работе. А так, да, работает. Это же просто доп. преобразование данных :) Просто идея необычная.

    • FizpokPak
      /#19150851 / +1

      Вот смотрите. Константы:

      img_width, img_height = 100, 100
      input_shape = (img_height, img_width, 1)
      
      epochs = 50
      batch_size = 16
      validation_split=0.3	# 30% to validation
      
      nNumOfOutputs = 2
      


      Сама сеть:
      model = Sequential()
      model.add(Conv2D(32, (3, 3), input_shape=input_shape))
      model.add(Activation('relu'))
      model.add(MaxPooling2D(pool_size=(2, 2)))
      
      model.add(Conv2D(32, (3, 3)))
      model.add(Activation('relu'))
      model.add(MaxPooling2D(pool_size=(2, 2)))
      
      model.add(Conv2D(64, (3, 3)))
      model.add(Activation('relu'))
      model.add(MaxPooling2D(pool_size=(2, 2)))
      
      model.add(Flatten())
      model.add(Dense(64))
      model.add(Activation('relu'))
      model.add(Dropout(0.5))
      model.add(Dense(nNumOfOutputs)) #1))
      model.add(Activation('sigmoid'))
      
      
      model.compile(loss='binary_crossentropy',
                    optimizer='rmsprop',
                    metrics=['accuracy'])
      


      Где-то так.

  15. Sap_ru
    /#19146829

    Почему у вас сервер не взломают или не заддосят?

    • Vilgelm
      /#19146901 / +1

      Зачем?

      • Sap_ru
        /#19148941

        Прост так. Поиграться, посмотреть, что будет.

    • FizpokPak
      /#19147487

      Вы анекдот про неуловимого Джо знаете?

    • Tyusha
      /#19148197 / +1

      Скорее продавцы плохих арбузов будут портить обучающую выборку: ставить высокие оценки плохим арбузам.

      • FizpokPak
        /#19149753 / +1

        Вот кстати: а не продаться ли мне арбузной мафии? Делаю вай-фай анализатор, если данная точка в базе — арбузы показываю как хорошие, если нет — как плохие :)

  16. Sap_ru
    /#19146831

    Господа, а если замутить стартп с ультразвуковым сканером к телефону? Им можно что угодно же тестировать.

    • FizpokPak
      /#19147491 / +2

      Был стартап к айфону, и вроде, даже, дошло до продаж. Как работал — не знаю, но красоты был неописуемой. Беленький…

    • Stepan555
      /#19147493

      Ультразвуковых сканеров несчётное множество. Зайдите в кабинет УЗИ — там увидите десятка полтора. Для каждой цели свой. И это только для исследования тела. Для УЗИ трещин в металле свои, для эхолотов свои, для воздушной среды свои. Какой конкретно вы собираетесь приделать к телефону и для какой цели?

      • Sap_ru
        /#19148951

        Очевидно, что тот, который будет стоить копейку, а пользователю не нужны будут дополнительные знания. Спелость фруктов (по плотности), измерение толщины обшивки стен, поиск пустот в материалах, поиск проводки и кабель каналов, возможно — применения, которые не требуют особенной точности и могут быть реализованы простыми алгоритмами и датчиками. Может быть, простейший анализ качества строительной шпатлёвки или наливных полов (на предмет отслоения от подстилающей поверхности) — на первый взгляд реализуемо, но материалы очень неоднородные, и не факт, что это можно в общем случае решить непрофессиональным оборудованием. Трещины в металле (может быть простейшая диагностика сварных швов) и толщина краски/шпатлёвки, это в качестве бонуса если получится, т.к. там требования к датчикам достаточно суровые.

  17. Glycosylase
    /#19147495

    Под Java есть же библиотека DeepLearning4j, можно и без Python обходиться.

    • FizpokPak
      /#19147497

      Да. Но я хотел универсальную сет, а Java — просто как возможное клиентское решение. Ведь попадись тяжелая задача — не на телефоне же ее обучать.

  18. ArsenAbakarov
    /#19147867 / +1

    круто конечно, но…
    изучают python за две недели и получается такое:
    if os.path.exists(output_dir) == False

    • FizpokPak
      /#19148099

      Да, двоеточие пропущено :)

      • Claxton
        /#19148395

        Вероятно, имелось в виду, что надо писать

        if not os.path.exists(output_dir):
        , вместо сравнения на False. Вот тут подробнее можно почитать

      • ArsenAbakarov
        /#19148437 / +1

        В данном случае достаточно if os.path.exists(output_dir): — как сказали выше, но…
        не делайте так, если в условии переменная, которая может принимать 0, а вам нужно проверить ее отсутствие, в этом случае нужно сравнивать с None явно, у нас так на проде криво наценки синхронизировались, аккуратнее с этим

        • ainoneko
          /#19149939

          не делайте так, если в условии переменная, которая может принимать 0
          А при чём тут 0? Здесь функция возвращает в точности логическое значение.
          в этом случае нужно сравнивать с None явно
          Ещё можно сказать, что надо сравнивать, используя "is None", а не "== None".

  19. hazg
    /#19148035

    Желтое пятно на боку. Чем больше — тем слаще.

    • Demosfen
      /#19148223

      На самом деле, пятно вообще не показатель.

      • hazg
        /#19148307

        По личному опыту — лучше чем акустика и сухость хвостика. С удельной массой конечно не сравнится.

        • Demosfen
          /#19148551

          Величина пятна зависит только от того, как арбуз лег на почву. Цвет пятна тоже так себе показатель — у некоторых сортов оно насыщенного цвета, почти оранжевое даже на неспелом арбузе, а других имеет чуть желтоватый оттенок у переспевшего.
          Могу точно сказать, т.к. выращиваю их в свободное время :)

          • hazg
            /#19153673

            Все так.
            В попытке объяснить феномен рассуждал так: чем дольше арбуз лежит плоскостью на грунте — тем больше пятно, за недостатком солнечного света.

            Сорт арбуза конечно вносит поправки, но сам не выращиваю (климат не тот), спорить не буду.

            Так или иначе, арбузы на рынке пока успешно выбираю таким методом.

            • Demosfen
              /#19153703

              На самом деле, арбуз можно вырастить почти в любом климате. Я тоже раньше думал, что у меня климат не тот, а потом узнал про прививку и теперь выращиваю арбузы в открытом грунте по 10+кг. В этом году рекорд 14кг.

              • vassabi
                /#19153961

                а можете поделиться ссылками — где про это (на ваш личный взгляд) лучше почитать\посмотреть?

                • Demosfen
                  /#19154023

                  Я начинал с дачного форума dacha.wcb.ru — и по прививке и по выбору сортов много инфы в разделе по бахчевым.
                  Здесь еще куча инфы (там и пара моих отчетов есть): vk.com/arbuzyatnya
                  По самому процессу прививки на youtube в поиске набираем «прививка арбуза».
                  Прививать можно на лагенарию или спец. подвои, их можно купить на Хупте, на Али (сейчас нет, обычно выкладывают их зимой-весной).
                  В прошлом году я под Уфой на грядке 14*3м собрал 2 центнера арбузов, в этом году еще не считал, но судя по количеству и весу, будет раза в 2-2.5 больше (правда и площадь посадки немного увеличилась).

  20. Antomax
    /#19148105

    А что в итоге подается на вход сети, все 5 секунд записи или выделяется только отрезок со стуком?
    Интересно попробовать выделить только сигнал стука и разбить его на малые окна, длительностью в десятые доли секунды. Затем тренировать сеть только на этих малых окнах и усреднять итоговый результат по всему сигналу. Так из пары семплов малым сдвигом окна можно получить достаточно данных для тренировки сети и повысить итоговую точность.

    Интересно, как пришли к такому размеру кернела в первом слое, 512. Ведь для 1D сигнала это по сути порядок FIR фильтра, т.е. тратится много вычислительных ресурсов, не принося особой пользы для классификации. 16-64 кажется более приемлилым диапазоном. Могу ошибаться, потому интересно откуда такая цифра.

    P.S.
    У вас в первом слое два раза применяется ReLU активация, сначала в Conv1D(..., activation='relu'),
    а потом дополнительно model.add(Activation('relu', input_shape=(nSampleSize, 1)))
    что в принципе никак не влияет на результат, но лишняя операция в графе)

    • FizpokPak
      /#19148111

      Делал и так и так. Могу выложить код, вырезающие три стука, но он такой кривой, что неловко. Вроде, разницы особой нет — для 1д. Для 2д — есть, там надо резать.
      Огроменный плюс разбивания — что можно первые два стука взять в обучающую выборку, а третий — в тестовую. То есть, данный стиль стука гарантированно учит сеть.
      > У вас в первом слое два раза применяется ReLU активация
      Упс. Что еще скажешь?

  21. Meklon
    /#19148193

    С тыквой я поступил проще. Тупо засунул в конусно-лучевой томограф. Очень рекомендую)

    • FizpokPak
      /#19149759 / +3

      Продавцы на рынке охренеют. Плюсую.

      • Meklon
        /#19150283

        Я в итоге ту тыкву есть не стал) Томограмма показала, что там очень мало мякоти и почти все внутренне пространство заполнено рыхлыми волокнами и семенами. Разрешение там до 0.2 мм, так, что все в подробностях видно) Хулиганство, конечно, но если томограф под боком есть — почему не воспользоваться?

  22. king555
    /#19148269

    А по фотографии не пробовали обучить?

    • FizpokPak
      /#19149765

      Борюсь с ленью. Хотя, конечно, стоило бы.

  23. FizpokPak
    /#19152831

    Важный апдейт: вышла новая версия с улучшенным анализом. Спасибо всем, приславшим арбузы, и шлите, пожалуйста, еще!

    • Meklon
      /#19153853 / +1

      Слушай, а в твоей программе есть ролик с эталонным простукиванием и звуком? Может улучшить однородность данных, если стучать будут по инструкции.

      • FizpokPak
        /#19153899

        Хорошая идея. Сделаю, наверное.