Monkey 补丁在 __init__ 语句上失败
Monkey patch failing on __init__ statement
我正在尝试从 clodsa 包中修补增强器函数以读取自定义命名的 .json 文件而不是遵循它们的格式,所以不是 /annotations.json 而是 new_name.json :
!pip install clodsa
??augmentor
Type: COCOLinearInstanceSegmentationAugmentor
String form: <clodsa.augmentors.cocoLinearInstanceSegmentationAugmentor.COCOLinearInstanceSegmentationAugmentor object at 0x7fbc1f48de50>
File: /usr/local/lib/python3.7/dist-packages/clodsa/augmentors/cocoLinearInstanceSegmentationAugmentor.py
Source:
class COCOLinearInstanceSegmentationAugmentor(IAugmentor):
def __init__(self, inputPath, parameters):
IAugmentor.__init__(self)
self.imagesPath = inputPath
self.annotationFile = inputPath + "/annotations.json"
# output path represents the folder where the images will be stored
if parameters["outputPath"]:
self.outputPath = parameters["outputPath"]
else:
raise ValueError("You should provide an output path in the parameters")
self.ignoreClasses = parameters.get("ignoreClasses",set())
def readImagesAndAnnotations(self):
(self.info, self.licenses, self.categories, self.dictImages, self.dictAnnotations) \
= readCOCOJSON(self.annotationFile)
我尝试了以下方法来修补 self.annotationFile 路径:
def new_init(self, inputPath, parameters):
IAugmentor.__init__(self)
self.imagesPath = inputPath
self.annotationFile = inputPath + "/new_name.json"
# output path represents the folder where the images will be stored
if parameters["outputPath"]:
self.outputPath = parameters["outputPath"]
else:
raise ValueError("You should provide an output path in the parameters")
self.ignoreClasses = parameters.get("ignoreClasses",set())
augmentor.__init__ = new_init
当我 运行 新的 init 时,它确实显示猴子用 ??augmentor 修补了 init。init
但是当我 运行 完整代码时,它只是回退到使用旧的 init 语句:
---------------------------------------------------------------------------
FileNotFoundError Traceback (most recent call last)
<ipython-input-15-30ca2128bdb6> in <module>()
1 #Perform the augmentations
----> 2 augmentor.applyAugmentation()
2 frames
/usr/local/lib/python3.7/dist-packages/clodsa/augmentors/cocoLinearInstanceSegmentationAugmentor.py in applyAugmentation(self)
87
88 def applyAugmentation(self):
---> 89 self.readImagesAndAnnotations()
90
91 newannotations = Parallel(n_jobs=-1)(delayed(readAndGenerateInstanceSegmentation)
/usr/local/lib/python3.7/dist-packages/clodsa/augmentors/cocoLinearInstanceSegmentationAugmentor.py in readImagesAndAnnotations(self)
84 def readImagesAndAnnotations(self):
85 (self.info, self.licenses, self.categories, self.dictImages, self.dictAnnotations) \
---> 86 = readCOCOJSON(self.annotationFile)
87
88 def applyAugmentation(self):
/usr/local/lib/python3.7/dist-packages/clodsa/augmentors/utils/readCOCOJSON.py in readCOCOJSON(jsonPath)
5
6 def readCOCOJSON(jsonPath):
----> 7 with open(jsonPath) as f:
8 data = json.load(f)
9
FileNotFoundError: [Errno 2] No such file or directory: '/content/drive/annotations.json'
我做错了什么?
我查看了 source code for the COCOLinearInstanceSegmentationAugmentor class(这个项目的存储库有点乱——他们已经提交了二进制 .pyc
文件和其他杂物,但那是一边.. .)
看起来你应该可以简单地通过子类化来做到这一点:
class MyCOCOLinearInstanceSegmentationAugmentor(COCOLinearInstanceSegmentationAugmentor):
def __init__(self, inputPath, parameters):
super().__init__(inputPath, parameters)
self.annotationFile = os.path.join(inputPath, 'new_name.json')
或者,由于 self.annotationsFile
只是一个普通属性,在实例化 COCOLinearInstanceSegmentationAugmentor
之后,但在调用任何使用该属性的方法之前,您可以简单地为其分配一个新值,例如:
augmentor.annotationFile = <whatever you want>
我正在尝试从 clodsa 包中修补增强器函数以读取自定义命名的 .json 文件而不是遵循它们的格式,所以不是 /annotations.json 而是 new_name.json :
!pip install clodsa
??augmentor
Type: COCOLinearInstanceSegmentationAugmentor
String form: <clodsa.augmentors.cocoLinearInstanceSegmentationAugmentor.COCOLinearInstanceSegmentationAugmentor object at 0x7fbc1f48de50>
File: /usr/local/lib/python3.7/dist-packages/clodsa/augmentors/cocoLinearInstanceSegmentationAugmentor.py
Source:
class COCOLinearInstanceSegmentationAugmentor(IAugmentor):
def __init__(self, inputPath, parameters):
IAugmentor.__init__(self)
self.imagesPath = inputPath
self.annotationFile = inputPath + "/annotations.json"
# output path represents the folder where the images will be stored
if parameters["outputPath"]:
self.outputPath = parameters["outputPath"]
else:
raise ValueError("You should provide an output path in the parameters")
self.ignoreClasses = parameters.get("ignoreClasses",set())
def readImagesAndAnnotations(self):
(self.info, self.licenses, self.categories, self.dictImages, self.dictAnnotations) \
= readCOCOJSON(self.annotationFile)
我尝试了以下方法来修补 self.annotationFile 路径:
def new_init(self, inputPath, parameters):
IAugmentor.__init__(self)
self.imagesPath = inputPath
self.annotationFile = inputPath + "/new_name.json"
# output path represents the folder where the images will be stored
if parameters["outputPath"]:
self.outputPath = parameters["outputPath"]
else:
raise ValueError("You should provide an output path in the parameters")
self.ignoreClasses = parameters.get("ignoreClasses",set())
augmentor.__init__ = new_init
当我 运行 新的 init 时,它确实显示猴子用 ??augmentor 修补了 init。init
但是当我 运行 完整代码时,它只是回退到使用旧的 init 语句:
---------------------------------------------------------------------------
FileNotFoundError Traceback (most recent call last)
<ipython-input-15-30ca2128bdb6> in <module>()
1 #Perform the augmentations
----> 2 augmentor.applyAugmentation()
2 frames
/usr/local/lib/python3.7/dist-packages/clodsa/augmentors/cocoLinearInstanceSegmentationAugmentor.py in applyAugmentation(self)
87
88 def applyAugmentation(self):
---> 89 self.readImagesAndAnnotations()
90
91 newannotations = Parallel(n_jobs=-1)(delayed(readAndGenerateInstanceSegmentation)
/usr/local/lib/python3.7/dist-packages/clodsa/augmentors/cocoLinearInstanceSegmentationAugmentor.py in readImagesAndAnnotations(self)
84 def readImagesAndAnnotations(self):
85 (self.info, self.licenses, self.categories, self.dictImages, self.dictAnnotations) \
---> 86 = readCOCOJSON(self.annotationFile)
87
88 def applyAugmentation(self):
/usr/local/lib/python3.7/dist-packages/clodsa/augmentors/utils/readCOCOJSON.py in readCOCOJSON(jsonPath)
5
6 def readCOCOJSON(jsonPath):
----> 7 with open(jsonPath) as f:
8 data = json.load(f)
9
FileNotFoundError: [Errno 2] No such file or directory: '/content/drive/annotations.json'
我做错了什么?
我查看了 source code for the COCOLinearInstanceSegmentationAugmentor class(这个项目的存储库有点乱——他们已经提交了二进制 .pyc
文件和其他杂物,但那是一边.. .)
看起来你应该可以简单地通过子类化来做到这一点:
class MyCOCOLinearInstanceSegmentationAugmentor(COCOLinearInstanceSegmentationAugmentor):
def __init__(self, inputPath, parameters):
super().__init__(inputPath, parameters)
self.annotationFile = os.path.join(inputPath, 'new_name.json')
或者,由于 self.annotationsFile
只是一个普通属性,在实例化 COCOLinearInstanceSegmentationAugmentor
之后,但在调用任何使用该属性的方法之前,您可以简单地为其分配一个新值,例如:
augmentor.annotationFile = <whatever you want>