
嵌入式AI硬件
原文:
https://new.qq.com/omn/20210826/20210826A06VH900.html

8月25日凌晨,曾推出“全球最大”的AI芯片Wafer Scale Engine(以下簡(jiǎn)稱“WSE”)的芯片初創(chuàng)公司CerebrasSystems,宣布推出了世界上第一個(gè)人類大腦規(guī)模的AI解決方案——CS-2 AI計(jì)算機(jī),可支持超過(guò)120萬(wàn)億參數(shù)規(guī)模的訓(xùn)練。相比之下,人類大腦大約有100萬(wàn)億個(gè)突觸。此外,Cerebras還實(shí)現(xiàn)了192臺(tái)CS-2 AI計(jì)算機(jī)近乎線性的擴(kuò)展,從而打造出包含高達(dá)1.63億個(gè)核心的計(jì)算集群。
資料顯示,Cerebras成立于2016年,迄今在14個(gè)國(guó)家擁有超過(guò)350位工程師,2019年Cerebras推出了世界最大AI芯片WSE,2020年Cerebras又推出了新一代的7nm的WSE-2,晶體管數(shù)量達(dá)到2.6萬(wàn)億個(gè),震驚業(yè)界。
根據(jù)官方公布的數(shù)據(jù),WSE-2與上一代一樣,依然是基于一整張12吋晶圓制造,面積依然是462.25平方厘米,但是制程工藝由臺(tái)積電16nm工藝提升到了7nm工藝,這也使得WSE-2的晶體管數(shù)量提高到了2.6萬(wàn)億個(gè),同時(shí)他的人工智能內(nèi)核數(shù)量也達(dá)到了85萬(wàn)個(gè),打破首代WSE 處理器創(chuàng)造的世界紀(jì)錄。無(wú)論是核心數(shù)還是片上內(nèi)存容量均遠(yuǎn)高于迄今性能最強(qiáng)的GPU。
原文:
https://baijiahao.baidu.com/s?id=1708971331548164815&wfr=spider&for=pc

集微網(wǎng)消息,據(jù)網(wǎng)易科技報(bào)道,日前,嘉楠科技與全年齡段智慧教育解決方案提供商閃現(xiàn)智能合作,并且已經(jīng)進(jìn)入產(chǎn)品開(kāi)發(fā)階段。
閃現(xiàn)智能基于勘智K210芯片開(kāi)發(fā)了多款智能教育硬件產(chǎn)品,包括AI教育核心板、傳感器拓展板和自動(dòng)駕駛拓展小車等,將逐步落地西安高校和職教智能硬件市場(chǎng)。通過(guò)K210芯片和板載資源,教育核心板可支持離線實(shí)現(xiàn)機(jī)器學(xué)習(xí)、形狀識(shí)別、動(dòng)物識(shí)別、戴口罩識(shí)別、交通標(biāo)志識(shí)別、智能家居、指南針、水平儀、環(huán)境監(jiān)測(cè)和成語(yǔ)填充等多項(xiàng)功能。
據(jù)了解,勘智K210芯片采用RISC-V處理器架構(gòu),具備視聽(tīng)一體、自主IP核與可編程能力強(qiáng)三大特點(diǎn),支持機(jī)器視覺(jué)與機(jī)器聽(tīng)覺(jué)多模態(tài)識(shí)別,可廣泛應(yīng)用于智能家居、智能園區(qū)、智能能耗和智能農(nóng)業(yè)等場(chǎng)景。
原文:
https://baijiahao.baidu.com/s?id=1708938332878219718&wfr=spider&for=pc
AI芯片研究領(lǐng)域的蘋(píng)芯科技已完成紅點(diǎn)中國(guó)領(lǐng)投,真格基金、紅杉資本跟投的近千萬(wàn)美元Pre-A輪融資,據(jù)悉,本輪融資將主要用于芯片研發(fā)相關(guān)工作。蘋(píng)芯科技的天使輪股東包括普華資本,紅杉資本等。
蘋(píng)芯科技成立于2021年2月,公司總部位于北京,是一家基于存算一體技術(shù)的打造面向AI加速器芯片的創(chuàng)業(yè)公司,提供基于存算一體技術(shù)的用于提升深度學(xué)習(xí)計(jì)算性能的硬件單元和相關(guān)IC設(shè)計(jì)服務(wù)。公司在北京、臺(tái)灣、新加坡等地設(shè)有研發(fā)團(tuán)隊(duì)及辦公室,希望利用各地資源優(yōu)勢(shì),推動(dòng)全球化發(fā)展戰(zhàn)略。
其產(chǎn)品主要用于可穿戴設(shè)備、無(wú)人機(jī)攝像頭、安防領(lǐng)域、機(jī)器人領(lǐng)域、智能家居等低能耗、長(zhǎng)待機(jī)的場(chǎng)景。
傳統(tǒng)的芯片架構(gòu)基于馮諾依曼架構(gòu),計(jì)算單元和存儲(chǔ)單元物理上分離,存儲(chǔ)單元的帶寬速度低于計(jì)算單元,限制了系統(tǒng)的整體性能;此外,數(shù)據(jù)傳輸過(guò)程會(huì)帶來(lái)延遲和性能消耗,且這種消耗能達(dá)到70%~90%以上。隨著AI算法的持續(xù)升級(jí)與AI應(yīng)用的持續(xù)普及,AI領(lǐng)域迫切需要性能更強(qiáng)、功耗更低、成本更低的芯片。
原文:
https://baijiahao.baidu.com/s?id=1708794510144411423&wfr=spider&for=pc

近日的特斯拉AI日活動(dòng)上,特斯拉公布了最新的AI訓(xùn)練芯片“D1”,規(guī)模龐大,令人稱奇。
該芯片采用臺(tái)積電7nm工藝制造,核心面積達(dá)645平方毫米,僅次于NVIDIA Ampere架構(gòu)的超級(jí)計(jì)算核心A100(826平方毫米)、AMD CDNA2架構(gòu)的下代計(jì)算核心Arcturus(750平方毫米左右),集成了多達(dá)500億個(gè)晶體管,相當(dāng)于Intel Ponte Vecchio計(jì)算芯片的一半。
其內(nèi)部走線,長(zhǎng)度超過(guò)11英里,也就是大約18公里。
原文:
https://www.jiemian.com/article/6530725.html

當(dāng)人工智能(AI)加速芯片已成為大型科技公司標(biāo)配后,老牌科技公司IBM亦給出回應(yīng)。在本周舉行的芯片行業(yè)會(huì)議HotChips上,IBM正式公布新款處理器“Telum”,Telum是IBM首款具有芯片上AI加速功能的處理器,用于IBM下一代Z系列大型機(jī)和LinuxONE服務(wù)器。
IBM Telum包含8個(gè)處理器核心,頻率超過(guò)5GHz,每個(gè)核都由重新設(shè)計(jì)的32MB專用2級(jí)緩存支持。該處理器采用三星7納米制程工藝,并且單芯片內(nèi)采用17層金屬連接,來(lái)完成高密度電路互連,總線長(zhǎng)可達(dá)約30公里。
為了支持AI加速處理性能,新處理器面積為530平方毫米,集成多達(dá)225億個(gè)晶體管,并擁有全新的分支預(yù)測(cè)、緩存,支持多芯片一致性互連,性能提升超過(guò)40%。
此外,IBM Z Telum處理器還采用雙向環(huán)形互連拓?fù)浣Y(jié)構(gòu),帶寬接近320GB/s。三級(jí)緩存所有核心共享,通過(guò)二級(jí)緩存與核心相連,平均延遲達(dá)到12納秒(1納秒等于10的負(fù)9次方秒)。
IBM稱,新處理器通過(guò)芯片內(nèi)深度學(xué)習(xí)推理(Inference) ,幫助即時(shí)解決金融客戶解決欺詐等問(wèn)題,從而不需要將數(shù)據(jù)轉(zhuǎn)移至芯片外。AI計(jì)算大致分為兩個(gè)層面,首先是對(duì)模型進(jìn)行訓(xùn)練(training),整個(gè)過(guò)程可能耗時(shí)數(shù)天或數(shù)周;之后是訓(xùn)練出的模型做出推理。
實(shí)際上,在芯片內(nèi)集成和加強(qiáng)AI能力,IBM與英特爾思路一致,兩者均強(qiáng)調(diào)增強(qiáng)芯片的AI計(jì)算能力作為賣(mài)點(diǎn)。例如英特爾推出的第三代至強(qiáng)服務(wù)器芯片,在深度學(xué)習(xí)方面增加了最新深度學(xué)習(xí)加速指令集,提高AI處理速度和模型計(jì)算精度。
IBM稱,其人工智能硬件研究中心花了3年的時(shí)間研發(fā)打造出Telum處理器。打造出第一款結(jié)合AI加速推論功能的處理器芯片,用于大型機(jī)上時(shí),可以協(xié)助銀行解決詐騙、高頻交易等金融難,預(yù)計(jì)2022年上半年采用該芯片的大型機(jī)系統(tǒng)將會(huì)推出。
AI熱點(diǎn)新聞
鏈接:
https://www.163.com/dy/article/GID7KKQF05312NX9.html
數(shù)字經(jīng)濟(jì)正從數(shù)字化邁向智能化新階段,未來(lái)十年,智能經(jīng)濟(jì)將成為產(chǎn)業(yè)發(fā)展的核心。在百度創(chuàng)始人、董事長(zhǎng)兼首席執(zhí)行官李彥宏看來(lái),“產(chǎn)業(yè)智能化在每一個(gè)領(lǐng)域都會(huì)發(fā)生。”物聯(lián)網(wǎng)、云計(jì)算等技術(shù)的發(fā)展方向全部指向了智能化,“人工智能+”逐漸成為產(chǎn)業(yè)結(jié)構(gòu)升級(jí)的驅(qū)動(dòng)力。在智能化產(chǎn)業(yè)趨勢(shì)下,利用人工智能進(jìn)行芯片設(shè)計(jì)也逐漸成為行業(yè)研究的熱門(mén)方向。
早在2020年4月,谷歌AI團(tuán)隊(duì)便描述了一種基于機(jī)器學(xué)習(xí)的芯片設(shè)計(jì)方法。Google Brain總監(jiān)Jeff Dean指出,某些情況下,機(jī)器學(xué)習(xí)會(huì)做出比人類更加精準(zhǔn)的決策,例如規(guī)劃芯片中的電路布局。該技術(shù)能夠極大地縮減研發(fā)設(shè)計(jì)周期,自動(dòng)生成芯片布局方案,并且在功耗、性能和芯片面積(PPA)等關(guān)鍵參數(shù)指標(biāo)上都有不俗的表現(xiàn)。
而前段時(shí)間,據(jù)Wired報(bào)道顯示,三星(Samsung)下一代Exynos處理器將采用AI進(jìn)行芯片設(shè)計(jì),人工智能設(shè)計(jì)軟件(DSO.ai)由新思科技(Synopsys)提供。這些芯片在設(shè)計(jì)完成并量產(chǎn)后,將會(huì)運(yùn)用到三星智能手機(jī)、平板電腦中,并且有部分還將供貨給國(guó)產(chǎn)手機(jī)廠商。這就意味著,未來(lái)我們將有機(jī)會(huì)用上搭載由人工智能進(jìn)行芯片設(shè)計(jì)的智能終端產(chǎn)品。
事實(shí)上,在利用AI設(shè)計(jì)芯片方面,三星只能算后來(lái)者。谷歌TPU(張量處理單元)采用人工智能優(yōu)化;英偉達(dá)利用人工智能技術(shù)生產(chǎn)GPU和云計(jì)算TPU平臺(tái)。這無(wú)疑都在傳遞同一個(gè)信號(hào),即芯片設(shè)計(jì)即將走向人工智能時(shí)代。
鏈接:
https://www.163.com/dy/article/GICTO8T50527AQ4N.html
8月26日,上汽集團(tuán)宣布正式成立商用車智能駕駛科創(chuàng)公司上海友道智途科技公司,將以港口、廠區(qū)等特定場(chǎng)景作為L(zhǎng)4級(jí)自動(dòng)駕駛技術(shù)和L3自動(dòng)駕駛技術(shù)的應(yīng)用切入點(diǎn),也就是說(shuō),L4和L3級(jí)自動(dòng)駕駛技術(shù),將會(huì)在港口與廠區(qū)落地。

此次,上汽集團(tuán)商用車智能駕駛科創(chuàng)公司計(jì)劃落地在中國(guó)(上海)自由貿(mào)易試驗(yàn)區(qū)臨港新片區(qū),打造“技術(shù)+產(chǎn)品+運(yùn)營(yíng)”的全新業(yè)務(wù)模式。不久的未來(lái),是不是遍地都是威震天、擎天柱了呢?我們拭目以待。
原文:
https://www.bbc.com/zhongwen/simp/57969896

人工智能被用來(lái)預(yù)測(cè)人體產(chǎn)生的幾乎每一種蛋白質(zhì)的結(jié)構(gòu)。
這一重大科研發(fā)展能夠加速推進(jìn)研發(fā)治療疾病的新藥物,還能用在其他許多地方。
蛋白質(zhì)是所有生物有機(jī)體的組成部分,我們體內(nèi)的每一個(gè)細(xì)胞都充滿蛋白質(zhì)。
了解蛋白質(zhì)的結(jié)構(gòu)和形狀對(duì)醫(yī)藥研究的進(jìn)步至關(guān)重要,但是到現(xiàn)在為止,我們只研究出少數(shù)蛋白質(zhì)的構(gòu)造。
研究人員用一個(gè)名為“AlphaFold”的人工智能軟件來(lái)預(yù)測(cè)人體和其他有機(jī)體的35萬(wàn)種蛋白質(zhì)的結(jié)構(gòu)。
人類蛋白質(zhì)如何組成是由我們體內(nèi)的基因組決定,也就是人類細(xì)胞核里面的遺傳物質(zhì)DNA,能夠決定大約兩萬(wàn)種蛋白質(zhì)。
“AlphaFold”的人工智能軟件是谷歌旗下的DeepMind人工智能公司開(kāi)發(fā)的,該公司共同創(chuàng)辦人兼首席執(zhí)行官哈薩比斯(Demis Hassabis)表示,這是迄今為止人類蛋白質(zhì)最完整、最準(zhǔn)確的圖像。
人工智能破解生物學(xué)最大謎團(tuán)之一的意義所在
新冠疫情:人工智能算法能“聽(tīng)咳嗽聲音辨識(shí)新冠病毒
“我們認(rèn)為這代表了人工智能對(duì)科學(xué)知識(shí)進(jìn)展所做的最大貢獻(xiàn)?!?他表示,這是人工智能有助于社會(huì)的最佳范例,未來(lái)還會(huì)有更多激勵(lì)人心的發(fā)展。
有趣的開(kāi)源項(xiàng)目
原文:
https://baijiahao.baidu.com/s?id=1694900288211624038&wfr=spider&for=pc

斯皮爾伯格指導(dǎo)的電影《頭號(hào)玩家》相信大家都不陌生,電影中高度成熟發(fā)達(dá)的VR(虛擬現(xiàn)實(shí))技術(shù)是每一位科技愛(ài)好者都會(huì)憧憬的場(chǎng)景,誰(shuí)又不想在這個(gè)光怪陸離的世界里來(lái)一場(chǎng)驚心動(dòng)魄的冒險(xiǎn)之旅呢~
在眾多VR技術(shù)的難題當(dāng)中,如何讓高質(zhì)量VR應(yīng)用在資源及功耗受限的移動(dòng)設(shè)備上部署成為可能是一大關(guān)鍵。
而近日,來(lái)自UIUC(伊利諾伊大學(xué)厄班納香檳分校)和FRL(Facebook Reality Labs)Research的研究人員發(fā)表了題為《F-CAD: A Framework to Explore Hardware Accelerators for Codec Avatar Decoding》的論文,為移動(dòng)終端設(shè)備部署新一代高擬真VR人像應(yīng)用提供硬件加速器設(shè)計(jì)方案。

論文鏈接:https://arxiv.org/abs/2103.04958
原文:
https://mp.weixin.qq.com/s/hw65luLEaQ1pI0e0SuZovQ
來(lái)自阿里安全人工智能治理與可持續(xù)發(fā)展實(shí)驗(yàn)室(AAIG)等機(jī)構(gòu)的研究者提出了一個(gè)新的機(jī)制來(lái)生成對(duì)抗樣本,即與增加對(duì)抗擾動(dòng)相反,他們通過(guò)扔掉一些不可察覺(jué)的圖像細(xì)節(jié)來(lái)生成對(duì)抗樣本。這項(xiàng)研究成果已被 AI 頂會(huì) ICCV 2021 收錄。
人類擁有很強(qiáng)的抽象能力和聯(lián)想力,例如一個(gè)有幾塊積木拼成的樂(lè)高玩具,小朋友也能輕易認(rèn)出其中描述的場(chǎng)景 (人開(kāi)著小車)。甚至幾個(gè)像素,玩家也可以輕易認(rèn)出這是一個(gè)戴著帽子的小人 (超級(jí)瑪麗奧)。

盡管我們期望模型能具有和人相當(dāng)?shù)哪芰Γ恰赋橄竽芰Α箤?duì)于模型來(lái)說(shuō),在當(dāng)前顯然還是一個(gè)相當(dāng)具有挑戰(zhàn)性的任務(wù)。但相反的,如果我們從對(duì)抗樣本的角度來(lái)考慮:存不存在一種可能,如果我們?nèi)サ魣D片中一些對(duì)模型來(lái)說(shuō)關(guān)鍵而微小的特征,模型就無(wú)法再正確識(shí)別這些圖片?感興趣的大家可以查看原文,文章的創(chuàng)新一定會(huì)給大家提供非常好的思路。
原文:
https://mp.weixin.qq.com/s/SSvtl1cy4eS8OSdvigkABg
本文是對(duì)發(fā)表于計(jì)算機(jī)視覺(jué)領(lǐng)域的頂級(jí)會(huì)議 ICCV 2021的論文“Simpler is Better: Few-shot Semantic Segmentation with Classifier Weight Transformer(簡(jiǎn)而優(yōu):用分類器變換器進(jìn)行小樣本語(yǔ)義分割)”的解讀。
該論文由英國(guó)薩里大學(xué)Centre for Vision, Speech and Signal Processing (CVSSP)發(fā)表,針對(duì)小樣本語(yǔ)義分割問(wèn)題,提出一種更加簡(jiǎn)潔的元學(xué)習(xí)范式,即只對(duì)分類器進(jìn)行元學(xué)習(xí),對(duì)特征編碼解碼器采用常規(guī)分割模型訓(xùn)練方式。元學(xué)習(xí)訓(xùn)練后的Classifier Weight Transformer使分類器可以動(dòng)態(tài)地適應(yīng)測(cè)試樣本,從而提高分割準(zhǔn)確率。

Simpler is Better: Few-shot Semantic Segmentation with Classifier Weight Transformer
論文:https://arxiv.org/abs/2108.03032
代碼:https://github.com/zhiheLu/CWT-for-FSS
原文:
https://mp.weixin.qq.com/s/HgcyVs8eQfrQ4tWsFUo02g
李飛飛團(tuán)隊(duì)的機(jī)器人模擬訓(xùn)練場(chǎng)2.0版本來(lái)了!這個(gè)擁有超過(guò)8000個(gè)交互式場(chǎng)景的模擬環(huán)境iGibson,再次發(fā)生了進(jìn)化!

進(jìn)化之后的iGibson 2.0,核心就一句話:機(jī)器人們別抓小球兒了,來(lái)做家務(wù)吧!像是模擬環(huán)境中增加的溫度、濕度、切片等多種物理狀態(tài),環(huán)境信息已經(jīng)完事具備了,亟待各位機(jī)器人來(lái)個(gè)洗、切、炒菜一條龍服務(wù)。

人類還能通過(guò)VR進(jìn)入模擬環(huán)境,給機(jī)器人示范下如何做一個(gè)標(biāo)準(zhǔn)的家務(wù),那么現(xiàn)在,如果你已經(jīng)迫不及待的想看看具體的內(nèi)容,請(qǐng)點(diǎn)擊原文連接。
聊點(diǎn)技術(shù)
原文:
https://oldpan.me/archives/write-hard-nms-c
非極大值抑制算法(Non-maximum suppression, NMS)是有anchor系列目標(biāo)檢測(cè)的標(biāo)配,如今大部分的One-Stage和Two-Stage算法在推斷(Inference)階段都使用了NMS作為網(wǎng)絡(luò)的最后一層,例如YOLOv3、SSD、Faster-RCNN等。
當(dāng)然NMS在目前最新的anchor-free目標(biāo)檢測(cè)算法中(CornerNet、CenterNet等)并不是必須的,對(duì)這種檢測(cè)算法提升的精度也有限,但是這并不影響我們學(xué)習(xí)NMS。
NMS的本質(zhì)是搜索局部極大值,抑制非極大值元素,在目標(biāo)檢測(cè)中,我們經(jīng)常將其用于消除多余的檢測(cè)框(從左到右消除了重復(fù)的檢測(cè)框,只保留當(dāng)前最大confidence的檢測(cè)框):

NMS有很多種變體,這里介紹最為常見(jiàn)的Hard-NMS,我們通常所說(shuō)的NMS就是指Hard-NMS,還有另外一種NMS叫做Soft-NMS,是Hard-NMS的變體,兩者的代碼幾乎相同,只需要改動(dòng)一個(gè)地方。
Hard-NMS
Hard-NMS就是我們傳統(tǒng)意義上的NMS,也是最常用的NMS算法。
因?yàn)镹MS主要用于消除多余的檢測(cè)框,那么消除的標(biāo)準(zhǔn)是什么,我們使用IOU作為標(biāo)準(zhǔn)來(lái)進(jìn)行演示,IOU的原稱為Intersection over Union,也就是兩個(gè)box區(qū)域的交集比上并集,下圖可以方便理解:

具體介紹可以看這里:深度學(xué)習(xí)中IU、IoU(Intersection over Union)的概念理解以及python程序?qū)崿F(xiàn)。[https://oldpan.me/archives/iu-iou-intersection-over-union-python]
因?yàn)槲覀円謹(jǐn)]么,所以廢話不多說(shuō),直接開(kāi)始看代碼,首先使用Pytorch來(lái)看一篇:
1def hard_nms(box_scores, iou_threshold, top_k=-1, candidate_size=200):
2 """
3 Args:
4 box_scores (N, 5): box的集合,N為框的數(shù)量,5即4(位置信息)+1(可能為物體的概率)
5 iou_threshold: 我們用IOU標(biāo)準(zhǔn)去除多余檢測(cè)框的閾值
6 top_k: 保留多少個(gè)計(jì)算后留下來(lái)的候選框,如果為-1則全保留
7 candidate_size: 參與計(jì)算的boxes數(shù)量
8 Returns:
9 picked: 經(jīng)過(guò)nms計(jì)算后保留下來(lái)的box
10 """
11 scores = box_scores[:, -1] # 首先我們?nèi)〕鯾ox中的最后一個(gè)元素也就是當(dāng)前box檢測(cè)到物體的概率
12 boxes = box_scores[:, :-1] # 取出box中的四個(gè)坐標(biāo)(左上、右下)
13 picked = []
14 _, indexes = scores.sort(descending=True) # 按照降序排列所有的物體的概率,得到排序后在原數(shù)組中的索引信息 indexes
15 indexes = indexes[:candidate_size] # 只保留前 candidate_size 個(gè) boxes 其余的不考慮了
16 while len(indexes) > 0:
17 current = indexes[0] # 每次取出當(dāng)前在 indexes 中 檢測(cè)到物體概率最大的一個(gè)
18 picked.append(current.item()) # 將這個(gè)最大的存在結(jié)果中
19 if 0 < top_k == len(picked) or len(indexes) == 1:
20 break
21 current_box = boxes[current, :] # 當(dāng)前第一個(gè)也就是最高概率的box
22 indexes = indexes[1:]
23 rest_boxes = boxes[indexes, :] # 剩下其余的box
24 iou = iou_of( # 將當(dāng)前的box與剩下其余的boxes用IOU標(biāo)準(zhǔn)進(jìn)行篩選
25 rest_boxes,
26 current_box.unsqueeze(0),
27 )
28 indexes = indexes[iou <= iou_threshold]# 保留與當(dāng)前box的IOU小于一定閾值的boxes,
29
30 return box_scores[picked, :]
看了上面的代碼,我們可以知道大概的流程:
選取這類box中scores最大的那一個(gè),記為current_box,并保留它(為什么保留它,因?yàn)樗A(yù)測(cè)出當(dāng)前位置有物體的概率最大啊,對(duì)于我們來(lái)說(shuō)當(dāng)前confidence越大說(shuō)明當(dāng)前box中包含物體的可能行就越大)
計(jì)算current_box與其余的box的IOU
如果其IOU大于我們?cè)O(shè)定的閾值,那么就舍棄這些boxes(由于可能這兩個(gè)box表示同一目標(biāo),因此這兩個(gè)box的IOU就比較大,會(huì)超過(guò)我們?cè)O(shè)定的閾值,所以就保留分?jǐn)?shù)高的那一個(gè))
從最后剩余的boxes中,再找出最大scores的那一個(gè)(之前那個(gè)大的已經(jīng)保存到輸出的數(shù)組中,這個(gè)是從剩下的里面再挑一個(gè)最大的),如此循環(huán)往復(fù)
至于上述代碼中iou_of部分:
1def area_of(left_top, right_bottom) -> torch.Tensor:
2 """Compute the areas of rectangles given two corners.
3
4 Args:
5 left_top (N, 2): left top corner.
6 right_bottom (N, 2): right bottom corner.
7
8 Returns:
9 area (N): return the area.
10 """
11 hw = torch.clamp(right_bottom - left_top, min=0.0)
12 return hw[..., 0] * hw[..., 1]
13
14
15def iou_of(boxes0, boxes1, eps=1e-5):
16 """Return intersection-over-union (Jaccard index) of boxes.
17
18 Args:
19 boxes0 (N, 4): ground truth boxes.
20 boxes1 (N or 1, 4): predicted boxes.
21 eps: a small number to avoid 0 as denominator.
22 Returns:
23 iou (N): IoU values.
24 """
25 overlap_left_top = torch.max(boxes0[..., :2], boxes1[..., :2])
26 overlap_right_bottom = torch.min(boxes0[..., 2:], boxes1[..., 2:])
27
28 overlap_area = area_of(overlap_left_top, overlap_right_bottom)
29 area0 = area_of(boxes0[..., :2], boxes0[..., 2:])
30 area1 = area_of(boxes1[..., :2], boxes1[..., 2:])
31 return overlap_area / (area0 + area1 - overlap_area + eps)
手撕NMS
手撕代碼用什么撕,當(dāng)然是用C++撕,這才爽么!
直接看代碼,其中使用了OpenCV庫(kù)中的Point2f結(jié)構(gòu)體:
1// 這是一個(gè)模板函數(shù),接受一個(gè)已經(jīng)排好序的vector,然后降序返回其索引
2template <typename T>
3vector<int> sort_indexes(const vector<T> &v) {
4
5
6 vector<int> idx(v.size());
7 iota(idx.begin(), idx.end(), 0);
8 sort(idx.begin(), idx.end(),
9 [&v](int i1, int i2) {return v[i1] > v[i2];});
10 return idx;
11}
12// 這就是我們的NMS函數(shù) 輸入的坐標(biāo)已經(jīng)標(biāo)準(zhǔn)化,所有數(shù)值的范圍為 0-1
13/*
14* numBoxes:窗口數(shù)目
15* points:窗口左上角坐標(biāo)點(diǎn)
16* oppositePoints:窗口右下角坐標(biāo)點(diǎn)
17* score:窗口得分
18* overlapThreshold:重疊閾值控制
19* numBoxesOut:輸出窗口數(shù)目
20* pointsOut:輸出窗口左上角坐標(biāo)點(diǎn)
21* oppositePoints:輸出窗口右下角坐標(biāo)點(diǎn)
22* scoreOut:輸出窗口得分
23*/
24
25int nonMaximumSuppression(int numBoxes, const vector<Point2f>& points,
26 const vector<Point2f>& oppositePoints, const vector<float>& score,
27 float overlapThreshold,
28 int *numBoxesOut, vector<Point2f>& pointsOut,
29 vector<Point2f>& oppositePointsOut, vector<float>& scoreOut)
30{
31
32 const float eps = 1e-5;
33 int i, j, index;
34 float* box_area = (float*)malloc(numBoxes * sizeof(float)); // 定義窗口面積變量并分配空間
35 vector<int> indices;
36 int* is_suppressed = (int*)malloc(numBoxes * sizeof(int)); // 定義是否抑制表標(biāo)志并分配空間
37
38 // 初始化indices、is_supperssed、box_area信息
39 for (i = 0; i < numBoxes; i++)
40 {
41 indices.push_back(i);
42 is_suppressed[i] = 0;
43 box_area[i] = ((oppositePoints[i].x - points[i].x + eps) *
44 (oppositePoints[i].y - points[i].y + eps));
45 }
46
47 // 對(duì)輸入窗口按照分?jǐn)?shù)比值進(jìn)行排序,排序后的編號(hào)放在indices中
48 indices = sort_indexes(score);
49
50 for (i = 0; i < numBoxes; i++) // 循環(huán)所有窗口
51 {
52 if (!is_suppressed[indices[i]]) // 判斷窗口是否被抑制
53 {
54 for (j = i + 1; j < numBoxes; j++) // 循環(huán)當(dāng)前窗口之后的窗口
55 {
56 if (!is_suppressed[indices[j]]) // 判斷窗口是否被抑制
57 {
58 float x1max = max(points[indices[i]].x, points[indices[j]].x); // 求兩個(gè)窗口左上角x坐標(biāo)最大值
59 float x2min = min(oppositePoints[indices[i]].x, oppositePoints[indices[j]].x); // 求兩個(gè)窗口右下角x坐標(biāo)最小值
60 float y1max = max(points[indices[i]].y, points[indices[j]].y); // 求兩個(gè)窗口左上角y坐標(biāo)最大值
61 float y2min = min(oppositePoints[indices[i]].y, oppositePoints[indices[j]].y); // 求兩個(gè)窗口右下角y坐標(biāo)最小值
62 float overlapWidth = x2min - x1max + eps; // 計(jì)算兩矩形重疊的寬度
63 float overlapHeight = y2min - y1max + eps; // 計(jì)算兩矩形重疊的高度
64 if (overlapWidth > 0 && overlapHeight > 0)
65 {
66 float overlapPart = (overlapWidth * overlapHeight) / box_area[indices[j]]; // 計(jì)算重疊的比率
67 if (overlapPart > overlapThreshold) // 判斷重疊比率是否超過(guò)重疊閾值
68 {
69 is_suppressed[indices[j]] = 1; // 將窗口j標(biāo)記為抑制
70 }
71 }
72 }
73 }
74 }
75 }
76
77 *numBoxesOut = 0; // 初始化輸出窗口數(shù)目0
78 for (i = 0; i < numBoxes; i++)
79 {
80 if (!is_suppressed[i]) (*numBoxesOut)++; // 統(tǒng)計(jì)輸出窗口數(shù)目
81 }
82
83 for (i = 0; i < numBoxes; i++) // 遍歷所有輸入窗口
84 {
85 if (!is_suppressed[indices[i]]) // 將未發(fā)生抑制的窗口信息保存到輸出信息中
86 {
87 Point2f temp_xy(points[indices[i]].x, points[indices[i]].y);
88 Point2f temp_Opxy(oppositePoints[indices[i]].x, oppositePoints[indices[i]].y);
89 pointsOut.push_back(temp_xy);
90 oppositePointsOut.push_back(temp_Opxy);
91 scoreOut.push_back(score[indices[i]]);
92 }
93 }
94
95 indices.clear();
96 free(box_area); // 釋放box_area空間
97 free(is_suppressed); // 釋放is_suppressed空間
98
99 return 0;
100}
好了,代碼撕完了。
原文還提供了soft-NMS的手撕菜單,感興趣的同學(xué)可以點(diǎn)擊原文連接對(duì)比查看兩者之間的區(qū)別。

你可以添加微信17775982065為好友,注明:公司+姓名,拉進(jìn) RT-Thread 官方微信交流群!

?? 點(diǎn)擊閱讀原文進(jìn)入官網(wǎng)