Pizza al-semi-beaufsichtigt

    In diesem Artikel möchte ich Ihnen einige Techniken zum Arbeiten mit Daten beim Unterrichten eines Modells vorstellen. Insbesondere, wie die Segmentierung von Objekten auf den Boxen gestreckt wird, wie das Modell trainiert und die Auszeichnung des Datensatzes erhalten wird, nachdem nur wenige Proben markiert wurden.


    Aufgabe


    Es gibt einen bestimmten Prozess zum Kochen von Pizza und Fotos aus den verschiedenen Phasen (darunter nicht nur Pizza). Es ist bekannt, dass, wenn das Teigrezept verdorben wird, weiße Beulen auf dem Kuchen entstehen. Es gibt auch eine binäre Auszeichnung der Teigqualität jeder von Experten hergestellten Pizza. Es ist notwendig, einen Algorithmus zu entwickeln, der die Qualität des Tests auf dem Foto bestimmt.

    Das Datensatz besteht aus Fotos, die von verschiedenen Telefonen unter verschiedenen Bedingungen und unterschiedlichen Blickwinkeln aufgenommen wurden. Kopien von Pizza - 17k. Gesamtzahl der Fotos - 60.000

    Die Aufgabe ist meiner Meinung nach typisch und gut geeignet, um unterschiedliche Ansätze für den Umgang mit Daten aufzuzeigen. Um das Problem zu lösen, müssen Sie:

    1. Fotos auswählen, auf denen sich ein Pizza-Shortbread befindet;
    2. Auf den ausgewählten Fotos den Kuchen markieren;
    3. Trainieren Sie das neuronale Netzwerk in den ausgewählten Bereichen.

    Fotofilterung


    Auf den ersten Blick scheint es am einfachsten zu sein, diese Aufgabe den Markern zu geben und dann mit sauberen Daten zu trainieren. Ich entschied jedoch, dass es einfacher für mich wäre, einen kleinen Teil selbst zu markieren, als mit einem Marker zu erklären, welcher Winkel der richtige ist. Außerdem hatte ich kein hartes Kriterium für den richtigen Winkel.

    Daher habe ich Folgendes getan:

    1. Markiere 100 Bilder der Kante;



    2. Ich zählte Merkmale nach einem globalen Abzug aus dem resnet-152-Raster mit Gewichten von imagenet11k_places365;



    3. Ich nahm den Durchschnitt der Merkmale jeder Klasse und erhielt zwei Anker.

    4. Ich habe die Entfernung von jedem Anker zu allen Merkmalen der restlichen 50.000 Fotos berechnet.

    5. Top 300 in der Nähe eines Ankers sind relevant für die positive Klasse, Top 500 am nächsten Anker - negative Klasse;



    6. In diesen Beispielen habe ich LightGBM mit den gleichen Funktionen unterrichtet (XGboost ist im Bild dargestellt, da es ein Logo hat und besser erkennbar ist, LightGBM jedoch kein Logo).

    7. Mit Hilfe dieses Modells habe ich die Markierung des gesamten Datensatzes erhalten.



    Etwa derselbe Ansatz, den ich in Kaggle-Wettbewerben als Basis verwendet habe .

    Die Erklärung an den Fingern, warum dieser Ansatz überhaupt funktioniert
    Нейросеть можно воспринимать как сильно нелинейное преобразование картинки. В случае классификации картинка преобразуется в вероятности классов, которые были в обучающей выборке. И эти вероятности по сути можно использовать как фичи для Light GBM. Однако это достатоно бедное описание и в случае пиццы мы будет таким образом говорить, что класс коржика это условно 0.3 кошки и 0.7 собаки, а треш это все остальное. Вместо этого можно использовать менее разреженные фичи, после Global Average Pooling. Они обладают таким свойством, что из сэмплов обучающей выборки генерият фичи, которые должны разделяться линейным преобразованием (полносвязным слоем с Softmax'ом). Однако из-за того, что в трейне imagenet'a не было пиццы в явном виде, то чтобы разделить классы новой обучающей выборки, лучше взять нелинейное преобразование в виде деревьев. В принципе, можно пойти еще дальше и взять фичи из каких-то промежуточных слоев нейросети. Они будут лучше в том, что не еще не потеряли локальность объектов. Но они сильно хуже из-за размера вектора фичей. И кроме того менее линейны, чем перед полносвязным слоем.

    Kleiner lyrischer Exkurs


    In ODS klagte kürzlich, dass niemand über ihre Fehler schreibt. Die Situation korrigieren. Vor etwa einem Jahr nahm ich mit Yevgeny Nizhibitsky am Kaggle Sea Lions- Wettbewerb teil . Die Aufgabe bestand darin, die Pelzrobben in den Bildern der Drohne zu berechnen. Der Aufschlag wurde einfach in Form der Koordinaten der Schlachtkörper gegeben, aber irgendwann hat Vladimir Iglovikov sie mit Kästchen markiert und dies großzügig mit der Gemeinde geteilt. Zu dieser Zeit hielt ich mich für den Vater der semantischen Segmentierung (nach Kaggle Dstl ) und entschied, dass Unet die Aufgabe des Zählens erheblich erleichtern würde, wenn ich lerne, die Siegel kühl zu unterscheiden.

    Erklärung der semantischen Segmentierung
    Семантическая сегментация это по сути попиксельная классификация картинки. То есть каждому исходному пикселю картинки нужно поставить в соответствие класс. В случае бинарной сегментации (случай статьи), это будет либо положительный, либо отрицательный класс. В случае многоклассовой сегментации, каждому пикселю вставится в соответствие класс из обучающей выборки (фон, трава, котик, человек и т.д.). В случае бинарной сегментации в то время хорошо себя зарекомендовала архитектура нейросети U-net. Эта нейросеть по структуре похожая на обычный энкодер-декодер, но с пробросами фичей из энкодер-части в декодер на соответствующих по размеру стадиях.



    В ванильном виде, правда, ее никто уже не использует, а как минимум добавляют Batch Norm. Ну и как правило берут жирный энкодер и раздувают декодер. Еще на смену U-net-like архектурам сейчас пришли новомодные FPN сегментационные сетки, которые показывают хороший перфоманс на некоторых задачах. Однако Unet-like архитектуры и по сей день не потеряли актуальность. Они хорошо работают как бейзлайн, их легко обучать и очень просто варьировать глубину / размер нейрости меняя разные экнкодеры.

    Dementsprechend fing ich an, Segmentierung zu lehren, wobei als Ziel in der ersten Stufe nur Kastensiegelungen verwendet wurden. Nach der ersten Phase des Trainings habe ich den Zug vorhergesagt und gesehen, wie die Vorhersagen aussehen. Mit Hilfe von Heuristiken konnte aus einer abstrakten Konfidenzmaske (Vertrauen der Vorhersagen) ausgewählt und die Vorhersagen bedingt in zwei Gruppen aufgeteilt werden: Wo alles gut ist und wo alles schlecht ist.



    Vorhersagen, bei denen alles gut ist, könnten verwendet werden, um die nächste Iteration des Modells zu trainieren. Vorhersagen, wo alles schlecht ist, konnte man mit großen Flächen ohne Siegel wählen, die Masken manuell maskieren und auch in den Zug versenken. Und so lernten wir gemeinsam mit Eugene ein Modell, das gelernt hat, die Seelöwen-Seehunde sogar für große Personen zu segmentieren.



    Aber es war ein wilder Fayl: Wir haben viel Zeit damit verbracht, zu lernen, wie man die Siegel abrupt aufteilt und ... Es half fast nicht bei ihrer Berechnung. Die Annahme, dass die Dichte der Siegel (die Anzahl der Individuen pro Flächeneinheit der Maske) konstant ist, hat nicht funktioniert, da die Drohne auf verschiedenen Höhen flog und die Bilder einen unterschiedlichen Maßstab hatten. Und zur gleichen Zeit wurden bei der Segmentierung einzelne Personen immer noch nicht herausgegriffen, wenn sie eng liegend waren - was häufig vorkam. Und vor dem innovativen Ansatz der Objektaufteilung des Tocoder-Teams auf der DSB2018 gab es noch ein Jahr. Als Ergebnis blieben wir am gebrochenen Trog und belegten den 40. Platz von 600 Teams.

    Ich habe jedoch zwei Schlussfolgerungen gezogen: Die semantische Segmentierung ist ein bequemer Ansatz, um die Funktionsweise des Algorithmus zu visualisieren und zu analysieren, und Sie können Masken mit etwas Aufwand aus der Box schweißen.

    Aber zurück zur Pizza. Um einen Kuchen in den ausgewählten und gefilterten Fotos auszuwählen, besteht die beste Option darin, die Aufgabe den Markern zu erteilen. Zu diesem Zeitpunkt hatten wir bereits die Boxen und den Konsensus-Algorithmus für sie implementiert. Also habe ich nur ein paar Beispiele geworfen und auf das Markup gesetzt. Am Ende bekam ich 500 Proben mit genau ausgewählten Bereichen des Kuchens.



    Dann zog ich meinen Code aus den Siegeln heraus und näherte mich formell dem aktuellen Verfahren an. Nach der ersten Iteration des Trainings war es genauso gut zu sehen, wo das Modell fehlerhaft ist. Und das Vertrauen der Vorhersagen kann definiert werden als:
    1 - (Fläche der grauen Fläche) / (Fläche der Maske) # Es wird eine Formel geben, versprochen.



    Um nun die Boxen auf den Masken zu spannen, wird ein kleines Ensemble eines Zuges mit einer TTA vorausgesagt. Die WAAAAGH-Wissensdestillation kann bis zu einem gewissen Grad betrachtet werden, es ist jedoch richtiger, sie als Pseudo-Kennzeichnung zu bezeichnen.



    Als Nächstes müssen Sie mit Ihren Augen eine bestimmte Vertrauensschwelle wählen, von der aus wir einen neuen Zug bilden. Optional können Sie auch die schwierigsten Samples markieren, bei denen das Ensemble versagt hat. Ich entschied, dass es nützlich sein würde, und malte ungefähr 20 Bilder, während ich das Abendessen verdaute.



    Und nun der letzte Teil der Pipeline: Lernen des Modells. Zur Vorbereitung der Proben extrahierte ich die Fläche des Kuchens auf der Maske. Ich habe auch die Maske ein wenig aufgefächert und sie auf das Bild angewendet, um den Hintergrund zu entfernen, da es keine Informationen über die Qualität des Tests geben sollte. Und dann habe ich einige Modelle aus dem Imagenet Zoo nachgefüllt. Insgesamt konnte ich ungefähr 12.000 zuversichtliche Proben sammeln. Daher habe ich nicht das gesamte neuronale Netzwerk gelehrt, sondern nur die letzte Gruppe von Windungen, damit das Modell nicht umschulte.

    Warum müssen Sie Ebenen einfrieren
    От этого есть два профита: 1. Сеть обучается быстрее, поскольку не нужно считать градиенты для замороженных слоев. 2. Сеть не переобучается, поскольку у нее теперь меньше свободных параметров. При этом утверждается, что первые несколько групп сверток в ходе обучения на Imagenet генерят достаточно общие признаки типа резких цветовых переходов и текстур, которые подходят для очень широкого класса объектов на фотографии. А это значит, что их можно не обучать в ходе Transer Learning'a.



    Inception-Resnet-v2 erwies sich als das beste Einzelmodell, und die ROC-AUC lag auf einer Stelle bei 0,700. Wenn Sie nichts auswählen und rohe Bilder unverändert laden, wird der ROC-AUC-Wert 0,58 sein. Während ich eine Lösung entwickelte, kochte DODO Pizza den nächsten Datenstapel, und es war möglich, die gesamte Pipeline an einem ehrlichen Holdout zu testen. Wir haben die gesamte Pipeline darauf überprüft und einen ROC-AUC von 0,83 erhalten.

    Sehen wir uns nun die Fehler an:

    Top False Negative



    Hier sehen Sie, dass sie mit dem Error-Markup-Shortcake verknüpft sind, da es deutliche Anzeichen für einen fehlerhaften Test gibt.

    Top False Positive



    Hier sind die Fehler auf die Tatsache zurückzuführen, dass das erste Modell einen nicht sehr guten Winkel ausgewählt hat, der die Schlüsselmerkmale der Testqualität schwer zu finden ist.

    Fazit


    Manchmal ärgern mich Kollegen, dass ich viele Probleme durch die Segmentierung mit Unet löse. Meiner Meinung nach ist dies jedoch ein sehr leistungsfähiger und praktischer Ansatz. Damit können Sie Modellfehler und die Zuverlässigkeit ihrer Vorhersagen visualisieren. Darüber hinaus sieht die gesamte Pipeline sehr einfach aus und jetzt gibt es viele Repositories für jedes Framework.

    Jetzt auch beliebt: