Ссылка на конкурс:
- Официальный сайт accv: https://sites.google.com/view/webfg2020
- Сайт конкурса: https://www.cvmart.net/race/9917/base
Загрузка данных:
- Облачный диск Baidu / Baidu:
Ссылка: https://pan.baidu.com/s/1P0rpg0J34IUL5bvuA5f-pg
Код извлечения: cg9z- Google / Google Cloud Disk
https://drive.google.com/drive/folders/1ruvJow2Srp3wuqG1sYd_unG1EHBxYvI-?usp=sharing
Слить и распаковать под Linux: cat train.tar.gz. * | Tar -zxv
1. Очистка данных
Учебный набор: 5000 категорий, 557169 картинок
Набор тестов: 5000 категорий, 100000 изображений.
Поскольку данные поступают из Интернета, это можно рассматривать как сканирование непосредственно с веб-сайта, и все суффиксы меняются на jpg
формат. Исходя из реальной ситуации, исходное изображение содержит формат и так jpg、png、gif、tiff
далее, что приведет к ошибке при чтении кода (Ошибка ) Или предупреждение (Предупреждение), поэтому вам нужно сначала очистить данные. Предупреждение, поскольку это не повлияет на работу программы, его необходимо преобразовать в ошибку, которая может сообщать об ошибке.Код следующий.
import warnings
warnings.filterwarnings('error')
Исходя из реальной ситуации, в основном бывают следующие типы ошибок
-
corrupt EXIF
ИPossibly corrupt EXIF
это вызвано отсутствием информации EXIF, просто отфильтруйте ее и удалите заголовок EXIF.# Refer: https://blog.csdn.net/a19990412/article/details/105940446 # pip install piexif -i https://pypi.tuna.tsinghua.edu.cn/simple/ import piexif piexif.remove(img_path)
-
Palette images with Transparency
Он былconvert('RGB')
брошен, когда был вызван PIL . Вероятно, это означает проблему преобразования альфа-канала. На данный момент он не был решен. Во-первых, отфильтруйте изображения без RGB (количество каналов не 3), потому что позже выяснилось, что есть более 4-х канальных изображений, но также и одиночные Канальные и двухканальные диаграммы, а затем отфильтруйте эту часть данных отдельно и сообщайте об ошибках, обнаруживая, что их мало, и напрямую удаляйте их из набора данных. -
image file could not be identified because WEBP
, Это связано с тем, что некоторые данные изначально были в формате webp, чтение PIL проблематично и, похоже, существует только в среде conda. Существует несколько решений:- Обновление библиотеки PIL, 6.x, 7.x не проблема, но вызовет новые проблемы, во избежание проблем используйте версию 5.4.1
pip install Pillow==5.4.1
- Установите библиотеку webp, обновите PIL и решите ее, фактического измерения нет
-
Неизвестные ошибки не были обнаружены при первоначальном исследовании. К счастью, экран был использован для сохранения журнала истории. Было только несколько неизвестных ошибок, которые были напрямую отфильтрованы. Сообщение об ошибке выглядит следующим образом:
Image size (117762898 pixels) exceeds limit of 89478485 pixels Metadata Warning, tag 296 had too many entries Image appears to be a malformed MPO file
Полный код:
Шаг 1: Просмотрите все картинки и отфильтруйте проблемные.
import os
from PIL import Image
import cv2
import warnings
warnings.filterwarnings('error')
root = './train'
f1 = open('pExifError.txt', 'w')
f2 = open('rgbaError.txt', 'w')
f3 = open('ExifError.txt', 'w')
f4 = open('4chImg.txt', 'w')
f5 = open('WebpError.txt', 'w')
f6 = open('UnknownError.txt', 'w')
idx = 0
for r, d, files in os.walk(root):
if files != []:
for i in files:
fp = os.path.join(r, i)
try:
img = Image.open(fp)
if(len(img.split()) != 3):
# print('4CH:', fp)
f4.write('{}\n'.format(fp))
except Exception as e:
print('Error:', str(e))
print(fp)
if 'Possibly corrupt EXIF data' in str(e):
print('Exif error')
f1.write('{}\n'.format(fp))
elif 'Palette images with Transparency' in str(e):
print('rgba error')
f2.write('{}\n'.format(fp))
elif 'Corrupt EXIF data' in str(e):
print('pExif error')
f3.write('{}\n'.format(fp))
elif 'image file could not be identified because WEBP' in str(e):
print('Webp error')
f5.write('{}\n'.format(fp))
else:
print('Unknown error')
f6.write('{}\n'.format(fp))
if idx % 5000 == 0:
print('='*20, idx)
idx += 1
f1.close()
f2.close()
f3.close()
f4.close()
f5.close()
f6.close()
Шаг 2: фильтрация неконвертируемых изображений
import warnings
from PIL import Image
warnings.filterwarnings('error')
f1 = open('rgbaError.txt', 'w')
f2 = open('rgbaOK.txt', 'w')
with open('4chImg.txt', 'r')as f:
for i in f.readlines():
i = i.strip()
try:
img = Image.open(i).convert('RGB')
f2.write('{}\n'.format(i))
except Exception as e:
print('Error:', str(e))
print(i)
f1.write('{}\n'.format(i))
f1.close()
f2.close()
Шаг 3: изменить и повторно протестировать
import os
import piexif
import warnings
from PIL import Image
warnings.filterwarnings('error')
files = ['ExifError.txt', 'pExifError.txt']
for file in files:
with open(file, 'r')as f:
for i in f.readlines():
i = i.strip()
print(i.strip())
piexif.remove(i.strip())
# try:
# img = Image.open(i)
# except Exception as e:
# print('Error:', str(e))
# print(i)
2. Разделите набор данных
Лично сохраните путь к txt, а затем загрузите его в набор данных.
from sklearn.model_selection import train_test_split
import os
if __name__ == '__main__':
root = './train'
fpath = []
labels = []
for d in os.listdir(root):
fd = os.path.join(root, d)
label = int(d)
for i in os.listdir(fd):
fp = os.path.join(fd, i)
fpath.append(fp)
labels.append(label)
print(len(fpath), len(labels))
x_train, x_val, y_train, y_val = train_test_split(fpath, labels, random_state=999, test_size=0.2)
print(len(x_train), len(x_val))
with open('train.txt', 'w')as f:
for fn, l in zip(x_train, y_train):
f.write('{},{}\n'.format(fn, l))
with open('val.txt', 'w')as f:
for fn, l in zip(x_val, y_val):
f.write('{},{}\n'.format(fn, l))
3. Предварительная обработка
Из-за разного размера исходных данных большинство из них представляют собой изображения высокой четкости. Изменение размера во время обучения займет много времени, поэтому уменьшите его до небольшого размера и сохраните. Image.thumbnail()
Он может играть роль в фильтрации. Если hw находится в пределах диапазона, его размер не будет изменен, а если он превышает его, он будет масштабироваться пропорционально. По вопросам качества изображения и сжатия JPG обращайтесь к блогам 1 и 2 .
import os
from PIL import Image
import cv2
import shutil
root = './train'
save_path = './thumbnail'
for r, d, files in os.walk(root):
if files != []:
for i in files:
fp = os.path.join(r, i)
label = i.split('_')[0]
dst = os.path.join(save_path, label)
if not os.path.exists(dst):
os.makedirs(dst)
img = Image.open(fp).convert('RGB')
w, h = img.size
if max(w, h) > 1080:
img.thumbnail((1080, 1080), Image.ANTIALIAS)
img.save(os.path.join(dst, i), quality=95, subsampling=0)
else:
shutil.copy(fp, os.path.join(dst, i))
Размер набора данных составляет 114 ГБ до обработки и 86 ГБ после обработки.
В Tesla V100 32GB*2
следующей аппаратной среде, базовый уровень обучения, время обработки до эпохи обучения около 2400 с (40 минут), эпоха постобработки около 1400 с (23 минут), что значительно сокращает время обучения, точность не должна влиять, регулировка дискриминации малого размера также должна Это может быть быстрее, ведь размер обучающих данных 224x224.
4. базовый уровень
# ls: labelsmooth
# cat: cat(gmp, gap)
{
model: resnet50,
pool: cat,
init_lr: 0.01,
schedule: cos(warm: 5),
epochs: <60,
loss: ls 0.2,
result: 41.497
}
{
model: resnext50,
pool: cat,
init_lr: 0.01,
shcedule: step(step: 8, gamma: 0.5),
epochs: 60,
loss: ls 0.2,
result: 42.748
}
_ (: з 」∠) _Buddha Участие, ждем, когда большие парни поделятся своими решениями.