ACCV2020 Procesamiento de datos de registro de competencia detallado e intercambio de resultados de referencia

Enlace del concurso:

  • Sitio web oficial de accv: https://sites.google.com/view/webfg2020
  • Sitio web del concurso: https://www.cvmart.net/race/9917/base

Descarga de datos:

Fusionar y descomprimir en Linux: cat train.tar.gz. * | Tar -zxv

1. Limpieza de datos

Conjunto de entrenamiento: 5000 categorías, 557,169 imágenes

Conjunto de prueba: 5000 categorías, 100.000 imágenes

Dado que los datos provienen de Internet, se puede considerar que se rastrean directamente desde el sitio web y todos los sufijos se cambian al jpgformato. Desde la situación real, la imagen original contiene el formato, etc. jpg、png、gif、tiff, lo que provocará un error al leer el código (Error ) O advertencia (Advertencia), por lo que primero debe limpiar los datos. Debido a que Warning no afectará el funcionamiento del programa, es necesario convertirlo en Error que puede informar errores. El código es el siguiente.

import warnings
warnings.filterwarnings('error')

Según la situación real, existen principalmente los siguientes tipos de errores

  • corrupt EXIFY Possibly corrupt EXIFesto es causado por la falta de información EXIF, simplemente filtre y elimine su encabezado 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 TransparencySe convert('RGB')lanzó cuando se llamó al PIL . Probablemente signifique el problema de conversión del canal alfa. No se ha resuelto por el momento. Primero, filtre las imágenes que no sean RGB (el número de canales no es 3), porque luego descubrió que hay más de 4 imágenes de canal, pero también imágenes individuales Diagramas de canal y de doble canal, y luego filtrar esta parte de los datos por separado e informar de los errores, encontrar que el número es pequeño y eliminarlos directamente del conjunto de datos para su procesamiento.

  • image file could not be identified because WEBP, Esto se debe a que algunos datos estaban originalmente en formato webp, la lectura de PIL es problemática y parece que solo existe en el entorno conda. Hay varias soluciones:

    • Actualizar la biblioteca PIL, 6.x, 7.x no es un problema pero generará nuevos problemas, para evitar problemas, use la versión 5.4.1
    pip install Pillow==5.4.1
    
    • Instale la biblioteca webp, actualice PIL y resuélvalo, no hay una medición real
  • No se detectaron errores desconocidos en la investigación inicial. Afortunadamente, la pantalla se utilizó para guardar el registro del historial. Solo hubo algunos errores desconocidos, que se filtraron directamente. El mensaje de error es el siguiente:

    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
    

Código completo:

Paso 1: revisa todas las imágenes y filtra las problemáticas

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()

paso 2: filtrar imágenes no convertibles

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()

paso 3: modificar y volver a probar

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. Divida el conjunto de datos

Personalmente, guarde la ruta a txt y luego cárguela en el conjunto de datos.

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. Pretratamiento

Debido a los diferentes tamaños de los datos originales, la mayoría de ellos son imágenes de alta definición. Cambiar el tamaño durante el entrenamiento llevará mucho tiempo, así que cámbielo a un tamaño pequeño y guárdelo. Image.thumbnail()Puede desempeñar un papel en el filtrado. Si hw está dentro del rango, no se redimensionará, y si lo excede, se escalará proporcionalmente. Para problemas de calidad de imagen y compresión JPG , consulte Blog 1 y Blog 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))

El tamaño del conjunto de datos es 114G antes del procesamiento y 86G después del procesamiento.

En el Tesla V100 32GB*2siguiente entorno de hardware, la línea de base de entrenamiento, un tratamiento antes de la época del tiempo de entrenamiento aproximadamente 2400 s (40 min), una época de posprocesamiento aproximadamente 1400 s (23 min), lo que reduce en gran medida el tiempo de entrenamiento, la precisión no debe tener impacto, el ajuste de la discriminación de tamaño pequeño también debe Puede ser más rápido, después de todo, el tamaño de los datos de entrenamiento es 224x224.

4.Baseline
# 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 Participation, esperando que los grandes compartan soluciones de alta puntuación.

Supongo que te gusta

Origin blog.csdn.net/u013347145/article/details/109250455
Recomendado
Clasificación