<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          基于Yolo-V3對衛(wèi)星圖像進行儲油罐容積占用率的研究

          共 20764字,需瀏覽 42分鐘

           ·

          2022-11-24 21:12


          點擊上方小白學視覺”,選擇加"星標"或“置頂

          重磅干貨,第一時間送達

          在1957年以前,地球上只有一顆天然衛(wèi)星:月球。1957年10月4日,蘇聯(lián)發(fā)射了世界上第一顆人造衛(wèi)星,從那時起,來自40多個國家大約有8900顆衛(wèi)星發(fā)射升空。
          這些衛(wèi)星可以幫助我們進行監(jiān)視、通信、導航等等。國家可以利用衛(wèi)星監(jiān)視另一個國家的土地及其動向,估計其經(jīng)濟和實力,然而所有的國家都互相隱瞞著他們的信息。
          同理,全球石油市場也并非完全透明,幾乎所有的產(chǎn)油國都在努力隱藏著自己的總產(chǎn)量、消費量和儲存量,各國這樣做是為了間接地向外界隱瞞其實際經(jīng)濟,并增強其國防系統(tǒng)的能力,這種做法可能會對其他國家造成威脅。
          出于這個原因,許多初創(chuàng)公司,如Planet和Orbital Insight,都通過衛(wèi)星圖像來關(guān)注各國的此類活動。通過收集儲油罐的衛(wèi)星圖像來估算石油儲量。
          但問題是,如何僅憑衛(wèi)星圖像來估計儲油罐的體積呢?首先第一個條件是儲油罐為浮頂油罐,因為只有這樣,衛(wèi)星才能檢測到。這種特殊類型的油罐是專門為儲存大量石油產(chǎn)品而設(shè)計的,如原油或凝析油,它由頂蓋組成,直接位于油的頂部,隨著油箱中油量的增加或下降,并在其周圍形成兩個陰影。如下圖所示,陰影位于北側(cè)
          (外部陰影)是指儲罐的總高度,而儲罐內(nèi)的陰影(內(nèi)部陰影)表示浮頂?shù)纳疃龋w積可估計計算為1-(內(nèi)部陰影區(qū)域/外部陰影區(qū)域)。
          在本文,我們將使用Tensorflow2.x框架,在衛(wèi)星圖像的幫助下,使用python從零開始實現(xiàn)一個完整的模型來估計儲油罐的占用量。
          GitHub倉庫
          本文的所有內(nèi)容和整個代碼都可以在這個github存儲庫中找到
          https://github.com/mdmub0587/Oil-Storage-Tank-s-Volume-Occupancy
          以下是本文目錄。我們會逐一探索。

          目錄

          1. 問題陳述、數(shù)據(jù)集和評估指標

          2. 現(xiàn)有方法

          3. 相關(guān)研究工作

          4. 有用的博客和研究論文

          5. 我們的貢獻

          6. 探索性數(shù)據(jù)分析(EDA)

          7. 數(shù)據(jù)擴充

          8. 數(shù)據(jù)預處理、擴充和TFRecords

          9. 基于YoloV3的目標檢測

          10. 儲量估算

          11. 結(jié)果

          12. 結(jié)論

          13. 參考引用



          1.問題陳述、數(shù)據(jù)集和評估指標

          問題陳述:

          利用衛(wèi)星圖像進行浮頂油罐的檢測和儲油量的估算,然后將圖像塊重新組合成具有儲油量估計的全圖像。

          數(shù)據(jù)集:

          數(shù)據(jù)集鏈接:https://www.kaggle.com/towardsentropy/oil-storage-tanks
          該數(shù)據(jù)集包含一個帶注釋的邊界框,衛(wèi)星圖像是從谷歌地球(google earth)拍攝的,它包含有世界各地的工業(yè)區(qū)。數(shù)據(jù)集中有2個文件夾和3個文件,讓我們逐一看看。
          • large_images: 這是一個文件夾,包含100個衛(wèi)星原始圖像,每個大小為4800x4800,所有圖像都以id_large.jpg格式命名。
          • Image_patches: Image_patches目錄包含從大圖像生成的512x512大小的子圖,每個大的圖像被分割成100個512x512大小的子圖,兩個軸上的子圖之間有37個像素的重疊,生成圖像子圖的程序以id_row_column.jpg格式命名
          • **labels.json:**它包含所有圖像的標簽。標簽存儲為字典列表,每個圖像對應一個字典,不包含任何浮頂罐的圖像將被標記為“skip”,邊界框標簽的格式為邊界框四個角的(x,y)坐標。
          • labels_coco.json:  它包含與前一個文件相同的標簽的COCO標簽格式。在這里,邊界框的格式為[x_min, y_min, width, height].
          • **large_image_data.csv:**它包含大型圖像文件的元數(shù)據(jù),包括每個圖像的中心坐標和海拔高度。

          評估指標:

          對于儲油罐的檢測,我們將使用每種儲油罐的平均精度(Average Precision,AP)和各種儲油罐的mAP(Mean Average Precision,平均精度)來作為評估指標。浮頂罐的估計容積沒有度量標準。
          mAP 是目標檢測模型的標準評估指標。mAP 的詳細說明可以在下面的youtube播放列表中找到
          https://www.youtube.com/watch?list=PL1GQaVhO4f_jE5pnXU_Q4MSrIQx4wpFLM&v=e4G9H18VYmA

          2.現(xiàn)有方法

          Karl Keyer [1]在他的存儲庫中使用RetinaNet來完成儲油罐探測任務(wù)。他從頭開始創(chuàng)建模型,并將生成的錨框應用于該數(shù)據(jù)集,他的研究使得浮頂罐的平均精度(AP)達到76.3%,然后他應用陰影增強和像素閾值法來計算它的體積。
          據(jù)我所知,這是互聯(lián)網(wǎng)上唯一可用的方法。

          3.相關(guān)研究工作

          Estimating the Volume of Oil Tanks Based on High-Resolution Remote Sensing Images [2]:

          這篇文章提出了一種基于衛(wèi)星圖像的油罐容量/容積估算方法。為了計算一個儲油罐的總?cè)莘e,他們需要儲油罐的高度和半徑。為了計算高度,他們使用了與投影陰影長度的幾何關(guān)系,但是計算陰影的長度并不容易,為了突出陰影使用了HSV(即色調(diào)飽和度值)顏色空間,因為通常陰影在HSV顏色空間中具有高飽和度,然后采用基于亞像素細分定位(sub-pixel subdivision positioning)的中值法來計算陰影長度,最后利用Hough變換算法得到油罐半徑。
          在本文的相關(guān)工作中,提出了基于衛(wèi)星圖像的建筑物高度計算方法。

          4.有用的博客和研究論文

          A Beginner’s Guide To Calculating Oil Storage Tank Occupancy With Help Of Satellite Imagery [3]:

          本博客作者為TankerTracker.com,其中的一項工作是利用衛(wèi)星圖像跟蹤幾個感興趣的地理位置的原油儲存情況。
          在這篇博客中,他們詳細描述了儲油罐的外部和內(nèi)部陰影如何幫助我們估計其中的石油含量,還比較了衛(wèi)星在特定時間和一個月后拍攝的圖像,顯示了一個月來儲油罐的變化。這個博客給了我們一個直觀的知識,即如何估計量。

          A Gentle Introduction to Object Recognition With Deep Learning [4] :

          本文會介紹對象檢測初學者頭腦中出現(xiàn)的最令人困惑的概念。首先,描述了目標分類、目標定位、目標識別和目標檢測之間的區(qū)別,然后討論了一些最新的深度學習算法來展開目標識別任務(wù)。
          對象分類是指將標簽分配給包含單個對象的圖像,而對象定位是指在圖像中的一個或多個對象周圍繪制一個邊界框,目標檢測任務(wù)結(jié)合了目標分類和定位。這意味著這是一個更具挑戰(zhàn)性/復雜的任務(wù),首先通過本地化技術(shù)在感興趣對象(OI)周圍繪制一個邊界框,然后借助分類為每個OI分配一個標簽。目標識別是上述所有任務(wù)的集合(即分類、定位和檢測)。
          最后,本文還討論了兩種主要的目標檢測算法/模型:Region-Based Convolutional Neural Networks (R-CNN)和You Only Look Once (YOLO)。

          Selective Search for Object Recognition [5]:

          在目標檢測任務(wù)中,最關(guān)鍵的部分是目標定位,因為目標分類是在此基礎(chǔ)上進行的,它依賴于定位所輸出的目標區(qū)域(簡稱區(qū)域建議)。更完美的定位可以實現(xiàn)更完美的目標檢測。選擇性搜索是一種新興的算法,在一些物體識別模型中被用于物體定位,如R-CNN和Fast-R-CNN。
          該算法首先使用高效的基于圖的圖像分割方法生成輸入圖像的子段,然后使用貪婪算法將較小的相似區(qū)域合并為較大的相似區(qū)域。分段相似性基于顏色、紋理、大小和填充四個屬性。

          Region Proposal Network — A detailed view[6]:

          RPN(Region-proposition Network)由于其比傳統(tǒng)選擇性搜索算法更快而被廣泛地應用于目標定位,它從特征圖中學習目標的最佳位置,就像CNN從特征圖中學習分類一樣。
          它負責三個主要任務(wù),首先生成錨定框(每個特征映射點生成9個不同形狀的錨定框),然后將每個錨定框分類為前景或背景(即是否包含對象),最后學習錨定框的形狀偏移量以使其適合對象。

          Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks[7]:

          Faster R-CNN模型解決了前兩個相關(guān)模型(R-CNN和Fast R-CNN)的所有問題,并使用RPN作為區(qū)域建議生成器。它的架構(gòu)與Fast R-CNN完全相同,只是它使用了RPN而不是選擇性搜索,這使得它比Fast R-CNN快34倍。

          Real-time Object Detection with YOLO, YOLOv2, and now YOLOv3 [8]:

          在介紹Yolo系列模型之前,讓我們先看一下首席研究員約瑟夫·雷德曼在Ted演講上的演講。
          https://youtu.be/Cgxsv1riJhI
          這個模型在對象檢測模型列表中占據(jù)首位的原因有很多,然而,最主要的原因是它的牢固性,它的推理時間非常短,這是為什么它很容易匹配視頻的正常速度(即25fps)并應用于實時數(shù)據(jù)的原因。
          與其他對象檢測模型不同,Yolo模型具有以下特性。
          • 單神經(jīng)網(wǎng)絡(luò)模型(即分類和定位任務(wù)都將從同一個模型中執(zhí)行):以一張照片作為輸入,直接預測每個邊界框的邊界框和類標簽,這意味著它只看一次圖像。
          • 由于它對整個圖像而不是圖像的一部分執(zhí)行卷積,因此它產(chǎn)生的背景錯誤非常少。
          • YOLO學習對象的一般化表示。在對自然圖像進行訓練和藝術(shù)品測試時,YOLO的性能遠遠超過DPM和R-CNN等頂級檢測方法。由于YOLO具有高度的通用性,所以當應用于新的域或意外的輸入時,它不太可能崩潰。
          是什么讓YoloV3比Yolov2更好。
          • 如果你仔細看一下yolov2論文的標題,那就是“YOLO9000: Better, Faster, Stronger”。yolov3比yolov2更好嗎?答案是肯定的,它更好,但不是更快更強,因為體系的復雜性增加了。
          • Yolov2使用了19層DarkNet架構(gòu),沒有任何殘差塊、skip連接和上采樣,因此它很難檢測到小對象,然而在Yolov3中,這些特性被添加了,并且使用了在Imagenet上訓練的53層DarkNet網(wǎng)絡(luò),除此之外,還堆積了53個卷積層,形成了106個卷積層結(jié)構(gòu)。
          • Yolov3在三種不同的尺度上進行預測,首先是大對象的13X13網(wǎng)格,其次是中等對象的26X26網(wǎng)格,最后是小對象的52X52網(wǎng)格。
          • YoloV3總共使用9個錨箱,每個標度3個,用K均值聚類法選出最佳錨盒。
          • Yolov3可以對圖像中檢測到的對象執(zhí)行多標簽分類,通過logistic回歸預測對象置信度和類預測。

          5.我們的貢獻

          我們的問題陳述包括兩個任務(wù),第一個是浮頂罐的檢測,另一個是陰影的提取和已識別罐容積的估計。第一個任務(wù)是基于目標檢測,第二個任務(wù)是基于計算機視覺技術(shù)。讓我們描述一下解決每個任務(wù)的方法。

          儲罐檢測:

          我們的目標是估算浮頂罐的容積。我們可以為一個類建立目標檢測模型,但是為了減少一個模型與另一種儲油罐(即其他類型儲油罐)的混淆,并使其具有魯棒性,我們提出了三個類別的目標檢測模型。使用帶有轉(zhuǎn)移學習的YoloV3進行目標檢測是因為它更容易在機器上訓練,此外為了提高度量分值,還采用了數(shù)據(jù)增強的方法。

          陰影提取和體積估計:

          陰影提取涉及許多計算機視覺技術(shù),由于RGB顏色方案對陰影不敏感,必須先將其轉(zhuǎn)換成HSV和LAB顏色空間,我們使用(l1+l3)/(V+1)  (其中l(wèi)1是LAB顏色空間的第一個通道值)的比值圖像來增強陰影部分。
          然后,通過閾值0.5×t1+0.4×t2(其中t1是最小像素值,t2是平均值)來過濾增強圖像,再對閾值圖像進行形態(tài)學處理(即去除噪聲、清晰輪廓等)。
          最后,提取出兩個儲油罐的陰影輪廓,然后根據(jù)上述公式估算出所占用的體積。這些想法摘自以下Notebook。
          https://www.kaggle.com/towardsentropy/oil-tank-volume-estimation
          遵循整個流程來解決這個案例研究如下所示。
          讓我們從數(shù)據(jù)集的探索性數(shù)據(jù)分析EDA開始吧!!

          6.探索性數(shù)據(jù)分析(EDA)

          探索Labels.json文件:

          json_labels = json.load(open(os.path.join('data','labels.json')))
          print('Number of Images: ',len(json_labels))
          json_labels[25:30]
          所有的標簽都存儲在字典列表中,總共有10萬張圖片。不包含任何儲罐的圖像將標記為Skip,而包含儲罐的圖像將標記為tank、tank Cluster或Floating Head tank,每個tank對象都有字典格式的四個角點的邊界框坐標。

          計數(shù):

          在10K個圖像中,8187個圖像沒有標簽(即它們不包含任何儲油罐對象,此外有81個圖像包含至少一個儲油罐簇對象,1595個圖像包含至少一個浮頂儲油罐。
          在條形圖中,可以觀察到,在包含圖像的1595個浮頂罐中,26.45%的圖像僅包含一個浮頂罐對象,單個圖像中浮頂儲罐對象的最高數(shù)量為34。

          探索labels_coco.json文件:

          json_labels_coco = json.load(open(os.path.join('data','labels_coco.json')))
          print('Number of Floating tanks: ',len(json_labels_coco['annotations']))
          no_unique_img_id = set()
          for ann in json_labels_coco['annotations']:
            no_unique_img_id.add(ann['image_id'])
          print('Number of Images that contains Floating head tank: ', len(no_unique_img_id))
          json_labels_coco['annotations'][:8]
          此文件僅包含浮頂罐的邊界框及其在字典格式列表中的image_id

          打印邊界框:

          儲油罐有三種:
          1. Tank(T 油罐)
          2. Tank Cluster(TC 油罐組),
          3. Floating Head Tank(FHT,浮頂罐)

          7.數(shù)據(jù)擴充

          在EDA中,人們觀察到10000幅圖像中有8171幅是無用的,因為它們不包含任何對象,此外1595個圖像包含至少一個浮頂罐對象。眾所周知,所有的深度學習模型都需要大量的數(shù)據(jù),沒有足夠的數(shù)據(jù)會導致性能的下降。
          因此,我們先進行數(shù)據(jù)擴充,然后將獲得的擴充數(shù)據(jù)擬合到Y(jié)olov3目標檢測模型中。

          8.數(shù)據(jù)預處理、擴充和TFRecords

          數(shù)據(jù)預處理:

          對象的注釋是以Jason格式給出的,其中有4個角點,首先,從這些角點提取左上角點和右下角點,然后屬于單個圖像的所有注釋及其對應的標簽都保存在CSV文件的一行列表中。
          從角點提取左上角點和右下角點的代碼
          def conv_bbox(box_dict):
            """
            input: box_dict-> 字典中有4個角點
            Function: 獲取左上方和右下方的點
            output: tuple(ymin, xmin, ymax, xmax)
            """

            xs = np.array(list(set([i['x'for i in box_dict])))
            ys = np.array(list(set([i['y'for i in box_dict])))
            x_min = xs.min()
            x_max = xs.max()
            y_min = ys.min()
            y_max = ys.max()
            
            return y_min, x_min, y_max, x_max
          CSV文件將如下所示
          為了評估模型,我們將保留10%的圖像作為測試集。
          # 訓練和測試劃分
          df_train, df_test= model_selection.train_test_split(
            df, #CSV文件注釋
            test_size=0.1,
            random_state=42,
            shuffle=True,
          )
          df_train.shape, df_test.shape

          數(shù)據(jù)擴充:

          我們知道目標檢測需要大量的數(shù)據(jù),但是我們只有1645幅圖像用于訓練,這是非常少的,為了增加數(shù)據(jù),我們必須執(zhí)行數(shù)據(jù)擴充。我們通過翻轉(zhuǎn)和旋轉(zhuǎn)原始圖像來生成新圖像。我們轉(zhuǎn)到下面的GitHub存儲庫,從中提取代碼進行擴充
          https://blog.paperspace.com/data-augmentation-for-bounding-boxes/
          通過執(zhí)行以下操作從單個原始圖像生成7個新圖像:
          1. 水平翻轉(zhuǎn)
          2. 旋轉(zhuǎn)90度
          3. 旋轉(zhuǎn)180度
          4. 旋轉(zhuǎn)270度
          5. 水平翻轉(zhuǎn)和90度旋轉(zhuǎn)
          6. 水平翻轉(zhuǎn)和180度旋轉(zhuǎn)
          7. 水平翻轉(zhuǎn)和270度旋轉(zhuǎn)
          示例如下所示

          TFRecords:

          TFRecords是TensorFlow自己的二進制存儲格式。當數(shù)據(jù)集太大時,它通常很有用。它以二進制格式存儲數(shù)據(jù),并對訓練模型的性能產(chǎn)生顯著影響。二進制數(shù)據(jù)復制所需的時間更少,而且由于在訓練時只加載了一個batch數(shù)據(jù),所以占用的空間也更少。你可以在下面的博客中找到它的詳細描述。
          https://medium.com/mostly-ai/tensorflow-records-what-they-are-and-how-to-use-them-c46bc4bbb564
          也可以查看下面的Tensorflow文檔。
          https://www.tensorflow.org/tutorials/load_data/tfrecord
          我們的數(shù)據(jù)集已轉(zhuǎn)換成RFRecords格式,但是我們沒有必要執(zhí)行此任務(wù),因為我們的數(shù)據(jù)集不是很大,如果你感興趣,可以在我的GitHub存儲庫中找到代碼。

          9.基于YoloV3的目標檢測

          訓練:

          為了訓練yolov3模型,采用了遷移學習。第一步包括加載DarkNet網(wǎng)絡(luò)的權(quán)重,并在訓練期間凍結(jié)它以保持權(quán)重不變。
          def create_model():
              tf.keras.backend.clear_session() 
              pret_model = YoloV3(size, channels, classes=80)
              load_darknet_weights(pret_model, 'Pretrained_Model/yolov3.weights')
              print('\nPretrained Weight Loaded')

              model = YoloV3(size, channels, classes=3)
              model.get_layer('yolo_darknet').set_weights(
                  pret_model.get_layer('yolo_darknet').get_weights())
              print('Yolo DarkNet weight loaded')

              freeze_all(model.get_layer('yolo_darknet'))
              print('Frozen DarkNet layers')
              return model

          model = create_model()
          model.summary()
          我們使用adam優(yōu)化器(初始學習率=0.001)來訓練我們的模型,并根據(jù)epoch應用余弦衰減來降低學習速率。在訓練過程中使用模型檢查點保存最佳權(quán)重,訓練結(jié)束后保存最后一個權(quán)重。
          tf.keras.backend.clear_session()  
          epochs = 100
          learning_rate=1e-3

          optimizer = get_optimizer(
              optim_type = 'adam',
              learning_rate=1e-3
              decay_type='cosine'
              decay_steps=10*600 
          )
          loss = [YoloLoss(yolo_anchors[mask], classes=3for mask in yolo_anchor_masks]


          model = create_model()
          model.compile(optimizer=optimizer, loss=loss)

          # Tensorbaord
          ! rm -rf ./logs/ 
          logdir = os.path.join("logs", datetime.datetime.now().strftime("%Y%m%d-%H%M%S"))
          %tensorboard --logdir $logdir
          tensorboard_callback = tf.keras.callbacks.TensorBoard(logdir, histogram_freq=1)

          callbacks = [
              EarlyStopping(monitor='val_loss', min_delta=0, patience=15, verbose=1),
              ModelCheckpoint('Weights/Best_weight.hdf5', verbose=1, save_best_only=True),
              tensorboard_callback,
          ]

          history = model.fit(train_dataset,
                              epochs=epochs,
                              callbacks=callbacks,
                              validation_data=valid_dataset)
          model.save('Weights/Last_weight.hdf5')
          損失函數(shù):

          YOLO損失函數(shù):

          Yolov3模型訓練中所用的損失函數(shù)相當復雜。Yolo在三個不同的尺度上計算三個不同的損失,并對反向傳播進行總結(jié)(正如你在上面的代碼單元中看到的,最終損失是三個不同損失的列表),每個loss都通過4個子函數(shù)來計算檢測損失和分類損失。
          1. 中心(x,y) 的MSE損失.
          2. 邊界框的寬度和高度的均方誤差(MSE)
          3. 邊界框的二元交叉熵得分與無目標得分
          4. 邊界框多類預測的二元交叉熵或稀疏范疇交叉熵
          讓我們看看Yolov2中使用的損失公式
          Yolov2中的最后三項是平方誤差,而在Yolov3中,它們被交叉熵誤差項所取代,換句話說,Yolov3中的對象置信度和類預測現(xiàn)在通過logistic回歸來進行預測。
          看看Yolov3損失函數(shù)的實現(xiàn)
          def YoloLoss(anchors, classes=3, ignore_thresh=0.5):
              def yolo_loss(y_true, y_pred):
                  # 1. 轉(zhuǎn)換所有預測輸出
                  # y_pred: (batch_size, grid, grid, anchors, (x, y, w, h, obj, ...cls))
                  pred_box, pred_obj, pred_class, pred_xywh = yolo_boxes(
                      y_pred, anchors, classes)
                  # predicted (tx, ty, tw, th)
                  pred_xy = pred_xywh[..., 0:2#x,y of last channel
                  pred_wh = pred_xywh[..., 2:4#w,h of last channel

                  # 2. 轉(zhuǎn)換所有真實輸出
                  # y_true: (batch_size, grid, grid, anchors, (x1, y1, x2, y2, obj, cls))
                  true_box, true_obj, true_class_idx = tf.split(
                      y_true, (411), axis=-1)

                  #轉(zhuǎn)換 x1, y1, x2, y2 to x, y, w, h
                  # x,y = (x2 - x1)/2, (y2-y1)/2
                  # w, h = (x2- x1), (y2 - y1)
                  true_xy = (true_box[..., 0:2] + true_box[..., 2:4]) / 2
                  true_wh = true_box[..., 2:4] - true_box[..., 0:2]

                  # 小的box要更高權(quán)重
                  #shape-> (batch_size, grid, grid, anchors)
                  box_loss_scale = 2 - true_wh[..., 0] * true_wh[..., 1]


                  # 3. 對pred box進行反向
                  # 把 (bx, by, bw, bh) 變?yōu)?nbsp;(tx, ty, tw, th) 
                  grid_size = tf.shape(y_true)[1]
                  grid = tf.meshgrid(tf.range(grid_size), tf.range(grid_size))
                  grid = tf.expand_dims(tf.stack(grid, axis=-1), axis=2)
                  true_xy = true_xy * tf.cast(grid_size, tf.float32) - tf.cast(grid, tf.float32)
                  true_wh = tf.math.log(true_wh / anchors)
                  true_wh = tf.where(tf.logical_or(tf.math.is_inf(true_wh),
                                                   tf.math.is_nan(true_wh)),
                                     tf.zeros_like(true_wh), true_wh)

                  # 4. 計算所有掩碼
                  #從張量的形狀中去除尺寸為1的維度。
                  #obj_mask: (batch_size, grid, grid, anchors)
                  obj_mask = tf.squeeze(true_obj, -1
                  #當iou超過臨界值時,忽略假正例
                  #best_iou: (batch_size, grid, grid, anchors)
                  best_iou = tf.map_fn(
                      lambda x: tf.reduce_max(broadcast_iou(x[0], tf.boolean_mask(
                          x[1], tf.cast(x[2], tf.bool))), axis=-1),
                      (pred_box, true_box, obj_mask),
                      tf.float32)
                  ignore_mask = tf.cast(best_iou < ignore_thresh, tf.float32)

                  # 5.計算所有損失
                  xy_loss = obj_mask * box_loss_scale * \
                      tf.reduce_sum(tf.square(true_xy - pred_xy), axis=-1)
                  wh_loss = obj_mask * box_loss_scale * \
                      tf.reduce_sum(tf.square(true_wh - pred_wh), axis=-1)
                  obj_loss = binary_crossentropy(true_obj, pred_obj)
                  obj_loss = obj_mask * obj_loss + \
                      (1 - obj_mask) * ignore_mask * obj_loss
                  #TODO:使用binary_crossentropy代替
                  class_loss = obj_mask * sparse_categorical_crossentropy(
                      true_class_idx, pred_class)

                  # 6. 在(batch, gridx, gridy, anchors)求和得到 => (batch, 1)
                  xy_loss = tf.reduce_sum(xy_loss, axis=(123))
                  wh_loss = tf.reduce_sum(wh_loss, axis=(123))
                  obj_loss = tf.reduce_sum(obj_loss, axis=(123))
                  class_loss = tf.reduce_sum(class_loss, axis=(123))

                  return xy_loss + wh_loss + obj_loss + class_loss
              return yolo_loss
          分數(shù):
          為了評估我們的模型,我們使用了AP和mAP來評估訓練和測試數(shù)據(jù)
          測試集分數(shù)
          get_mAP(model, 'data/test.csv')
          訓練集分數(shù)
          get_mAP(model, 'data/train.csv')
          推理
          讓我們看看這個模型是如何執(zhí)行的

          10.儲量估算

          體積估算是本案例研究的主要內(nèi)容。雖然沒有評估估計容積的標準,但我們試圖找到圖像的最佳閾值像素值,以便能夠在很大程度上檢測陰影區(qū)域(通過計算像素數(shù))。
          我們將使用衛(wèi)星拍攝到的4800X4800形狀的大圖像,并將其分割成100個512x512的子圖,兩個軸上的子圖之間重疊37像素。圖像修補程序在id_row_column.jpg命名。
          每個生成的子圖預測都將存儲在一個CSV文件中,然后再估計每個浮頂儲油罐的體積(代碼和解釋以Notebook格式在我的GitHub存儲庫中提供)。
          最后,將所有的圖像塊和邊界框與標簽合并,輸出估計的體積,形成一個大的圖像。你可以看看下面的例子:

          11.結(jié)果

          測試集上浮頂罐的AP分數(shù)為0.874,訓練集上的AP分數(shù)為0.942。

          12.結(jié)論

          • 只需有限的圖像就可以得到相當好的結(jié)果。
          • 數(shù)據(jù)增強工作得很到位。
          • 在本例中,與RetinaNet模型的現(xiàn)有方法相比,yolov3表現(xiàn)得很好。
          13.參考引用
          [1] Oil-Tank-Volume-Estimation, by Karl Heyer, Nov 2019. (https://github.com/kheyer/Oil-Tank-Volume-Estimation)
          [2] Estimating the Volume of Oil Tanks Based on High-Resolution Remote Sensing Images by Tong Wang, Ying Li, Shengtao Yu, and Yu Liu, April 2019.(https://www.researchgate.net/publication/332193936_Estimating_the_Volume_of_Oil_Tanks_Based_on_High-Resolution_Remote_Sensing_Images)
          [3] A Beginner’s Guide To Calculating Oil Storage Tank Occupancy With Help Of Satellite Imagery by TankerTrackers.com, Sep 2017.(https://medium.com/planet-stories/a-beginners-guide-to-calculating-oil-storage-tank-occupancy-with-help-of-satellite-imagery-e8f387200178)
          [4] A Gentle Introduction to Object Recognition With Deep Learning by https://machinelearningmastery.com/, May 2019.(https://machinelearningmastery.com/object-recognition-with-deep-learning/)
          [5] Selective Search for Object Recognition by J.R.R. Uijlings at el. 2012(http://www.huppelen.nl/publications/selectiveSearchDraft.pdf)
          [6] Region Proposal Network — A detailed view by Sambasivarao. K, Dec 2019(https://towardsdatascience.com/region-proposal-network-a-detailed-view-1305c7875853)
          [7] Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks by Ross Girshick et al. Jan 2016.(https://arxiv.org/abs/1506.01497)
          [8] Real-time Object Detection with YOLO, YOLOv2 and now YOLOv3 by Joseph Redmon, 2015–2018 (https://arxiv.org/abs/1506.02640,https://arxiv.org/abs/1612.08242,https://arxiv.org/abs/1804.02767)
          參考鏈接:https://towardsdatascience.com/oil-storage-tanks-volume-occupancy-on-satellite-imagery-using-yolov3-3cf251362d9d
          本文僅做學術(shù)分享,如有侵權(quán),請聯(lián)系刪文。

          好消息!

          小白學視覺知識星球

          開始面向外開放啦??????




          下載1:OpenCV-Contrib擴展模塊中文版教程
          在「小白學視覺」公眾號后臺回復:擴展模塊中文教程即可下載全網(wǎng)第一份OpenCV擴展模塊教程中文版,涵蓋擴展模塊安裝、SFM算法、立體視覺、目標跟蹤、生物視覺、超分辨率處理等二十多章內(nèi)容。

          下載2:Python視覺實戰(zhàn)項目52講
          小白學視覺公眾號后臺回復:Python視覺實戰(zhàn)項目即可下載包括圖像分割、口罩檢測、車道線檢測、車輛計數(shù)、添加眼線、車牌識別、字符識別、情緒檢測、文本內(nèi)容提取、面部識別等31個視覺實戰(zhàn)項目,助力快速學校計算機視覺。

          下載3:OpenCV實戰(zhàn)項目20講
          小白學視覺公眾號后臺回復:OpenCV實戰(zhàn)項目20講即可下載含有20個基于OpenCV實現(xiàn)20個實戰(zhàn)項目,實現(xiàn)OpenCV學習進階。

          交流群


          歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器自動駕駛、計算攝影、檢測、分割、識別、醫(yī)學影像、GAN算法競賽等微信群(以后會逐漸細分),請掃描下面微信號加群,備注:”昵稱+學校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進入相關(guān)微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~


          瀏覽 48
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  天天日天天舔天天射 | 欧美超碰人人操 | 大香蕉国产精品 | 国内一级黄色片 | 人妻丰满熟妇av无码区蜜桃 |