{"version":2,"relationshipURLBase":"https://codingai-lec03.pages.dev/course/notebook-blocks/c62130014946402d998cecf03bd50f05.html","relationshipResolution":"Resolve relative relationship URLs against relationshipURLBase; complete records and absolute URLs are in blocks.","title":"从一张图到两个视图 · 实现代码","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/c62130014946402d998cecf03bd50f05.html","markdown":"https://codingai-lec03.pages.dev/course/notebook-blocks/c62130014946402d998cecf03bd50f05.md","pages":[{"id":"reading-opening","title":"从一张图到两个视图 · 实现代码","unit":"从一张图到两个视图 · 实现代码","unitId":"notebook-blocks/c62130014946402d998cecf03bd50f05","chapter":"course","number":1}],"aliases":[{"oldId":"b-5b054009430a755c7028bcf1","targetId":"b-5b054009430a755c7028bcf1","page":"reading-opening","operation":"move","beforeSHA256":"66fcbfd55e8ee49e9b36e857c1385fb66cc262f5d574a2759c494c801fe22adc","afterSHA256":"66fcbfd55e8ee49e9b36e857c1385fb66cc262f5d574a2759c494c801fe22adc","reason":"Same source body in authored semantic page"},{"oldId":"b-bf72e2ebb6d33def7dcf1c9c","targetId":"b-bf72e2ebb6d33def7dcf1c9c","page":"reading-opening","operation":"move","beforeSHA256":"feb90a8154bb8e82692f2b91c1030180cfeb396322b7c9b5e32cf3c0d43f099d","afterSHA256":"feb90a8154bb8e82692f2b91c1030180cfeb396322b7c9b5e32cf3c0d43f099d","reason":"Same source body in authored semantic page"},{"oldId":"b-d91869804593491b094c440d","targetId":"b-d91869804593491b094c440d","page":"reading-opening","operation":"move","beforeSHA256":"42cba31deccba2a350b9b23bd0ca1dcaa4c4c5cb9d35c773e1fcb89124788ccd","afterSHA256":"42cba31deccba2a350b9b23bd0ca1dcaa4c4c5cb9d35c773e1fcb89124788ccd","reason":"Same source body in authored semantic page"},{"oldId":"b-754e36367f817b752379de1b","targetId":"b-754e36367f817b752379de1b","page":"reading-opening","operation":"move","beforeSHA256":"7d0c53df1bc36d8ae47159a38d1da25d7b95cb99a23f0973fb743325017d6c63","afterSHA256":"7d0c53df1bc36d8ae47159a38d1da25d7b95cb99a23f0973fb743325017d6c63","reason":"Same source body in authored semantic page"},{"oldId":"b-2ef34b7fe5c050c7e2feab42","targetId":"b-2ef34b7fe5c050c7e2feab42","page":"reading-opening","operation":"move","beforeSHA256":"1fc0e3a0f77748e01b540c9b8a766cf620b009cb71e1e60dde57dde6d4432171","afterSHA256":"1fc0e3a0f77748e01b540c9b8a766cf620b009cb71e1e60dde57dde6d4432171","reason":"Same source body in authored semantic page"}],"blocks":[{"id":"b-5b054009430a755c7028bcf1","type":"p","scope":"document","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/c62130014946402d998cecf03bd50f05.html#b-5b054009430a755c7028bcf1","content":"[LAB 06 · 颜色干预：视图、投影与读出](/course/notebooks/7c4f531113d7473abc174e2e014e1340.html)","sha256":"66fcbfd55e8ee49e9b36e857c1385fb66cc262f5d574a2759c494c801fe22adc","chapter":{"id":"course","title":"从一张图到两个视图 · 实现代码"},"unit":{"id":"notebook-blocks/c62130014946402d998cecf03bd50f05","title":"从一张图到两个视图 · 实现代码"},"page":{"id":"reading-opening","title":"从一张图到两个视图 · 实现代码","number":1},"sectionTitle":"从一张图到两个视图 · 实现代码","currentQuestion":"从一张图到两个视图 · 实现代码","sourceSlides":[],"knowledgeBlock":null,"formulas":[],"previousBlock":null,"nextBlock":"b-bf72e2ebb6d33def7dcf1c9c","prerequisites":[],"relatedBlocks":[]},{"id":"b-bf72e2ebb6d33def7dcf1c9c","type":"h1","scope":"document","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/c62130014946402d998cecf03bd50f05.html#b-bf72e2ebb6d33def7dcf1c9c","content":"# 从一张图到两个视图 · 实现代码","sha256":"feb90a8154bb8e82692f2b91c1030180cfeb396322b7c9b5e32cf3c0d43f099d","chapter":{"id":"course","title":"从一张图到两个视图 · 实现代码"},"unit":{"id":"notebook-blocks/c62130014946402d998cecf03bd50f05","title":"从一张图到两个视图 · 实现代码"},"page":{"id":"reading-opening","title":"从一张图到两个视图 · 实现代码","number":1},"sectionTitle":"从一张图到两个视图 · 实现代码","currentQuestion":"从一张图到两个视图 · 实现代码","sourceSlides":[],"knowledgeBlock":null,"formulas":[],"previousBlock":"b-5b054009430a755c7028bcf1","nextBlock":"b-d91869804593491b094c440d","prerequisites":[{"id":"b-5b054009430a755c7028bcf1","url":"#b-5b054009430a755c7028bcf1","role":"problem-context"}],"relatedBlocks":[]},{"id":"b-d91869804593491b094c440d","type":"p","scope":"document","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/c62130014946402d998cecf03bd50f05.html#b-d91869804593491b094c440d","content":"主线阅读与优先实验","sha256":"42cba31deccba2a350b9b23bd0ca1dcaa4c4c5cb9d35c773e1fcb89124788ccd","chapter":{"id":"course","title":"从一张图到两个视图 · 实现代码"},"unit":{"id":"notebook-blocks/c62130014946402d998cecf03bd50f05","title":"从一张图到两个视图 · 实现代码"},"page":{"id":"reading-opening","title":"从一张图到两个视图 · 实现代码","number":1},"sectionTitle":"从一张图到两个视图 · 实现代码","currentQuestion":"从一张图到两个视图 · 实现代码","sourceSlides":[],"knowledgeBlock":null,"formulas":[],"previousBlock":"b-bf72e2ebb6d33def7dcf1c9c","nextBlock":"b-754e36367f817b752379de1b","prerequisites":[{"id":"b-bf72e2ebb6d33def7dcf1c9c","url":"#b-bf72e2ebb6d33def7dcf1c9c","role":"section-title"},{"id":"b-5b054009430a755c7028bcf1","url":"#b-5b054009430a755c7028bcf1","role":"problem-context"}],"relatedBlocks":[]},{"id":"b-754e36367f817b752379de1b","type":"p","scope":"document","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/c62130014946402d998cecf03bd50f05.html#b-754e36367f817b752379de1b","content":"真实RGB对比训练、唯一指定增强变化、h/z形状与颜色读出","sha256":"7d0c53df1bc36d8ae47159a38d1da25d7b95cb99a23f0973fb743325017d6c63","chapter":{"id":"course","title":"从一张图到两个视图 · 实现代码"},"unit":{"id":"notebook-blocks/c62130014946402d998cecf03bd50f05","title":"从一张图到两个视图 · 实现代码"},"page":{"id":"reading-opening","title":"从一张图到两个视图 · 实现代码","number":1},"sectionTitle":"从一张图到两个视图 · 实现代码","currentQuestion":"从一张图到两个视图 · 实现代码","sourceSlides":[],"knowledgeBlock":null,"formulas":[],"previousBlock":"b-d91869804593491b094c440d","nextBlock":"b-2ef34b7fe5c050c7e2feab42","prerequisites":[{"id":"b-bf72e2ebb6d33def7dcf1c9c","url":"#b-bf72e2ebb6d33def7dcf1c9c","role":"section-title"},{"id":"b-5b054009430a755c7028bcf1","url":"#b-5b054009430a755c7028bcf1","role":"problem-context"}],"relatedBlocks":[]},{"id":"b-2ef34b7fe5c050c7e2feab42","type":"pre","scope":"document","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/c62130014946402d998cecf03bd50f05.html#b-2ef34b7fe5c050c7e2feab42","content":"```\ndef make_data(seed=SEED):\n    rng=np.random.default_rng(seed)\n    yy,xx=np.mgrid[:16,:16]\n    images=[]; shape=[]; color=[]; split=[]\n    # Stratified before view construction. One independently generated source per ID.\n    for s in range(3):\n        for c in range(2):\n            for i in range(140):\n                cx,cy=rng.uniform(6,10,2); r=rng.uniform(3.0,4.7)\n                dx,dy=xx-cx,yy-cy\n                if s==0: mask=dx*dx+dy*dy<=r*r\n                elif s==1: mask=np.maximum(abs(dx),abs(dy))<=r\n                else: mask=abs(dx)+abs(dy)<=r*1.35\n                # Red and blue have equal channel sums: grayscale erases hue by design.\n                rgb=np.array([.9,.15,.15] if c==0 else [.15,.15,.9])\n                bg=rng.uniform(.015,.075,(16,16,1))\n                im=np.where(mask[...,None],rgb*rng.uniform(.8,1),bg)\n                im+=rng.normal(0,.012,im.shape)\n                images.append(np.clip(im,0,1).transpose(2,0,1))\n                shape.append(s); color.append(c); split.append(0 if i<100 else 1)\n    x=np.asarray(images,dtype='float32'); split=np.asarray(split)\n    ids=np.arange(len(x)); train=ids[split==0]; test=ids[split==1]\n    assert set(train).isdisjoint(test)\n    assert len({hashlib.sha256(v.tobytes()).hexdigest() for v in x})==len(x)\n    return torch.from_numpy(x),np.asarray(shape),np.asarray(color),train,test\n\ndef views(x, destroy_color=False):\n    # Independent transforms of each source; no labels/scene attributes are read.\n    a=x.clone(); n=len(a)\n    shifts=torch.randint(-1,2,(n,2))\n    for i,(dy,dx) in enumerate(shifts.tolist()):\n        a[i]=torch.roll(a[i],(dy,dx),(-2,-1))\n    a=a*torch.empty(n,1,1,1).uniform_(.8,1.2)\n    a=a+torch.randn_like(a)*.025\n    # The ablation changes only the hue swap. Every run consumes this RNG draw.\n    swap=torch.rand(n)<.5\n    if destroy_color: a[swap]=a[swap][:,[2,1,0]]\n    return a.clamp(0,1)\n```","sha256":"1fc0e3a0f77748e01b540c9b8a766cf620b009cb71e1e60dde57dde6d4432171","chapter":{"id":"course","title":"从一张图到两个视图 · 实现代码"},"unit":{"id":"notebook-blocks/c62130014946402d998cecf03bd50f05","title":"从一张图到两个视图 · 实现代码"},"page":{"id":"reading-opening","title":"从一张图到两个视图 · 实现代码","number":1},"sectionTitle":"从一张图到两个视图 · 实现代码","currentQuestion":"从一张图到两个视图 · 实现代码","sourceSlides":[],"knowledgeBlock":null,"formulas":[],"previousBlock":"b-754e36367f817b752379de1b","nextBlock":null,"prerequisites":[{"id":"b-bf72e2ebb6d33def7dcf1c9c","url":"#b-bf72e2ebb6d33def7dcf1c9c","role":"section-title"},{"id":"b-5b054009430a755c7028bcf1","url":"#b-5b054009430a755c7028bcf1","role":"problem-context"}],"relatedBlocks":[]}]}
