{"version":2,"relationshipURLBase":"https://codingai-lec03.pages.dev/course/notebook-blocks/455f430e56104e59b4a5886436462ef5.html","relationshipResolution":"Resolve relative relationship URLs against relationshipURLBase; complete records and absolute URLs are in blocks.","title":"为什么同时训练 1×1 读出和 FCN · 实现代码","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/455f430e56104e59b4a5886436462ef5.html","markdown":"https://codingai-lec03.pages.dev/course/notebook-blocks/455f430e56104e59b4a5886436462ef5.md","pages":[{"id":"reading-opening","title":"为什么同时训练 1×1 读出和 FCN · 实现代码","unit":"为什么同时训练 1×1 读出和 FCN · 实现代码","unitId":"notebook-blocks/455f430e56104e59b4a5886436462ef5","chapter":"course","number":1}],"aliases":[{"oldId":"b-ac48174c90bea1afc9f5e462","targetId":"b-ac48174c90bea1afc9f5e462","page":"reading-opening","operation":"move","beforeSHA256":"f6dfd09a50caab375f02e0abcc3ff7a454ea579ed8eef0c35b95c95b0619c304","afterSHA256":"f6dfd09a50caab375f02e0abcc3ff7a454ea579ed8eef0c35b95c95b0619c304","reason":"Same source body in authored semantic page"},{"oldId":"b-90df80f094e65ae74bf897fa","targetId":"b-90df80f094e65ae74bf897fa","page":"reading-opening","operation":"move","beforeSHA256":"c6599d0453d8050b08273595154d70d0fbabb6dcd52b892c8b9156b9a528ee36","afterSHA256":"c6599d0453d8050b08273595154d70d0fbabb6dcd52b892c8b9156b9a528ee36","reason":"Same source body in authored semantic page"},{"oldId":"b-66542120101cbf8720cb9afb","targetId":"b-66542120101cbf8720cb9afb","page":"reading-opening","operation":"move","beforeSHA256":"e91f24e4e4ca40e2099a0d81d30db6568f4bf2074b499eeee6e3959617bd97ac","afterSHA256":"e91f24e4e4ca40e2099a0d81d30db6568f4bf2074b499eeee6e3959617bd97ac","reason":"Same source body in authored semantic page"},{"oldId":"b-60d4a821ff7d2b91ee28acd5","targetId":"b-60d4a821ff7d2b91ee28acd5","page":"reading-opening","operation":"move","beforeSHA256":"6f0b115c3c32032428a4c0d5ec4791e16d6b63aa3d643457bed758bf6af2b765","afterSHA256":"6f0b115c3c32032428a4c0d5ec4791e16d6b63aa3d643457bed758bf6af2b765","reason":"Same source body in authored semantic page"},{"oldId":"b-cca77dafe5019431fd8dc3e9","targetId":"b-cca77dafe5019431fd8dc3e9","page":"reading-opening","operation":"move","beforeSHA256":"35b26bb8eeec03243eb73037e44d9ec58aff583454c17a469db37c5b6bc94c1b","afterSHA256":"35b26bb8eeec03243eb73037e44d9ec58aff583454c17a469db37c5b6bc94c1b","reason":"Same source body in authored semantic page"}],"blocks":[{"id":"b-ac48174c90bea1afc9f5e462","type":"p","scope":"document","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/455f430e56104e59b4a5886436462ef5.html#b-ac48174c90bea1afc9f5e462","content":"[LAB 11 · 从 RGB 到像素：读出、FCN 与边界](/course/notebooks/9e268706471944e3a59e6f568f9ce9a3.html)","sha256":"f6dfd09a50caab375f02e0abcc3ff7a454ea579ed8eef0c35b95c95b0619c304","chapter":{"id":"course","title":"为什么同时训练 1×1 读出和 FCN · 实现代码"},"unit":{"id":"notebook-blocks/455f430e56104e59b4a5886436462ef5","title":"为什么同时训练 1×1 读出和 FCN · 实现代码"},"page":{"id":"reading-opening","title":"为什么同时训练 1×1 读出和 FCN · 实现代码","number":1},"sectionTitle":"为什么同时训练 1×1 读出和 FCN · 实现代码","currentQuestion":"为什么同时训练 1×1 读出和 FCN · 实现代码","sourceSlides":[],"knowledgeBlock":null,"formulas":[],"previousBlock":null,"nextBlock":"b-90df80f094e65ae74bf897fa","prerequisites":[],"relatedBlocks":[]},{"id":"b-90df80f094e65ae74bf897fa","type":"h1","scope":"document","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/455f430e56104e59b4a5886436462ef5.html#b-90df80f094e65ae74bf897fa","content":"# 为什么同时训练 1×1 读出和 FCN · 实现代码","sha256":"c6599d0453d8050b08273595154d70d0fbabb6dcd52b892c8b9156b9a528ee36","chapter":{"id":"course","title":"为什么同时训练 1×1 读出和 FCN · 实现代码"},"unit":{"id":"notebook-blocks/455f430e56104e59b4a5886436462ef5","title":"为什么同时训练 1×1 读出和 FCN · 实现代码"},"page":{"id":"reading-opening","title":"为什么同时训练 1×1 读出和 FCN · 实现代码","number":1},"sectionTitle":"为什么同时训练 1×1 读出和 FCN · 实现代码","currentQuestion":"为什么同时训练 1×1 读出和 FCN · 实现代码","sourceSlides":[],"knowledgeBlock":null,"formulas":[],"previousBlock":"b-ac48174c90bea1afc9f5e462","nextBlock":"b-66542120101cbf8720cb9afb","prerequisites":[{"id":"b-ac48174c90bea1afc9f5e462","url":"#b-ac48174c90bea1afc9f5e462","role":"problem-context"}],"relatedBlocks":[]},{"id":"b-66542120101cbf8720cb9afb","type":"p","scope":"document","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/455f430e56104e59b4a5886436462ef5.html#b-66542120101cbf8720cb9afb","content":"按问题继续","sha256":"e91f24e4e4ca40e2099a0d81d30db6568f4bf2074b499eeee6e3959617bd97ac","chapter":{"id":"course","title":"为什么同时训练 1×1 读出和 FCN · 实现代码"},"unit":{"id":"notebook-blocks/455f430e56104e59b4a5886436462ef5","title":"为什么同时训练 1×1 读出和 FCN · 实现代码"},"page":{"id":"reading-opening","title":"为什么同时训练 1×1 读出和 FCN · 实现代码","number":1},"sectionTitle":"为什么同时训练 1×1 读出和 FCN · 实现代码","currentQuestion":"为什么同时训练 1×1 读出和 FCN · 实现代码","sourceSlides":[],"knowledgeBlock":null,"formulas":[],"previousBlock":"b-90df80f094e65ae74bf897fa","nextBlock":"b-60d4a821ff7d2b91ee28acd5","prerequisites":[{"id":"b-90df80f094e65ae74bf897fa","url":"#b-90df80f094e65ae74bf897fa","role":"section-title"},{"id":"b-ac48174c90bea1afc9f5e462","url":"#b-ac48174c90bea1afc9f5e462","role":"problem-context"}],"relatedBlocks":[]},{"id":"b-60d4a821ff7d2b91ee28acd5","type":"p","scope":"document","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/455f430e56104e59b4a5886436462ef5.html#b-60d4a821ff7d2b91ee28acd5","content":"前景/背景/mIoU口径、RGB到mask训练、FCN与1×1读出及边界","sha256":"6f0b115c3c32032428a4c0d5ec4791e16d6b63aa3d643457bed758bf6af2b765","chapter":{"id":"course","title":"为什么同时训练 1×1 读出和 FCN · 实现代码"},"unit":{"id":"notebook-blocks/455f430e56104e59b4a5886436462ef5","title":"为什么同时训练 1×1 读出和 FCN · 实现代码"},"page":{"id":"reading-opening","title":"为什么同时训练 1×1 读出和 FCN · 实现代码","number":1},"sectionTitle":"为什么同时训练 1×1 读出和 FCN · 实现代码","currentQuestion":"为什么同时训练 1×1 读出和 FCN · 实现代码","sourceSlides":[],"knowledgeBlock":null,"formulas":[],"previousBlock":"b-66542120101cbf8720cb9afb","nextBlock":"b-cca77dafe5019431fd8dc3e9","prerequisites":[{"id":"b-90df80f094e65ae74bf897fa","url":"#b-90df80f094e65ae74bf897fa","role":"section-title"},{"id":"b-ac48174c90bea1afc9f5e462","url":"#b-ac48174c90bea1afc9f5e462","role":"problem-context"}],"relatedBlocks":[]},{"id":"b-cca77dafe5019431fd8dc3e9","type":"pre","scope":"document","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/455f430e56104e59b4a5886436462ef5.html#b-cca77dafe5019431fd8dc3e9","content":"```\n%%writefile -a lab11_segmentation.py\ndef binary_metrics(pred,target):\n    ious=[]\n    for cls in [0,1]:\n        inter=((pred==cls)&(target==cls)).sum().item();union=((pred==cls)|(target==cls)).sum().item()\n        ious.append(inter/union)\n    return {'background_IoU':ious[0],'foreground_IoU':ious[1],'mIoU_two_classes':sum(ious)/2,\n            'pixel_accuracy':float((pred==target).float().mean()),'error_pixels':int((pred!=target).sum())}\n\ndef sampling_warmup(out):\n    mask=torch.zeros((8,8),dtype=torch.long);mask[2:6,3:7]=1\n    coarse=F.avg_pool2d(mask.float()[None,None],2)\n    nearest=F.interpolate(coarse,scale_factor=2,mode='nearest')[0,0]>=.5\n    bilinear=F.interpolate(coarse,scale_factor=2,mode='bilinear',align_corners=False)[0,0]>=.5\n    nm=binary_metrics(nearest,mask);bm=binary_metrics(bilinear,mask)\n    assert abs(nm['foreground_IoU']-2/3)<1e-12\n    assert abs(nm['background_IoU']-5/6)<1e-12\n    assert abs(nm['mIoU_two_classes']-.75)<1e-12 and nm['error_pixels']==8\n    # Bilinear interpolates probabilities/logits; categorical labels use nearest.\n    fig,axes=plt.subplots(1,4,figsize=(10,3))\n    for ax,data,title in zip(axes,[mask,coarse[0,0],nearest,bilinear],['Known mask','2x2 average','Nearest >=0.5','Bilinear >=0.5']):\n        ax.imshow(data,cmap='gray',vmin=0,vmax=1,interpolation='nearest');ax.set_title(title);ax.axis('off')\n    fig.tight_layout();fig.savefig(out/'sampling-warmup.png',dpi=150);plt.close(fig)\n    return {'nearest':nm,'bilinear_align_corners_false':bm,'identity':'known-mask resampling only; no image model'}\n\nclass PixelReadout(nn.Module):\n    \"\"\"A learned softmax regression at every RGB pixel; no spatial receptive field.\"\"\"\n    def __init__(self):super().__init__();self.readout=nn.Conv2d(3,3,1)\n    def forward(self,x,mode='bilinear'):return self.readout(x)\n\nclass SmallFCN(nn.Module):\n    def __init__(self):\n        super().__init__()\n        self.fine=nn.Sequential(nn.Conv2d(3,12,3,padding=1),nn.ReLU(),nn.Conv2d(12,12,3,padding=1),nn.ReLU())\n        self.coarse=nn.Sequential(nn.Conv2d(12,24,3,stride=2,padding=1),nn.ReLU(),nn.Conv2d(24,32,3,stride=2,padding=1),nn.ReLU(),nn.Conv2d(32,32,3,padding=1),nn.ReLU())\n        self.head=nn.Conv2d(32,3,1);self.skip=nn.Conv2d(12,3,1)\n    def forward(self,x,mode='bilinear'):\n        fine=self.fine(x);coarse_logits=self.head(self.coarse(fine))\n        kw={'align_corners':False} if mode=='bilinear' else {}\n        return F.interpolate(coarse_logits,size=x.shape[-2:],mode=mode,**kw)+self.skip(fine)\n\ndef with_ignore(masks):\n    masks=masks.clone();masks[:,0,:]=255;masks[:,-1,:]=255;masks[:,:,0]=255;masks[:,:,-1]=255\n    # A fixed small region represents missing annotation, not another semantic class.\n    masks[:,20:23,20:23]=255\n    return masks\n\n\n```","sha256":"35b26bb8eeec03243eb73037e44d9ec58aff583454c17a469db37c5b6bc94c1b","chapter":{"id":"course","title":"为什么同时训练 1×1 读出和 FCN · 实现代码"},"unit":{"id":"notebook-blocks/455f430e56104e59b4a5886436462ef5","title":"为什么同时训练 1×1 读出和 FCN · 实现代码"},"page":{"id":"reading-opening","title":"为什么同时训练 1×1 读出和 FCN · 实现代码","number":1},"sectionTitle":"为什么同时训练 1×1 读出和 FCN · 实现代码","currentQuestion":"为什么同时训练 1×1 读出和 FCN · 实现代码","sourceSlides":[],"knowledgeBlock":null,"formulas":[],"previousBlock":"b-60d4a821ff7d2b91ee28acd5","nextBlock":null,"prerequisites":[{"id":"b-90df80f094e65ae74bf897fa","url":"#b-90df80f094e65ae74bf897fa","role":"section-title"},{"id":"b-ac48174c90bea1afc9f5e462","url":"#b-ac48174c90bea1afc9f5e462","role":"problem-context"}],"relatedBlocks":[]}]}
