Hsyshasuzh/longmemory-geo / project /evaluation /audit_dior_queue_dota_development.py
Hsyshasuzh's picture
download
raw
3.39 kB
"""Screen a DIOR-R review queue against selected DOTA development scenes."""
import argparse
import hashlib
import json
from pathlib import Path
from evaluation.audit_fair1m_dior_queue_duplicates import fingerprints
def audit(queue, reference_images):
raw = queue.read_bytes()
data = json.loads(raw)
records = data['records']
if not records or not reference_images:
raise ValueError('queue and development image list must be nonempty')
refs = []
for record in records:
if record.get('training_eligible') is not False:
raise ValueError('queue must remain training-ineligible')
payload = Path(record['image']).read_bytes()
if hashlib.sha256(payload).hexdigest() != record['image_sha256']:
raise ValueError(f"queue image hash mismatch: {record['id']}")
fp = fingerprints(payload)
refs.append((record['id'], fp['pixel_sha256'], [int(x, 16) for x in fp['phashes']]))
matches, errors, reference_hashes = [], [], []
for path in reference_images:
try:
payload = path.read_bytes()
fp = fingerprints(payload)
reference_hashes.append({'path': str(path), 'sha256': hashlib.sha256(payload).hexdigest()})
values = [int(x, 16) for x in fp['phashes']]
for identifier, pixels, hashes in refs:
distance = min((a ^ b).bit_count() for a in values for b in hashes)
if pixels == fp['pixel_sha256'] or distance <= 6:
matches.append({'queue_id': identifier, 'reference_path': str(path),
'exact_rgb': pixels == fp['pixel_sha256'], 'minimum_phash_distance': distance})
except Exception as exc:
errors.append({'reference_path': str(path), 'error': str(exc)})
return {'status': 'PENDING_REVIEW', 'queue_sha256': hashlib.sha256(raw).hexdigest(),
'queue_images': len(refs), 'reference_images': len(reference_images),
'reference_hashes': reference_hashes, 'matches': matches, 'errors': errors,
'phash_distance_limit': 6, 'training_eligible': False, 'independence_established': False,
'limitations': ['Whole-image exact-RGB and coarse DCT screen only; matches require review.',
'Cannot rule out crops, rescaling, nearby acquisitions, geography, other sources or pretraining exposure.',
'No-match does not grant training eligibility or replace independent label review.']}
def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('--queue', type=Path, required=True)
parser.add_argument('--development-images', type=Path, required=True)
parser.add_argument('--output', type=Path, required=True)
args = parser.parse_args()
if args.output.exists():
raise FileExistsError(args.output)
images = sorted(args.development_images.rglob('*.png'))
result = audit(args.queue, images)
with args.output.open('x', encoding='utf-8') as handle:
json.dump(result, handle, indent=2)
handle.write('\n')
print(json.dumps({key: result[key] for key in ('queue_images', 'reference_images', 'training_eligible', 'independence_established')}),
'matches', len(result['matches']), 'errors', len(result['errors']))
if __name__ == '__main__':
main()

Xet Storage Details

Size:
3.39 kB
·
Xet hash:
c1c7b778c8938c1c7c8c875ba4a69ec8cfbba2ce480a6a2206a8d21d1d654b37

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.