气球 (豆瓣)
登录/注册
下载豆瓣客户端
豆瓣 6.0 全新发布
×
豆瓣
扫码直接下载
iPhone
·
Android
豆瓣
读书
电影
音乐
同城
小组
阅读
FM
时间
豆品
豆瓣电影
搜索:
影讯&购票
选电影
电视剧
排行榜
影评
2023年度榜单
2023年度报告
气球 Ballon
(2018)
导演: 米夏埃尔·赫尔比希
编剧: 基·霍普金斯 / 蒂洛·罗斯切森 / 米夏埃尔·赫尔比希
主演: 弗莱德里奇·穆克 / 卡罗利妮·舒赫 / 大卫·克劳斯 / 艾丽西娅·冯·里特贝格 / 托马斯·克莱舒曼 / 乔纳斯·霍登里德尔 / 蒂尔曼·多布勒 / 克里斯蒂安·内特 / 罗纳德·库克利斯 / 塞巴斯蒂安·胡克 / 乌尔里奇·布兰德霍夫 / 柏恩德·麦克·莱德 / 凯·伊沃·保利兹 / 贝恩德·斯特格曼 / 安婕·特拉乌
类型: 剧情 / 惊悚 / 历史
制片国家/地区: 德国
语言: 德语 / 英语
上映日期: 2018-09-27(德国)
片长: 125分钟
又名: 翻墙热气球(港) / 奇迹热气球(台) / Der Ballon / Balloon / Le Vent de la Liberté
IMDb: tt7125774
豆瓣评分
引用
8.4
58869人评价
5星
34.4%
4星
51.4%
3星
13.0%
2星
0.9%
1星
0.3%
好于 94% 历史片
好于 90% 剧情片
想看
看过
评价:
写短评
写影评
分享到
推荐
气球的剧情简介
· · · · · ·
故事发生在1979年冷战期间,冈特(大卫·克劳斯 David Kross 饰)和皮特(弗莱德里奇·穆克 Friedrich Mücke 饰)身处东德统治者的铁腕政权之下,虽然被限制了行动,但是两人并没有放弃对于自由的追求,他们利用长达两年的时间,策划了一起惊天大逃亡。
两人动用了手边一切能够得到的资源,制作了一个巨大的热气球,他们打算用最朴素也是最直接的方式,带领着他们的家人逃往西德。然而,就在一行人即将越过边境之际,热气球却因为意外而坠毁了,与此同时,他们的行动也引起了秘密警察的注意,针对他们的追捕很快展开了。一边躲避追兵,冈特和皮特还要一边想方设法制作新的热气球,一场与时间的竞赛开始了。
©豆瓣
气球的演职员
· · · · · ·
(
全部 30
)
米夏埃尔·赫尔比希
导演
弗莱德里奇·穆克
饰 Peter Strelzyk
卡罗利妮·舒赫
饰 Doris Strelzyk
大卫·克劳斯
饰 Günter Wetzel
艾丽西娅·冯·里特贝格
饰 Petra Wetzel
托马斯·克莱舒曼
饰 Oberstleutnant Seidel
气球的视频和图片
· · · · · ·
(
预告片4 | 图片404 · 添加
)
预告片
喜欢这部电影的人也喜欢
· · · · · ·
芝加哥七君子审判
8.6
1917
8.5
波斯语课
8.1
沉默的教室
8.4
冒牌上尉
8.6
地雷区
8.7
万湖会议
8.1
西线无战事
8.5
灰猎犬号
7.8
最后的决斗
8.3
我要写短评
气球的短评
· · · · · ·
(
全部 19219 条
)
热门 /
最新 /
好友
1107
有用
Die Katze
看过
2019-03-24 10:59:11
依靠工程技术能力争取自由,非常德国了。
467
有用
西袄补袄
看过
2018-10-20 03:18:20
我给了5星,因为这么久以来,终于又看到好看的德国电影了。德国人,一场战争一堵墙给了他们多少创作的题材啊!从头到尾我心都是悬着的,最后柏林墙被推倒的时候真的哭的不行不行。
235
有用
梦朝大海
看过
2019-04-12 19:23:37
如果一个国家好的让人想离开,那样的一个国家值得爱吗?
1246
有用
朝暮雪
看过
2019-04-12 17:55:00
宁愿被判叛国罪,宁愿死,也不愿意留在东德,因为自由比生命更加可贵。
感谢幼儿园老师能明辨是非、分清对错,没有赶尽杀绝。
66
有用
石头摇篮
看过
2021-05-23 08:15:11
幼儿园老师和邻居秘密警察的女儿,就是现身说法版的“你有抬高枪口一厘米的权利”。
>
更多短评
19219条
为什么被折叠?
有一些短评被折叠了
评论被折叠,是因为发布这条评论的账号行为异常。评论仍可以被展开阅读,对发布人的账号不造成其他影响。如果认为有问题,可以联系豆瓣电影。
你关注的人还没写过短评
我要写影评
气球的影评 · · · · · ·
( 全部 132 条 )
热门
最新
好友
我的画笔哪去了
2019-04-08 21:18:15
逃离东德背后的时代背景和原因
二战结束后,再次沦为战败国的德国根据雅尔塔协定和波茨坦协定,分别由美、英、法、苏四国占领。1949年 5月23日,美、英、法三国占领区合并成立了德意志联邦共和国。同年10月7日,东部的苏占区成立了德意志民主共和国。德国从此正式分裂为两个主权国家。 故事就发生在东德边境...
(展开)
1282
10
503回应
收起
Jacqueline
2019-04-19 21:33:46
时隔40年,这个发生在德国的神奇大逃亡终于有了德国人自己的版本
《气球》翻拍自1981年的老片《偷渡人》。当年在真实事件发生不到三年之后,迪士尼就将这个奇迹般的逃亡搬上了银幕。在当时,这部电影被誉为是“迪士尼拍过的最严肃的电影”。不过,因为由迪士尼筹拍,演员几乎都是英国和美国人,主角也是老牌英国演员约翰·赫特。 直到近30年后...
(展开)
363
2
28回应
收起
玛妮的自我修养
2019-05-24 21:31:53
为了「翻墙」,德国人有多硬核
这篇影评可能有剧透
玛妮最近看了《我们是真正的朋友》,暗自下定决心:将来一定要去缅甸坐一次热气球! 节目第一期,大S、小S、阿雅和范晓萱到达缅甸的第一件事,就是完成一趟“天空之旅”,四个相识二十年的闺蜜互相依靠在空中哼着小曲欣赏夕阳,实在太浪漫了! 现在我们提到热气球,第一反应大...
(展开)
162
3
20回应
收起
朝暮雪
2019-04-16 09:23:12
东德硬生生把一个个平民逼成了科学家
这篇影评可能有剧透
影片以极具冲击感的方式展开,一边是东德的一所学校,学生唱着“我们的祖国是大草原上的青草,是农田里的稻谷,人们热爱美丽的祖国”,校长在台上领导大家向东德宣誓效忠; 另一边,是边防军人乱枪打死一个个企图越过边境的百姓。 说好的祖国是大草原上的青草呢? 如果这个国家...
(展开)
59
8
10回应
收起
cyberomeo
2019-04-06 13:07:15
#《气球》有哪些细思极恐的细节?
《气球》有哪些细思极恐的细节?
这篇影评可能有剧透
斯塔西到幼儿园问家庭情况 军人没有及时发现逃亡者而遭到整肃 主角之一无法上大学去学习物理完全是因为他爸在他五岁时逃往西德 酒店大堂的斯塔西 美国领事馆门囗的警察 毕业生宣誓爱国而校长要继续管教他们 布行职员要报警 精神分裂的秘密警察一方面忠于职守一方面又要看西德电...
(展开)
78
1
14回应
收起
施威林先生
2022-04-07 12:34:17
《气球》真实事件的一些细节
这篇影评可能有剧透
节奏紧凑,不啰嗦,非常精彩。色调也特别顺眼。影片主题不用说了,真实的事件往往更加精彩。这里我搜集/翻译了一些背景资料,算是对电影的补充。 逃亡组合 皮特·施特崔克(Peter Strelzyk)是一名电工,以前当过前东德空军技师。冈特·韦则(Günter Wetzel)做过瓦匠。他俩之...
(展开)
46
11回应
收起
管制菜刀
2020-03-09 18:17:31
#《气球》有哪些细思极恐的细节?
《气球》有哪些细思极恐的细节?
这篇影评可能有剧透
守墙士兵连自己为什么开枪都不知道就杀了平民,而他本来就是靠平民们交税养活的,扣上大帽子,人就可以做出很多可怕的事情 某些人擅自写了几句话,只因为他们有枪和狗,这些话就成了法律,有人违法就放狗开枪,这才是终极的邪恶 愚蠢的主角向美国求救,还以为美国会来酒店里接...
(展开)
28
10
2回应
收起
森林旁边的树
2019-05-01 09:25:31
#《气球》有哪些细思极恐的细节?
《气球》有哪些细思极恐的细节?
这篇影评可能有剧透
当你只是上街买块大点布,就有人往上面汇报时候 当你只是恰巧在路边看到有辆路过的小汽车就可能被抓去讯问的时候 当你教小朋友们知识。就有军人过来盘问你的时候 当你只是走在路上,路过大使馆,就发现很多人在偷偷的看着你的时候。 这一切站在第一人称的角度,这样的生活,无...
(展开)
40
2
26回应
收起
June
2019-07-08 00:29:18
我会给这部电影高分,如果它也是《窃听风暴》那时拍的话
这种题材的电影在豆瓣上一定会得高分的,不管它拍得好不好。 还好,这部电影拍得不错,如果它也是《窃听风暴》、《再见列宁》那个时期拍的话,我会给它一样的高分。 只不过,十多年后的今天,那个灯塔国已经不是它曾经的、和我们想像中的样子了;而政治课上讲的东西确实着人烦...
(展开)
18
9
11回应
收起
巫岚
2019-12-22 09:52:22
《气球》有哪些细思极恐的细节?
出发之前,妈妈抱着小儿子在看相册。大儿子一边玩小人,一边喊着:“去死吧,叛国贼!” 想起小学时候,班上一个男生总被大家欺负,给他取绰号卖国贼。就因为他姓蒋。 叛国?国是什么?你连自由都不给我,还叫我爱你? 影片开头孩子们合唱的歌词,成人典礼上效忠国家的宣誓,不...
(展开)
22
1
5回应
收起
>
更多影评
132篇
添加新讨论
讨论区
· · · · · ·
正视历史,而不是回避
来自Wieve21
2 回应
2022-09-10 00:26:16
哪里可以看这部呢
来自Dale
1 回应
2024-03-14 23:11:34
西式主旋律vs中式主旋律 炸出一群双标香蕉人
来自阿尔卑斯
24 回应
2024-03-02 12:37:42
除了自己,没什么能阻止你们追求自由的脚步?自己...
来自haha123
39 回应
2024-02-08 00:51:23
电影里的秘密警察是不是“反应过度”了?
来自匿名用户
22 回应
2024-01-13 18:10:55
> 去这部影片的讨论区(全部99条)
关于《气球》的问题
· · · · · ·
(
全部5个
)
东德真的会为了一起翻墙事件就动用军队和直升机,这么大费周章吗?
1人回答
求最后女孩读信时的音乐是什么?
0人回答
>
全部5个问题
以下片单推荐
· · · · · ·
(
全部
)
★豆瓣高分电影榜★ (中)8.5-8.3分
(影志)
豆瓣电影【口碑榜】2023-09-11 更新
(影志)
陪我孤独终老的电影清单【灵魂篇】
(默)
你在放荡的孤独中闪闪发光
(玖號)
一个人的电影院
(灰烬周三)
谁在看这部电影
· · · · · ·
豆友Ry_x1XNIfY
2小时前
想看
林达
2小时前
想看
とう
今天凌晨
想看
72348人看过
/
158553人想看
订阅气球的评论:
feed: rss 2.0
© 2005-2024 douban.com, all rights reserved 北京豆网科技有限公司
关于豆瓣
· 在豆瓣工作
· 联系我们
· 法律声明
· 帮助中心
· 移动应用
· 豆瓣广告
BALLOON中文(简体)翻译:剑桥词典
词典
翻译
语法
同义词词典
+Plus
剑桥词典+Plus
Shop
剑桥词典+Plus
我的主页
+Plus 帮助
退出
剑桥词典+Plus
我的主页
+Plus 帮助
退出
登录
/
注册
中文 (简体)
查找
查找
英语-中文(简体)
balloon 在英语-中文(简体)词典中的翻译
balloonnoun [ C ] uk
Your browser doesn't support HTML5 audio
/bəˈluːn/ us
Your browser doesn't support HTML5 audio
/bəˈluːn/
Add to word list
Add to word list
A2 a small, very thin rubber bag that you blow air into or fill with a light gas until it is round in shape, used for decoration at parties or as a children's toy
气球
We tied balloons and streamers to the ceiling ready for the party.
我们把气球和彩带系在顶棚上,晚会已布置妥当。
(also hot-air balloon) a very large balloon that is filled with hot air or gas and can carry people in a basket (= open container ) hanging under it
热气球
People first flew in a balloon in 1783.
人类于1783年首次乘热气球飞行。
a
speech bubble
(漫画中的)对话框,话泡泡
更多范例减少例句He let the air out of the balloon.The balloon went bang when it landed on the bush.Lottie was carrying a balloon.She pricked the balloon with a pin and it burst with a loud bang.The balloon rose gently up into the air.
习语
the balloon goes up
balloonverb [ I ] uk
Your browser doesn't support HTML5 audio
/bəˈluːn/ us
Your browser doesn't support HTML5 audio
/bəˈluːn/
to get bigger and rounder
像气球般膨胀
I ballooned when I was pregnant with my second baby.
怀第二个孩子时,我胖得像个气球。
to quickly increase in size, weight, or importance
(在大小、重量或重要性上)激增
The rumours soon ballooned into a full-blown scandal.
这些传闻不久就完全演变成了一起丑闻。
(balloon在剑桥英语-中文(简体)词典的翻译 © Cambridge University Press)
balloon的例句
balloon
Clearly, a specialist diet makes ballooning altogether more risky, unless these species have a greater ability to withstand starvation than polyphagous ballooners.
来自 Cambridge English Corpus
They suggested that the use of oversized balloons offered no clear advantage and may increase the risk of complications.
来自 Cambridge English Corpus
In this paradigm, ballooning appears to be largely driven by the unpredictable and comparatively high degree of habitat perturbation, not by host associations.
来自 Cambridge English Corpus
When a serious problem arose, the number of petitions must have ballooned to a staggering degree.
来自 Cambridge English Corpus
Molecular approaches hold the possibility of investigating ballooning population genetic structuring, and evaluating how this is affected by behaviour (see later).
来自 Cambridge English Corpus
The number of capital statutes ballooned in the eighteenth century to over 200.
来自 Cambridge English Corpus
The consumption of balloons proved even more appealing, perhaps, because established scientific patrons and institutions did little to support this new invention.
来自 Cambridge English Corpus
Even so, that ballooning emerged independently in each of the three groups is unlikely to be disputed.
来自 Cambridge English Corpus
示例中的观点不代表剑桥词典编辑、剑桥大学出版社和其许可证颁发者的观点。
A2
balloon的翻译
中文(繁体)
氣球, 熱氣球, (漫畫中的)對話方塊,話泡泡…
查看更多内容
西班牙语
globo, aerostato, bocadillo…
查看更多内容
葡萄牙语
balão, inflar-se, inchar-se…
查看更多内容
更多语言
in Marathi
日语
土耳其语
法语
加泰罗尼亚语
in Dutch
in Tamil
in Hindi
in Gujarati
丹麦语
in Swedish
马来语
德语
挪威语
in Urdu
in Ukrainian
俄语
in Telugu
阿拉伯语
in Bengali
捷克语
印尼语
泰语
越南语
波兰语
韩语
意大利语
फुगा, गरम हवा किंवा हवेपेक्षा हलका वायू भरलेले रवरी फुगे. याच्या तळात टोपली बांधून त्यातून प्रवासी वाहतूक केली जाते.…
查看更多内容
ふうせん, 急激に太る, 風船(ふうせん)…
查看更多内容
balon, büyümek, genişlemek…
查看更多内容
ballon [masculine], une montgolfière, ballon…
查看更多内容
globus, inflar-se, augmentar…
查看更多内容
ballon…
查看更多内容
ஒரு சிறிய, மிக மெல்லிய ரப்பர் பையில் நீங்கள் காற்றை ஊதுகிறீர்கள் (நிரப்பப்படுகிறது) அல்லது ஒரு லேசான வாயுவை நிரப்புகிறீர்கள், அது உருண்டை வடிவம் ஆகும் வரை. நிகழ்ச்சிகளில் அலங்காரத்திற்காக பயன்படுத்தக்கூடியது அல்லது குழந்தைகள் விளையாடுவதற்கு பொம்மையாகப் பயன்படுத்தப்படுகிறது…
查看更多内容
गुब्बारा, बैलून, जिसमें गर्म हवा या गैस भरी जाती है और उसके नीचे एक टोकरी में लोग सवार होते हैं…
查看更多内容
ફુગ્ગો., બલૂન, ફુગ્ગો…
查看更多内容
ballon…
查看更多内容
ballong…
查看更多内容
belon…
查看更多内容
der Luftballon…
查看更多内容
ballong [masculine], ballong…
查看更多内容
غبارہ, غبارہ(اڑنے والا)…
查看更多内容
повітряна куля…
查看更多内容
воздушный шар, раздуваться, становиться больше…
查看更多内容
బెలూన్, వేడిగాలి లేదా గ్యాస్ తో నింపబడి, క్రిందన వేలాడదీసిన బుట్టలో జనాలను మోసుకొని పోగల చాలాపెద్ద బెలూన్…
查看更多内容
بالون, مِنْطاد, يَنفُخ…
查看更多内容
বেলুন, একটি ছোটো, খুব পাতলা রাবার ব্যাগ যেটিতে আপনি ফুঁ দিয়ে বাতাস ভরে দেবেন বা হালকা গ্যাস দিয়ে যেটি ভর্তি করবেন যতক্ষণ না এটি আকারে গোল হয়…
查看更多内容
balon(ek)…
查看更多内容
balon…
查看更多内容
ลูกโป่ง, ลูกบอลลูน…
查看更多内容
kinh khí cầu…
查看更多内容
balonik, balon, rozrastać się…
查看更多内容
풍선, 갑자기 부풀어 오르다…
查看更多内容
palloncino, gonfiarsi come un pallone, aumentare di peso…
查看更多内容
需要一个翻译器吗?
获得快速、免费的翻译!
翻译器工具
balloon的发音是什么?
在英语词典中查看 balloon 的释义
浏览
ballistic
ballistic missile
ballistics
ballon
balloon
balloonist
ballot
ballot box
ballot rigging
balloon更多的中文(简体)翻译
全部
trial balloon
barrage balloon
weather balloon
hot-air balloon
the balloon goes up idiom
sink like a lead balloon, at sink like a stone idiom
go down like a lead balloon idiom
查看全部意思»
惯用语
the balloon goes up idiom
sink like a lead balloon, at sink like a stone idiom
go down like a lead balloon idiom
查看全部惯用语意思»
“每日一词”
token
UK
Your browser doesn't support HTML5 audio
/ˈtəʊ.kən/
US
Your browser doesn't support HTML5 audio
/ˈtoʊ.kən/
something that you do, or a thing that you give someone, that expresses your feelings or intentions, although it might have little practical effect
关于这个
博客
Renowned and celebrated (Words meaning ‘famous’)
March 13, 2024
查看更多
新词
inverse vaccine
March 11, 2024
查看更多
已添加至 list
回到页面顶端
内容
英语-中文(简体)例句翻译
©剑桥大学出版社与评估2024
学习
学习
学习
新词
帮助
纸质书出版
Word of the Year 2021
Word of the Year 2022
Word of the Year 2023
开发
开发
开发
词典API
双击查看
搜索Widgets
执照数据
关于
关于
关于
无障碍阅读
剑桥英语教学
剑桥大学出版社与评估
授权管理
Cookies与隐私保护
语料库
使用条款
京ICP备14002226号-2
©剑桥大学出版社与评估2024
剑桥词典+Plus
我的主页
+Plus 帮助
退出
词典
定义
清晰解释自然的书面和口头英语
英语
学习词典
基础英式英语
基础美式英语
翻译
点击箭头改变翻译方向。
双语词典
英语-中文(简体)
Chinese (Simplified)–English
英语-中文(繁体)
Chinese (Traditional)–English
英语-荷兰语
荷兰语-英语
英语-法语
法语-英语
英语-德语
德语-英语
英语-印尼语
印尼语-英语
英语-意大利语
意大利语-英语
英语-日语
日语-英语
英语-挪威语
挪威语-英语
英语-波兰语
波兰语-英语
英语-葡萄牙语
葡萄牙语-英语
英语-西班牙语
西班牙语-英语
English–Swedish
Swedish–English
半双语词典
英语-阿拉伯语
英语-孟加拉语
英语-加泰罗尼亚语
英语-捷克语
英语-丹麦语
English–Gujarati
英语-印地语
英语-韩语
英语-马来语
英语-马拉地语
英语-俄语
English–Tamil
English–Telugu
英语-泰语
英语-土耳其语
英语-乌克兰语
English–Urdu
英语-越南语
翻译
语法
同义词词典
Pronunciation
剑桥词典+Plus
Shop
剑桥词典+Plus
我的主页
+Plus 帮助
退出
登录 /
注册
中文 (简体)
Change
English (UK)
English (US)
Español
Русский
Português
Deutsch
Français
Italiano
中文 (简体)
正體中文 (繁體)
Polski
한국어
Türkçe
日本語
Tiếng Việt
हिंदी
தமிழ்
తెలుగు
关注我们
选择一本词典
最近的词和建议
定义
清晰解释自然的书面和口头英语
英语
学习词典
基础英式英语
基础美式英语
语法与同义词词典
对自然书面和口头英语用法的解释
英语语法
同义词词典
Pronunciation
British and American pronunciations with audio
English Pronunciation
翻译
点击箭头改变翻译方向。
双语词典
英语-中文(简体)
Chinese (Simplified)–English
英语-中文(繁体)
Chinese (Traditional)–English
英语-荷兰语
荷兰语-英语
英语-法语
法语-英语
英语-德语
德语-英语
英语-印尼语
印尼语-英语
英语-意大利语
意大利语-英语
英语-日语
日语-英语
英语-挪威语
挪威语-英语
英语-波兰语
波兰语-英语
英语-葡萄牙语
葡萄牙语-英语
英语-西班牙语
西班牙语-英语
English–Swedish
Swedish–English
半双语词典
英语-阿拉伯语
英语-孟加拉语
英语-加泰罗尼亚语
英语-捷克语
英语-丹麦语
English–Gujarati
英语-印地语
英语-韩语
英语-马来语
英语-马拉地语
英语-俄语
English–Tamil
English–Telugu
英语-泰语
英语-土耳其语
英语-乌克兰语
English–Urdu
英语-越南语
词典+Plus
词汇表
选择语言
中文 (简体)
English (UK)
English (US)
Español
Русский
Português
Deutsch
Français
Italiano
正體中文 (繁體)
Polski
한국어
Türkçe
日本語
Tiếng Việt
हिंदी
தமிழ்
తెలుగు
内容
英语-中文(简体)
NounVerb
例句
Translations
语法
所有翻译
我的词汇表
把balloon添加到下面的一个词汇表中,或者创建一个新词汇表。
更多词汇表
前往词汇表
对该例句有想法吗?
例句中的单词与输入词条不匹配。
该例句含有令人反感的内容。
取消
提交
例句中的单词与输入词条不匹配。
该例句含有令人反感的内容。
取消
提交
房地产贷款中的气球贷款(Balloon Payment Mortgage) - 知乎首发于美国地产小知识切换模式写文章登录/注册房地产贷款中的气球贷款(Balloon Payment Mortgage)HoneyMooseiSharkFly - 鲨鱼君气球贷款要求贷款人在一定短期内(通常是3年、5年或7年)全部付清贷款余额。这类贷款的利率可固定或变化。大额尾付贷款的另外一种叫法又被称为“气球贷款”是一种比较特殊的贷款,它的贷款期限一般限制在短期(例如3的7年)内,但它的每期付款金额却是按照长期贷款(例如,15年到30年)来计算的。这种计算一方面会降低每期的还款金额,但另一方面会在贷款期限结束时,积累一笔很大的金额,称之为大额尾付金额。大额尾付贷款的利率一般在大额尾付贷款期间是固定的。这种贷款就和气球一样,在开始的时候比较小,但是最后却有一笔比较大的尾款。这笔尾款会要求借款人到期偿付的。气球贷款的出现在美国的房地产金融体系中,你的月供多少是通过你的收入比的体现的。通常你的月供和还款压力不应该超如你收入的 50%,不同银行的要求是不一样的。这里的还款压力包括有所有的还款,如果你有信用卡,那么按照你信用卡的最低还款额度计算。如果你有车贷,那么按照你的车贷的月供计算。当然还有地产税,地产税的偿付也是要计算到月供里面的。这样算下来的的话,如果使用长期贷款比如说 15 年,你的月供比率可能会比较高,导致银行不放款。解决办法就是提高首付减少贷款金额或者延长贷款年限。如果延长贷款年限还是没有办法解决这个贷款比例的问题的话,那么需要考虑使用不同方式了。气球贷”并不适合所有借款人,具有以下经济状况或贷款意愿的人群可以考虑选用“气球贷。考虑中短期贷款的人,贷款期限一般为 3-5 年。贷款前期每月的同定收入较低的人,借款人不能承担普通短期贷款的高月供,但是预计在贷款期末有一笔较大的资金进账,足以支付“气球贷”期末应付的较大数额的一次性清偿的剩余本金。有更好的投资渠道,且投资收益率高于银行贷款利率,一段时间后预期获得本金和收益,一次性偿还剩余的贷款本金。敢于承担风险的投资者,这样的借款人在贷款前期仅偿还较少的月供,贷款结束期末一次偿还剩余本金需注意一点,想短期贷款而且有能力承担高月供的借款人不适合选择“气球贷”,因为上面可以看出,同样贷款期限的“气球贷”与普通贷款相比所偿还的总利息要髙。针对中国的家庭来说,如果在贷款末期的最后偿付金额是可以在家庭范围内想办法解决的,但是又不愿意承担比较高的月供的话,气球贷款还是可以考虑的。算法举例假设你现在要一个 5 年的 Balloon Payment 贷款。房屋的成交价格为:438K首付为 20%:87.6K当前贷款利率为:3.0%如上面的图显示的。你的实际贷款金额为:350.4K你的月供将会为 1.478K在 5 年后,你还需要支付给银行 313.005K。这笔偿付金额还是比较高的,通常来说还是需要购房人能够比较准确的了解当前自己的经济状况。https://www.usrealestate.io/t/topic/80发布于 2021-07-17 03:40银行贷款贷款利率赞同 21 条评论分享喜欢收藏申请转载文章被以下专栏收录美国地产小知识美国地产和资本投资的
气球 (豆瓣)
登录/注册
下载豆瓣客户端
豆瓣 6.0 全新发布
×
豆瓣
扫码直接下载
iPhone
·
Android
豆瓣
读书
电影
音乐
同城
小组
阅读
FM
时间
豆品
豆瓣电影
搜索:
影讯&购票
选电影
电视剧
排行榜
影评
2023年度榜单
2023年度报告
气球
(2019)
导演: 万玛才旦
编剧: 万玛才旦
主演: 索朗旺姆 / 金巴 / 杨秀措
类型: 剧情
制片国家/地区: 中国大陆
语言: 藏语
上映日期: 2020-11-20(中国大陆) / 2019-08-30(威尼斯电影节)
片长: 102分钟
又名: དབུགས་ལྒང་། / Balloon / 羊飼いと風船
IMDb: tt10703752
豆瓣评分
引用
7.7
93794人评价
5星
13.1%
4星
60.6%
3星
24.6%
2星
1.5%
1星
0.2%
好于 87% 剧情片
想看
看过
评价:
写短评
写影评
分享到
推荐
气球的剧情简介
· · · · · ·
《气球》故事发生在藏地,讲述灵魂与现实的紧张关系。
主人公达杰一家因一只普通的避孕套卷入了一系列尴尬而又难以抉择的事件当中,他们原本宁静的日常生活被彻底打破,生老病死如日月流转,当灵魂遭遇现实的挑战,该如何抉择?
气球的演职员
· · · · · ·
(
全部 30
)
万玛才旦
导演
索朗旺姆
饰 卓嘎
金巴
饰 达杰
杨秀措
饰 卓玛
更旦
饰 德本加
赵晓雯
出品人
气球的视频和图片
· · · · · ·
(
预告片4 | 图片248 · 添加
)
预告片
气球的获奖情况
· · · · · ·
(
全部
)
第76届威尼斯电影节
地平线单元奖 最佳影片(提名)
万玛才旦
第23届上海国际电影节
电影频道传媒大奖 最受传媒关注导演
万玛才旦
第14届亚洲电影大奖
最佳导演(提名)
万玛才旦
喜欢这部电影的人也喜欢
· · · · · ·
塔洛
7.7
一一
9.1
诗
8.7
路边野餐
8.0
三峡好人
8.4
撞死了一只羊
7.1
悲情城市
9.0
小武
8.6
苏州河
8.2
兰心大剧院
7.2
我要写短评
气球的短评
· · · · · ·
(
全部 34145 条
)
热门 /
最新 /
好友
1588
有用
锦
看过
2020-11-02 19:34:16
女人在夫权/父权/神权下的困境,集中在了生育选择上。妹妹那条线也有意思,旧恋人教师写书,可看做对叙事权的占有,是更隐蔽的剥夺。女人退无可退,如灭灯般掐掉情思与期待。万玛的小说和电影总是充满象征。一个不成熟的想法,象征遍地的地方,总有无法被充分言说的事物。
1401
有用
科林
看过
2020-11-15 13:07:14
气球是避孕套、是海报上女人的胎腹、是无拘无束飞升天空的红色“精子”。这三重矛盾的隐喻总结了全片的主题,象征了性欲的牢笼、生育的载体、生命的起源。
女性在这过程中承担了关键又次要的作用:她们是佛教预言投胎转世的母体,受宗教之制;也是性欲涌来肌肤之亲的客体,受男性之占;更是计划生育严苛处罚的对象,受国策之惩。这种在教法与人性夹缝里生存的女人,表面主动 实则被动,导演很聪明,用了尼姑这个在“情与戒”之间...
气球是避孕套、是海报上女人的胎腹、是无拘无束飞升天空的红色“精子”。这三重矛盾的隐喻总结了全片的主题,象征了性欲的牢笼、生育的载体、生命的起源。
女性在这过程中承担了关键又次要的作用:她们是佛教预言投胎转世的母体,受宗教之制;也是性欲涌来肌肤之亲的客体,受男性之占;更是计划生育严苛处罚的对象,受国策之惩。这种在教法与人性夹缝里生存的女人,表面主动 实则被动,导演很聪明,用了尼姑这个在“情与戒”之间徘徊的角色来对照,彰显出矛与盾。
梦境里有不少镜面 水面映照的镜头、以及超现实的镜头,摄影都很棒。
(展开)
1179
有用
同志亦凡人中文站
看过
2019-11-10 16:20:57
生和死是红白两件事,从开始的白“气球”到结束的红气球,仿佛是对人生的轮回注释。万玛才旦这次高水平发挥了,梦境捉痣的那个超现实慢镜头堪称年度华语电影的高光时刻~(当然问题来了,藏语…算华语吗?)
866
有用
Jupiter
看过
2020-11-15 23:41:07
分线以及分线的人物看不出来有何意义,几个分割镜头专门去问了北电同学,说是寄生虫式构图,太刻意太突兀,大段大段的长镜头,大段大段的手持,上次这么晕还是看少年的你,文本性强,影像叙事太弱。@深圳百老汇电影中心全国路演首映 ps:《回南天》的导演高鸣,如果您看到了我这条影评,希望您以后观影的时候不要和旁边的朋友讨论,极其影响其他观众的观感,作为一个导演对待电影极其业余。
991
有用
内有恶犬
看过
2020-11-15 18:15:33
内地极少数几个知道自己要拍什么在拍什么的导演。
>
更多短评
34145条
为什么被折叠?
有一些短评被折叠了
评论被折叠,是因为发布这条评论的账号行为异常。评论仍可以被展开阅读,对发布人的账号不造成其他影响。如果认为有问题,可以联系豆瓣电影。
你关注的人还没写过短评
我要写影评
气球的影评 · · · · · ·
( 全部 579 条 )
热门
最新
好友
小石匠
2020-11-19 00:25:53
脑补完尼姑的故事线后,我才看懂《气球》
这篇影评可能有剧透
[视频] [视频] 上面两个视频是视频版,为了气球排片1%,专门视频化了,分享更便捷。 首先,梳理了几个,电影里删掉的小说内容,和在小说之外增加的电影情节,可以帮助大家理解人物背景。 小说最第一段是床戏,真床戏,阿爸没有找到2个避孕套,和“完事之后,他就骑着他那辆破...
(展开)
677
26
132回应
收起
胤祥
2019-10-28 22:54:56
[气球]:万玛才旦的突变
这篇影评可能有剧透
首发于北京青年报10月25日星期五C6版 青影院 及公众号“北青艺评”, 地址 首映于威尼斯地平线单元的《气球》,在平遥电影节收获广泛好评,许多影评人认为这是截止目前,万玛才旦最好的一部作品。 纵观万玛才旦主要作品的电影节路线,可以发现他是典型的东亚导演登录欧洲的路径...
(展开)
436
14
57回应
收起
欢乐分裂
2020-11-20 10:38:47
乌有之乡或应许之地
从《塔洛》开始认识万玛才旦这位独树一帜的藏地导演,对其文本的文学质感、巧妙设计的镜像结构和构图印象极为深刻;直至颇为炫技的《撞死了一只羊》,虽口碑褒贬不一,但现实与梦境互补的超现实感仍是极为迷人;另外复习了几部万玛才旦的旧片,加上近日《气球》的上映。细细回...
(展开)
152
7
9回应
收起
第一导演
2020-11-21 15:11:18
和万玛才旦聊了会性羞耻、信仰批判和藏地新浪潮的烦恼
采访、撰文/法兰西胶片 “第一次看电影里的接吻镜头,忘了是哪部电影了,那就是一个很混沌的时期。当时还有一些关于性普及的小说、手抄本,大家都偷偷摸摸地看,像在看一个黄色录像。其实从人的原始的直观上来看,‘性’是充满想象力的。” “我看自己电影创作的时候,它几乎没...
(展开)
79
1
2回应
收起
木卫二
2019-12-10 11:17:09
生命的共振
读万玛才旦短篇小说集《乌金的牙齿》,专门跳过《气球》一篇。不为别的,想等等电影。 这次平遥国际电影展看完片子,赶紧补上小说。成片在结构上,气球的出现,徘徊和结局,与小说的发展完全一致。电影多出来了两个男性人物。是哪两个,不妨猜猜(书很容易买到)。 万玛才旦小...
(展开)
102
9
9回应
收起
一只麦麦
2020-11-24 11:57:09
万玛才旦:一个人和一个民族的电影
首发于“娱理”公号 《气球》上映三天,票房300多万。 它是万玛才旦导演第三部入围威尼斯电影节的长片,讲述的是一个牧区藏族家庭里,一只气球——其实是避孕套,引发的一系列窘事,揭示传统与现代冲突及女性觉醒主题。影片情节一波三折,视听语言流畅,每个画面的构图、色彩、...
(展开)
98
4
5回应
收起
吴邪
2020-11-21 10:06:58
那个把手伸进火里取书的女人
这篇影评可能有剧透
读过《乌金的牙齿》,基本不记得有妹妹这个人物。但看完《气球》,片中出家为尼的妹妹于我个人而言是印象极为深刻的人物,可能是因为她更未知更独立,怀揣着隐秘而强大的情感。 虽然她一出场就很不具体,镜头跟着她的脸晃动,大半张脸都被压低的深红僧帽遮挡,基本只能隐约看到...
(展开)
36
1
3回应
收起
nothing纳森
2020-11-20 15:01:14
飘荡的气球
气球是经常被导演符号化的一种表达,时而演绎自由,时而诠释欢乐,而电影《气球》也在经历了各种电影节与话题关注后,如期而至。影片依旧带有万玛才旦独特的导演色彩,在藏区的语言环境之中,关注最普通的人的故事,将那些个不为人知的普通人的故事,一点点地用自己的视角记录...
(展开)
65
2
9回应
收起
TravisTravis
2020-11-09 23:35:30
内地院线的奢侈|气球的背后:人性与慈悲,大于古老的歌谣
在中国电影资料馆观影点映,映后与万玛、陈丹青、谢飞老师做交流与讨论,有所收获。 陈丹青说:“我也喜欢万玛的其他作品啊,包括弄死那只羊。”老师也真是可爱。 说回电影。电影从家庭、宗教、自由、生活几个维度讨论藏地人民的生活,设计可谓是精良的。例如,一白球一红气球...
(展开)
28
1
6回应
收起
把噗
2020-11-20 21:26:03
《气球》真的在探讨信仰吗?
这篇影评可能有剧透
达杰一家真的相信藏传佛教吗?还是说相信的仅仅是上师的权威——妻子怀孕是死去的爷爷转世投胎。 达杰之所以一定要让妻子把孩子生下来,而不顾降生的孩子对家庭带来的负担,原因仅仅出于违背佛主意愿可能带来的灾祸。 如此看来,这种信仰便不是纯粹的信仰,而是带有功利心的迷信...
(展开)
26
5
5回应
收起
>
更多影评
579篇
添加新讨论
讨论区
· · · · · ·
江洋不是男女主的亲儿子吧
来自Matheus Song
1 回应
2024-02-17 00:14:44
西藏
来自橘子气泡
1 回应
2024-01-26 20:06:10
请问下看过的朋友们,原版2D是国语版还是藏语版?
来自豆友FuJ1W@rA
5 回应
2024-01-23 15:52:17
片尾女性神像的背景和寓意
来自bay135
6 回应
2024-01-23 15:51:53
故事是发生在青海吗
来自WJSCZYNGWJZL
8 回应
2024-01-23 15:51:29
> 去这部影片的讨论区(全部263条)
在哪儿看这部电影
· · · · · ·
爱奇艺视频
以下片单推荐
· · · · · ·
(
全部
)
豆瓣电影【口碑榜】2023-09-11 更新
(影志)
在这里,看懂中国
(时间之葬)
木卫二的大银幕 | 观影选择
(木卫二)
2020第二十三届上海国际电影节影片大全
(妖灵妖)
上海艺术电影联盟展映片目
(妖灵妖)
谁在看这部电影
· · · · · ·
谟了所有人
1小时前
想看
Vincent
2小时前
想看
豆友pDa-R8Qm4M
今天凌晨
想看
131715人看过
/
128012人想看
订阅气球的评论:
feed: rss 2.0
© 2005-2024 douban.com, all rights reserved 北京豆网科技有限公司
关于豆瓣
· 在豆瓣工作
· 联系我们
· 法律声明
· 帮助中心
· 移动应用
· 豆瓣广告
使用MMDetection3.x 在Balloon气球数据集上训练并对视频进行实例分割和制作成Color Splash效果 - 知乎首发于CV with OpenMMLab切换模式写文章登录/注册使用MMDetection3.x 在Balloon气球数据集上训练并对视频进行实例分割和制作成Color Splash效果chg0901风景摄影爱好者0. 关键词:MMDetection3.x,Balloon,物体检测,实例分割,Color Splash,openmmlab,mmdet, CoCo, mask rcnn, config, train, inference, 视频读写,可视化,mmlab21. 结果在前生成的模型在测试集上的测试与ground truth比较最终Color Splash效果GIF文章很长,处理后的视频在后面,记得看呀 ^_^视频其实是个超链接(14.4M),急得话那就点一下吧2 导语之前用做了MMDET2.x的balloon数据集作业,这里我们用MMDET3.x with MMLAB2新API重新做一下,感兴趣的小伙伴可以去Github上看下二者具体的代码,链接放在下面了,欢迎star.事实上,MMDetection2.x到MMDetection3.x不同版本的过渡还是挺轻松的,只改动了少量的API,主要是一些方法从mmcv转移到mmengine,然后MMDET3.x采用了更好的Visualizer,和MMCLS类似,这让可视化更加方便和直觉。1. AnchorGeneratorfrom mmdet.core.anchor import AnchorGenerator
# from mmdet.models.task_modules import AnchorGenerator # for mmlabv2.2. mmcv --> mmenginemmcv.list_from_file/dump -->mmengine.list_from_file/dump3. 实验环境创建和检查# # python,envs, pytorch, torchvision
conda create --name openmmlab python=3.8 -y
conda activate openmmlab
conda install pytorch torchvision -c pytorch
# # mim, mmengine, mmcv
pip install -U openmim
mim install mmengine
mim install "mmcv>=2.0.0rc1"
# # option 1
mim install "mmdet>=3.0.0rc0"
# # option 2
# git clone https://github.com/open-mmlab/mmdetection.git -b 3.x
# # "-b 3.x" means checkout to the `3.x` branch.
# cd mmdetection
# pip install -v -e .
# # "-v" means verbose, or more output
# # "-e" means installing a project in editable mode,
# # thus any local modifications made to the code will take effect without reinstallation.
import torch
import mmcv
import mmdet
print(torch.__version__,mmcv.__version__,mmdet.__version__)
# 1.6.0 2.0.0rc3 3.0.0rc54. 实例分割数据集BalloonBalloon是带有mask的气球数据集可以用于实例分割等计算机视觉任务,其中训练集包含61张图片,验证集包含13张图片。 下载链接:Mask_RCNN balloon_dataset.zip matterport训练集和测试集中分别有mask标注文件via_region_data.json# 查看数据集文件夹树状结构
!tree balloon/
balloon/
├── train
│ ├── 10464445726_6f1e3bbe6a_k.jpg
│ ├── 12037308314_e16fb3a0f7_k.jpg
│ ├── 120853323_d4788431b9_b.jpg
.........................
│ ├── 8758393087_76fcd56bd3_k.jpg
│ ├── 9210739293_2b0e0d991e_k.jpg
│ ├── 9330497995_4cf0438cb6_k.jpg
│ ├── train.json
│ └── via_region_data.json
└── val
├── 14898532020_ba6199dd22_k.jpg
├── 16335852991_f55de7958d_k.jpg
├── 24631331976_defa3bb61f_k.jpg
.........................
├── 5603212091_2dfe16ea72_b.jpg
├── 6810773040_3d81036d05_k.jpg
├── 8053085540_a72bd21a64_k.jpg
├── val.json
└── via_region_data.json
2 directories, 78 filesvia_region_data.json中标注格式如下:{'base64_img_data': '',
'file_attributes': {},
'filename': '34020010494_e5cb88e1c4_k.jpg',
'fileref': '',
'regions': {'0': {'region_attributes': {},
'shape_attributes': {'all_points_x': [1020,
1000,
994,
1003,
...
1104,
1061,
1032,
1020],
'all_points_y': [963,
899,
841,
787,
...
1084,
1037,
989,
963],
'name': 'polygon'}}},
'size': 1115004}标注文件时是 JSON 格式的,其中所有键(key)组成了一张图片的所有标注。5. 新数据集的支持由于需要支持新的数据集,请同学们选择MMDetection支持的以下方法来操作:将数据集整理为COCO格式将数据集整理为中间格式直接实现新数据集的支持 注:方法2,3不直接支持分割任务,需要后处理。这里推荐使用方法1。在本文档中,我们展示一个例子来说明如何将数据转化为 COCO 格式。 COCO格式应该是最常用的,因此我将官方文档放在本文供自己和读者查看。☆COCO标注格式用于实例分割的 COCO 数据集格式如下所示,其中的键(key)都是必要的,参考Common Objects in Context来获取更多细节。{
"images": [image],
"annotations": [annotation],
"categories": [category]
}
image = {
"id": int,
"width": int,
"height": int,
"file_name": str,
}
annotation = {
"id": int,
"image_id": int,
"category_id": int,
"segmentation": RLE or [polygon],
"area": float,
"bbox": [x,y,width,height], # (x, y) 为 bbox 左上角的坐标
"iscrowd": 0 or 1,
}
categories = [{
"id": int,
"name": str,
"supercategory": str,
}] Balloon dataset json转 COCO 格式下载了数据集之后,我们需要实现一个函数将标注格式转化为 COCO 格式。然后我们就可以使用已经实现的 CocoDataset 类来加载数据并进行训练以及评测。其中将 balloon dataset 转化为 COCO 格式的完整代码如下所示 。import os.path as osp
import mmcv
from mmengine.fileio import dump, load
from mmengine.utils import track_iter_progress
def convert_balloon_to_coco(ann_file, out_file, image_prefix):
data_infos = load(ann_file)
annotations = []
images = []
obj_count = 0
for idx, v in enumerate(track_iter_progress(data_infos.values())):
filename = v['filename']
img_path = osp.join(image_prefix, filename)
height, width = mmcv.imread(img_path).shape[:2]
images.append(
dict(id=idx, file_name=filename, height=height, width=width))
for _, obj in v['regions'].items():
assert not obj['region_attributes']
obj = obj['shape_attributes']
px = obj['all_points_x']
py = obj['all_points_y']
poly = [(x + 0.5, y + 0.5) for x, y in zip(px, py)]
poly = [p for x in poly for p in x]
x_min, y_min, x_max, y_max = (min(px), min(py), max(px), max(py))
data_anno = dict(
image_id=idx,
id=obj_count,
category_id=0,
bbox=[x_min, y_min, x_max - x_min, y_max - y_min],
area=(x_max - x_min) * (y_max - y_min),
segmentation=[poly],
iscrowd=0)
annotations.append(data_anno)
obj_count += 1
coco_format_json = dict(
images=images,
annotations=annotations,
categories=[{
'id': 0,
'name': 'balloon'
}])
dump(coco_format_json, out_file)
if __name__ == '__main__':
convert_balloon_to_coco(ann_file='data/balloon/train/via_region_data.json',
out_file='data/balloon/train/annotation_coco.json',
image_prefix='data/balloon/train')
convert_balloon_to_coco(ann_file='data/balloon/val/via_region_data.json',
out_file='data/balloon/val/annotation_coco.json',
image_prefix='data/balloon/val')使用如上的函数,用户可以成功将标注文件转化为 JSON 格式,之后可以使用 CocoDataset对模型进行训练,并用CocoMetric评测。# generate coco format json
!python balloon2CoCoFormat3.py
# [>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] 61/61, 46.9 task/s, elapsed: 1s, ETA: 0s
# [>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] 13/13, 50.7 task/s, elapsed: 0s, ETA: 0s6. 构建配置文件下载原始配置文件从 Model Zoo 中找到 mask rcnn 模型并找到 configs/mask_rcnn/ 中对应的模型配置文件。将模型下载到环境中,通常放在放置在 checkpoints 文件夹中。可以参考:https://github.com/open-mmlab/mmdetection/tree/master/configs/mask_rcnn# download the pretrained model with smallest size
!mim download mmdet --config mask-rcnn_r50_fpn_2x_coco --dest .构建配置文件可以使用继承机制,从选择模型配置中继承,并修改自定义数据集需要的内容。训练前测试模型下载完模型和权重之后,我们可以尝试用预训练的权重和配置文件在数据集上运行一下# Test model before retraining
from mmdet.apis import init_detector,inference_detector # ,show_result_pyplot
from mmdet.utils import register_all_modules
config_file = 'mask-rcnn_r50_fpn_2x_coco.py'
checkpoint_file = 'mask_rcnn_r50_fpn_2x_coco_bbox_mAP-0.392__segm_mAP-0.354_20200505_003907-3e542a40.pth'
register_all_modules()
model0 = init_detector(config_file,checkpoint_file,device='cpu')
from mmdet.registry import VISUALIZERS
# init the visualizer(execute this block only once)
visualizer = VISUALIZERS.build(model0.cfg.visualizer)
# the dataset_meta is loaded from the checkpoint and
# then pass to the model in init_detector
visualizer.dataset_meta = model0.dataset_meta
image_path = './data/balloon/val/410488422_5f8991f26e_b.jpg'
img = mmcv.imread( image_path, channel_order='rgb')
result = inference_detector(model0,img)
# show the results
visualizer.add_datasample(
'result',
img,
data_sample=result,
draw_gt=False,
wait_time=0,
)
visualizer.show()原图对比这里放一下原图我们比较一下,可以看出,预训练模型的效果还是不太好的其实修改好config文件后,我们也是可以使用预训练模型进行批量测试,看看预训练模型再我们修改的config配置下单效果如何这个代码主要用于MMDET2.x,因为该版本默认是不带ground的结果的,我们也可以自行配置。MMDET3.x版本中,使用python tools/dataset_converters/images2coco.py可以进行产生不带ground truth的预测图片这一步是需要修改config配置文件的,建议大家读完整篇再回来尝试,也可以作为训练前的debug# generate test results for test images
!python tools/test.py \
mask_rcnn_r50_fpn_2x_coco.py \
mask_rcnn_r50_fpn_2x_coco_bbox_mAP-0.392__segm_mAP-0.354_20200505_003907-3e542a40.pth \
--show-dir show批量可视化代码模板:可配置批量显示测试图片并保存成新图我还写了一个批量可视化所有测试结果的代码,大家可以借鉴一下。这里用的图片mmdet2.x训练成功后的预测图片,不带ground truth# generate visualization with test results for test images
import matplotlib.pyplot as plt
import os
import cv2
path_name = r'work_dirs/mask_rcnn_r50_fpn_2x_coco_balloon3/show'
num = 1
wid, hig = 20, 16
num_w, num_h = 3, 5
dpi = 300
# plt.rcParams['figure.dpi'] = dpi
plt.figure(figsize=(wid, hig),dpi=dpi)
for item in os.listdir(path=path_name):
img = cv2.imread(os.path.join(path_name,item))[:,:, ::-1]
# img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.subplot(num_w, num_h, num)
num+=1
plt.imshow(img)
plt.title(item)
plt.xticks([])
plt.yticks([])
# break
# plt.savefig(f"work_dirs/mask-rcnn_r50_fpn_2x_coco_balloon3_new/result{num_w}x{num_h}_{wid}_{hig}dpi{dpi}.png")
plt.show()这里放一个我们训练好的图片意思下☆修改配置文件(含新数据集的注册)第二步需要准备一个配置文件来成功加载数据集。 假设我们想要用 balloon dataset 来训练配备了 FPN 的 Mask R-CNN ,如下是我们的配置文件。配置文件命名为 mask-rcnn_r50-caffe_fpn_ms-poly-1x_balloon.py,相应保存路径为 configs/balloon/,配置文件内容如下所示。官方方法,简洁配置balloon数据集这个配置还是需要改动的不能直接用,只是为了展示与和下面完整config比较以显示区别# 新配置继承了基本配置,并做了必要的修改
_base_ = '../mask_rcnn/mask-rcnn_r50-caffe_fpn_ms-poly-1x_coco.py'
# 我们还需要更改 head 中的 num_classes 以匹配数据集中的类别数
model = dict(
roi_head=dict(
bbox_head=dict(num_classes=1), mask_head=dict(num_classes=1)))
# 修改数据集相关配置
data_root = 'data/balloon/'
metainfo = {
'classes': ('balloon', ),
'palette': [
(220, 20, 60),
]
}
train_dataloader = dict(
batch_size=1,
dataset=dict(
data_root=data_root,
metainfo=metainfo,
ann_file='train/annotation_coco.json',
data_prefix=dict(img='train/')))
val_dataloader = dict(
dataset=dict(
data_root=data_root,
metainfo=metainfo,
ann_file='val/annotation_coco.json',
data_prefix=dict(img='val/')))
test_dataloader = val_dataloader
# 修改评价指标相关配置
val_evaluator = dict(ann_file=data_root + 'val/annotation_coco.json')
test_evaluator = val_evaluator
# 使用预训练的 Mask R-CNN 模型权重来做初始化,可以提高模型性能
load_from = 'https://download.openmmlab.com/mmdetection/v2.0/mask_rcnn/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco/mask_rcnn_r50_caffe_fpn_mstrain-poly_3x_coco_bbox_mAP-0.408__segm_mAP-0.37_20200504_163245-42aa3d00.pth'完整mask-rcnn_r50_fpn_2x_coco配置文件下面会介绍如何将MMDET3.x mask-rcnn_r50_fpn_2x_coco配置文件修改为和balloon数据集对应的配置,需要注意的地方后面会专门提到,请注意查看 详细介绍,请查看官方文档, 以后详细逐行解读下【ToDo list +1】# model settings
model = dict(
type='MaskRCNN',
data_preprocessor=dict(
type='DetDataPreprocessor',
mean=[123.675, 116.28, 103.53],
std=[58.395, 57.12, 57.375],
bgr_to_rgb=True,
pad_mask=True,
pad_size_divisor=32),
backbone=dict(
type='ResNet',
depth=50,
num_stages=4,
out_indices=(0, 1, 2, 3),
frozen_stages=1,
norm_cfg=dict(type='BN', requires_grad=True),
norm_eval=True,
style='pytorch',
init_cfg=dict(type='Pretrained', checkpoint='torchvision://resnet50')),
neck=dict(
type='FPN',
in_channels=[256, 512, 1024, 2048],
out_channels=256,
num_outs=5),
rpn_head=dict(
type='RPNHead',
in_channels=256,
feat_channels=256,
anchor_generator=dict(
type='AnchorGenerator',
scales=[8],
ratios=[0.5, 1.0, 2.0],
strides=[4, 8, 16, 32, 64]),
bbox_coder=dict(
type='DeltaXYWHBBoxCoder',
target_means=[.0, .0, .0, .0],
target_stds=[1.0, 1.0, 1.0, 1.0]),
loss_cls=dict(
type='CrossEntropyLoss', use_sigmoid=True, loss_weight=1.0),
loss_bbox=dict(type='L1Loss', loss_weight=1.0)),
roi_head=dict(
type='StandardRoIHead',
bbox_roi_extractor=dict(
type='SingleRoIExtractor',
roi_layer=dict(type='RoIAlign', output_size=7, sampling_ratio=0),
out_channels=256,
featmap_strides=[4, 8, 16, 32]),
bbox_head=dict(
type='Shared2FCBBoxHead',
in_channels=256,
fc_out_channels=1024,
roi_feat_size=7,
num_classes=1, # 只有一个balloon类,修改为num_classes=1
bbox_coder=dict(
type='DeltaXYWHBBoxCoder',
target_means=[0., 0., 0., 0.],
target_stds=[0.1, 0.1, 0.2, 0.2]),
reg_class_agnostic=False,
loss_cls=dict(
type='CrossEntropyLoss', use_sigmoid=False, loss_weight=1.0),
loss_bbox=dict(type='L1Loss', loss_weight=1.0)),
mask_roi_extractor=dict(
type='SingleRoIExtractor',
roi_layer=dict(type='RoIAlign', output_size=14, sampling_ratio=0),
out_channels=256,
featmap_strides=[4, 8, 16, 32]),
mask_head=dict(
type='FCNMaskHead',
num_convs=4,
in_channels=256,
conv_out_channels=256,
num_classes=1, # 只有一个balloon类,修改为num_classes=1
loss_mask=dict(
type='CrossEntropyLoss', use_mask=True, loss_weight=1.0))),
# model training and testing settings
train_cfg=dict(
rpn=dict(
assigner=dict(
type='MaxIoUAssigner',
pos_iou_thr=0.7,
neg_iou_thr=0.3,
min_pos_iou=0.3,
match_low_quality=True,
ignore_iof_thr=-1),
sampler=dict(
type='RandomSampler',
num=256,
pos_fraction=0.5,
neg_pos_ub=-1,
add_gt_as_proposals=False),
allowed_border=-1,
pos_weight=-1,
debug=False),
rpn_proposal=dict(
nms_pre=2000,
max_per_img=1000,
nms=dict(type='nms', iou_threshold=0.7),
min_bbox_size=0),
rcnn=dict(
assigner=dict(
type='MaxIoUAssigner',
pos_iou_thr=0.5,
neg_iou_thr=0.5,
min_pos_iou=0.5,
match_low_quality=True,
ignore_iof_thr=-1),
sampler=dict(
type='RandomSampler',
num=512,
pos_fraction=0.25,
neg_pos_ub=-1,
add_gt_as_proposals=True),
mask_size=28,
pos_weight=-1,
debug=False)),
test_cfg=dict(
rpn=dict(
nms_pre=1000,
max_per_img=1000,
nms=dict(type='nms', iou_threshold=0.7),
min_bbox_size=0),
rcnn=dict(
score_thr=0.05,
nms=dict(type='nms', iou_threshold=0.5),
max_per_img=100,
mask_thr_binary=0.5)))
# custom_imports = dict(imports=['mmdet.datasets.balloon'], allow_failed_imports=False)
# dataset settings
dataset_type = 'CocoDataset'
classes = ('balloon')
data_root = 'data/balloon/'
# file_client_args = dict(
# backend='petrel',
# path_mapping=dict({
# './data/': 's3://openmmlab/datasets/detection/',
# 'data/': 's3://openmmlab/datasets/detection/'
# }))
file_client_args = dict(backend='disk')
train_pipeline = [
dict(type='LoadImageFromFile', file_client_args=file_client_args),
dict(type='LoadAnnotations', with_bbox=True, with_mask=True),
dict(type='Resize', scale=(1333, 800), keep_ratio=True),
dict(type='RandomFlip', prob=0.5),
dict(type='PackDetInputs')
]
test_pipeline = [
dict(type='LoadImageFromFile', file_client_args=file_client_args),
dict(type='Resize', scale=(1333, 800), keep_ratio=True),
# If you don't have a gt annotation, delete the pipeline
dict(type='LoadAnnotations', with_bbox=True, with_mask=True),
dict(
type='PackDetInputs',
meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
'scale_factor'))
]
train_dataloader = dict(
batch_size=2,
num_workers=2,
persistent_workers=True,
sampler=dict(type='DefaultSampler', shuffle=True),
batch_sampler=dict(type='AspectRatioBatchSampler'),
dataset=dict(
type=dataset_type,
metainfo = dict(classes=classes),
data_root=data_root,
ann_file='train/train.json',
data_prefix=dict(img='train/'),
filter_cfg=dict(filter_empty_gt=True, min_size=32),
pipeline=train_pipeline))
val_dataloader = dict(
batch_size=1,
num_workers=2,
persistent_workers=True,
drop_last=False,
sampler=dict(type='DefaultSampler', shuffle=False),
dataset=dict(
type=dataset_type,
metainfo = dict(classes=classes),
data_root=data_root,
ann_file='val/val.json',
data_prefix=dict(img='val/'),
test_mode=True,
pipeline=test_pipeline))
test_dataloader = val_dataloader
val_evaluator = dict(
type='CocoMetric',
ann_file='data/balloon/val/val.json',
metric=['bbox', 'segm'],
format_only=False)
test_evaluator = val_evaluator
# inference on test dataset and
# format the output results for submission.
# test_dataloader = dict(
# batch_size=1,
# num_workers=2,
# persistent_workers=True,
# drop_last=False,
# sampler=dict(type='DefaultSampler', shuffle=False),
# dataset=dict(
# type=dataset_type,
# data_root=data_root,
# ann_file=data_root + 'annotations/image_info_test-dev2017.json',
# data_prefix=dict(img='test2017/'),
# test_mode=True,
# pipeline=test_pipeline))
# test_evaluator = dict(
# type='CocoMetric',
# metric=['bbox', 'segm'],
# format_only=True,
# ann_file=data_root + 'annotations/image_info_test-dev2017.json',
# outfile_prefix='./work_dirs/coco_instance/test')
# training schedule for 2x
train_cfg = dict(type='EpochBasedTrainLoop', max_epochs=24, val_interval=3)
val_cfg = dict(type='ValLoop')
test_cfg = dict(type='TestLoop')
# learning rate
param_scheduler = [
dict(
type='LinearLR', start_factor=0.001, by_epoch=False, begin=0, end=500),
dict(
type='MultiStepLR',
begin=0,
end=24,
by_epoch=True,
milestones=[16, 22],
gamma=0.1)
]
# optimizer
optim_wrapper = dict(
type='OptimWrapper',
optimizer=dict(type='SGD', lr=0.002, momentum=0.9, weight_decay=0.0001))
# Default setting for scaling LR automatically
# - `enable` means enable scaling LR automatically
# or not by default.
# - `base_batch_size` = (8 GPUs) x (2 samples per GPU).
auto_scale_lr = dict(enable=False, base_batch_size=2)
default_scope = 'mmdet'
default_hooks = dict(
timer=dict(type='IterTimerHook'),
logger=dict(type='LoggerHook', interval=3),
param_scheduler=dict(type='ParamSchedulerHook'),
checkpoint=dict(type='CheckpointHook', interval=3),
sampler_seed=dict(type='DistSamplerSeedHook'),
visualization=dict(type='DetVisualizationHook'))
env_cfg = dict(
cudnn_benchmark=False,
mp_cfg=dict(mp_start_method='fork', opencv_num_threads=0),
dist_cfg=dict(backend='nccl'),
)
vis_backends = [dict(type='LocalVisBackend')]
visualizer = dict(
type='DetLocalVisualizer', vis_backends=vis_backends, name='visualizer')
log_processor = dict(type='LogProcessor', window_size=50, by_epoch=True)
log_level = 'INFO'
load_from = 'mask_rcnn_r50_fpn_2x_coco_bbox_mAP-0.392__segm_mAP-0.354_20200505_003907-3e542a40.pth'
resume = FalseConfig修改重点主要修改点0: _base_模型的路径和模型选择,这里我们应用到选择的mask rcnn模型上,并修改引用路径,关于_base_问题,之前的笔记教程已经多次提到,这里不再重复,可以再回去看一下。# _base_ = '../mask_rcnn/mask-rcnn_r50_fpn_2x_coco.py'
_base_ = 'configs/mask_rcnn/mask-rcnn_r50_fpn_2x_coco.py主要修改点1:修改model.[backbone, bbox_head, mask_head]model.backbone.init_cfg=None, model.[bbox_head,mask_head].num_classes=1 model的bbox_head和mask_head的num_classes,只有一个balloon类,因此修改为num_classes=1 主要修改点2:数据集注册 with train_dataloader.dataset.metainfo 数据集注册,也是一个很重要的点,在下面☆7. 数据集的注册还会对其他注册方法介绍,这里我们只介绍最简单的一种# 修改数据集相关配置
metainfo = {
'classes': ('balloon', ),
'palette': [
(220, 20, 60),
]
}
train_dataloader = dict(dataset=dict(metainfo=metainfo,)主要修改点3:在dataset/dataloader中的数据路径配置dataroot是可以和ann_file,data_prefix相连的,在项目中,json文件的目录为:'data/balloon/train/train.json'data_root = 'data/balloon/'
train_dataloader = dict(
dataset=dict(
data_root=data_root,
ann_file='train/train.json',
data_prefix=dict(img='train/')))
val_evaluator = dict(
type='CocoMetric',
ann_file='data/balloon/val/val.json',
metric=['bbox', 'segm'],
format_only=False)
test_evaluator = val_evaluator主要修改点4:evaluator中的type要和dataset_type对应,ann_file写完整的路径,metric要写['bbox', 'segm'], 当我们的数据没有标注只有类别class时,metric可以用mAP # training schedule for 2x
train_cfg = dict(type='EpochBasedTrainLoop', max_epochs=24, val_interval=3)
# Default setting for scaling LR automatically
# - `enable` means enable scaling LR automatically
# or not by default.
# - `base_batch_size` = (8 GPUs) x (2 samples per GPU).
auto_scale_lr = dict(enable=False, base_batch_size=2)
# learning rate
param_scheduler = [dict(type='LinearLR'),dict(type='MultiStepLR')]
# optimizer
optim_wrapper = dict(optimizer=dict(type='SGD', lr=0.002, momentum=0.9, weight_decay=0.0001))
default_hooks = dict(
logger=dict(type='LoggerHook', interval=3),,
checkpoint=dict(type='CheckpointHook', interval=3)
log_level = 'INFO'
load_from = 'mask_rcnn_r50_fpn_2x_coco_bbox_mAP-0.392__segm_mAP-0.354_20200505_003907-3e542a40.pth'主要修改点5:2x: For1x/2x, the initial learning rate decays by a factor of 10 at the 8/16th and 11/22th epochs.主要修改点6:几个interval,如train_cfg.val_interval, default_hooks.logger.interval, default_hooks.CheckpointHook.interval 主要修改点7:optimizer :optim_wrapper = dict(optimizer=dict(type='SGD', lr=0.002, momentum=0.9, weight_decay=0.0001)) 主要修改点8:load_from='path_of_pretrained_weight' param_scheduleris a field that configures methods of adjusting optimization hyperparameters such as learning rate and momentum. Users can combine multiple schedulers to create a desired parameter adjustment strategy. Find more in parameter scheduler tutorial and parameter scheduler API documentstype='LinearLR', # Use linear policy to warmup learning ratetype='MultiStepLR', # Use multi-step learning rate policy during trainingbgr_to_rgb=True,mmcv读取数据为bgr顺序,和OpenCV类似model = dict(roi_head=dict(bbox_head=dict(num_classes=1),mask_head=dict(num_classes=1)))Balloon数据集Config文件【简洁修改最终版】这里再放一下根据balloon数据集自己修改的精简板本的config文件# 新配置继承了基本配置,并做了必要的修改
# _base_ = '../mask_rcnn/mask-rcnn_r50_fpn_2x_coco.py'
_base_ = 'configs/mask_rcnn/mask-rcnn_r50_fpn_2x_coco.py'
# 我们还需要更改 head 中的 num_classes 以匹配数据集中的类别数
model = dict(
roi_head=dict(
bbox_head=dict(num_classes=1),
mask_head=dict(num_classes=1)),
backbone=dict(init_cfg=None),
)
# 修改数据集相关配置
data_root = 'data/balloon/'
metainfo = {
'classes': ('balloon', ),
'palette': [
(220, 20, 60),
]
}
train_dataloader = dict(
batch_size=1,
dataset=dict(
data_root=data_root,
metainfo=metainfo,
ann_file='train/train.json',
data_prefix=dict(img='train/')))
val_dataloader = dict(
dataset=dict(
data_root=data_root,
metainfo=metainfo,
ann_file='val/val.json',
data_prefix=dict(img='val/')))
test_dataloader = val_dataloader
optim_wrapper = dict(
type='OptimWrapper',
optimizer=dict(type='SGD', lr=0.002, momentum=0.9, weight_decay=0.0001))
# 修改评价指标相关配置
val_evaluator = dict(ann_file=data_root + 'val/val.json')
test_evaluator = val_evaluator
# 使用预训练的 Mask R-CNN 模型权重来做初始化,可以提高模型性能
load_from = 'mask_rcnn_r50_fpn_2x_coco_bbox_mAP-0.392__segm_mAP-0.354_20200505_003907-3e542a40.pth'☆7. 数据集的注册这一点,其实官方文档有时候也说的不是很清楚,在训练营的时候,自己改了两三次,才有一定的了解。MMDET2.x中,有CustomDataset的方法,因此,读者可以很好的利用这个方法来使用自己的数据集,而MMDET3.x摒弃了这种做法,而要求严格的同样数据格式,这也要求,我们掌握这一方式方法。COCO 更换metainfo 官方文档的注册方法, train_dataloader.dataset.metainfo.[classes,palette] 评价: 简单,修改较少由于我们已经将数据集转换成了COCO格式,所以注册新数据集的操作会简单一些,需要我们调整配置文件中的metainfo字典。metainfo包含了classes和palette属性,classes是数据集中标注的所有要检测的物体的种类,而palette则是标注mask文件中代表所有标注物体的mask的对应的颜色值。在这里,我们只检测气球balloon,如果有更多类需要检测的话,就要求我们添加对应的类别。palette对能否找到检测的物体非常重要,一定要找对,必要时,还要通过查看数据,找到准确的值。# dataset settings 修改数据集相关配置
data_root = 'data/balloon/'
metainfo = {
'classes': ('balloon', ),
'palette': [(220, 20, 60),]
}
train_dataloader = dict(
dataset=dict(
data_root=data_root,
metainfo=metainfo,
ann_file='train/annotation_coco.json',
data_prefix=dict(img='train/')))
val_dataloader = dict(
dataset=dict(
data_root=data_root,
metainfo=metainfo,
ann_file='val/annotation_coco.json',
data_prefix=dict(img='val/')))
test_dataloader = val_dataloaderConfig +Notebook (+train+test)在jupyter notebook中注册,搭配mmengine.Config API一起使用we need to implement load_annotations function in the new dataset class StanfordBackgroundDataset.from mmseg.registry import DATASETS
from mmseg.datasets import BaseSegDataset
# 类别和对应的颜色
classes = ('background', 'glomeruili')
palette = [[128, 128, 128], [151, 189, 8]]
@DATASETS.register_module()
class StanfordBackgroundDataset(BaseSegDataset):
METAINFO = dict(classes = classes, palette = palette)
def __init__(self, **kwargs):
super().__init__(img_suffix='.png', seg_map_suffix='.png', **kwargs)在Notebook中对Config配置文件针对性修改 (+Train+Inference)from mmengine import Config
from mmengine.runner import Runner
from mmseg.utils import register_all_modules
cfg = Config.fromfile('configs/pspnet/pspnet_r50-d8_4xb2-40k_cityscapes-512x1024.py')
# 修改数据集的 type 和 root
cfg.dataset_type = 'StanfordBackgroundDataset'
cfg.data_root = data_root
cfg.val_dataloader.dataset.type = cfg.dataset_type
cfg.val_dataloader.dataset.type = cfg.dataset_type保存配置文件和训练print(cfg.pretty_text) # 这里就不显示打印结果了
cfg.dump('new_cfg_Glomeruli3.py')
# register all modules in mmseg into the registries
# do not init the default scope here because it will be init in the runner
register_all_modules(init_default_scope=False)
runner = Runner.from_cfg(cfg)
runner.train()测试与推断# 测试时,初始化模型
checkpoint_path = './work_dirs/glomeruili2/iter_800.pth'
model = init_model(cfg, checkpoint_path, 'cuda:0')
# 单张图像
img = mmcv.imread('data/Glomeruli-dataset/images/SAS_21908_001_42.png')
result = inference_model(model, img)更多的config配置写法,可以参考本文完整mask-rcnn_r50_fpn_2x_coco配置文件部分和以前的知乎文章MMSegmentation基础实验with Kaggle小鼠肾小球切片语义分割的在Notebook中对Config配置文件针对性修改 部分进行修改。这种写法很灵活,参数可以使用cfg加属性不断访问Config配置文件字典,所添加属性值的数据类型,可以是字典,链表等继承Base*Dataset的数据类+修改__init__.py 创建自定义继承Base*Dataset数据集的python文件,并修改__init__.py, 在dataset中注册,这里以本次训练营中的mmseg的代码举例说明,MMDET2.x也支持自定义数据集类的方法注册mmseg/dataset/StanfordBackgroundDataset.pyfrom mmseg.registry import DATASETS
from .basesegdataset import BaseSegDataset
# 类别和对应的颜色
classes = ('background', 'glomeruili')
palette = [[128, 128, 128], [151, 189, 8]]
@DATASETS.register_module()
class StanfordBackgroundDataset(BaseSegDataset):
METAINFO = dict(classes = classes, palette = palette)
def __init__(self, **kwargs):
super().__init__(img_suffix='.png', seg_map_suffix='.png', **kwargs)mmseg/dataset/__init__.py# Copyright (c) OpenMMLab. All rights reserved.
from .basesegdataset import BaseSegDataset
from .StanfordBackgroundDataset import StanfordBackgroundDataset
from .m2nist import M2nistDataset
__all__ = [
'BaseSegDataset', 'StanfordBackgroundDataset','M2nistDataset'
]需要注意的是,from import的时候不要遗漏那个点 . from .StanfordBackgroundDataset import StanfordBackgroundDataset
from .m2nist import M2nistDataset下载他人定义的数据集类型需要注意的是,存取的路径和文件名要对应在MMSegmentation库文件夹中,这种做法其实是上面方法的推广mmseg/dataset/StanfordBackgroundDataset.pymmseg/dataset/__init__.py## 添加数据集类
# 数据集配置文件
!wget https://zihao-openmmlab.obs.cn-east-3.myhuaweicloud.com/20230130-mmseg/dataset/StanfordBackgroundDataset.py \
-O ../mmsegmentation/mmseg/datasets/StanfordBackgroundDataset.py
# 修改 ../mmsegmentation/mmseg/datasets/__init__.py,添加数据集
!wget https://zihao-openmmlab.obs.cn-east-3.myhuaweicloud.com/20230130-mmseg/dataset/__init__.py \
-O ../mmsegmentation/mmseg/datasets/__init__.pyMMDET2.x对于数据集的简单注册这里贴一下MMDET2.x对于数据集的注册,只有classes需要注意classes=('balloon',) MMDET2.x也支持自定义数据集类的方法注册,参考上面COCO 更换metainfo和继承Base*Dataset的数据类+修改__init__.py部分, model = dict(roi_head=dict(bbox_head=dict(num_classes=1),
mask_head=dict(num_classes=1)))
data = dict(
train=dict(
ann_file='data/balloon/train/train.json',
img_prefix='data/balloon/train/',
classes=('balloon',)
),
val=dict(
ann_file='data/balloon/val/val.json',
img_prefix='data/balloon/val/',
classes=('balloon',)
),
test=val
)8. 模型微调 (训练一个新的模型)通过命令行工具或者 Python API 完成模型微调,并在验证集上完成测试和评价。可以调整参数,或使用不同的预训练模型来获得更高的评分。训练为了使用新的配置方法来对模型进行训练,你只需要运行如下命令。!python tools/train.py \
mask_rcnn_r50_fpn_2x_coco_balloon3.py \
--work-dir work_dirs/mask_rcnn_r50_fpn_2x_coco_balloon3打印信息也包含完整的Config完整的打印信息还是又臭又长的,我其实没仔细看,不过贴出来,是为了更好的了解,openmmlab给我们省了多少事情,让我们专注于我们想做的方向。其中包含了对bbox和segm的测试,此处和配置文件里的以下几行对应test_evaluator = dict(
type='CocoMetric',
ann_file='data/balloon/val/val.json',
metric=['bbox', 'segm'],
format_only=False)最终训练结果02/12 18:47:51 - mmengine - INFO - Epoch(train) [24][27/31] lr: 2.0000e-05 eta: 0:00:01 time: 0.4204 data_time: 0.0212 memory: 4052 loss: 0.1376 loss_rpn_cls: 0.0009 loss_rpn_bbox: 0.0051 loss_cls: 0.0298 acc: 98.9258 loss_bbox: 0.0436 loss_mask: 0.0582
02/12 18:47:52 - mmengine - INFO - Epoch(train) [24][30/31] lr: 2.0000e-05 eta: 0:00:00 time: 0.4153 data_time: 0.0199 memory: 3207 loss: 0.1279 loss_rpn_cls: 0.0008 loss_rpn_bbox: 0.0046 loss_cls: 0.0275 acc: 99.6094 loss_bbox: 0.0400 loss_mask: 0.0550
02/12 18:47:53 - mmengine - INFO - Exp name: mask_rcnn_r50_fpn_2x_coco_balloon3_20230212_184220
02/12 18:47:53 - mmengine - INFO - Saving checkpoint at 24 epochs
02/12 18:47:54 - mmengine - INFO - Epoch(val) [24][ 3/13] eta: 0:00:02 time: 0.1296 data_time: 0.0373 memory: 2253
02/12 18:47:55 - mmengine - INFO - Epoch(val) [24][ 6/13] eta: 0:00:01 time: 0.1313 data_time: 0.0378 memory: 959
02/12 18:47:55 - mmengine - INFO - Epoch(val) [24][ 9/13] eta: 0:00:00 time: 0.1314 data_time: 0.0379 memory: 836
02/12 18:47:55 - mmengine - INFO - Epoch(val) [24][12/13] eta: 0:00:00 time: 0.1304 data_time: 0.0368 memory: 836
02/12 18:47:55 - mmengine - INFO - Evaluating bbox...
Loading and preparing results...
DONE (t=0.00s)
creating index...
index created!
Running per image evaluation...
Evaluate annotation type *bbox*
DONE (t=0.01s).
Accumulating evaluation results...
DONE (t=0.01s).
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.766
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=1000 ] = 0.882
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=1000 ] = 0.882
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=1000 ] = 0.353
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=1000 ] = 0.686
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=1000 ] = 0.804
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.820
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=300 ] = 0.820
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=1000 ] = 0.820
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=1000 ] = 0.350
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=1000 ] = 0.792
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=1000 ] = 0.856
02/12 18:47:55 - mmengine - INFO - bbox_mAP_copypaste: 0.766 0.882 0.882 0.353 0.686 0.804
02/12 18:47:55 - mmengine - INFO - Evaluating segm...
Loading and preparing results...
DONE (t=0.00s)
creating index...
index created!
Running per image evaluation...
Evaluate annotation type *segm*
DONE (t=0.01s).
Accumulating evaluation results...
DONE (t=0.01s).
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.780
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=1000 ] = 0.862
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=1000 ] = 0.862
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=1000 ] = 0.454
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=1000 ] = 0.633
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=1000 ] = 0.831
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.828
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=300 ] = 0.828
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=1000 ] = 0.828
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=1000 ] = 0.450
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=1000 ] = 0.767
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=1000 ] = 0.869
02/12 18:47:55 - mmengine - INFO - segm_mAP_copypaste: 0.780 0.862 0.862 0.454 0.633 0.831
02/12 18:47:55 - mmengine - INFO - Epoch(val) [24][13/13]
coco/bbox_mAP: 0.7660 coco/bbox_mAP_50: 0.8820 coco/bbox_mAP_75: 0.8820
coco/bbox_mAP_s: 0.3530 coco/bbox_mAP_m: 0.6860 coco/bbox_mAP_l: 0.8040
coco/segm_mAP: 0.7800 coco/segm_mAP_50: 0.8620 coco/segm_mAP_75: 0.8620
coco/segm_mAP_s: 0.4540 coco/segm_mAP_m: 0.6330 coco/segm_mAP_l: 0.8310☆训练日志结果理解s,m,l对应的是small,middle,large么?- bbox_mAP: (默认)IOU=0.5 到 IOU=0.95, 每隔0.05个IOU计算一次AP,然后求平均值- bbox_mAP_50: IOU=0.5时的AP值- bbox_mAP_75: IOU=0.75时的AP值- bbox_mAP_s/m/l: 即小中大三种不同尺度物体的AP值,其中small是指物体面积小于32 x 32,medium是指面积在32 x 32 - 96 x 96 之间,large是指面积大于96 x 96COCO的图像大小衡量标准:AP50 AP75 AP@[0.5:0.95]为了更细化区分网络的性能,COCO数据集的评价标准中,把IoU的值从50%到95%每隔5%进行了一次划分。具体来说,0.5 0.55 0.6 0.65 0.7 0.75 0.8 0.85 0.9 0.95 ,一共十个,每次测试的时候都是在IoU=这个数上测试的。在这10组precision-recall对中,我们对这十个值取平均(我理解为,10个PR曲线下得到的AP值,然后对这10个AP进行平均),得到了一个AP@[0.5:0.95]有时固定IoU的阈值,比如50%或75%,也就是AP50和AP75,意味着IoU为50%或者75%时的AP值。Note:在COCO数据集评价指标中,所有的AP 默认为mAP 。即,AP50=mAP50/AP50=mAP50,AP75=mAP75/AP75=mAP75,以此类推5. 测试以及推理单张图片测试推理config_file_retrain = 'mask_rcnn_r50_fpn_2x_coco_balloon3.py'
checkpoint_file_retrain = 'work_dirs/mask_rcnn_r50_fpn_2x_coco_balloon3/epoch_24.pth'
model = init_detector(config_file_retrain,checkpoint_file_retrain,device='cpu')
result_retrain = inference_detector(model,img)
visualizer.dataset_meta = model.dataset_meta # set the visualizer metadata when you changed your dataset
# show the results
visualizer.add_datasample(
'result',
img,
data_sample=result_retrain,
draw_gt=False,
wait_time=0,
)
visualizer.show()重新换一张图片image_path2 = 'data/balloon/val/16335852991_f55de7958d_k.jpg'
img2 = mmcv.imread( image_path2, channel_order='rgb')
result_retrain2 = inference_detector(model,img2)
# show the results
visualizer.add_datasample(
'result',
img2,
data_sample=result_retrain2,
draw_gt=False,
wait_time=0,
)
visualizer.show()image_path2 = 'data/balloon/val/4581425993_72b9b15fc0_b.jpg'
img2 = mmcv.imread( image_path2, channel_order='rgb')
result_retrain2 = inference_detector(model,img2)
# show the results
visualizer.add_datasample(
'result',
img2,
data_sample=result_retrain2,
draw_gt=False,
wait_time=0,
)
visualizer.show()查看result_retrain打印result_retrain,查看训练结果的数据构造result_retrain可以看到,是一个DetDataSample结构 META INFORMATION scale_factor: (1.0419921875, 1.0416666666666667) img_shape: (800, 1067) batch_input_shape: (800, 1088) pad_shape: (800, 1088) ori_shape: (768, 1024) img_path: None img_id: 0 DATA FIELDS pred_instances: META INFORMATION DATA FIELDS labels: tensor([0, 0, 0, 0, 0, 0]) masks: tensor([[[False, False, False, ..., False, False, False], [False, False, False, ..., False, False, False], [False, False, False, ..., False, False, False], ..., [False, False, False, ..., False, False, False], [False, False, False, ..., False, False, False], [False, False, False, ..., False, False, False]], [[False, False, False, ..., False, False, False], [False, False, False, ..., False, False, False], [False, False, False, ..., False, False, False], ..., [False, False, False, ..., False, False, False], [False, False, False, ..., False, False, False], [False, False, False, ..., False, False, False]], [[False, False, False, ..., False, False, False], [False, False, False, ..., False, False, False], [False, False, False, ..., False, False, False], ..., [False, False, False, ..., False, False, False], [False, False, False, ..., False, False, False], [False, False, False, ..., False, False, False]], [[False, False, False, ..., False, False, False], [False, False, False, ..., False, False, False], [False, False, False, ..., False, False, False], ..., [False, False, False, ..., False, False, False], [False, False, False, ..., False, False, False], [False, False, False, ..., False, False, False]], [[False, False, False, ..., False, False, False], [False, False, False, ..., False, False, False], [False, False, False, ..., False, False, False], ..., [False, False, False, ..., False, False, False], [False, False, False, ..., False, False, False], [False, False, False, ..., False, False, False]], [[False, False, False, ..., False, False, False], [False, False, False, ..., False, False, False], [False, False, False, ..., False, False, False], ..., [False, False, False, ..., False, False, False], [False, False, False, ..., False, False, False], [False, False, False, ..., False, False, False]]]) bboxes: tensor([[1.4231e+02, 8.3207e+00, 3.8880e+02, 2.4382e+02], [6.6667e+02, 2.1259e+00, 9.1862e+02, 2.4966e+02], [3.5691e+02, 5.5921e-01, 5.6791e+02, 2.2414e+02], [2.2721e+02, 8.2846e+00, 4.8063e+02, 2.4392e+02], [3.2557e+02, 2.7744e+02, 8.2625e+02, 7.4915e+02], [2.7307e+02, 7.4559e+00, 8.8615e+02, 2.3578e+02]]) scores: tensor([0.9997, 0.9996, 0.9996, 0.1296, 0.1079, 0.0531]) ) at 0x7f77c326cd90> ignored_instances: META INFORMATION DATA FIELDS labels: tensor([], dtype=torch.int64) masks: BitmapMasks(num_masks=0, height=768, width=1024) bboxes: tensor([], size=(0, 4)) ) at 0x7f77c326cc10> gt_instances: META INFORMATION DATA FIELDS labels: tensor([], dtype=torch.int64) masks: BitmapMasks(num_masks=0, height=768, width=1024) bboxes: tensor([], size=(0, 4)) ) at 0x7f77c326cca0> ) at 0x7f77c326ca60>进一步查看print(type(result_retrain),'\n',result_retrain.keys()) # # ['pred_instances', 'ignored_instances', 'gt_instances'] result_retrain.gt_instances.keys() # ['labels', 'masks', 'bboxes'] result_retrain.ignored_instances.keys() # ['labels', 'masks', 'bboxes'] result_retrain.pred_instances.keys() # ['labels', 'masks', 'bboxes', 'scores'] for i in result_retrain.pred_instances.keys(): print(i,result_retrain.pred_instances[i].shape) print(result_retrain.pred_instances[i][:1]) print() # labels torch.Size([6]) # tensor([0]) # masks torch.Size([6, 768, 1024]) # tensor([[[False, False, False, ..., False, False, False], # [False, False, False, ..., False, False, False], # [False, False, False, ..., False, False, False], # ..., # [False, False, False, ..., False, False, False], # [False, False, False, ..., False, False, False], # [False, False, False, ..., False, False, False]]]) # bboxes torch.Size([6, 4]) # tensor([[142.3062, 8.3207, 388.7980, 243.8157]]) # scores torch.Size([6]) # tensor([0.9997]) for i in result_retrain.pred_instances.keys(): print(i,result_retrain.pred_instances[i].shape) # print(result_retrain.pred_instances[i][:1]) # print() # labels torch.Size([6]) # masks torch.Size([6, 768, 1024]) # bboxes torch.Size([6, 4]) # scores torch.Size([6]) for i in result_retrain.gt_instances.keys(): print(i,result_retrain.pred_instances[i].shape) print(result_retrain.pred_instances[i][:1]) print() # labels torch.Size([6]) # tensor([0]) # masks torch.Size([6, 768, 1024]) # tensor([[[False, False, False, ..., False, False, False], # [False, False, False, ..., False, False, False], # [False, False, False, ..., False, False, False], # ..., # [False, False, False, ..., False, False, False], # [False, False, False, ..., False, False, False], # [False, False, False, ..., False, False, False]]]) # bboxes torch.Size([6, 4]) # tensor([[142.3062, 8.3207, 388.7980, 243.8157]]) result.pred_instances.scores.numpy() # array([0.99838305, 0.85916036, 0.65062916, 0.5403771 , 0.31220037, # 0.18796745, 0.10219406, 0.09249002, 0.08700147, 0.07086968, # 0.06580309, 0.06291567], dtype=float32) result.pred_instances.scores[0] # tensor(0.9984)批量测试为了测试训练完毕的模型,你只需要运行如下命令。# generate test results for test images !python tools/test.py \ mask_rcnn_r50_fpn_2x_coco_balloon3.py \ work_dirs/mask_rcnn_r50_fpn_2x_coco_balloon3/epoch_24.pth \ --show-dir show 测试日志会打印出如下日志,loading annotations into memory... Done (t=0.00s) creating index... index created! Loads checkpoint by local backend from path: work_dirs/mask_rcnn_r50_fpn_2x_coco_balloon3/epoch_24.pth 02/12 18:49:36 - mmengine - INFO - Load checkpoint from work_dirs/mask_rcnn_r50_fpn_2x_coco_balloon3/epoch_24.pth 02/12 18:49:40 - mmengine - INFO - Epoch(test) [ 3/13] eta: 0:00:09 time: 0.9970 data_time: 0.8184 memory: 891 02/12 18:49:43 - mmengine - INFO - Epoch(test) [ 6/13] eta: 0:00:08 time: 1.1552 data_time: 1.0132 memory: 617 02/12 18:49:44 - mmengine - INFO - Epoch(test) [ 9/13] eta: 0:00:03 time: 0.8990 data_time: 0.7787 memory: 492 02/12 18:49:45 - mmengine - INFO - Epoch(test) [12/13] eta: 0:00:00 time: 0.7696 data_time: 0.6602 memory: 492 02/12 18:49:46 - mmengine - INFO - Evaluating bbox... Loading and preparing results... DONE (t=0.00s) creating index... index created! Running per image evaluation... Evaluate annotation type *bbox* DONE (t=0.01s). Accumulating evaluation results... DONE (t=0.01s). Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.766 Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=1000 ] = 0.882 Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=1000 ] = 0.882 Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=1000 ] = 0.353 Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=1000 ] = 0.686 Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=1000 ] = 0.804 Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.820 Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=300 ] = 0.820 Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=1000 ] = 0.820 Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=1000 ] = 0.350 Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=1000 ] = 0.792 Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=1000 ] = 0.856 02/12 18:49:46 - mmengine - INFO - bbox_mAP_copypaste: 0.766 0.882 0.882 0.353 0.686 0.804 02/12 18:49:46 - mmengine - INFO - Evaluating segm... Loading and preparing results... DONE (t=0.00s) creating index... index created! Running per image evaluation... Evaluate annotation type *segm* DONE (t=0.01s). Accumulating evaluation results... DONE (t=0.01s). Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.780 Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=1000 ] = 0.862 Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=1000 ] = 0.862 Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=1000 ] = 0.454 Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=1000 ] = 0.633 Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=1000 ] = 0.831 Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.828 Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=300 ] = 0.828 Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=1000 ] = 0.828 Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=1000 ] = 0.450 Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=1000 ] = 0.767 Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=1000 ] = 0.869 02/12 18:49:46 - mmengine - INFO - segm_mAP_copypaste: 0.780 0.862 0.862 0.454 0.633 0.831 02/12 18:49:46 - mmengine - INFO - Epoch(test) [13/13] coco/bbox_mAP: 0.7660 coco/bbox_mAP_50: 0.8820 coco/bbox_mAP_75: 0.8820 coco/bbox_mAP_s: 0.3530 coco/bbox_mAP_m: 0.6860 coco/bbox_mAP_l: 0.8040 coco/segm_mAP: 0.7800 coco/segm_mAP_50: 0.8620 coco/segm_mAP_75: 0.8620 coco/segm_mAP_s: 0.4540 coco/segm_mAP_m: 0.6330 coco/segm_mAP_l: 0.8310批量测试结果最终的训练结果总结如下批量测试可视化结果(和左侧ground truth相比较)可以利用前面的批量可视化代码模板 部分,调整参数进行类似的可视化,就可以得到类似下面的测试结果。下面先展示截图,再拿其中的一两张来详细看 9. Color splash特效制作在获取到图像的mask之后,请同学们将图像转为灰度图像,并在mask区域将原图像的像素值拷贝到灰度图像上即可完成特效制作。测试样例视频 test_video.mp4 https://www.zhihu.com/video/1609568470168735744有关视频的读写可以参考以下文档:mmcv: 基于opencv的实现https://github.com/open-mmlab/mmcv/blob/master/mmcv/video/io.pyopencv: https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_gui/py_video_display/py_video_display.html#skvideo: 需要额外安装ffmepg,且需要注意设置压制参数 pix_fmt 为 yuv420p 以支持主流播放器http://www.scikit-video.org/stable/modules/io.html#module-skvideo.io这里写的时候是借鉴了其他班的一个同学的作业【学习了parser 和args的使用方法】调整了参数名,并添加了ground truth的生成路径output_path2 ☆视频读写代码采用MMDET inference中的mmcv的VideoReader读取视频读取标准为fourcc = cv2.VideoWriter_fourcc(*'mp4v'))用mmengine 的track_iter_progress方法逐帧从视频中抽出图像做图片检测,进行实例分割,预测气球的mask,并进行图像处理,最后将每一帧处理好的图片拼接好,使用cv2.VideoWriter还原成视频。☆Color Splash采用对于每帧视频,制作灰度背景和保留检测到的彩色气球时,首先将每帧视频的图片(三维矩阵)分解开BGR(mmcv使用OpenCV的api,不是RGB顺序)三个通道(每一个通道可以看为一个二维矩阵)将每一个通道的二维矩阵数据和预测的mask(也是二维矩阵)做元素对应相乘,然后再重新拼接成一个三通道的三维矩阵,得到一个三维的BGR的mask数据,完成对检测出的气球像素进行提取。然后un_mask = 1 - mask就可以得到非掩码部分,再进行相同处理,就可以完成对背景像素进行提取,并使用bgr2grey方法转换为灰度值,然后两者相加就是一个color splash的图片,这就是视频里抽取的该帧图片对应的处理好的帧图像.代码实现import argparse import numpy as np import cv2 import mmcv from mmdet.apis import inference_detector, init_detector from mmdet.registry import VISUALIZERS from mmdet.utils import register_all_modules from mmengine import track_iter_progress # https://mmdetection.readthedocs.io/en/3.x/user_guides/inference.html # https://github.com/enkilee/mmcv_study/blob/main/%E4%BD%9C%E4%B8%9A%E4%BA%8Cmmdetection/color_splash.py # https://github.com/open-mmlab/mmcv/blob/master/mmcv/video/io.py def parse_args(): parser = argparse.ArgumentParser(description='MMDetection balloon color splash video demo') parser.add_argument('video_path', help='path of video file ') parser.add_argument('model_config', help='path of config file ') parser.add_argument('checkpoint_path', help='path of fine-tuned checkpoint file') parser.add_argument( '--device', default='cuda:0', help='Device used for inference') parser.add_argument( '--score_thr', type=float, default=0.8, help='Bbox score threshold') parser.add_argument('--output_path', type=str, help='path of processed video file') parser.add_argument('--output_path2', type=str, default=False, help='path of ground truth video file') parser.add_argument('--display_video', action='store_true', help='display the processed video') parser.add_argument( '--wait-time', type=float, default=1, help='The interval of display (s), 0 is block, default is 1') args = parser.parse_args() return args def main(): register_all_modules() args = parse_args() assert args.output_path or args.display_video, \ ('Please specify at least one operation (save/show the ' 'video) with the argument "--output_path" or "--display_video"') # print(args.model_config,args.checkpoint_path) model = init_detector(args.model_config, args.checkpoint_path, device=args.device) video_reader = mmcv.VideoReader(args.video_path) video_writer = None video_writer2 = None if args.output_path: fourcc = cv2.VideoWriter_fourcc(*'mp4v') video_writer = cv2.VideoWriter( args.output_path, fourcc, video_reader.fps, (video_reader.width, video_reader.height)) if args.output_path2: video_writer2 = cv2.VideoWriter( args.output_path2, fourcc, video_reader.fps, (video_reader.width, video_reader.height)) for frame in track_iter_progress(video_reader): # frame read in bgr not rgb result = inference_detector(model, frame) mask = None masks = result.pred_instances.masks# result[1][0] if args.output_path2: gt_mask = None gt_masks = result.gt_instances.masks # take mask of balloon for compute for i in range(len(masks)): if result.pred_instances.scores[i] >= args.score_thr: if not mask is None: mask = mask | masks[i] else: mask = masks[i] if args.output_path2: if not gt_mask is None: gt_masks = gt_mask | gt_masks[i] else: gt_mask = gt_masks # typeError: unsupported operand type(s) for *: 'numpy.ndarray' and 'Tensor' mask = mask.cpu().numpy() if args.output_path2: # print(gt_masks) gt_mask = gt_masks.cpu().numpy() # change color of background and balloon gt_masked_b = frame[:, :, 0] * gt_mask gt_masked_g = frame[:, :, 1] * gt_mask gt_masked_r = frame[:, :, 2] * gt_mask gt_masked = np.concatenate([gt_masked_b[:, :, None], gt_masked_g[:, :, None], gt_masked_r[:, :, None]], axis=2) gt_un_mask = 1 - gt_mask gt_frame_b = frame[:, :, 0] * gt_un_mask gt_frame_g = frame[:, :, 1] * gt_un_mask gt_frame_r = frame[:, :, 2] * gt_un_mask gt_frame = np.concatenate([gt_frame_b[:, :, None], gt_frame_g[:, :, None], gt_frame_r[:, :, None]], axis=2).astype(np.uint8) gt_frame = mmcv.bgr2gray(gt_frame, keepdim=True) gt_frame = np.concatenate([gt_frame, gt_frame, gt_frame], axis=2) gt_frame += gt_masked cv2.namedWindow('The ground truth video', 1) mmcv.imshow(gt_frame, 'video', args.wait_time) video_writer2.write(gt_frame) # change color of background and balloon masked_b = frame[:, :, 0] * mask masked_g = frame[:, :, 1] * mask masked_r = frame[:, :, 2] * mask masked = np.concatenate([masked_b[:, :, None], masked_g[:, :, None], masked_r[:, :, None]], axis=2) un_mask = 1 - mask frame_b = frame[:, :, 0] * un_mask frame_g = frame[:, :, 1] * un_mask frame_r = frame[:, :, 2] * un_mask frame = np.concatenate([frame_b[:, :, None], frame_g[:, :, None], frame_r[:, :, None]], axis=2).astype(np.uint8) # background gray color with 3 channels frame = mmcv.bgr2gray(frame, keepdim=True) frame = np.concatenate([frame, frame, frame], axis=2) frame += masked if args.display_video: cv2.namedWindow('The processed video', 0) mmcv.imshow(frame, 'video', args.wait_time) if args.output_path: video_writer.write(frame) if video_writer: video_writer.release() if video_writer2: video_writer2.release() cv2.destroyAllWindows() if __name__ == '__main__': main()调用代码如下,这里,由于检测视频是没有ground truth的,所以就没法生成了,output_path2 就没有使用# generate result.mp4 with trained model and test_video.mp4 !python video3.py \ --output_path result.mp4 \ test_video.mp4 \ mask_rcnn_r50_fpn_2x_coco_balloon3.py \ work_dirs/mask_rcnn_r50_fpn_2x_coco_balloon3/epoch_24.pth # --output_path2 test_video_gt.mp4 \处理前的单帧图片处理后的单帧图片处理后的视频https://www.zhihu.com/video/1609285186465878017使用视频生成gif以及查看生成的视频可能是API没搞明白,生成的gif很大,比原始视频都大,最终展示结果的gif是用在线网站生成的。我们先看结果,然后后面用我的代码,来尝试下自己生成gif和修改参数。另一种思路是生成视频时生成gif,写本文时刚想到的,应该好操作一些,待会找几个链接,有空做做试试。【Todo list +1】# to show the results, convert the mp4 to gif # since the generated gif is too big, I use online website to convert the mp4 videos to gifs. !pip install moviepy !pip install ez_setup from moviepy.editor import VideoFileClip videoClip = VideoFileClip("result.mp4") videoClip.write_gif("result.gif") # 15M to 150M too big # printed information # MoviePy - Building file result.gif with imageio.做完这些,我特别想在notebook中看一下处理的视频的,但是不知为何,无法播放,读者朋友们可以和我说一下。所以下面我列举下我尝试的集中方法,参考链接就不贴了。OpenCV# this works but open the video outside import cv2 import numpy as np # Create a VideoCapture object and read from input file # If the input is the camera, pass 0 instead of the video file name cap = cv2.VideoCapture('result.mp4') # Check if camera opened successfully if (cap.isOpened()== False): print("Error opening video stream or file") # Read until video is completed while(cap.isOpened()): # Capture frame-by-frame ret, frame = cap.read() if ret == True: # Display the resulting frame cv2.imshow('Frame',frame) # Press Q on keyboard to exit if cv2.waitKey(25) & 0xFF == ord('q'): break # Break the loop else: break # When everything done, release the video capture object cap.release() # Closes all the frames cv2.destroyAllWindows()IPython Videofrom IPython.display import Video Video('result.mp4')IPython HTML1from IPython.display import HTML HTML(""" """)IPython HTML2from IPython.display import HTML from base64 import b64encode def play(filename): html = '' video = open(filename,'rb').read() src = 'data:video/mp4;base64,' + b64encode(video).decode() html += '' % src return HTML(html) play('result.mp4')以上~~~~本系列专栏:OpenMMLab AI 实战营 - 知乎打卡笔记作业和实践个人github 今日心中有光下面放几句今天看到的句子吧It is not easy to meet each other in such a big world.世界这么大,能遇见,不容易。The best feeling in the world is knowing someone is missing you.世界上最好的感觉就是知道有人在想你。编辑于 2023-02-16 15:57・IP 属地韩国mmdetectionopenmmlab实例分割赞同 95 条评论分享喜欢收藏申请转载文章被以下专栏收录CV with OpenMMLab原专栏名: OpenMMLab AI balloon是什么意思_balloon怎么读_balloon翻译_用法_发音_词组_同反义词_气球-新东方在线英语词典 英语词典 - 日语词典 首页 > 英语词典 > 字母单词表 > b开头的单词 > balloon balloon 听听怎么读 英 [bəˈlu:n] 美 [bəˈlun] 是什么意思 n.气球;热气球;[建]球饰;vt.膨胀,涨大;乘热气球飞行;使激增;adj.气球状的;(货物等)分量轻而体积大的;(分期付款)最后一笔大数目的;vi.乘气球飞行;膨胀;激增; 变形 复数:balloons过去式:ballooned过去分词:ballooned现在分词:ballooning第三人称单数:balloons 双语释义 n.(名词)[C]气球 a large bag of strong light material filled with gas or heated air so that it can float in the air 英英释义 balloon[ bə'lu:n ]n.small thin inflatable rubber bag with narrow necklarge tough nonrigid bag filled with gas or heated airv.ride in a hot-air balloon"He tried to balloon around the earth but storms forced him to land in China"become inflated"The sails ballooned"同义词:inflatebillow 学习怎么用 词汇搭配 用作名词 (n.)动词+~blow up a balloon吹气球fly a balloon放气球puncture a balloon刺破气球形容词+~colored balloons彩色气球介词+~in a balloon乘气球 词组短语 air balloon气球hot-air balloon n. 热气球 weather balloon气象气球;探空气球balloon angioplasty [外科学]气囊血管成形术;球囊成形术(等于percutaneous transluminal angioplasty) balloon pump球囊泵;气囊泵balloon borne球载反射器balloon flower桔梗花like a lead balloon毫无效果,毫无作用(意指如铅气球无法飞升) balloon catheter气囊导管,气泡式导管 更多收起词组短语 双语例句 用作名词(n.)A balloon floated across the sky.有个气球从空中飘过。用作及物动词(vt.)He balloons his cheeks when he is hesitant.他迟疑不决时会鼓起双颊。用作不及物动词(vi.)He tried to balloon around the earth but storms forced him to land in China.他试图乘气球做环球旅行,但风暴迫使他降落在中国。Our expenses had ballooned.我们的开销大大增加了。Her skirt ballooned in the wind.她的裙子让风吹得鼓起来了。 权威例句 Achieving Rapid Door-To-Balloon TimesTotal enteroscopy with a nonsurgical steerable double-balloon method ☆Neointimal formation after balloon-induced vascular injury in Yucatan minipigs is reduced by oral rapamycinA Comparison of Balloon-Expandable-Stent Implantation with Balloon Angioplasty in Patients with Coronary Artery Disease — NEJMCatheterization of the heart in man with use of a flow-directed balloon-tipped catheter.Dynamics of blood flow and oxygenation changes during brain activation: the balloon model.Relationship of symptom-onset-to-balloon time and door-to-balloon time with mortality in patients undergoing angioplasty for acute m...Lack of effect of warfarin on the restenosis rate or on clinical outcome after balloon coronary angioplasty.Randomised placebo-controlled and balloon-angioplasty-controlled trial to assess safety of coronary stenting with use of platelet gl...Changes in collateral channel filling immediately after controlled coronary artery occlusion by an angioplasty balloon in human subj... 同义词surge proliferate 同根词balloonist ballooning balloon b开头的单词byzantine empire by weight by word of mouth by yourself bypass operation by way by way of by way of... by water by volume by virtue of by twos 词汇所属分类《绝望的主妇》(Desperate Housewives) 全八季词频大全 老友记(六人行)第一季全集 Friends 老友记 第二季 Friends·老友记分频单词书·上册 小黄人系列完整四部 Despicable Me 1/2/3/Minions 神偷奶爸词汇全 老友记1到7季单词 字母词汇表更多c开头的单词coffee pot Czechs Czechoslovakian Czechoslovakia czechoslovak Czechic o开头的单词ozostomia ozonous ozonosphere ozonometer ozonizing ozonizes z开头的单词zythum zymurgy zymotic zymosterol zymosis zymoses 分类词汇表更多服务三农yucca yam windmill wheat weeds weed killer 石油行业wildcat well Vaseline turntable travelling block tanker 其他词汇书zymurgy zymurgy zymurgy zymoscope zymology zygote 人名姓氏表更多男zack zachary Zachariah young York Yates 女Zola Zoe Zenobia Zenia Zena Zandra 男/女Yong wynn winter willie Whitney wally 新东方柯林斯词典 托福考试练习 雅思预测2024年雅思考试重点题汇总[听力|阅读|写作|口语] 2024年2月雅思考试听力|阅读|写作|口语重点题汇总 2024年1月雅思考前必刷题听力|阅读|口语|写作汇总 2024年3月雅思考试听力|阅读|写作|口语重点题汇总 [雅思考前必刷]2024年1月雅思口语考前必刷题Part 2&3地点类 2020年9月雅思口语新题part1:shopping 2021年1月雅思口语新题part2:你认为可以教别人的技能 [雅思考前必刷]2024年1月雅思口语考前必刷题Part 2&3事件类 2020年9月雅思口语新题part1:Activity 2021年1月雅思口语新题part2:你以前看过的现场体育赛事 关于我们 商务合作 广告服务 代理商区域 客服中心 在线留言 合作伙伴 人员招聘 联系我们 网站地图 © 2000-2024 koolearn.com 版权所有 全国客服专线:400-676-2300 京ICP证050421号 京ICP备05067669号-2 京公安备110-1081940 网络视听许可证0110531号 新东方教育科技集团旗下成员公司 Balloon(英文单词)_百度百科
oon(英文单词)_百度百科 网页新闻贴吧知道网盘图片视频地图文库资讯采购百科百度首页登录注册进入词条全站搜索帮助首页秒懂百科特色百科知识专题加入百科百科团队权威合作下载百科APP个人中心Balloon是一个多义词,请在下列义项上选择浏览(共3个义项)添加义项收藏查看我的收藏0有用+10Balloon播报讨论上传视频英文单词Balloon,英语单词,名词,意为“(美、印、泰)巴隆(人名)”' 气球'。中文名气球外文名Balloon词 性名词目录1单词发音2短语搭配3双语例句单词发音播报编辑美[bəˈluːn] [1]短语搭配播报编辑balloon loop环形回车道Balloon maturity期末放气式偿还 ; 到期大额偿还 ; 气球型期限 ; 期末放气式归还balloon paper气球用纸 ; 球用纸balloon loan漂浮式贷款 ; 气球贷款 ; 气球贷 ; 百龙信贷captive balloon[气象]系留气球meteorological balloon气象用气球 ;[气象]气象探测气球 ; 气象控测气球barrage balloon[航]阻塞气球 ; 防空拦阻气球 Balloon Ride气球观光 ; 气球漫游 ; 气球旅行 balloon occlusion气囊扩张术 ; 腹主动脉 ; 气囊阻塞 ; 球囊封堵 [1]双语例句播报编辑Which coloured balloon do you like?你喜欢哪个颜色的气球?She affirms this balloon being her.她肯定这是她的气球。Whose balloon is this?这是谁的气球?。 [1]新手上路成长任务编辑入门编辑规则本人编辑我有疑问内容质疑在线客服官方贴吧意见反馈投诉建议举报不良信息未通过词条申诉投诉侵权信息封禁查询与解封©2024 Baidu 使用百度前必读 | 百科协议 | 隐私政策 | 百度百科合作平台 | 京ICP证030173号 京公网安备110000020000balloon是什么意思_balloon怎么读_balloon翻译_用法_发音_词组_同反义词_气球-新东方在线英语词典
Just a moment...
a moment...Enable JavaScript and cookies to conti