С чего все началось
Все началось с Эппл Маркета — я обнаружил, что у них есть программа, позволяющая определить спелость арбуза. Программа… странная. Чего стоит, хотя бы, предложение постучать по арбузу не костяшками пальцев, а… телефоном! Тем не менее, мне захотелось повторить это достижение на более привычной платформе Андроид.
Выбор инструментов
Задача наша решается несколькими способами, и если честно, мне пришлось приложить немалые усилия, чтобы не пойти «простым» путем. То есть, взять преобразования Фурье, вейвлеты и редактор сигналов. Однако, я хотел получить опыт работы с нейросетями, так что пусть сети и занимаются анализом данных.
В качестве библиотеки для создания и обучения нейросетей был выбран Керас — гугловская надстройка над 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. Нажимаем кнопку с микрофоном и начинается запись. У вас есть пять секунд, чтобы три раза стукнуть по арбузу — тук-тук-тук. Кнопка с арбузом делает «предсказание», и ее мы пока не трогаем.
Примечание — если на Гугле старая версия, то запись и предсказание совмещены в кнопке с арбузом, а кнопки с микрофоном нету.
2. Сохраненный файл — временный, и будет перезаписан при следующем нажатии кнопки записи. Это позволяет повторить постукивание, если кто-то говорит под руку (вы не представляете, как трудно заставить окружающих заткнуться на пять секунд!) или просто шумит вода — звенит посуда — сверлит сосед…
Но вот арбуз выбран и куплен. Вы принесли его домой, записали звук и разрезали. Теперь вы готовы дать оценку его вкусовым качествам. Выбираем вкладку Save.
На этой вкладке мы видим два комбобокса для выставления оценок — сладость и спелость (sweetness and ripeness, работа над переводом ведется). Выставили оценку — нажали Save.
Внимание! Save можно нажать лишь раз. Так что, сначала выставьте оценку. По нажатию кнопки, звуковой файл переименовывается, и теперь он не будет стерт при следующей записи.
3. Наконец, записав (и значит, съев) с десяток арбузов, вы вернулись с дачи, где у вас не было Интернета. Теперь Интернет есть. Открываем вкладку Submit и нажимаем кнопку. Пакет (с десятком арбузов) уходит на сервер разработчика.
Написание серверной программы
Тут все просто, так что я лучше выложу полный код этого скрипта. Программа «ловит» файлы, дает им уникальные имена и складывает в директории, доступной только владельцу сайта.
<?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)
sergku1213
22.09.2018 21:27+1Мне кажется, будет велик процент ошибочных оценок людьми из-за их необъективности. На мой взгляд, арбузы по звуку хорошо определяются. Похлопывая по нему слушаем звук. Звонкое эхо — арбуз достиг кондиций. Если эхо вялое, ватное или переспел или недоспел. Налитые соком упругие клетки -хорошо пропускают звук, когда переспел или лежалый — клетки начинают или отделяться одна от другой «рыхлый» или терять воду и становиться вялыми. Проводимость звука падает. Может использовать механизм вибрации в телефоне? Прижимаешь телефон, программа делает несколько пингов вибратором и анализирует отклик. Заодно можно получить/учесть оценку размера арбуза.
masai
22.09.2018 22:13Может использовать механизм вибрации в телефоне? Прижимаешь телефон, программа делает несколько пингов вибратором и анализирует отклик.
Вибраторы у разных моделей разные, сложно будет анализировать. Можно, как вариант испускать громкий эталонный звук, этакое УЗИ, но, боюсь, это будет и анализировать трудно, и в использовании будет не очень удобно.
Alex_ME
22.09.2018 22:26Можно, как вариант испускать громкий эталонный звук, этакое УЗИ, но, боюсь, это будет и анализировать трудно, и в использовании будет не очень удобно.
Ну, на Windows Mobile была программа-сонар. Конечно, точность у нее ужасная, но как proof of concept она работает.
Так что вполне возможно, я думаю.
FizpokPak Автор
22.09.2018 22:31Пробовал. Увы, на записи, сделанной необученным человеком слышен, в основном, дикий скрип микрофона по арбузу. Что до испускания звука — надо этот звук потом из записи убирать, что сложно — телефон не умеет «стрелять» импульсами и ловить эхо в реальном времени. Да и фильтры в нем делать…
С другой стороны, хорошая сеть должна (если будут образцы) сама поделить людей на категории по тому, как они стучат по арбузу. Вообще, я был потрясен, осознав, насколько сложно объяснить людям простые вещи, от «стучи костяшками, а не хлопай ладонью» и до «нажми кнопку и отпусти. Держать-то зачем?»
webkumo
23.09.2018 09:17У вас не учтён кейс охлаждённого недоспелого арбуза — он звонкий как хз что, но со сладостью и прочими вкусовымиощущениями у него проблемы.
FizpokPak Автор
23.09.2018 09:59Если бы я знал, как его учесть… Впрочем, если кто-то покупает арбузы из холодильника — сам виноват.
webkumo
23.09.2018 14:03+1Покупал недели две назад в магните — были холодные (градусов так 15) и звонкие… они не были из холодильника, их, похоже, просто хранили в неотапливаемом помещении/очень долго везли/хранили в грузовике…
В общем сладости почти не было, с сочностью тоже было не идеально… в общем расстроился я с этого арбуза.sergku1213
23.09.2018 19:468Ж!!! Ужас. Я уже много лет не встречал несладких арбузов. В Литве. Правда, я выбираю согласно своим критериям «звонкого эха». Но похоже, они все равно все спелые, 21 век, однако. Кстати — у нас самые вкусные арбузы — из России. Венгерские, Украинские, Итальянские — сладкие, красивые… но чего-то в них не хватает. Вероятно поливают излишне. Очень хороший попался арбуз из Бразилии. Практически как Российский — на 5++.
cl0ne
22.09.2018 22:10Изображения в посте «умерли» только у меня одного?
FizpokPak Автор
22.09.2018 22:32+2Вижу изображения.
STFBEE
23.09.2018 20:08Работают, только если открыть в новой вкладке, в посте только alt-текст показывается.
UPD: Chrome ругается, что изображения лежат на http, а страница загружена по https.FizpokPak Автор
24.09.2018 16:17Отложил до релиза. Сервер тоже надо переводить на https, а программа передает данные по http. Следующая версия перейдет на https, и сайт — вместе с ней.
algotrader2013
22.09.2018 23:09Нашел в маркете еще под андроид
https://play.google.com/store/apps/details?id=com.koolio.watermelonprober
Но она стремная — требует доступа к файловой системе. Что-то можете о ней сказать?
DmitrySpb79
22.09.2018 23:25Не вижу в статье ни одной сонограммы со звуками. Так чем же в итоге отличается звук у спелого арбуза и неспелого?
PS Ну и это, мода у всех программ лезть в интернет за каждой ерундой это идиотизм. Скоро калькулятор будет 2+2 post-запросом на сервер отправлять…FizpokPak Автор
22.09.2018 23:44Отличается звуком :) Если бы я мог ткнуть пальцем, то нейросеть была бы не нужна.
Что до Интернета… Допустим, сети нужна сотря образцов для обучения. Я не железный — есть сто арбузов. Значит, надо просить пользователей присылать оценки. Значит — Интернет, куда же без него?
itconsulting
22.09.2018 23:38Эстетическое замечание — «How to test the Melon» переводится как «Как протестировать дыню». Советую написать «How to check your watermelon».
vindy123
22.09.2018 23:43+1А почему еще никто не вспомнил трушного советского школьника из «Юного техника», который решал задачу без всех этих ваших аппликушечек, нейросетей и прочей хипстоты?
Письмо читателяFizpokPak Автор
22.09.2018 23:48Я до сих пор собираю статистику по звуку, покупая арбузы. На работе уже смеются… Так вот, купил по звуку ПЛОХОЙ. То есть, специально выбрал, чтобы «тусклый» звук, а то в базе сплошь хорошие. Удельный вес — хороший. А арбуз оказался ТУХЛЫМ. И взвешивание тут не поможет.
vindy123
23.09.2018 00:04Вот люди проводили тест-драйв этого метода школьника, и тоже нарвались на тухлый)
Надеюсь, метод в мобильном приложении работает лучше.
66.ru/news/freetime/214031FizpokPak Автор
23.09.2018 01:20Пока что мобильное приложение работает не очень — мало данных. Его основная задача — собрать эти данные. В каждом следующем обновлении анализ будет точнее.
id_potassium_chloride
23.09.2018 16:28+1А сделайте обновление «на лету». То есть приложение просто скачивает обновлённую модель из Интернета и помещает в свою папку на устройстве. Так правильнее, мне кажется (на самом деле у меня просто gapps-ов нет на телефоне).
ainoneko
23.09.2018 17:05+3А арбуз оказался ТУХЛЫМ. И взвешивание тут не поможет.
А про это в «Науке и жизни» было, про программу для калькулятора:Заголовок спойлераvasimv
23.09.2018 03:09Это если круглый арбуз определенного сорта. А если он вытянутый, как дыня — придется уже логарифмическую линейку приделывать. И, подозреваю, что к тем арбузам, которые без косточек или к желтым арбузам — нифига не подойдет тоже.
Alexsandr_SE
23.09.2018 22:30Несколько последних арбузов, что покупал имеют неправильную форму. Там уже и линейка не поможет.
Научить бы тогда по снимкам с камеры делать 3Д модель и по ней + вес высчитывать спелость :)
roryorangepants
23.09.2018 00:05-3Сначала нужно создать нейросеть — на Питоне и Керасе, под Убунту. Можно — на эмуляторе Убунты. Можно — под Виндоуз, но потраченного дополнительно времени вам хватит, чтобы упомянутую Убунту изучить, и далее работать под ней.
Вы уж простите, но если у вас есть проблемы с поднятием Python, TF или Keras под виндой, то возможно проблема не в винде…citius
23.09.2018 01:21+1Если поднять питон и нужный стек под виндой сложнее, чем написать кучку приложений под нейросети, сервера, и мобильники — проблема точно в винде.
roryorangepants
23.09.2018 08:17Очевидно, что этот комментарий означал: "На Винде нужный стек поднять так же легко, как на Убунте".
Мне жаль, что вы почему-то поняли это иначе.
DanilinS
23.09.2018 00:21+2На Анроид телефонах очень большой разброс по параметрам микрофона… Не уверен, что что-то можно из этого выжать. Разве что производить индивидуальную калибровку…
Иначе будет вопрос: «это микрофон дал глухой звук или арбуз»? Или глухой звук из-за материала корпуса телефона или его чехла.0o0
23.09.2018 01:18Боюсь, если чехол закрывает микрофон, то юзеру об этом сразу скажут при первом звонке.
FizpokPak Автор
23.09.2018 01:23Это проблема, но не очень серьёзная. Если мне пришлют запись на 8 килогерц (есть и такие андроиды) вместо 41.4, я это увижу, и в обучающую выборку не включу. А современные телефоны очень неплохо пишут звук — по крайней мере, те, что я тестировал.
0o0
23.09.2018 01:20Ой, как раз сегодня купил два небольших арбуза. Один был вкусный, а второй завтра узнаю, и постучу, видимо, по нему телефоном. Будет такой шаманский ритуал перед поеданием.
FizpokPak Автор
23.09.2018 01:27Не надо телефоном! Кончиками пальцев или костяшками!
0o0
23.09.2018 01:42Да, уже поставил прогу, там прочитал, как действовать, выбора языка нет, кстати.
Про язык ос ничего слышать не хочу даже.
Да, и пока игрался с постукиванием по стеклу планшета, она от 1.1 до 5.5 показывает рандомные цифири.FizpokPak Автор
23.09.2018 10:04Насчет рандома — эта версия собирает данные. Анализ у нее слабый. Будет больше самплов — будет точность. Кастрюли она у меня, например, учится различать с пол-пинка :)
Что до перевода — в след. версии — то есть, вместе с апдейтом сети — будет русский.
Кстати, Гугл Плей утверждает, что 17% скачавших — из Саудовской Аравии. Надеюсь, до перевода не дойдет…
Arris
23.09.2018 01:21+1Но, возможно, машинное обучение для такой задачи и не нужно? :)
С современным развитием техники измерить размеры арбуза (а, возможно, даже вычислить его окружность) несложно. Остается взвесить, потом навести камеру на арбуз, нажать на кнопку и получить ответ:
Скрытый текстboootloader
23.09.2018 02:21А действительно, есть ведь ARKit/ARCore для измерений и даже дисплеи с определением силы нажатия для взвешивания (ну ладно, последнее спорно: неизвестен максимальный измеряемый вес без вреда для дисплея, это же арбузы как-никак). Но даже если взвешивать традиционными карманными весами, тот же ARKit 2.0 измерит габариты, приложение посчитает объём, останется только ввести массу.
FizpokPak Автор
23.09.2018 10:05+1Ну вот смотрите — пришел я в Пятерочку. Там стоит картонный ящик, перетянутый лентами — 1 кубометр арбузов. Надо нагнуться, достать, взвесить… И так 20 раз. То есть, приложение для штангистов. Стучать же можно in-place.
boootloader
23.09.2018 10:43О как. В последний раз покупал арбузы на среднеазиатском базаре, где они лежат отдельно и их всё равно взвешивают — покупал не себе, сам не люблю. Так что с практикой приобретения в современных реалиях у меня всё плохо, да :)
Но тогда другой вопрос, если в ящике арбузы соприкасаются (и немного сжимаются при этом), не будет ли это влиять на звучание?
Zolg
23.09.2018 02:52Этот метод рассчитан на идеальные сферические арбузы
в вакууме. В реальной жизни арбузы формой не очень похожии на шар.
mbait
23.09.2018 02:55конволюционная 2D сеть
Конволюции, это когда ночью снится яркий и красочный сон, в котором ты работаешь в Google DeepMind, изобретаешь сильный ИИ, достигаешь острия прогресса, просыпаешься и обнаруживаешь себя в постели с ноубуком, всём исписанным приложением по распознаванию спелости арбузов. А тип сети, о котором идёт речь — свёрточный.Dark_Daiver
23.09.2018 11:55Если честно, то я не понимаю за что заминусовали пост. «конволюционная 2D сеть» действительно очень странный термин. Первый раз вижу такой вариант перевода «Convolution» хотя уже несколько лет читаю статьи по DL
S_A
23.09.2018 09:55В качестве упражнения, я построил график звука и анализировал полученный битмап как картинку — с помощью 2d конволюционной сети. К моему удивлению, результат получился не хуже, чем при анализе «сырых одномерных» данных.
Это вы только как упражнение делали? А то в коде сети Conv1D. А в целом интересно весьма, достаточно простая сеть по объему (capacity). Сколько у вас датасет? Метрики можете написать? Видимо хорошо генерализовались данные сетью…FizpokPak Автор
23.09.2018 10:11Завтра попробую выложить. Там нет ничего такого, просто как экстра усилие надо потом в Java приложении строить те же графики, и генерировать битмапы. То есть, лишний шаг в работе. А так, да, работает. Это же просто доп. преобразование данных :) Просто идея необычная.
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'])
Где-то так.
Sap_ru
23.09.2018 11:06Почему у вас сервер не взломают или не заддосят?
Tyusha
23.09.2018 18:46+1Скорее продавцы плохих арбузов будут портить обучающую выборку: ставить высокие оценки плохим арбузам.
FizpokPak Автор
24.09.2018 09:47+1Вот кстати: а не продаться ли мне арбузной мафии? Делаю вай-фай анализатор, если данная точка в базе — арбузы показываю как хорошие, если нет — как плохие :)
Sap_ru
23.09.2018 11:07Господа, а если замутить стартп с ультразвуковым сканером к телефону? Им можно что угодно же тестировать.
FizpokPak Автор
23.09.2018 14:56+2Был стартап к айфону, и вроде, даже, дошло до продаж. Как работал — не знаю, но красоты был неописуемой. Беленький…
Stepan555
23.09.2018 14:57Ультразвуковых сканеров несчётное множество. Зайдите в кабинет УЗИ — там увидите десятка полтора. Для каждой цели свой. И это только для исследования тела. Для УЗИ трещин в металле свои, для эхолотов свои, для воздушной среды свои. Какой конкретно вы собираетесь приделать к телефону и для какой цели?
Sap_ru
24.09.2018 01:11Очевидно, что тот, который будет стоить копейку, а пользователю не нужны будут дополнительные знания. Спелость фруктов (по плотности), измерение толщины обшивки стен, поиск пустот в материалах, поиск проводки и кабель каналов, возможно — применения, которые не требуют особенной точности и могут быть реализованы простыми алгоритмами и датчиками. Может быть, простейший анализ качества строительной шпатлёвки или наливных полов (на предмет отслоения от подстилающей поверхности) — на первый взгляд реализуемо, но материалы очень неоднородные, и не факт, что это можно в общем случае решить непрофессиональным оборудованием. Трещины в металле (может быть простейшая диагностика сварных швов) и толщина краски/шпатлёвки, это в качестве бонуса если получится, т.к. там требования к датчикам достаточно суровые.
Glycosylase
23.09.2018 14:57Под Java есть же библиотека DeepLearning4j, можно и без Python обходиться.
FizpokPak Автор
23.09.2018 14:58Да. Но я хотел универсальную сет, а Java — просто как возможное клиентское решение. Ведь попадись тяжелая задача — не на телефоне же ее обучать.
ArsenAbakarov
23.09.2018 16:43+1круто конечно, но…
изучают python за две недели и получается такое:
if os.path.exists(output_dir) == FalseFizpokPak Автор
23.09.2018 18:14Да, двоеточие пропущено :)
ArsenAbakarov
23.09.2018 20:39+1В данном случае достаточно if os.path.exists(output_dir): — как сказали выше, но…
не делайте так, если в условии переменная, которая может принимать 0, а вам нужно проверить ее отсутствие, в этом случае нужно сравнивать с None явно, у нас так на проде криво наценки синхронизировались, аккуратнее с этимainoneko
24.09.2018 10:26не делайте так, если в условии переменная, которая может принимать 0
А при чём тут 0? Здесь функция возвращает в точности логическое значение.
в этом случае нужно сравнивать с None явно
Ещё можно сказать, что надо сравнивать, используя "is None
", а не "== None
".
hazg
23.09.2018 17:43Желтое пятно на боку. Чем больше — тем слаще.
Demosfen
23.09.2018 19:00На самом деле, пятно вообще не показатель.
hazg
23.09.2018 19:36По личному опыту — лучше чем акустика и сухость хвостика. С удельной массой конечно не сравнится.
Demosfen
23.09.2018 21:31Величина пятна зависит только от того, как арбуз лег на почву. Цвет пятна тоже так себе показатель — у некоторых сортов оно насыщенного цвета, почти оранжевое даже на неспелом арбузе, а других имеет чуть желтоватый оттенок у переспевшего.
Могу точно сказать, т.к. выращиваю их в свободное время :)hazg
25.09.2018 04:40Все так.
В попытке объяснить феномен рассуждал так: чем дольше арбуз лежит плоскостью на грунте — тем больше пятно, за недостатком солнечного света.
Сорт арбуза конечно вносит поправки, но сам не выращиваю (климат не тот), спорить не буду.
Так или иначе, арбузы на рынке пока успешно выбираю таким методом.Demosfen
25.09.2018 05:31На самом деле, арбуз можно вырастить почти в любом климате. Я тоже раньше думал, что у меня климат не тот, а потом узнал про прививку и теперь выращиваю арбузы в открытом грунте по 10+кг. В этом году рекорд 14кг.
vassabi
25.09.2018 09:12а можете поделиться ссылками — где про это (на ваш личный взгляд) лучше почитать\посмотреть?
Demosfen
25.09.2018 09:31Я начинал с дачного форума dacha.wcb.ru — и по прививке и по выбору сортов много инфы в разделе по бахчевым.
Здесь еще куча инфы (там и пара моих отчетов есть): vk.com/arbuzyatnya
По самому процессу прививки на youtube в поиске набираем «прививка арбуза».
Прививать можно на лагенарию или спец. подвои, их можно купить на Хупте, на Али (сейчас нет, обычно выкладывают их зимой-весной).
В прошлом году я под Уфой на грядке 14*3м собрал 2 центнера арбузов, в этом году еще не считал, но судя по количеству и весу, будет раза в 2-2.5 больше (правда и площадь посадки немного увеличилась).
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)))
что в принципе никак не влияет на результат, но лишняя операция в графе)FizpokPak Автор
23.09.2018 18:17Делал и так и так. Могу выложить код, вырезающие три стука, но он такой кривой, что неловко. Вроде, разницы особой нет — для 1д. Для 2д — есть, там надо резать.
Огроменный плюс разбивания — что можно первые два стука взять в обучающую выборку, а третий — в тестовую. То есть, данный стиль стука гарантированно учит сеть.
> У вас в первом слое два раза применяется ReLU активация
Упс. Что еще скажешь?
Meklon
23.09.2018 18:44С тыквой я поступил проще. Тупо засунул в конусно-лучевой томограф. Очень рекомендую)
FizpokPak Автор
24.09.2018 09:48+3Продавцы на рынке охренеют. Плюсую.
Meklon
24.09.2018 11:30Я в итоге ту тыкву есть не стал) Томограмма показала, что там очень мало мякоти и почти все внутренне пространство заполнено рыхлыми волокнами и семенами. Разрешение там до 0.2 мм, так, что все в подробностях видно) Хулиганство, конечно, но если томограф под боком есть — почему не воспользоваться?
FizpokPak Автор
24.09.2018 20:01Важный апдейт: вышла новая версия с улучшенным анализом. Спасибо всем, приславшим арбузы, и шлите, пожалуйста, еще!
trimtomato
Поделитесь ссылкой на вдохновившее вас приложение из апп стора?
Спасиб.
FizpokPak Автор
Тут такое дело — я пользователь Андроида. И про новости Эппла узнаю из дайджестов, вроде этого:
А в аппсторе я не ориентируюсь, сори :)
boootloader
Из ныне поддерживаемых нашёл только iWatermelon Deluxe. Melon Meter, о котором многие писали в 2011 году, уже отсутствует в аппсторе.
boootloader
Вставлял линк с телефона и не заметил, что скопировалось лишнее. Корректная ссылка