WCF - ключ к любым .Net технологиям в шаблоне. Нейросеть Microsoft.ML.Net в ваших проектах

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 650
Благодарностей
1 318
Баллы
113
Последнее редактирование:

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
823
Баллы
93
теперь надо понять как обучать своим картинкам
Прежде чем бросаться во все тяжкие, порекомендовал хотя бы по вершкам пройтись по основам нейросетей.:-)
Т.к. это тема достаточна обширная, и за пару вечерков сразу и не въедешь.

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

Если касательно картинок и распознавания что там, то это CNN, они тоже бывают разные.

Но еще больший интерес представляют RCNN. Такие сети не просто распознают что там, но и могут определить место где находится нужный объект.

Одна из наиболее шустрых сетей относящихся к RCNN это YOLO3. По ссылке можно посмотреть сравнительную таблицу аналогичных сетей.

Например есть такая капча как GeeTest(на скрине старый вариант, сейчас капча чутка другая), где надо жмакнуть по картинкам из задания.
Вот для этого и нужна RCNN, чтобы были координаты прямоугольника в который вписан объект распознанный нейронкой.
46387

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

Кто хоть раз ковырялся с капмонстром, и подготавливал данные, тот уже работал с датасетом.:-)
Задача, подготовить данные, чтобы объяснить сетке, что вот тут "кошечка", а вот тут "собачка".

Чем больше данных, тем качественнее будет обучение. Больше понятие относительное, для каждого типа задачи может быть по разному.
К примеру если задача обучить сетку отличать котиков от собачек, то чем больше будет разных картинок тем лучше.
Если вернуться к тому же geetest, то там картинка каждого класса поворачивается и чутка масштабируется, но по факту одна и та же. Т.е. картинок надо собирать меньше.

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

И напоследок. Надо понимать, что работа с сетками требует серьезных вычислительных ресурсов. Опять же все зависит от сетки.
Например:
Фреймворк - darknet.
Сетка - YOLO3.
Задача - geetest.
Датасет - больше 200 классов объектов.
Обучение - gtx 1070 херачила больше 3 суток.:-)

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

На десерт. Сайт на котором куча всего интересного по сеткам. Рекомендуется к постоянному мониторингу.

Также не забываем youtube. Где тоже можно найти много интересных видосов по работе с сетками.
 

evgen2208

Client
Регистрация
12.10.2016
Сообщения
130
Благодарностей
162
Баллы
43
Прежде чем бросаться во все тяжкие, порекомендовал хотя бы по вершкам пройтись по основам нейросетей.:-)
Вот столько раз подходил к "теории нейросетей" столько же раз закрвыал статьи с мыслями "нет. я слишком туп/стар для всего этого".
А тут смысл в самом заголовки статьи MS:
Создание модели классификации изображений ML.NET на основе предварительно обученной модели TensorFlow
В изначальной версии статьи (моей) были не только хотдоги. Я собирал разные датасеты, отправлял - очень сильно офигевал от того, что работает это ну прям как капмонстр. Т.е. просто картинки кладешь в папочку и один файлик текстовый прикладываешь - и она уже начинает показывать результаты.

Пробовал через ModelBuilder в VS сам обучить модель (типа глубокое обучение с нуля) на тех же датасетах - вообще ничего полученная модель не могла определить.


теперь надо понять как обучать своим картинкам
Собственно ответ уже выше был: просто картинки кладешь в папочку и один файлик текстовый прикладываешь. Видео вчера не удалось записать, на другом компе (домашнем) проект ну никак не хотел работать ни тот что на гитхабе оригинальный, ни тот что я для статьи делал. Компилировался ОК, а в рантайме вываливался по ошибке "какая-то ошибка в библиотеке tensorflow.dll или зависимостях" и под NetCore и под NetFramework.
 
  • Спасибо
Реакции: Yuriy Zymlex

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 650
Благодарностей
1 318
Баллы
113
Прежде чем бросаться во все тяжкие, порекомендовал хотя бы по вершкам пройтись по основам нейросетей.:-)
Т.к. это тема достаточна обширная, и за пару вечерков сразу и не въедешь.

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

Если касательно картинок и распознавания что там, то это CNN, они тоже бывают разные.

Но еще больший интерес представляют RCNN. Такие сети не просто распознают что там, но и могут определить место где находится нужный объект.

Одна из наиболее шустрых сетей относящихся к RCNN это YOLO3. По ссылке можно посмотреть сравнительную таблицу аналогичных сетей.

Например есть такая капча как GeeTest(на скрине старый вариант, сейчас капча чутка другая), где надо жмакнуть по картинкам из задания.
Вот для этого и нужна RCNN, чтобы были координаты прямоугольника в который вписан объект распознанный нейронкой.

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

Кто хоть раз ковырялся с капмонстром, и подготавливал данные, тот уже работал с датасетом.:-)
Задача, подготовить данные, чтобы объяснить сетке, что вот тут "кошечка", а вот тут "собачка".

Чем больше данных, тем качественнее будет обучение. Больше понятие относительное, для каждого типа задачи может быть по разному.
К примеру если задача обучить сетку отличать котиков от собачек, то чем больше будет разных картинок тем лучше.
Если вернуться к тому же geetest, то там картинка каждого класса поворачивается и чутка масштабируется, но по факту одна и та же. Т.е. картинок надо собирать меньше.

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

И напоследок. Надо понимать, что работа с сетками требует серьезных вычислительных ресурсов. Опять же все зависит от сетки.
Например:
Фреймворк - darknet.
Сетка - YOLO3.
Задача - geetest.
Датасет - больше 200 классов объектов.
Обучение - gtx 1070 херачила больше 3 суток.:-)

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

На десерт. Сайт на котором куча всего интересного по сеткам. Рекомендуется к постоянному мониторингу.

Также не забываем youtube. Где тоже можно найти много интересных видосов по работе с сетками.

Взял бы и поучаствовал в конкурсе, глядишь и нас научил бы чему то новому, показал бы что и как) Спасибо за ссылки пойду почитаю что там за магия с нейронкой

Вот столько раз подходил к "теории нейросетей" столько же раз закрвыал статьи с мыслями "нет. я слишком туп/стар для всего этого".
А тут смысл в самом заголовки статьи MS:


В изначальной версии статьи (моей) были не только хотдоги. Я собирал разные датасеты, отправлял - очень сильно офигевал от того, что работает это ну прям как капмонстр. Т.е. просто картинки кладешь в папочку и один файлик текстовый прикладываешь - и она уже начинает показывать результаты.

Пробовал через ModelBuilder в VS сам обучить модель (типа глубокое обучение с нуля) на тех же датасетах - вообще ничего полученная модель не могла определить.



Собственно ответ уже выше был: просто картинки кладешь в папочку и один файлик текстовый прикладываешь. Видео вчера не удалось записать, на другом компе (домашнем) проект ну никак не хотел работать ни тот что на гитхабе оригинальный, ни тот что я для статьи делал. Компилировался ОК, а в рантайме вываливался по ошибке "какая-то ошибка в библиотеке tensorflow.dll или зависимостях" и под NetCore и под NetFramework.
Спасибо, я сам разберусь, выкину все что не нужно людям, и покажу потом нормальный вариант, как это должно работать без танцев с бубном, тут в вашей же статье расскажу что откуда и куда и без лишних телодвижений, чтоб даже новички могли пользоваться) собственно я вчера обучил ее отличать котов от собак, но пока все еще она на .NET Core осталось переделать для фреймворка, отладить все и будет то что нужно.

просто картинки кладешь в папочку и один файлик текстовый прикладываешь.
Надо чтоб файлик создавался сам, зачем все так усложнять? Надо чтоб закинул в папку 1000 картинок запустил консольку с обучением, сначала создался файлик, а потом прошло обучение, а в зенке уже просто решение. Почему народ любит так все усложнять? Либо что то не договаривать... почему? зачем? тут либо делай, рассказывай и показывай, либо вообще не делай. На C# создать массив куда будут помещаться все названия картинок, и в цикле это все запихнуть в файлик, что тут сложного? Тут не напильник и кувалда нужен, а бульдозер, который все снесет и разровняет, чтоб строить все по новой для людей...
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 369
Благодарностей
3 294
Баллы
113
Надо чтоб файлик создавался сам, зачем все так усложнять? Надо чтоб закинул в папку 1000 картинок запустил консольку с обучением, сначала создался файлик, а потом прошло обучение, а в зенке уже просто решение. Почему народ любит так все усложнять?
Как уже писал автор, статья прошла премодерацию.
 

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
823
Баллы
93
Вот столько раз подходил к "теории нейросетей" столько же раз закрвыал статьи с мыслями "нет. я слишком туп/стар для всего этого".
А где я там писал что надо углубляться?
Написано что надо пройтись по вершкам, чтобы было общее представление.

Я к примеру тоже формулы не люблю, для меня это как китайская грамота, и желания в них разбираться нет.
Но можно и без них обойтись. Есть статьи/книги где на "пальцах" объясняется теория нейросетей. И не так все страшно.
Я не говорю что прям досконально все изучить, но если интересно, можно и поковырять.
Оказывается в основе нейросеток лежат операции с матрицами. Звучит страшно, по факту ничего сверхъестественного. И по факту нейросетка это навороченная функция.
Или "градиентый спуск". Вообще походу какая то страшная штука. По факту тоже ничего особенного. С помощью него как раз и обучается сетка.
Было бы желание маленько поковыряться.

Но можно и без всего этого обойтись.
Я же писал про вершки, про общее понимание.

К примеру - "я хочу ехать на машине".
Ок. Но чтобы ехать на машине, надо хотя бы знать куда нажимать и что крутить.:-)
А также какую машину выбрать, грузовую, легковую, или может вообще карт.
И еще оказывается надо залить бенз.

Вот кто хочет поиграться с нейросетками вообще без кода. Работает только на windows 10.

Надо чтоб файлик создавался сам, зачем все так усложнять? Надо чтоб закинул в папку 1000 картинок запустил консольку с обучением, сначала создался файлик, а потом прошло обучение, а в зенке уже просто решение. Почему народ любит так все усложнять?
Да ты шустряк. :-)
Поищи инфу по датасетам, что это и с чем едят.

Есть файл с классами(категориями), в нем:
0 собака
1 кошка.

Есть папка где лежат картинки.
1.jpg //кошка
2.jpg //кошка
3.jpg //собака
4.jpg //собака
5.jpg //кошка
6.jpg //собака
7.jpg //кошка
8.jpg //собака
9.jpg //собака
10.jpg //кошка

Есть файл разметки. Т.е. категория и файл
1,1.jpg
1,2.jpg
0,3.jpg
0,4.jpg
1,5.jpg
0,6.jpg
1,7.jpg
0,18.jpg
0,9.jpg
1,10.jpg

А может быть так. категория, x, y, высота, ширина, картинка
1,10,10,40,50,1.jpg 1,20,20,40,50,1.jpg // на картинке две кошки
1,10,10,40,50,1.jpg 0,20,20,40,50,1.jpg // на картинке кошка и собака.

Если все подытожить, то есть картинки, есть файл, в котором понятно к какой категории относится та или иная картинка, есть файл с именами - нейросетка выдает 0 или 1 к примеру, а дальше по цифре берется название.

Форматы разметок конечно могут быть разные. Но суть одна. Объяснить сетке в какой картинке что находится и сложить это "объяснение" в файл. Это и есть разметка датасета.
В итоге, прежде чем обучать сетку, ты должен подготовить для нее данные, в формате который она поймет, а не так как тебе удобнее.
 

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 542
Баллы
113
К статье добавлено 2 видео
 

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 943
Благодарностей
4 335
Баллы
113
Картинки очень хорошо, но было много статей, что уже с помощью нейронок вполне можно генерить читабельные новости и тексты. Никто не пробовал?
 

evgen2208

Client
Регистрация
12.10.2016
Сообщения
130
Благодарностей
162
Баллы
43
Картинки очень хорошо, но было много статей, что уже с помощью нейронок вполне можно генерить читабельные новости и тексты. Никто не пробовал?
Я не нашел пока того, что удалось бы осмыслить. Самое подробное что видел: https://habr.com/ru/company/meanotek/blog/259355/
но там текст на выходе не очень похож на осмысленный.

Если попадались какие-то статьи типа руководств или инструкций, можешь ссылок накидать? Я вот только всякие новости читал типа "какие-то челы научили нейросеть генерировать осмысленные отзывы/комментарии итд" а такого чтоб "вот смотрите и учитесь" не находил. Тема с генерацией текстов конечно очень интересна.
 

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 943
Благодарностей
4 335
Баллы
113

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 500
Благодарностей
1 263
Баллы
113
Статья отличная, но юзать wcf - это избыточно. Обычный rest-cервис типа NancyFx хватило бы с головой
 
  • Спасибо
Реакции: evgen2208 и Yuriy Zymlex

vmc

Client
Регистрация
15.03.2015
Сообщения
72
Благодарностей
13
Баллы
8
Респектище!
И за нейросеть и за клиент-сервер!:-)
 
  • Спасибо
Реакции: evgen2208

vmc

Client
Регистрация
15.03.2015
Сообщения
72
Благодарностей
13
Баллы
8
Для связи, например, между шаблонами, советую обратить внимание на более простой MagicOnion (WCF сложен и устарел).
Он работает на основе gRPC, но не требует писать protobuf файл, так как сериализатор MessagePack.
Можете показать пример, как встроить MagicOnion в шаблон? Сервер ясно, как сделать.
А в клиенте, помимо этих строк, что ещё требуется добавить?
Пример с гитхаба:
C#:
// standard gRPC channel
var channel = new Channel("localhost", 12345, ChannelCredentials.Insecure);

// get MagicOnion dynamic client proxy
var client = MagicOnionClient.Create<IMyFirstService>(channel);

// call method.
var result = await client.SumAsync(100, 200);
Console.WriteLine("Client Received:" + result);
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 369
Благодарностей
3 294
Баллы
113
Можете показать пример, как встроить MagicOnion в шаблон? Сервер ясно, как сделать.
У меня нет под рукой именно примера на C# и тем более для PM.
Вы можете найти простые примеры в тестах самого MagicOnion.

Вот пример тестового клиента на F#:
C#:
namespace Client

open Grpc.Core
open Interfaces
open System
open MagicOnion.Client

type HubClient() =
  interface IHubReceiver

module Main =

  let pause() = Console.ReadKey(true) |> ignore

  [<EntryPoint>]
  let main _ =
    GrpcEnvironment.SetLogger(new Grpc.Core.Logging.ConsoleLogger())
    let channel = new Channel("[::1]", 50051, ChannelCredentials.Insecure)
    let client = StreamingHubClient.Connect<IHub, IHubReceiver>(channel, new HubClient(), logger = new Grpc.Core.Logging.ConsoleLogger())
    pause()
    let result = client.Test(4).GetAwaiter().GetResult()
    Console.WriteLine(result)

    pause()

    client.DisposeAsync().Wait()
    channel.ShutdownAsync().Wait()

    pause()
    0
Общая часть для сервера и клиента:
C#:
namespace Interfaces

open System.Threading.Tasks
open MagicOnion

type public IHubReceiver =
  interface
  end

type public IHub =
  inherit IStreamingHub<IHub, IHubReceiver>
  abstract Test: test1: int -> Task
Сервер:
C#:
namespace Server

open Grpc.Core
open Interfaces
open System
open System.Threading
open System.Threading.Tasks
open MagicOnion.Server
open MagicOnion.Server.Hubs

type Sample() =

  [<ThreadStatic; DefaultValue>]
  static val mutable private event: Event<string>
  static member OnEvent = Sample.event.Publish

  member this.TestMethod(): Async<unit> =

    Console.WriteLine("TestMethod запущен.")

    let counter = ref 0
    async {
      while true do
        Sample.event.Trigger("Данные " + counter.ToString())
        incr counter
        do! Async.Sleep(5000)
    }


type public Hub() =
  inherit StreamingHubBase<IHub, IHubReceiver>() with
  override this.OnConnecting() =

    Console.WriteLine("Connecting!")

    StreamingHubBase<IHub, IHubReceiver>.CompletedTask

  override this.OnDisconnected() =

    Console.WriteLine("Disconnected!")

    StreamingHubBase<IHub, IHubReceiver>.CompletedTask

  do Console.WriteLine("Hub создан!")
  //let group = this.Group.AddAsync("Test")

  interface IHub with
    member this.Test(test1: int) =
      Console.WriteLine("Test!")
      //this.Broadcast()
      Task.Run(fun () -> ())


module public Main =

  [<EntryPoint>]
  let public main _ =
    GrpcEnvironment.SetLogger(new Grpc.Core.Logging.ConsoleLogger())
    let service = MagicOnionEngine.BuildServerServiceDefinition([| typeof<Hub> |], new MagicOnionOptions(true))
    let server = new Grpc.Core.Server()
    server.Services.Add(service.ServerServiceDefinition)
    server.Ports.Add("[::1]", 50051, ServerCredentials.Insecure) |> ignore
    server.Start()


    printfn "pause"
    Console.ReadKey(true) |> ignore
    0
 
Последнее редактирование:
  • Спасибо
Реакции: vmc

Warine

Новичок
Регистрация
23.02.2021
Сообщения
5
Благодарностей
0
Баллы
1
А как Вы его под фрейворс собрали? подскажите пожалуйста
 

dobrohod

Client
Регистрация
15.10.2018
Сообщения
43
Благодарностей
5
Баллы
8
Можете показать пример, как встроить MagicOnion в шаблон? Сервер ясно, как сделать.
А в клиенте, помимо этих строк, что ещё требуется добавить?
Пример с гитхаба:
C#:
// standard gRPC channel
var channel = new Channel("localhost", 12345, ChannelCredentials.Insecure);

// get MagicOnion dynamic client proxy
var client = MagicOnionClient.Create<IMyFirstService>(channel);

// call method.
var result = await client.SumAsync(100, 200);
Console.WriteLine("Client Received:" + result);
Поделись серверной частью.
 

fri-lancer

Client
Регистрация
01.10.2013
Сообщения
409
Благодарностей
155
Баллы
43
del
 
Последнее редактирование:

fri-lancer

Client
Регистрация
01.10.2013
Сообщения
409
Благодарностей
155
Баллы
43
del
 
Последнее редактирование:

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)