日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

手把手带你复现ICCV 2017经典论文—PyraNet

發(fā)布時間:2024/10/8 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 手把手带你复现ICCV 2017经典论文—PyraNet 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.


過去幾年發(fā)表于各大 AI 頂會論文提出的 400 多種算法中,公開算法代碼的僅占 6%,其中三分之一的論文作者分享了測試數(shù)據(jù),約 54% 的分享包含“偽代碼”。這是今年 AAAI 會議上一個嚴(yán)峻的報告。?人工智能這個蓬勃發(fā)展的領(lǐng)域正面臨著實(shí)驗(yàn)重現(xiàn)的危機(jī),就像實(shí)驗(yàn)重現(xiàn)問題過去十年來一直困擾著心理學(xué)、醫(yī)學(xué)以及其他領(lǐng)域一樣。最根本的問題是研究人員通常不共享他們的源代碼。?


可驗(yàn)證的知識是科學(xué)的基礎(chǔ),它事關(guān)理解。隨著人工智能領(lǐng)域的發(fā)展,打破不可復(fù)現(xiàn)性將是必要的。為此,PaperWeekly 聯(lián)手百度 PaddlePaddle 共同發(fā)起了本次論文有獎復(fù)現(xiàn),我們希望和來自學(xué)界、工業(yè)界的研究者一起接力,為 AI 行業(yè)帶來良性循環(huán)。


作者丨Dicint

學(xué)校丨北京信息科技大學(xué)

研究方向丨分割、推薦


Learning Feature Pyramids for Human Pose Estimation 是發(fā)表在 ICCV 2017 的工作,論文提出了一個新的特征金字塔模塊,在卷積網(wǎng)絡(luò)中學(xué)習(xí)特征金字塔,并修正了現(xiàn)有的網(wǎng)絡(luò)參數(shù)初始化方法,在人體姿態(tài)估計(jì)和圖像分類中都取得了很好的效果。




論文復(fù)現(xiàn)代碼:?


http://aistudio.baidu.com/?_=1540892031956#/projectdetail/29380


LSP數(shù)據(jù)集簡介


LSP && LSP_extended?


這個數(shù)據(jù)集是由 Flickr 上‘Volleyball’, ‘Badminton’, ‘Athletics’, ‘Baseball’, ‘Gymnastics’, ‘Parkour’, ‘Soccer’, ‘Tennis’(原數(shù)據(jù)集), ‘parkour’, ‘gymnastics’, and ‘a(chǎn)thletics’ (擴(kuò)展集)等標(biāo)簽所構(gòu)成。


每個圖片都由 Amazon Mechanical Turk 和類似的途徑標(biāo)注而來,并不高度準(zhǔn)確。這些圖片被縮放至每個人大約 150 px 長度進(jìn)行標(biāo)注,包含了 14 個節(jié)點(diǎn)。?


LSP 地址:

http://sam.johnson.io/research/lsp_dataset.zip?


LSP 樣本數(shù):2000 個(全身,單人)?


LSP_extended 地址:

http://sam.johnson.io/research/lspet_dataset.zip?


LSP_extended 樣本數(shù):10000 個(全身,單人)?


LSP && LSP_extended 共 12000 個標(biāo)注,節(jié)點(diǎn)是以下 14 個:?


{1. Right ankle 2. Right knee 3. Right hip 4. Left hip 5. Left knee 6.Left ankle 7.Right wrist 8. Right elbow 9. Right shoulder 10. Left shoulder 11. Left elbow 12. Left wrist 13. Neck 14. Head top}?


由于是單人數(shù)據(jù)集,該數(shù)據(jù)集的訓(xùn)練難度比多人數(shù)據(jù)集更簡單。


MPII數(shù)據(jù)集簡介


MPII 人體姿勢數(shù)據(jù)集是人體姿勢預(yù)估的一個 benchmark,數(shù)據(jù)集包括了超過 40k 人的 25000 張帶標(biāo)注圖片,這些圖片是從 YouTube video 中抽取出來的。在測試集中還收錄了身體部位遮擋、3D 軀干、頭部方向的標(biāo)注。?


MPII 地址:

http://human-pose.mpi-inf.mpg.de/#overview?


MPII 樣本數(shù):25000 個(單人、多人)?


包括以下 16 類標(biāo)注:?


{Head – 0, Neck – 1, Right Shoulder – 2, Right Elbow – 3, Right Wrist – 4, Left Shoulder – 5, Left Elbow – 6, Left Wrist – 7, Right Hip – 8, Right Knee – 9, Right Ankle – 10, Left Hip – 11, Left Knee – 12, Left Ankle – 13, Chest – 14, Background – 15}


數(shù)據(jù)集處理


MATLAB格式讀入


文件 joints.mat 是 MATLAB 數(shù)據(jù)格式,包含了一個以 x 坐標(biāo)、y 坐標(biāo)和一個表示關(guān)節(jié)可見性的二進(jìn)制數(shù)字所構(gòu)成的 3 x 14 x 10000 的矩陣。使用模塊 scipy.io 的函數(shù) loadmat 和 savemat 可以實(shí)現(xiàn)對 mat 數(shù)據(jù)的讀寫。讀入后對原始標(biāo)注進(jìn)行轉(zhuǎn)置,轉(zhuǎn)置目的是分離每個圖片的標(biāo)注。


import?scipy.io?as?sio
import?numpy?as?np
data?=?sio.loadmat(self.lsp_anno_path[count])
joints?=?data['joints']
joints?=?np.transpose(joints,?(2,?1,?0))


JSON格式讀入?


MPII 數(shù)據(jù)集是以 JSON 格式進(jìn)行的標(biāo)注,可以通過 JSON 庫進(jìn)行讀入。


import?json
anno?=?json.load(self.mpii_anno_pah)


將每個圖片打包成(圖片,標(biāo)注,bounding box)的形式,bounding box 即圖片大小,其目的是將大小不一的圖片處理成 256 x 256 的大小。


from?PIL?import?Image
for?idd,?joint_idd?in?enumerate(joints):
????image_name?=?"im%s.jpg"?%?str(idd?+?1).zfill(5)?if?count?else?"im%s.jpg"?%?str(idd?+?1).zfill(4)
????joint_id?=?idd?+?len(joints)?if?count?else?idd
????im_path?=?os.path.join(self.lsp_data_path[count],?image_name)
????im?=?Image.open(im_path)
????im?=?np.asarray(im)
????shape?=?im.shape
????bbox?=?[0,?0,?shape[1],?shape[0]]
????joint_dict[joint_id]?=?{'imgpath':?im_path,?'joints':?joint_idd,?'bbox':?bbox}


數(shù)據(jù)增強(qiáng)?


作者用到了幾種數(shù)據(jù)增強(qiáng)的手段:


  • 縮放 scale?

  • 旋轉(zhuǎn) rotate?

  • 翻轉(zhuǎn) flip?

  • 添加顏色噪聲 add color noise


縮放


讀入數(shù)據(jù)后,需要先把大小不一的標(biāo)注圖片統(tǒng)一轉(zhuǎn)換成 256 x 256。


對于 LSP 測試集,作者使用的是圖像的中心作為身體的位置,并直接以圖像大小來衡量身體大小。數(shù)據(jù)集里的原圖片是大小不一的(原圖尺寸存在 bbox 里),一般采取 crop 的方法有好幾種,比如直接進(jìn)行 crop,然后放大,這樣做很明顯會有丟失關(guān)節(jié)點(diǎn)的可能性。也可以先把圖片放在中間,然后將圖片縮放到目標(biāo)尺寸范圍內(nèi)原尺寸的可縮放的大小,然后四條邊還需要填充的距離,最后 resize 到應(yīng)有大小。?


這里采用的是先擴(kuò)展邊緣,然后放大圖片,再進(jìn)行 crop,這樣做能夠保證圖片中心處理后依然在中心位置,且沒有關(guān)節(jié)因?yàn)?crop 而丟失。注意在處理圖片的同時需要對標(biāo)注也進(jìn)行處理。?


要注意 OpenCV 和 PIL 讀入的 RGB 順序是不一樣的,在使用不同庫進(jìn)行處理時要轉(zhuǎn)換通道。


import?cv2
big_img?=?cv2.copyMakeBorder(img,?add,?add,?add,?add,?borderType?=?cv2.BORDER_CONSTANT,?value=self.pixel_means.reshape(-1))
#self.show(bimg)??
bbox?=?np.array(dic['bbox']).reshape(4,?).astype(np.float32)
bbox[:2]?+=?add
if?'joints'?in?dic:
????process(joints_anno)
objcenter?=?np.array([bbox[0]?+?bbox[2]?/?2.,?bbox[1]?+?bbox[3]?/?2.])
minx,?miny,?maxx,?maxy?=?compute(extend_border,?objcenter,?in_size,?out_size)
img?=?cv2.resize(big_img[min_y:?max_y,?min_x:?max_x,:],?(width,?height))


示例圖:?


?左:原圖,右:縮放后


示例圖的十四個標(biāo)注點(diǎn):?


(88.995834, 187.24898);(107.715065, 160.57408);(119.648575, 124.30561) (135.3259, 124.53958);(145.38748, 155.4263);(133.68799, 165.95587) (118.47862, 109.330215);(108.41703, 104.65042);(120.81852, 84.05927) (151.70525, 86.63316);(162.93677, 101.14057);(161.29883, 124.773575) (136.0279, 85.93119);(138.13379, 66.509995)


旋轉(zhuǎn)?


旋轉(zhuǎn)后點(diǎn)的坐標(biāo)需要通過一個旋轉(zhuǎn)矩陣來確定,在網(wǎng)上的開源代碼中,作者使用了以下矩陣的變換矩陣圍繞著 (x,y) 進(jìn)行任意角度的變換。



在 OpenCV 中可以使用:


cv2.getRotationMatrix2D((center_x,?center_y)?,?angle,?1.0)
newimg?=?cv2.warpAffine(img,?rotMat,?(width,?height))



得到轉(zhuǎn)換矩陣,并通過仿射變換得到旋轉(zhuǎn)后的圖像。而標(biāo)注點(diǎn)可以直接通過旋轉(zhuǎn)矩陣獲得對應(yīng)點(diǎn)。


rot?=?rotMat[:,?:?2]
add?=?np.array([rotMat[0][2],?rotMat[1][2]])
coor?=?np.dot(rot,?coor)?+?w


該部分代碼:


def?rotate(self,?img,?cord,?anno,?center):
????angle?=?random.uniform(45,?135)
????rotMat?=?cv2.getRotationMatrix2D((center[0],?center[1])?,?angle,?1.0)
????newimg?=?cv2.warpAffine(img,?rotMat,?(width,?height))
????for?i?in?range(n):
????????x,?y?=?anno[i][0],?anno[i][1]
????????coor?=?np.array([x,?y])
????????rot?=?rotMat[:,?:?2]
????????add?=?np.array([rotMat[0][2],?rotMat[1][2]])
????????coor?=?np.dot(rot,?coor)?+?add
????????label.append((coor[0],?coor[1]))
????newimg?=?newimg.transpose(2,?0,?1)
????train_data[cnt++]?=?newimg
????train_label[cnt++]?=?np.array(label)



翻轉(zhuǎn)


使用 OpenCV 中的 flip 進(jìn)行翻轉(zhuǎn),并對標(biāo)注點(diǎn)進(jìn)行處理。在 OpenCV 中 flip 函數(shù)的參數(shù)有 1 水平翻轉(zhuǎn)、0 垂直翻轉(zhuǎn)、-1 水平垂直翻轉(zhuǎn)三種。


def?flip(self,?img,?cod,?anno_valid,?symmetry):
????'''對圖片進(jìn)行翻轉(zhuǎn)'''
????newimg?=?cv2.flip(img,?1)
????train_data[counter]?=?newimg.transpose(2,?0,?1)
????'''處理標(biāo)注點(diǎn),symmetry是flip后所對應(yīng)的標(biāo)注,具體需要自己根據(jù)實(shí)際情況確定'''
????for?(l,?r)?in?symmetry:
????????cod[l],?cod[r]?=?cod[l],?cod[r]
????for?i?in?range(n):
????????label.append((cod[i][0],cod[i][1]))
????train_label[cnt++]?=?np.array(label)



添加顏色噪聲


我所采用的方法是直接添加 10% 高斯分布的顏色點(diǎn)作為噪聲。人為地?fù)p失部分通道信息也可以達(dá)到添加彩色噪聲的效果。


def?add_color_noise(self,?image,?percentage=0.1):
????noise_img?=?image?
????'''產(chǎn)生圖像大小10%的隨機(jī)點(diǎn)'''
????num?=?int(percentage*image.shape[0]*image.shape[1])
????'''添加噪聲'''
????for?i?in?range(num):?
????????x?=?np.random.randint(0,image.shape[0])?
????????y?=?np.random.randint(0,image.shape[1])?
????????for?j?in?range(3):
????????????noise_img[x,?y,?i]?=?noise_img[x,?y,?i]?+?random.gauss(2,4)
????????????noise_img[x,?y,?i]?=?255?if?noise_img[x,?y,?ch]?>?255?else?0
????return?noise_img



除此之外,以下數(shù)據(jù)增強(qiáng)的方法也很常見:


1. 從顏色上考慮,還可以做圖像亮度、飽和度、對比度變化、PCA Jittering(按照 RGB 三個顏色通道計(jì)算均值和標(biāo)準(zhǔn)差后在整個訓(xùn)練集上計(jì)算協(xié)方差矩陣,進(jìn)行特征分解,得到特征向量和特征值);?


2. 從圖像空間性質(zhì)上考慮,還可以使用隨機(jī)裁剪、平移;


3. 從噪聲角度,高斯噪聲、椒鹽噪聲、模糊處理;?


4. 從類別分布的角度,可以采用 label shuffle、Supervised Data Augmentation(海康威視 ILSVRC 2016 的 report)。?


在這個具體例子中,進(jìn)行數(shù)據(jù)增強(qiáng)的時候要考慮的是:1)形變會不會影響結(jié)果;2)會不會丟掉部分節(jié)點(diǎn)。


制作Paddle數(shù)據(jù)


使用 paddle.batch 批量讀入數(shù)據(jù),并制作成 Paddle 的數(shù)據(jù)格式。


reader?=?paddle.batch(self.read_record(test_list,?joint_dict,?
????????????????mode?=?'train'),?batch_size=1)
fluid.recordio_writer.convert_reader_to_recordio_file("./work/test_"??+?str(i)?+?"_test.recordio",?
????????????????feeder=feeder,?reader_creator=reader)?


其他數(shù)據(jù)相關(guān)內(nèi)容


論文的評價標(biāo)準(zhǔn)


PCK:檢測的關(guān)鍵點(diǎn)與其對應(yīng)的 groundtruth 之間的歸一化距離小于設(shè)定閾值的比例。在本篇論文中,作者將圖片中心作為身體的位置,并以圖片大小作為衡量身體尺寸的標(biāo)準(zhǔn)。?


PCK@0.2 on LSP && LSP-extended:以驅(qū)干直徑為歸一化標(biāo)準(zhǔn)。


PCKh@0.5 on MPII:以頭部為歸一化標(biāo)準(zhǔn)。


關(guān)于訓(xùn)練的過擬合搶救


對于容易過擬合的數(shù)據(jù),數(shù)據(jù)增強(qiáng)是比較重要的,訓(xùn)練的時候?qū)W習(xí)率需要不能太大,當(dāng)一次訓(xùn)練過擬合后,可以從 loss 曲線波動的地方回溯到較為平穩(wěn)的點(diǎn),并以平穩(wěn)點(diǎn)的學(xué)習(xí)率為起點(diǎn),以更低的學(xué)習(xí)率接上上次學(xué)習(xí)。


關(guān)于PaddlePaddle


查了一下資料,PaddlePaddle 最早在 16 年就已經(jīng)對外開放,然而可能因?yàn)楸救巳腴T做機(jī)器學(xué)習(xí)時間較晚有關(guān),在復(fù)現(xiàn)活動之前,我只是聽過有一個開源深度學(xué)習(xí)平臺而不知道其名字。


從官方開源的一些 demo 項(xiàng)目來講,對推薦和文本處理方面的應(yīng)用比較友好,搜索相關(guān)關(guān)鍵字也能獲得很多入門的博客、在不同環(huán)境的安裝指南,官方甚至還做了教學(xué)視頻。


據(jù)說當(dāng)前版本的 Fluid 在編寫邏輯上和過去的版本已經(jīng)有了很大的區(qū)別,在使用上直觀的感受是和 TensorFlow 有一定的相似性。


但由于不熟悉這個框架,也會遇到一些問題:一開始在 AI 開放平臺上找了半天沒找到文檔入口,在搜索引擎上才發(fā)現(xiàn)有另一個 paddlepaddle.org 的入口;當(dāng)一些算子的名字和其他框架不太一樣的時候,不太容易從文檔里找到;不清楚不同版本之間的區(qū)別(能跑就行?);官網(wǎng)介紹對大規(guī)模計(jì)算友好、對可視化的支持均沒有體驗(yàn);Notebook 非常容易崩等問題等等……


盡管如此,在使用一定時間后,我覺得還是覺得挺方便的。這個框架的使用群體目前并不多,對大公司來講大家都有內(nèi)部各自對 TensorFlow 的封裝性優(yōu)化平臺,對入門者而言往往又不是那么首選.


從個人學(xué)習(xí)路徑來講,我覺得就 TensorFlow 和現(xiàn)在流行的 PyTorch 而言,前者是業(yè)界工程依賴程度高,后者是研究者使用方便,PaddlePaddle 需要有一個清晰的受眾定位和有效的推廣機(jī)制。




點(diǎn)擊標(biāo)題查看更多論文解讀:?


  • 經(jīng)典論文復(fù)現(xiàn) | 基于深度學(xué)習(xí)的圖像超分辨率重建

  • 經(jīng)典論文復(fù)現(xiàn) | LSGAN:最小二乘生成對抗網(wǎng)絡(luò)

  • PyraNet:基于特征金字塔網(wǎng)絡(luò)的人體姿態(tài)估計(jì)

  • 經(jīng)典論文復(fù)現(xiàn) | InfoGAN:一種無監(jiān)督生成方法

  • 經(jīng)典論文復(fù)現(xiàn) | ICML 2017大熱論文:Wasserstein GAN




#投 稿 通 道#

?讓你的論文被更多人看到?



如何才能讓更多的優(yōu)質(zhì)內(nèi)容以更短路徑到達(dá)讀者群體,縮短讀者尋找優(yōu)質(zhì)內(nèi)容的成本呢??答案就是:你不認(rèn)識的人。


總有一些你不認(rèn)識的人,知道你想知道的東西。PaperWeekly 或許可以成為一座橋梁,促使不同背景、不同方向的學(xué)者和學(xué)術(shù)靈感相互碰撞,迸發(fā)出更多的可能性。?


PaperWeekly 鼓勵高校實(shí)驗(yàn)室或個人,在我們的平臺上分享各類優(yōu)質(zhì)內(nèi)容,可以是最新論文解讀,也可以是學(xué)習(xí)心得技術(shù)干貨。我們的目的只有一個,讓知識真正流動起來。


??來稿標(biāo)準(zhǔn):

? 稿件確系個人原創(chuàng)作品,來稿需注明作者個人信息(姓名+學(xué)校/工作單位+學(xué)歷/職位+研究方向)?

? 如果文章并非首發(fā),請?jiān)谕陡鍟r提醒并附上所有已發(fā)布鏈接?

? PaperWeekly 默認(rèn)每篇文章都是首發(fā),均會添加“原創(chuàng)”標(biāo)志


? 投稿郵箱:

? 投稿郵箱:hr@paperweekly.site?

? 所有文章配圖,請單獨(dú)在附件中發(fā)送?

? 請留下即時聯(lián)系方式(微信或手機(jī)),以便我們在編輯發(fā)布時和作者溝通




?


現(xiàn)在,在「知乎」也能找到我們了

進(jìn)入知乎首頁搜索「PaperWeekly」

點(diǎn)擊「關(guān)注」訂閱我們的專欄吧



關(guān)于PaperWeekly


PaperWeekly 是一個推薦、解讀、討論、報道人工智能前沿論文成果的學(xué)術(shù)平臺。如果你研究或從事 AI 領(lǐng)域,歡迎在公眾號后臺點(diǎn)擊「交流群」,小助手將把你帶入 PaperWeekly 的交流群里。


▽ 點(diǎn)擊 |?閱讀原文?| 收藏復(fù)現(xiàn)代碼

總結(jié)

以上是生活随笔為你收集整理的手把手带你复现ICCV 2017经典论文—PyraNet的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。