

# やりたいこと

Crowd countingのモデル
[CSRNet](https://qiita.com/HKondo0804/items/af48a3c86b96bbc10b80)用に[Beijing
BRTデータセット](https://github.com/XMU-smartdsp/Beijing-BRT-
dataset)の人物頭部位置のアノテーションからdensity mapのアノテーションを作成したい。

# エラー

[code]

    Traceback (most recent call last):
      File "/path/to/directory/make_dataset.py", line 67, in <module>
        k = gaussian_filter_density(k)
      File "/path/to/directory/make_dataset.py", line 38, in gaussian_filter_density
        density += gaussian_filter(pt2d, sigma, mode='constant')
      File "/path/to/directory/env/lib/python3.10/site-packages/scipy/ndimage/_filters.py", line 368, in gaussian_filter
        gaussian_filter1d(input, sigma, axis, order, output,
      File "/path/to/directory/env/lib/python3.10/site-packages/scipy/ndimage/_filters.py", line 269, in gaussian_filter1d
        lw = int(truncate * sd + 0.5)
    OverflowError: cannot convert float infinity to integer
    
[/code]

最初の数画像はうまく行くのですが、途中で上記のエラーが出て実行ストップしてしまいます。

# コード

## 実行ファイル

`make_dataset.py`

[code]

    import h5py
    import scipy.io as io
    import PIL.Image as Image
    import numpy as np
    import os
    import glob
    from matplotlib import pyplot as plt
    from scipy.ndimage import gaussian_filter 
    import scipy
    import json
    from matplotlib import cm as CM
    # from image import *
    # from model import CSRNet
    import torch
    
    def gaussian_filter_density(gt):
        print(gt.shape)
        density = np.zeros(gt.shape, dtype=np.float32)
        gt_count = np.count_nonzero(gt)
        if gt_count == 0:
            return density
    
        pts = np.array(list(zip(np.nonzero(gt)[1], np.nonzero(gt)[0])))
        leafsize = 2048
        # build kdtree
        tree = scipy.spatial.KDTree(pts.copy(), leafsize=leafsize)
        # query kdtree
        distances, locations = tree.query(pts, k=4)
    
        print('generate density...')
        for i, pt in enumerate(pts):
            pt2d = np.zeros(gt.shape, dtype=np.float32)
            pt2d[pt[1],pt[0]] = 1.
            if gt_count > 1:
                sigma = (distances[i][1]+distances[i][2]+distances[i][3])*0.1
            else:
                sigma = np.average(np.array(gt.shape))/2./2. #case: 1 point
            density += gaussian_filter(pt2d, sigma, mode='constant')
        print('done.')
        return density
    
    
    # set the root to Beijing BRT
    root = '/path/to/Beijing-BRT-dataset'
    
    #now generate the ground truth
    train_path = os.path.join(root, 'train', 'frame')
    test_path = os.path.join(root, 'test', 'frame')
    path_sets = [train_path, test_path]
    
    img_paths = []
    for path in path_sets:
        for img_path in glob.glob(os.path.join(path, '*.jpg')):
            img_paths.append(img_path)
    
    for img_path in img_paths:
        print(img_path)
        mat = io.loadmat(img_path.replace('.jpg', '.mat').replace('frame', 'ground_truth'))
        img = plt.imread(img_path)
        k = np.zeros((img.shape[0], img.shape[1]))    
        gt = mat['loc']
    
        for i in range(len(gt)):
            if int(gt[i][1]) < img.shape[0] and int(gt[i][0]) < img.shape[1]:
                k[int(gt[i][1]), int(gt[i][0])] = 1
                print(k)
        k = gaussian_filter_density(k)
        with h5py.File(img_path.replace('.jpg', '.h5').replace('frame', 'ground_truth'), 'w') as hf:
                hf['density'] = k
    
    
[/code]

コードはこちらの[CSRNet開発者のコード](https://github.com/leeyeehoo/CSRNet-
pytorch)を[Qiita記事](https://qiita.com/HKondo0804/items/af48a3c86b96bbc10b80)や[こちらのサイト](https://www.analyticsvidhya.com/blog/2019/02/building-
crowd-counting-model-python/)を参考に、Python
3用にコードを修正し、元のコードはShanghaiTechデータセット用に書かれているのでBeijing
BRTデータセット用にさらにコードを変更したものです。

# 環境

  * Windows 11上のWSL2, Ubuntu 22.04
  * Python 3.10（venv使用）
  * SciPy 1.10.0

# エラー再現方法

上記Pythonコードの他に[GitHub](https://github.com/XMU-smartdsp/Beijing-BRT-
dataset)からBeijing
BRTデータセット（画像とアノテーション`.mat`ファイルなど）をダウンロードした上で`make_dataset.py`を実行しました。

# その他

質問に不備などありましたら訂正致しますので教えていただければ幸いです。宜しくお願いします。


CC BY-SA 4.0
2023-02-23T18:29:28.327
93963
2023-02-24T13:44:38.873
38402
question
python 機械学習 scipy
SciPyを使ったCSRNetのコードを実行するとgaussian_filterでエラーが出る


コードの６７行目

[code]

    density += gaussian_filter(pt2d, sigma, mode='constant')
    
[/code]

で渡した`sigma`の値が無限大になっていることがエラーの原因であることがわかりました。

`sigma`の値を適切な上限値に制限することでエラーを回避できます。  
例：

[code]

    sigma = (distances[i][1]+distances[i][2]+distances[i][3])*0.1
    
[/code]

を

[code]

    res = min(gt.shape)  # The resolution here is the number of pixels in vertical or horizontal, whichever is smaller
    
    sigma = min((distances[i][1]+distances[i][2]+distances[i][3])*0.1, res * 10)  # To prevent an overflow error
    
[/code]

に変更する。


CC BY-SA 4.0
2023-02-24T13:44:38.873
93985
2023-02-24T13:44:38.873
38402
93963
answer