如何从ImageNet每个类别获取50个可正常访问的样本URL
获取ImageNet单类别下50个可访问有效URL的高效方案
- 先对官方接口返回的原始URL做批量预校验,从根源减少无效链接占比
你之前调用的imagenet.synset.geturls接口,单类别返回的URL本身就有数百条,完全没必要绕路找第三方数据源。只需要写个轻量并发脚本,对所有返回的URL发超时3秒的HEAD请求,筛出返回状态码200、资源类型为图片格式的有效链接,按顺序存到对应类别的txt文件里,攒够50条就停止拉取,比手动逐个测试效率高一个量级。 - 调整请求头配置,减少“假失效”链接
近3成你以为失效的链接,实际是请求没带合法的User-Agent头,被图床源直接拦截返回403。不管是预校验环节还是后续下载环节,统一给请求加上常规浏览器的请求头,能多捞回来一大批之前被误判的链接。 - 改造现有CNN加载代码的容错逻辑,避免偶发失效中断流程
别死盯着txt的前50行硬读,改成维护一个有效链接计数的逻辑:遇到下不动、被PIL判定为损坏的无效链接直接跳过,直到累计凑够50个有效样本再停循环,就算有少量漏网的失效链接,也不会把整个加载流程搞崩。
可参考的核心调整代码片段:
import io valid_sample_count = 0 with open("C:\\Windows\\System32\\whiteshark.txt", "r") as f: for line in f: if valid_sample_count >= 50: break url = line.strip() try: # 加浏览器请求头避免被源站拦截 req = urllib.request.Request(url, headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"}) with urllib.request.urlopen(req, timeout=5) as resp: img_bytes = resp.read() # 提前校验图片完整性,避免下到损坏资源 with Image.open(io.BytesIO(img_bytes)) as test_img: test_img.verify() # 有效样本计数+1,走后续推理流程 valid_sample_count +=1 input_image = Image.open(io.BytesIO(img_bytes)) img_t = transform(input_image) batch_t = torch.unsqueeze(img_t, 0) print(url) except Exception: # 无效链接直接跳过 continue
- 省时间的小技巧:预校验的时候可以顺便把分辨率过低、带明显水印的样本URL过滤掉,减少后续CNN加载的无效计算。
内容的提问来源于stack exchange,提问作者altina9619
相关产品推荐
相关产品推荐

