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


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

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


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

В качестве библиотеки для создания и обучения нейросетей был выбран Керас — гугловская надстройка над 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
    22.09.2018 21:25
    +2

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


    1. FizpokPak Автор
      22.09.2018 22:28
      +2

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


    1. boootloader
      23.09.2018 01:54

      Из ныне поддерживаемых нашёл только iWatermelon Deluxe. Melon Meter, о котором многие писали в 2011 году, уже отсутствует в аппсторе.


      1. boootloader
        23.09.2018 10:38

        Вставлял линк с телефона и не заметил, что скопировалось лишнее. Корректная ссылка


  1. sergku1213
    22.09.2018 21:27
    +1

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


    1. masai
      22.09.2018 22:13

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

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


      1. Alex_ME
        22.09.2018 22:26

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

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


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


      1. NSA
        23.09.2018 18:00

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


        1. king555
          23.09.2018 19:10

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


          1. FizpokPak Автор
            24.09.2018 09:40

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


    1. FizpokPak Автор
      22.09.2018 22:31

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


    1. webkumo
      23.09.2018 09:17

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


      1. FizpokPak Автор
        23.09.2018 09:59

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


        1. buriy
          23.09.2018 11:48

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


        1. webkumo
          23.09.2018 14:03
          +1

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


          1. sergku1213
            23.09.2018 19:46

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


  1. cl0ne
    22.09.2018 22:10

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


    1. FizpokPak Автор
      22.09.2018 22:32
      +2

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


      1. STFBEE
        23.09.2018 20:08

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

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


        1. FizpokPak Автор
          23.09.2018 22:11

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


        1. FizpokPak Автор
          24.09.2018 09:43

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


        1. FizpokPak Автор
          24.09.2018 16:17

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


  1. algotrader2013
    22.09.2018 23:09

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


    1. hurtavy
      22.09.2018 23:36

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


      1. FizpokPak Автор
        22.09.2018 23:42
        +1

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


  1. DmitrySpb79
    22.09.2018 23:25

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

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


    1. FizpokPak Автор
      22.09.2018 23:44

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


  1. itconsulting
    22.09.2018 23:38

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


    1. FizpokPak Автор
      22.09.2018 23:45

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


  1. vindy123
    22.09.2018 23:43
    +1

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

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


    1. FizpokPak Автор
      22.09.2018 23:48

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


      1. vindy123
        23.09.2018 00:04

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


        1. FizpokPak Автор
          23.09.2018 01:20

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


          1. id_potassium_chloride
            23.09.2018 16:28
            +1

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


            1. FizpokPak Автор
              23.09.2018 16:32

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


      1. ainoneko
        23.09.2018 17:05
        +3

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


    1. 0o0
      23.09.2018 01:17

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


      1. 0o0
        23.09.2018 12:51
        +2

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


    1. vasimv
      23.09.2018 03:09

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


      1. Alexsandr_SE
        23.09.2018 22:30

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


  1. ioppoi
    22.09.2018 23:46

    спасибо


  1. roryorangepants
    23.09.2018 00:05
    -3

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

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


    1. citius
      23.09.2018 01:21
      +1

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


      1. roryorangepants
        23.09.2018 08:17

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


    1. FizpokPak Автор
      23.09.2018 01:21

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


      1. Al_Azif
        24.09.2018 03:21

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


  1. DanilinS
    23.09.2018 00:21
    +2

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


    1. 0o0
      23.09.2018 01:18

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


      1. tormozedison
        23.09.2018 16:19

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


        1. 0o0
          23.09.2018 16:33

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


    1. FizpokPak Автор
      23.09.2018 01:23

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


  1. 0o0
    23.09.2018 01:20

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


    1. FizpokPak Автор
      23.09.2018 01:27

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


      1. 0o0
        23.09.2018 01:42

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

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


        1. FizpokPak Автор
          23.09.2018 10:04

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

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


          1. 0o0
            23.09.2018 16:39

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


            1. FizpokPak Автор
              23.09.2018 18:10

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


            1. FizpokPak Автор
              23.09.2018 18:29

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


  1. Arris
    23.09.2018 01:21
    +1

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

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

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


    1. boootloader
      23.09.2018 02:21

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


      1. Arris
        23.09.2018 04:07

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


      1. FizpokPak Автор
        23.09.2018 10:05
        +1

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


        1. boootloader
          23.09.2018 10:43

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

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


          1. FizpokPak Автор
            23.09.2018 14:54

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


    1. Zolg
      23.09.2018 02:52

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


    1. WinPooh73
      23.09.2018 15:30

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


      1. FizpokPak Автор
        23.09.2018 18:12

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


  1. mbait
    23.09.2018 02:55

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

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


    1. FizpokPak Автор
      23.09.2018 10:06

      Conv2D и Conv1D


    1. Dark_Daiver
      23.09.2018 11:55

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


  1. S_A
    23.09.2018 09:55

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


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


    1. FizpokPak Автор
      23.09.2018 10:11

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


    1. FizpokPak Автор
      24.09.2018 13:07
      +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'])
      


      Где-то так.


  1. Sap_ru
    23.09.2018 11:06

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


    1. Vilgelm
      23.09.2018 11:34
      +1

      Зачем?


      1. Sap_ru
        24.09.2018 01:01

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


    1. FizpokPak Автор
      23.09.2018 14:56

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


    1. Tyusha
      23.09.2018 18:46
      +1

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


      1. FizpokPak Автор
        24.09.2018 09:47
        +1

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


  1. Sap_ru
    23.09.2018 11:07

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


    1. FizpokPak Автор
      23.09.2018 14:56
      +2

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


    1. Stepan555
      23.09.2018 14:57

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


      1. Sap_ru
        24.09.2018 01:11

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


  1. Glycosylase
    23.09.2018 14:57

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


    1. FizpokPak Автор
      23.09.2018 14:58

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


  1. ArsenAbakarov
    23.09.2018 16:43
    +1

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


    1. FizpokPak Автор
      23.09.2018 18:14

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


      1. Claxton
        23.09.2018 20:16

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

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


      1. ArsenAbakarov
        23.09.2018 20:39
        +1

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


        1. ainoneko
          24.09.2018 10:26

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


  1. hazg
    23.09.2018 17:43

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


    1. Demosfen
      23.09.2018 19:00

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


      1. hazg
        23.09.2018 19:36

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


        1. Demosfen
          23.09.2018 21:31

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


          1. hazg
            25.09.2018 04:40

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

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

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


            1. Demosfen
              25.09.2018 05:31

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


              1. vassabi
                25.09.2018 09:12

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


                1. Demosfen
                  25.09.2018 09:31

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


  1. Antomax
    23.09.2018 18:14

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

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

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


    1. FizpokPak Автор
      23.09.2018 18:17

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


  1. Meklon
    23.09.2018 18:44

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


    1. FizpokPak Автор
      24.09.2018 09:48
      +3

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


      1. Meklon
        24.09.2018 11:30

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


  1. king555
    23.09.2018 19:18

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


    1. FizpokPak Автор
      24.09.2018 09:49

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


  1. FizpokPak Автор
    24.09.2018 20:01

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


    1. Meklon
      25.09.2018 08:20
      +1

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


      1. FizpokPak Автор
        25.09.2018 08:50

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