Compressão de Imagem para Melhorar Computer Vision
By Brenner Cruvinel • 37 minutes read
using image compression to improve computer vision, part 1
clipping de referencia. Kaleigh Mentzer, Granica, 4 de novembro de 2023, fonte https://www.granica.ai/blog/using-image-compression-to-improve-computer-vision-part-1 . a tese que importa pro dermML: imagem de treino comprime ate niveis altos sem perda de acuracia, porque o modelo ignora a informacao de alta frequencia que a compressao joga fora. a parte 2 esta em [[image-compression-improve-cv-part-2]].
a serie
multi-part series sobre como time de ML pode usar compressao com perda pra melhorar modelo de computer vision. a parte 1 mostra que imagem de treino pode ser comprimida pra reduzir storage sem sacrificar performance. a parte 2 mostra como o espaco liberado acomoda dado de treino adicional comprimido, melhorando performance dentro de orcamento fixo.
o problema de storage
modelo de computer vision state-of-the-art demanda muito dado de imagem, o que cria requisito de storage caro. muito time de ML enfrenta restricao implicita de storage que resulta em ate 70% do dado novo sendo arquivado ou deletado.
fundamentos de compressao
lossless vs lossy: a lossless permite reconstrucao exata mas tipicamente alcanca so ~50% de reducao pra imagem fotografica. a lossy permite degradacao perceptual sem afetar a performance do modelo, com potencial de comprimir a imagem ate poucos pontos percentuais do tamanho original.
distancia de Butteraugli: a metrica de distancia de Butteraugli mede a mudanca de qualidade percebida. JPEG XL e codec moderno similar permitem comprimir ate uma distancia de Butteraugli especificada minimizando o tamanho do arquivo.
data compression rate (DCR): DCR = 1 - (compressed size / uncompressed size). DCR maior indica arquivo menor. o teste mostra que o DCR cresce rapido conforme a distancia de Butteraugli aumenta.
resultados experimentais
classificacao de imagem
dataset Food101 (75.750 train, 25.250 test, 101 categorias de comida). modelo testado: Vision Transformer (ViT) pre-treinado em ImageNet, SwAV features com ResNet-50. achado: a compressao tem impacto minimo na acuracia ate exceder ~70% de taxa de compressao. o modelo e mais sensivel a compressao do test set do que a do dado de treino.
object detection
dataset PASCAL VOC 2012 (5.717 imagens de treino, 20 classes de objeto). modelo Faster R-CNN com backbone ResNet-50. metrica mean average precision (mAP). resultado: o nivel de compressao do test set determina a acuracia, a compressao do training set tem impacto minimo.
semantic segmentation
dataset Cityscapes (5.000 imagens com anotacao semantica). modelo Segformer com encoder ImageNet pre-treinado. metrica mean intersection over union (mIoU) e mean accuracy (mAcc). achado-chave: modelo pode ser treinado em dado comprimido em 97%, requerendo so 3% do storage original de treino, sem degradacao significativa nessa metrica.
por que a compressao tem impacto limitado
a compressao com perda descarta a informacao perceptualmente menos importante primeiro, tipicamente cor e componente de alta frequencia. o modelo de ML talvez tambem nao dependa muito dessa informacao.
arquitetura JPEG/JPEG XL, os dois formatos: 1. convertem RGB pra YCbCr, 2. downsample do canal de chrominancia (humano e ~3x menos sensivel a cor que a luminancia), 3. dividem a imagem em bloco de 8x8 pixels, 4. aplicam discrete cosine transform (DCT) pra decompor o componente de frequencia, 5. quantizam agressivamente o coeficiente de alta frequencia preservando a precisao do de baixa frequencia.
analise de sensibilidade do modelo: teste com perturbacao de um unico coeficiente DCT em 32 imagens do Food101 mostrou que o modelo e significativamente menos sensivel a mudanca de alta frequencia. isso e evidencia de que o artefato de compressao afeta minimamente a predicao porque o modelo nao depende da informacao de alta frequencia descartada.
conclusao
imagem de treino pode ser comprimida substancialmente sem perda de acuracia relevante em varias tarefas de computer vision. o modelo demonstra robustez ao artefato de compressao, provavelmente porque ignora a informacao de alta frequencia que a compressao remove. tarefa diferente pode exigir nivel de compressao diferente conforme o requisito de acuracia, mas comprimir alem de PNG/JPEG oferece economia de storage significativa com impacto minimo na performance.
using image compression to improve computer vision, part 2
clipping de referencia. Granica, fonte https://www.granica.ai/blog/using-image-compression-to-improve-computer-vision-part-2 . continuacao de [[image-compression-improve-cv-part-1]]. o resultado que importa: mais imagem mesmo que mais comprimida melhora o modelo em mais de 10 pontos de acuracia, sem aumentar o custo de storage, quando o modelo opera em regime de dado escasso.
a oportunidade
empresa costuma operar com orcamento fixo de cloud storage pro dado de treino. enquanto a operacao gera dado novo em volume, a restricao de orcamento forca a deletar dataset potencialmente valioso. a compressao de imagem permite reter mais dado de treino dentro do mesmo storage: quanto maior o nivel de compressao, mais imagem adicional cabe.
o experimento
usa o dataset Food101, 101 tipos de comida pra classificacao. testaram seis niveis de compressao JPEG XL, medindo a compressao por distancia de Butteraugli (0, 2, 4, 6, 8 e 10), onde distancia maior indica mais perda de qualidade.
com orcamento de 0.5 GB de storage:
- formato JPEG original: 9.985 imagens cabem no orcamento
- na distancia de Butteraugli 10: aproximadamente 5.6 vezes mais imagem cabe
a analise mostra que mais compressao permite caber substancialmente mais amostra de treino dentro da mesma restricao de storage.
o resultado
testando um Vision Transformer pre-treinado em ImageNet-21k e fine-tuned em subconjuntos do Food101, ter mais imagem, mesmo que mais comprimida com perda, melhora a performance do modelo.
achado-chave: a acuracia do modelo melhorou mais de 10 pontos percentuais sem aumentar o custo de storage. pra esse modelo operando em regime de dado limitado, com menos de 100 imagens por classe, a quantidade provou ser mais valiosa que a qualidade da imagem.
implicacoes
conforme o modelo de ML cresce e demanda mais dado de treino pra performance otima, a compressao com perda apresenta uma solucao pratica. o time pode expandir o dataset de treino e potencialmente fazer deploy de modelo mais sofisticado sem cloud storage adicional ou aumento de orcamento.
a analise enfatiza que modelo diferente exibe padrao de scaling diferente. o sucesso depende de entender se um modelo especifico opera numa situacao de dado escasso onde amostra adicional gera melhora relevante.
datasets de dermatologia, recuperacao e download
guia de download pra recriar o ambiente completo. o sistema ja suporta busca por similaridade mas os datasets foram perdidos (SSD NVMe). esta nota lista os principais datasets com comando de download e prioridade. o inventario completo do mundo esta em [[dermML-master-dataset-catalog]].
ja indexados (arquivo perdido)
HAM10000, Harvard Dataverse. indexado, arquivo perdido. 10.015 imagens (~5GB), dermoscopia, 7 tipos de lesao pigmentada.
# oficial: https://dataverse.harvard.edu/dataset.xhtml?persistentId=doi:10.7910/DVN/DBW86T
cd ~/dermML-models/datasets/ham10000
wget https://isic-challenge-data.s3.amazonaws.com/2018/ISIC2018_Task3_Training_Input.zip
unzip ISIC2018_Task3_Training_Input.zipdiagnostico: melanoma (1113), melanocytic nevus (6705), basal cell carcinoma (514), actinic keratosis (327), benign keratosis (1099), dermatofibroma (115), vascular lesion (142).
BCN20000, Barcelona Dermatology Dataset. indexado, arquivo perdido. 25.331 imagens (~12GB), dermoscopia, 8 categorias.
# requer solicitacao: https://challenge2019.isic-archive.com/
# ou ISIC Archive: https://www.isic-archive.com/
cd ~/dermML-models/datasets/bcn20000SCIN, Skin Cancer Image Network. indexado, arquivo perdido. 10.379 imagens (~3GB), fotografia clinica, multiplas condicoes.
# requer registro: https://www.isic-archive.com/
cd ~/dermML-models/datasets/scindatasets a adicionar
ISIC 2024 Challenge. 400.000+ imagens, dermoscopia mais clinica. acesso https://challenge2024.isic-archive.com/ .
mkdir -p ~/dermML-models/datasets/isic2024
cd ~/dermML-models/datasets/isic2024
# download via ISIC API ou KaggleISIC 2020 Challenge. 33.126 imagens, dermoscopia, melanoma 584 casos.
mkdir -p ~/dermML-models/datasets/isic2020
cd ~/dermML-models/datasets/isic2020
kaggle competitions download -c siim-isic-melanoma-classificationISIC 2019 Challenge. 25.331 imagens, dermoscopia, 8 classes.
mkdir -p ~/dermML-models/datasets/isic2019
cd ~/dermML-models/datasets/isic2019
kaggle competitions download -c isic-2019ISIC 2018 Challenge. 10.015 imagens (HAM10000), dermoscopia, 7 classes. ja temos como HAM10000.
Fitzpatrick17k. 16.577 imagens (~2GB), fotografia clinica, fototipo I-VI, 114 condicoes.
mkdir -p ~/dermML-models/datasets/fitzpatrick17k
cd ~/dermML-models/datasets/fitzpatrick17k
# GitHub: https://github.com/mattgroh/fitzpatrick17k
git clone https://github.com/mattgroh/fitzpatrick17k.git
cd fitzpatrick17k
python download_images.py
# ou baixar direto (se disponivel):
# wget https://vault.sfu.ca/index.php/s/cMuxZNzk6UUHNmX (arquivo do paper DermSynth3D)metadado: CSV com URL, diagnostico, fototipo Fitzpatrick.
PAD-UFES-20. 2.298 imagens (~500MB), fotografia clinica com smartphone, 6 doencas. metadado clinico completo (idade, regiao, historico).
mkdir -p ~/dermML-models/datasets/pad-ufes-20
cd ~/dermML-models/datasets/pad-ufes-20
kaggle datasets download -d mahdavi1202/skin-cancer
unzip skin-cancer.zip
# ou direto: https://data.mendeley.com/datasets/zr7vgbcyr2/1classes: Basal Cell Carcinoma (BCC), Squamous Cell Carcinoma (SCC), Actinic Keratosis (ACK), Seborrheic Keratosis (SEK), Bowen’s Disease (BOD), Melanoma (MEL).
Derm7pt. 2.000+ imagens, dermoscopia, anotacao 7-point checklist pra melanoma.
mkdir -p ~/dermML-models/datasets/derm7pt
cd ~/dermML-models/datasets/derm7pt
# requer registro: http://derm.cs.sfu.ca/7-point checklist: 1. atypical pigment network, 2. blue-whitish veil, 3. atypical vascular pattern, 4. irregular streaks, 5. irregular dots/globules, 6. irregular blotches, 7. regression structures.
PH2, Pedro Hispano Hospital. 200 imagens (~50MB), dermoscopia, segmentacao manual por dermatologista.
mkdir -p ~/dermML-models/datasets/ph2
cd ~/dermML-models/datasets/ph2
# oficial: https://www.fc.up.pt/addi/ph2%20database.html
wget https://www.dropbox.com/s/k88qukc20ljnbuo/PH2Dataset.rar
unrar x PH2Dataset.rarclasses: common nevus (80), atypical nevus (80), melanoma (40).
DermoFit Image Library. 1.300 imagens, fotografia clinica de alta qualidade, 10 classes.
mkdir -p ~/dermML-models/datasets/dermofit
cd ~/dermML-models/datasets/dermofit
# requer licenca paga: https://licensing.edinburgh-innovations.ed.ac.uk/product/dermofit-image-library
# ~500 GBP pra licenca academica perpetuaclasses: Actinic Keratosis, Basal Cell Carcinoma, Melanocytic Nevus, Squamous Cell Carcinoma, Seborrhoeic Keratosis, Intraepithelial Carcinoma, Pyogenic Granuloma, Haemangioma, Dermatofibroma, Melanoma.
DDI, Diverse Dermatology Images. 656 imagens, fotografia clinica, foco em tom de pele diverso.
mkdir -p ~/dermML-models/datasets/ddi
cd ~/dermML-models/datasets/ddi
# GitHub: https://github.com/ddrestrepo/diverse-dermatology-images
git clone https://github.com/ddrestrepo/diverse-dermatology-images.gitFUSeg, Foot Ulcer Segmentation. 1.210 imagens, fotografia clinica de ulcera, segmentacao pixel-wise.
mkdir -p ~/dermML-models/datasets/fuseg
cd ~/dermML-models/datasets/fuseg
# GitHub: https://github.com/uwm-bigdata/wound-segmentation
git clone https://github.com/uwm-bigdata/wound-segmentation.git
cp -r wound-segmentation/data/Foot\ Ulcer\ Segmentation\ Challenge/* .
# ou mirror: https://vault.sfu.ca/index.php/s/2mb8kZg8wOltptTPratheepan, Skin Detection. 78 imagens, fotografia clinica (face), segmentacao de pele vs background.
mkdir -p ~/dermML-models/datasets/pratheepan
cd ~/dermML-models/datasets/pratheepan
# website: https://web.fsktm.um.edu.my/~cschan/downloads_skin_dataset.html
# Google Drive link na paginaSD-198 e SD-260. 6.584 imagens (198 classes) mais 40.000+ (260 classes), crawled da web, fonte DermNet, Dermis.net, DermQuest.
mkdir -p ~/dermML-models/datasets/sd-{198,260}
cd ~/dermML-models/datasets
# paper: https://arxiv.org/abs/1911.08716
# requer contato com autoresDermNet NZ. 23.000+ imagens, fotografia clinica educacional, 600+ condicoes.
mkdir -p ~/dermML-models/datasets/dermnet
cd ~/dermML-models/datasets/dermnet
# Kaggle (subset):
kaggle datasets download -d shubhamgoel27/dermnet
unzip dermnet.zipdatasets sinteticos
DermSynth3D. ~52.000 imagens sinteticas (~15GB), renderizacao 3D com anotacao rica (segmentacao, depth, anatomia, bbox). ja documentado em DERMSYNTH3D_SETUP.md.
mkdir -p ~/dermML-models/datasets/dermsynth3d
cd ~/dermML-models/datasets/dermsynth3d
# requer solicitacao: https://cvi2.uni.lu/3dbodytexdermsynth/3DBodyTex.v1. ~50GB, scan 3D texturizado de corpo humano, base pro DermSynth3D.
mkdir -p ~/dermML-models/datasets/3dbodytex-1.1-highres
cd ~/dermML-models/datasets/3dbodytex-1.1-highres
# requer licenca: https://cvi2.uni.lu/3dbodytexv1/estrutura de diretorios
~/dermML-models/
datasets/
ham10000/ # 10k dermoscopia
bcn20000/ # 25k dermoscopia
scin/ # 10k clinica
isic2024/ # 400k+ (novo)
isic2020/ # 33k melanoma
isic2019/ # 25k 8-classes
fitzpatrick17k/ # 16k diversidade
pad-ufes-20/ # 2k smartphone
derm7pt/ # 2k 7-point checklist
ph2/ # 200 alta qualidade
dermofit/ # 1.3k licenca paga
ddi/ # 656 diversidade
fuseg/ # 1.2k ulcera
pratheepan/ # 78 skin detection
sd-198/ # 6k 198 classes
sd-260/ # 40k 260 classes
dermnet/ # 23k educacional
dermsynth3d/ # 52k sintetico
3dbodytex-1.1-highres/ # scan 3D
similarity/
embeddings.index # FAISS atual (HAM+BCN+SCIN)
metadata.db # SQLite metadado
dermsynth/ # sinteticos separados
embeddings_dermsynth.index
metadata_dermsynth.dbprioridade de download
tier 1, essencial, ja temos mas perdido: HAM10000 (10k dermoscopia, base), BCN20000 (25k dermoscopia, volume), SCIN (10k clinica, diversidade).
tier 2, muito importante, adicionar: ISIC 2024 (400k+, maior disponivel), Fitzpatrick17k (16k, diversidade de tom), PAD-UFES-20 (2k, smartphone real-world).
tier 3, importante, qualidade: PH2 (200, alta qualidade, baseline), Derm7pt (2k, 7-point checklist clinico), DermNet (23k, educacional, muitas classes).
tier 4, especializado: DermSynth3D (52k sintetico, anotacao rica), FUSeg (1.2k ulcera, nicho mas util), DDI (656, benchmark de diversidade).
tier 5, opcional/caro: DermoFit (1.3k, licenca 500 GBP), SD-198/260 (46k, requer contato).
tamanho total estimado
| tier | datasets | imagens | tamanho aprox |
|---|---|---|---|
| 1 | HAM+BCN+SCIN | 45k | ~20GB |
| 2 | ISIC24+Fitz+PAD | 418k | ~50GB |
| 3 | PH2+Derm7pt+DermNet | 27k | ~15GB |
| 4 | DermSynth+FUSeg+DDI | 54k | ~20GB |
| 5 | DermoFit+SD | 48k | ~25GB |
| total | all | ~592k | ~130GB |
proximos passos
- estrutura de diretorios criada
- criar script
scripts/download_all_datasets.sh - atualizar
compute_embeddings.pypra multiplos datasets - reindexar FAISS com todos os datasets
- atualizar metadata.db com campo novo
- testar busca com 592k imagens
gaps por escala de impacto, maior primeiro
- diversidade de tons de pele Fitzpatrick IV-VI em escala (>50k imagens). afeta 2.5B+ pessoas sem representacao algoritmica adequada.
- dermatologia para tons asiaticos (leste mais sul da Asia). 4B+ pessoas, modelo atual nao validado pra essa semiotica dermoscopica.
- WSI dermatologico aberto em escala (>10k laminas 40x). a patologia digital inteira depende de dado que nao existe em formato publico.
- longitudinal, lesao -> evolucao -> outcome ao longo do tempo. elimina biopsia desnecessaria globalmente, milhoes por ano.
- multimodal, dermoscopia mais histopatologia mais genomica linkados por paciente. precision dermatology nao existe sem isso.
- dataset EHR multi-center fora do eixo EUA/Europa. MIMIC e single-center Boston, eICU e Philips-only, 85% do planeta nao esta representado.
- dermatologia mais saude mental (comorbidade linkada, DLQI mais PHQ-9 mais imagem). psoriase, eczema, acne tem impacto psiquiatrico massivo nao quantificado em escala.
- dataset padronizado de estetica antes/depois com outcome measure validada. mercado de 100B+ USD sem dado cientifico de qualidade.
- NLP em portugues clinico dermatologico. 80k+ dermatologistas no Brasil documentando em texto livre sem nenhum modelo treinado pra esse dominio.
- dado de procedimento estetico nao-cirurgico (filler, toxina botulinica, laser) com follow-up. segmento de maior crescimento global, zero dataset.
- dermatologia pediatrica em escala. crianca quase ausente dos datasets existentes, morfologia de lesao difere muito de adulto.
- dataset de teledermatologia real-world (foto de smartphone, nao dermoscopia profissional) com ground truth histopatologico. gap entre qualidade de imagem de pesquisa e realidade clinica.
- dado de interacao medicamentosa em dermatologia com outcome visual. efeito colateral cutaneo de droga e documentado textualmente mas sem imaging pareado.
- dataset de cicatrizacao/wound healing com time-series de imagem. ferida cronica (ulcera diabetica, venosa) sem tracking visual padronizado.
- EHR psiquiatrico em lingua nao-inglesa com NLP treinado. PsyRoBERTa e dinamarques, MentalBERT e ingles, zero pra espanhol/portugues/hindi/mandarim clinico.
- saude mental, dado de terapia longitudinal com outcome validado (nao social media). Reddit/Twitter como proxy de saude mental e cientificamente fragil.
- genomica mais fenotipo dermatologico para populacao sub-representada (africana, indigena, mestica). GWAS dermatologico e 90%+ europeu.
- dado de adesao a tratamento dermatologico com outcome visual. paciente comeca tratamento, abandona, piora: nenhum dataset captura esse ciclo.
- dataset de reacao adversa cutanea a cosmetico com composicao quimica linkada. toxicovigilancia cosmetica sem dado visual em escala.
- integracao de dado ambiental (UV, poluicao, umidade) com incidencia dermatologica geolocalizada. epidemiologia dermatologica ambiental sem dataset estruturado.
os mesmos gaps por dificuldade de execucao, mais facil primeiro
- NLP em portugues clinico dermatologico. 6-12 meses com parceria institucional, o corpus de notas ja existe em hospital brasileiro, falta estruturar e treinar.
- dermatologia mais saude mental (comorbidade DLQI mais PHQ-9 mais imagem). 12-24 meses, questionario validado ja existe, basta aplicar em coorte dermatologica existente.
- dataset de teledermatologia real-world (foto smartphone mais ground truth). 12-18 meses, app de teledermatologia ja coleta essa foto, falta ground truth histopatologico.
- dado de procedimento estetico nao-cirurgico com follow-up. 12-18 meses, clinica de estetica tem foto antes/depois em volume, falta padronizacao e consentimento.
- dataset padronizado de estetica antes/depois com outcome measure. 12-24 meses, requer acordo com rede de clinica mas o dado bruto existe em gaveta.
- saude mental, dado de terapia longitudinal com outcome validado. 18-24 meses, plataforma de terapia online (BetterHelp, Zenklub) tem o dado, falta acesso pra pesquisa.
- dado de adesao a tratamento dermatologico com outcome visual. 18-24 meses, possivel em setting de clinical trial, requer protocolo prospectivo.
- dataset de cicatrizacao/wound healing time-series. 18-24 meses, clinica de wound care ja fotografa rotineiramente, falta padronizacao e estruturacao.
- EHR psiquiatrico em lingua nao-inglesa com NLP. 12-36 meses conforme o idioma, hospital psiquiatrico publico tem volume de notas, a barreira e regulatoria.
- dado de reacao adversa cutanea a cosmetico com composicao quimica. 24 meses, ANVISA/FDA tem report mas sem imagem, requer coleta prospectiva.
- integracao dado ambiental mais incidencia dermatologica geolocalizada. 24-36 meses, dado ambiental e publico (NASA, INPE), falta linkagem com registro dermatologico.
- dermatologia pediatrica em escala. 24-36 meses, barreira etica de consentimento parental, IRB/CEP mais restritivo pra menor.
- dado de interacao medicamentosa com outcome visual. 24-36 meses, requer pharmacovigilance prospectiva com imaging, multi-institucional.
- dataset EHR multi-center fora do eixo EUA/Europa. 2-4 anos, requer coordenacao entre varios paises com regulacao de dado diferente.
- diversidade Fitzpatrick IV-VI em escala (>50k imagens). 2-5 anos, requer infraestrutura de digitalizacao em regiao que nao tem, funding dedicado.
- genomica mais fenotipo dermatologico para populacao sub-representada. 3-5 anos, requer sequenciamento mais phenotyping mais consentimento em populacao vulneravel.
- longitudinal, lesao -> evolucao -> outcome. 3-7 anos pela natureza temporal, attrition de paciente, custo de follow-up.
- dermatologia para tons asiaticos em escala. 3-5 anos, barreira regulatoria chinesa de exportacao de dado, infraestrutura indiana precaria.
- WSI dermatologico aberto >10k laminas. 3-5 anos, investimento de 5-20M USD em equipamento mais anotacao, ninguem financiou em formato publico.
- multimodal, dermoscopia mais histopatologia mais genomica linkados. 5-10 anos, requer integracao de 3+ silos hospitalares que operam de forma completamente independente, o custo de sequenciamento mais digitalizacao mais imaging por paciente deixa o custo por sample altissimo.
parametros e condicoes de pele detectaveis
consolidacao dos parametros de analise de pele que apareceram nos equipamentos profissionais, organizados por categoria clinica com nota de implementacao. o que e detectavel, por qual metodo, e o que da pra fazer com hardware Apple.
condicoes pigmentares
manchas, spots
lesao pigmentar focal: sarda (efelide), lentigo solar, mancha senil (lentigo senil), nevo melanocitico. nos equipamentos: captura multi-espectral (RGB mais CPL mais UV) com algoritmo de segmentacao. implementacao: modelo de deteccao de objeto (YOLO-style ou segmentacao de instancia) treinado em dataset dermatologico (ISIC, DermNet, HAM10000). CoreML suporta as duas arquiteturas. output desejado: bounding box, mascara, classificacao por tipo, score de confianca.
pigmentacao geral
distribuicao total de melanina na face. diferente de mancha, que e focal, a pigmentacao geral avalia uniformidade e distribuicao. implementacao: analise no espaco LAB, mapa de intensidade do canal L* (luminancia) e b* (eixo amarelo-azul).
hiperpigmentacao
excesso de pigmento em area especifica. inclui melasma, PIH (hiperpigmentacao pos-inflamatoria), mascara gravidica. implementacao: classificacao binaria pixel-wise (normal vs hiperpigmentado) ou segmentacao semantica com classe hiperpigmentacao. o dado de treino tem que incluir diversidade de fototipo Fitzpatrick I a VI.
brown zone, melanina profunda
pigmentacao dermica profunda que nao aparece em RGB. revelada por CPL nos equipamentos. sem CPL: modelo de estimativa treinado em pares RGB/CPL, precisao inferior ao CPL real mas util como screening. com CPL (filtro clip-on): processamento de imagem direto.
dano solar oculto, UV spots
alteracao de pigmento pre-clinica de exposicao UV acumulada, visivel so sob UV. sem UV fisico, nao e detectavel direto. possivel: modelo preditivo por fator de risco (fototipo, idade, exposicao solar reportada) mais mancha visivel como proxy.
condicoes de textura
rugas, wrinkles
linha fina e sulco profundo. classificacao tipica: linha fina (crow’s feet, periorbital), sulco moderado (nasolabial), ruga profunda (frontal). implementacao: segmentacao semantica especializada. grading de severidade (escala de Glogau ou similar) por classificacao. o modelo tem que distinguir ruga de expressao (dinamica) de ruga estatica, idealmente com captura em face neutra.
poros
abertura folicular dilatada, predominante na zona T (testa, nariz, queixo). implementacao: segmentacao em crop de alta resolucao. a resolucao minima util pra deteccao de poro fica em torno de 20 pixels por poro, o que exige crop region com magnificacao digital ou camera de alta resolucao. iPhone 48MP da conta de crop da zona T.
textura geral
avalia suavidade, rugosidade, uniformidade da superficie. implementacao: metrica de textura computacional (variancia local, entropia, LBP, local binary patterns) extraida de imagem em alta resolucao. pode ser output numerico (score de textura) ou mapa espacial.
condicoes inflamatorias e vasculares
sensibilidade, vermelhidao difusa
pele sensivel, rosacea, irritacao. caracterizada por vermelhidao difusa nao focal. implementacao: segmentacao de area vermelha com threshold no canal a* (LAB) ou canal R (RGB). classificacao: pele normal vs sensivel vs rosacea.
red area, inflamacao focal
eritema localizado, telangiectasia (vaso visivel), inflamacao perilesional. implementacao: deteccao de componente vermelho conectado mais classificacao de padrao (focal vs difuso vs linear/vascular).
acne e inflamacao
acne comedonal (cravo), acne inflamatoria (papula, pustula), acne cistica. implementacao: deteccao de objeto multi-classe (comedao aberto, comedao fechado, papula, pustula, nodulo, cisto). dataset disponivel: ACNE04, dataset IIT Delhi.
porfirinas, atividade bacteriana
presenca de Propionibacterium acnes detectada por fluorescencia UV. requer UV fisico (365-405nm), nao simulavel computacionalmente. sem UV: acne visivel como proxy de atividade bacteriana.
classificacoes gerais
tipo de pele
classificacao em sistema, por exemplo Fitzpatrick pra fototipo, Baumann pro tipo funcional (oleosa/seca, sensivel/resistente, pigmentada/nao-pigmentada, firme/enrugada). implementacao: questionario mais analise de imagem combinados. o questionario captura o subjetivo (sensacao de oleosidade, historico de queimadura), a imagem complementa com dado objetivo (brilho especular pra oleosidade, vermelhidao pra sensibilidade).
grading de envelhecimento
escala de severidade de envelhecimento cutaneo (Glogau, Fitzpatrick-Goldman, ou proprietaria). implementacao: regressao ou classificacao ordinal treinada em imagem facial rotulada por dermatologista. output: score numerico mais categoria (leve, moderado, severo, muito severo).
tom e uniformidade
avalia uniformidade de cor (tom) da face. area de discromia, tom desigual, zona de sombra. implementacao: mapa de desvio do tom medio. calcula o tom medio da face, gera mapa de diferenca pixel-wise, destaca area com desvio acima do threshold.
simulacoes preditivas
simulacao de envelhecimento
projecao visual de como a face pode envelhecer ao longo de anos. percepcao de valor alta pelo paciente, usada como motivacao pra tratamento preventivo. implementacao: modelo generativo (GAN ou diffusion) de aging facial. modelos existentes: SAM (style-based age manipulation), FADING. conversao pra CoreML via coremltools. tamanho estimado: 50 a 200MB conforme a arquitetura. rodavel na ANE (Apple Neural Engine) dos chips A15+.
simulacao de evolucao de manchas
projecao de como a mancha pigmentar pode progredir. implementacao: pode ser subproduto do modelo de aging, com output especifico pro canal de pigmentacao. alternativa: modelo separado mais leve focado em textura de pigmento.
modos de imagem para analise facial
consolidacao dos modos de captura e processamento de imagem que apareceram nos equipamentos profissionais de analise facial. os equipamentos rodam de 8 a 15 modos simultaneos, com resolucoes de 20MP a 42MP full-face. dois grupos: espectro de iluminacao (depende de hardware de captura) e processamento (derivado por computacao a partir das capturas).
espectros de iluminacao
dependem de hardware de captura. e aqui que mora a maior parte da inviabilidade, porque a camera Apple so entrega RGB nativo.
RGB, luz visivel
captura padrao em cor natural. base pra todo o resto. presente em 100% dos equipamentos. nativo em qualquer camera Apple, sem restricao.
CPL, cross-polarized light
elimina a reflexao especular da superficie e revela pigmentacao subsuperficial na derme. e o modo pra ver melanina profunda, vaso sanguineo, condicao abaixo da epiderme que nao aparece no RGB. requer filtro polarizador fisico. existe clip-on de filtro pra iPhone, custo baixo. alternativa pior: modelo CoreML treinado em pares RGB/CPL pra estimar CPL a partir de RGB, com precisao reduzida.
PPL, parallel/balanced polarized light
enfatiza textura superficial da epiderme. complemento do CPL: onde CPL revela profundidade, PPL revela superficie. mesma situacao do CPL, requer filtro polarizador.
UV/UVA, ultravioleta
revela dano solar invisivel a olho nu. penetra superficialmente e destaca alteracao de pigmento de exposicao solar acumulada. requer fonte UV em 365nm e sensor sensivel a UV. nao replicavel na camera Apple padrao. possivel com acessorio USB-C dedicado.
NIR, near-infrared
penetra camadas mais profundas da derme, revela condicao vascular e estrutural profunda que luz visivel e UV nao alcancam. requer sensor IR dedicado. a TrueDepth do iPhone emite IR pro Face ID mas nao expoe o raw da imagem IR via API publica. da pra acessar por framework privado, nao recomendo pra producao.
lampada de Wood
UV em 365nm que provoca fluorescencia em certas substancias da pele. detecta infeccao fungica, bacteriana, alteracao de pigmento. padrao em dermatologia clinica. requer hardware UV dedicado. alguns equipamentos simulam o efeito por processamento de imagem UV, mas a fluorescencia real exige excitacao fisica UV.
modos de processamento
derivados por computacao a partir das capturas acima. todos candidatos a implementacao via CoreML, Core Image, vImage.
sensitivity, sensitive area
mapeia area de vermelhidao difusa, sinal de pele sensivel, rosacea, irritacao. tipicamente derivado de analise do canal vermelho com segmentacao por intensidade e distribuicao espacial. implementacao: segmentacao semantica CoreML treinada em dataset de pele sensivel, ou isolamento do canal R com thresholding adaptativo via Core Image.
red area, red zone
parecido com sensitivity mas focado em inflamacao localizada e vascularizacao visivel, telangiectasia, eritema. a diferenca tecnica: sensitivity mapeia vermelhidao difusa, red area mapeia vermelhidao focal. implementacao: isolamento do canal vermelho, deteccao de componentes conectados, classificacao de intensidade.
heatmap
visualizacao em gradiente de cor (falso-color) mostrando distribuicao de intensidade. pode representar temperatura (se houver IR) ou intensidade cromatica (derivado de RGB). nos equipamentos analisados parece derivado de intensidade de cor, nao de temperatura real. implementacao trivial via Core Image: grayscale, aplicar color lookup table com gradiente termico.
spots, manchas
detecta e segmenta mancha pigmentar: sarda, lentigo solar, melasma, mancha senil. precisa de alta resolucao pra pegar mancha pequena. implementacao: modelo de deteccao de objeto ou segmentacao de instancia (CoreML), com dataset rotulado por tipo de mancha.
spots simulation
projecao computacional de como a mancha pode evoluir no tempo sem tratamento. valor percebido alto pelo paciente. implementacao: modelo generativo (GAN ou diffusion) de aging focado em pigmento, rodavel local via CoreML com modelos otimizados pra ANE.
brown, brown zone
isola pigmentacao melanica especifica. diferente de spots, que detecta mancha individual, brown mapeia a distribuicao total de melanina. implementacao: analise de cor no espaco LAB (canal b* pra amarelo-azul, canal a* pra vermelho-verde) via Core Image. thresholding em LAB e mais robusto que RGB pra deteccao de melanina.
hyperpigmentation
subconjunto de pigmentacao, area de pigmento excessivo. separado de pigmentacao geral, o que sugere valor clinico em distinguir pigmentacao normal de hiperpigmentacao patologica. implementacao: classificacao binaria (normal vs hiperpigmentado) por pixel ou por regiao, treinada em dado clinico rotulado.
wrinkles, rugas
detecta e mapeia linha fina e ruga profunda. os equipamentos usam alta resolucao mais contraste pra evidenciar textura. implementacao: deteccao de borda (Canny, Laplacian) mais segmentacao semantica especializada em linha de expressao. o Vision framework tem VNDetectFaceLandmarksRequest, retorna contorno facial mas nao e granular pra ruga individual.
wrinkles simulation
projecao de evolucao de ruga no tempo. complemento do spots simulation. implementacao: modelo generativo de aging facial, pode compartilhar arquitetura com spots simulation, com output separado pra pigmento e textura.
porphyrin, porfirinas
detecta atividade bacteriana (Propionibacterium acnes) por fluorescencia de porfirina sob UV. a porfirina emite fluorescencia vermelha/laranja quando excitada por UV 365-405nm. usado pra avaliar acne e atividade de glandula sebacea. requer UV real pra excitacao. nao simulavel computacionalmente a partir de RGB.
pores, poros
mapeia poro dilatado. requer alta resolucao e bom contraste. tipicamente analisado em crop regional (nariz, bochecha, testa), nao full-face. implementacao: segmentacao em crop de alta resolucao. a camera de 48MP do iPhone 15 Pro+ tem resolucao adequada pra deteccao de poro em crop regional.
monochrome
conversao pra escala de cinza pra analisar contraste e textura sem influencia de cor. trivial: desaturacao via Core Image (CIColorControls).
green channel, canal verde
isola o canal verde do RGB. o verde e o mais sensivel a hemoglobina e vascularizacao, da pra ver padrao vascular superficial. trivial via Core Image: extrai o canal G, renderiza em grayscale ou falso-color verde.
UV spots
dano solar oculto revelado por UV. mostra pigmentacao que ainda nao aparece em luz normal mas ja existe na pele (dano acumulado pre-clinico). requer UV real, nao derivavel de RGB. da pra estimar com modelo treinado em pares UV/RGB, com precisao limitada.
calibracao de cor
equipamento de tier superior usa calibracao com 48 cores pra garantir consistencia entre sessoes e ambientes de iluminacao. um display vertical 4K serve de referencia.
pro dermML: fotografar um color checker card (X-Rite ColorChecker ou similar) na mesma sessao de captura. usar Core Image pra computar a matriz de transformacao de cor que normaliza a captura pra um espaco de referencia. assim a comparacao antes/depois vale mesmo com iluminacao diferente entre sessoes.
resolucoes identificadas
os equipamentos operam em 3 tiers:
| tier | resolucao | uso |
|---|---|---|
| 1 | 42MP full-face | topo de linha 3D |
| 2 | 20MP full-face | analisador 2D multi-espectral |
| 3 | 1.3MP | microscopia capilar, magnificacao 100-200x |
camera iPhone 15 Pro+: 48MP no sensor main, 12MP no ultra-wide/macro. a resolucao nativa e competitiva ou superior ao tier 1 e 2, mas sem controle de iluminacao multi-espectral integrado. essa e a fronteira: o sensor da conta, o que falta e o espectro.
modelagem 3D facial
capacidade de captura e reconstrucao 3D facial dos equipamentos profissionais, e o que da pra alcancar com hardware Apple. resumo da fronteira: a precisao submilimetrica dos equipamentos dedicados e inatingivel via Apple, mas pro uso estetico o ARKit/LiDAR resolve.
capacidades dos equipamentos
reconstrucao 3D de alta precisao: resolucao 42MP full-face, precisao geometrica 0.2mm (submilimetrica). aplicacao em avaliacao estetica tridimensional, planejamento cirurgico, tracking de resultado de procedimento.
visualizacao 3D de textura: renderiza a superficie da pele com textura de alta resolucao mapeada. rotacao e zoom interativo pra examinar varios angulos. presente no tier intermediario (20MP) com reconstrucao 3D parcial.
comparacao 3D: comparacao volumetrica de captura em momentos diferentes. quantifica alteracao de volume (preenchimento, perda de gordura facial, edema).
implementacao via Apple
ARKit face tracking, TrueDepth
disponivel em iPhone com Face ID (iPhone X+). retorna face mesh com 1220 vertices e blend shapes em tempo real. precisao geometrica inferior a 0.2mm, estimada em 1 a 3mm pro contorno facial. limitacao: so funciona na camera frontal (TrueDepth), nao na traseira, exceto iPhone com LiDAR.
LiDAR scanner, iPad Pro, iPhone Pro
disponivel em iPad Pro (2020+) e iPhone 12 Pro+. retorna depth map e mesh 3D via ARKit. precisao 1 a 5mm conforme a distancia. vantagem: funciona na camera traseira com controle de iluminacao. uso: captura 3D facial com iluminacao controlada mais textura de alta resolucao pela camera 48MP em simultaneo.
SceneKit / RealityKit pra renderizacao
renderizacao interativa do mesh 3D capturado com textura mapeada. rotacao, zoom, medicao interativa. export em USDZ (formato nativo Apple) pra compartilhamento e visualizacao em AR.
Photogrammetry API, Object Capture
disponivel desde macOS Monterey / iOS 17. reconstroi objeto 3D a partir de varias fotos 2D. precisao depende do numero de foto e da angulacao. uso potencial: captura 3D facial a partir de sequencia de foto (video de rotacao da face). nao ideal pro uso clinico pela variabilidade, mas util pra tracking longitudinal.
consideracoes para dermML
a precisao de 0.2mm dos equipamentos dedicados e inatingivel via hardware Apple atual. pro uso clinico (planejamento cirurgico), precisa de hardware dedicado. pro uso estetico (tracking de envelhecimento, avaliacao de simetria, visualizacao pro paciente), a precisao do ARKit/LiDAR e suficiente.
o diferencial do dermML seria juntar a captura 3D (mesmo com precisao inferior) com analise de textura via CoreML. nenhum equipamento analisado faz analise de condicao de pele direto no modelo 3D, eles capturam 3D e analisam textura em 2D separado. o dermML podia mapear o resultado da analise 2D (mancha, ruga, poro) direto sobre o mesh 3D, numa visualizacao integrada que nenhum deles tem.
otimizacao de compressao AV1 por ordenacao visual de frames
proposta de otimizacao pro sistema AV1-backed dataset do dermML: ordenar a imagem por similaridade visual antes do encoding pra maximizar a compressao inter-frame. autor Brenner Cruvinel, Hoff Research LTDA. fevereiro 2026, proposta, nao implementado. esse e o sistema base que virou o spin-off [[truw]], onde o truque do AV1 foi generalizado e tambem onde foi falsificado como index exato.
1. problema atual
no encoding atual a imagem e empacotada como frame AV1 na ordem do filesystem (ordem alfabetica do nome de arquivo). isso quer dizer que frame adjacente no video pode ser visualmente muito diferente:
Frame 0: ISIC_0024306.jpg (melanoma escuro, pele clara)
Frame 1: ISIC_0024307.jpg (nevo benigno, pele escura)
Frame 2: ISIC_0024308.jpg (dermatofibroma, pele media)o codec AV1 usa predicao inter-frame: pra codificar o frame N ele calcula o delta em relacao ao frame N-1 (ou outro frame de referencia). se o frame adjacente e visualmente distinto, o delta e grande e a compressao inter-frame se perde.
o resultado atual (~30x de compressao) vem quase inteiro da eficiencia intra-frame do AV1 (compressao dentro de cada imagem). a compressao inter-frame esta subutilizada.
2. proposta, ordenacao por similaridade visual
antes de encodar a imagem como video, ordenar de forma que frame adjacente seja maximamente similar. assim o delta inter-frame fica minimo e o AV1 comprime muito mais agressivo.
2.1 metodo, TSP nos embeddings DermLIP
os embeddings DermLIP (512 dimensoes, L2-normalizados) ja existem no pipeline de indexacao. a ordenacao otima e equivalente ao travelling salesman problem (TSP) no espaco de embedding: achar a sequencia que minimiza a distancia total entre frame consecutivo. pra 58k pontos o TSP exato e intratavel. heuristica viavel:
nearest neighbor greedy (mais simples):
import numpy as np
from sklearn.metrics.pairwise import cosine_distances
def sort_by_visual_similarity(embeddings, image_paths):
"""
Ordena imagens por similaridade visual usando nearest-neighbor greedy.
embeddings: np.array shape (N, 512), L2-normalized
image_paths: list of str, paths das imagens
Retorna: indices ordenados
"""
N = len(embeddings)
visited = set()
order = []
current = 0
visited.add(current)
order.append(current)
for _ in range(N - 1):
dists = cosine_distances(embeddings[current:current+1], embeddings)[0]
dists[list(visited)] = float('inf')
nearest = np.argmin(dists)
visited.add(nearest)
order.append(nearest)
current = nearest
return ordercomplexidade O(N^2) em distancia. pra 58k imagens com embedding 512-dim isso leva ~10-30 minutos em CPU. aceitavel como processo offline.
FAISS accelerated (recomendado pra dataset grande):
import faiss
import numpy as np
def sort_by_similarity_faiss(embeddings, image_paths):
"""
Versao acelerada usando FAISS para nearest-neighbor.
Usa busca aproximada para datasets > 50k.
"""
N, dim = embeddings.shape
index = faiss.IndexFlatIP(dim) # Inner product = cosine em vetores normalizados
index.add(embeddings)
visited = np.zeros(N, dtype=bool)
order = np.zeros(N, dtype=np.int64)
current = 0
visited[current] = True
order[0] = current
for step in range(1, N):
k = min(step + 100, N) # Buscar mais que o necessario para ter margem
scores, indices = index.search(embeddings[current:current+1], k)
for idx in indices[0]:
if not visited[idx]:
current = idx
visited[current] = True
order[step] = current
break
return order.tolist()clustering mais sort (alternativa hierarquica):
from sklearn.cluster import KMeans
import numpy as np
def sort_by_clustering(embeddings, n_clusters=100):
"""
Agrupa imagens em clusters, ordena clusters por centroide,
ordena imagens dentro de cada cluster por distancia ao centroide.
Resultado: transicoes suaves entre grupos visuais.
"""
kmeans = KMeans(n_clusters=n_clusters, random_state=42)
labels = kmeans.fit_predict(embeddings)
centroids = kmeans.cluster_centers_
cluster_order = sort_by_visual_similarity(centroids, list(range(n_clusters)))
final_order = []
for cluster_idx in cluster_order:
mask = labels == cluster_idx
indices = np.where(mask)[0]
dists = np.linalg.norm(embeddings[indices] - centroids[cluster_idx], axis=1)
sorted_indices = indices[np.argsort(dists)]
final_order.extend(sorted_indices.tolist())
return final_order2.2 pipeline completo proposto
1. carregar todas as imagens do dataset
2. gerar embeddings DermLIP por imagem (ja existe no pipeline atual)
3. ordenar indices por similaridade visual (nearest-neighbor greedy ou clustering)
4. gerar filelist.txt com a imagem na ordem otimizada
5. ffmpeg encode AV1 com a lista ordenada
6. indexar frames com mapeamento: frame_idx -> (imagem original, posicao no dataset)script proposto, sort_and_encode.py:
#!/usr/bin/env python3
"""
Ordena imagens por similaridade visual e encoda como AV1.
Maximiza compressao inter-frame.
"""
import numpy as np
import faiss
from pathlib import Path
import subprocess
import tempfile
def load_embeddings(index_path, db_path):
"""Carrega embeddings e metadata existentes."""
index = faiss.read_index(str(index_path))
embeddings = faiss.rev_swig_ptr(
index.get_xb(), index.ntotal * index.d
).reshape(index.ntotal, index.d).copy()
import sqlite3
conn = sqlite3.connect(str(db_path))
conn.row_factory = sqlite3.Row
rows = conn.execute("SELECT * FROM frames ORDER BY idx").fetchall()
metadata = [dict(r) for r in rows]
conn.close()
return embeddings, metadata
def greedy_nearest_neighbor(embeddings):
"""Ordena por nearest-neighbor greedy no espaco de embeddings."""
N = len(embeddings)
index = faiss.IndexFlatIP(embeddings.shape[1])
index.add(embeddings)
visited = np.zeros(N, dtype=bool)
order = []
current = 0
visited[current] = True
order.append(current)
for step in range(1, N):
scores, indices = index.search(embeddings[current:current+1], min(N, 200))
for idx in indices[0]:
if not visited[idx]:
current = int(idx)
visited[current] = True
order.append(current)
break
return order
def generate_sorted_filelist(metadata, order, output_path):
"""Gera filelist.txt na ordem otimizada para ffmpeg concat."""
with open(output_path, 'w') as f:
for idx in order:
meta = metadata[idx]
image_path = f"datasets/{meta['dataset']}/{meta['original_image_id']}"
f.write(f"file '{image_path}'\n")
return output_path
def encode_av1(filelist_path, output_path):
"""Encoda video AV1 a partir da lista ordenada."""
cmd = [
'ffmpeg', '-y',
'-f', 'concat', '-safe', '0', '-r', '1',
'-i', str(filelist_path),
'-c:v', 'libsvtav1',
'-crf', '30',
'-pix_fmt', 'yuv420p',
'-r', '1',
str(output_path)
]
subprocess.run(cmd, check=True)
if __name__ == "__main__":
INDEX_PATH = Path("outputteste/compressed/video_embeddings.index")
DB_PATH = Path("outputteste/compressed/video_metadata.db")
print("[1/4] Carregando embeddings...")
embeddings, metadata = load_embeddings(INDEX_PATH, DB_PATH)
print(f"[2/4] Ordenando {len(embeddings)} imagens por similaridade visual...")
order = greedy_nearest_neighbor(embeddings)
print("[3/4] Gerando filelist ordenada...")
filelist = generate_sorted_filelist(metadata, order, "outputteste/sorted_filelist.txt")
print("[4/4] Encoding AV1 com ordem otimizada...")
encode_av1(filelist, "outputteste/compressed/dataset_sorted_av1.mp4")
print("[OK] Encoding completo.")3. estimativa de ganho de compressao
3.1 raciocinio teorico
no encoding atual (ordem de filesystem) a maior parte da compressao vem do modo intra-frame do AV1. a inter-frame contribui pouco porque frame adjacente e imagem de paciente/lesao completamente diferente.
com ordenacao por similaridade: frame adjacente tem background de pele similar (mesmo tom, iluminacao), lesao adjacente tem formato/cor/textura similar, o delta inter-frame fica dominado por pequena variacao local. em codec de video a eficiencia inter-frame tipicamente adiciona 2-5x de compressao sobre o modo intra-only pra conteudo com alta redundancia temporal.
3.2 estimativa conservadora
| cenario | compressao estimada |
|---|---|
| atual (ordem filesystem) | ~30x |
| com ordenacao por similaridade | ~50-80x |
| com ordenacao mais tuning de CRF/GOP | ~60-100x |
pro dataset completo: atual 52 GB -> ~1.7 GB, estimado com ordenacao 52 GB -> ~650 MB a 1.0 GB.
3.3 como validar
# 1. encodar o mesmo dataset com e sem ordenacao
ffmpeg ... -i filelist_original.txt ... dataset_unsorted.mp4
ffmpeg ... -i filelist_sorted.txt ... dataset_sorted.mp4
# 2. comparar tamanhos
ls -lh dataset_unsorted.mp4 dataset_sorted.mp4
# 3. comparar qualidade (VMAF, PSNR, SSIM)
ffmpeg -i dataset_unsorted.mp4 -i dataset_sorted.mp4 \
-lavfi libvmaf -f null -
# 4. verificar que a busca por similaridade funciona igual
# (re-indexar o video sorted e comparar resultados de query)4. consideracoes de implementacao
4.1 mapeamento frame -> imagem original
com a ordenacao, o frame_idx no video sorted nao corresponde mais ao indice original. o SQLite metadata precisa de uma coluna extra:
CREATE TABLE frames_sorted (
idx INTEGER PRIMARY KEY, -- indice no FAISS
sorted_frame_idx INTEGER, -- posicao no video sorted
video_file TEXT,
original_frame_idx INTEGER, -- posicao no video original
dataset TEXT,
original_image_id TEXT
);4.2 GOP structure
pra maximizar compressao inter-frame, configurar o GOP (group of pictures) do SVT-AV1:
ffmpeg ... -c:v libsvtav1 \
-svtav1-params "keyint=250:scd=0" \
...keyint=250 poe keyframe a cada 250 frames (permite inter-prediction por trecho longo). scd=0 desabilita scene change detection (nao quero keyframe extra quando a lesao muda). com GOP longo, o seek aleatorio pra um frame especifico exige decodar desde o keyframe anterior. pra thumbnail sob demanda o custo e ~10-100ms extra por seek. aceitavel.
4.3 estrategias de ordenacao alternativas
Hilbert curve no espaco de embedding: projeta o embedding 512-dim numa curva de Hilbert 1-dim, preserva localidade espacial melhor que nearest-neighbor greedy, mais uniforme, evita cluster isolado.
spectral ordering: usa o segundo autovetor do Laplaciano do grafo de similaridade (Fiedler vector) pra achar a ordenacao que minimiza a soma total de diferenca entre vizinho. matematicamente otimo, mas O(N^2) em memoria pra matriz de afinidade.
hierarchical clustering (dendrogram traverse): constroi arvore hierarquica de cluster e percorre a folha em ordem, garante transicao suave em multiplas escalas.
pra uma primeira implementacao, nearest-neighbor greedy ou clustering mais sort dao conta e sao simples.
5. potencial como publicacao ou ferramenta open-source
5.1 contribuicao original
ate onde foi verificado (fevereiro 2026), nao existe publicacao ou ferramenta que combine: 1. codec de video (AV1) como formato de armazenamento de dataset de imagem, 2. ordenacao por similaridade visual pra maximizar compressao inter-frame, 3. indexacao de embedding por frame pra busca integrada, 4. benchmark comparativo sistematico de codec de video como formato de dataset.
cada elemento existe isolado: AV1 como compressor de imagem (AVIF), ordenacao por similaridade (TSP em embedding), FAISS pra busca, dataset empacotado (TFRecord, WebDataset). a combinacao desses elementos num pipeline integrado pra dataset medico e, ate onde verificado, original.
5.2 formato proposto, VideoDataset
especificacao pra um formato de dataset baseado em video:
dataset.vds/
data.mp4 # imagens como frames AV1 (ordenadas por similaridade)
embeddings.index # FAISS index (opcional, para busca)
metadata.db # SQLite: frame_idx -> metadados originais
manifest.json # metadados do dataset (schema, contagem, versao, codec params)manifest.json:
{
"format": "videodataset",
"version": "1.0",
"codec": "av1",
"encoder": "libsvtav1",
"total_frames": 58000,
"resolution": "512x512",
"fps": 1,
"crf": 30,
"sorting": "dermlip-nearest-neighbor",
"embedding_model": "redlessone/DermLIP_ViT-B-16",
"embedding_dim": 512,
"original_size_gb": 52.0,
"compressed_size_gb": 0.65,
"compression_ratio": 80,
"datasets": [
{"name": "HAM10000", "frames": 10015, "start_idx": 0},
{"name": "DermNet", "frames": 19446, "start_idx": 10015},
{"name": "ISIC2019", "frames": 25331, "start_idx": 29461}
]
}5.3 possivel titulo de paper
“VideoDataset: AV1 Video-Backed Compression for Medical Image Datasets with Integrated Similarity Search”. venue relevante: MICCAI (Medical Image Computing and Computer Assisted Intervention), ML4H (Machine Learning for Health), NeurIPS Datasets and Benchmarks Track, Nature Scientific Data, arXiv cs.CV / cs.MM.
5.4 pontos fortes para review
pratico: resolve um problema real de engenharia (distribuicao de dataset de 50+ GB). reprodutivel: usa ferramenta existente (ffmpeg, FAISS, DermLIP). benchmark rigoroso: 7 formatos comparados empiricamente. generalizavel: funciona pra qualquer dataset de imagem, nao so dermatologia. royalty-free: AV1 e codec aberto, sem licenciamento.
LeRobotDataset v3.0, large-scale datasets in lerobot
clipping de referencia. Hugging Face, 16 de setembro de 2025, autores Francesco Capuano, Michel Aractingi, Quentin Lhoest, Caroline Pascal, Pepijn Kooijmans, Jade Choghari, Remi Cadene, Simon Alibert, Adil Zouitine, Martino Russi, Steven Palma. fonte https://huggingface.co/blog/lerobot-datasets-v3 . relevante pro dermML como prior art de formato: o v3 empacota varios episodios num arquivo so com metadata relacional, e suporta streaming. o benchmark de codec esta em [[scaling-robotics-datasets-video-encoding]].
resumo
o v2 guardava um episodio por arquivo, batendo no limite de file-system ao escalar pra milhoes de episodio. o v3 empacota varios episodios num arquivo so, usando metadata relacional pra recuperar a informacao no nivel do episodio individual. o formato novo suporta nativo o acesso em modo streaming, processando dataset grande on the fly. tem util de uma linha pra converter todo dataset do formato LeRobotDataset pro novo.
o LeRobotDataset e formato padronizado pras necessidades de robot learning, com acesso unificado a dado de robotica em varias modalidades (leitura sensorimotor, varios feed de camera, status de teleoperacao). tambem guarda informacao geral de como o dado foi coletado (metadata), incluindo descricao textual da tarefa, tipo de robo e detalhe de medicao como o frame rate em que a imagem e o estado do robo sao amostrados. a metadata serve pra indexar e buscar dataset de robotica no Hub.
instalar lerobot e gravar dataset
o v3 vai ser parte do lerobot a partir do lerobot-v0.4.0. da pra instalar a ultima lerobot-v0.3.x que suporta o formato direto do PyPI:
pip install "https://github.com/huggingface/lerobot/archive/33cad37054c2b594ceba57463e8f11ee374fa93c.zip"gravar dataset com o braco SO-101 por teleoperacao:
lerobot-record \
--robot.type=so101_follower \
--robot.port=/dev/tty.usbmodem585A0076841 \
--robot.id=my_awesome_follower_arm \
--robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 1920, height: 1080, fps: 30}}" \
--teleop.type=so101_leader \
--teleop.port=/dev/tty.usbmodem58760431551 \
--teleop.id=my_awesome_leader_arm \
--display_data=true \
--dataset.repo_id=${HF_USER}/record-test \
--dataset.num_episodes=5 \
--dataset.single_task="Grab the black cube"design do formato
a escolha de design central e separar o storage subjacente da API de usuario. o dataset organiza em tres componentes:
- tabular data: dado de baixa dimensao e alta frequencia (estado de junta, acao) em arquivo Apache Parquet, tipicamente offloaded pra biblioteca
datasets, com acesso memory-mapped ou por streaming. - visual data: pra lidar com volume grande de dado de camera, o frame e concatenado e encodado em arquivo MP4. frame do mesmo episodio sempre agrupado no mesmo video, varios video agrupados por camera. pra reduzir o stress no file system, grupo de video da mesma camera tambem e quebrado em subdiretorio.
- metadata: colecao de arquivo JSON que descreve a estrutura do dataset, contraparte relacional do tabular e do visual. inclui schema de feature, frame rate, estatistica de normalizacao, fronteira de episodio.
pra suportar dataset com milhoes de episodio (centenas de milhoes ou bilhoes de frame), o dado de episodio diferente e merged na mesma estrutura. qualquer colecao tabular e qualquer video nao tem so um episodio, e a concatenacao de varios. a metadata recupera a info especifica do episodio (timestamp de inicio e fim de um episodio num video).
estrutura do repositorio:
meta/info.json: arquivo central de metadata, schema completo do dataset, todas as features (observation.state,action), shapes, tipos. tambem guarda fps, versao da codebase, e os path templates pra localizar arquivo de dado e de video.meta/stats.json: estatistica agregada (mean, std, min, max) por feature em todo o dataset, usada pra normalizacao, acessivel viadataset.meta.stats.meta/tasks.jsonl: mapeia descricao de tarefa em linguagem natural pra indice inteiro de tarefa, usado em policy training condicionado por tarefa.meta/episodes/: metadata de cada episodio individual (length, tarefa correspondente, ponteiro de onde o dado fica). pra escalar, guardado em Parquet chunked, nao num JSON grande.data/: dado tabular frame a frame em Parquet, dado de varios episodios concatenado em arquivo maior, organizado em subdiretorio chunked.videos/: arquivo MP4 de todo stream de observacao visual, video de varios episodios concatenado em MP4 unico, reduzindo o numero de arquivo. a estrutura de path (/videos/<camera_key>/<chunk>/file_...mp4) deixa o data loader localizar o arquivo certo e fazer seek pro timestamp do frame.
migrar do v2.1 pro v3.0
python -m lerobot.datasets.v30.convert_dataset_v21_to_v30 --repo-id=<HFUSER/DATASET_ID>o script convert_dataset_v21_to_v30.py agrega os varios episodios episode-0000.mp4, episode-0001.mp4, ... / episode-0000.parquet, ... em arquivo unico file-0000.mp4 / file-0000.parquet, e atualiza a metadata pra recuperar a info especifica do episodio dos arquivos de nivel mais alto.
exemplo com torch DataLoader
todo dataset no Hub com os tres pilares (tabular, visual, metadata) acessa com uma linha. a maioria dos algoritmo de robot learning (RL ou behavioral cloning) opera num stack de observacao e acao. RL tipicamente usa historico de observacao previa o_{t-H_o:t}, BC tipicamente regressa chunk de varias acao. o LeRobotDataset tem operacao nativa de windowing pelo argumento delta_timestamps.
from lerobot.datasets.lerobot_dataset import LeRobotDataset
repo_id = "yaak-ai/L2D-v3"
dataset = LeRobotDataset(repo_id)
sample = dataset[100]
# {
# 'observation.state': tensor([...]),
# 'action': tensor([...]),
# 'observation.images.front_left': tensor([C, H, W]),
# 'timestamp': tensor(1.234),
# }
delta_timestamps = {
"observation.images.front_left": [-0.2, -0.1, 0.0] # 0.2 e 0.1 seg antes da observacao
}
dataset = LeRobotDataset(repo_id, delta_timestamps=delta_timestamps)
sample = dataset[100]
# 'observation.images.front_left' agora tem shape [T, C, H, W], T=3
print(sample['observation.images.front_left'].shape)
batch_size = 16
data_loader = torch.utils.data.DataLoader(dataset, batch_size=batch_size)
num_epochs = 1
device = "cuda" if torch.cuda.is_available() else "cpu"
for epoch in range(num_epochs):
for batch in data_loader:
observations = batch['observation.state.vehicle'].to(device)
actions = batch['action.continuous'].to(device)
images = batch['observation.images.front_left'].to(device)
...streaming
from lerobot.datasets.streaming_dataset import StreamingLeRobotDataset
# Streams direto do Hub, sem baixar nem carregar na memoria
repo_id = "yaak-ai/L2D-v3"
dataset = StreamingLeRobotDataset(repo_id)conclusao
o v3.0 e um passo pra escalar dataset de robotica no LeRobot. fornecendo um formato pra guardar e acessar colecao grande de dado de robo, permite a comunidade treinar em potencialmente milhoes de episodio sem nem baixar o dado. o time agradece o time da yaak.ai pelo suporte no desenvolvimento.
contribuicao do LeRobotDataset
reducao media de tamanho: 14% do tamanho original do dataset (ate 0.2% no melhor caso). melhora de loading: frame unico comparavel ao PNG, frame multiplo sucessivo 25% a 50% do tempo de PNG. preservacao de qualidade: capacidade de treino mantida. ferramenta de visualizacao: browsing facil do dataset.
fundamentos de video encoding
duas tecnicas principais: compressao espacial (mesmo principio do JPEG/PNG, explora auto-similaridade dentro do frame) e compressao temporal (guarda a diferenca entre frame em vez do frame inteiro, exige keyframe I-frame em intervalo regular como ponto de referencia).
processo de encoding: 1. determina keyframe pela especificacao do usuario e pela mudanca de cena, 2. comprime keyframe espacialmente, 3. comprime a diferenca inter-frame (P-frame, B-frame) temporalmente, 4. aplica compressao espacial nessa diferenca, 5. encoda o dado comprimido em bitstream, 6. empacota o bitstream em container (MP4, MKV, AVI), 7. aplica processamento extra pra reduzir distorcao visual.
criterios de avaliacao
quatro criterios: tamanho (impacta storage e download), tempo de decodificacao (impacta tempo de treino), qualidade (impacta acuracia de treino), compatibilidade (capacidade de decodar e visualizar em varios device/plataforma).
metrica de tamanho: razao de compressao = tamanho do video encodado dividido pelo tamanho dos frames originais nao comprimidos. tempo de loading: tempo de decodar frame dividido pelo tempo de carregar de imagem individual. metrica de qualidade: MSE (mean square error, menor melhor), PSNR (peak signal-to-noise ratio, maior melhor), SSIM (structural similarity index measure, varia de -1 a 1, maior melhor).
variaveis testadas
datasets (4 exemplos representativos): lerobot/pusht_image 96x96 px simulacao formas simples, aliberts/aloha_mobile_shrimp_image 480x640 px real indoor camera movel, aliberts/paris_street 720x1280 px real outdoor camera movel, aliberts/kitchen 1080x1920 px real indoor camera fixa.
parametros de encoding:
| parametro | valores |
|---|---|
| vcodec | libx264, libx265, libsvtav1 |
| pix_fmt | yuv444p, yuv420p |
| g (GOP size) | 1, 2, 3, 4, 5, 6, 10, 15, 20, 40, None |
| crf | 0, 5, 10, 15, 20, 25, 30, 40, 50, None |
vcodec e o motor algoritmico do encoding. pix_fmt especifica o color space (YUV, RGB, grayscale); pra YUV, o chroma subsampling (yuv420p = 4:2:0, mais compativel com web; yuv444p info de cor completa mas menos compativel com browser). g determina a frequencia de keyframe (valor menor = mais keyframe = acesso aleatorio a frame mais rapido; valor maior = acesso mais lento mas arquivo menor; pra treino de ML precisa de valor menor; midia tradicional aceita 2-4 segundos entre keyframe). crf controla a quantidade de compressao com perda (0 = sem perda, 50-60 = muito lossy; preferivel a targeting de bitrate porque mantem qualidade visual constante com bitrate variavel).
decoder testado: pyav (default), video_reader. cenario de timestamp: 1_frame, 2_frames, 6_frames, 2_frames_4_space.
resultados
mudanca de versao
| metrica | v1.5 | v1.6 |
|---|---|---|
| vcodec | libx264 | libsvtav1 |
| pix-fmt | yuv444p | yuv420p |
| g | 2 | 2 |
| crf | None (=23) | 30 |
melhora: melhor qualidade com encoding AV1 e melhor compatibilidade com yuv420p.
tamanho
razao de compressao media ~14% em todos os datasets. maioria <40% do tamanho original. melhor caso <1% do tamanho original. variacao por formato original (imagem nao comprimida comprime melhor), imagem ja comprimida (JPEG/PNG comprime menos), resolucao, complexidade de cena. exemplo de reducao: lerobot/nyu_rot_dataset 5.3MB -> 318.2KB (5.8%), lerobot/aloha_sim_transfer_cube_human 17.9GB -> 66.7MB (0.4%), lerobot/berkeley_gnm_recon 18.7GB -> 29.3MB (0.2%).
tempo de loading
video loading escala melhor com resolucao, principalmente pra multiplos frame. pra small (96x96) e large (1080x1920): frame unico comparavel ao PNG, 2 e 6 consecutivos 25-50% do tempo de PNG.
qualidade (g=2, crf=30)
pra lerobot/kitchen (1080x1920, 2.07 megapixels):
| codec | format | MSE | PSNR | SSIM |
|---|---|---|---|---|
| libx264 | yuv420p | 2.32E-04 | 36.77 | 95.47% |
| libx264 | yuv444p | 2.06E-04 | 37.38 | 95.58% |
| libx265 | yuv420p | 6.87E-04 | 35.27 | 95.11% |
| libx265 | yuv444p | 6.75E-04 | 35.50 | 95.13% |
| libsvtav1 | yuv420p | 1.32E-04 | 39.20 | 96.84% |
libsvtav1 com yuv420p entrega a melhor metrica de qualidade.
validacao de treino de policy
policy treinada em dataset encodado teve performance equivalente a treinada na versao de imagem. diffusion policy no PushT: curva de treino identica entre formato, sem degradacao. ACT policy no ALOHA: curva identica, sem degradacao. AV1 vs H264: diffusion no pusht AV1 aprox H264, ACT no aloha_sim_transfer_cube_human AV1 aprox H264, ACT no aloha_sim_insertion_scripted AV1 aprox H264.
future work
parametro de encoding a explorar: -preset (trade-off velocidade/compressao), -tune (otimizar pra aspecto especifico, film quality, live, fast decode), two-pass encoding (aumenta qualidade ao custo de tempo de encoding). decoder alternativo: torchcodec, torchaudio, ffmpegio, decord, nvc. outras consideracoes: video encoding com depth map, otimizacao de parametro de codec, exploracao de outro container.
conclusao
o benchmark demonstra que o codec AV1 com pixel format yuv420p e CRF conservador da o melhor balanco de tamanho, qualidade, velocidade e compatibilidade pra dataset de robotica. o video encoding resolve a escalabilidade de dataset de robotica reduzindo storage pra ~14% do original em media, mantendo ou melhorando a velocidade de loading pra multiplos frame, preservando a qualidade de treino e a performance da policy.
future