モザイクデータの強化

モザイクデータの強化

モザイクデータの強化

YOLOV4の論文では、モザイクデータの強調方法が提案されています。主なアイデアは、4つの画像をランダムにトリミングし、トレーニングデータとして1つの画像にステッチすることです。これの利点は、画像の背景が豊かになり、4つの画像が一緒にスプライスされてbatch_sizeが偽装されて増加することです.4つの画像もバッチ正規化中に計算されるため、batch_size自体はあまり依存しません、および単一のGPUを使用できます。YOLOV4のトレーニング。
以下は、pytorchYOLOV4のコードに基づくモザイクデータ拡張の照合です。

ここに画像の説明を挿入

図1

コード表示の一部:

oh, ow, oc = img.shape    # img为读取的图片数据      
# self.cfg.jitter为cfg文件中的参数,默认给的是0.2                                              
dh, dw, dc = np.array(np.array([oh, ow, oc]) * self.cfg.jitter, dtype=np.int)  
# 首先生成一些随机偏移的坐标,分别代表左右上下                                    
pleft = random.randint(-dw, dw)   
pright = random.randint(-dw, dw)  
ptop = random.randint(-dh, dh)    
pbot = random.randint(-dh, dh) 
# 裁剪部分的长和宽
swidth = ow - pleft - pright
sheight = oh - ptop - pbot     
1234567891011

モザイクプロセス全体を図1に示します。図1は、pleft、pright、ptop、およびpbotがすべて0より大きい場合の状況を示しています。まず、(pleft、pright)を左上隅、幅、および幅と長さとしての高さ。そして、この長方形と元の画像(つまり、濃い緑色の部分)の交点を取ります。

注:図1の(2)は直接の交差ではありません。代わりに、幅の幅と高さの長さの長方形を作成し、その長方形を元の画像の3つのRGBチャネルの平均値に割り当てます。次に、上記を追加します。の交差部分は、計算された座標に従ってこの長方形に配置されますが、図1は、pleft、pright、ptop、およびpbotがすべて0より大きい場合の状況に基づいているため、( 0、0)座標。詳細については、以下のコードを参照してください。

# new_src_rect也就是上面说的交集的坐标(x1, y1, x2, y2)
 new_src_rect = rect_intersection(src_rect, img_rect)                                                                                                                        
 dst_rect = [max(0, -pleft), max(0, -ptop), max(0, -pleft) + new_src_rect[2] - new_src_rect[0], 
             max(0, -ptop) + new_src_rect[3] - new_src_rect[1]]  
                                            
cropped = np.zeros([sheight, swidth, 3])                                   
cropped[:, :, ] = np.mean(img, axis=(0, 1))                                
# 这里就是将交集部分放在矩形上                                                      
cropped[dst_rect[1]:dst_rect[3], dst_rect[0]:dst_rect[2]] = \              
    img[new_src_rect[1]:new_src_rect[3], new_src_rect[0]:new_src_rect[2]]  
12345678910

次に、画像のサイズを変更します。サイズ変更は、ネットワーク入力に必要な解像度であり、デフォルトでは608x608です。次に、計算された左上の座標、およびランダムに取得された幅CutXと長さCutyに従って、領域の一部が新しい画像の左上部分としてトリミングされます。図1の(4)の赤いボックスは、トリミングされた領域を表しています。注:図1の(4)の左上隅の(0、0)座標は、計算によると、pleftとprightが0より大きいためです。クリッピング座標を計算するプロセスは、次のコードを参照できます。

# 根据网络的输入大小随机计算的cut_x、cut_y,min_offset为预设参数,默认为0.2
# cfg.w,cfg.h为网络的输入大小,默认为608
 cut_x = random.randint(int(self.cfg.w * min_offset), int(self.cfg.w * (1 - min_offset)))
 cut_y = random.randint(int(self.cfg.h * min_offset), int(self.cfg.h * (1 - min_offset)))
# 裁剪坐标的计算过程                                                                                 
left_shift = int(min(cut_x, max(0, (-int(pleft) * self.cfg.w / swidth))))                         
top_shift = int(min(cut_y, max(0, (-int(ptop) * self.cfg.h / sheight))))                          
                                                                                                  
right_shift = int(min((self.cfg.w - cut_x), max(0, (-int(pright) * self.cfg.w / swidth))))        
bot_shift = int(min(self.cfg.h - cut_y, max(0, (-int(pbot) * self.cfg.h / sheight))))               
# 这里的ai参数为图一中的(3), out_img初始化的新图
# 该函数的功能就是图1中(3)到(5)的过程,分别将裁剪的图片粘贴到新图的左上,右上,左下,右下
# 循环4次,每循环一次粘贴一次,每次根据给的参数i粘贴到哪个部分                                       
out_img, out_bbox = blend_truth_mosaic(out_img, ai, truth.copy(), self.cfg.w, self.cfg.h, cut_x,  
                                       cut_y, i, left_shift, right_shift, top_shift, bot_shift)   
123456789101112131415

以下は、blend_truth_mosaic関数の詳細です。

def blend_truth_mosaic(out_img, img, bboxes, w, h, cut_x, cut_y, i_mixup,                                        
                       left_shift, right_shift, top_shift, bot_shift):                                           
    left_shift = min(left_shift, w - cut_x)                                                                      
    top_shift = min(top_shift, h - cut_y)                                                                        
    right_shift = min(right_shift, cut_x)                                                                        
    bot_shift = min(bot_shift, cut_y)                                                                            
                                                                                                                 
    if i_mixup == 0:                                                                                             
        bboxes = filter_truth(bboxes, left_shift, top_shift, cut_x, cut_y, 0, 0)                                 
        out_img[:cut_y, :cut_x] = img[top_shift:top_shift + cut_y, left_shift:left_shift + cut_x]                
    if i_mixup == 1:                                                                                             
        bboxes = filter_truth(bboxes, cut_x - right_shift, top_shift, w - cut_x, cut_y, cut_x, 0)                
        out_img[:cut_y, cut_x:] = img[top_shift:top_shift + cut_y, cut_x - right_shift:w - right_shift]          
    if i_mixup == 2:                                                                                             
        bboxes = filter_truth(bboxes, left_shift, cut_y - bot_shift, cut_x, h - cut_y, 0, cut_y)                 
        out_img[cut_y:, :cut_x] = img[cut_y - bot_shift:h - bot_shift, left_shift:left_shift + cut_x]            
    if i_mixup == 3:                                                                                             
        bboxes = filter_truth(bboxes, cut_x - right_shift, cut_y - bot_shift, w - cut_x, h - cut_y, cut_x, cut_y)
        out_img[cut_y:, cut_x:] = img[cut_y - bot_shift:h - bot_shift, cut_x - right_shift:w - right_shift]      
                                                                                                                 
    return out_img, bboxes                                                                                       
123456789101112131415161718192021

最後に、ラベルフレームの処理について説明します。図1に示すように、カット時にサンプルのラベルフレームの一部がトリミングされると、それは破棄され、トリミング後もラベルフレームはそのまま保持されます。

次の図は、pleft、pright、ptop、およびpbotがすべて0未満であるトリミング状況を示しています。
ここに画像の説明を挿入

図2

時間の都合上、描きやすい図を2つだけ描き、左上隅だけを貼り付けましたが、実はどちらも同じです。
この記事では、モザイクのカット部分について詳しく説明します。もちろん、この部分の方が重要だと思います。実際、ランダムフリップ、ブラー、HSVエンハンスメントなど、他のエンハンスメント操作もあります。まだ完了しており、後で更新されます。

操作が完了したら、最初の画像、左下の2番目の画像、右下の3番目の画像、右上の4番目の画像に従って、元の画像を左上に配置します。

最後に、これはpytorch YOLOV4基づく私のコードです。私自身の理解です。間違いがある場合は、訂正してください。ありがとうございます。

おすすめ

転載: blog.csdn.net/ahelloyou/article/details/111462862