---
# System prepended metadata

title: python xml 的CRUD處理 用在 AI影像標註

---

# python xml 的CRUD處理 用在 AI影像標註
---
檔案位置: https://drive.google.com/drive/folders/1ORXhxrOXyHKQ9HvkS0dvmKb4rn5SgCg5?usp=sharing


前置參考:
[19.7. xml.etree.ElementTree — The ElementTree XML API](https://docs.python.org/2/library/xml.etree.elementtree.html#functions)

[python之lxml快速上手_Element（一）](https://www.twblogs.net/a/5b8cbda02b7177188334f4b7)

[python之lxml快速上手_Element（二）](https://www.twblogs.net/a/5b8cbda02b7177188334f4b6)

[python之lxml快速上手_ElementTree（三）](https://www.twblogs.net/a/5b8cbda52b7177188334f4bc)
<details  ><summary>labelImg 輸出 xml格式參考</summary>

```
    
<annotation>
	<folder>D2_picked</folder>
	<filename>20160801174444_real_0.jpg</filename>
	<path>D:\修改中\labelimg標註\girder\Class2\D2_picked\20160801174444_real_0.jpg</path>
	<source>
		<database>Unknown</database>
	</source>
	<size>
		<width>922</width>
		<height>688</height>
		<depth>3</depth>
	</size>
	<segmented>0</segmented>
	<object>
		<name>spalling</name>
		<pose>Unspecified</pose>
		<truncated>0</truncated>
		<difficult>0</difficult>
		<bndbox>
			<xmin>224</xmin>
			<ymin>277</ymin>
			<xmax>332</xmax>
			<ymax>334</ymax>
		</bndbox>
	</object>
	<object>
		<name>corrosion</name>
		<pose>Unspecified</pose>
		<truncated>0</truncated>
		<difficult>0</difficult>
		<bndbox>
			<xmin>192</xmin>
			<ymin>393</ymin>
			<xmax>275</xmax>
			<ymax>459</ymax>
		</bndbox>
	</object>
	<object>
		<name>corrosion</name>
		<pose>Unspecified</pose>
		<truncated>0</truncated>
		<difficult>0</difficult>
		<bndbox>
			<xmin>619</xmin>
			<ymin>265</ymin>
			<xmax>697</xmax>
			<ymax>323</ymax>
		</bndbox>
	</object>
</annotation>

```

</details>

---

```
xml_parse_count.py # 只計算數量不輸出 .csv 檔
xml_parse_count_csv.py # 計算數量並輸出 .csv檔
```
## 需求
"執行的資料夾名稱_csvfile.csv" 存放處理一個資料夾的結果,計算的是以一個框選為單位,只要一個框選標註數量就加 1


"_csvtotal.csv" 存放處理多個資料夾的結果,用excel 匯入來加總所有處理資料夾的結果,計算的是以一張圖出現該種劣化為單位,一張圖有出現劣化計數就加 1,不管多少框選都只算 1 個,下圖說明 對不同資料夾執行多次產生的 "_csvtotal.csv" :
![](https://i.imgur.com/OPr0ymS.png)

1. 計算劣化數量
    - 選取資料夾路徑(GUI或手動填)-手動填
    - 遍歷選取資料夾讀取 .xml 檔
    - 列出該張圖片的所有劣化分類
    - 計算各項劣化圖片總數量
    

    ## 使用
    - 安裝套件 : 不需安裝,使用內建lib
    - 執行 python檔: 
    `> python3 xml_parse_count_csv.py "要處理的資料夾路徑"`
    - 印出總數及各劣化數量如下範例:
    `Total xml : 6, defaultdict(<class 'int'>, {'crack_00': 3, 'rusty_water': 1, 'spalling': 4, 'crack_AC': 1, 'crack': 1, 'corrosion': 1})`
    - 輸出 .csv 檔包含劣化數量資訊方便匯入到 excel 處理
    (_csvfile.csv 存放處理一個資料夾的結果)
    (_csvtotal.csv 存放處理多個資料夾的結果,用excel 匯入來加總所有處理資料夾的結果)

---

`xml_parse_split_deteriorate.py`
## 需求
![](https://i.imgur.com/nFt8lB1.png)


2. 複製 .jpg圖片 和輸出 單一劣化 .xml檔 到新建的單一劣化資料夾 
    前置作業: 
        - 比對同一張圖片的多重劣化和個單一劣化的 xml 內容結構差異,確認需更改的地方
    程式:
        - 選取資料夾路徑(GUI或手動填)-手動填
        - 遍歷選取資料夾讀取 .xml 檔
        - 將劣化類別複製,並寫入到分別的劣化類別 .xml 檔
        - 複製.jpg圖片到劣化類別資料夾
        - 模組化

    ## 使用
    - 安裝套件 : 不需安裝,使用內建lib
    - 將這個 .py 檔放到想篩選圖片的資料夾內
    - 執行 python檔: 
    `> python3 xml_parse_split_deteriorate.py "要處理的路徑"`
    - 輸出單一劣化資料到對應的資料夾,複製.jpg 圖片檔並抽取單一劣化 .xml 檔進資料夾


---

地雷or障礙:
- xml 節點處理:
    1. 篩選劣化節點
        - 使用字典的方式,劣化種類放進 key,劣化數量放進 value 達成,範例如下:
        `{'crack':2, 'spalling':3, 'water_gain': 7}`
        - 搭配 collections.defaultdict 建立預設值為 0 的字典,將讀到的 xml <tag> 放到字典的key,xml <tag> 的數量放到字典的 value,用來計算單張圖片劣化類別的節點數(也就是一張圖有多少個特定劣化框選數量)
    
    2. 節點剪下貼上新xml檔
        - 上半部 xml結構組出來

擴展:
`所有 .py`
    1. 讀取要處理的資料夾 folder_path
    - 使用 Argparse 取代 sys.argv[1],好處是可輸入來源資料夾和目的資料夾,命令列夾 -h 會有說明
    `jpg_xml_rename.py`
    2. os.walk()會遞迴便利資料夾,但是沒有排序
`使用csv的 .py`
    3. 使用pandas 取代
    4. (X) 使用 *args **kwargs 來傳 header_row
    