(постоянно обновляемый) репозиторий GitHub можно найти здесь.

Просто краткая предыстория этого сообщения в нескольких блогах:

Моей маме сделали пересадку почки летом 2019 года. В последующие месяцы все стало сложнее, и она почти еженедельно попадала в больницу и выписывалась из нее. В результате этих осложнений и дополнительных операций ей теперь приходится принимать множество лекарств. Постоянная установка коробки для таблеток отнимает много времени и утомляет, так как вы должны учитывать еженедельные изменения в лекарствах и обеспечивать их точное введение. Излишне говорить, что соблюдение этой системы истощает. Входит доктор Луиджи.

Доктор Луиджи - это моя попытка облегчить этот процесс для моей матери. Создав сверточную нейронную сеть, мы надеемся, что сможет легко идентифицировать рецептурные лекарства, которые попадают в ее коробочку для таблеток - бонусные баллы за возможность учитывать любые изменения в лекарствах.

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

А теперь, когда все это в порядке, давайте повеселимся с хорошим доктором!

Перво-наперво ... что нам нужно? Что ж, чтобы обучить нашу сеть работе с изображениями таблеток, нам нужны… изображения таблеток.

Соединенные штаты. Национальная медицинская библиотека (NLM) »имеет коллекцию из более чем 137 000 изображений таблеток в рамках проекта, реализация которого была прекращена еще в 2018 году. Эти изображения были разделены на более 4000 эталонных изображений таблеток и более 133 000 изображений таблеток потребительского уровня. В то время как эталонные изображения таблеток можно было легко получить в виде загружаемого zip-файла объемом 6,8 ГБ, изображения таблеток потребительского уровня - нет. Ни в малейшей степени. Эти изображения хранятся на FTP-сайте в более чем 100 папках и могут быть загружены только по одному.

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

Вышеупомянутый NLM предоставляет каталог для каждого набора изображений, поэтому мы будем использовать «Каталог изображений потребительского уровня» в наших интересах. Я сохранил каталог как файл csv (мое предпочтение). Мы импортируем наш каталог в блокнот Jupyter, чтобы посмотреть, что нам нужно.

Мы сразу видим, что у нас есть столбец «Изображение» (расположение этого конкретного файла на FTP-сайте) и столбец «Имя» (название лекарства для файла изображения, на который имеется ссылка). После того, как винтики, шестерни, колеса и штуки немного покрутились в моей голове, я вижу, что мне просто нужно создать столбец, который объединяет URL-адрес FTP (ftp://lhcftp.nlm.nih.gov/Open-Access- Datasets / Pills /) с содержимым столбца «Изображение». Давайте создадим указанный столбец и назовем его full_url:

consumer_lookup['full_url'] = [url + consumer_lookup['Image'][i] for i in range(len(consumer_lookup['Image']))]
consumer_lookup.drop(columns = ['Image'], inplace = True)
consumer_lookup.head()

Первая строка кода создает новый столбец, используя понимание списка. Обратите внимание, что в итоге я создал новый фрейм данных (consumer_lookup), чтобы случайно не скомпрометировать исходный файл. Вторая строка удаляет ненужные столбцы, а третья строка возвращает результаты наших усилий:

После этого мы сохраним наш новый фрейм данных в виде CSV-файла, чтобы использовать его (если вы следите за репозиторием GitHub) в новой записной книжке.

Теперь о новом ноутбуке / следующий шаг относительно прост - мы собираемся загрузить изображения потребительского уровня… все на 85,2 ГБ.

Итак, теперь мы знаем, почему мы не можем загружать изображения потребительского уровня в виде zip-файла, как эталонные изображения. После кратковременного экзистенциального кризиса при простой мысли о том, что ваш ноутбук обрабатывает в общей сложности более 90 ГБ изображений через нейронную сеть (или, может быть, это только я), вы собираетесь импортировать следующие библиотеки для следующих шагов: pandas , webbrowser, time (в частности, функция sleep), os и shutil. Используя pandas, мы импортируем наш CSV-файл, созданный на предыдущем шаге, как data (и это почти все, для чего вам понадобятся pandas). Теперь мы собираемся создать код, который загружает все файлы с FTP-сайта:

for url in data['full_url']:
    webbrowser.open_new(url)
    sleep(4)

Я знаю, что это очень сложно. Для каждого URL в столбце full_url мы собираемся открыть новую вкладку веб-браузера с помощью библиотеки webbrowser. Поскольку каждый URL-адрес является прямым адресом загрузки, загрузка файла начинается автоматически, а сам файл сохраняется в вашей локальной папке загрузок. Теперь sleep(4) устанавливает 4-секундный перерыв перед переходом к следующему URL-адресу, чтобы избежать проблем с сервером на стороне NLM. Если вы действительно должны загружать все "очень быстро", я бы не рекомендовал устанавливать период сна менее 1 секунды ... вы не хотите, чтобы ваш компьютер зависал и зависал. Запустив код, уйдите, возьмите отпуск, посмотрите на мир, возьмите вязание - потому что это займет немного времени.

После того, как вы состарились, создали семью и сделали успешную карьеру, все изображения потребительского уровня должны быть загружены. Теперь у нас будет возможность переместить все изображения из папки «Загрузки» в место по нашему выбору. Что касается меня, я бы переместил его туда, где находятся мои записные книжки для этого небольшого проекта:

source = 'C:\\Users\\Fausto\\Downloads\\'
destination = 'C:\\Users\\Fausto\\Documents\\github_fmanon\\Medication_Adherence_with_CNN\\images\\consumer_grade'
files = os.listdir(source)
for f in files:
        shutil.move(source + f, destination)

Итак, сначала мы создадим каталоги, из которых мы будем перемещать изображения (source), а также куда мы будем перемещать их (destination). После этого, используя os, мы можем вывести список файлов из папки Downloads (files) и реализовать цикл for, который перемещает каждый файл из папки Downloads в их место назначения.

И со всем этим мы завершили самую легкую часть этого проекта. Сбор данных, когда данные недоступны, является важной частью процесса. Какие данные вам понадобятся? Как вы собираетесь получить указанные данные? Мне повезло, так как в NLM есть много общедоступных обучающих и тестовых изображений. В следующем посте мы рассмотрим исследовательский анализ и предварительную обработку изображений, что составляет основную часть рабочей нагрузки. Этим мы гордимся д-ра Луиджи, поскольку мы переводим изображения во что-то, что нейронная сеть сможет обработать. После того, как это будет сказано и сделано, в третьем (а теперь определенно последнем) посте мы обучим, доработаем, обучим, доработаем и обучим сеть. Надеюсь, что в конце всего этого у нас будет хорошо обученная модель идентификации таблеток, которая поможет моей маме придерживаться всех своих лекарств, потому что в этом и заключается суть всего этого. Следите за обновлениями части 2 из 3 эпической трилогии сообщений в блоге.