{"version":2,"relationshipURLBase":"https://codingai-lec03.pages.dev/course/notebook-blocks/30839f038a25415ea1d0eb6e8fc1d456.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/30839f038a25415ea1d0eb6e8fc1d456.html","markdown":"https://codingai-lec03.pages.dev/course/notebook-blocks/30839f038a25415ea1d0eb6e8fc1d456.md","pages":[{"id":"reading-opening","title":"从共享特征到两个输出头 · 实现代码","unit":"从共享特征到两个输出头 · 实现代码","unitId":"notebook-blocks/30839f038a25415ea1d0eb6e8fc1d456","chapter":"course","number":1}],"aliases":[{"oldId":"b-074c65957caf15ec2c3703e9","targetId":"b-074c65957caf15ec2c3703e9","page":"reading-opening","operation":"move","beforeSHA256":"68ab73f0c1cbd872efb5dd565e57f07f1b4a2b56c5ea0ce2c6ed91ff60ff5a3f","afterSHA256":"68ab73f0c1cbd872efb5dd565e57f07f1b4a2b56c5ea0ce2c6ed91ff60ff5a3f","reason":"Same source body in authored semantic page"},{"oldId":"b-2fb74e8e78d4ef3392a209ee","targetId":"b-2fb74e8e78d4ef3392a209ee","page":"reading-opening","operation":"move","beforeSHA256":"137a0d10dfe56717d3a1522c441607a56c43245252ab45c379768b582327eaec","afterSHA256":"137a0d10dfe56717d3a1522c441607a56c43245252ab45c379768b582327eaec","reason":"Same source body in authored semantic page"},{"oldId":"b-82c1aa1be45941eca3f3f9de","targetId":"b-82c1aa1be45941eca3f3f9de","page":"reading-opening","operation":"move","beforeSHA256":"42cba31deccba2a350b9b23bd0ca1dcaa4c4c5cb9d35c773e1fcb89124788ccd","afterSHA256":"42cba31deccba2a350b9b23bd0ca1dcaa4c4c5cb9d35c773e1fcb89124788ccd","reason":"Same source body in authored semantic page"},{"oldId":"b-28a1a3d85ec4da69d9d93962","targetId":"b-28a1a3d85ec4da69d9d93962","page":"reading-opening","operation":"move","beforeSHA256":"b1c765d7bf903321abd36e75bae49048d61faec2aa3fd11922b328c5970003b1","afterSHA256":"b1c765d7bf903321abd36e75bae49048d61faec2aa3fd11922b328c5970003b1","reason":"Same source body in authored semantic page"},{"oldId":"b-c32dbfcc35c2cfd139d2798c","targetId":"b-c32dbfcc35c2cfd139d2798c","page":"reading-opening","operation":"move","beforeSHA256":"d248fdb1d8ed367c289941e0f3eb2ce08c9c0e843c28541e882f8d24050567f2","afterSHA256":"d248fdb1d8ed367c289941e0f3eb2ce08c9c0e843c28541e882f8d24050567f2","reason":"Same source body in authored semantic page"}],"blocks":[{"id":"b-074c65957caf15ec2c3703e9","type":"p","scope":"document","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/30839f038a25415ea1d0eb6e8fc1d456.html#b-074c65957caf15ec2c3703e9","content":"[LAB 10 · 从 RGB 图像训练小型检测器](/course/notebooks/a14237bfa9dd413d959ab4e458e11f42.html)","sha256":"68ab73f0c1cbd872efb5dd565e57f07f1b4a2b56c5ea0ce2c6ed91ff60ff5a3f","chapter":{"id":"course","title":"从共享特征到两个输出头 · 实现代码"},"unit":{"id":"notebook-blocks/30839f038a25415ea1d0eb6e8fc1d456","title":"从共享特征到两个输出头 · 实现代码"},"page":{"id":"reading-opening","title":"从共享特征到两个输出头 · 实现代码","number":1},"sectionTitle":"从共享特征到两个输出头 · 实现代码","currentQuestion":"从共享特征到两个输出头 · 实现代码","sourceSlides":[],"knowledgeBlock":null,"formulas":[],"previousBlock":null,"nextBlock":"b-2fb74e8e78d4ef3392a209ee","prerequisites":[],"relatedBlocks":[]},{"id":"b-2fb74e8e78d4ef3392a209ee","type":"h1","scope":"document","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/30839f038a25415ea1d0eb6e8fc1d456.html#b-2fb74e8e78d4ef3392a209ee","content":"# 从共享特征到两个输出头 · 实现代码","sha256":"137a0d10dfe56717d3a1522c441607a56c43245252ab45c379768b582327eaec","chapter":{"id":"course","title":"从共享特征到两个输出头 · 实现代码"},"unit":{"id":"notebook-blocks/30839f038a25415ea1d0eb6e8fc1d456","title":"从共享特征到两个输出头 · 实现代码"},"page":{"id":"reading-opening","title":"从共享特征到两个输出头 · 实现代码","number":1},"sectionTitle":"从共享特征到两个输出头 · 实现代码","currentQuestion":"从共享特征到两个输出头 · 实现代码","sourceSlides":[],"knowledgeBlock":null,"formulas":[],"previousBlock":"b-074c65957caf15ec2c3703e9","nextBlock":"b-82c1aa1be45941eca3f3f9de","prerequisites":[{"id":"b-074c65957caf15ec2c3703e9","url":"#b-074c65957caf15ec2c3703e9","role":"problem-context"}],"relatedBlocks":[]},{"id":"b-82c1aa1be45941eca3f3f9de","type":"p","scope":"document","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/30839f038a25415ea1d0eb6e8fc1d456.html#b-82c1aa1be45941eca3f3f9de","content":"主线阅读与优先实验","sha256":"42cba31deccba2a350b9b23bd0ca1dcaa4c4c5cb9d35c773e1fcb89124788ccd","chapter":{"id":"course","title":"从共享特征到两个输出头 · 实现代码"},"unit":{"id":"notebook-blocks/30839f038a25415ea1d0eb6e8fc1d456","title":"从共享特征到两个输出头 · 实现代码"},"page":{"id":"reading-opening","title":"从共享特征到两个输出头 · 实现代码","number":1},"sectionTitle":"从共享特征到两个输出头 · 实现代码","currentQuestion":"从共享特征到两个输出头 · 实现代码","sourceSlides":[],"knowledgeBlock":null,"formulas":[],"previousBlock":"b-2fb74e8e78d4ef3392a209ee","nextBlock":"b-28a1a3d85ec4da69d9d93962","prerequisites":[{"id":"b-2fb74e8e78d4ef3392a209ee","url":"#b-2fb74e8e78d4ef3392a209ee","role":"section-title"},{"id":"b-074c65957caf15ec2c3703e9","url":"#b-074c65957caf15ec2c3703e9","role":"problem-context"}],"relatedBlocks":[]},{"id":"b-28a1a3d85ec4da69d9d93962","type":"p","scope":"document","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/30839f038a25415ea1d0eb6e8fc1d456.html#b-28a1a3d85ec4da69d9d93962","content":"RGB图像、单特征层锚框检测器、分类/位置损失、NMS、独立检测评价","sha256":"b1c765d7bf903321abd36e75bae49048d61faec2aa3fd11922b328c5970003b1","chapter":{"id":"course","title":"从共享特征到两个输出头 · 实现代码"},"unit":{"id":"notebook-blocks/30839f038a25415ea1d0eb6e8fc1d456","title":"从共享特征到两个输出头 · 实现代码"},"page":{"id":"reading-opening","title":"从共享特征到两个输出头 · 实现代码","number":1},"sectionTitle":"从共享特征到两个输出头 · 实现代码","currentQuestion":"从共享特征到两个输出头 · 实现代码","sourceSlides":[],"knowledgeBlock":null,"formulas":[],"previousBlock":"b-82c1aa1be45941eca3f3f9de","nextBlock":"b-c32dbfcc35c2cfd139d2798c","prerequisites":[{"id":"b-2fb74e8e78d4ef3392a209ee","url":"#b-2fb74e8e78d4ef3392a209ee","role":"section-title"},{"id":"b-074c65957caf15ec2c3703e9","url":"#b-074c65957caf15ec2c3703e9","role":"problem-context"}],"relatedBlocks":[]},{"id":"b-c32dbfcc35c2cfd139d2798c","type":"pre","scope":"document","url":"https://codingai-lec03.pages.dev/course/notebook-blocks/30839f038a25415ea1d0eb6e8fc1d456.html#b-c32dbfcc35c2cfd139d2798c","content":"```\n%%writefile -a lab10_detector.py\nclass TinyAnchorDetector(nn.Module):\n    def __init__(self):\n        super().__init__()\n        self.backbone=nn.Sequential(nn.Conv2d(3,16,3,2,1),nn.ReLU(),nn.Conv2d(16,32,3,2,1),nn.ReLU(),\n                                    nn.Conv2d(32,48,3,1,1),nn.ReLU(),nn.Conv2d(48,48,3,1,1),nn.ReLU())\n        self.class_head=nn.Conv2d(48,2*3,3,padding=1);self.box_head=nn.Conv2d(48,2*4,3,padding=1)\n    def forward(self,x):\n        z=self.backbone(x);b=x.shape[0]\n        return self.class_head(z).permute(0,2,3,1).reshape(b,-1,3),self.box_head(z).permute(0,2,3,1).reshape(b,-1,4)\n\ndef detection_loss(logits,offsets,classes,targets):\n    ce=F.cross_entropy(logits.transpose(1,2),classes,ignore_index=-1,reduction='none')\n    positive=classes>0;chosen=positive.clone()\n    for i in range(len(classes)):\n        negatives=torch.where(classes[i]==0)[0]; k=min(len(negatives),max(12,3*int(positive[i].sum())))\n        chosen[i,negatives[torch.argsort(ce[i,negatives],descending=True)[:k]]]=True\n    cls=ce[chosen].mean()\n    loc=F.smooth_l1_loss(offsets[positive],targets[positive],reduction='mean') if positive.any() else offsets.sum()*0\n    return cls+3*loc,cls,loc\n\n@torch.no_grad()\ndef predict(model,images,anchors,score=.01,nms_iou=.35):\n    model.eval();result=[]\n    for batch in images.split(32):\n        logits,offsets=model(batch); probs=logits.softmax(-1)\n        for p,o in zip(probs,offsets):\n            boxes=decode(anchors,o); all_b=[];all_s=[];all_l=[]\n            for cls in [1,2]:\n                indices=torch.where(p[:,cls]>=score)[0]\n                keep=nms(boxes[indices],p[indices,cls],nms_iou);indices=indices[keep]\n                all_b.append(boxes[indices]);all_s.append(p[indices,cls]);all_l.append(torch.full((len(indices),),cls))\n            result.append({'boxes':torch.cat(all_b),'scores':torch.cat(all_s),'labels':torch.cat(all_l)})\n    return result\n\n\n```","sha256":"d248fdb1d8ed367c289941e0f3eb2ce08c9c0e843c28541e882f8d24050567f2","chapter":{"id":"course","title":"从共享特征到两个输出头 · 实现代码"},"unit":{"id":"notebook-blocks/30839f038a25415ea1d0eb6e8fc1d456","title":"从共享特征到两个输出头 · 实现代码"},"page":{"id":"reading-opening","title":"从共享特征到两个输出头 · 实现代码","number":1},"sectionTitle":"从共享特征到两个输出头 · 实现代码","currentQuestion":"从共享特征到两个输出头 · 实现代码","sourceSlides":[],"knowledgeBlock":null,"formulas":[],"previousBlock":"b-28a1a3d85ec4da69d9d93962","nextBlock":null,"prerequisites":[{"id":"b-2fb74e8e78d4ef3392a209ee","url":"#b-2fb74e8e78d4ef3392a209ee","role":"section-title"},{"id":"b-074c65957caf15ec2c3703e9","url":"#b-074c65957caf15ec2c3703e9","role":"problem-context"}],"relatedBlocks":[]}]}
