zoukankan      html  css  js  c++  java
  • #MXNet# im2rec失真

    早就怀疑过MXNet的pack,但是那次验证(把图片打出来对比)出来的结论是没问题。
    结果这次就吊在这上面了:

    问题

    1. 先用im2rec.py打包图片;
    2. 然后继承iamge.imageIter,进行改造,rec读取和解码没有修改;

    结果发现网络的输出不时就会出现异常值(其中一个迭代器输出Mask),最后定位到迭代器里面:

    #  继承自 image.imageIter
    # 此迭代器 输出 Mask Map !
    #    next() 节选
    		try:
    			while i < batch_size:
    				
    				label, s = self.next_sample()
    				data = [imdecode(s)]                                         # POINT B
    				if len(data[0].shape) == 0:
    #					logging.debug('Invalid image, skipping.')
    					continue
    				for aug in self.auglist:
    					data = [ret for src in data for ret in aug(src)]
    				for d in data:
    					assert i < batch_size, 'Batch size must be multiples of augmenter output length'
    
    					dTmp=nd.transpose(d, axes=(2, 0, 1))
    					if self.data_shape[0] == 1:  # only keep channel 0
    						dTmp=dTmp[0]/255                          #    此处是 BUG 相关点       POINT A
    					batch_data[i][:] = dTmp.reshape((1,)+dTmp.shape)
    #					batch_label[i][:] = label
    					i += 1
    
    

    使用以上这段程序,检查迭代器输出(经数值反变换)来的图没问题,但打印网络的输出就发现明显异常。
    如果把POINT A的程序换为:

    # 替换 POINT A 处
    dTmp = dTmp[0]
    dTmp[dTmp>0]= 1
    

    网络输出值没有异常,但迭代器输出图像就会出现大面积阴影。

    原因

    问题就出在解码上,在 POINT B处检车一下,就会有见鬼的发现:

    #  放置于 POINT B 后
    if config.debug.it_check:
        dTmp=data[0].asnumpy()
        logging.debug('num in (0,255):%d'%(    ( (dTmp>0)*(dTmp<255) ).sum()       )  )   #   dTmp 应当是 Mask
    

    混乱了。。。orz

    Solution

    快要爆发的时候,顺手把图打印出来了,发现波动的值大致在250左右,于是改了下POINT A处:

    # 替换 POINT A 处
    dTmp=dTmp[0]
    dTmp[dTmp>250]=1
    dTmp[dTmp<250]=0
    

    视觉上,和网络输出正常化。
    勉强用着吧。

    Followup

    这样的解码似乎不太可靠,后续要考虑替代方案。

  • 相关阅读:
    request.getParameter() 、 request.getInputStream()和request.getReader() 使用体会
    HTTP之Content-Length
    关于spring3中No Session found for current thread!and Transaction的配置和管理(转)
    Java数据类型和MySql数据类型对应一览
    Spring MVC 解读——View,ViewResolver(转)
    LeetCode 441. Arranging Coins
    LeetCode 415. Add Strings
    LeetCode 400. Nth Digit
    LeetCode 367. Valid Perfect Square
    LeetCode 326. Power of Three
  • 原文地址:https://www.cnblogs.com/chenyliang/p/6807750.html
Copyright © 2011-2022 走看看