Ленивая загрузка растровых изображений в ML.NET - PullRequest
1 голос
/ 14 апреля 2020

Все примеры, которые я нашел на ML. NET Классификация изображений использует Image Path при обучении конвейера, однако в производстве. Я хотел бы прогнозировать непосредственно из растрового изображения, поэтому я преобразовал обучающий конвейер для использования растрового изображения вместо пути. это вызывает другие проблемы, например, когда у нас есть список IEnumerable Dataset с 615 000 битмапами, загруженными в память, ну, у этого P C недостаточно RAM.

Есть ли способ создать загруженный IEnumerable с отложенной загрузкой Набор данных, содержащий растровые модели, когда конвейер подходит / обучается?

РЕДАКТИРОВАТЬ:

По предложению Jona sH я просто реализую свой собственный перечислитель для обрабатывать загрузку изображений во время выполнения. Вот реализация:

public class ImageDataCollection : IEnumerable<ImageClassificationData>
{
    private IEnumerable<string> files { get; set; }
    public Func<Bitmap, Bitmap> Handler { get; set; }

    public ImageDataCollection(IEnumerable<string> files)
    {
        this.files = files;
    }

    public IEnumerator<ImageClassificationData> GetEnumerator()
    {
        IEnumerator<string> iterator = files.GetEnumerator();
        while (iterator.MoveNext())
        {
            string data = iterator.Current;
            Bitmap image = new Bitmap(data);
            if (Handler != null)
            {
                image = Handler(image);
            }
            string[] c = data.Split(new char[] { '\\' });
            yield return new ImageClassificationData { Label = c[c.Length - 1], Image = image };
            image.Dispose();
        }
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return this.GetEnumerator();
    }
}

Это РАБОТАЕТ однако я хотел бы видеть его как метод расширения некоторого вида в ML. NET, если это было возможно, или в наименее документированный, поскольку это НЕ было ясно, в конце концов, DEEP Learning использует ОЗУ МНОГО: P ..

1 Ответ

1 голос
/ 14 апреля 2020

Операторы Linq лениво оцениваются. Поэтому, если у вас есть список путей и вы загружаете растровые изображения с помощью оператора select, они должны загружаться лениво, если конвейер не объединяет IEnumerable с .ToList () или подобным.

Однако растровые изображения используют неуправляемую память для хранения и должны быть утилизированы, если вы не хотите полагаться на финализатор для освобождения памяти. Возможно, вы могли бы использовать блок итератора , который выдает растровое изображение и затем удаляет его, но это может не сработать, если инфраструктура сохраняет ссылку между итерациями, как, например, в параллельном l oop.

...