QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3525|回复: 0
打印 上一主题 下一主题

深度学习和目标检测系列教程 8-300:目标检测常见的标注工具LabelImg和将xml文件提...

[复制链接]
字体大小: 正常 放大
杨利霞        

5273

主题

82

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2021-7-14 15:18 |只看该作者 |正序浏览
    |招呼Ta 关注Ta

    % {/ N7 R; ]) t0 j. H7 w9 t深度学习和目标检测系列教程 8-300:目标检测常见的标注工具LabelImg和将xml文件提取图像信息5 y5 y% T9 C+ ?/ K! H' ~
    图像标注主要用于创建数据集进行图片的标注。本篇博客将推荐一款非常实用的图片标注工具LabelImg,重点介绍其安装使用过程。如果想简单点,请直接下载打包版(下载地址见结尾),无需编译,直接打开即可!
    $ K% `2 e7 E1 _- ?$ o4 B8 n
    $ K) ?& c  x, {" q$ [9 R+ o

    $ K/ R' v( W& T& q感谢原作者对Github的贡献,博主发现软件已经更新,可以关注最新版本。这个工具是一个用 Python 和 Qt 编写的完整的图形界面。最有意思的是,它的标注信息可以直接转换成XML文件,这和PASCAL VOC和ImageNet使用的XML是一样的。
    " D" Y  x- Z. f( B% B' v5 S  A6 b% G) M: `/ N$ d% ]

    ! n" \) G; v+ v4 z9 B附注。作者在5月份更新了代码,现在最新版本号是1.3.0,博主亲测,源码在Windows 10和Ubuntu 16.04上正常运行。
    7 Y/ \8 G# W  A  s8 y8 v3 l8 k7 X' ]2 T5 {3 n% h3 e
    , d7 M! `5 k+ v) J# Z
    具体的安装查看Github教程:https://github.com/wkentaro/labelme/#installation
    & ^/ q' z$ ]1 B6 E" T/ t+ q' J: r# |
    , `+ I4 k+ G$ N  u3 I# c
    在原作者的github下载源码:https://github.com/tzutalin/labelImg+ B8 H6 |$ m; W4 M
    。解压名为labelImg-master的文件夹,进入当前目录的命令行窗口,输入如下语句依次打开软件。! i* A7 P+ S* Y2 A+ C" F- ?

    / [6 R6 v: M8 ]" N
    5 E3 p: ]" t, R
    python labelImg.py
    0 R( t5 J% f/ q1
    9 C3 w+ Y9 t8 Z3 L0 x: j# {  Q3 T( E0 A" \+ f0 K( t

    0 u7 k, h7 q6 a  z$ r7 u) }
    - A8 Y" T/ |$ S% d$ D

    5 S: q, ~4 I. R( [& X具体使用
    2 O, l# t" R2 M! P修改默认的XML文件保存位置,使用快捷键“Ctrl+R”,更改为自定义位置,这里的路径一定不能包含中文,否则不会保存。- F6 ]& s- J- A- t5 ~1 T

    ; m2 r0 Y! y7 B0 m% m3 K* _9 w

    ( i* n! G+ Q1 l0 l使用notepad++打开源文件夹中的data/predefined_classes.txt,修改默认分类,如person、car、motorcycle这三个分类。/ ^+ B& K2 D, s1 d2 j
    % _; Z6 K0 k# \' j8 p

    ! ]  f* C5 t: q4 V( D! Q“打开目录”打开图片文件夹,选择第一张图片开始标注,用“创建矩形框”或“Ctrl+N”启动框,点击结束框,双击选择类别。完成一张图片点击“保存”保存后,XML文件已经保存到本地了。单击“下一张图片”转到下一张图片。
    3 D& ~% F2 t2 T+ a$ p! D/ Y1 P" p4 z+ v3 a: v
    1 q5 L* h8 q1 Z9 a& _  M, B' M* u
    贴标过程可以随时返回修改,保存的文件会覆盖上一个。! W4 O2 L! D0 }. j% p
    : Y3 {& b, x" A) \! B8 z

    " D6 y" H' l9 f! D9 `完成注解后,打开XML文件,发现和PASCAL VOC格式一样。. l) H# k. m- \$ C( k

      c8 A6 G: Q+ @8 M  [0 a

    ( K" C) }2 B3 W  Z: ?6 @将xml文件提取图像信息
    % v" Z, D9 r  n4 K4 r* K* n下面列举如何将xml文件提取图像信息,图片保存到image文件夹,xml保存标注内容。图片和标注的文件名字一样的。
      f7 b. R0 R7 y0 L4 y- l, k
    3 Z2 A) p+ x- k+ l
    6 v6 ]9 L0 c& u7 |
    8 g; n/ N3 M! D. Y+ j5 y4 J7 E

    - @$ d" F- h; ~7 u1 [/ y+ m下面是images图片中的一个。7 {1 s9 w. r) c

    , v7 G8 h; ^7 }1 M$ D6 y" m
    . R6 y" F  I$ r6 P! W$ P: m9 {
    下面是对应的xml文件。0 F  M6 Q9 n# w5 e
    - N' D; X% [7 Y4 Y" x- T
    * Q3 V2 j% ~4 K. Z) ~4 Q
    <annotation>) L4 v$ h; E) G* Z3 d! l: n
            <folder>train</folder>
    1 F5 l5 i3 r* @! ^        <filename>apple_30.jpg</filename>
    3 M$ v# K9 K2 ]: s" |        <path>C:\tensorflow1\models\research\object_detection\images\train\apple_30.jpg</path>" J) r. ?' {$ @! ]. I( ~2 S6 V! v
            <source>9 b; O7 K2 x# M8 _3 c5 u7 e8 a  q( N
                    <database>Unknown</database>% Y" h2 q6 o) O2 d
            </source>
    5 z/ h& ]# V; X4 b  n' B* A        <size>
    4 U1 G; a$ e7 g$ `* V0 K                <width>800</width>% X+ v9 Y6 Z/ i7 o# {
                    <height>800</height>; ?0 R9 O; l4 r7 a, I' z" z6 C
                    <depth>3</depth>
    * s& v: L5 y3 ~! j0 A3 A8 N4 k( i        </size>. M3 B0 N$ v3 v+ m) p
            <segmented>0</segmented>* W$ c9 _. _. Z, e2 y6 a: N/ o( J
            <object>8 E; c- s1 n3 m
                    <name>apple</name>: s7 d! ]  t0 Y' S* O3 u+ E$ T8 j2 Y
                    <pose>Unspecified</pose>
    0 ^2 K* f) ]5 V0 ~8 J& n' `4 x                <truncated>0</truncated>& m9 d1 G! P5 `3 b% ]  p/ d
                    <difficult>0</difficult>( O: l; o" m4 [( T' _0 H) I
                    <bndbox>
      l: q0 |; p+ @! Z8 z8 c' Q) T2 [( S                        <xmin>254</xmin>
    : Y* x4 ]% u. `                        <ymin>163</ymin>3 \7 A$ `  D1 h: h% ]
                            <xmax>582</xmax>5 o6 i" l; J( ~
                            <ymax>487</ymax>/ i5 `$ v. D% H
                    </bndbox>
    7 \3 c* }$ Y, }( X6 V        </object>2 W  ?- n7 d$ {+ _* x
            <object>" P- r/ E# S: L& G% W! [0 d9 \4 F5 W
                    <name>apple</name>6 r) ]- |+ f" l( l8 }$ ?" q8 J: x
                    <pose>Unspecified</pose>' h% J! Y( Q( r2 _- n  D
                    <truncated>0</truncated>
    . r$ ^/ T: \' K7 T' J8 C$ a                <difficult>0</difficult>
    9 g3 Q  l6 v+ ]7 ?+ K& r2 g. Y                <bndbox>3 B5 F( m$ L0 V; C4 Z0 U
                            <xmin>217</xmin>8 I( l+ L* }/ W5 e$ X
                            <ymin>448</ymin>
      p! U) {9 B8 e% t3 x                        <xmax>535</xmax>& V  L- N# N2 T/ B( p, _( j
                            <ymax>713</ymax>
    6 d2 G' s; Y% P2 \- L6 a: M                </bndbox>6 ^: |% H( ?$ N5 J
            </object>
    ' z+ I' |" J: v% ]        <object>
    , ^" ?3 X$ `) ^. `0 [                <name>apple</name>
    6 ^: w4 a8 B' r3 c$ W                <pose>Unspecified</pose>
    2 o' n+ S/ T% W- j& {, v9 |% \& A- Q                <truncated>1</truncated>
    - G5 X4 B' H; V3 w                <difficult>0</difficult>$ J% b) O, |$ }0 [# `
                    <bndbox>
    ! Z( P! [) h9 @* h6 c                        <xmin>603</xmin>
    9 ~& \4 {7 \9 m7 c( A/ }& Q+ K1 _                        <ymin>470</ymin>
    % ]5 R, g4 v! {1 X# e- L" g                        <xmax>800</xmax>0 Q& O$ d$ y7 I& [
                            <ymax>716</ymax>
    ' {1 x3 k8 r5 n) |; G                </bndbox>
    : c: I7 F9 ]8 t" y( e/ [7 A        </object>
    # j: a' i; ^* B  ?9 j: h        <object>2 o+ s) o& L7 H) P$ p' u5 }  r7 ]
                    <name>apple</name>
    ; S& i9 z/ h, R( y4 R  [9 k4 |2 t                <pose>Unspecified</pose>8 [8 G! G* ?$ w+ j. y" c' W  `( X; t
                    <truncated>0</truncated># p/ S% Q- \" Q- j  z: R8 I! I. o
                    <difficult>0</difficult>- I6 y2 {+ t3 ^
                    <bndbox>
    5 Y% L  r, i5 t  X" w+ V2 Y                        <xmin>468</xmin>: }# m" I$ x! t3 N
                            <ymin>179</ymin>
    % J+ ~% @- d3 v2 y/ y: a                        <xmax>727</xmax>/ O9 `: b* |; E! Y& M! K
                            <ymax>467</ymax>. [, ~( N9 u7 _- S8 b$ H
                    </bndbox>
    " i+ C& C  M- y5 [$ \' t3 g        </object>* `" L3 Y8 q" c  U
            <object>( j. ]" \9 z# U9 q$ S  ^( S
                    <name>apple</name>8 G3 z+ t3 _2 E0 i5 z- k
                    <pose>Unspecified</pose>% v, {7 U3 G0 ?+ s
                    <truncated>1</truncated>/ W1 ^! I6 D3 M  v" n' H1 S! G
                    <difficult>0</difficult>
    # @' m- c) |3 j9 F/ d% f1 i) x                <bndbox>
    5 U9 _- g5 v# a; W& |5 b                        <xmin>1</xmin>
    ( v  j8 J, S8 ]4 o+ U                        <ymin>63</ymin>
    5 q. _4 C/ F' R                        <xmax>308</xmax>
    / K, v( E" k, u" m                        <ymax>414</ymax>
    % `' r" m* t0 Q                </bndbox>3 l% X& Y5 g' q$ |
            </object>; `- J, Q9 y: O: h, D) X5 U3 [& b: U
    </annotation>7 B: }' F. i2 W) J$ [5 V
    1
    7 U/ E0 u$ Y9 V$ [" T! X2; ^( k& B7 \" \
    3
    6 p. N- J* A4 o: g/ k) H4
    ' E( k1 |: |9 z2 Y  C5
    & _* W* q  [2 @/ W* _( m6; \1 t* o  j" _
    7( s4 k6 R' z: Y+ Q; [
    8
    % m; ]  q- v6 ~, T- ]9
    7 R& _  ?* d! i- y, w10* Y8 n* {" r4 j5 R
    11
    & {' A' ?+ b! k% b12# p) ?1 Y9 A' D8 B0 J4 F# A
    13
    ' j( `0 V  `- S7 C' {% O; b141 Z0 m8 E& }+ i
    15
    8 G/ l( w+ |* o5 p" y- k) o- e/ @16' K1 k$ ?* Y" A8 @' c( v2 Z9 x
    17
    3 V  N8 q$ u' x9 T. H# X18
    4 \7 V  @/ Y6 S' j2 O6 [1 V' e5 w6 L190 {/ r( W9 k' q* i
    201 ^1 `% {+ }3 e% E, t2 n8 N) p
    21) G# @; v" F  b5 ?" a
    22
    ) x$ a% P% L$ l- w" J23
    7 X" G* Q. K4 c) I' U8 z9 r. h24
    & v. w4 W  G- J, `  ]25
    4 D7 u8 j8 N5 p( [26
    + y/ y7 _* q" p% C3 i3 y# j278 r* K$ F. ~% a5 ?9 p2 s/ c* x
    28
    6 u: K% v  \. b. \: |/ [29
    . o1 [1 O/ {, `$ X7 N( E: \, k30& F( F. @9 c  x# h; ]7 t
    31: R  f. Y# ~% X* g+ }
    32
    ' T1 d1 {; z- r8 e33
    ( b4 @5 S/ W  A3 K34) t: A3 `% G5 |7 e
    35
    - V0 P6 C( g: Q* Z36& H0 S6 F% b+ Y# p' X3 E
    37
    6 E6 V. Z" \* w) i' v380 g( Y. F" }' y$ Z
    39
    # ]- C$ g4 G: t40
    2 }  L7 }, p3 ]  L, a; T. {( a41
    6 B0 u7 J9 ^0 g& x4 ]42
      f) ^. _  \8 p" F; s  |43
    & y2 H: _) R1 x' _& @; A7 ?) ^448 k, X1 `$ D8 ]; \" A1 F0 k* |
    45: R6 w; C6 E& P( A6 k) u3 R. }* }
    469 I) I3 }% U& b+ w) L
    47- |5 D5 _# y* U; v+ S
    481 k/ p& Q9 e0 {1 i
    49, U2 ?8 D/ }# B; z
    50! }1 v7 @4 Y' D- V6 ^8 i8 K
    51' p3 V9 Y9 R5 F& _; C2 a
    52
    : H& y7 y; Z% v; m1 K2 b( H537 A$ z) D( N$ W$ r6 R  V
    54
    ' I/ T- G, k2 O/ _8 A$ g8 p55
    6 l3 a. e- J& p  f+ |, t56
    - o' X- {0 i' k8 a57( w1 k! h% C( e& a3 {
    58
    - c% W. k: A$ l! C" p59
    . F. o) y) r$ r6 r' z# ], W7 r60
      x  a) z  o2 y8 u: I" _* M61
    $ n" K! z, n* a  u% h62
    6 W; [2 J" P! _7 ?4 `63
    : b$ c% \2 ~$ y! a* q; B, P& l64
    ! K# I5 t: t3 C% e& ~* {6 k65
    * G& m+ }8 S9 Q) W( |+ ]# `, U( G66) b* x+ V& d6 X7 s! I7 f; D4 l
    675 b- T+ Q9 D6 p; L) u
    68
    / o; i  X1 j. H69* u/ {% }; f, R9 f. V0 k- s( w
    705 _! @  f3 y  ~4 {
    71
    " ]$ ?; P. l7 V3 [3 s" p1 E72
    % I* ^) e+ Q; `; u1 H  U0 W73
    ( z) Q! Y( \) d1 Z; Z74/ M7 [: D9 e, Y/ I
    将xml文件提取图像信息,主要使用xml和opencv,基于torch提取,代码比较凌乱。
    ) w* R3 H" c# |$ V4 L/ _+ n& L: q( M' J
      a/ B- }7 r6 n. }3 l/ y$ @
    import os
    ; k  r7 |0 X& {. _2 ]1 ]! Pimport numpy as np
    ! p! S# j- J$ a% ]import cv2
    * s- E0 X& I- Pimport torch2 M; \2 C, R3 |" k# W
    import matplotlib.patches as patches' F8 m0 U3 u" W0 b% c- M; K
    import albumentations as A: a2 V1 u9 y7 k" u1 c4 G7 ~
    from albumentations.pytorch.transforms import ToTensorV2. e( o, y1 W, S$ F
    from matplotlib import pyplot as plt- T+ l7 f( a: E9 I- V. V5 u
    from torch.utils.data import Dataset8 w8 H/ E' N8 B6 s) R6 `
    from xml.etree import ElementTree as et9 ]6 f0 |# l2 |
    from torchvision import transforms as torchtrans1 g) `0 F) q& f

    $ O  {9 `$ O+ B! i
    3 |2 l# F+ `! J' c3 H2 s  o- N
    # defining the files directory and testing directory
      x& n# e+ l1 w& {( D+ {" ntrain_image_dir = 'train/train/image'2 {! P8 {8 i4 h/ u# o5 ^
    train_xml_dir = 'train/train/xml'1 N6 W- h) n5 {- Y# o
    # test_image_dir = 'test/test/image'9 t) b* n8 V0 B+ S5 J3 O
    # test_xml_dir = 'test/test/xml'
    ( I' O' l2 P8 {# E! J8 R
    * D, C6 u" P2 c2 T4 e
    + k0 w8 a, s$ p* J# M2 U( f
    class FruitImagesDataset(Dataset):8 H  n0 f, t, F5 O7 h$ ]

    ! A/ ^6 E1 T( Q% N# Y; S
    # m3 N, P+ B/ h! U) h' O' S
        def __init__(self, image_dir, xml_dir, width, height, transforms=None):9 \( k9 j6 ^+ B: N3 t" Y& I" b0 H4 p7 e
            self.transforms = transforms$ X$ R5 b1 l2 k  z1 Z
            self.image_dir = image_dir9 Y; a( {' p: d9 y" f
            self.xml_dir = xml_dir
    ' z0 r2 v$ v! ?0 c4 A% S3 g        self.height = height+ O# a9 b( A# U) l( z" e
            self.width = width) b& C; N+ c, X; j4 B( ?8 y
    / Z5 p" {# m! c0 d
    5 w/ x# ~* H) y) A+ N4 M4 b
            # sorting the images for consistency
    / ~$ n* ]. i$ x8 S* p' s8 U        # To get images, the extension of the filename is checked to be jpg# Y" U! k1 S; A5 v1 {
            self.imgs = [image for image in os.listdir(self.image_dir)* x# }4 r. s  S) C- J
                         if image[-4:] == '.jpg']/ n# w6 ^; o( I8 d( k/ a
            self.xmls = [xml for xml in os.listdir(self.xml_dir)
      P. ]' V: O3 @- \+ z& k% R; Z6 P- {9 U                     if xml[-4:] == '.xml']
    , f+ x$ i8 W. y( [2 ^% y2 r$ z! D5 L/ ~* y/ Y
    6 h2 Q9 p5 L& o
            # classes: 0 index is reserved for background
    , Z% Q1 n$ R; I" N6 c        self.classes = ['apple', 'banana', 'orange'], o7 N! E) `+ B
    9 Q/ T0 B8 X. D9 S; m5 x$ b  t

    # N3 K, S! z8 S3 R0 l- u* {    def __getitem__(self, idx):7 m- }0 v( G- S- W' t2 H) {
    ! @* `  j9 G% T% R$ g6 x" t' V

    $ r5 K( a$ v' |; Z# |1 d        img_name = self.imgs[idx]" F/ s( V' b) O
            image_path = os.path.join(self.image_dir, img_name)  z: s" W4 X5 i3 A) W8 E" H

    7 l6 {: f: A; j! |( k; @
    # Z7 P7 H/ Q8 W& W; o
            # reading the images and converting them to correct size and color
      W* p3 Z; ^6 K6 W' M- P$ O# h        img = cv2.imread(image_path)
    4 M/ ?. d2 n0 N5 A8 z: j  l6 N        img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB).astype(np.float32)% C2 y3 m9 w! U5 j. W
            img_res = cv2.resize(img_rgb, (self.width, self.height), cv2.INTER_AREA)
    + o4 c% C: c# Q9 Q        # diving by 2555 N0 Y9 Q# ~3 G9 G1 g+ R* ~( `
            img_res /= 255.0
    ) c3 [1 j3 ~/ b, c& @
    : ]  ?: i; h5 p# W$ `: M  c% z

    , ~, O) @# O1 c        # annotation file
    * Q! b* R5 |3 {! R3 p        annot_filename = img_name[:-4] + '.xml'7 }' ~# ]/ p& H3 B. Q7 R5 N3 F
            annot_file_path = os.path.join(self.xml_dir, annot_filename)
    / J9 R1 p, W8 F+ w. }
    ! d' r# S+ L8 ]

    $ i( y) r% G/ c* H& }  ^        boxes = []7 G+ d' Q* B* R3 B0 X& K
            labels = []
    & K) m5 r0 P* [/ |, B% n; m$ h        tree = et.parse(annot_file_path)+ a: s' n8 A" W- `# ?6 y, P
            root = tree.getroot()3 g  }- G# T5 Y4 A, ?

    ( @, ]) g1 R' }  D

    9 X! l8 @. ]+ z1 D* v* K8 K        # cv2 image gives size as height x width6 U' d, Y8 D6 Z. c* g( E
            wt = img.shape[1]6 n4 [* m6 P. H; f5 v6 U8 f
            ht = img.shape[0]7 ^1 I9 @8 [  `8 o6 c

    : }0 i$ E3 m8 M+ Y. G8 W

    , y! F7 ~' I) _2 `4 Q- N7 g        # box coordinates for xml files are extracted and corrected for image size given
    , f8 f3 W2 O; i3 k5 X; V) L* j. s6 e        for member in root.findall('object'):
    $ k" l1 c$ H) u7 m$ I+ W            labels.append(self.classes.index(member.find('name').text))) J# C0 y& J/ ]  O' Y8 }* z/ Y8 ~

    , I" U6 H# h& r

    ; V8 g/ x; Z+ n" ]$ P            # bounding box
    ) T% `4 ~$ U$ k& }7 D$ q, S' Y  z            xmin = int(member.find('bndbox').find('xmin').text)
    $ f) c6 j! a9 D9 c            xmax = int(member.find('bndbox').find('xmax').text)" |/ R7 h0 P  a* _/ t. u
    2 P) s' n; Q/ A/ E& ~

    % y& m' W9 J/ u/ R5 ?            ymin = int(member.find('bndbox').find('ymin').text)+ [' D: F+ r4 S  G; V
                ymax = int(member.find('bndbox').find('ymax').text)
    0 S% i9 r6 ~& f: s0 p" H
    . j/ [1 c# d7 T7 [) i$ |5 I

    ; G* ?8 I! M6 B# Q* I% C            xmin_corr = (xmin / wt) * self.width
    % w8 i9 Y# P' h. L1 n; ~- a) v            xmax_corr = (xmax / wt) * self.width
    $ [4 w" R; r/ H0 t# E            ymin_corr = (ymin / ht) * self.height9 O. b$ P! ^1 J
                ymax_corr = (ymax / ht) * self.height& h" p% I1 D4 s8 A4 t
                boxes.append([xmin_corr, ymin_corr, xmax_corr, ymax_corr])
    & a5 v- g$ u# H1 t' O( W8 i3 F$ p6 e, k; Y9 X
    7 A% |1 X2 W& q' J- S$ n* ~* B
            # convert boxes into a torch.Tensor
    1 v8 b2 |8 Y% ^        boxes = torch.as_tensor(boxes, dtype=torch.float32)3 l3 @- q$ t9 k" K
    . L8 D8 y  ?7 y- a9 g1 N, r
    ! P! r2 v8 w0 L% d8 N
            # getting the areas of the boxes5 Y* e; ~! k' _7 }
            area = (boxes[:, 3] - boxes[:, 1]) * (boxes[:, 2] - boxes[:, 0])' S$ S3 r# r9 ^2 C$ }( S

    / p6 v/ N/ G+ z3 ?- J' O7 y& a
    , ?  `% r# |9 N% Z# W
            # suppose all instances are not crowd' v7 L* e, Z7 X9 q. T
            iscrowd = torch.zeros((boxes.shape[0],), dtype=torch.int64)
    1 x/ G" a  V! \
    # \  j$ m) _, [4 O# _3 Z8 X
    3 X2 F* C2 e2 ^8 \& v
            labels = torch.as_tensor(labels, dtype=torch.int64)
    ; o& V9 `3 f" s, d2 h( o) K: {4 x9 e  N3 R) _* ~2 X! R% c9 A* `% }

    0 a* A4 F% k1 M( P6 \+ \7 J        target = {}1 y6 M5 I. l& H- W# d: u0 x
            target["boxes"] = boxes
      W4 w, f/ W6 X, F        target["labels"] = labels
    ( Y+ U, ]- N3 w. Q        target["area"] = area
    ! M$ W, [4 V" l! K1 F        target["iscrowd"] = iscrowd
    6 g3 T. P  _( \+ ?) d& G& X- A, m        # image_id# l5 t- O& K6 A% k: G
            image_id = torch.tensor([idx])0 V' |3 a" {6 e1 |# Q) X
            target["image_id"] = image_id( d; p3 \3 |5 j; O/ B& B; T2 b9 F
    $ y8 j* H. `/ P& v7 H' |
    ) W/ V1 S: a- ]7 r
            if self.transforms:
    . `. \3 H8 s1 C, N8 W            sample = self.transforms(image=img_res,. J1 j- `' p. y3 p6 X
                                         bboxes=target['boxes'],
    ) b: t# i6 B5 j                                     labels=labels)* _8 y6 ^' M8 {" H' f' T0 I
    : e  G% Q, a5 A, q. v+ Y$ [
    & j  t# P: Q' p; H
                img_res = sample['image']
    ) C- G7 D8 O5 @2 I6 _            target['boxes'] = torch.Tensor(sample['bboxes'])
    7 a# T6 O! Y) K
    8 T" I! [  t6 @5 k; n' _4 e

    $ r2 W+ P1 P5 ^        return img_res, target- E) U- T+ u& s! x4 O
    . ]/ J( Q: @" o
    ' q" p; J4 }% z1 ^( h$ {
        def __len__(self):( R  n' N  b1 [: R2 K% p6 p
            return len(self.imgs)2 |4 y/ s( o: ?% e8 `
    ( h. O3 S# d: `, v
    3 e. G4 I# a0 O7 Q3 Y3 H/ v
    # function to convert a torchtensor back to PIL image
    " E) f/ E7 k! ^. s/ \+ I! }def torch_to_pil(img):9 V+ ~3 M5 s4 F8 u+ Q$ k
        return torchtrans.ToPILImage()(img).convert('RGB')
    6 `. |, i4 M# g; f5 b1 T8 U7 f! Y9 |6 K# [$ c% t
    . @: X$ K5 a# d- t

    5 \8 K) N- p2 R

    8 X! O' a! B: k8 X8 Hdef plot_img_bbox(img, target):
    + v  x0 r0 _: l- j- f9 G2 K    # plot the image and bboxes. h- f: |; c, c' L
        fig, a = plt.subplots(1, 1)
    - q% Q  e0 s) t6 ^; c2 k! t/ i1 N9 P    fig.set_size_inches(5, 5): }/ w5 q" v2 V! F
        a.imshow(img)
    3 P( K7 y& r2 }$ J7 r" ?) W: J' h    for box in (target['boxes']):
    1 I6 R0 S; |9 T9 Q        x, y, width, height = box[0], box[1], box[2] - box[0], box[3] - box[1]* h" H- S" d: x- Y
            rect = patches.Rectangle((x, y),
    2 Q* h, p- k" q# D                                 width, height,
    5 C: z* l; u: M" V, F. o                                 linewidth=2,
    5 D- ^8 L' t2 C' p                                 edgecolor='r',
    ; q% _3 R  b4 A" B                                 facecolor='none')( p2 A1 N2 [3 W3 o; E

    : z2 l+ i3 `0 k! p

    ' X3 i7 [& I6 B        # Draw the bounding box on top of the image  N( ^. v/ r8 U, b% N3 B, \
            a.add_patch(rect)
    ) R' K( U! ~, K% }* g4 a    plt.show()" m7 g( [: h# e
    1 K6 a  a# t- \7 s, S3 l; b( ~

    * W/ e7 m( }* {" O9 v' t
    : O, X# B( J9 }% g! F

    : m1 a( I# X( [* [def get_transform(train):
    , T$ H9 {) u! L6 R    if train:: m- w7 S, b2 D0 ^
            return A.Compose([# o; f# |& k' [: F( G# W) `6 H, W
                A.HorizontalFlip(0.5),
    # t1 P% x8 q# ]& e) N            # ToTensorV2 converts image to pytorch tensor without div by 2553 I7 g- H$ G. J+ n
                ToTensorV2(p=1.0)
    % P; @- P1 B, O9 V5 L        ], bbox_params={'format': 'pascal_voc', 'label_fields': ['labels']})
    + U0 z' n7 K$ p    else:
    % \3 }+ ~" [* v        return A.Compose([
    9 ?" g9 w! P7 h8 C            ToTensorV2(p=1.0), K, I4 {- T5 F3 B9 t
            ], bbox_params={'format': 'pascal_voc', 'label_fields': ['labels']})! b; Y4 G! B+ }* v) n
    0 Y+ C0 S% V; Y1 I* o' m, i% w
    " ?. |. y, F: o
    " |8 O5 v4 d6 r- Q/ Y
    5 _1 I7 I0 d% `" x( H, D. {8 I1 m

    2 K9 N4 a6 R( Y# Z& j
    " J- n4 N/ S# F7 W$ Z
    dataset = FruitImagesDataset(train_image_dir,train_xml_dir, 480, 480, transforms= get_transform(train=True))
    " m! b; c% k. Q5 x* U" z% r3 ], ^, A! A3 G0 T' a) ~3 a
    , i  Y$ ]5 ~  @# Z
    print(len(dataset))
      k: t+ i2 a! A7 N0 k3 l4 }# getting the image and target for a test index.  Feel free to change the index.3 Z' ^& p+ @4 _* r9 m
    img, target = dataset[29]& E1 f( o& \; o& x9 N0 n( ~/ D
    print(img.shape, '\n', target)
    * I, f& U! y+ bplot_img_bbox(torch_to_pil(img), target)
      C9 t; n1 ^. E1
    # X6 _% h: u+ f8 K# ?22 L9 z/ N$ S" j) q2 Q
    35 {- A* \; K" A/ n) a8 S
    4: o( [% B. v5 j1 S& v; r# Z
    5$ O2 ?, x/ K- ~$ k8 Y- S
    6  t& Z* A& U6 I; v
    7
    8 O9 `! W! |0 Q, @* A81 A6 h, ~% h2 R; R9 M  t
    9
    , ?  k0 D- `) i: l- Q: m' Z  N10. h4 E( \' I7 Q2 L# z
    11
      h) E' e8 C# J- z+ a5 w" j& U12. O8 g9 x! n$ `0 b
    13
    7 g$ O% y: a( f9 D& Z, f143 W" Z9 Z6 @& {5 c0 o4 e! Q  J- [
    15
    " y* X6 t3 N, P" k1 @16
    , p- ~4 q" S1 U) o1 A17
    6 a7 N" J: _' M+ l189 ~6 a3 ?" {/ C: N7 O; x% t6 Q
    196 f) D# ~- }3 l0 L
    202 x* h: A+ F9 D- Y8 ]& s9 W1 _
    21
    1 \1 o- y1 [" Z7 ]$ V& G227 I$ h8 s# n( @5 E4 ?& |  P
    23; x7 ]* b: ^: o$ d* O* i1 Q% P
    24
    7 u+ e7 e6 N1 F# Z9 v* }( @* {% J25
    / h; Y/ D" Z2 s' m26
    0 m: O1 ?# v& y( v: t27
    7 e( H- T# ]/ P- c5 e! {7 x28& }! W) W) q: n$ R
    29; I- b; \4 x# x2 H  Z- r
    30
    1 T7 d7 H. D7 J  W+ y31
    ) Z3 l+ E" q4 B& R; o) V: c321 s2 y& h% ~. Z* @4 j6 g
    33* L6 O3 y% |2 g9 y: J
    34+ x7 ^* g0 v; P! f  y
    35  N( M% f5 D* X) q# L1 }
    360 n' O8 A1 Q$ U+ }$ @) k1 J+ p1 k
    37
    ! Z5 F1 q- t- N: f38
    / M7 i; L" B4 r. O* q39
    3 E0 E- w3 G: F# j7 Y  P40
    : R: @/ }# P. m& d& G, ^+ H. q. P416 }, |7 k4 ?5 ]/ L4 I  _7 J2 t
    423 W1 w" N$ n! o
    43
    7 V# ?: _7 p7 a2 o44
    , x4 p4 L$ Y' E2 c4 x) }45
    1 e8 t) e- u4 u46
    7 _# r0 q5 W, F5 B47
    2 v) }+ v8 B% a4 I+ R48
    4 L7 [6 j* k5 j& }" ]49
    6 \/ ~" L% r/ O0 a. e' s. `* f50
    - I- Y% ]8 a$ J$ Q! K# |1 [510 g3 [! k5 E) n0 _
    52+ S/ M7 ]6 z9 c2 H# \  E6 L! b
    53
    " Q( h; R/ c+ f  O5 ?9 a54% k% B8 S/ r; s
    55& y; S; C9 \5 ?" Y6 C
    56, u  l( Y* B# x$ d! z8 z; j
    57
    4 _6 Y6 J4 K/ W4 l: W588 z3 L# p  X! v/ j3 b0 T& B
    595 J+ v7 u/ k- {* M: D) M
    60
    * H* w1 C2 \3 Q  M! E$ O61
    8 N4 q+ D. O3 o. I: z+ `62
    * T! O. y0 w+ e7 i! p0 R63
    $ A9 |0 |7 R: c: @7 l64
    7 @1 j) e! u( t2 Z! }65
    0 z" O* \+ t* G( \6 B, y; O66
    3 N# j+ C; n/ y/ r# t/ Y4 D67
    $ A0 M+ f/ K" P& a) Y* B689 k1 K5 `, O0 n
    691 B9 M9 p& X3 s7 h' Q1 r
    70
    + u) W/ k" N0 R+ G: p71
    1 h5 y1 L: \7 z, q72
    * C5 c( I. E: b& o  u9 M6 }73
    9 `% a9 y) Z$ L74. {, b9 a$ T6 m# x% }" Q  R  [1 T
    75
    " d% S8 A8 V0 r8 b) A% X9 t76
    , ]2 Z& p4 B, r( s77) E1 o2 f- M6 u0 |1 i, a6 x! r
    78) M9 q" p' T/ _9 }
    79
    ' }1 g1 B* b; Q( \6 x800 u$ C' a, {0 k& t# P
    81. G! Z" b; @% Y: P5 N9 G
    82
    , \2 g& J& h* |2 F& I7 L833 P; v- ]$ ]0 A' k) D1 ~/ k
    842 \8 |! L  |1 s) M; |
    85
    : Q" K/ S2 A* X  `: J- _86
    3 B# E% l; N5 q6 \' D5 O' O2 u* _876 X2 ~  B( ?  u5 x9 s
    88" W; P4 R9 i: Q* z, W% K( `* G
    89
    3 O0 ]3 n1 {. Z; V; \: G/ R904 W  ?5 e8 ~4 F  N, Q8 ]3 C, n! H
    910 T& H: v, w/ n6 ?$ c' T$ |4 h
    92: R1 Q4 ~3 ^9 r: R+ o
    937 z$ i- w6 W8 H3 {( T+ @" j# h
    94
    9 V: C4 i. m% r: \7 d$ W8 M95
    $ E) C& v) d* w5 ?0 R96  R( h9 N7 |8 }% X& p' j0 N/ s
    971 W/ `  @5 m4 p" t6 ]+ }5 h
    98
    6 ~2 f3 v2 f' R- U99
    # \8 t7 ?$ x# Q1 q  H100
    - {3 q! T+ `3 X! R: P7 ?1013 T  Z- D- `2 O0 M" |4 t
    102
    ( G1 \& u: f7 ~1033 l/ Y. D7 W$ k# c& s- A: N
    1043 g7 i3 y6 ?0 U" v2 x/ ~/ Q$ j
    105
    % P7 R) w! U$ K: Y* F% K5 }106
    6 i+ A+ j# O* ^: m7 I7 B1070 I' R/ e) V- T- W9 y
    108
    $ w% H" `9 ]7 l. e4 i2 i" }6 T+ G7 H7 i# N109. n7 k, M% {" V
    1104 q, N- x! U1 n( ]8 v2 [
    111
    ( ^/ u% g/ U4 x- i1127 k4 O6 |+ I) L" ]4 r/ ]# C
    113& S/ G. z5 O# r: U$ k$ q$ Y$ \
    1148 p7 W0 M3 k$ ]7 Z$ n* b
    115
    ) m5 k- P7 B2 `6 ~4 o6 ~* |116
      F9 |$ P& a) a117
    . A* V( D* W% l0 \; k  `9 x7 r118+ ^  s' @7 F2 d( g
    119
    . Z# ?3 g6 }* E# w120! ?, d. {( E% b  ~+ o; k2 ~3 b: Y
    121. ~# I& H# g0 v  n
    122
    ; A6 e0 f: v9 y7 I1 V123* d8 O" \9 m9 k% d  \; }
    124
    ; X2 Q% K8 L8 p7 l125# X9 i4 @) L0 c
    126
    + x1 A, v/ B; _9 r: Z127- Q& n! _2 |! W4 Y7 F. d8 v; J
    128
    : a1 f) j: y; ]6 i* o129
    ; b4 ^# X$ W/ Z6 U5 ]( ?0 `130
    5 o3 B/ Z% ~% F9 x1310 r0 ~7 p3 w7 f) ~" Z
    132
    8 h4 k- ^2 ?6 r+ }4 N, Y1 O4 }133
    ( n/ j. C( |# h5 \) M; x134
    & j9 T. ?9 d. j1359 }$ }; ~" W$ p% J
    136
    0 R$ c  s( `# F; `# J& w' W* o137# R. P( X; W+ a- A! r7 Z; j7 u
    138
    ( B. j" N! n, c7 N/ \  |139
      `) h2 z7 t& |7 ~9 O* v, V1402 i2 U. S7 l$ v0 \9 ]6 Y
    141
    7 z& ^2 y/ X. T142' X- |' e' e: a- y1 x2 D
    143
    ' F$ e/ \# h5 `$ Y144" Y, L; J$ E, d, g/ e  H
    145! ?* [0 ?% q7 o9 U# l$ R
    146, r9 L: {2 F! ^; A- @+ T9 V
    147
    9 N+ u6 U9 n" V% d8 C% s+ _' O148+ V/ e$ ?7 [. j2 h" @, J
    149/ ~9 g- F4 |- |" q; u  O- w
    1503 ^; q; k) e# x
    151
    6 @# n2 o8 F! S! S% R9 L& Q152
    1 r/ q9 k2 I$ E1 c& l2 I1 q5 |  E153
      @5 c- B: B% P, B. `& c154
    $ @: E3 V' d+ q# L155
    ! y( @. A, ]6 q  r/ j156
    ; K7 ^1 ^8 x) R& D  z输出如下:
    3 {9 h3 i7 V2 I( s# o/ j( l: U- R
    : ]' S; Q$ h0 I; y3 \

    5 o. d; N% s* v% p6 ftorch.Size([3, 480, 480]) 9 j5 s* ]8 I, z$ J0 X
    {'boxes': tensor([[130.8000,  97.8000, 327.6000, 292.2000],6 C2 P% x5 \0 T# ?) j
            [159.0000, 268.8000, 349.8000, 427.8000],; Z0 G, b' {& l) [8 U
            [  0.0000, 282.0000, 118.2000, 429.6000],
    " S6 i  M% R, T7 O        [ 43.8000, 107.4000, 199.2000, 280.2000],
    5 u$ H$ Y) T. p2 Z        [295.2000,  37.8000, 479.4000, 248.4000]]), 'labels': tensor([0, 0, 0, 0, 0]), 'area': tensor([38257.9258, 30337.2012, 17446.3223, 26853.1270, 38792.5195]), 'iscrowd': tensor([0, 0, 0, 0, 0]), 'image_id': tensor([29])}/ |* @) x0 P( M6 k; k3 u% H8 V
    1+ J, ~5 \# t$ k5 n' W; a! d4 e
    20 ~) ~( g" B$ q0 i! x( M0 a5 l0 E
    32 j! F+ O- Q- m! O4 b' s6 t& ]
    4
    " m( x( T2 l& B& ]' l. j" z+ p' G5
    # r8 S, o1 E" D2 u: P6
    - [) B% x; S* `+ ^) q& H1 P8 H1 G6 z% v- C3 O! R4 |

    / d, p) x: O# o6 r9 R' }6 U
    % ?5 l# U! t, \. R# F
    + P, G& [& p/ L; _" h: a7 ~
    下载地址5 h+ I7 }0 j& Y0 E) @
    链接:https://pan.baidu.com/s/1QZDgeYTHyAlD2xhtJqZ-Yw. r& J. l3 W2 Y" V/ O4 G
    提取码:srjn
    3 ], ~" x* e# E; F: d————————————————! i6 U+ _' o; h3 ~6 q
    版权声明:本文为CSDN博主「刘润森!」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    3 c( K5 \* A+ [# ?  E  y原文链接:https://blog.csdn.net/weixin_44510615/article/details/118496273, z& @! j+ t, a7 s7 ]. ~
    : u+ w. T; [' v" f" ~9 v: i1 Z4 {

    % q/ o7 L) r# |. Y' ~4 ]) L
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-8-1 13:33 , Processed in 0.476666 second(s), 51 queries .

    回顶部